Skip to main content
GET
JavaScript
Listing tool calls gives you arguments and status. Fetching one gives you what the tool returned.

result sits at the top level

Not under data, where arguments and callable live. The response schema is named ObjectiveToolCallWithResult, and that name is the whole distinction from the list.
No includeInfo is needed. The result hydrates on every fetch, which is why the list leaves it out: paging a long objective stays cheap, and you pay for a body only when a user expands one. result.content is the same block list a bare tool submits: each block’s type reads text, image, or audio, with the payload under the matching key. Media comes back as a signed URL on the way out, even though it goes in as base64.

Three ways to reach a result body

The stream omits bodies so a tool returning a megabyte of JSON does not push it through every open connection. That makes this endpoint the natural companion to a live UI: stream the timeline, fetch the body on click.

It resolves built-in tool names

The toolCalled event ships cadenyaProvidedTool.name empty. Here it is populated:
So a transcript that hits an unnamed built-in can recover the name with one fetch.

resolvedSecrets is the secret audit trail

When a tool’s headers reference ${NAME} secrets, resolvedSecrets records which ones the call used and which scope each came from, never the value:
key is the reference name (not name), and source is the scope that won under the strict precedence, objective over tool set over workspace: So a call that used a customer’s per-run token reads RESOLVED_SECRET_SOURCE_OBJECTIVE, and one that fell through to the shared credential reads RESOLVED_SECRET_SOURCE_WORKSPACE. This is how you confirm the right scope won without ever seeing the secret.

Scoping is strict

The tool call must belong to the objective in the path. A valid ID under the wrong objective is a 404, not someone else’s data:
external_id: resolution does not apply to tool calls. They carry no external ID, so pass the toolcall_... value.

Poll for a settled status

Approve and deny resolve asynchronously, and their response reports the pre-decision state. This endpoint is where the settled one shows up.

List tool calls

Every call, filtered by status, without result bodies.

Approve a tool call

The decision whose outcome you read here.

Set tool call content

Where a bare tool’s result.content comes from.

Stream objective events

Why the stream sends a toolCallId and no body.

Authorizations

Authorization
string
header
required

Bearer authentication header of the form Bearer <token>, where <token> is your auth token.

Path Parameters

workspaceId
string
required
Example:

"workspace_01HXKD2E5NQM3T9AYWCF133E3Q"

objectiveId
string
required

The ID of the objective. Supports "external_id:" prefix for external IDs.

Example:

"obj_01HXKD2E5NQM3T9AYWCFQAZGFV"

toolCallId
string
required

The ID of the tool call to retrieve

Example:

"toolcall_01HXKD2E5NQM3T9AYWCFTANFGV"

Response

OK

ObjectiveToolCallWithResult is an ObjectiveToolCall plus the content the tool returned. Returned by GetObjectiveToolCall.

metadata
object
required

Metadata for ephemeral operations and activities (e.g., objectives, executions, runs)

data
object
required
status
enum<string>
required

Current status of the tool call

Available options:
TOOL_CALL_STATUS_UNSPECIFIED,
TOOL_CALL_STATUS_AUTO_APPROVED,
TOOL_CALL_STATUS_WAITING_FOR_APPROVAL,
TOOL_CALL_STATUS_APPROVED,
TOOL_CALL_STATUS_DENIED
info
object
required
executionStatus
enum<string>
required
read-only
Available options:
TOOL_CALL_EXECUTION_STATUS_UNSPECIFIED,
TOOL_CALL_EXECUTION_STATUS_PENDING,
TOOL_CALL_EXECUTION_STATUS_RUNNING,
TOOL_CALL_EXECUTION_STATUS_COMPLETED,
TOOL_CALL_EXECUTION_STATUS_ERRORED,
TOOL_CALL_EXECUTION_STATUS_WAITING_FOR_CONTENT
result
object

The content returned by the tool. Only set once execution_status is TOOL_CALL_EXECUTION_STATUS_COMPLETED.

resolvedSecrets
object[]
read-only

List of resolved secrets used by the tool call