Canary Data

MCP Server — Developer Documentation

Reference for the Canary Data Model Context Protocol (MCP) server, including available tools, supported markets, data freshness, and rate limits.

Tool Reference

flag_screen

Screens the whole company universe for flags and returns one row per matching company — the answer to “which companies have X?” rather than “what does company Y have?”. Every other flag tool needs a ticker up front; this one finds the tickers. Each row identifies a company and summarises what it matched: flag count, the flag types hit, the most recent flag date, and a severity breakdown.

Three things about scope that are not visible in the schema. Dates are event dates — “in the last month” means the departure, restatement or filing happened in the last month, not that Canary detected it then. Active companies only. And there is no market-cap floor, so small caps are included; a result is not limited to well-known names. This screen intentionally returns the same companies as the Canary web Screen page given equivalent filters — a disagreement is a bug worth reporting, not expected variance.

Naming what to screen for

Supply exactly one of category or flag_types. category is the normal path: five values, covering a whole group at once, with the flag types behind it resolved live so it keeps up with taxonomy changes. flag_types is the precise path, for when the question is about specific types. It is validated against the live taxonomy — an unrecognised name is rejected with the offending value named, never silently answered with an empty list.

Choosing a window

Supply exactly one of time_range or since. time_range takes a named bucket; since takes an ISO 8601 date, for windows the buckets cannot express. There is deliberately no “all history” option: a bounded window is what keeps a universe-wide screen to a usable size.

Input Parameters

Parameter Type Required Description
category string one of Screen every flag type in a category. One of illegal_or_questionable, fundamental_business, management_track_record, questionable_associations, accounting_and_disclosure. Supply this or flag_types, not both
flag_types array<string> one of Exact flag type names, e.g. ["executive_turnover_undisclosed"]. Supply this or category, not both
time_range string one of Named window: lastWeek, lastMonth, lastQuarter, last6Months, lastYear, last2Years, last5Years. Supply this or since, not both
since string one of Start of the window — ISO 8601 format (YYYY-MM-DD), for periods the named options do not cover. Supply this or time_range, not both
severities array<string> optional Restrict to these severities — red, orange, yellow, green. Defaults to all four
countries array<string> optional ISO 3166-1 alpha-2 country codes (e.g. ["US", "IE"]). Defaults to all countries
exclude_countries boolean optional When true, exclude countries instead of restricting to them
min_flag_count integer optional Only return companies with at least this many matching flags in the window. Defaults to 1
page integer optional Page number. Defaults to 1
per_page integer optional Companies per page, 1–100. Defaults to 50

Response Shape — companies found

{ "data": [ { "name": "Acme Corp", "ticker": "ACME", "country": "US", "exchange": "NASDAQ", "sector": "Industrials", "flag_count": 3, "flag_types": [ "executive_turnover_undisclosed" ], "latest_flag_date": "2026-07-18", "max_severity": "red", "severity_counts": { "red": 1, "orange": 2 } } ], "meta": { "total_companies": 110, "page": 1, "per_page": 50 } }

Response Shape — no companies found

When data is empty, meta.coverage is included as a hint, echoing whichever of category or flag_types was screened. It says explicitly that the filters were understood, so an empty result reads as “nothing matched this window” rather than “the request was not recognised”.

{ "data": [], "meta": { "total_companies": 0, "page": 1, "per_page": 50, "coverage": { "hint": "No companies matched these filters. The query was understood and the filters are valid — this is an empty result, not an unrecognised request. Widening the window or dropping the severity or country filters may return matches.", "category": "management_track_record" } } }

Drilling into a result

A flag_screen row hands back ticker and an ISO-2 country — exactly the input the per-company flag tools take, with no lookup step in between. Screen to find the companies, then call insider_trading, fraud_and_malfeasance, accounting_and_disclosure, management_background or fundamentals_analysis on any row to get the individual flags behind it.

flag_series

Flag Series — one tool, two views of the same captured contract. Use view to choose the surface. Omit it (or pass observations) for the dated numbers at the grain they were published; catalog to see what the company publishes before fetching any of it. It complements the flag tools rather than replacing them: they still return every flag with its published text, and this tool adds the figures Canary has captured from those flags as labelled series.

The two views

observations (default) — each row is one number for one metric over one period: metric, value, unit, period_start, period_end, grain, transform, basis, and whether the reading was provisional. available_metrics is returned on every call. catalog — one small call answers “what does this company have” without paging through its flags. For every series: the metric name (verbatim), whether it is the company’s own reported_figure or a third-party proxy, the arithmetic already applied, the grain, and the first/last period observed. A company with nothing plottable returns an empty data array, not an error. Reported-only questions — two years of revenue growth vs last-quarter revenue — use catalog then observations with metric: "revenue" (yoy for growth, latest level for the last quarter). Do not treat the company as a tracker: tracker is a flag family, not an ingest path.

