Rows
A row names the thing being asked about. Usually that is one document; when a subject is spread across several — a contract and its amendments — it is a bundle instead.
What a row points at
Two kinds, and the field is subjectType:
"file"—subjectIdis ads_…id. One document, one row."bundle"—subjectIdis abndl_…id. Several documents answering as one subject, and charged accordingly.
The stored column says dataset where the wire says file. Send "file" — "dataset" is rejected.
Adding a row computes nothing
A new row on a table with ten columns creates no cells and costs nothing. The cells come into existence when a run creates them, which is also when they are charged.
If the table has standing (auto mode) on, adding documents to the workspace is what triggers a run — not adding a row here.
The document has to be ready
A row can point at a file whose ingest job is still running. Nothing stops you. But a run skips rows whose subject is not readable yet and reports them in skippedRowIds rather than failing — so upload, poll the job to SUCCESS, then run.
List rows
GET/v2/workspaces/:workspaceId/tables/:tableId/rows
Requires Read on the workspace
Every row in the table. Unpaged — there are no offset or limit parameters here.
Rows carry no answer data. Pair this with GET …/cells and join on rowId, or fetch the whole grid in one call from GET …/tables/:tableId.
curl https://api.ragextract.com/v2/workspaces/wks_7Kq2mB4nR8vXpL3d/tables/rev_Qm5xC9bV3nK7sAeR/rows \
-H "x-api-key: $RAGEXTRACT_API_KEY"{
"success": true,
"total": 1,
"data": [ {
"id": "rrow_G3pL8qZ5tN1cH7yU",
"tableId": "rev_Qm5xC9bV3nK7sAeR",
"subjectType": "file",
"subjectId": "ds_M3xJ8pQ1vK5nB7wT",
"createdAt": 1756108800000,
"updatedAt": 1756108800000
}]
}Add a row
POST/v2/workspaces/:workspaceId/tables/:tableId/rows
Requires Read & write on the workspace
One row per call. Free — no cells, no charge, until a run.
Building a 200-row table means 200 calls, and the write limit is 15 a minute. Pace it, or build the table in the app and drive the runs from here.
Parameters
subjectType | string · required"file" or "bundle". Anything else is a 400. |
|---|---|
subjectId | string · requiredA ds_… or bndl_… id, matching subjectType, in this workspace. |
curl -X POST https://api.ragextract.com/v2/workspaces/wks_7Kq2mB4nR8vXpL3d/tables/rev_Qm5xC9bV3nK7sAeR/rows \
-H "x-api-key: $RAGEXTRACT_API_KEY" \
-H "content-type: application/json" \
-d '{"subjectType": "file", "subjectId": "ds_M3xJ8pQ1vK5nB7wT"}'{
"success": true,
"total": 1,
"data": {
"id": "rrow_G3pL8qZ5tN1cH7yU",
"tableId": "rev_Qm5xC9bV3nK7sAeR",
"subjectType": "file",
"subjectId": "ds_M3xJ8pQ1vK5nB7wT",
"createdAt": 1756108800000,
"updatedAt": 1756108800000
}
}Delete a row
DELETE/v2/workspaces/:workspaceId/tables/:tableId/rows/:rowId
Requires Read & write on the workspace
This one really deletes. Columns, tables and bundles archive; a row does not. Its cells go with it, and so do their citations, their confidence scores and the override history underneath them.
The credits that produced those answers are not refunded, and re-adding the same document as a new row means running it again at full cost. The document itself is untouched — it stays in the workspace and stays indexed.
curl -X DELETE https://api.ragextract.com/v2/workspaces/wks_7Kq2mB4nR8vXpL3d/tables/rev_Qm5xC9bV3nK7sAeR/rows/rrow_G3pL8qZ5tN1cH7yU \
-H "x-api-key: $RAGEXTRACT_API_KEY"{
"success": true,
"total": 1
}