The API is in every plan.

A key does what a person at the keyboard can do, and it is covered by the plan your team is already on. There is no per-call charge and no separate price for building against it.

Decisions worth knowing before you start

There is no sign endpoint

A signature is only ever applied inside a session the party authenticated into. You can mint that session through the API; you cannot apply a signature with an API key.

Cursor pagination

Agreements, templates, the audit trail and the usage ledger page with an opaque cursor rather than an offset. If rows are added or removed while you are paging through, you still will not miss one or see one twice.

Real JSON types

Booleans are booleans and numbers are numbers. Nothing arrives as the string "true".

One error shape

A code, a message, the request id, a link to the explanation, and whether retrying unchanged is worth your time.

You choose the ids

Documents and people carry ids you assign, unique within the agreement, so a whole agreement is one request with no round trip to learn ours.

Explicit transitions

Sending is a call to send. Writing a status field never triggers anything.

Every route, all 26 of them

Agreements

  • GET/v1/agreementsList agreements
  • POST/v1/agreementsCreate an agreement
  • GET/v1/agreements/{id}Read an agreement
  • POST/v1/agreements/{id}/correctCorrect an agreement in flight
  • GET/v1/agreements/{id}/documentsList documents
  • GET/v1/agreements/{id}/documents/{documentId}Download a document
  • GET/v1/agreements/{id}/fieldsRead field values
  • GET/v1/agreements/{id}/partiesList parties
  • POST/v1/agreements/{id}/resendResend to outstanding parties
  • POST/v1/agreements/{id}/sendSend an agreement
  • POST/v1/agreements/{id}/voidVoid an agreement

Templates

  • GET/v1/templatesList templates
  • POST/v1/templatesCreate a template
  • GET/v1/templates/{id}Read a template
  • DELETE/v1/templates/{id}Delete a template

Evidence

  • GET/v1/agreements/{id}/audit-eventsRead the audit trail
  • GET/v1/agreements/{id}/certificateRead the Signing Certificate

Signing

  • POST/v1/agreements/{id}/signing-sessionsMint a signing session

Webhooks

  • GET/v1/webhooksList webhook endpoints
  • POST/v1/webhooksCreate a webhook endpoint
  • PUT/v1/webhooks/{id}Update a webhook endpoint
  • DELETE/v1/webhooks/{id}Delete a webhook endpoint
  • GET/v1/webhooks/deliveriesRead the delivery log
  • POST/v1/webhooks/deliveries/{id}/replayReplay a delivery

Account

  • GET/v1/capabilitiesRead the capability object
  • GET/v1/usageRead the usage ledger

This list is read from the OpenAPI document rather than written out again here, so the page and the document always say the same thing. The field types, statuses, event names and error codes in it are read from the modules the server itself imports, so those sets are the ones the code has.

Webhooks

Deliveries are signed over the timestamp and the body together, so a captured request cannot be replayed at you later. Failures back off, an endpoint that keeps failing is suspended rather than retried forever, and every attempt stays in the delivery log with the status code and the response body your endpoint returned, so you can fix your receiver and replay a delivery by its id.

The API