---
title: "Delete responses in bulk"
method: POST
path: "/api/v3/responses/batch-delete"
tags: ["V3 Responses"]
---

# Delete responses in bulk

`POST /api/v3/responses/batch-delete`

## Request

- Base URL: `https://app.formbricks.com`
- URL: `https://app.formbricks.com/api/v3/responses/batch-delete`
- Auth: one of:
  - API key in cookie `next-auth.session-token`
  - API key in header `x-api-key`
  - HTTP bearer

Deletes up to 100 responses in one transaction. Requires `manage` access to the workspace.

**A POST custom method, not a `DELETE` on the collection.** A collection-level `DELETE` that loses its filters — through a client bug, a proxy stripping a query string, a copied curl command — degrades into erasing every response in scope. A distinct path cannot be reached by accident. AIP-165 blesses `batchDelete` for exactly this reason.

**It scope-filters rather than rejecting.** Ids belonging to another workspace, and ids that no longer exist, are ignored; the ids in the caller's own workspace are deleted and `deleted` reports how many that was. Rejecting the whole call on a foreign id would do two bad things at once: leak that the id exists somewhere, and break retries — after a partially-applied call, an already-deleted id is indistinguishable from a foreign one. Scope-filtering is idempotent and leaks nothing, so a client can safely retry the same batch.

Because `deleted` can therefore be lower than the number of ids sent — or zero — do not treat a shortfall as an error. Deletion also removes the responses' uploaded files and their Hub copies: both are queued in the delete's transaction and cleaned up after it commits, files at once and Hub feedback records within minutes, retried until done. This differs from the single-response delete, which does not yet remove the Hub copy (see that operation).

**`workspaceId` is the scope, and it is required.** Unlike the single-response delete — which resolves the workspace *from* the response so a caller cannot pair someone else's id with a scope it happens to hold — a batch has no single response to resolve from, and scope-filtering is only meaningful against a known workspace. Supplying it is safe here because the same value is both what `manage` is checked against and what the delete is filtered by: the two cannot diverge, so a foreign id matches nothing rather than being deleted under a scope the caller does hold.

## Query parameters

- `workspaceId` string, cuid2, required

## Request body

- BatchDeleteResponsesRequest: Ids to delete. A POST custom method rather than a `DELETE` on the collection: a collection-level `DELETE` that loses its filters degrades into erasing every response in scope, and a distinct path cannot be reached by accident — which is exactly the shape `feedbackRecords` ships today, a collection `DELETE` whose filters are the only thing standing between a caller and the whole dataset. AIP-165 blesses the custom-method form.
  - `ids` string[], required: Response ids to delete, at most 100 per call.

## Response `200`

Batch processed. `deleted` counts the responses actually removed, which may be fewer than the ids submitted.

- object
  - `data` object, required
    - `deleted` integer, required: How many responses were deleted. Lower than `ids.length` when some ids were already gone or belong to another workspace.

## Other responses

- `400`: Bad Request — malformed body, an empty `ids` array, more than 100 ids, duplicate ids, or an unsupported field.
- `401`: Not authenticated (no valid session or API key).
- `403`: Forbidden — no workspace access, or resource does not exist (404 not used; avoids existence leak).
- `429`: Rate limit exceeded.
- `500`: Internal Server Error.

## Changes

- **2026-10-28** `84820a01e550`: 15 warning
  - added the new `chart_in_use` enum value to the `code` response property for the response status `400`
  - added the new `chart_in_use` enum value to the `code` response property for the response status `401`
  - added the new `chart_in_use` enum value to the `code` response property for the response status `403`
  - added the new `chart_in_use` enum value to the `code` response property for the response status `429`
  - …11 more
- **2026-10-27** `aad5dc1d8236`: 10 warning
  - added the new `creatives_not_entitled` enum value to the `code` response property for the response status `400`
  - added the new `creatives_not_entitled` enum value to the `code` response property for the response status `401`
  - added the new `creatives_not_entitled` enum value to the `code` response property for the response status `403`
  - added the new `creatives_not_entitled` enum value to the `code` response property for the response status `429`
  - …6 more
- …earlier changes not shown

[Operation history](https://skmtc.dev/formbricks/apis/formbricks-api-v3/changes/api/v3/responses/batch-delete/post.md)

---

[API](https://skmtc.dev/formbricks/apis/formbricks-api-v3.md) - [All operations](https://skmtc.dev/formbricks/apis/formbricks-api-v3/llms.txt) - [OpenAPI document](https://skmtc.dev/formbricks/apis/formbricks-api-v3/revisions/25335c959a13?raw)
