POST /v1/agent-placements/{id}/messages and reads back the Session, status and answers it is allowed to see.
Plain HTTP against the Checkfu API needs no private package.
The documented path is usable as written for an admitted Workspace.
Confirm capability status before making availability part of your application’s contract.
Installations and placements (exti_... and aplace_...)
You do not need an ExternalInstallation or AgentPlacement for standard API Sessions (POST /v1/sessions). Provision them when another system calls an installed Agent, when you enroll a ConnectedRuntime, or when you route watched-resource subscriptions:
- ExternalInstallation (
exti_...): Issue a short-lived signed pairing proof (POST /v1/external-installations/pairing-proofs) and passpairing_prooftoPOST /v1/external-installationsto link an external tenant (providerandexternal_tenant_id) to your Workspace. - AgentPlacement (
aplace_...): Bind anAgent,environment_id,external_installation_id,identity_posture(autonomousordelegated),acted_as, andharnessviaPOST /v1/agent-placements.
Authenticate the caller
The caller authenticates as its ownservice or person Principal with an api-audience Principal access credential, never with a Workspace API key. Grant that Principal invoke on the agent_placement resource with a PermissionAssignment.
invoke stops the next send.
Send a message
The response is the message’s current state:
An autonomous placement returns only this caller’s own status and answers. A delegated placement returns the Session view its observers see.
Publish an output contract
Anautonomous placement can publish the shape of its answer as a Draft-07 JSON Schema, set as output_contract on POST /v1/agent-placements or PATCH /v1/agent-placements/{agent_placement_id}:
pattern, patternProperties, format, uniqueItems, multipleOf, dependencies and recursive references are refused). A delegated placement cannot publish one.
Each Session the placement opens freezes the contract it had when the Session was admitted. After you publish, replace or remove a contract, a Session opened under the earlier one is not continued: a message with its session_id is refused, and the caller sends a new message_id without session_id, which is admitted under the current contract. Under a contract, answers is always empty and the response carries output instead:
outputisnullwhile the work runs, or when it stopsfailedorcanceled;outputis{ "event_id": "evt_...", "value": { ... } }once the work completes and the Agent’s final message is JSON that satisfies the schema;statusisfailedandoutputisnullwhen the final message is not JSON, breaks the schema, or there is none. The answer’s text is never sent to the caller.
Replay by message_id
Re-sending a message_id you already sent replays the same Session and its current result. It never accepts a second input, so retrying after a timeout or a dropped connection is safe. Re-send with wait: false to read where an earlier message stands without waiting.
Cancel your own message
POST /v1/agent-placements/{id}/messages/{message_id}/cancel cancels one message you sent to an autonomous placement, named by your own message_id, and nothing else. It needs the same credential and invoke grant as sending, and no request body:
A cancel never interrupts the whole Session or another caller’s work. A message whose turn also holds other input, or waits on something no exact cancel can stop, answers
409 runtime.invalid_transition and nothing changes. Another caller’s message_id answers 404 exactly like one never sent, and so does any message at a delegated placement. Cancelling again answers the same state, and re-sending a cancelled message_id replays it as canceled with no answers.
Refusals
Refusals use the standard error envelope:From the TypeScript SDK
createPlacementCaller from @checkfu/sdk sends the same request with the Principal credential. It never uses an API key:
placement.cancelOwn("partner-message-1") cancels that message and returns the cancellation above. A refusal raises PlacementCallRefused with the HTTP status and the error type.
To permanently delete a Session a placement message opened, call DELETE /v1/sessions/{id} with a Workspace API key: