Update and delete entries
Correct an entry's data, update it without sending emails or archiving PDFs, and delete one entry or many.
This page shows how to change entries after they were saved or submitted. You will correct an entry's data, keep the form's emails and PDFs from firing while you do, and delete entries, one at a time or many at once.
Correct an entry's data
POST /entry/{entryId}/edit changes the data of an
entry in any status except deleted, including a submitted one. This corrects the email address of
a submitted entry and leaves the rest of its data as it was:
curl -X POST https://api.tepez.co.il/v1.0/entry/<entryId>/edit \
-H "x-api-key: $TEPEZ_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"data": {"email": "yossi.cohen@example.com"},
"updateMode": "merge",
"skipEmails": true,
"skipRenders": true,
"skipUiActions": true
}'The response, trimmed:
{
"entry": {
"id": "<entryId>",
"status": "submitted",
"data": {
"fullName": "Yossi Cohen",
"email": "yossi.cohen@example.com",
"position": "qa"
},
"actions": [
{ "id": "<actionId>", "type": "submit", "time": "2026-09-30T19:46:10.168Z", "ip": "<ip>", "userAgent": "curl/8.16.0" },
{ "id": "<actionId2>", "type": "edit", "time": "2026-09-30T19:50:07.183Z", "ip": "<ip>", "userAgent": "curl/8.16.0", "user": "<userId>" }
],
"submitTime": "2026-09-30T19:46:10.168Z",
"modifyTime": "2026-09-30T19:50:07.192Z",
"changedAt": "2026-09-30T19:50:07.192Z"
},
"uiActions": []
}- The status stays unless you send
status. To move the entry, for example fromsubmittedback tosaved, send the new status with the edit. Edit an entry lists the changes allowed. - The data is checked against the form's rules when you send
dataand the entry ends upsubmitted, or ends upsavedand the form checks drafts (formSchema.validateSaved). A status-only edit checks nothing. A value that breaks a rule fails with400entry_failed_validation, and nothing changes. - The edit is recorded in
actions, with the user of your API key. - The archived PDF doesn't change. It still shows the data as it was submitted. To get a PDF of the corrected data, render one.
How the data combines
updateMode decides how the data you send combines with the entry's current data:
updateMode | Result |
|---|---|
replace, the default | Your data becomes the whole data. Every key you leave out is removed. |
assign | Each top-level key you send replaces that key. Other top-level keys stay. |
merge | Your data merges into the current data at every depth. Use it to change single values. |
Leaving updateMode out replaces the whole data, so a partial data silently removes everything
else. merge can't make an array shorter. Update modes shows each
mode on the same entry.
Update without emails or PDFs
An edit runs the form's after-edit rules, which can send emails and archive PDFs. Three flags in the body turn them off for one request:
| Flag | Effect |
|---|---|
skipEmails | Sends none of the emails the form's rules define for this request. |
skipRenders | Archives none of the PDFs the form's rules define for this request. |
skipUiActions | Returns uiActions as an empty array, instead of working out what the form would show next. |
Set all three for a silent data fix, as in the example above. The same flags work on
POST /entry/save,
POST /entry/submit and
POST /entry/template, for example to
import past entries without emailing anyone.
To see the emails without sending them to their real recipients, use
testEmailAddress instead.
Let a person revise a submitted entry
A submitted entry can't be resumed. To let the person change it, edit it back to saved with
{"status": "saved"} and send them the new resumeUrlBewit from the response.
Let your users fill a form in your app shows it in
context.
Delete an entry
DELETE /entry/{entryId} deletes one entry:
curl -X DELETE https://api.tepez.co.il/v1.0/entry/<entryId> \
-H "x-api-key: $TEPEZ_API_KEY"{ "message": "The entry has been deleted successfully." }After the delete:
-
The entry's status is
deleted. It can't be resumed, edited or deleted again. -
GET /entry/{entryId}still returns the entry, now withstatus: "deleted"and adeletedAttime. To tell which entries were deleted, use the list, which leaves them out, ordeleteMarkers=true. -
List requests and exports no longer return it. A list request with
deleteMarkers=truereturns a marker in its place, so a system that polls for changes learns about it:{ "_id": "<entryId>", "deletedAt": "2026-09-30T19:50:22.675Z" } -
The entry's archived PDFs are deleted, and so are the files uploaded to it, unless the form is set to keep them. Their links stop working and answer
403AccessDenied. -
The API has no undo.
Deleting an entry deletes its files, even where another entry uses them
A file value points at a stored file, and copying the value to another entry copies the pointer, not the file. If you prefilled a new entry with a file value copied from an old one, deleting either entry deletes the file both entries show. Upload a new copy of the file for each entry that must keep it.
Delete many entries
POST /entry/delete deletes every entry that matches a
query. It takes the same filter as GET /entry.
There is no confirmation and no dry run
POST /entry/delete deletes everything the query matches, across your whole account, as soon as
it runs. A query without form matches entries of every form, and an empty query matches every
entry you have. Before you run it, send the same query to GET /entry
and check the list.
Name the entries by id, and include the form:
curl -X POST https://api.tepez.co.il/v1.0/entry/delete \
-H "x-api-key: $TEPEZ_API_KEY" \
-H "Content-Type: application/json" \
-d '{"query": {"form": "<formId>", "_id": {"$in": ["<entryId>", "<entryId2>"]}}}'{}Each deleted entry goes through the same steps as a single delete, files included.
The response is {} whether the query matched any entries or none. To confirm, list the entries
again: the deleted ones are gone.
Troubleshooting
| Response | Cause and fix |
|---|---|
200, but keys you didn't send are gone | The edit had no updateMode, so it used replace. Send "updateMode": "merge" or "assign". |
200, but an array still has its old rows | merge can't shorten an array. Send the whole top-level property with assign. |
400 entry_failed_validation on an edit | The resulting data breaks a rule of the form. Each item of messages names a field in modelPath. |
403 This form entry was already deleted and cannot be edited. | The entry was deleted. Deleted entries can't change. |
403 You cannot delete this form entry because it was already deleted. | The entry was deleted earlier. Nothing more to do. |
403 Can't change the status of the entry to this status. | The edit asked for a status change that isn't allowed, such as a template to submitted. |
| The archived PDF still shows the old data | An edit doesn't change the PDF archived at submit. Render a new one. |
400 query is invalid (CastError) from POST /entry/delete | A value in query has the wrong type, such as a status label: send 2, not "submitted", and 24-character ids. |
{} from POST /entry/delete, but the entries are still listed | The query matched nothing. Check the ids and the form id. |
| Another entry lost its file | The file value was copied from an entry you deleted. Upload the file again for that entry. |
Errors explains the error format and lists more messages.
Every response from the API carries an x-tepez-request-id header. Quote it when you contact us.
Question about this page? Email support@tepez.co.il