API reference
6 operations in sign_offs. Raw spec: openapi.json.
POST
/api/v1/org/sign-off-consentsPOST /api/org/sign-off-consents — append the next consent version. The version comes from the current max; existing sign-offs keep their own snapshot, so revising the wording never rewrites a past agreement.
Request body
CreateConsentRequest
Responses
| Status | Description |
|---|---|
200 | |
401 | missing or invalid credentials |
403 | not permitted on this board |
404 | ticket or sign-off not found |
409 | already captured, revoked, or a version collision |
422 | validation failed |
Security: bearer
GET
/api/v1/org/sign-off-consents/currentGET /api/org/sign-off-consents/current — the wording a pad must show. The pad fetches this before capture so the version it sends back is the one the signer actually read.
Responses
| Status | Description |
|---|---|
200 | |
401 | missing or invalid credentials |
403 | not permitted |
Security: bearer
GET
/api/v1/sign-offs/{id}/payloadGET /api/sign-offs/{id}/payload — streams the mark's bytes. Staff-only and audit-free by intent: reading evidence is not the same act as capturing it, and the row's own trail is the record of decisions.
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
id | path | string | Yes |
Responses
| Status | Description |
|---|---|
200 | the captured PNG bytes |
401 | missing or invalid credentials |
403 | not permitted on this board |
404 | sign-off not found |
Security: bearer
GET
/api/v1/tickets/{id}/sign-offsGET /api/tickets/{id}/sign-offs — the ticket's sign-offs with payload facts, revocation state and the correction relation. Renders a timeline row without ever moving the mark's bytes.
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
id | path | string | Yes |
Responses
| Status | Description |
|---|---|
200 | |
401 | missing or invalid credentials |
403 | not permitted on this board |
404 | ticket not found |
Security: bearer
POST
/api/v1/tickets/{id}/sign-offsPOST /api/tickets/{id}/sign-offs — capture one signature.
The whole capture lands in one transaction: the payload row in the content-addressed store, the evidence row, `sign_off.created`, and the audit entry. The body's `idempotency_key` is the anchor the offline queue replays on, so a retried queue op is a no-op rather than a second signature.
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
id | path | string | Yes |
Request body
CreateSignOffRequest
Responses
| Status | Description |
|---|---|
200 | |
401 | missing or invalid credentials |
403 | not permitted on this board |
404 | ticket or sign-off not found |
409 | already captured, revoked, or a version collision |
422 | validation failed |
Security: bearer
POST
/api/v1/tickets/{id}/sign-offs/{sign_off_id}/revokePOST /api/tickets/{id}/sign-offs/{sign_off_id}/revoke
Appends one entry to the sign-off's revocation trail. The row and its bytes are untouched — this is why a revoked signature reads as revoked rather than as gone, which is the whole point of keeping evidence.
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
id | path | string | Yes | |
sign_off_id | path | string | Yes |
Request body
RevokeSignOffRequest
Responses
| Status | Description |
|---|---|
200 | |
401 | missing or invalid credentials |
403 | not permitted on this board |
404 | ticket or sign-off not found |
409 | already captured, revoked, or a version collision |
422 | validation failed |
Security: bearer