API docs

crew — the team ledger

mount /crew · base https://zpe.vc/crew · v1.0.0 · 4 operations · 4 write · 0 need no account · beta

archived: committed 2026-10-27, from 594e0791. Contract: https://zpe.vc/crew/_/api/v1/openapi.json

POST /_/api/v1/pacts/{id}/accept Accept a pact's terms, as the counterparty they name. postPactsByIdAccept

Accept a pact's terms, as the counterparty they name.

Parameters

nameinrequiredtypenotes
idpathyesstringthe pact to accept, as `pact.id` spells it

Request body

None: this operation takes its arguments in the path and the query.

Responses

statusmeaningbody
200The pact as it now stands. Accepting is idempotent for a reader and not for a writer: a second acceptance is a 409, never a second minute.object
303The page's own form post: redirects back to the ledger, where the pact now reads `accepted`.object
400The request could not be readobject
401Nobody signed in. An acceptance is signed by a person, and a key names an account rather than a person.object
403The caller is not the counterparty this pact names, or holds no seat in this ledger, or is the ledger's owner — nobody accepts the terms they wrote.object
404No pact in this ledger holds that id.object
409That pact was already accepted, and a second acceptance is not a second history.object
429Too many requestsobject

Example

Accept a pact's terms, as the counterparty they name., with a token from the door.

POST /_/api/v1/pacts/{id}/accept
curl -X POST 'https://zpe.vc/crew/_/api/v1/pacts/string/accept' \
  -H 'Authorization: Bearer $ZPE_TOKEN'
200 application/json
{
  "pact": {}
}

The example is generated from the schema in the contract: the shape is the document's, the values are placeholders.

POST /_/api/v1/clients Store a client the agency pull found, or update the one already here. postClients

Store a client the agency pull found, or update the one already here.

Parameters

No parameters.

Request body

None: this operation takes its arguments in the path and the query.

Responses

statusmeaningbody
200A client the ledger already held: its name, contract reference, milestone and `synced_at` are rewritten, and `created_at` stays the minute the first sighting wrote. `conversationId` is written only when the body names it (null detaches); absent leaves the attached conversation alone.object
201A client this ledger did not hold. The agency's own id is the key, so the row a second pull sends lands on this one rather than beside it.object
400The body names no id, no name, or no contract reference — the three `clients.store()` refuses rather than fills in.object
401No key. The ingest is a machine call on the ledger's account; a browser session names a person, and a person is not a client's pull.object
403The key's account does not hold this ledger's owner seat. The agency clause licenses this material to the account that authenticated, and a key that could write into another account is the redistribution D11 refuses.object
404Nothing is hereobject
429Too many requestsobject

Example

Store a client the agency pull found, or update the one already here., with a token from the door.

POST /_/api/v1/clients
curl -X POST 'https://zpe.vc/crew/_/api/v1/clients' \
  -H 'Authorization: Bearer $ZPE_TOKEN'
200 application/json
{
  "client": {}
}

The example is generated from the schema in the contract: the shape is the document's, the values are placeholders.

POST /_/api/v1/clients/{id}/messages Remember what a client said, with the day its words stop being served. postClientsByIdMessages

Remember what a client said, with the day its words stop being served.

Parameters

nameinrequiredtypenotes
idpathyesstringthe client the words are about, as `client.id` spells it

Request body

None: this operation takes its arguments in the path and the query.

Responses

statusmeaningbody
201The body as it was written: the minute it was said, and the minute its words stop being served.object
400No client in this ledger holds that id, the body has no words, the day it names is outside `(the minute it was said, thirty days after it]`, or a body with no day of its own names no open item (`item`, `unknown-item`, `closed`) — each one the module's own refusal word.object
401No key. A body is written for the ledger's account, and a cookie names a person.object
403The key's account does not hold this ledger's owner seat, so there is no client list here for the words to hang on.object
404Nothing is hereobject
409The item the words name was confirmed by the other side, so there is no open delivery for them to live on.object
429Too many requestsobject

Example

Remember what a client said, with the day its words stop being served., with a token from the door.

POST /_/api/v1/clients/{id}/messages
curl -X POST 'https://zpe.vc/crew/_/api/v1/clients/string/messages' \
  -H 'Authorization: Bearer $ZPE_TOKEN'
201 application/json
{
  "message": {}
}

The example is generated from the schema in the contract: the shape is the document's, the values are placeholders.

POST /_/api/v1/events Push one line of the local ledger's history, under the key that makes a second push free. postEvents

Push one line of the local ledger's history, under the key that makes a second push free.

Parameters

No parameters.

Request body

None: this operation takes its arguments in the path and the query.

Responses

statusmeaningbody
200That key was already here: nothing was written, and the row keeps the fields the first push sent — a repeat key whose fields moved is still not a second line of history.object
201A line this ledger did not hold. The caller's `idempotencyKey` is the local row's own uid, so a second push of the same row lands here rather than beside it.object
400A body this ingest refuses: no `idempotencyKey`, no kind, no subject, no artifact, an `at` that is not whole epoch milliseconds, a minute before 1970, or one more than five minutes ahead of this app's clock.object
401No key. The push is a machine call on the ledger's account, and a cookie names a person rather than a collector.object
403The key's account does not hold this ledger's owner seat, so there is no history here for the push to write into.object
404Nothing is hereobject
429Too many requestsobject

Example

Push one line of the local ledger's history, under the key that makes a second push free., with a token from the door.

POST /_/api/v1/events
curl -X POST 'https://zpe.vc/crew/_/api/v1/events' \
  -H 'Authorization: Bearer $ZPE_TOKEN'
200 application/json
{
  "event": {}
}

The example is generated from the schema in the contract: the shape is the document's, the values are placeholders.