> For the complete documentation index, see [llms.txt](https://docs.powerfulform.com/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://docs.powerfulform.com/public-api/submissions/delete-submissions.md).

# Delete submissions

Remove one submission, or up to 250 at once — permanently.

Two endpoints, both requiring the `submissions:delete` scope.

{% hint style="danger" %}
Deletion is permanent. The submission and every file uploaded with it are removed, and there is no undo and no trash. Export anything you might need first — see [Export submissions](/submissions/export-submissions.md).
{% endhint %}

## Delete one

```
DELETE /submissions/{id}
```

```bash
curl -X DELETE https://app.powerfulform.com/api/public/v1/submissions/101 \
  -H "X-PFB-API-KEY: pfb_your_key_here"
```

Returns `204 No Content` — an empty body, not JSON. Anything else is an error.

## Delete many

```
POST /submissions/bulk_delete
```

```bash
curl -X POST https://app.powerfulform.com/api/public/v1/submissions/bulk_delete \
  -H "X-PFB-API-KEY: pfb_your_key_here" \
  -H "Content-Type: application/json" \
  -d '{ "ids": [101, 102, 103] }'
```

```json
{ "data": { "deleted": 3 } }
```

<table><thead><tr><th width="150">Field</th><th width="110">Required</th><th>Notes</th></tr></thead><tbody><tr><td><code>ids</code></td><td>Yes</td><td>Between 1 and 250 submission ids. Duplicates are collapsed.</td></tr></tbody></table>

### All or nothing

Every id is checked before anything is deleted. If even one does not exist, or belongs to another store, the whole call fails with `404` and **nothing is deleted**:

```json
{
  "errors": [
    { "code": "not_found", "message": "One or more submission ids do not exist." }
  ]
}
```

A partial delete would leave you unable to tell which half went, so the request is refused instead. Re-read the list and send ids you know are current.

{% hint style="warning" %}
There is no "delete everything" option, and `ids` will not accept one. The app's own bulk actions have a *Select all* path; the API deliberately does not, because a single mistaken call there would clear the store's entire history with no way back.
{% endhint %}

## Deleting more than 250

Page through and delete in batches, re-reading the list each time:

```bash
# 1. find what to remove
curl "$BASE/submissions?form_id=10&created_at_max=2025-01-01&limit=250" \
  -H "X-PFB-API-KEY: $KEY"

# 2. send those ids
curl -X POST "$BASE/submissions/bulk_delete" \
  -H "X-PFB-API-KEY: $KEY" -H "Content-Type: application/json" \
  -d '{ "ids": [ ... ] }'

# 3. repeat from step 1 until the list comes back empty
```

Re-read rather than walking with a cursor: the rows you just deleted are gone, so the first page of the next read is always fresh work. Watch the **write** rate limit — 60 calls per minute.

## What else gets removed

Deleting a submission also removes the files that came with it, on both the app's storage and Google Drive if the form mirrors there, and frees the storage they occupied.

Any copy already pushed to Google Sheets, Mailchimp, Klaviyo or your CRM is **not** touched. Those systems hold their own records; clean them up separately.

{% hint style="warning" %}
Deleting does not release a value held by [Limit to one submission per customer](/submissions/one-submission-per-customer.md). If a form is set to one submission per email, that email stays blocked after you delete the entry.
{% endhint %}

## Errors

<table><thead><tr><th width="120">Status</th><th width="230">Code</th><th>Cause</th></tr></thead><tbody><tr><td>403</td><td><code>insufficient_scope</code></td><td>The key is missing <code>submissions:delete</code>.</td></tr><tr><td>404</td><td><code>not_found</code></td><td>The submission does not exist or belongs to another store. On a bulk call, at least one id in the list does — and nothing was deleted.</td></tr><tr><td>415</td><td><code>unsupported_media_type</code></td><td>The bulk body arrived without <code>Content-Type: application/json</code>.</td></tr><tr><td>422</td><td><code>validation_failed</code></td><td><code>ids</code> is missing, empty, holds more than 250 entries, or contains something that is not a positive integer.</td></tr><tr><td>429</td><td><code>rate_limited</code></td><td>The <strong>write</strong> bucket is spent.</td></tr></tbody></table>

<br>

## Next steps

* [Export submissions](/submissions/export-submissions.md) — take a backup before a cleanup run.
* [Submissions](/public-api/submissions.md) — filter to find exactly what should go.
* [Errors](/public-api/errors.md) — how to handle each status.
