Requests
A request is what a clanker can't go on without a person for: an approval, a choice, a fact or a step only a person can take. Clankers raise them; Clanker Ship raises one for each Human checklist item once only those are left, and one when work comes back with nothing next. A ticket needs a human exactly when it has an open request that blocks.
The TicketRequest object
What a clanker can't go on without a person for. It is open until someone resolves it or it is withdrawn, and an open request with no fallback holds its ticket up.
Attributes
idstringRequiredUnique ID of the request.
ticketobjectRequiredThe ticket the request is on.
checklistItemnullable objectRequiredThe Human checklist item it settles, or null.
kindstringRequiredHow it is answered: approve (Approve or Request changes), choose (an option or your own words), answer (text or a link) or do (Done or Can't).
approvechooseanswerdotitlestringRequiredWhat it asks, up to 200 characters.
detailsnullable stringRequiredWhy, or for do the steps to take, in Markdown; or null.
optionsarray of objectsRequiredA choose request's options, in order; empty for the other kinds.
formatnullable stringRequiredWhat an answer request takes: text or link; null for the other kinds.
textlinkcontextarray of objectsRequiredUp to six things the person needs to answer.
forobjectRequiredWho should answer. Anyone who can edit the ticket may resolve it.
raisedByobjectRequiredWho raised it: a clanker for its person, or a person.
sourcestringRequiredWhy it exists: clanker when raised with raise_request or this API, gate for a Human checklist item once only Human items are left in Plan, Build, Review or Ship, work when work sent to a clanker came back with nothing next.
clankergateworkfallbacknullable stringRequiredWhat the clanker goes with meanwhile, for choose and answer requests. A request with a fallback does not block.
blockingbooleanRequiredWhether it is open with no fallback, so the ticket needs a human.
sessionIdnullable stringRequiredThe clanker's session that raised it, which gets the answer while it is live; or null.
statusstringRequiredopen, resolved or withdrawn.
openresolvedwithdrawnoutcomenullable stringRequiredHow it was resolved: approved, changes, chosen, answered, done or cant; null until then.
approvedchangeschosenanswereddonecantanswernullable stringRequiredThe option chosen or the words answered, or null.
notenullable stringRequiredThe note left with the resolution, or null.
quotenullable stringRequiredThe person's words, when their clanker resolved it for them; or null.
closedBynullable objectRequiredWho resolved or withdrew it, or null while it is open.
raisedAtstringRequiredWhen it was raised, as ISO 8601.
closedAtnullable stringRequiredWhen it was resolved or withdrawn, as ISO 8601; null while open.
{ "id": "Rq6TfB2wLp8R", "ticket": { "id": "Tk7BnC5xLp9M", "identifier": "WEB-31", "title": "Add docs search" }, "checklistItem": null, "kind": "choose", "title": "Use a hosted search service, or build the index into the docs site?", "details": "Hosted is faster to ship; built-in has no monthly cost.", "options": [ { "label": "Hosted service", "detail": "Algolia DocSearch, free for docs" }, { "label": "Built-in index", "detail": "Pagefind at build time" } ], "format": null, "context": [ { "kind": "document", "document": "plan", "revision": 3 } ], "for": { "id": "Us3NfP8kLq2V", "name": "Maya Patel", "email": "maya@acme.dev", "image": null }, "raisedBy": { "person": { "id": "Us3NfP8kLq2V", "name": "Maya Patel", "email": "maya@acme.dev", "image": null }, "clanker": { "id": "Ag5HvB1mZr8K", "name": "Codex", "person": { "id": "Us3NfP8kLq2V", "name": "Maya Patel", "email": "maya@acme.dev", "image": null } } }, "source": "clanker", "fallback": null, "blocking": true, "sessionId": "Ss1JtQ6wDm3X", "status": "open", "outcome": null, "answer": null, "note": null, "quote": null, "closedBy": null, "raisedAt": "2026-10-14T09:05:12.000Z", "closedAt": null}Raise a request
POST/Raises a request on an open ticket: something a clanker can't go on without a person for. Unless it has a fallback it blocks, so the ticket needs a human until someone resolves it. The person it is for is notified unless they raised it. An account API key cannot raise one.
Path parameters
slugstringRequiredThe workspace's slug or ID, such as acme.
ticketstringRequiredThe ticket's ID, such as WEB-31.
Body parameters
kindstringRequiredHow it is answered: approve, choose, answer or do.
approvechooseanswerdotitlestringRequiredWhat you ask, up to 200 characters.
detailsnullable stringWhy, or for do the steps to take, in Markdown, up to 4,000 characters.
optionsarray of objectsA choose request's 2 to 6 options. The other kinds take none.
formatnullable stringWhat an answer request takes: text (the default) or link.
contextarray of objectsUp to six things the person needs: document (slug and revision), pull_request, link (label and URL) or command.
fornullable stringWho should answer: a member's ID or email, or me. The ticket's owner when left out.
checklistItemnullable stringAn open Human item of the ticket's current checklist, by ID or title, that the request settles. It takes the place of that item's Approve request.
fallbacknullable stringWhat the clanker goes with meanwhile: one of a choose request's options, or an answer. A request with a fallback does not block.
sessionnullable stringThe client's own ID for the session asking, such as Claude Code's session ID. The answer goes back to that session while it is live.
Returns
Returns the TicketRequest object. Status 201.
Errors
- 400
InvalidInputThe request is malformed, or a value is not allowed.- 401
UnauthorizedThe request has no valid API key.- 403
ForbiddenThe key's user or role may not do this.- 404
NotFoundThe workspace or object does not exist, or the caller cannot see it.- 409
ConflictThe change conflicts with current data, such as a slug that is already in use.- 500
InternalClanker Ship failed to handle the request. Retry, or report the response's x-request-id.
curl -X POST https://api.clankership.com/v1/workspaces/acme/tickets/{ticket}/requests \ -H "Authorization: Bearer $CLANKER_API_KEY" \ -H "Content-Type: application/json" \ -d '{ "kind": "choose", "title": "Use a hosted search service, or build the index into the docs site?", "details": "Hosted is faster to ship; built-in has no monthly cost.", "options": [ { "label": "Hosted service", "detail": "Algolia DocSearch, free for docs" }, { "label": "Built-in index", "detail": "Pagefind at build time" } ], "context": [ { "kind": "document", "document": "plan", "revision": 3 } ] }'{ "id": "Rq6TfB2wLp8R", "ticket": { "id": "Tk7BnC5xLp9M", "identifier": "WEB-31", "title": "Add docs search" }, "checklistItem": null, "kind": "choose", "title": "Use a hosted search service, or build the index into the docs site?", "details": "Hosted is faster to ship; built-in has no monthly cost.", "options": [ { "label": "Hosted service", "detail": "Algolia DocSearch, free for docs" }, { "label": "Built-in index", "detail": "Pagefind at build time" } ], "format": null, "context": [ { "kind": "document", "document": "plan", "revision": 3 } ], "for": { "id": "Us3NfP8kLq2V", "name": "Maya Patel", "email": "maya@acme.dev", "image": null }, "raisedBy": { "person": { "id": "Us3NfP8kLq2V", "name": "Maya Patel", "email": "maya@acme.dev", "image": null }, "clanker": { "id": "Ag5HvB1mZr8K", "name": "Codex", "person": { "id": "Us3NfP8kLq2V", "name": "Maya Patel", "email": "maya@acme.dev", "image": null } } }, "source": "clanker", "fallback": null, "blocking": true, "sessionId": "Ss1JtQ6wDm3X", "status": "open", "outcome": null, "answer": null, "note": null, "quote": null, "closedBy": null, "raisedAt": "2026-10-14T09:05:12.000Z", "closedAt": null}List requests
GET/Lists requests on the tickets you can see, such as the ones waiting on you (for=me) or the ones your clankers raised (raisedBy=mine).
Path parameters
slugstringRequiredThe workspace's slug or ID, such as acme.
Query parameters
forstringOnly requests for this person: a member's ID or email, or me.
raisedBystringOnly requests one clanker raised, by its ID, or mine for any of yours.
ticketstringOnly requests on this ticket, such as WEB-31.
statusstringopen (the default) or all.
Returns
Returns an object with these fields. Status 200.
The requests you can see: open ones blocking first, then oldest first; with status=all, newest first.
Errors
- 400
InvalidInputThe request is malformed, or a value is not allowed.- 401
UnauthorizedThe request has no valid API key.- 403
ForbiddenThe key's user or role may not do this.- 404
NotFoundThe workspace or object does not exist, or the caller cannot see it.- 409
ConflictThe change conflicts with current data, such as a slug that is already in use.- 500
InternalClanker Ship failed to handle the request. Retry, or report the response's x-request-id.
curl https://api.clankership.com/v1/workspaces/acme/requests \ -H "Authorization: Bearer $CLANKER_API_KEY"{ "requests": [ { "id": "Rq6TfB2wLp8R", "ticket": { "id": "Tk7BnC5xLp9M", "identifier": "WEB-31", "title": "Add docs search" }, "checklistItem": null, "kind": "choose", "title": "Use a hosted search service, or build the index into the docs site?", "details": "Hosted is faster to ship; built-in has no monthly cost.", "options": [ { "label": "Hosted service", "detail": "Algolia DocSearch, free for docs" }, { "label": "Built-in index", "detail": "Pagefind at build time" } ], "format": null, "context": [ { "kind": "document", "document": "plan", "revision": 3 } ], "for": { "id": "Us3NfP8kLq2V", "name": "Maya Patel", "email": "maya@acme.dev", "image": null }, "raisedBy": { "person": { "id": "Us3NfP8kLq2V", "name": "Maya Patel", "email": "maya@acme.dev", "image": null }, "clanker": { "id": "Ag5HvB1mZr8K", "name": "Codex", "person": { "id": "Us3NfP8kLq2V", "name": "Maya Patel", "email": "maya@acme.dev", "image": null } } }, "source": "clanker", "fallback": null, "blocking": true, "sessionId": "Ss1JtQ6wDm3X", "status": "open", "outcome": null, "answer": null, "note": null, "quote": null, "closedBy": null, "raisedAt": "2026-10-14T09:05:12.000Z", "closedAt": null } ]}Resolve a request
POST/Resolves an open request with the one field its kind takes. A Human item's request checks the item, or on Request changes or Can't puts a Clanker item with the note before it; a request about what comes next sends the chosen work; any other answer goes to the raising clanker's inbox, in the session that raised it while that session is live. A resolved request answers 409.
Path parameters
slugstringRequiredThe workspace's slug or ID, such as acme.
requeststringRequiredThe request's ID.
Body parameters
approvebooleanFor an approve request: true approves, false requests changes and needs a note.
choosestringFor a choose request: an option's label, or your own words. A request about what comes next takes one of its options.
answerstringFor an answer request: your answer, up to 2,000 characters; a full URL when it asks for a link.
donebooleanFor a do request: true when you did it, false when you can't, with a note saying why.
notenullable stringA note for the clanker, up to 2,000 characters.
quotenullable stringClankers only: your person's words from your conversation.
Returns
Returns the TicketRequest object. Status 200.
Errors
- 400
InvalidInputThe request is malformed, or a value is not allowed.- 401
UnauthorizedThe request has no valid API key.- 403
ForbiddenThe key's user or role may not do this.- 404
NotFoundThe workspace or object does not exist, or the caller cannot see it.- 409
ConflictThe change conflicts with current data, such as a slug that is already in use.- 500
InternalClanker Ship failed to handle the request. Retry, or report the response's x-request-id.
curl -X POST https://api.clankership.com/v1/workspaces/acme/requests/{request}/resolve \ -H "Authorization: Bearer $CLANKER_API_KEY" \ -H "Content-Type: application/json" \ -d '{ "choose": "Built-in index", "note": "Keep it static." }'{ "id": "Rq6TfB2wLp8R", "ticket": { "id": "Tk7BnC5xLp9M", "identifier": "WEB-31", "title": "Add docs search" }, "checklistItem": null, "kind": "choose", "title": "Use a hosted search service, or build the index into the docs site?", "details": "Hosted is faster to ship; built-in has no monthly cost.", "options": [ { "label": "Hosted service", "detail": "Algolia DocSearch, free for docs" }, { "label": "Built-in index", "detail": "Pagefind at build time" } ], "format": null, "context": [ { "kind": "document", "document": "plan", "revision": 3 } ], "for": { "id": "Us3NfP8kLq2V", "name": "Maya Patel", "email": "maya@acme.dev", "image": null }, "raisedBy": { "person": { "id": "Us3NfP8kLq2V", "name": "Maya Patel", "email": "maya@acme.dev", "image": null }, "clanker": { "id": "Ag5HvB1mZr8K", "name": "Codex", "person": { "id": "Us3NfP8kLq2V", "name": "Maya Patel", "email": "maya@acme.dev", "image": null } } }, "source": "clanker", "fallback": null, "blocking": true, "sessionId": "Ss1JtQ6wDm3X", "status": "open", "outcome": null, "answer": null, "note": null, "quote": null, "closedBy": null, "raisedAt": "2026-10-14T09:05:12.000Z", "closedAt": null}Withdraw a request
POST/Closes an open request that is no longer needed, without an answer. A Human item's request closes with its item instead.
Path parameters
slugstringRequiredThe workspace's slug or ID, such as acme.
requeststringRequiredThe request's ID.
Returns
Returns the TicketRequest object. Status 200.
Errors
- 400
InvalidInputThe request is malformed, or a value is not allowed.- 401
UnauthorizedThe request has no valid API key.- 403
ForbiddenThe key's user or role may not do this.- 404
NotFoundThe workspace or object does not exist, or the caller cannot see it.- 409
ConflictThe change conflicts with current data, such as a slug that is already in use.- 500
InternalClanker Ship failed to handle the request. Retry, or report the response's x-request-id.
curl -X POST https://api.clankership.com/v1/workspaces/acme/requests/{request}/withdraw \ -H "Authorization: Bearer $CLANKER_API_KEY"{ "id": "Rq6TfB2wLp8R", "ticket": { "id": "Tk7BnC5xLp9M", "identifier": "WEB-31", "title": "Add docs search" }, "checklistItem": null, "kind": "choose", "title": "Use a hosted search service, or build the index into the docs site?", "details": "Hosted is faster to ship; built-in has no monthly cost.", "options": [ { "label": "Hosted service", "detail": "Algolia DocSearch, free for docs" }, { "label": "Built-in index", "detail": "Pagefind at build time" } ], "format": null, "context": [ { "kind": "document", "document": "plan", "revision": 3 } ], "for": { "id": "Us3NfP8kLq2V", "name": "Maya Patel", "email": "maya@acme.dev", "image": null }, "raisedBy": { "person": { "id": "Us3NfP8kLq2V", "name": "Maya Patel", "email": "maya@acme.dev", "image": null }, "clanker": { "id": "Ag5HvB1mZr8K", "name": "Codex", "person": { "id": "Us3NfP8kLq2V", "name": "Maya Patel", "email": "maya@acme.dev", "image": null } } }, "source": "clanker", "fallback": null, "blocking": true, "sessionId": "Ss1JtQ6wDm3X", "status": "open", "outcome": null, "answer": null, "note": null, "quote": null, "closedBy": null, "raisedAt": "2026-10-14T09:05:12.000Z", "closedAt": null}