When nothing is captured

Trackers are often published before their figures are captured, so an empty result is not the absence of data. Every view then returns the most recent published readings in readings (date, title, text, company), and readings_in_full names the flag tool that returns those same flags complete, with sources and summaries; meta.published_readings says how many there are. On the observations view, page and per_page page those readings whenever no series is captured, and readings_page carries total and has_more. The catalogue lists the trackers a company publishes only as text in text_only_trackers; ask for one by name as series and its readings come back.

What family covers

tracker — Canary’s own recurring readings, monthly and sub-monthly. Tracker is a flag family, not an ingest path and not a property of the issuer: Microsoft is not “a tracker” unless one of those readings is filed under it. margin — the margin_compression and margin_expansion flags, carrying quarterly revenue, ebit_excl_sbc and ebit_margin. buyback — the share_repurchases flags, carrying quarterly amounts and shares repurchased, as filed. One request shape for all three. Note that margin carries reported revenue from filed financials while a tracker series is a proxy — export value, a price index. Where a company has both, present the reported series as actuals and the tracker as a leading indicator; the family field on every observation is what keeps them apart. family filters observations only; catalog returns every family.

Metric names are verbatim, and that matters

metric is copied from the source that published it, so the same tracker reports different metrics for different companies. The Memory Tracker publishes a DRAM price index for Micron and a Korean-customs export value for SK hynix and Samsung. Neither is revenue and neither is sales — export value is a proxy for sales, and a price index is not a volume series at all. There is no synonym table behind this tool: asking for metric: "sales" on a company whose only series is a price returns no data plus available_metrics, and that is the correct answer. Label a chart with the metric string returned here, never with a name inferred from the tracker’s title.

Reading an observation

transform says what arithmetic the number already is — level, yoy, qoq, mom, t3m_yoy, t12m_yoy. These are already computed; do not recompute them, and note that each metric exposes exactly one y/y convention. unit and scale are not decoration: an ebit_margin of 0.7632825 is a ratio (a 76.3% margin), a margin_exp_comp_by_year of 3488.856 is a change in basis points and not a growth rate, and currency figures come back at scale: "units" — base currency units, not the millions a CapIQ screen shows. SK hynix FY2026 Q2 revenue is 79318746000000 KRW here and 79318746 in CapIQ; they are the same quarter, so do not rescale. A currency figure is never returned without its ISO currency. basis distinguishes working_day_adjusted from raw_unadjusted, and a reading normally publishes both for the same metric — never mix them in one line. attribution: "undifferentiated" marks an observation the source itself says is not company-specific. caveats carries the reading’s own qualifications, and meta.uncaptured_readings counts readings whose figures could not be read, so a short series is distinguishable from a complete one.

Input Parameters

Parameter Type Required Description
ticker string required Company ticker symbol
country string optional Two-letter ISO country code. Optional when the ticker or company name names one company; a ticker two companies share comes back as candidates
view string optional One of observations (default) or catalog
series string optional Restrict to one series, e.g. Memory Tracker. Use a value from available_metrics or the catalog view
metric string optional Exact metric name, matched case-insensitively and never translated. Use a value from available_metrics
family string optional Restrict observations to a source family — tracker, margin, buyback
date_from string optional Only periods ending on or after this ISO 8601 date
date_to string optional Only periods starting on or before this ISO 8601 date
page integer optional observations only. Pages the observations, or the published readings when no series is captured. Defaults to 1
per_page integer optional observations only. Defaults to 50 observations, or 20 readings when no series is captured; maximum 100

Catalog response shape (view: "catalog")

{ "view": "catalog", "data": [ { "series": "Memory Tracker", "metric": "DRAM price", "figure_kind": "proxy", "transform": "yoy", "basis": "unspecified", "unit": "percent", "grain": "month", "observations": 60, "first_period": "2021-08-01", "last_period": "2026-08-17" } ], "meta": { "ticker": "MU", "country": "US", "total": 1 } }
accounting_and_disclosure

Retrieves accounting & disclosure flags for a company identified by ticker and country — the full set shown on the web Accounting tab, spanning the entire accounting_and_disclosure category (revenue/cost recognition, receivables, inventory, auditor and disclosure changes, new accounting issues, and more). Returns paginated flag records, each containing the flag date, severity, title, description, sources, and a metadata map (filing URLs and forms for filing-comparison flags).

Input Parameters

Parameter Type Required Description
ticker string required Company ticker symbol (e.g. AAPL)
country string required ISO 3166-1 alpha-2 country code (e.g. US)
date_from string optional Start of date range — ISO 8601 format (YYYY-MM-DD)
date_to string optional End of date range — ISO 8601 format (YYYY-MM-DD)
page integer optional Page number. Defaults to 1
per_page integer optional Results per page. Defaults to 50, max 100

Response Shape — flags found

{ "data": [ { "date": "2024-03-15", "severity": "high", "title": "...", "description": "...", "flag_type": "change_in_revenue_cost_recognition", "company": { "id": 1234, "name": "Acme Corp", "ticker": "ACME", "exchange": "NASDAQ", "isins": ["US0123456789"], "ciks": ["0001234567"] }, "sources": ["..."], "metadata": { "filing_url": "https://...", "filing_url_prev": "https://...", "form": "10-K", "form_prev": "10-K", "current_date": "2024-03-15", "prev_date": "2023-03-10", "text": ["..."] } } ], "meta": { "total": 42, "page": 1, "per_page": 50 } }

Response Shape — no flags found

When data is empty, meta.coverage is included as a hint. It carries the echoed ticker and country so the caller can confirm the parameters that were searched, along with a human-readable hint string. When a date_from or date_to filter was supplied, the active date bounds are also echoed and the hint clarifies that the empty result is specific to the requested range — flags may exist outside it.

{ "data": [], "meta": { "total": 0, "page": 1, "per_page": 50, "coverage": { "ticker": "AAPL", "country": "US", "hint": "No flags of this type were found for AAPL (US)." } } }

Response Shape — no flags found (with date range)

{ "data": [], "meta": { "total": 0, "page": 1, "per_page": 50, "coverage": { "ticker": "AAPL", "country": "US", "date_from": "2024-01-01", "date_to": "2024-06-30", "hint": "No flags of this type were found for AAPL (US) in the requested date range." } } }
insider_trading

Retrieves insider trading flags (all sub-types) for a company identified by ticker and country. Returns paginated flag records derived from regulatory filings, each containing the flag date, severity, description, and structured transaction details.

Input Parameters

Parameter Type Required Description
ticker string required Company ticker symbol (e.g. AAPL)
country string required ISO 3166-1 alpha-2 country code (e.g. US)
date_from string optional Start of date range — ISO 8601 format (YYYY-MM-DD)
date_to string optional End of date range — ISO 8601 format (YYYY-MM-DD)
page integer optional Page number. Defaults to 1
per_page integer optional Results per page. Defaults to 50, max 100

Response Shape — flags found

{ "data": [ { "date": "2024-03-15", "severity": "medium", "description": "...", "flag_type": "insider_trading", "company": { "id": 1234, "name": "Acme Corp", "ticker": "ACME", "exchange": "NASDAQ", "isins": ["US0123456789"], "ciks": ["0001234567"] }, "transactions_info": { ... }, "sources": ["..."] } ], "meta": { "total": 18, "page": 1, "per_page": 50 } }

Response Shape — no flags found

When data is empty, meta.coverage is included as a hint. It carries the echoed ticker and country so the caller can confirm the parameters that were searched, along with a human-readable hint string. When a date_from or date_to filter was supplied, the active date bounds are also echoed and the hint clarifies that the empty result is specific to the requested range — flags may exist outside it.

{ "data": [], "meta": { "total": 0, "page": 1, "per_page": 50, "coverage": { "ticker": "AAPL", "country": "US", "hint": "No flags of this type were found for AAPL (US)." } } }

Response Shape — no flags found (with date range)

{ "data": [], "meta": { "total": 0, "page": 1, "per_page": 50, "coverage": { "ticker": "AAPL", "country": "US", "date_from": "2024-01-01", "date_to": "2024-06-30", "hint": "No flags of this type were found for AAPL (US) in the requested date range. Flags may exist outside the specified range." } } }
fundamentals_analysis

Retrieves fundamental business risk flags for a company identified by ticker and country — the full set shown on the web Fundamentals tab, spanning the entire fundamental_business category (declining sales and margins, going-concern letters, financial distress and high leverage, customer/supplier concentration, competitive and country risk, and AI/competitive positioning shifts). Returns paginated flag records, each containing the flag date, severity, title, description, sources, and a metadata map whose shape varies by flag type.

Input Parameters

Parameter Type Required Description
ticker string required Company ticker symbol (e.g. AAPL)
country string required ISO 3166-1 alpha-2 country code (e.g. US)
date_from string optional Start of date range — ISO 8601 format (YYYY-MM-DD)
date_to string optional End of date range — ISO 8601 format (YYYY-MM-DD)
page integer optional Page number. Defaults to 1
per_page integer optional Results per page. Defaults to 50, max 100

Response Shape — flags found

