Contract creation, participant routing, lifecycle, and evidence APIs.
GET/contractsRequires authentication
List/search readable contracts
Lists contracts by applying requested filters and then intersecting every result with the
current actor's read authorization. Filters such as organization, counterparty, status,
participant action, and date range never bypass access control.
Default scope is `readable`.
Scopes:
- `owned`: contracts controlled by the current actor/context
- `organization`: contracts controlled by the current acting organization
- `shared_with_me`: contracts where the actor has an active viewer access grant
- `readable`: all contracts the actor can read via controller, organization membership, signer grant, or viewer grant
Platform read access is grant-based. `action="view"` creates read-only platform access;
`action="receive_copy"` does not create platform access and does not appear in readable/shared results
unless another access grant exists.
Examples:
- `GET /contracts?scope=readable&status=completed&dateField=completedAt&from=2026-05-01T00:00:00Z&to=2026-05-31T23:59:59Z`
- `GET /contracts?scope=shared_with_me`
- `GET /contracts?scope=readable&counterpartyOrganizationId=org_123`
Parameters
| Name | In | Type | Required |
|---|
| scope | query | string | No |
|---|
| status | query | string | No |
|---|
| dateField | query | string | No |
|---|
| from | query | string | No |
|---|
| to | query | string | No |
|---|
| organizationId | query | string | No |
|---|
| counterpartyOrganizationId | query | string | No |
|---|
| participantAction | query | string | No |
|---|
| accessRole | query | string | No |
|---|
| q | query | string | No |
|---|
| limit | query | integer | No |
|---|
| cursor | query | string | No |
|---|
Responses
200Contract listdefaultStandardized API error
POST/contractsRequires authentication
Recommended simple happy path - schema-driven create contract with optional participants/role assignment/send
Primary external integrator endpoint for the common flow.
Document this operation in two conceptual modes:
- Create Draft Contract (`sendNow` omitted or `false`)
- Create and Send Contract (`sendNow=true`)
In one request, this endpoint can:
- create a contract from a template
- accept structured `data` generated from template `inputSchema` (recommended)
- apply direct `fieldValues` and optional `tableData` (alternate advanced mode)
- create participants
- auto-assign signer roles using `participants[].templateRoleId`
- send immediately when `sendNow=true`
Structured data mapping:
- request `data` accepts section-based objects from `GET /templates/{id}/published-version` `inputSchema`
- field `key` is the canonical submission key inside each section object
- server maps `data` internally to contract `fieldValues` and `tableData`
- direct `fieldValues` and `tableData` payloads are supported as an alternate advanced mode
- in Dynamic Tables V2, `fieldValues` is for non-table fields and table cell values must be provided in `tableData`
Role assignment behavior with `participants[].templateRoleId`:
- role identity and signature placement are inherited from the template version
- participant assignment is set by the provided participant object
- `routingOrder` and `providerConfigRef` can be overridden per participant
- mismatch cases (unknown role id, invalid routing config, duplicate/invalid bindings) fail with role-binding errors
- when `sendNow=true` and explicit `roleBindings` are not supplied, signer participants must provide `templateRoleId`; otherwise the request fails with `CONTRACT_ROLE_BINDING_INVALID`
- using `participants[].templateRoleId`, explicit `roleBindings`, `signingSettings`, or `sendNow=true` requires `contracts:send` permission in addition to `contracts:create`
Signing execution behavior:
- `executionChannel` is valid only when `action="sign"`
- `action="sign"` requires `executionChannel`
- `action="view"` and `action="receive_copy"` must not include `executionChannel`
- person signers (`recipientType="individual"`) may use `platform_hosted` or `integrator_managed`
- organization signers (`recipientType="organization"`) must use `provider_managed`
`organizationSigningMode` is not writable by this endpoint.
It is snapshotted from template version settings during contract creation and defaults to `automatic` when template settings omit it.
Request body
titlestringrequiredtemplateIdstringrequiredtemplateVersionIdstringdataobjectSchema-driven structured payload aligned with `inputSchema` from
`GET /templates/{id}/published-version`.
Submit values using each field's canonical `key`.
Primary recommended submission mode.
Server maps this to contract `fieldValues` and schema-based `tableData`.fieldValuesarrayAlternate direct mode for non-table fields.
Dynamic table cells must be provided in `tableData`.tableDataobjectSchema-based dynamic table rows keyed by `tableKey`.
Each row must be an object keyed by the dynamic table column keys.participantsarrayroleBindingsarraysigningSettingsobjectsendNowbooleanWhen true, the server prepares the draft contract and sends it in the same request.
This is the primary simple integrator path and requires send-level permissions.notificationsobjectOptional per-event email notification override for this contract.
Merged into the contract's snapshotted settings on top of
platform/organization/template defaults. Omit an event or a setting
to inherit the broader default ("inherit" = key absent); set
`enabled: false` to explicitly disable an event. Invalid settings
(unknown event key or a setting not supported by the event) fail the
request before any send with `400` `INVALID_NOTIFICATION_SETTINGS`.
Responses
201Contract createddefaultStandardized API error
GET/contracts/{id}Requires authentication
Get contract details (includes snapshotted organization signing mode)
Returns contract metadata including `organizationSigningMode`.
The mode is snapshotted from the selected template version at contract creation time and defaults to `automatic` if missing in template settings.
Parameters
| Name | In | Type | Required |
|---|
| id | path | string | Yes |
|---|
Responses
200Contract detailsdefaultStandardized API error
PUT/contracts/{id}/dataRequires authentication
Update contract field values and optional table data (advanced)
Parameters
| Name | In | Type | Required |
|---|
| id | path | string | Yes |
|---|
Request body
fieldValuesarrayrequiredtableDataobject
Responses
200Contract updateddefaultStandardized API error
GET/contracts/{id}/documents/artifact-revisionsRequires authentication
List signed artifact revisions (advanced)
Parameters
| Name | In | Type | Required |
|---|
| id | path | string | Yes |
|---|
Responses
200Artifact revisionsdefaultStandardized API error
GET/contracts/{id}/documents/artifact-revisions/{revision}/downloadRequires authentication
Download artifact revision bytes (advanced)
Parameters
| Name | In | Type | Required |
|---|
| id | path | string | Yes |
|---|
| revision | path | integer | Yes |
|---|
| download | query | boolean | No |
|---|
Responses
200Artifact bytesdefaultStandardized API error
GET/contracts/{id}/documents/rendered-unsignedRequires authentication
Download rendered unsigned PDF
Parameters
| Name | In | Type | Required |
|---|
| id | path | string | Yes |
|---|
| download | query | boolean | No |
|---|
Responses
200PDF bytesdefaultStandardized API error
GET/contracts/{id}/documents/signed-latestRequires authentication
Download signed-latest document
Returns the stored signed PDF when `signedPdfKey` is present on the contract.
If no stored signed PDF exists, the endpoint falls back to the current rendered contract version PDF.
If neither source is available, returns `404 CONTRACT_SIGNED_DOCUMENT_NOT_AVAILABLE`.
Integrators that require a strictly signed artifact should call `/contracts/{id}/documents/signed-only`.
Parameters
| Name | In | Type | Required |
|---|
| id | path | string | Yes |
|---|
| download | query | boolean | No |
|---|
Responses
200PDF bytesdefaultStandardized API error
GET/contracts/{id}/documents/signed-onlyRequires authentication
Download signed PDF only (strict)
Returns only the stored signed artifact for the contract.
If no signed artifact exists, returns `404 CONTRACT_SIGNED_DOCUMENT_NOT_AVAILABLE`.
Parameters
| Name | In | Type | Required |
|---|
| id | path | string | Yes |
|---|
| download | query | boolean | No |
|---|
Responses
200Signed PDF bytesdefaultStandardized API error
GET/contracts/{id}/evidence/audit-trailRequires authentication
Get contract audit trail (advanced)
Parameters
| Name | In | Type | Required |
|---|
| id | path | string | Yes |
|---|
Responses
200Audit traildefaultStandardized API error
GET/contracts/{id}/evidence/bundleRequires authentication
Build and fetch evidence bundle payload (advanced)
Parameters
| Name | In | Type | Required |
|---|
| id | path | string | Yes |
|---|
Responses
200Evidence bundledefaultStandardized API error
POST/contracts/{id}/evidence/bundleRequires authentication
Persist evidence bundle as artifact revision (advanced)
Parameters
| Name | In | Type | Required |
|---|
| id | path | string | Yes |
|---|
Responses
201Artifact revision createddefaultStandardized API error
GET/contracts/{id}/evidence/verificationRequires authentication
Get contract verification report (advanced)
Parameters
| Name | In | Type | Required |
|---|
| id | path | string | Yes |
|---|
Responses
200Verification reportdefaultStandardized API error
PUT/contracts/{id}/participantsRequires authentication
Replace participants for a contract (advanced)
Parameters
| Name | In | Type | Required |
|---|
| id | path | string | Yes |
|---|
Request body
participantsarrayrequired
Responses
200Participants replaceddefaultStandardized API error
PUT/contracts/{id}/role-bindingsRequires authentication
Set role bindings and signing settings (advanced)
Parameters
| Name | In | Type | Required |
|---|
| id | path | string | Yes |
|---|
Request body
roleBindingsarrayrequiredsigningSettingsobject
Responses
200Role bindings updateddefaultStandardized API error
POST/contracts/{id}/sendRequires authentication
Send contract for signing (advanced; prepares drafts automatically)
Parameters
| Name | In | Type | Required |
|---|
| id | path | string | Yes |
|---|
Request body
roleBindingsarraysigningSettingsobjectnotificationsobjectOptional per-event email notification override applied to this send.
Same semantics as on contract creation. Invalid settings fail with
`400` `INVALID_NOTIFICATION_SETTINGS` before the contract is sent.
Responses
200Contract sentdefaultStandardized API error
GET/contracts/{id}/statusRequires authentication
Primary contract status endpoint (includes lifecycle + signing participant summary)
Preferred polling fallback endpoint when webhook delivery is unavailable.
Returns contract status, lifecycle summary, participant-level signing summary, and snapshotted `organizationSigningMode`.
The mode is template-version-driven and defaults to `automatic` when not explicitly configured on the template version.
Parameters
| Name | In | Type | Required |
|---|
| id | path | string | Yes |
|---|
Responses
200Contract statusdefaultStandardized API error
PUT/contracts/{id}/table-dataRequires authentication
Update schema-based dynamic table rows only (advanced)
Parameters
| Name | In | Type | Required |
|---|
| id | path | string | Yes |
|---|
Responses
200Table data updateddefaultStandardized API error