Docs

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 from submitted back to saved, 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 data and the entry ends up submitted, or ends up saved and the form checks drafts (formSchema.validateSaved). A status-only edit checks nothing. A value that breaks a rule fails with 400 entry_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:

updateModeResult
replace, the defaultYour data becomes the whole data. Every key you leave out is removed.
assignEach top-level key you send replaces that key. Other top-level keys stay.
mergeYour 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:

FlagEffect
skipEmailsSends none of the emails the form's rules define for this request.
skipRendersArchives none of the PDFs the form's rules define for this request.
skipUiActionsReturns 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 with status: "deleted" and a deletedAt time. To tell which entries were deleted, use the list, which leaves them out, or deleteMarkers=true.

  • List requests and exports no longer return it. A list request with deleteMarkers=true returns 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 403 AccessDenied.

  • 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

ResponseCause and fix
200, but keys you didn't send are goneThe edit had no updateMode, so it used replace. Send "updateMode": "merge" or "assign".
200, but an array still has its old rowsmerge can't shorten an array. Send the whole top-level property with assign.
400 entry_failed_validation on an editThe 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 dataAn edit doesn't change the PDF archived at submit. Render a new one.
400 query is invalid (CastError) from POST /entry/deleteA 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 listedThe query matched nothing. Check the ids and the form id.
Another entry lost its fileThe 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.

Email support with the request id

Question about this page? Email support@tepez.co.il

On this page