{ "data": [ { "date": "2024-03-15", "severity": "high", "title": "...", "description": "...", "flag_type": "going_concern_letter", "company": { "id": 1234, "name": "Acme Corp", "ticker": "ACME", "exchange": "NASDAQ", "isins": ["US0123456789"], "ciks": ["0001234567"] }, "sources": ["..."], "metadata": { } } ], "meta": { "total": 7, "page": 1, "per_page": 50 } }

Response Shape — no flags found

When data is empty, meta.coverage is included as a hint. It carries the echoed ticker and country so the caller can confirm the parameters that were searched, along with a human-readable hint string. When a date_from or date_to filter was supplied, the active date bounds are also echoed and the hint clarifies that the empty result is specific to the requested range — flags may exist outside it.

{ "data": [], "meta": { "total": 0, "page": 1, "per_page": 50, "coverage": { "ticker": "AAPL", "country": "US", "hint": "No flags of this type were found for AAPL (US)." } } }

Response Shape — no flags found (with date range)

{ "data": [], "meta": { "total": 0, "page": 1, "per_page": 50, "coverage": { "ticker": "AAPL", "country": "US", "date_from": "2024-01-01", "date_to": "2024-06-30", "hint": "No flags of this type were found for AAPL (US) in the requested date range." } } }
fraud_and_malfeasance

Retrieves fraud & malfeasance flags for a company identified by ticker and country — combining two categories: illegal_or_questionable (fraud, illegal activity, stock manipulation, investigations, regulatory scrutiny, civil lawsuits) and questionable_associations (problematic shareholders, underwriters, business partners, SPAC/reverse-merger history, stock promoters, and listing-jurisdiction risk). Returns paginated flag records, each containing the flag date, severity, title, description, sources, and a metadata map whose shape varies by flag type.

Input Parameters

Parameter Type Required Description
ticker string required Company ticker symbol (e.g. AAPL)
country string required ISO 3166-1 alpha-2 country code (e.g. US)
date_from string optional Start of date range — ISO 8601 format (YYYY-MM-DD)
date_to string optional End of date range — ISO 8601 format (YYYY-MM-DD)
page integer optional Page number. Defaults to 1
per_page integer optional Results per page. Defaults to 50, max 100

Response Shape — flags found

{ "data": [ { "date": "2024-03-15", "severity": "high", "title": "...", "description": "...", "flag_type": "business_fraud", "company": { "id": 1234, "name": "Acme Corp", "ticker": "ACME", "exchange": "NASDAQ", "isins": ["US0123456789"], "ciks": ["0001234567"] }, "sources": ["..."], "metadata": { } } ], "meta": { "total": 5, "page": 1, "per_page": 50 } }

Response Shape — no flags found

When data is empty, meta.coverage is included as a hint. It carries the echoed ticker and country so the caller can confirm the parameters that were searched, along with a human-readable hint string. When a date_from or date_to filter was supplied, the active date bounds are also echoed and the hint clarifies that the empty result is specific to the requested range — flags may exist outside it.

{ "data": [], "meta": { "total": 0, "page": 1, "per_page": 50, "coverage": { "ticker": "AAPL", "country": "US", "hint": "No flags of this type were found for AAPL (US)." } } }

Response Shape — no flags found (with date range)

{ "data": [], "meta": { "total": 0, "page": 1, "per_page": 50, "coverage": { "ticker": "AAPL", "country": "US", "date_from": "2024-01-01", "date_to": "2024-06-30", "hint": "No flags of this type were found for AAPL (US) in the requested date range." } } }
management_background

Retrieves management track-record & background flags for a company identified by ticker and country — the full management_track_record category: executive and board turnover, prior bankruptcies/delistings, related-party transactions and insider enrichment, nepotism, poor capital allocation, insider buying/selling behaviour, and related governance signals. Returns paginated flag records, each containing the flag date, severity, title, description, sources, and a metadata map whose shape varies by flag type.

Input Parameters

Parameter Type Required Description
ticker string required Company ticker symbol (e.g. AAPL)
country string required ISO 3166-1 alpha-2 country code (e.g. US)
date_from string optional Start of date range — ISO 8601 format (YYYY-MM-DD)
date_to string optional End of date range — ISO 8601 format (YYYY-MM-DD)
page integer optional Page number. Defaults to 1
per_page integer optional Results per page. Defaults to 50, max 100

Response Shape — flags found

{ "data": [ { "date": "2024-03-15", "severity": "high", "title": "...", "description": "...", "flag_type": "ceo_turnover", "company": { "id": 1234, "name": "Acme Corp", "ticker": "ACME", "exchange": "NASDAQ", "isins": ["US0123456789"], "ciks": ["0001234567"] }, "sources": ["..."], "metadata": { } } ], "meta": { "total": 9, "page": 1, "per_page": 50 } }

Response Shape — no flags found

