curl --request GET \
--url https://api.vaquill.ai/workspace/v1/matters/{matterId}/reviews \
--header 'Authorization: Bearer <token>'import requests
url = "https://api.vaquill.ai/workspace/v1/matters/{matterId}/reviews"
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', 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"
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))
}{
"data": [
{
"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"
}
],
"pagination": {
"limit": 50,
"offset": 0,
"total": 128,
"hasMore": false
}
}{
"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"
}List contract reviews in a matter
Every review in this matter, newest first.
A listed review carries its status, its findings summary and its timestamps.
The fields that describe what was ASKED FOR (contractType, userSide,
playbookId, jurisdiction, round) are absent from a list and present on
a GET by id: they live alongside the contract text, and returning them per
row would mean pulling every contract in the page across the wire.
curl --request GET \
--url https://api.vaquill.ai/workspace/v1/matters/{matterId}/reviews \
--header 'Authorization: Bearer <token>'import requests
url = "https://api.vaquill.ai/workspace/v1/matters/{matterId}/reviews"
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', 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"
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))
}{
"data": [
{
"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"
}
],
"pagination": {
"limit": 50,
"offset": 0,
"total": 128,
"hasMore": false
}
}{
"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.
Query Parameters
How many rows to return, 1 to 200. Defaults to 50.
1 <= x <= 200How many rows to skip before returning any. Combine with limit to page: offset=0, then offset=50, and so on. Offsets are positional, not stable, so a set that changes while you page can show a row twice or not at all.
x >= 0Was this page helpful?

