Tako agent API
The agent API from Tako — 4 operation(s) for agent.
The agent API from Tako — 4 operation(s) for agent.
Every API here is available over the APIs.io API and to AI agents over MCP.
One button, every client — Claude, Cursor, VS Code and the rest.
https://apis.io/mcp
find_apisBrowse and filter every API in the catalog.get_api_artifactsOne API's artifacts, grouped by type.get_openapiThe primary OpenAPI for this API.find_similar_apisAPIs that look like this one.apis_io_searchSTART HERE — APIs, providers and tags for one query, each with its total.resolveTurn a domain, URL or GitHub org into the provider it belongs to.find_cohortsEvery scored population of providers in the catalog.curl "https://apis.io/api/v1/apis/tako-agent-api"
curl "https://apis.io/api/v1/apis?limit=25"
Discovery needs no key. Ratings and market analysis are Pro.
openapi: 3.2.0
info:
title: Knowledge Search Agent API
version: 1.0.0
servers:
- url: https://tako.com/api/
description: Tako Production API Server
tags:
- name: agent
paths:
/v1/agent/answer/runs:
get:
tags:
- agent
summary: List answer agent runs
description: List the authenticated caller's answer agent runs, newest first. Returns trimmed run summaries. Fetch full detail via GET /v1/agent/answer/runs/{run_id}.
operationId: listAnswerAgentRuns
parameters:
- description: Opaque pagination cursor from a previous response's next_cursor.
required: false
schema:
type: string
name: cursor
in: query
- description: Max runs to return (default 20, max 100).
required: false
schema:
type: integer
maximum: 100.0
minimum: 1.0
name: limit
in: query
responses:
'200':
description: A page of the caller's answer agent runs, newest first.
content:
application/json:
schema:
$ref: '#/components/schemas/AnswerAgentRunList'
'400':
description: Invalid pagination parameter (limit or cursor).
content:
application/json:
schema:
$ref: '#/components/schemas/ErrorObject'
'401':
description: Missing or invalid API key.
content:
application/json:
schema:
$ref: '#/components/schemas/ErrorObject'
security:
- apiKey: []
post:
tags:
- agent
summary: Dispatch an answer agent run
description: Dispatch an answer agent run. Returns 202 with an AnswerAgentRun object. Poll GET /v1/agent/answer/runs/{run_id} until status is 'completed' or 'failed'.
operationId: createAnswerAgentRun
requestBody:
content:
application/json:
schema:
$ref: '#/components/schemas/AnswerAgentRunRequest'
responses:
'202':
description: 'Run dispatched. With Accept: application/json, poll GET /v1/agent/answer/runs/{run_id} for the run status. With Accept: text/event-stream, the response is an SSE stream of AnswerAgentStreamEnvelope events. The stream ends at stream_done. If the stream ends without an agent_result event, poll GET /v1/agent/answer/runs/{run_id} for the terminal status.'
content:
application/json:
schema:
$ref: '#/components/schemas/AnswerAgentRun'
text/event-stream:
schema:
$ref: '#/components/schemas/AnswerAgentStreamEnvelope'
'400':
description: Invalid request (for example, a blank query or a malformed body).
content:
application/json:
schema:
$ref: '#/components/schemas/ErrorObject'
'401':
description: Missing or invalid API key.
content:
application/json:
schema:
$ref: '#/components/schemas/ErrorObject'
'402':
description: Insufficient API credit balance (PAYG pre-dispatch gate).
content:
application/json:
schema:
$ref: '#/components/schemas/ErrorObject'
'404':
description: thread_id does not exist or is not owned by the caller.
content:
application/json:
schema:
$ref: '#/components/schemas/ErrorObject'
'409':
description: 'Conflict. code is one of: ''conflict'' (the thread already has a run in flight); ''thread_product_mismatch'' (the thread belongs to a different agent product); ''source_indexes_mismatch'' (a follow-up changed the thread''s pinned source_indexes).'
content:
application/json:
schema:
$ref: '#/components/schemas/ErrorObject'
'500':
description: Failed to dispatch the agent run.
content:
application/json:
schema:
$ref: '#/components/schemas/ErrorObject'
security:
- apiKey: []
/v1/agent/answer/runs/{run_id}:
get:
tags:
- agent
summary: Poll an answer agent run
description: Retrieve the current state of an answer agent run. Poll until status is 'completed' or 'failed'. The response includes result when status is 'completed'.
operationId: getAnswerAgentRun
parameters:
- description: The run ID from the POST /v1/agent/answer/runs response.
required: true
schema:
type: string
name: run_id
in: path
- description: 'SSE resume cursor (Accept: text/event-stream only). The stream replays events with seq greater than this value. It is equivalent to the Last-Event-ID header.'
required: false
schema:
type: integer
minimum: 0.0
name: starting_after
in: query
responses:
'200':
description: 'Current state of the agent run. With Accept: text/event-stream, the response replays and then follows the run as an SSE stream of AnswerAgentStreamEnvelope events. Use starting_after or Last-Event-ID to resume. If the stream ends without an agent_result event, poll this endpoint with Accept: application/json for the terminal status.'
content:
application/json:
schema:
$ref: '#/components/schemas/AnswerAgentRun'
text/event-stream:
schema:
$ref: '#/components/schemas/AnswerAgentStreamEnvelope'
'401':
description: Missing or invalid API key.
content:
application/json:
schema:
$ref: '#/components/schemas/ErrorObject'
'403':
description: The run is not owned by the caller.
content:
application/json:
schema:
$ref: '#/components/schemas/ErrorObject'
'404':
description: Run not found.
content:
application/json:
schema:
$ref: '#/components/schemas/ErrorObject'
security:
- apiKey: []
/v1/agent/retrieval/runs:
get:
tags:
- agent
summary: List retrieval agent runs
description: List the authenticated caller's retrieval agent runs, newest first. Returns trimmed run summaries. Fetch full detail via GET /v1/agent/retrieval/runs/{run_id}.
operationId: listRetrievalAgentRuns
parameters:
- description: Opaque pagination cursor from a previous response's next_cursor.
required: false
schema:
type: string
name: cursor
in: query
- description: Max runs to return (default 20, max 100).
required: false
schema:
type: integer
maximum: 100.0
minimum: 1.0
name: limit
in: query
responses:
'200':
description: A page of the caller's retrieval agent runs, newest first.
content:
application/json:
schema:
$ref: '#/components/schemas/RetrievalAgentRunList'
'400':
description: Invalid pagination parameter (limit or cursor).
content:
application/json:
schema:
$ref: '#/components/schemas/ErrorObject'
'401':
description: Missing or invalid API key.
content:
application/json:
schema:
$ref: '#/components/schemas/ErrorObject'
security:
- apiKey: []
post:
tags:
- agent
summary: Dispatch a retrieval agent run
description: Dispatch a retrieval agent run. Returns 202 with a RetrievalAgentRun object. Poll GET /v1/agent/retrieval/runs/{run_id} until status is 'completed' or 'failed'.
operationId: createRetrievalAgentRun
requestBody:
content:
application/json:
schema:
$ref: '#/components/schemas/RetrievalAgentRunRequest'
responses:
'202':
description: 'Run dispatched. With Accept: application/json, poll GET /v1/agent/retrieval/runs/{run_id} for the run status. With Accept: text/event-stream, the response is an SSE stream of RetrievalAgentStreamEnvelope events. The stream ends at stream_done. If the stream ends without an agent_result event, poll GET /v1/agent/retrieval/runs/{run_id} for the terminal status.'
content:
application/json:
schema:
$ref: '#/components/schemas/RetrievalAgentRun'
text/event-stream:
schema:
$ref: '#/components/schemas/RetrievalAgentStreamEnvelope'
'400':
description: Invalid request (for example, a blank query or a malformed body).
content:
application/json:
schema:
$ref: '#/components/schemas/ErrorObject'
'401':
description: Missing or invalid API key.
content:
application/json:
schema:
$ref: '#/components/schemas/ErrorObject'
'402':
description: Insufficient API credit balance (PAYG pre-dispatch gate).
content:
application/json:
schema:
$ref: '#/components/schemas/ErrorObject'
'404':
description: thread_id does not exist or is not owned by the caller.
content:
application/json:
schema:
$ref: '#/components/schemas/ErrorObject'
'409':
description: 'Conflict. code is one of: ''conflict'' (the thread already has a run in flight); ''thread_product_mismatch'' (the thread belongs to a different agent product); ''source_indexes_mismatch'' (a follow-up changed the thread''s pinned source_indexes).'
content:
application/json:
schema:
$ref: '#/components/schemas/ErrorObject'
'500':
description: Failed to dispatch the agent run.
content:
application/json:
schema:
$ref: '#/components/schemas/ErrorObject'
security:
- apiKey: []
/v1/agent/retrieval/runs/{run_id}:
get:
tags:
- agent
summary: Poll a retrieval agent run
description: Retrieve the current state of a retrieval agent run. Poll until status is 'completed' or 'failed'. The response includes result when status is 'completed'.
operationId: getRetrievalAgentRun
parameters:
- description: The run ID from the POST /v1/agent/retrieval/runs response.
required: true
schema:
type: string
name: run_id
in: path
- description: 'SSE resume cursor (Accept: text/event-stream only). The stream replays events with seq greater than this value. It is equivalent to the Last-Event-ID header.'
required: false
schema:
type: integer
minimum: 0.0
name: starting_after
in: query
responses:
'200':
description: 'Current state of the agent run. With Accept: text/event-stream, the response replays and then follows the run as an SSE stream of RetrievalAgentStreamEnvelope events. Use starting_after or Last-Event-ID to resume. If the stream ends without an agent_result event, poll this endpoint with Accept: application/json for the terminal status.'
content:
application/json:
schema:
$ref: '#/components/schemas/RetrievalAgentRun'
text/event-stream:
schema:
$ref: '#/components/schemas/RetrievalAgentStreamEnvelope'
'401':
description: Missing or invalid API key.
content:
application/json:
schema:
$ref: '#/components/schemas/ErrorObject'
'403':
description: The run is not owned by the caller.
content:
application/json:
schema:
$ref: '#/components/schemas/ErrorObject'
'404':
description: Run not found.
content:
application/json:
schema:
$ref: '#/components/schemas/ErrorObject'
security:
- apiKey: []
components:
schemas:
ResultContent:
properties:
content_format:
anyOf:
- $ref: '#/components/schemas/ContentsFormat'
- type: 'null'
description: 'Serialization of the returned card data: ''csv'', ''json_records'', or ''json_compact''. Null for web text (always returned as raw text) and for a quote-only response (nothing was serialized).'
cost:
type: number
title: Cost
description: Price of this item in USD. On a /contents response this is the amount actually billed; on a quote_only response or a search/answer downloadable card it is a prospective /contents export price (nothing was fetched or billed). Pair with export_pricing to compute a larger export's cost before fetching.
default: 0.0
data:
anyOf:
- type: string
- type: 'null'
title: Data
description: 'Inline payload as text: card data serialized to CSV, or a web page''s extracted text. Set only for the ''csv'' card format and for web text; null otherwise.'
records:
anyOf:
- items:
additionalProperties:
anyOf:
- type: string
- type: number
- type: integer
- type: boolean
- type: 'null'
type: object
type: array
- type: 'null'
title: Records
description: 'Inline card data as verbose JSON: a list of row objects keyed by column name. Set only when content_format is ''json_records''.'
dataset:
anyOf:
- $ref: '#/components/schemas/TakoDataset'
- type: 'null'
description: Inline card data as a compact TakoDataset (typed column headers plus positional row arrays). Set only when content_format is 'json_compact'.
url:
anyOf:
- type: string
- type: 'null'
title: Url
description: Presigned download URL for the content, returned in 'url' delivery mode. Null for inline delivery and for quotes; pair with expires_at.
expires_at:
anyOf:
- type: string
- type: 'null'
title: Expires At
description: ISO-8601 timestamp after which the presigned url stops working. Null whenever url is null.
total_rows:
anyOf:
- type: integer
- type: 'null'
title: Total Rows
description: True total number of rows in the card's data, independent of how many rows were returned. Compare with truncated to tell whether more rows are available via a larger max_rows. Null for web text.
truncated:
type: boolean
title: Truncated
description: True when the returned rows were capped (by the request's max_rows or the 2,000-row system ceiling) and total_rows exceeds the number returned.
default: false
export_pricing:
anyOf:
- $ref: '#/components/schemas/ExportPricing'
- type: 'null'
description: Rate card for a downloadable card CSV, so a caller can compute a full export's cost before fetching. Null for web text and other non-downloadable content.
type: object
title: ResultContent
description: 'Describes the downloadable content behind a result.
Pricing: for a Tako card CSV export, the charge is a flat per-export
baseline plus a per-source, per-row CPM on the rows returned beyond the
free-row allowance. Web text bills at the standard Contents rate.
The meaning of `cost` depends on the surface. On `/contents` responses,
`cost` is the actual charge, and it reconciles with what that response
billed. The exception is a `quote_only` response, where `cost` is a
prospective price: Tako neither fetched nor billed the export, and the
payload and url fields are null. On search and answer downloadable
cards, `cost` is a prospective `/contents` quote (the per-export
baseline floor), not what this response billed. On a metered
`include_contents` request, the per-card `cost` therefore diverges from
`usage.total_cost_usd` (the inline preview bills about $0), and the sum
of per-card `cost` will not reconcile with `usage`. Treat `cost` plus
`export_pricing` as the price of a `/contents` export of this card.
`export_pricing` carries the rate so that a caller can compute the full
charge before fetching: baseline_usd + row_cpm_usd * max(0, rows -
free_rows) / 1000, with rows <= max_rows_ceiling. `export_pricing` is
null for web text and non-downloadable content.
Tako populates exactly one payload group once it delivers contents:
`data` (CSV or web text), `records` (verbose JSON), `dataset` (compact
TakoDataset), or `url` plus `expires_at` (presigned download).
`content_format` names the serialization; it is null for web text and
for an undelivered quote. When every payload field is unset, this is
just the quote (`cost`); fetch the content later via the Contents
endpoint.'
TakoDatasetColumnType:
type: string
enum:
- string
- number
- boolean
- date
- datetime
title: TakoDatasetColumnType
description: 'Logical column type declared in a TakoDataset header. Temporal cells
are ISO-8601 strings. Each column declares ''date'' or ''datetime'' on its
own: a temporal column whose non-null values are all timezone-naive
midnights declares ''date''.'
AgentAnswerAssumption:
properties:
title:
type: string
title: Title
description:
type: string
title: Description
category:
anyOf:
- type: string
- type: 'null'
title: Category
source_ref:
anyOf:
- type: integer
- type: 'null'
title: Source Ref
type: object
required:
- title
- description
title: AgentAnswerAssumption
ToolResultEvent:
properties:
kind:
type: string
const: tool_result
title: Kind
default: tool_result
id:
type: string
title: Id
tool:
type: string
title: Tool
elapsed_ms:
type: integer
title: Elapsed Ms
default: 0
link:
anyOf:
- type: string
- type: 'null'
title: Link
parent_id:
anyOf:
- type: string
- type: 'null'
title: Parent Id
type: object
required:
- id
- tool
title: ToolResultEvent
RetrievalAgentEffort:
type: string
enum:
- medium
title: RetrievalAgentEffort
description: 'Effort taxonomy for the Retrieval Agent (POST /v1/agent/retrieval/runs).
Only ''medium'' is available today. `effort` stays a request field for
forward compatibility and for parity with AnswerAgentEffort. The values
''low'' and ''high'' return 400 at validation.'
TakoDataset:
properties:
columns:
items:
$ref: '#/components/schemas/TakoDatasetColumn'
type: array
title: Columns
description: Ordered column headers (name + type), one per position in every row.
rows:
items:
items:
anyOf:
- type: string
- type: number
- type: integer
- type: boolean
- type: 'null'
type: array
type: array
title: Rows
description: Row data as positional cell arrays aligned to `columns` order. Cells are string/number/boolean/null; nulls are preserved, never coerced.
total_rows:
type: integer
title: Total Rows
description: True total number of rows in the underlying data, before any truncation.
truncated:
type: boolean
title: Truncated
description: True when `rows` was capped and total_rows exceeds the number returned.
ref:
type: string
title: Ref
description: Source URL the dataset was derived from (e.g. the Tako card URL).
sources:
items:
$ref: '#/components/schemas/TakoDatasetSource'
type: array
title: Sources
description: 'Provenance for the dataset: the sources the rows were drawn from.'
provenance:
type: string
enum:
- query
- web_extraction
title: Provenance
description: 'How the rows were produced: ''query'' (Tako data) or ''web_extraction''.'
default: query
type: object
required:
- columns
- rows
- total_rows
- truncated
- ref
- sources
title: TakoDataset
description: 'The dataset-slot envelope: exact retrieved rows as positional arrays
in `columns` order. The rows come directly from the data source; the LLM
never transcribes them.'
MetricDefinition:
properties:
name:
type: string
title: Name
description: The metric's display name
examples:
- Gross Domestic Product (current US$)
definition:
type: string
title: Definition
description: Human-readable definition of the metric
type: object
required:
- name
- definition
title: MetricDefinition
description: 'Definition of a metric shown on a card. Sourced from the metric''s
ValueType definition — the same text as the in-app methodology ''Metrics''
tab.'
RetrievalAgentRun:
properties:
run_id:
type: string
title: Run Id
object:
type: string
const: agent.retrieval.run
title: Object
default: agent.retrieval.run
thread_id:
anyOf:
- type: string
- type: 'null'
title: Thread Id
status:
$ref: '#/components/schemas/AgentRunStatus'
created_at:
type: string
title: Created At
completed_at:
anyOf:
- type: string
- type: 'null'
title: Completed At
result:
anyOf:
- $ref: '#/components/schemas/RetrievalAgentResult'
- type: 'null'
error:
anyOf:
- $ref: '#/components/schemas/ErrorObject'
- type: 'null'
usage:
anyOf:
- $ref: '#/components/schemas/Usage'
- type: 'null'
request:
anyOf:
- $ref: '#/components/schemas/RetrievalAgentRunRequest'
- type: 'null'
type: object
required:
- run_id
- status
- created_at
title: RetrievalAgentRun
description: The retrieval-agent run resource returned by dispatch (202) and poll (GET).
RetrievalAgentResult:
properties:
answer:
anyOf:
- type: string
- type: 'null'
title: Answer
cards:
items:
$ref: '#/components/schemas/TakoCard'
type: array
title: Cards
citations:
items:
$ref: '#/components/schemas/AgentAnswerCitation'
type: array
title: Citations
metadata:
anyOf:
- $ref: '#/components/schemas/AgentAnswerMetadata'
- type: 'null'
structured_output:
anyOf:
- additionalProperties: true
type: object
- type: 'null'
title: Structured Output
description: Caller-shaped structured output (present only if the request carried output_schema and status is not 'failed'). Dataset slots contain a TakoDataset envelope of exact retrieved rows, or null when the agent left them unfilled.
structured_output_status:
anyOf:
- $ref: '#/components/schemas/StructuredOutputStatus'
- type: 'null'
description: complete | partial | failed. Present when the request supplied output_schema and the run reached the finalize step. It can be absent when the whole run failed or timed out before finalize; the run-level status and error convey that, and the echoed request.output_schema still identifies the run as structured.
structured_output_citations:
anyOf:
- additionalProperties:
items:
type: integer
type: array
type: object
- type: 'null'
title: Structured Output Citations
description: Best-effort field-path -> citation-index map joining the top-level citations registry (same [n] index space as the answer). Absent when status is 'failed'.
unfilled_fields:
anyOf:
- items:
type: string
type: array
- type: 'null'
title: Unfilled Fields
description: Dot-separated paths of unfilled dataset slots; present only if status is 'partial'.
structured_output_error:
anyOf:
- $ref: '#/components/schemas/ErrorObject'
- type: 'null'
description: Why structured output failed; present only if status is 'failed'.
request_id:
anyOf:
- type: string
- type: 'null'
title: Request Id
type: object
title: RetrievalAgentResult
description: 'Final retrieval-agent output. answer is markdown prose with [n]
citation markers. cards reuse the sibling TakoCard. citations is the
unified top-level registry for data and web sources — there is no
web_results field. metadata carries definitions, assumptions, and
methodology. The structured_output_* fields carry the caller-shaped
output_schema result; they are present only if the request supplied
output_schema. See each field''s description for the exact presence
rules.'
ToolRetryEvent:
properties:
kind:
type: string
const: tool_retry
title: Kind
default: tool_retry
id:
type: string
title: Id
tool:
type: string
title: Tool
error:
type: string
title: Error
elapsed_ms:
type: integer
title: Elapsed Ms
default: 0
parent_id:
anyOf:
- type: string
- type: 'null'
title: Parent Id
type: object
required:
- id
- tool
- error
title: ToolRetryEvent
AgentAnswerDefinition:
properties:
term:
type: string
title: Term
definition:
type: string
title: Definition
source_ref:
anyOf:
- type: integer
- type: 'null'
title: Source Ref
type: object
required:
- term
- definition
title: AgentAnswerDefinition
ExportPricing:
properties:
baseline_usd:
type: number
title: Baseline Usd
description: Flat USD charged once per card export, independent of row count.
row_cpm_usd:
type: number
title: Row Cpm Usd
description: USD charged per 1,000 rows on rows beyond the free allowance (free_rows). Card-level total across the card's priced sources; no per-source breakdown.
free_rows:
type: integer
title: Free Rows
description: Rows included at the baseline price before the per-1,000-row rate (row_cpm_usd) begins to apply.
max_rows_ceiling:
type: integer
title: Max Rows Ceiling
description: Hard cap on rows a single export can return and bill; a larger requested max_rows is clamped to this.
type: object
required:
- baseline_usd
- row_cpm_usd
- free_rows
- max_rows_ceiling
title: ExportPricing
description: 'Card-CSV export pricing RATE, published so a caller can compute an export''s
cost before fetching. Full charge =
baseline_usd + row_cpm_usd * max(0, rows - free_rows) / 1000, rows <= max_rows_ceiling.
row_cpm_usd is the card-level total (sum of the card''s distinct priced sources''
per-1,000-row rate); no per-source breakdown.'
RunSummaryEvent:
properties:
kind:
type: string
const: run_summary
title: Kind
default: run_summary
status:
$ref: '#/components/schemas/AgentRunStatus'
created_at:
type: string
title: Created At
completed_at:
anyOf:
- type: string
- type: 'null'
title: Completed At
error:
anyOf:
- $ref: '#/components/schemas/ErrorObject'
- type: 'null'
usage:
anyOf:
- $ref: '#/components/schemas/Usage'
- type: 'null'
type: object
required:
- status
- created_at
title: RunSummaryEvent
description: 'Terminal run metadata. The stream emits it once, immediately before
stream_done. It mirrors the GET-poll run fields that the stream otherwise
lacks; the result stays in the agent_result event. status, created_at,
and completed_at are always present. error appears only on failure. usage
appears only on metered (pay-as-you-go) runs and is null otherwise.
agent_result plus run_summary equals the GET poll object.
It carries the same envelope `seq` as the stream_done that follows it (it
has no seq of its own), and the stream suppresses its SSE `id:`, so it
advances no resume cursor. Identify it by `kind`; never assume `seq` is
unique per frame.'
AnswerAgentMetadata:
properties:
definitions:
anyOf:
- items:
$ref: '#/components/schemas/AgentAnswerDefinition'
type: array
- type: 'null'
title: Definitions
assumptions:
anyOf:
- items:
$ref: '#/components/schemas/AgentAnswerAssumption'
type: array
- type: 'null'
title: Assumptions
methodology:
anyOf:
- items:
$ref: '#/components/schemas/AgentAnswerMethodologyNote'
type: array
- type: 'null'
title: Methodology
type: object
title: AnswerAgentMetadata
description: 'Answer-agent metadata. Citations live in the top-level `citations`
registry, so this carries only definitions, assumptions, and methodology.
Distinct from the shared AgentAnswerMetadata, which retains citations for
the legacy AgentResult.'
AnswerAgentResult:
properties:
answer:
anyOf:
- type: string
- type: 'null'
title: Answer
cards:
items:
$ref: '#/components/schemas/TakoCard'
type: array
title: Cards
citations:
items:
$ref: '#/components/schemas/AgentAnswerCitation'
type: array
title: Citations
metadata:
anyOf:
- $ref: '#/components/schemas/AnswerAgentMetadata'
- type: 'null'
request_id:
anyOf:
- type: string
- type: 'null'
title: Request Id
type: object
title: AnswerAgentResult
description: 'Final answer-agent output. answer is markdown prose with [n] citation
markers. citations is the unified top-level registry that the [n] markers
join. cards reuse the sibling TakoCard. metadata carries definitions,
assumptions, and methodology.
# --- truncated at 32 KB (67 KB total) ---
# Full source: https://raw.githubusercontent.com/api-evangelist/tako/refs/heads/main/openapi/tako-agent-api-openapi.yml