When data is empty, meta.coverage is included as a hint. It carries the echoed ticker and country so the caller can confirm the parameters that were searched, along with a human-readable hint string. When a date_from or date_to filter was supplied, the active date bounds are also echoed and the hint clarifies that the empty result is specific to the requested range — flags may exist outside it.

{ "data": [], "meta": { "total": 0, "page": 1, "per_page": 50, "coverage": { "ticker": "AAPL", "country": "US", "hint": "No flags of this type were found for AAPL (US)." } } }

Response Shape — no flags found (with date range)

{ "data": [], "meta": { "total": 0, "page": 1, "per_page": 50, "coverage": { "ticker": "AAPL", "country": "US", "date_from": "2024-01-01", "date_to": "2024-06-30", "hint": "No flags of this type were found for AAPL (US) in the requested date range." } } }
kpi_snapshot

Retrieves the most recent KPI per metric for a company identified by ticker and country. Returns one entry per distinct metric (e.g. Revenue, EPS, Active Users), each showing the value from the most recent source document. KPIs are extracted from earnings call transcripts and podcast episodes, and every entry names its origin in document_type. Because only the newest value per metric is returned, a recent podcast figure can take the place of an earnings-call one — pass document_type=call_transcript for the earnings-call-only view. Supports filtering by metric type and date range. Use the after / before cursors for pagination. Use id values from the response entries to fetch full historical time series with the kpi_history tool.

Input Parameters

Parameter Type Required Description
ticker string required Company ticker symbol (e.g. AAPL)
country string required ISO 3166-1 alpha-2 country code (e.g. US)
type string optional Filter by metric type: financial or non_financial
date_from string optional Only include metrics whose most recent filing is on or after this date — ISO 8601 (YYYY-MM-DD)
date_to string optional Only include metrics whose most recent filing is on or before this date — ISO 8601 (YYYY-MM-DD)
limit integer optional Results per page. Defaults to 25, max 100
after string optional Opaque cursor for forward pagination (from meta.after of the previous response)
before string optional Opaque cursor for backward pagination (from meta.before of the previous response)
document_type string optional Filter by source document type: call_transcript or podcast. Omit to include both

Response Shape

{ "data": [ { "id": "281522b1-f3a8-48ce-9d7b-10d1e52a9f7f", "metric": "Revenue", "document_id": "171695c9-98c6-40dc-bc39-b4d171308803", "document_type": "call_transcript", "type": "financial", "filing_date": "2026-01-29", "value": "$143.8 billion", "period": "Q1 2026", "commentary": "Up 16% year-over-year, a best-ever quarter." } ], "meta": { "after": "<opaque_cursor>", "before": null } }
kpi_history

Retrieves the full historical time series for a specific KPI metric identified by the id of any entry returned by kpi_snapshot. Returns all historical values for that metric and company, ordered from most recent to oldest. Values are extracted from earnings call transcripts and podcast episodes, and every entry names its origin in document_type — pass document_type to restrict the series to a single source. Supports date range filtering and cursor-based pagination.

Input Parameters

Parameter Type Required Description
id string required UUID of any KPI entry returned by kpi_snapshot
date_from string optional Start of date range — ISO 8601 format (YYYY-MM-DD)
date_to string optional End of date range — ISO 8601 format (YYYY-MM-DD)
limit integer optional Results per page. Defaults to 25, max 100
after string optional Opaque cursor for forward pagination
before string optional Opaque cursor for backward pagination
document_type string optional Filter by source document type: call_transcript or podcast. Omit to include both

Response Shape

{ "data": [ { "id": "281522b1-f3a8-48ce-9d7b-10d1e52a9f7f", "metric": "Revenue", "document_type": "call_transcript", "type": "financial", "filing_date": "2026-01-29", "value": "$143.8 billion", "period": "Q1 2026", "commentary": "Up 16% year-over-year, a best-ever quarter." }, { "id": "a9f1c2d3-...", "metric": "Revenue", "document_type": "podcast", "type": "financial", "filing_date": "2025-01-30", "value": "$124.3 billion", "period": "Q1 2025", "commentary": null } ], "meta": { "after": null, "before": null } }

Searches Canary documents by company, type, date, and optional keywords, returning the newest matches with document metadata, matching sentence snippets, page metadata, and a canary_url. The URL opens the same search in the Canary web app with that document selected, so the user can View in Canary to read the full document and keep exploring the results on the web. It carries the search filters as query parameters (resolved entityIds, compactly encoded keywords, types and typeGroups) that the web app restores on open.

Each keyword has text and optional exact. Exact keywords skip synonym expansion but retain stemming and adjacent-phrase matching. Exact and non-exact keywords may be mixed and combined with AND or OR. Omit document_types or pass an empty array ([]) to use Canary's current defaults; call list_document_types only when a specific type is needed. Request the next page until data is empty. Invalid filters are rejected without exposing upstream errors.

