curl --request POST \
--url https://api.vaquill.ai/workspace/v1/playbooks/from-template \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"templateSlug": "msa-buyer-side"
}
'import requests
url = "https://api.vaquill.ai/workspace/v1/playbooks/from-template"
payload = { "templateSlug": "msa-buyer-side" }
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({templateSlug: 'msa-buyer-side'})
};
fetch('https://api.vaquill.ai/workspace/v1/playbooks/from-template', 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/playbooks/from-template"
payload := strings.NewReader("{\n \"templateSlug\": \"msa-buyer-side\"\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": "pbk_9f2c8b1e4a7d43c9b6e0f1a2c3d4e5f6",
"name": "MSA, buyer side",
"description": "Master services agreement with Acme for the 2026 platform rollout.",
"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
}
},
"isDefault": false,
"sourceFilename": "msa-acme-v3.docx",
"createdAt": "2026-08-19T14:32:10Z",
"updatedAt": "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",
"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"
}Create a playbook from a starter template
Adopt a starter template as an organization playbook.
The result is an ordinary playbook, owned and editable. Nothing links it back to the template afterwards, because a live link would imply an update path that does not exist.
curl --request POST \
--url https://api.vaquill.ai/workspace/v1/playbooks/from-template \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"templateSlug": "msa-buyer-side"
}
'import requests
url = "https://api.vaquill.ai/workspace/v1/playbooks/from-template"
payload = { "templateSlug": "msa-buyer-side" }
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({templateSlug: 'msa-buyer-side'})
};
fetch('https://api.vaquill.ai/workspace/v1/playbooks/from-template', 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/playbooks/from-template"
payload := strings.NewReader("{\n \"templateSlug\": \"msa-buyer-side\"\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": "pbk_9f2c8b1e4a7d43c9b6e0f1a2c3d4e5f6",
"name": "MSA, buyer side",
"description": "Master services agreement with Acme for the 2026 platform rollout.",
"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
}
},
"isDefault": false,
"sourceFilename": "msa-acme-v3.docx",
"createdAt": "2026-08-19T14:32:10Z",
"updatedAt": "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",
"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.
Body
Adopt one of our starter templates as an organization playbook.
The result is an ordinary playbook, owned by the organization and editable. Nothing links it back to the template afterwards: a template is a starting point, and a live link would imply an update path that does not exist.
slug of the starter template to adopt, from GET /v1/playbook-templates.
120"msa-buyer-side"
Name for the new playbook. Omit to take the template's own name.
1 - 200"Acme Corporation"
Description for the new playbook. Omit to take the template's own.
1000"Master services agreement with Acme for the 2026 platform rollout."
Two-letter uppercase jurisdiction code, or INTL. Selects which default positions the template resolves.
^([A-Z]{2}|INTL)$"US"
Response
Successful Response
One organization playbook, with every position it holds.
Positions are returned in full rather than summarized. A playbook is the input to a review, so a caller that cannot read the positions cannot tell what its reviews are being measured against, and a separate positions endpoint would make the common case two calls.
Public identifier, pbk_ followed by 32 hex characters.
"pbk_9f2c8b1e4a7d43c9b6e0f1a2c3d4e5f6"
The playbook's display name.
"MSA, buyer side"
Which contract type this playbook governs. Fixed at creation: changing it would silently redirect which reviews resolve it.
"msa"
Free-text description of what this playbook covers.
"Master services agreement with Acme for the 2026 platform rollout."
Every negotiating position the playbook holds, keyed by clause-type slug. Returned in full, because a caller that cannot read the positions cannot tell what its reviews are measured against.
Show child attributes
Show child attributes
True when reviews of this contract type resolve to this playbook if none is named. Read-only here: exactly one default per contract type is enforced by the database, and this API cannot set it.
false
Filename of the exemplar this playbook was extracted from, when it was imported rather than authored by hand.
"msa-acme-v3.docx"
When the playbook was created (RFC 3339).
"2026-08-19T14:32:10Z"
When the playbook was last modified (RFC 3339).
"2026-08-19T14:32:10Z"
Was this page helpful?

