curl --request GET \
--url https://api.vaquill.ai/workspace/v1/playbook-extractions/{extractionId} \
--header 'Authorization: Bearer <token>'import requests
url = "https://api.vaquill.ai/workspace/v1/playbook-extractions/{extractionId}"
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/playbook-extractions/{extractionId}', 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/playbook-extractions/{extractionId}"
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": "pex_9f2c8b1e4a7d43c9b6e0f1a2c3d4e5f6",
"status": "queued",
"contractType": "msa",
"positions": {
"limitation_of_liability": {
"standardPosition": "Liability is capped at the fees paid in the preceding twelve months.",
"acceptableRange": "Between one and two times the fees paid in the preceding twelve months.",
"escalationTriggers": [
"value"
],
"fallbackLadder": [
"value"
],
"dealBreaker": "value",
"priority": "must_have",
"approvalLevel": "none",
"escalationConditions": [
{
"attribute": "clause_severity",
"operator": "eq",
"value": "1000000",
"escalateTo": "manager",
"note": "Escalated to GC: deal value over $1M."
}
],
"rationale": "Our standard position caps liability at fees paid in the preceding 12 months.",
"riskWeight": 4,
"enabled": true
}
},
"truncated": false,
"sourceDocumentId": "doc_9f2c8b1e4a7d43c9b6e0f1a2c3d4e5f6",
"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 playbook extraction
One extraction, and the positions it found.
A running extraction is a 200 with an empty positions map and a truthful
status, never a 404. Check truncated before adopting: a contract over
the extractor’s ceiling produces positions that are correct and not complete.
curl --request GET \
--url https://api.vaquill.ai/workspace/v1/playbook-extractions/{extractionId} \
--header 'Authorization: Bearer <token>'import requests
url = "https://api.vaquill.ai/workspace/v1/playbook-extractions/{extractionId}"
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/playbook-extractions/{extractionId}', 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/playbook-extractions/{extractionId}"
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": "pex_9f2c8b1e4a7d43c9b6e0f1a2c3d4e5f6",
"status": "queued",
"contractType": "msa",
"positions": {
"limitation_of_liability": {
"standardPosition": "Liability is capped at the fees paid in the preceding twelve months.",
"acceptableRange": "Between one and two times the fees paid in the preceding twelve months.",
"escalationTriggers": [
"value"
],
"fallbackLadder": [
"value"
],
"dealBreaker": "value",
"priority": "must_have",
"approvalLevel": "none",
"escalationConditions": [
{
"attribute": "clause_severity",
"operator": "eq",
"value": "1000000",
"escalateTo": "manager",
"note": "Escalated to GC: deal value over $1M."
}
],
"rationale": "Our standard position caps liability at fees paid in the preceding 12 months.",
"riskWeight": 4,
"enabled": true
}
},
"truncated": false,
"sourceDocumentId": "doc_9f2c8b1e4a7d43c9b6e0f1a2c3d4e5f6",
"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
pex_ identifier of the playbook extraction. Returned on the operation that launched it. It names the extraction JOB, which is what exists from the moment the work is accepted.
Response
Successful Response
What an extraction found, in the shape a playbook takes.
A running extraction is a 200 with an EMPTY positions map and a truthful
status, never a 404: a 404 would be indistinguishable from an extraction
that never existed. Why one FAILED lives on the operation rather than here,
so there is exactly one sanitizer for internal error text on this surface.
Public identifier, pex_ followed by 32 hex characters.
"pex_9f2c8b1e4a7d43c9b6e0f1a2c3d4e5f6"
Where the extraction got to, in the same five values an operation uses. positions is empty until it reads succeeded.
queued, running, succeeded, failed, cancelled "queued"
When the extraction was accepted (RFC 3339).
"2026-08-19T14:32:10Z"
The contract type that was pinned or detected. Pass it to playbooks.create when you adopt these positions: a playbook's type decides which reviews resolve it.
"msa"
The extracted positions, keyed by clause type. Review them, then send the map you want to keep to playbooks.create. Nothing here has been saved as a playbook.
Show child attributes
Show child attributes
True when the contract exceeded the extractor's block ceiling and some clauses were not read. The positions returned are correct; they are not complete. Split the contract and extract the remainder separately.
false
doc_ identifier of the document this was read from, when one was named. Null for an extraction from contractText, which keeps no file.
"doc_9f2c8b1e4a7d43c9b6e0f1a2c3d4e5f6"
When it reached a terminal status (RFC 3339).
"2026-08-19T14:32:10Z"
Was this page helpful?

