curl --request GET \
--url https://api.vaquill.ai/workspace/v1/matters/{matterId}/reviews/{reviewId} \
--header 'Authorization: Bearer <token>'import requests
url = "https://api.vaquill.ai/workspace/v1/matters/{matterId}/reviews/{reviewId}"
headers = {"Authorization": "Bearer <token>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {Authorization: 'Bearer <token>'}};
fetch('https://api.vaquill.ai/workspace/v1/matters/{matterId}/reviews/{reviewId}', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));package main
import (
"fmt"
"net/http"
"io"
)
func main() {
url := "https://api.vaquill.ai/workspace/v1/matters/{matterId}/reviews/{reviewId}"
req, _ := http.NewRequest("GET", url, nil)
req.Header.Add("Authorization", "Bearer <token>")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}{
"id": "rev_9f2c8b1e4a7d43c9b6e0f1a2c3d4e5f6",
"matterId": "mat_9f2c8b1e4a7d43c9b6e0f1a2c3d4e5f6",
"status": "succeeded",
"contractType": "msa",
"userSide": "buyer",
"playbookId": "value",
"jurisdiction": "US",
"round": 1,
"summary": "Twelve substantive changes, seven of them in the liability and indemnity sections.",
"overallRisk": "yellow",
"businessImpactSummary": "Two changes shift risk toward us; the rest are housekeeping.",
"approvalGate": {
"required": false,
"level": "partner",
"dealBreakerCount": 1,
"reasons": [
{
"clauseName": "Limitation of Liability",
"approvalLevel": "partner",
"isDealBreaker": false,
"note": "Escalated to GC: deal value over $1M."
}
],
"summary": "Twelve substantive changes, seven of them in the liability and indemnity sections."
},
"liabilityExposure": {
"exposureLevel": "yellow",
"verdict": "Liability is capped at fees paid in the preceding twelve months.",
"capStatus": "capped",
"capAmount": "Fees paid in the preceding twelve months",
"capQuote": "shall not exceed the fees paid in the preceding twelve months",
"grounding": "verified",
"capScope": "aggregate",
"capAdequate": false,
"mutualCap": false,
"consequentialDamagesExcluded": false,
"uncappedCarveouts": [
"Indemnity for IP infringement",
"Confidentiality breach"
],
"supercap": "Two times fees for data-security breaches",
"indemnityExposure": "Uncapped for third-party IP claims.",
"insuranceRequired": "$5M commercial general liability",
"claimTimeBar": "Claims must be brought within 12 months."
},
"counterpartyMatch": {
"name": "Acme Corporation",
"vendor": "Acme Corporation",
"flexibility": "limited",
"negotiationStrategyNote": "This paper is rarely amended below the enterprise tier; lead with the liability cap.",
"counterpartyRedlinesCount": 4
},
"clauses": [
{
"clauseName": "Limitation of Liability",
"clauseType": "limitation_of_liability",
"sectionReference": "8.2",
"currentLanguage": "Supplier's total liability shall be unlimited.",
"severity": "yellow",
"analysis": "The clause is uncapped and departs from the playbook's standard position.",
"riskDescription": "Unlimited liability for a breach we cannot fully control.",
"playbookPosition": "Cap liability at fees paid in the preceding twelve months.",
"approvalLevel": "partner",
"isDealBreaker": false
}
],
"redlines": [
{
"clauseName": "Limitation of Liability",
"sectionReference": "8.2",
"currentLanguage": "Supplier's total liability shall be unlimited.",
"proposedLanguage": "Supplier's total liability shall not exceed the fees paid in the preceding twelve months.",
"rationale": "Our standard position caps liability at fees paid in the preceding 12 months.",
"priority": "must_have",
"fallbackPosition": "Two times fees paid in the preceding twelve months.",
"grounding": "verified",
"approvalLevel": "partner",
"isDealBreaker": false,
"nature": "substantive"
}
],
"negotiationPriorities": [
{
"tier": 1,
"tierLabel": "Must have",
"items": [
"Cap liability",
"Remove uncapped indemnity"
]
}
],
"missingClauses": [
"Force Majeure"
],
"flags": [
{
"clauseName": "Limitation of Liability",
"sectionReference": "8.2",
"observation": "The counterparty entity name differs from the one on the signature block."
}
],
"parseWarning": "Two clauses could not be parsed and are omitted from the findings.",
"deep": {
"clausesReviewed": 1,
"redlinesKept": 1,
"clearedAsCompliant": 1,
"clauseLimit": 40,
"clausesTruncated": false
},
"createdAt": "2026-08-19T14:32:10Z",
"completedAt": "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"
}Get a contract review
One review: its findings, or its progress toward them.
404 covers every reason it is not readable, including a job of a different kind that happens to share the table.
curl --request GET \
--url https://api.vaquill.ai/workspace/v1/matters/{matterId}/reviews/{reviewId} \
--header 'Authorization: Bearer <token>'import requests
url = "https://api.vaquill.ai/workspace/v1/matters/{matterId}/reviews/{reviewId}"
headers = {"Authorization": "Bearer <token>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {Authorization: 'Bearer <token>'}};
fetch('https://api.vaquill.ai/workspace/v1/matters/{matterId}/reviews/{reviewId}', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));package main
import (
"fmt"
"net/http"
"io"
)
func main() {
url := "https://api.vaquill.ai/workspace/v1/matters/{matterId}/reviews/{reviewId}"
req, _ := http.NewRequest("GET", url, nil)
req.Header.Add("Authorization", "Bearer <token>")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}{
"id": "rev_9f2c8b1e4a7d43c9b6e0f1a2c3d4e5f6",
"matterId": "mat_9f2c8b1e4a7d43c9b6e0f1a2c3d4e5f6",
"status": "succeeded",
"contractType": "msa",
"userSide": "buyer",
"playbookId": "value",
"jurisdiction": "US",
"round": 1,
"summary": "Twelve substantive changes, seven of them in the liability and indemnity sections.",
"overallRisk": "yellow",
"businessImpactSummary": "Two changes shift risk toward us; the rest are housekeeping.",
"approvalGate": {
"required": false,
"level": "partner",
"dealBreakerCount": 1,
"reasons": [
{
"clauseName": "Limitation of Liability",
"approvalLevel": "partner",
"isDealBreaker": false,
"note": "Escalated to GC: deal value over $1M."
}
],
"summary": "Twelve substantive changes, seven of them in the liability and indemnity sections."
},
"liabilityExposure": {
"exposureLevel": "yellow",
"verdict": "Liability is capped at fees paid in the preceding twelve months.",
"capStatus": "capped",
"capAmount": "Fees paid in the preceding twelve months",
"capQuote": "shall not exceed the fees paid in the preceding twelve months",
"grounding": "verified",
"capScope": "aggregate",
"capAdequate": false,
"mutualCap": false,
"consequentialDamagesExcluded": false,
"uncappedCarveouts": [
"Indemnity for IP infringement",
"Confidentiality breach"
],
"supercap": "Two times fees for data-security breaches",
"indemnityExposure": "Uncapped for third-party IP claims.",
"insuranceRequired": "$5M commercial general liability",
"claimTimeBar": "Claims must be brought within 12 months."
},
"counterpartyMatch": {
"name": "Acme Corporation",
"vendor": "Acme Corporation",
"flexibility": "limited",
"negotiationStrategyNote": "This paper is rarely amended below the enterprise tier; lead with the liability cap.",
"counterpartyRedlinesCount": 4
},
"clauses": [
{
"clauseName": "Limitation of Liability",
"clauseType": "limitation_of_liability",
"sectionReference": "8.2",
"currentLanguage": "Supplier's total liability shall be unlimited.",
"severity": "yellow",
"analysis": "The clause is uncapped and departs from the playbook's standard position.",
"riskDescription": "Unlimited liability for a breach we cannot fully control.",
"playbookPosition": "Cap liability at fees paid in the preceding twelve months.",
"approvalLevel": "partner",
"isDealBreaker": false
}
],
"redlines": [
{
"clauseName": "Limitation of Liability",
"sectionReference": "8.2",
"currentLanguage": "Supplier's total liability shall be unlimited.",
"proposedLanguage": "Supplier's total liability shall not exceed the fees paid in the preceding twelve months.",
"rationale": "Our standard position caps liability at fees paid in the preceding 12 months.",
"priority": "must_have",
"fallbackPosition": "Two times fees paid in the preceding twelve months.",
"grounding": "verified",
"approvalLevel": "partner",
"isDealBreaker": false,
"nature": "substantive"
}
],
"negotiationPriorities": [
{
"tier": 1,
"tierLabel": "Must have",
"items": [
"Cap liability",
"Remove uncapped indemnity"
]
}
],
"missingClauses": [
"Force Majeure"
],
"flags": [
{
"clauseName": "Limitation of Liability",
"sectionReference": "8.2",
"observation": "The counterparty entity name differs from the one on the signature block."
}
],
"parseWarning": "Two clauses could not be parsed and are omitted from the findings.",
"deep": {
"clausesReviewed": 1,
"redlinesKept": 1,
"clearedAsCompliant": 1,
"clauseLimit": 40,
"clausesTruncated": false
},
"createdAt": "2026-08-19T14:32:10Z",
"completedAt": "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.
rev_ identifier of the contract review. Returned on the operation that launched it, at either depth.
Response
Successful Response
One contract review: its findings, or its progress toward them.
Public identifier, rev_ followed by 32 hex characters.
"rev_9f2c8b1e4a7d43c9b6e0f1a2c3d4e5f6"
mat_ identifier of the matter this review belongs to.
"mat_9f2c8b1e4a7d43c9b6e0f1a2c3d4e5f6"
Review status, using the same five public values as an operation. While queued or running, every findings list is empty and the scalar fields are absent. That is the truthful shape of a review that has not happened yet, not an error.
queued, running, succeeded, failed, cancelled "succeeded"
When the review was created (RFC 3339).
"2026-08-19T14:32:10Z"
Contract type the review ran as, echoed from the request.
"msa"
Which side the review argued for, echoed from the request.
"buyer"
The playbook the review actually ran against. Absent when it ran against the built-in defaults, so the two cases can be told apart after the fact.
"pbk_9f2c8b1e4a7d43c9b6e0f1a2c3d4e5f6"
Jurisdiction the review ran under.
"US"
Negotiation round this review was run for.
1
Prose summary of the review's conclusions.
"Twelve substantive changes, seven of them in the liability and indemnity sections."
Overall risk rating for the contract: green, yellow or red.
"yellow"
What the findings mean commercially, in plain language.
"Two changes shift risk toward us; the rest are housekeeping."
Whether a human should sign this off before it goes out. Reported, never enforced.
Show child attributes
Show child attributes
How much you are on the hook for: caps, carve-outs, indemnities and insurance.
Show child attributes
Show child attributes
Set when a known counterparty paper was recognized, which means the findings include counterparty-specific redlines layered on the general analysis.
Show child attributes
Show child attributes
Every clause analyzed, with its severity against the playbook position.
Show child attributes
Show child attributes
Proposed edits, ready to send to counterparty counsel. Check each one's grounding before applying it automatically.
Show child attributes
Show child attributes
What to raise first and what to trade, in tiers.
Show child attributes
Show child attributes
Standard clauses ABSENT from the contract. The one finding that cannot be expressed as a clause analysis, because there is no clause to analyze.
["Force Majeure"]
Things the reviewer noticed and deliberately did not redline: a wrong entity name, an odd schedule entry, a real ambiguity. Confirm these with a human before signing.
Show child attributes
Show child attributes
Set when the model's output only partly parsed, which means the findings may be incomplete. Present is the difference between acting on the findings and asking a human first.
"Two clauses could not be parsed and are omitted from the findings."
What the deep verification pass did. Absent on a standard review, which is the signal that no verification ran rather than that it found nothing.
Show child attributes
Show child attributes
When the review reached a terminal status (RFC 3339).
"2026-08-19T14:32:10Z"
Was this page helpful?

