curl --request POST \
--url https://api.vaquill.ai/workspace/v1/matters/{matterId}/matrices/{matrixId}/rows \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"documentIds": [
"value"
]
}
'import requests
url = "https://api.vaquill.ai/workspace/v1/matters/{matterId}/matrices/{matrixId}/rows"
payload = { "documentIds": ["value"] }
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({documentIds: ['value']})
};
fetch('https://api.vaquill.ai/workspace/v1/matters/{matterId}/matrices/{matrixId}/rows', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://api.vaquill.ai/workspace/v1/matters/{matterId}/matrices/{matrixId}/rows"
payload := strings.NewReader("{\n \"documentIds\": [\n \"value\"\n ]\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("Authorization", "Bearer <token>")
req.Header.Add("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}{
"id": "mtx_9f2c8b1e4a7d43c9b6e0f1a2c3d4e5f6",
"matterId": "mat_9f2c8b1e4a7d43c9b6e0f1a2c3d4e5f6",
"title": "Vendor agreement review",
"description": "Master services agreement with Acme for the 2026 platform rollout.",
"status": "succeeded",
"columns": [
{
"id": "col_9f2c8b1e4a7d43c9b6e0f1a2c3d4e5f6",
"label": "Liability cap",
"question": "What is the liability cap, and what does it apply to?",
"columnType": "free_text",
"options": [
"yes",
"no",
"not addressed"
],
"instructions": "House paper. Cap liability at 12 months of fees; never accept uncapped indemnity.",
"dependsOnColumnId": "col_9f2c8b1e4a7d43c9b6e0f1a2c3d4e5f6",
"gateExpression": "yes",
"injectUpstream": false,
"position": 0
}
],
"rows": [
{
"id": "row_9f2c8b1e4a7d43c9b6e0f1a2c3d4e5f6",
"documentId": "doc_9f2c8b1e4a7d43c9b6e0f1a2c3d4e5f6",
"filename": "msa-acme-v3.docx",
"position": 0
}
],
"cellCount": 24,
"pendingCellCount": 0,
"errorCellCount": 0,
"createdAt": "2026-08-19T14:32:10Z",
"updatedAt": "2026-08-19T14:32:10Z"
}{
"type": "https://vaquill.ai/docs/workspace-api/errors/insufficient-scope",
"title": "Insufficient scope",
"status": 403,
"detail": "This credential carries matters:read. This operation needs matters:write.",
"instance": "/workspace/v1/matters/mat_9f2c8b1e4a7d43c9b6e0f1a2c3d4e5f6",
"requestId": "req_5f2c8b1e4a7d43c9b6e0f1a2c3d4e5f6"
}{
"type": "https://vaquill.ai/docs/workspace-api/errors/insufficient-scope",
"title": "Insufficient scope",
"status": 403,
"detail": "This credential carries matters:read. This operation needs matters:write.",
"instance": "/workspace/v1/matters/mat_9f2c8b1e4a7d43c9b6e0f1a2c3d4e5f6",
"requestId": "req_5f2c8b1e4a7d43c9b6e0f1a2c3d4e5f6"
}{
"type": "https://vaquill.ai/docs/workspace-api/errors/insufficient-scope",
"title": "Insufficient scope",
"status": 403,
"detail": "This credential carries matters:read. This operation needs matters:write.",
"instance": "/workspace/v1/matters/mat_9f2c8b1e4a7d43c9b6e0f1a2c3d4e5f6",
"requestId": "req_5f2c8b1e4a7d43c9b6e0f1a2c3d4e5f6"
}{
"type": "https://vaquill.ai/docs/workspace-api/errors/insufficient-scope",
"title": "Insufficient scope",
"status": 403,
"detail": "This credential carries matters:read. This operation needs matters:write.",
"instance": "/workspace/v1/matters/mat_9f2c8b1e4a7d43c9b6e0f1a2c3d4e5f6",
"errors": [
{
"location": "<string>",
"message": "<string>",
"type": "<string>"
}
],
"requestId": "req_5f2c8b1e4a7d43c9b6e0f1a2c3d4e5f6"
}{
"type": "https://vaquill.ai/docs/workspace-api/errors/insufficient-scope",
"title": "Insufficient scope",
"status": 403,
"detail": "This credential carries matters:read. This operation needs matters:write.",
"instance": "/workspace/v1/matters/mat_9f2c8b1e4a7d43c9b6e0f1a2c3d4e5f6",
"requestId": "req_5f2c8b1e4a7d43c9b6e0f1a2c3d4e5f6"
}{
"type": "https://vaquill.ai/docs/workspace-api/errors/insufficient-scope",
"title": "Insufficient scope",
"status": 403,
"detail": "This credential carries matters:read. This operation needs matters:write.",
"instance": "/workspace/v1/matters/mat_9f2c8b1e4a7d43c9b6e0f1a2c3d4e5f6",
"requestId": "req_5f2c8b1e4a7d43c9b6e0f1a2c3d4e5f6"
}{
"type": "https://vaquill.ai/docs/workspace-api/errors/insufficient-scope",
"title": "Insufficient scope",
"status": 403,
"detail": "This credential carries matters:read. This operation needs matters:write.",
"instance": "/workspace/v1/matters/mat_9f2c8b1e4a7d43c9b6e0f1a2c3d4e5f6",
"requestId": "req_5f2c8b1e4a7d43c9b6e0f1a2c3d4e5f6"
}Add documents as matrix rows
Add documents to the grid, one row each. Extracts nothing.
Every new row gets one pending cell per existing column, so watch
pendingCellCount in the response to see what a run would now cost.
Each document must be in this matter and must have finished ingesting. A document that is already a row is refused with 409 naming it, rather than silently skipped: a request naming five documents of which two were already rows would otherwise report success having added three.
curl --request POST \
--url https://api.vaquill.ai/workspace/v1/matters/{matterId}/matrices/{matrixId}/rows \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"documentIds": [
"value"
]
}
'import requests
url = "https://api.vaquill.ai/workspace/v1/matters/{matterId}/matrices/{matrixId}/rows"
payload = { "documentIds": ["value"] }
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({documentIds: ['value']})
};
fetch('https://api.vaquill.ai/workspace/v1/matters/{matterId}/matrices/{matrixId}/rows', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://api.vaquill.ai/workspace/v1/matters/{matterId}/matrices/{matrixId}/rows"
payload := strings.NewReader("{\n \"documentIds\": [\n \"value\"\n ]\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("Authorization", "Bearer <token>")
req.Header.Add("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}{
"id": "mtx_9f2c8b1e4a7d43c9b6e0f1a2c3d4e5f6",
"matterId": "mat_9f2c8b1e4a7d43c9b6e0f1a2c3d4e5f6",
"title": "Vendor agreement review",
"description": "Master services agreement with Acme for the 2026 platform rollout.",
"status": "succeeded",
"columns": [
{
"id": "col_9f2c8b1e4a7d43c9b6e0f1a2c3d4e5f6",
"label": "Liability cap",
"question": "What is the liability cap, and what does it apply to?",
"columnType": "free_text",
"options": [
"yes",
"no",
"not addressed"
],
"instructions": "House paper. Cap liability at 12 months of fees; never accept uncapped indemnity.",
"dependsOnColumnId": "col_9f2c8b1e4a7d43c9b6e0f1a2c3d4e5f6",
"gateExpression": "yes",
"injectUpstream": false,
"position": 0
}
],
"rows": [
{
"id": "row_9f2c8b1e4a7d43c9b6e0f1a2c3d4e5f6",
"documentId": "doc_9f2c8b1e4a7d43c9b6e0f1a2c3d4e5f6",
"filename": "msa-acme-v3.docx",
"position": 0
}
],
"cellCount": 24,
"pendingCellCount": 0,
"errorCellCount": 0,
"createdAt": "2026-08-19T14:32:10Z",
"updatedAt": "2026-08-19T14:32:10Z"
}{
"type": "https://vaquill.ai/docs/workspace-api/errors/insufficient-scope",
"title": "Insufficient scope",
"status": 403,
"detail": "This credential carries matters:read. This operation needs matters:write.",
"instance": "/workspace/v1/matters/mat_9f2c8b1e4a7d43c9b6e0f1a2c3d4e5f6",
"requestId": "req_5f2c8b1e4a7d43c9b6e0f1a2c3d4e5f6"
}{
"type": "https://vaquill.ai/docs/workspace-api/errors/insufficient-scope",
"title": "Insufficient scope",
"status": 403,
"detail": "This credential carries matters:read. This operation needs matters:write.",
"instance": "/workspace/v1/matters/mat_9f2c8b1e4a7d43c9b6e0f1a2c3d4e5f6",
"requestId": "req_5f2c8b1e4a7d43c9b6e0f1a2c3d4e5f6"
}{
"type": "https://vaquill.ai/docs/workspace-api/errors/insufficient-scope",
"title": "Insufficient scope",
"status": 403,
"detail": "This credential carries matters:read. This operation needs matters:write.",
"instance": "/workspace/v1/matters/mat_9f2c8b1e4a7d43c9b6e0f1a2c3d4e5f6",
"requestId": "req_5f2c8b1e4a7d43c9b6e0f1a2c3d4e5f6"
}{
"type": "https://vaquill.ai/docs/workspace-api/errors/insufficient-scope",
"title": "Insufficient scope",
"status": 403,
"detail": "This credential carries matters:read. This operation needs matters:write.",
"instance": "/workspace/v1/matters/mat_9f2c8b1e4a7d43c9b6e0f1a2c3d4e5f6",
"errors": [
{
"location": "<string>",
"message": "<string>",
"type": "<string>"
}
],
"requestId": "req_5f2c8b1e4a7d43c9b6e0f1a2c3d4e5f6"
}{
"type": "https://vaquill.ai/docs/workspace-api/errors/insufficient-scope",
"title": "Insufficient scope",
"status": 403,
"detail": "This credential carries matters:read. This operation needs matters:write.",
"instance": "/workspace/v1/matters/mat_9f2c8b1e4a7d43c9b6e0f1a2c3d4e5f6",
"requestId": "req_5f2c8b1e4a7d43c9b6e0f1a2c3d4e5f6"
}{
"type": "https://vaquill.ai/docs/workspace-api/errors/insufficient-scope",
"title": "Insufficient scope",
"status": 403,
"detail": "This credential carries matters:read. This operation needs matters:write.",
"instance": "/workspace/v1/matters/mat_9f2c8b1e4a7d43c9b6e0f1a2c3d4e5f6",
"requestId": "req_5f2c8b1e4a7d43c9b6e0f1a2c3d4e5f6"
}{
"type": "https://vaquill.ai/docs/workspace-api/errors/insufficient-scope",
"title": "Insufficient scope",
"status": 403,
"detail": "This credential carries matters:read. This operation needs matters:write.",
"instance": "/workspace/v1/matters/mat_9f2c8b1e4a7d43c9b6e0f1a2c3d4e5f6",
"requestId": "req_5f2c8b1e4a7d43c9b6e0f1a2c3d4e5f6"
}Authorizations
Workspace credential issued from the automation console at /automation. Send it as Authorization: Bearer vq_ws_.... This is NOT a Data API key: a vq_key_ credential is refused here and names the other product in the error.
Path Parameters
mat_ identifier of the matter to work inside. Everything in this API hangs off a matter, and the matter in the path is what the authorization boundary is checked against. Take it from GET /v1/matters.
mtx_ identifier of the matrix. Take it from the matter's matrix list.
Body
Documents to add to the grid, one row each.
Each id must be in the matter named in the path and must have finished ingesting, exactly as on the create: retrieval over a document with no chunks yet answers "not in this document" for every column, which is one paid call per cell to learn nothing.
A document already enrolled as a row is REFUSED, not skipped. matrix_rows
is UNIQUE on (matrix_id, document_id) and the service filters duplicates
out of its own payload, so without the refusal a request naming five
documents could add three and answer 201 with nothing saying which two it
dropped.
autoRun is not published. Adding rows creates pending cells and starts
nothing; matrices.run starts it.
doc_ identifiers to add as rows. Each must be in this matter, must have finished ingesting, and must not already be a row.
1["value"]
Response
Successful Response
The grid header plus its axes. Cells are a separate, paged read.
Rows and columns are inlined because they are bounded and because a cell is unreadable without them: a cell names a row id and a column id and nothing else, so a client that could not resolve those would have to page the whole grid to interpret one answer.
Public identifier, mtx_ followed by 32 hex characters.
"mtx_9f2c8b1e4a7d43c9b6e0f1a2c3d4e5f6"
mat_ identifier of the matter this matrix belongs to.
"mat_9f2c8b1e4a7d43c9b6e0f1a2c3d4e5f6"
Display title for the matrix.
"Vendor agreement review"
Matrix status, using the same five public values as an operation.
queued, running, succeeded, failed, cancelled "succeeded"
When the matrix was created (RFC 3339).
"2026-08-19T14:32:10Z"
When the matrix was last updated (RFC 3339).
"2026-08-19T14:32:10Z"
Free-text description of what the matrix is for.
"Master services agreement with Acme for the 2026 platform rollout."
Every column, inlined. A cell names only ids, so these are what make one readable.
Show child attributes
Show child attributes
Every row, inlined, one per document.
Show child attributes
Show child attributes
Total cells in the grid, which is rows times columns.
24
Cells that have not produced an answer yet. Zero means extraction is complete.
0
Cells whose extraction failed. These are distinct from cells that succeeded with a null answer.
0
Was this page helpful?

