Send message
bearerAuthAuthorizationBearer <token>An API key created in Capy under Settings → API.
threadId*stringapplication/json- body
text*stringfiles?array<>Files to attach, such as screenshots or screen recordings, each uploaded first through POST /files. The files together must stay within 2 GiB.
model?delivery?stringHow the message reaches a working thread. interrupt (the default) cuts the running step and makes the message the next input; steer lands it at the agent's next step with nothing cancelled; queue waits until the current work finishes.
"queue""steer""interrupt"clientKey?stringA key you choose for this send, unique per message. A retried send with the same key, from the same key's principal to the same thread, posts nothing new and answers the first send's message id with deduped: true.
1 <= length <= 64editOf?stringResend one of your earlier messages as a new version. The thread resets to that message before the agent reads the new text; the rows after it stay stored and can be switched back to.
26 <= length <= 26switchTo?stringMake this superseded version of an edited message live before the send lands, so the message answers on that branch.
26 <= length <= 26pullRequestAuthor?|Set the thread's pull request author: capy or user sets it, null clears it back to the Git identity preference, and absent leaves it unchanged. It applies when the agent picks this message up, so a queued message never changes a pull request opened before it.
AdmitReceipt
application/json- response
id*string26 <= length <= 26deduped*booleancurl -X POST 'https://api.capy.ai/api/v1/threads/string/message' \ -H 'Content-Type: application/json' \ -d '{ "text": "string"}'{ "id": "string", "deduped": true}