Skip to main content

Overview

Use this path if you’re not on Node.js, or if you need to send data the SDK doesn’t capture. The ingest endpoint accepts conversations and agent definitions in one of five formats.

Endpoint

Authentication

Pass your agent’s API key as a Bearer token.
Keys are prefixed with cl_ and managed from your agent’s Settings page in the dashboard.

Request format

The top-level request body:

Required

At least one of conversations or agentDefinitions must be present. Empty payloads are rejected.

Optional

string (UUID)
Pin the request to a specific agent. Validated against the API key. If omitted, the key’s default agent is used.
enum
Only set this when forwarding provider request/response bodies untouched. One of anthropic, openai_chat, openai_responses. Omit to use the default shape shown in the examples. See Format selector below.
array
Array of conversation objects. Max 1,000 per request.
array
Array of agent definition objects. Max 100 per request.

Conversation object

Required

array
required
Array of message objects. Min 1, max 10,000.

Optional

string
Your stable id for this conversation. 1-255 characters. Used to link conversations across ingest calls (for multi-turn sessions) and to deduplicate.
string
Grouping id for related conversations. Max 255 characters.
string (UUID)
Link this conversation to a specific agent definition version. Used when analyzing against a known spec.
object
Arbitrary key-value data. Surfaces in the dashboard under the conversation.
object
Structured trace information. See Trace data below.
object
Position of this conversation in a multi-agent orchestration. See Steps below.

Message object

Required

string
required
Typically user, assistant, system, or tool. Any non-empty string is accepted.
string | ContentBlock[]
required
Either a plain string (max 100 KB) or an array of content blocks (1-1,000 blocks).

Optional

string (ISO 8601)
When the message was produced. Used for ordering when multiple messages share the same logical turn.

Agent definition object

Required

string
required
Human-readable name. 1-500 characters. Combined with type to dedupe versions.
enum
required
One of system_prompt or tool_schema.
string
required
The definition text. 1 byte to 100 KB.

Content blocks

Messages support either a plain string or typed content blocks. Block types mirror Anthropic’s:

Trace data

When you have structured trace info (tool calls with outputs, retrieval results), attach it so analysis has more to work with.
array
{ type, timestamp, duration?, metadata? }[]. Generic trace events.
array
{ name, input, output?, error?, timestamp?, duration? }[]. One entry per tool invocation.
array
{ query, chunks[], sourceDocIds?, timestamp? }[]. RAG retrieval results.

Steps

When a conversation is one call inside a multi-agent orchestration, attach a step so calado can render the run as a tree and attribute behavior to the right sub-agent. Omit it for single-agent conversations.
string
Stable id for this step within the run.
string
Id of the parent step. Omit for the root step. Cannot equal step.id.
string
Human-readable role for this sub-agent, e.g. orchestrator or flight_search.
string | object
The sub-agent’s dynamic prompt or tool schema for this call — the “how it should work” side calado analyzes this step against. String or object, up to 100 KB. Omit it and the step is analyzed against the agent’s static definition.

Format selector

The format field tells calado how to parse the conversations array when you’re forwarding provider bodies untouched. Omit it to use the default shape shown in the examples.
If you’re forwarding provider-shaped data, set format explicitly. Otherwise, leave it off and use the shape shown in the examples.

Example

Response

Success (202 Accepted)

Error

Batch limits

Error handling

Retry on 5xx and network errors only, with jittered exponential backoff. 4xx responses are permanent and should not be retried. On repeated 401 responses, stop retrying and surface the error to your operator. The key is wrong, and retrying won’t fix it.

Next: serverless patterns

Flush the queue before your function freezes.