Delete a row from a collection
delete_row
Permanently deletes one row from a table in a site database, identified by its primary key.
The row is gone for good, with no undo. The tool tells the client to read it with list_rows first, tell you exactly what it is about to remove, and call this only once you have said yes.
A key matching no row is not an error: the call succeeds with deleted false, so read that field rather than the status. A row other collections point at either refuses to delete or, where the link cascades, takes those linked rows with it. The primary key column must be the table's own single-column primary key, so a call never deletes more than one row.
Files the row uses from the CMS folder of storage are deleted with it, unless another row of the same collection still uses them. See Duplicate, export or delete an item.
Request
Call it with a POST to https://api.modulify.ai/v1/delete_row, sending the inputs below as a JSON object. The token needs the data:write scope.
This method is marked destructive: it deletes or overwrites data. Check the inputs before you call it, and send an Idempotency-Key header whenever you might retry it.
curl -X POST https://api.modulify.ai/v1/delete_row \
-H "Authorization: Bearer YOUR_TOKEN" \
-H "Content-Type: application/json" \
-d '{"projectId":"PROJECT_ID","name":"NAME","primaryKeyValue":"PRIMARY_KEY_VALUE"}'Over MCP, the same method is the delete_row tool.
Inputs
| Input | Type | Required | Description |
|---|---|---|---|
projectId |
string | Yes | The site id. |
schema |
string | No | The schema the collection lives in, exactly as list_collections reports it. Leave it out to use the site database's own default, which is right unless list_collections showed something else. A site on the newer database always uses its default. |
name |
string | Yes | The table name. |
primaryKeyValue |
string | Yes | The primary key value of the row to delete. |
primaryKeyColumn |
string | No | The primary key column, when it is not the default id. It must be the table's own single-column primary key, so it never matches more than one row. |
Response
Every call answers with the JSON envelope of success, message, data, code and version. data holds the result described above, and on a method that returns a total, count carries it. The response headers carry the call's X-Request-Id and what is left of your per-minute budget in X-RateLimit-Limit, X-RateLimit-Remaining and X-RateLimit-Reset. Errors explains every status code a call can answer with.