curl --request POST \
--url https://api.vaquill.ai/workspace/v1/matters/{matterId}/reviews \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data @- <<EOF
{
"documentText": "MASTER SERVICES AGREEMENT\n\nThis Master Services Agreement is entered into as of 1 September 2026 between Acme Corporation, a Delaware corporation, and the Supplier identified on the signature page.\n\n8. LIMITATION OF LIABILITY. Supplier's total liability shall be unlimited for any claim arising out of this Agreement.\n\n12. GOVERNING LAW. This Agreement is governed by the laws of the State of Delaware.",
"contractType": "saas",
"userSide": "vendor"
}
EOFimport requests
url = "https://api.vaquill.ai/workspace/v1/matters/{matterId}/reviews"
payload = {
"documentText": "MASTER SERVICES AGREEMENT
This Master Services Agreement is entered into as of 1 September 2026 between Acme Corporation, a Delaware corporation, and the Supplier identified on the signature page.
8. LIMITATION OF LIABILITY. Supplier's total liability shall be unlimited for any claim arising out of this Agreement.
12. GOVERNING LAW. This Agreement is governed by the laws of the State of Delaware.",
"contractType": "saas",
"userSide": "vendor"
}
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({
documentText: 'MASTER SERVICES AGREEMENT\n\nThis Master Services Agreement is entered into as of 1 September 2026 between Acme Corporation, a Delaware corporation, and the Supplier identified on the signature page.\n\n8. LIMITATION OF LIABILITY. Supplier\'s total liability shall be unlimited for any claim arising out of this Agreement.\n\n12. GOVERNING LAW. This Agreement is governed by the laws of the State of Delaware.',
contractType: 'saas',
userSide: 'vendor'
})
};
fetch('https://api.vaquill.ai/workspace/v1/matters/{matterId}/reviews', 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}/reviews"
payload := strings.NewReader("{\n \"documentText\": \"MASTER SERVICES AGREEMENT\\n\\nThis Master Services Agreement is entered into as of 1 September 2026 between Acme Corporation, a Delaware corporation, and the Supplier identified on the signature page.\\n\\n8. LIMITATION OF LIABILITY. Supplier's total liability shall be unlimited for any claim arising out of this Agreement.\\n\\n12. GOVERNING LAW. This Agreement is governed by the laws of the State of Delaware.\",\n \"contractType\": \"saas\",\n \"userSide\": \"vendor\"\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": "op_9f2c8b1e4a7d43c9b6e0f1a2c3d4e5f6",
"type": "matrix.run",
"status": "succeeded",
"createdAt": "2026-08-19T14:32:10Z",
"completedAt": "2026-08-19T14:32:10Z",
"matterId": "mat_9f2c8b1e4a7d43c9b6e0f1a2c3d4e5f6",
"resource": {
"kind": "matrix",
"id": "mtx_9f2c8b1e4a7d43c9b6e0f1a2c3d4e5f6",
"url": "https://storage.vaquill.ai/exports/msa-acme-v3-redline.docx?signature=..."
},
"progress": {
"done": 24,
"total": 128,
"unit": "cells"
},
"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"
}{
"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"
}Review a contract against a playbook
Queue a contract review. 202 with an operation to poll.
A retry carrying the same Idempotency-Key returns the original operation
and starts nothing, which is what makes a client timeout free rather than a
second billed review of the same contract.
curl --request POST \
--url https://api.vaquill.ai/workspace/v1/matters/{matterId}/reviews \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data @- <<EOF
{
"documentText": "MASTER SERVICES AGREEMENT\n\nThis Master Services Agreement is entered into as of 1 September 2026 between Acme Corporation, a Delaware corporation, and the Supplier identified on the signature page.\n\n8. LIMITATION OF LIABILITY. Supplier's total liability shall be unlimited for any claim arising out of this Agreement.\n\n12. GOVERNING LAW. This Agreement is governed by the laws of the State of Delaware.",
"contractType": "saas",
"userSide": "vendor"
}
EOFimport requests
url = "https://api.vaquill.ai/workspace/v1/matters/{matterId}/reviews"
payload = {
"documentText": "MASTER SERVICES AGREEMENT
This Master Services Agreement is entered into as of 1 September 2026 between Acme Corporation, a Delaware corporation, and the Supplier identified on the signature page.
8. LIMITATION OF LIABILITY. Supplier's total liability shall be unlimited for any claim arising out of this Agreement.
12. GOVERNING LAW. This Agreement is governed by the laws of the State of Delaware.",
"contractType": "saas",
"userSide": "vendor"
}
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({
documentText: 'MASTER SERVICES AGREEMENT\n\nThis Master Services Agreement is entered into as of 1 September 2026 between Acme Corporation, a Delaware corporation, and the Supplier identified on the signature page.\n\n8. LIMITATION OF LIABILITY. Supplier\'s total liability shall be unlimited for any claim arising out of this Agreement.\n\n12. GOVERNING LAW. This Agreement is governed by the laws of the State of Delaware.',
contractType: 'saas',
userSide: 'vendor'
})
};
fetch('https://api.vaquill.ai/workspace/v1/matters/{matterId}/reviews', 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}/reviews"
payload := strings.NewReader("{\n \"documentText\": \"MASTER SERVICES AGREEMENT\\n\\nThis Master Services Agreement is entered into as of 1 September 2026 between Acme Corporation, a Delaware corporation, and the Supplier identified on the signature page.\\n\\n8. LIMITATION OF LIABILITY. Supplier's total liability shall be unlimited for any claim arising out of this Agreement.\\n\\n12. GOVERNING LAW. This Agreement is governed by the laws of the State of Delaware.\",\n \"contractType\": \"saas\",\n \"userSide\": \"vendor\"\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": "op_9f2c8b1e4a7d43c9b6e0f1a2c3d4e5f6",
"type": "matrix.run",
"status": "succeeded",
"createdAt": "2026-08-19T14:32:10Z",
"completedAt": "2026-08-19T14:32:10Z",
"matterId": "mat_9f2c8b1e4a7d43c9b6e0f1a2c3d4e5f6",
"resource": {
"kind": "matrix",
"id": "mtx_9f2c8b1e4a7d43c9b6e0f1a2c3d4e5f6",
"url": "https://storage.vaquill.ai/exports/msa-acme-v3-redline.docx?signature=..."
},
"progress": {
"done": 24,
"total": 128,
"unit": "cells"
},
"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"
}{
"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.
Headers
A unique value of your choosing, so a retried launch returns the FIRST operation instead of starting a second billable job. Reusing one with a different body is refused. Retrying with the same key and the same body is free and is the intended way to recover from a timeout.
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.
Body
Start a review of one contract against one playbook.
contractType and userSide are the internal enums by REFERENCE rather than
by copy. They are the taxonomy the whole product is built on, guarded in both
directions by app/tests/unit/test_contract_type_taxonomy.py, and a second
hand-maintained copy here would be a fourth layer for that guard to police.
Widening the taxonomy widens this API additively, which is correct.
The full contract text to review, 100 to 200,000 characters. Text rather than a document id: a review reads one contract end to end and the caller usually has it in hand.
100 - 200000"MASTER SERVICES AGREEMENT\n\nThis Master Services Agreement is entered into as of 1 September 2026 between Acme Corporation, a Delaware corporation, and the Supplier identified on the signature page.\n\n8. LIMITATION OF LIABILITY. Supplier's total liability shall be unlimited for any claim arising out of this Agreement.\n\n12. GOVERNING LAW. This Agreement is governed by the laws of the State of Delaware."
What kind of contract this is. Determines which playbook and which default positions resolve.
saas, professional_services, msa, sow, consulting, license, sale, partnership, procurement, vendor_agreement, reseller_distribution, supply, lease, loan, eula, terms_of_service, baa, order_form, nda, dpa, ip_assignment, employment, executive_employment, independent_contractor, offer_letter, severance_agreement, non_compete, asset_purchase, stock_purchase, merger_agreement, shareholders_agreement, operating_agreement, safe, term_sheet, settlement_agreement, engagement_letter, protective_order, joint_defense, other "saas"
Which side of the deal you are on. The review argues for this side.
vendor, customer, licensor, licensee, partner, supplier, reseller, employer, employee, buyer, seller, company, investor, lender, borrower, disclosing_party, receiving_party, plaintiff, defendant, other "vendor"
pbk_ identifier of the playbook to review against. Omit to run against the built-in default positions for jurisdiction, which is a real answer rather than a degraded one.
"pbk_9f2c8b1e4a7d43c9b6e0f1a2c3d4e5f6"
Two-letter uppercase jurisdiction code, or INTL. Selects the default positions when no playbook is named.
^([A-Z]{2}|INTL)$"US"
Narrow the review to these areas of concern. Omit to review the whole contract.
501 - 80["value"]
Extra instructions for this review only, layered on top of the playbook.
2000"Pay particular attention to the indemnity carve-outs."
How aggressively to mark up. light flags only escalation triggers, standard marks up gaps to the preferred position, firm hard-lines every deviation.
light, standard, firm "light"
Whose paper this is. own defends your drafted positions; counterparty marks up their form assertively. Orthogonal to userSide. Omit if unknown, which costs only prompt specificity.
own, counterparty "own"
Negotiation round. 2 and above tells the reviewer the counterparty has already responded, so it proposes minimal edits toward the fallback rather than restating the preferred position.
1 <= x <= 101
Your last sent version, at round 2 and above, so the reviewer can compute a real diff instead of guessing what changed and undoing settled language.
200000"8. LIMITATION OF LIABILITY. Supplier's total liability shall not exceed the fees paid in the preceding twelve months."
The counterparty's response, when it differs from documentText. Most callers paste the response straight into documentText, in which case leave this out.
200000"8. LIMITATION OF LIABILITY. Supplier's total liability shall not exceed three times the fees paid in the preceding twelve months."
Deal attributes the playbook's conditional escalation rules evaluate.
Show child attributes
Show child attributes
standard runs the first-pass review. deep additionally re-drafts every flagged clause with the deep model, grounds each quote against the contract, drops first-pass false positives and stamps a sign-off level, so each redline's grounding is a fact rather than a default. It takes several times as long and verifies at most 40 flagged clauses. focusAreas, reviewInstructions, markupLevel, round, priorRoundText and counterpartyResponseText are not supported at this depth and are refused rather than ignored.
standard, deep "standard"
Response
Successful Response
One long-running operation, whatever kind of work it is.
Readable for OPERATION_RETENTION_DAYS after creation, per AIP-151.
Public identifier, op_ followed by 32 hex characters. Poll GET /v1/operations/{operationId} with it.
"op_9f2c8b1e4a7d43c9b6e0f1a2c3d4e5f6"
What kind of work this is, for example matrix.run or draft.generate.
"matrix.run"
One of five values: queued, running, succeeded, failed, cancelled. There is no sixth and there are no synonyms. Stop polling once it is succeeded, failed or cancelled.
queued, running, succeeded, failed, cancelled "succeeded"
When the operation was accepted (RFC 3339).
"2026-08-19T14:32:10Z"
When the operation reached a terminal status (RFC 3339). Present if and only if the status is terminal.
"2026-08-19T14:32:10Z"
mat_ identifier of the matter this work belongs to, when it belongs to one.
"mat_9f2c8b1e4a7d43c9b6e0f1a2c3d4e5f6"
What the operation produced. Absent until the underlying job row exists, which an idempotent replay can briefly observe, so treat absence as 'not yet' rather than 'never'.
Show child attributes
Show child attributes
Why the work failed. Present only when status is failed. Partial success is succeeded with progress.done < progress.total, never an error.
Show child attributes
Show child attributes
How far along the work is, when the underlying job reports it. Absent does not mean no progress.
Show child attributes
Show child attributes
The X-Request-ID of the request that created this operation. Quote it in a support ticket.
"req_5f2c8b1e4a7d43c9b6e0f1a2c3d4e5f6"
Was this page helpful?

