Skip to main content
POST
Generate a draft

Authorizations

Authorization
string
header
required

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.

Headers

Idempotency-Key
string | null

A unique value of your choosing, so a retried launch returns the FIRST operation instead of starting a second billable job. Reusing one with a different body is refused. Retrying with the same key and the same body is free and is the intended way to recover from a timeout.

Path Parameters

matterId
string
required

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.

Body

application/json

Start a generation. There is no synchronous create.

jurisdiction is deliberately absent and fixed at US: this is a US-only product (OPINIONS.md), and a field whose only accepted value is the default is a field a customer has to discover before they can ignore it. governingLawState is required for the same reason it is required internally: a US draft with no pinned governing law cites nothing.

category
string
required

What kind of document to generate, as a category slug. Validated against the live vocabulary when the generation starts.

Required string length: 1 - 64
Example:

"commercial"

title
string
required

Title for the generated draft.

Required string length: 1 - 200
Example:

"Master Services Agreement"

governingLawState
string
required

Governing law to pin. Accepts a code (ca), a name (California) or the sentinel federal. Required: a US draft with no pinned governing law cites nothing.

Required string length: 1 - 80
Example:

"ca"

tone
enum<string>
default:balanced

How protective the generated language should be: protective, balanced or permissive.

Available options:
protective,
balanced,
permissive
Example:

"protective"

specialInstructions
string | null

Anything specific this draft needs, in your own words.

Maximum string length: 40000
Example:

"Two-year term, mutual, governed by California law."

variables
Variables · object

Template variable values, for example {"party_a_name": "Acme Corp"}. Which keys mean anything is a property of the category, so this is deliberately free-form. Unfilled placeholders are counted on export.

practiceArea
string | null

Practice area for the draft. Inferred from the category when omitted.

Required string length: 1 - 64
Example:

"commercial"

Response

Successful Response

One long-running operation, whatever kind of work it is.

Readable for OPERATION_RETENTION_DAYS after creation, per AIP-151.

id
string
required

Public identifier, op_ followed by 32 hex characters. Poll GET /v1/operations/{operationId} with it.

Example:

"op_9f2c8b1e4a7d43c9b6e0f1a2c3d4e5f6"

type
string
required

What kind of work this is, for example matrix.run or draft.generate.

Example:

"matrix.run"

status
enum<string>
required

One of five values: queued, running, succeeded, failed, cancelled. There is no sixth and there are no synonyms. Stop polling once it is succeeded, failed or cancelled.

Available options:
queued,
running,
succeeded,
failed,
cancelled
Example:

"succeeded"

createdAt
string<date-time>
required

When the operation was accepted (RFC 3339).

Example:

"2026-08-19T14:32:10Z"

completedAt
string<date-time> | null

When the operation reached a terminal status (RFC 3339). Present if and only if the status is terminal.

Example:

"2026-08-19T14:32:10Z"

matterId
string | null

mat_ identifier of the matter this work belongs to, when it belongs to one.

Example:

"mat_9f2c8b1e4a7d43c9b6e0f1a2c3d4e5f6"

resource
OperationResource · object | null

What the operation produced. Absent until the underlying job row exists, which an idempotent replay can briefly observe, so treat absence as 'not yet' rather than 'never'.

error
OperationError · object | null

Why the work failed. Present only when status is failed. Partial success is succeeded with progress.done < progress.total, never an error.

progress
OperationProgress · object | null

How far along the work is, when the underlying job reports it. Absent does not mean no progress.

requestId
string | null

The X-Request-ID of the request that created this operation. Quote it in a support ticket.

Example:

"req_5f2c8b1e4a7d43c9b6e0f1a2c3d4e5f6"

Last modified on August 23, 2026