The parity principle
One verb set, two hands. Every button in the app is an endpoint here, and every endpoint here is
a button somewhere in the app.
- If a verb has no button anywhere in the UI, it is not public. There are no integration-only conveniences: no bulk-decide, no “auto-accept anything above 0.9 confidence”, no filter DSL for search. An API-only verb is a second product with the same logo on it.
- If a button exists and the API cannot do it, parity is broken and an endpoint is missing. That is a bug report, not a feature request.
Parity binds the verbs that act (refined 2026-08-24). Anything that stages, changes state, moves
a word, sends or signs must exist on both surfaces, or one of them is broken.A reading is not an acting verb. When the in-app agent explains a clause, summarizes a letter, or
scans for risk, it is composing prose over public reads it already holds:
GET /contracts/{id},
GET /contracts/{id}/state, GET /contracts/{id}/letters/{id}. There is no POST /contracts/{id}/explain,
and its absence is not a gap: freezing one phrasing of an explanation into an API contract would give
the product a second place to disagree with itself. You get equal access to the data, not equal
access to the sentences. Every reading the agent performs, you can compose from the same reads.POST /contracts/{id}/decisions
writes to the same private reply draft the Accept button writes to. POST /ask is the same call the
in-app agent makes. The integration and the person are two hands on one store.
Three laws the API inherits from the product
1
The contract is the atom
There is no create-a-container call. No envelope, no recipients list to configure, no routing order.
You draft a contract and a person sends it. A room is a derived relationship record, born on that
first Send.
POST /contracts then POST /contracts/{id}/send is the whole origination story.2
Words move on unanimity, never on Send
No caller can write clause text. Not a human, not a key, not an agent. The API stages decisions
and commits letters; it never applies a diff. You propose; the words change when every
required negotiator has accepted, and not before.
PUT /contracts/{id}/blocks/{id} does not exist and will not.3
No key sends or signs on its own authority
Send and sign carry a human-confirmation requirement. An API key is an agent with better latency,
and the standing lock applies to both.
The never-sends 409
Send-class calls do not fail open and they do not fail soft. Omitconfirmed_by on a send, a reply, or
a signature and you get one status code back:
409 confirmation_required
send and sign are grantable scopes, and a key holding both still gets the 409
without confirmed_by.
Guests act through signed links
A guest is a person with no org: the counterparty’s freelancer, the founder on the other side of the table. Guests are first-class negotiators and signers, and they never hold keys. A guest acts through the signed link they were sent, and they act in both directions. Reading uses the link, so the address somebody was emailed just works:Contracts-Acting-Person
and no confirmed_by. The token already supplies both. See
Guests.
There is no guest key issuance endpoint, and there will not be one. That would be an ACL for a person
who must never see one. Guests also never get MCP, for the same reason.
What you can do
The public surface is everything a negotiator or a signer can do to a contract, plus the reads that make a contract legible to somebody who was not in the room.What is not here
Stated plainly so you do not go looking:No envelope API
No create envelope → add recipients → set routing order → send. Capacity does that work.
No rooms-first API
No
POST /rooms, no membership call, no name you set. Relationships are derived.No direct text writes
Words move on unanimity or they do not move.
No live collaboration
No presence, cursors, or realtime document stream. Webhooks and polling are the whole story.
Start here
Quickstart
Draft, send, run a reply cycle, and sign. All as curl.
Core concepts
Contracts, letters, asks, facts, capacity, receipts.
Authentication
Org keys, per-person tokens, acting persons, scopes.
MCP
The same verbs for an outside agent, one seat down.
Status: draft. This documentation is written against the API design drafts, ahead of the
endpoints existing. Shapes here are the contract we intend to ship; see the
Changelog for what is stable and what is still moving.