curl --request POST \
--url https://api.vaquill.ai/workspace/v1/matters/{matterId}/reviews/{reviewId}/exports \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '{}'import requests
url = "https://api.vaquill.ai/workspace/v1/matters/{matterId}/reviews/{reviewId}/exports"
payload = {}
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({})
};
fetch('https://api.vaquill.ai/workspace/v1/matters/{matterId}/reviews/{reviewId}/exports', 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/{reviewId}/exports"
payload := strings.NewReader("{}")
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))
}{
"format": "docx",
"filename": "msa-acme-v3.docx",
"url": "https://storage.vaquill.ai/exports/msa-acme-v3-redline.docx?signature=...",
"expiresAt": "2026-08-19T14:32:10Z",
"sizeBytes": 248193,
"redlineCount": 9,
"trackedChanges": false,
"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."
}
}{
"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"
}Export a reviewed contract with redlines applied
Mint a short-lived URL to the contract with its redlines applied.
A POST rather than a GET because it creates something: a bearer URL over a client document, and a rendering that did not exist before. Recording that as a creation is what lets an audit answer who took a copy and when.
curl --request POST \
--url https://api.vaquill.ai/workspace/v1/matters/{matterId}/reviews/{reviewId}/exports \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '{}'import requests
url = "https://api.vaquill.ai/workspace/v1/matters/{matterId}/reviews/{reviewId}/exports"
payload = {}
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({})
};
fetch('https://api.vaquill.ai/workspace/v1/matters/{matterId}/reviews/{reviewId}/exports', 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/{reviewId}/exports"
payload := strings.NewReader("{}")
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))
}{
"format": "docx",
"filename": "msa-acme-v3.docx",
"url": "https://storage.vaquill.ai/exports/msa-acme-v3-redline.docx?signature=...",
"expiresAt": "2026-08-19T14:32:10Z",
"sizeBytes": 248193,
"redlineCount": 9,
"trackedChanges": false,
"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."
}
}{
"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.
Body
Which of a review's redlines to apply, and how to mark them up.
Omitting redlines applies EVERY redline the review produced, which is the
common case for an integration that has already triaged them elsewhere.
Supplying them is how a caller applies a subset, or applies edits it wrote
itself after reading the review.
Which edits to apply. Omit to apply EVERY redline the review produced, which is the common case for an integration that triaged them elsewhere. Supply them to apply a subset, or edits you wrote yourself.
500Show child attributes
Show child attributes
True renders native Word tracked changes, so the counterparty accepts or rejects each edit in the Review pane. False renders colored strikethrough and underline, which is viewable anywhere but is not real revisions.
true
Response
Successful Response
A short-lived URL to the marked-up contract.
The same shape as a comparison export, and for the same reason: the route declares a response model, and a DOCX is not one. The bytes live in object storage and the customer fetches them directly.
approvalGate is repeated here rather than left on the review. An
integration that exports without re-reading the review is exactly the one
that would send an unapproved redline to a counterparty, and the gate is
cheap to carry at the point where content actually leaves the workspace.
Suggested filename for the download.
"msa-acme-v3.docx"
Short-lived signed URL to download the marked-up contract. Fetch it promptly and do not store it.
"https://storage.vaquill.ai/exports/msa-acme-v3-redline.docx?signature=..."
When the URL stops working (RFC 3339).
"2026-08-19T14:32:10Z"
Size of the exported file in bytes.
248193
How many redlines were applied to produce this file.
9
Whether the export uses native Word tracked changes.
false
Format of the exported file. Only DOCX is produced today.
"docx""docx"
Repeated from the review on purpose. An integration that exports without re-reading the review is exactly the one that would send an unapproved redline to a counterparty, so the gate travels with the bytes.
Show child attributes
Show child attributes
Was this page helpful?

