Skip to main content
An AgentPlacement is a service entry: one installed Agent that another system calls as a Principal of your Workspace. The caller sends text messages to 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:
  1. ExternalInstallation (exti_...): Issue a short-lived signed pairing proof (POST /v1/external-installations/pairing-proofs) and pass pairing_proof to POST /v1/external-installations to link an external tenant (provider and external_tenant_id) to your Workspace.
  2. AgentPlacement (aplace_...): Bind an Agent, environment_id, external_installation_id, identity_posture (autonomous or delegated), acted_as, and harness via POST /v1/agent-placements.

Authenticate the caller

The caller authenticates as its own service 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.
Every send re-checks the active placement, the credential, and the caller’s live PermissionAssignments. Revoking 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

An autonomous 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}:
The schema follows the same bounded policy as Automation JSON output (at most 8 KiB; 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:
  • output is null while the work runs, or when it stops failed or canceled;
  • output is { "event_id": "evt_...", "value": { ... } } once the work completes and the Agent’s final message is JSON that satisfies the schema;
  • status is failed and output is null when 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:
Use service entries for calls from outside your Workspace. To coordinate multiple Checkfu Agents inside the same Workspace, compose them in an Automation.