Input Parameters

Parameter Type Required Description
keywords array optional Up to ten {"text": "...", "exact": false} objects. Omit or pass [] to search without keywords
operator string optional AND or OR. Defaults to AND
ticker, country string optional Company filter; when used, both fields are required
document_types array optional Leaf names returned by list_document_types. Summary-bearing types use canonical names such as call_transcript and podcast; other types retain catalog labels such as 10-K and Slides. Omission or an empty array ([]) uses defaults
date_from, date_to string optional Inclusive filing-date bounds in YYYY-MM-DD format
page integer optional 1-based page number. Defaults to 1
limit integer optional Results per page, 1–25. Defaults to 10

Example

{ "keywords": [ { "text": "operating margin", "exact": true }, { "text": "guidance", "exact": false } ], "operator": "AND", "ticker": "AAPL", "country": "US", "date_from": "2025-01-01" }

Response Shape

{ "data": [ { "document_id": "171695c9-98c6-40dc-bc39-b4d171308803", "title": "Example filing", "document_type": "10-K", "filing_date": "2026-03-01T00:00:00Z", "ticker": "AAPL", "canary_url": "https://app.canary-data.com/documents?keywords=operating%20margin,AND,~guidance:outlook&from=2025-01-01&entityIds=4a1d0f52-1f3c-4b1f-9a3a-0b1f9c2d5e77&types=&typeGroups=Common+Docs,Call+Transcripts&documentId=171695c9-98c6-40dc-bc39-b4d171308803", "snippets": [{ "text": "Operating margin increased ..." }] } ], "meta": { "page": 1, "limit": 10 } }
list_document_types

Lists all searchable leaf document types, their categories, and default_types. This tool takes no input. Use it before document_search only when the search needs a specific document type.

Response Shape

{ "types": ["10-K", "call_transcript"], "categories": [ { "label": "Common Docs", "types": ["10-K"] }, { "label": "Call Transcripts", "types": ["call_transcript"] } ], "default_types": ["10-K", "call_transcript"] }
document_summary

Retrieves the stored summary for one document. Pass the document_id from document_search or document_summaries, not the summary ID. Returns an error if no summary is available; it does not generate a summary or retrieve the full document.

Input Parameters

ParameterTypeRequiredDescription
document_id string required Source document UUID

Response

A single object containing id (summary ID), document_id, filing_date, document_type, and summary. Summary content is returned as structured JSON when stored in that format, otherwise as plain text.

document_summaries

Retrieves the most recent document summaries for a company identified by ticker and country. Summaries are generated from the company's earnings call transcripts and podcast episodes, and returned newest-first. Each entry contains the summary content along with the source document_id, its filing_date, and the document_type it came from — pass document_type to restrict results to a single source. Supports date range filtering and cursor-based pagination via the after / before cursors.

Input Parameters

Parameter Type Required Description
ticker string required Company ticker symbol (e.g. AAPL)
country string required ISO 3166-1 alpha-2 country code (e.g. US)
date_from string optional Only include summaries whose filing is on or after this date — ISO 8601 (YYYY-MM-DD)
date_to string optional Only include summaries whose filing is on or before this date — ISO 8601 (YYYY-MM-DD)
limit integer optional Results per page. Defaults to 25, max 100
after string optional Opaque cursor for forward pagination (from meta.after of the previous response)
before string optional Opaque cursor for backward pagination (from meta.before of the previous response)
document_type string optional Filter by source document type: call_transcript or podcast. Omit to include both

Response Shape

summary is a structured object with the sections business_performance, outlook, changes_from_previous_call, challenges, and opportunities. Legacy plain-text summaries are returned as a string.

{ "data": [ { "id": "7f9a36de-8359-4dca-aeff-2e2dc495350b", "document_id": "171695c9-98c6-40dc-bc39-b4d171308803", "filing_date": "2026-01-29", "document_type": "call_transcript", "summary": { "business_performance": { "narrative_summary": "...", "financial_metrics_table": [ ... ] }, "outlook": { "summary": { "description": "..." }, "highlights": [ ... ] }, "changes_from_previous_call": [ ... ], "challenges": [ ... ], "opportunities": [ ... ] } } ], "meta": { "after": "<opaque_cursor>", "before": null } }
document_topics

Lists the most recent topics discussed in a company's earnings call transcripts and podcast episodes, identified by ticker and country. Returns one entry per company-specific topic, newest-first, each with its category, document_count (how many of the company's documents mentioned it), and up to 5 example mentions (the spoken sentences). A topic can span both source types, so the topic itself carries no document_type — each individual mention names the document it came from. Pass document_type to restrict both the topics and their mentions to one source, in which case document_count counts only documents of that type. Use a topic id with the document_topic_mentions tool to page through all of its mentions. Supports date range filtering and cursor-based pagination.

