1. Threads
  2. Submit Tool Outputs (Legacy)
POST
/threads/{thread_id}/runs/{run_id}/submit-tool-outputs
curl --request POST \
     --url https://app.backboard.io/api/threads/{thread_id}/runs/{run_id}/submit-tool-outputs \
     --header 'X-API-Key: <api-key>' \
     --header 'authorization: <authorization>' \
     --header 'x_session_token: <x_session_token>' \
     --header 'Content-Type: application/json' \
     --data '{
  "tool_outputs": [
    {
      "tool_call_id": "string",
      "output": "string"
    }
  ],
  "tools": [
    {}
  ],
  "thinking": null
}'

​
Overview

Submit tool call results when you need explicit control over run_id, tool overrides, or per-step reasoning.

For most integrations, use Submit Tool Outputs instead — it resolves run_id automatically.

​
Request body

FieldTypeRequiredDescription
tool_outputsarrayYes[{tool_call_id, output}, ...]
toolsarrayNoOverride the assistant’s tool list for this continuation only
thinkingobjectNoPer-step reasoning override for this continuation

​
Reasoning on tool continuation

After tool execution, the model may run another reasoning pass before replying. Pass thinking to control that step — same shape as Send Message (effort, budget_tokens, etc.).

When omitted, the run reuses the original message’s thinking config.

final = await client.submit_tool_outputs(
    thread_id=thread_id,
    run_id=run_id,
    tool_outputs=outputs,
    thinking={"effort": "medium"},
)
print(final.reasoning)  # reasoning trace when thinking is enabled

​
Response

Non-streaming responses include content, status, and reasoning (when thinking is enabled) — same fields as message responses.

​
Query parameters

ParameterDescription
streamSet stream=true to receive SSE chunks (including reasoning_streaming events when thinking is enabled)

​
When to use this endpoint

Use caseThis endpointSimple endpoint
Auto-resolve latest REQUIRES_ACTIONNoYes
Pin a specific run_idYesNo
Override tools mid-runYesNo
Set per-step thinkingYesNo

​
Authorizations

X-API-Key
required
string
API Key authentication

​
Query Parameters

thread_id
required
string
run_id
required
string
stream
default:false
boolean
authorization
x_session_token

​
Body

application/json
tool_outputs
required
array

A list of tool outputs to submit.

tools
array | null

Optional override for the assistant's tool list, applied only to this run. Each entry is an OpenAI-style tool definition (e.g. {type: 'function', function: {...}}).

thinking
null

Optional per-step reasoning override for this continuation (the 'reasoning sandwich': lower effort during the tool/edit grind than at planning/verification). Same shape as the messages endpoint's thinking (e.g. {"effort": "medium"} or {"budget_tokens": 4096}). When omitted, the run's original thinking config is reused.

​
Response

application/json
  • 200

  • 422

Successful Response

message
required
string

Message

thread_id
required
string

Thread Id

run_id
required
string

Run Id

timestamp
required
string

Timestamp

content
string | null

Content

message_id
string | null

Message Id

role
string | null
status
string | null
tool_calls
array | null

Tool Calls

memory_operation_id
string | null

Memory Operation Id

retrieved_memories
array | null
retrieved_files
array | null

Retrieved Files

retrieved_files_count
integer

Retrieved Files Count

reasoning
string | null

Reasoning

model_provider
string | null

Model Provider

model_name
string | null

Model Name

input_tokens
integer | null

Input Tokens

output_tokens
integer | null

Output Tokens

total_tokens
integer | null

Total Tokens

created_at
string | null

Created At

generated_media
array | null
context_usage
object | null

Context Usage