Input Parameters

Parameter Type Required Description
ticker string required Company ticker symbol (e.g. AAPL)
country string required ISO 3166-1 alpha-2 country code (e.g. US)
date_from string optional Only include topics with a mention on or after this date — ISO 8601 (YYYY-MM-DD)
date_to string optional Only include topics with a mention on or before this date — ISO 8601 (YYYY-MM-DD)
limit integer optional Topics per page. Defaults to 20, max 100
after string optional Opaque cursor for forward pagination (from meta.after of the previous response)
before string optional Opaque cursor for backward pagination (from meta.before of the previous response)
document_type string optional Filter by source document type: call_transcript or podcast. Restricts the topics, their mentions, and document_count. Omit to include both

Response Shape

{ "data": [ { "id": "0061f585-aab0-434a-ad5c-3f7b8af116fd", "label": "Paid Subscriptions Growth", "category": "Product", "description": null, "document_count": 3, "mentions": [ { "document_id": "171695c9-98c6-40dc-bc39-b4d171308803", "filing_date": "2026-01-29", "document_type": "call_transcript", "speaker": "Kevan Parekh", "sentences": ["Paid subscriptions also grew double digits."] } ] } ], "meta": { "after": "<opaque_cursor>", "before": null } }
document_topic_mentions

Lists all mentions of a single topic across a company's earnings call transcripts and podcast episodes. Use the topic_id of any entry returned by document_topics to page through every mention (the spoken sentences) of that topic for the company, ordered from most recent to oldest. Each mention names the document_type it came from — pass document_type to restrict mentions to a single source. Supports date range filtering and cursor-based pagination.

Input Parameters

Parameter Type Required Description
topic_id string required UUID of a topic returned by document_topics
ticker string required Company ticker symbol (e.g. AAPL)
country string required ISO 3166-1 alpha-2 country code (e.g. US)
date_from string optional Start of date range — ISO 8601 format (YYYY-MM-DD)
date_to string optional End of date range — ISO 8601 format (YYYY-MM-DD)
limit integer optional Mentions per page. Defaults to 20, max 100
after string optional Opaque cursor for forward pagination
before string optional Opaque cursor for backward pagination
document_type string optional Filter by source document type: call_transcript or podcast. Omit to include both

Response Shape

{ "data": [ { "document_id": "171695c9-98c6-40dc-bc39-b4d171308803", "filing_date": "2026-01-29", "document_type": "call_transcript", "speaker": "Kevan Parekh", "sentences": ["Paid subscriptions also grew double digits."] } ], "meta": { "after": "<opaque_cursor>", "before": null } }
superanalyst_questions_list

Lists active SuperAnalyst questions for a company identified by ticker and country. Returns questions grouped by category (Market, Business Performance, Unit Economics, Competition, Accounting, Insider Behavior, Challenges, Opportunities). Each entry includes a 1-based display order, a stable id (UUID), the question text, and a why_important explanation. Pass the id to superanalyst_research_plan to retrieve the full research plan — order is a display label only and must not be used as a selector.

Input Parameters

Parameter Type Required Description
ticker string required Company ticker symbol (e.g. AAPL)
country string required ISO 3166-1 alpha-2 country code (e.g. US)

Response Shape

{ "data": [ { "category": "Business Performance", "questions": [ { "order": 1, "id": "3fa85f64-5717-4562-b3fc-2c963f66afa6", "question": "...", "why_important": "..." } ] } ] }
superanalyst_research_plan

Returns the research plan for a single SuperAnalyst question selected by its stable id. Use superanalyst_questions_list first to retrieve available questions and their id values. Pass the id from the question the user referred to — order is a display label only. If the requested id is no longer present (question archived or replaced), re-list to get current questions.

Input Parameters

Parameter Type Required Description
ticker string required Company ticker symbol (e.g. AAPL)
country string required ISO 3166-1 alpha-2 country code (e.g. US)
id string required Stable UUID of the question, from superanalyst_questions_list

Response Shape

{ "question": "...", "category": "Business Performance", "plan": "...", "unit_economic_variables": ["...", "..."], "actions": ["...", "..."] }
superanalyst_monitoring_plan

Returns the SuperAnalyst monitoring plan for a company identified by ticker and country. The plan groups KPIs into sales, costs, and optionally other_key_metrics. Each KPI includes a list of monitoring methods with a name and rationale (why). Use this to understand how to track key business drivers ahead of earnings.

Input Parameters

Parameter Type Required Description
ticker string required Company ticker symbol (e.g. AAPL)
country string required ISO 3166-1 alpha-2 country code (e.g. US)

Response Shape

{ "data": { "plan": { "sales": [ { "kpi_name": "Global Paid Memberships", "methods": [ { "name": "Credit Card Transaction Analysis", "why": "Track subscriber payment patterns" } ] } ], "costs": [ { "kpi_name": "Content Spend", "methods": [ { "name": "Production Activity Monitoring", "why": "Track production volume and costs" } ] } ], "other_key_metrics": [ { "kpi_name": "User Engagement", "methods": [ { "name": "Content Release Tracking", "why": "Monitor content availability and engagement" } ] } ] } } }
business_description

Returns the business description for a company identified by ticker and country: five sections covering business_model, market, competition, challenges and opportunities. Each section has its text, or is null until it has been generated. Charts are not included. Coverage is limited to the SuperAnalyst universe; a company outside it, or one with no overview yet, returns an error rather than an empty result.

Input Parameters

Parameter Type Required Description
ticker string required Company ticker symbol (e.g. AAPL)
country string required ISO 3166-1 alpha-2 country code (e.g. US)

Response Shape

{ "data": { "business_model": { "text": "..." }, "market": { "text": "..." }, "competition": { "text": "..." }, "challenges": { "text": "..." }, "opportunities": null } }
key_debates_list

Lists key debates (bull/bear cases) for a company identified by ticker and country. Returns a lightweight summary of each debate — title, description, and 1-based order. Use key_debates_detail with a debate's order to retrieve the full bull/bear cases and supporting evidence.

Input Parameters

Parameter Type Required Description
ticker string required Company ticker symbol (e.g. AAPL)
country string required ISO 3166-1 alpha-2 country code (e.g. US)

Response Shape

{ "data": [ { "title": "...", "description": "...", "order": 1 } ] }
key_debates_detail

Returns the full bull/bear debate for a single key debate selected by its order. Use key_debates_list first to retrieve available debates and their order values. The order field is 1-based and may shift between regenerations — if the requested order is no longer present, re-list to get current debates.

Input Parameters

Parameter Type Required Description
ticker string required Company ticker symbol (e.g. AAPL)
country string required ISO 3166-1 alpha-2 country code (e.g. US)
order integer required 1-based debate order from key_debates_list

Response Shape

{ "title": "...", "description": "...", "bull_case": "...", "bull_evidence": ["...", "..."], "bear_case": "...", "bear_evidence": ["...", "..."], "order": 1, "metadata": {} }

Supported Markets

Global public equity markets.

When a query returns zero results, the response includes a meta.coverage object with a hint field. This makes the empty-result state unambiguous — an AI agent can surface the hint directly rather than silently treating the absence of data as a confirmed lack of flags. When a date range was active, the hint distinguishes between "no flags in this window" and "no flags at all", so agents do not draw incorrect conclusions about coverage.

Data Freshness

Data is updated daily.

Rate Limits

Limit 120 requests per minute per access token
Exceeded HTTP 429 Too Many Requests with a Retry-After header

Connect your assistant

The Canary Data MCP server supports the Streamable HTTP transport and authenticates via OAuth 2.0. It works with Claude, ChatGPT and Codex — pick your assistant below. On first use you will be asked to sign in with your Canary Data MCP credentials.

MCP server URL

https://api.canary-data.com/mcp

Claude

Claude.ai — Team & Enterprise

Navigate to the connectors page and add the Canary Data MCP server using the URL above.

Claude Desktop — Free & Pro

From Claude settings > Connectors, add a new connector and enter the MCP server URL above. Claude will guide you through the OAuth login flow on first connection.

Claude Code

claude mcp add --transport http canary-data https://api.canary-data.com/mcp

Then run /mcp in your Claude Code session to complete the OAuth authentication flow.

ChatGPT

ChatGPT — Apps & Connectors

Find Canary Data in ChatGPT's app directory and connect it, or from Settings > Apps & Connectors add a connector with the MCP server URL above. ChatGPT opens the Canary Data sign-in on first use; the tools you see are the ones granted to your account.

ChatGPT desktop app — MCP servers

From Settings > MCP servers, choose Add server, pick Streamable HTTP, enter the MCP server URL above, then select Authenticate.

Codex

Codex CLI

codex mcp add canary-data --url https://api.canary-data.com/mcp codex mcp login canary-data

Or add it to ~/.codex/config.toml:

[mcp_servers.canary-data] url = "https://api.canary-data.com/mcp" auth = "oauth"

Authentication

Protocol OAuth 2.0 with PKCE (RFC 7636) — authorization code flow
Authorization GET /authorize
Token endpoint POST /token
MCP transport Streamable HTTP at https://api.canary-data.com/mcp, Bearer token required
Access token TTL 5 minutes — clients refresh silently
Refresh token TTL 30 days (rotating)