Skip to content
verify mcp Beta VerifyMCP is currently in beta. If you notice any issues, get in touch and we’ll put it right.

io.github.tickerbot/mcp-server

REMOTE · API.TICKERBOT.IO · 2 COMPONENTS · SCANNED OCT 5

The stock market, in SQL — scan, replay, or subscribe across ~12k US tickers and top 100 cryptos.

−1 this week 81 Trust /100
Trust breakdown (7 categories)

How this component scores in each security and reliability category. Every signal is checked automatically against the live server, and we only credit what we can confirm. How we score → Why this is hard to score →

Endpoint Security89
Transport & Reachability100
Schema Quality & AI Usability62
  • AI-judged instruction clarity (excellent).Pass
  • Context-footprint check failed: tool/resource definitions use about 12250 tokens (~382/item across 32 items; 32 tools + 0 resources), over budget; trim descriptions and params. See how to fix → Fail
  • Usage-examples check failed: none of the tools include examples. See how to fix → Fail
Stability & Change Management70
  • Stability check failed: schema churn in the 30 days we've observed: 9 tool removals, 3 breaking changes, 0 auth/transport breaks, 6 additions. See how to fix → Fail
Tool Coverage100
  • 100% of tools have a non-trivial description (not blank, and not just the tool's name).Pass
  • 100% of tool parameters carry a description.Pass
  • Structured output schemas are declared (91% of tools); any adoption earns full credit.Pass
Tool Safety75
  • No prompt-injection markers were found in the server instructions, tool names or descriptions we captured.Pass
  • 0 of 4 tool(s) whose name or description implies an irreversible operation declare an MCP destructiveHint annotation; "tickerbot_delete_custom_signal" implies "delete" and declares no destructiveHint at all, which the MCP spec reads as destructive by default. See how to fix → Fail
  • An AI judge read all 32 captured unit(s) of tool text and found none that tries to manipulate the model reading it.Pass
Capabilities60
  • Spec-recency check failed: implements MCP spec 2025-06-18; the latest is 2026-07-28. See how to fix → Fail
Install

How do I install the io.github.tickerbot/mcp-server server?

io.github.tickerbot/mcp-server is a hosted endpoint at https://api.tickerbot.io/mcp, so there is nothing to install locally. Ready-made configuration for Claude, Cursor, VS Code, Codex and 5 more is on this page, copied from each client's own documentation.

remote · api.tickerbot.io

# add to Claude Code
claude mcp add --transport http tickerbot-mcp-server 'https://api.tickerbot.io/mcp'
// .cursor/mcp.json
{
  "mcpServers": {
    "tickerbot-mcp-server": {
      "url": "https://api.tickerbot.io/mcp"
    }
  }
}
// .vscode/mcp.json
{
  "servers": {
    "tickerbot-mcp-server": {
      "type": "http",
      "url": "https://api.tickerbot.io/mcp"
    }
  }
}
# ~/.codex/config.toml
[mcp_servers.tickerbot-mcp-server]
url = "https://api.tickerbot.io/mcp"
// opencode.json
{
  "$schema": "https://opencode.ai/config.json",
  "mcp": {
    "tickerbot-mcp-server": {
      "type": "remote",
      "url": "https://api.tickerbot.io/mcp",
      "enabled": true
    }
  }
}
# add to OpenClaw
openclaw mcp add tickerbot-mcp-server --url 'https://api.tickerbot.io/mcp' --transport streamable-http
# ~/.hermes/config.yaml
mcp_servers:
  tickerbot-mcp-server:
    url: "https://api.tickerbot.io/mcp"
// ~/.netclaw/config/netclaw.json
{
  "McpServers": {
    "tickerbot-mcp-server": {
      "Transport": "http",
      "Url": "https://api.tickerbot.io/mcp"
    }
  }
}
# add to Vellum
assistant mcp add tickerbot-mcp-server -t streamable-http -u 'https://api.tickerbot.io/mcp'
// mcp.json
{
  "mcpServers": {
    "tickerbot-mcp-server": {
      "type": "http",
      "url": "https://api.tickerbot.io/mcp"
    }
  }
}

The mcpServers block is a cross-client convention. Remote transports vary, so check your client's docs.

Changelog

Every change we have recorded for this component, newest first. Security-relevant changes are always shown. ▲ marks a change for the better, ▼ a change for the worse; unmarked changes are neutral.

  • 3 Oct 26 0
    • “tickerbot_get_signal” reworded the description of “interval” cosmetic
    • “tickerbot_get_ticker” reworded the description of “asof” cosmetic
    • “tickerbot_get_ticker” reworded the description of “interval” cosmetic
    • “tickerbot_list_events” reworded the description of “interval” cosmetic
    • “tickerbot_list_events” reworded the description of “join” cosmetic
    • “tickerbot_scan” reworded the description of “asof” cosmetic
    • “tickerbot_scan” reworded the description of “interval” cosmetic
    • “tickerbot_scan” reworded the description of “universe” cosmetic
    • “tickerbot_get_series” reworded the description of “asof” cosmetic
    • “tickerbot_get_signal” reworded the description of “asof” cosmetic
    • “tickerbot_get_bars” reworded the description of “asof” cosmetic
    • “tickerbot_get_series” reworded the description of “interval” cosmetic

    12 cosmetic changes on this day. Switch on “Show cosmetic changes” to see them.

  • 2 Oct 26 0
    • “tickerbot_scan” reworded the description of “universe” cosmetic

    1 cosmetic change on this day. Switch on “Show cosmetic changes” to see it.

  • 30 Sept 26 −1
    • “tickerbot_scan” reworded the description of “universe” cosmetic
    • “tickerbot_list_events” reworded the description of “kind” cosmetic

    2 cosmetic changes on this day. Switch on “Show cosmetic changes” to see them.

  • 29 Sept 26 0
    • Tool “tickerbot_get_ticker_coverage” rewrote its description, which is the text the model reads security
  • 28 Sept 26 0
    • We updated how we score, so this day's move reflects our rubric, not a change to the server See what changed → functional
  • 27 Sept 26 0
    • “tickerbot_create_custom_signal” reworded the description of “expr” cosmetic
    • “tickerbot_update_custom_signal” reworded the description of “expr” cosmetic

    2 cosmetic changes on this day. Switch on “Show cosmetic changes” to see them.

  • 25 Sept 26 0
    • We updated how we score, so this day's move reflects our rubric, not a change to the server See what changed → functional
  • 24 Sept 26 0
    • Tool “tickerbot_get_signal” rewrote its description, which is the text the model reads security
    • “tickerbot_get_signal” reworded the description of “signal” cosmetic
    • “tickerbot_get_signal” reworded the description of “condition” cosmetic
    • “tickerbot_subscribe_signal” reworded the description of “condition” cosmetic
    • “tickerbot_scan” reworded the description of “universe” cosmetic
Diagnostics

Diagnostic detail from the automated scan of this channel: what the scanner observed at each step, so you can see exactly where a check passed or failed. It is informational only and never changes the trust score.

Captured 8 Oct 2026 · Probed https://api.tickerbot.io/mcp

TLS valid

Negotiated TLS 1.3 with TLS_AES_128_GCM_SHA256 .

Subject Issuer Valid from Valid until Key Signature Serial
CN=api.tickerbot.io CN=YE2,O=Let's Encrypt,C=US 12 Sept 2026 11 Dec 2026 ECDSA 256 ECDSA-SHA384 6a9b724237f1a73a10a834d941a40fa0d66
SANs: api.tickerbot.io
CN=YE2,O=Let's Encrypt,C=US (CA) CN=Root YE,O=ISRG,C=US 3 Sept 2025 2 Sept 2028 ECDSA 384 ECDSA-SHA384 4df3b15dd6c0784c507cd37b58e6f115
CN=Root YE,O=ISRG,C=US (CA) CN=ISRG Root X2,O=Internet Security Research Group,C=US 13 May 2026 2 Sept 2032 ECDSA 384 ECDSA-SHA384 872165fc34b6e5fba8add5b3705fb53a
CN=ISRG Root X2,O=Internet Security Research Group,C=US (CA) CN=ISRG Root X1,O=Internet Security Research Group,C=US 13 May 2026 2 Sept 2032 ECDSA 384 SHA256-RSA 6c8f1dc727c7117f7baf853ac980f9cd

Background: What to check on a remote MCP endpoint →

DNSSEC insecure

Validation of api.tickerbot.io. — Not signed

Zone DS Keys Algorithms Outcome
. trust_anchor 20326, 38696 8, 8 Verified
io. present 57355 8 Verified
tickerbot.io. absent Unsigned (proven) parent-signed NSEC/NSEC3 proves an unsigned delegation
Authentication Enforced and verified

The endpoint asked for a token and published valid RFC 9728 metadata describing how to get one.

Result Enforced and verified
Enforced On connection
HTTP status 401

WWW-Authenticate challenge Bearer realm="mcp", resource_metadata="https://api.tickerbot.io/.well-known/oauth-protected-resource"

Bearer realm="mcp", resource_metadata="https://api.tickerbot.io/.well-known/oauth-protected-resource"
Header Value
www-authenticate Bearer realm="mcp", resource_metadata="https://api.tickerbot.io/.well-known/oauth-protected-resource"

Protected resource metadata

Document https://api.tickerbot.io/.well-known/oauth-protected-resource
Retrieved Yes
Resource https://api.tickerbot.io/mcp
Authorisation server https://api.tickerbot.io

Background: How OAuth 2.1 works in the 2026 MCP spec →

Transports 2 probes
Transport URL Outcome Status Location
streamable-http https://api.tickerbot.io/mcp Auth required 401
http (plaintext) http://api.tickerbot.io/mcp HTTPS enforced 301 https://api.tickerbot.io/mcp
MCP tools · 32 exposed · ~12,250 tokens

The tools this component advertises to a client, with an estimated token cost for each. Expand a tool to see its parameters and schema. The per-tool counts are indicative and are not scored directly; the schema's total context footprint is one signal in Schema Quality & AI Usability. A tool's description is untrusted text the model reads on every call, which is what makes this list a security surface and not just an inventory: how tool poisoning works →

Tool Tokens
tickerbot_create_custom_signal ~436

A named boolean predicate you can reference anywhere a built-in signal goes.

NameTypeReqDescription
descriptionstring–Free-form notes. Max 500 chars. Absent or empty comes back as `""` rather than null.
exprstringyesBoolean SQL predicate. May reference built-in signals and other custom signals you own. Must evaluate to true/false. Max 4000 chars. Stricter grammar than scan `q`: comparisons, `AND`/`OR`/`NOT`, `IN…
namestringyesSlug — `^[a-z][a-z0-9_]{0,63}$`. Must not collide with any built-in signal name, and 15 names are reserved outright: `columns`, plus the `/v2/series` OHLCV aliases `open`/`high`/`low`/`close`/`volume…
NameTypeReqDescription
_metaobject–Only when `expr` named a column under its pre-2026-09-07 spelling: `deprecated_columns` lists each one (`requested`, `use`, `note`). The stored `expr` carries the current name.
as_ofstringyesServer time this response was assembled (ISO 8601).
signalobjectyesThe stored signal: `name`, `kind` (`custom`), `description`, `expr` (your predicate as stored), `created_at`, `updated_at`.

No examples provided.

tickerbot_create_universe ~230

Create a named ticker list owned by your account.

NameTypeReqDescription
descriptionstring–Free-form notes, up to 500 characters. Stored as `""` when omitted.
idstring–Optional slug — becomes the universe's permanent handle everywhere (`?universe=`, subscribe `universe`, CRUD path). Pattern `^[a-z][a-z0-9_]{0,62}$` — starts with a lowercase letter, then lowercase l…
namestringyesHuman-readable label, up to 80 characters. Display-only — never used to reference the universe.
tickersarrayyesTicker symbols, up to 10,000. Validated against the active universe. `[]` is accepted — a shell universe you can fill later via PATCH.
NameTypeReqDescription
as_ofstringyesServer time this response was assembled (ISO 8601).
created_atnumberyesCreation timestamp.
descriptionstringyesFree-form notes; `""` when unset.
effective_atnumber–System universes only; absent on yours.
idstringyesThe slug — the universe's handle in `?universe=`.
namestringyesDisplay label.
next_rebalance_atnumber–System universes only; absent on yours.
rebalance_methodstring–System universes only; absent on yours.
sizenumberyesMember count.
systembooleanyes`false` — this is your universe.
tickersarrayyesMembers, after this call.
updated_atnumberyesLast modification timestamp.

No examples provided.

tickerbot_create_webhook ~481

Canonical create: a webhook is a trigger plus a delivery. Trigger shapes: scan {type:"scan", q, universe?}; ticker {type:"ticker", ticker, condition}; signal {type:"signal", signal, ticker?, universe?, condition?}; event {type:"event", kinds, tickers?, universe?, event_q?}. The subscribe tools are flat sugar over exactly this. Webhooks need a paid plan (Free has no webhook slots).

NameTypeReqDescription
cadencestring–Evaluation cadence — a user preference — never gated. Event triggers deliver on ingest — only `realtime` is accepted on them (400 otherwise).
channelstring–Delivery channel. See Delivery channels.
columnsstring–Extra columns echoed in fired payloads' match rows (`fields` accepted as an alias). Not accepted on `event` triggers (400) — event deliveries carry the event payload, not state rows.
device_idstring–Registered device id (channel `mobile_push`, see /v2/devices).
dirstring–Sort direction for `order`. Not accepted on `event` triggers (400).
discord_urlstring–Discord webhook URL (channel `discord`).
namestring–Display name, max 80 characters. Defaults to an auto-generated one from the trigger.
orderstring–Signal the fired payload's match lists are sorted by before the 100-row cap is applied — so a truncated list is the deterministic top 100, not an arbitrary sample. Same contract as `POST /v2/scan`. N…
target_urlstring–HTTPS delivery URL (the `webhook` channel), max 1024 characters. Omit for in-app delivery, or use `channel` + `discord_url`/`device_id` for other channels.
triggerobjectyesWhat fires the webhook. A discriminated object — `trigger.type` picks the shape, and the fields below belong inside it. Each shape is also available as a flat-params shortcut: `POST /v2/scan/subscrib…
NameTypeReqDescription
_metaobject–Returned on create only, and only when the rule or `columns` named a column under its pre-2026-09-07 spelling: `deprecated_columns` lists each one (`requested`, `use`, `note`). The stored rule carrie…
as_ofstringyesServer time this response was assembled (ISO 8601).
cadencestringyesHow often the trigger is evaluated — `realtime`, `hourly`, or `nyse_open`.
channelstringyesWhere deliveries go: `webhook`, `discord`, `in_app`, or `mobile_push`.
channel_configobjectyesReturned on create only: the channel-specific delivery settings as stored (e.g. the Discord URL, the device id).
created_atnumberyesCreation timestamp.
deliverystringyesLegacy alias of `channel`, kept aligned for older readers.
dirstringyesSort direction for that list; `null` means the default (`desc`).
event_kindsarray–Event-trigger webhooks only: the kinds subscribed (`split`, `dividend`, `insider`, `analyst`, `earnings`).
event_qstring–Event-trigger webhooks only: the payload filter, or `null`.
event_tickersarray–Event-trigger webhooks only: the symbols the trigger is scoped to, or `null` for the universe / whole market.
fieldsstringyesExtra signals carried on each fired match row; `null` means the standard set.
idstringyesThe webhook id — `wh_…`, the handle for every other call on this record.
last_errorstring–The last evaluation error; `null` on a healthy hook. The answer to "why is my webhook not firing?".
last_eval_error_atnumber–When the last evaluation error happened; `null` on a healthy hook.
last_evaluated_atnumberyesWhen it was last evaluated; `null` until the first run.
last_firednumberyesWhen a delivery last went out; `null` if it never has.
last_match_setarrayyesTickers matching at the last evaluation — the set the next run is diffed against, which is what makes firing edge-triggered.
last_predicate_valuestringyesThe trigger's value at the last evaluation; `null` until it has run.
namestringyesYour label for the subscription.
next_eval_atnumberyesWhen the evaluator will next consider this subscription.
orderstringyesSort signal for the payload row list; `null` means the evaluator default (`market_cap`).
qstringyesThe stored predicate. Custom signals appear expanded: the SQL is frozen at creation.
rule_idstringyesLegacy link to a v1 alert rule; `null` on everything created through v2.
signing_secretstringyesReturned on create only — shown once, never again. HMAC key for verifying the `X-Tickerbot-Signature` header on deliveries.
sourcestringyesWhich API version created the record; `v2` for anything you create today.
statusstringyes`active` or `disabled`. Auto-disable follows repeated delivery failure.
subscription_originobjectyesWhich door created it — `type` (`ticker`/`signal`/`scan`/`event`), its `ref`, and the `condition` in display form.
target_urlstringyesYour HTTPS endpoint; `null` on every channel except `webhook`.
test_urlstring–Returned on create only: the `POST /v2/webhooks/{id}/test` URL for this record.
trigger_kindstring–Event-trigger webhooks only: `event`.
universe_idstringyesUniverse the trigger is scoped to, or `null` for the whole market.
updated_atnumberyesLast modification timestamp.

No examples provided.

tickerbot_delete_custom_signal ~83

Delete one of your custom signals. Refused by default if another of your signals references it.

NameTypeReqDescription
forceboolean–When `true`, skip the reference check and delete. References will break on next recompile.
signalstringyesCustom signal slug (the signal name). A built-in name answers 404 — built-ins are read-only.

No output schema declared.

No examples provided.

tickerbot_delete_universe ~93

Permanently delete one of your universes. Webhooks that reference the deleted universe fail on their next eval — clean those up first.

NameTypeReqDescription
forceboolean–A universe still referenced by live webhooks refuses to delete with `409 universe_referenced`. Pass `force=true` to delete anyway — those webhooks will match nothing until re-pointed or deleted.
idstringyesUniverse slug.

No output schema declared.

No examples provided.

tickerbot_delete_webhook ~33

Delete a webhook subscription, and its delivery history with it.

NameTypeReqDescription
idstringyesWebhook id.

No output schema declared.

No examples provided.

tickerbot_enable_webhook ~48

Re-enable a disabled webhook and start it clean. Clears match-state, so the next eval treats every currently-matching ticker as new.

NameTypeReqDescription
idstringyesWebhook id.
NameTypeReqDescription
as_ofstringyesServer time this response was assembled (ISO 8601).
cadencestringyesHow often the trigger is evaluated — `realtime`, `hourly`, or `nyse_open`.
channelstringyesWhere deliveries go: `webhook`, `discord`, `in_app`, or `mobile_push`.
created_atnumberyesCreation timestamp.
deliverystringyesLegacy alias of `channel`, kept aligned for older readers.
dirstringyesSort direction for that list; `null` means the default (`desc`).
event_kindsarray–Event-trigger webhooks only: the kinds subscribed (`split`, `dividend`, `insider`, `analyst`, `earnings`).
event_qstring–Event-trigger webhooks only: the payload filter, or `null`.
event_tickersarray–Event-trigger webhooks only: the symbols the trigger is scoped to, or `null` for the universe / whole market.
fieldsstringyesExtra signals carried on each fired match row; `null` means the standard set.
idstringyesThe webhook id — `wh_…`, the handle for every other call on this record.
last_errorstring–The last evaluation error; `null` on a healthy hook. The answer to "why is my webhook not firing?".
last_eval_error_atnumber–When the last evaluation error happened; `null` on a healthy hook.
last_evaluated_atnumberyesWhen it was last evaluated; `null` until the first run.
last_firednumberyesWhen a delivery last went out; `null` if it never has.
last_match_setarrayyesTickers matching at the last evaluation — the set the next run is diffed against, which is what makes firing edge-triggered.
last_predicate_valuestringyesThe trigger's value at the last evaluation; `null` until it has run.
namestringyesYour label for the subscription.
next_eval_atnumberyesWhen the evaluator will next consider this subscription.
orderstringyesSort signal for the payload row list; `null` means the evaluator default (`market_cap`).
qstringyesThe stored predicate. Custom signals appear expanded: the SQL is frozen at creation.
rule_idstringyesLegacy link to a v1 alert rule; `null` on everything created through v2.
sourcestringyesWhich API version created the record; `v2` for anything you create today.
statusstringyes`active` or `disabled`. Auto-disable follows repeated delivery failure.
subscription_originobjectyesWhich door created it — `type` (`ticker`/`signal`/`scan`/`event`), its `ref`, and the `condition` in display form.
target_urlstringyesYour HTTPS endpoint; `null` on every channel except `webhook`.
trigger_kindstring–Event-trigger webhooks only: `event`.
universe_idstringyesUniverse the trigger is scoped to, or `null` for the whole market.
updated_atnumberyesLast modification timestamp.

No examples provided.

tickerbot_get_bars ~778

OHLCV bars from 1-second through monthly. The prices underneath the table.

NameTypeReqDescription
adjustedboolean–Default `true`: prices are split-adjusted — restated after each later split, as the tape is, so a series is continuous across a split. `false` returns the price as it printed that day (a name that la…
asofstring–Point-in-time: the most recent bar whose period had closed at or before that moment. A bare `YYYY-MM-DD` means that day's close. A full timestamp means the last FINISHED bar — at 10:00 ET on a Wednes…
beforestring–Return the N bars ending strictly before this date/timestamp — back-paging. Mutually exclusive with `cursor` (they are the same control — a 400 when both are sent).
cursorstring–Continuation token from a prior response's `next_cursor`; sugar for `before` (sending both is a 400; a blank `cursor=` counts as absent), and the way to page inside a `from`/`to` window.
fromstring–Window start (inclusive): `YYYY-MM-DD`, ISO timestamp, or epoch-ms. Combines with `to` for an explicit window; page within it using `cursor`. Mutually exclusive with `asof` and `before` (400).
intervalstringyesBar interval. `2h`/`4h` roll up hourly bars; `1w`/`1mo` roll up daily bars into calendar weeks (Monday start) and months — the bar's `t` is the bucket start (UTC), and with `asof` the last bucket is…
limitinteger–Most-recent N bars. Max 1000 — an over-cap value is clamped, not an error.
sessionstring–Sub-hour intervals only. `all` (default) includes pre- and post-market bars. `regular` keeps bars whose start is in 09:30–16:00 ET (DST-aware). Why you might want it: the vendor buckets trades by SIP…
tickerstringyesTicker symbol, or a comma-separated list (up to 50) for a bulk response keyed by symbol.
tostring–Window end (inclusive): a bare `YYYY-MM-DD` means through the end of that day, same as series. Mutually exclusive with `asof` and `before` (400).
NameTypeReqDescription
adjustedbooleanyesWhether the bars are split-adjusted — `true` unless you passed `adjusted=false`.
as_ofstringyesServer time this response was assembled (ISO 8601).
barsarrayyesOHLCV bars, chronological, in the compact array shape. Bulk requests key this by symbol instead.
countnumberyesBars returned in single-symbol mode; the number of SYMBOLS in bulk mode.
coveragestringyes`covered` when bars were found, `no_data` when nothing exists for the symbol in the window (before its first session, a market holiday, a thin name with no prints). A page that could not be completed…
intervalstringyesThe bar size served.
next_cursorstring–Opaque token for the next page; `null` on the last page. Absent on bulk (comma-list) requests, which are unpaged. Absent on bulk requests — page bulk symbol-by-symbol.
notestring–Present only when there is something to disclose about how the page was served: the first request for a symbol at a sub-hour interval loads and stores its bars, so that one call is slower than later…
notesobject–Bulk (comma-list) requests only: the per-symbol disclosures, keyed by symbol, in place of `note`.
sessionstringyesThe session filter applied: `all` (default) or `regular` (09:30–16:00 ET, sub-hour intervals only).
tickerstring–The symbol you asked for.

No examples provided.

tickerbot_get_etf_holdings ~214

Returns an ETF's constituents and their weights, heaviest first. When the ticker is not an ETF, `is_etf` is false and `holdings` is empty; `is_etf: true` with zero holdings means a real ETF whose holdings are not ingested yet. The reverse lookup ("which ETFs hold NVDA") is a scan filter on `etf_holders`, not this tool.

NameTypeReqDescription
limitinteger–Max holdings returned. Max 5000. When the cap cuts the list, the response sets `truncated: true` and `total` (the ETF's full holding count) — raise `limit` to at least `total` to get the full set, po…
tickerstringyesETF symbol. Case-insensitive.
NameTypeReqDescription
as_ofstringyesServer time this response was assembled (ISO 8601).
countnumberyesHoldings in this page.
holdingsarrayyesConstituents, heaviest first, each with its weight.
is_etfbooleanyesWhether the symbol is an ETF, from the instrument type on its ticker record.
tickerstringyesThe ETF you asked for.
totalnumber–Total constituents held, before `limit`.
truncatedboolean–`true` when `limit` cut the list short.

No examples provided.

tickerbot_get_etf_sectors ~70

Returns an ETF's sector weights, heaviest first. Always complete, since sector breakdowns are small. When the ticker is not an ETF, `is_etf` is false and `sectors` is empty.

NameTypeReqDescription
tickerstringyesETF symbol. Case-insensitive.
NameTypeReqDescription
as_ofstringyesServer time this response was assembled (ISO 8601).
countnumberyesSectors returned.
is_etfbooleanyesWhether the symbol is an ETF, from the instrument type on its ticker record.
sectorsarrayyesSector weights, heaviest first, in the vendor's ETF-profile vocabulary.
tickerstringyesThe ETF you asked for.

No examples provided.

tickerbot_get_series ~1,185

Any signals for any tickers on one shared time grid — up to 50 tickers by 25 columns per call. One flat row per ticker per interval step, cursor-paged backward. `transitions_only: true` with boolean signals returns only the rows where a boolean flipped.

NameTypeReqDescription
asofstring–Point-in-time read: ONE row per ticker — the state at that instant — rather than a range. `YYYY-MM-DD` or a full ISO timestamp, the same meaning `asof` carries on `/v2/tickers`, `/v2/scan` and `/v2/s…
columnsstring–Up to 25 columns (POST accepts an array): OHLCV names, signals, and your custom signals, freely mixed. Omitted → the ticker-history default set (price, change_1d_pct, relative_volume, market_cap), in…
cursorstring–Opaque cursor from the previous response — every ticker pages backward in lockstep on the shared grid, no per-ticker gaps or duplicates.
fromstring–Earliest timestamp (inclusive), `YYYY-MM-DD` or ISO. Intraday requests default to a recent window (`1m`: 7 days, `1h`: 60 days) — the cursor keeps walking further back window-by-window, or pass `from…
intervalstring–Grid granularity. `1w` resamples the daily tier weekly (Monday-keyed); `1q` is the fiscal-quarter grid. This is the grid, not a state tier: there is no `auto` here and nothing blends — under `asof` y…
limitinteger–Grid steps per page (shared across tickers). Max 1000 — an over-cap `limit` is clamped to 1000 (house convention, `limit=10000` means "max"). Separately, tickers × limit may not exceed 25,000 rows pe…
tickerstring–Single-symbol form — `/v2/series?ticker=AAPL` is ticker history in its canonical spelling. Exactly one of `ticker` or `tickers` is required.
tickersstring–Comma-separated symbols, up to 50 (POST accepts a JSON array). Exactly one of `tickers` or `ticker` is required; when both are passed, `ticker` wins — so sending both silently narrows the request to…
tostring–Latest timestamp (inclusive), `YYYY-MM-DD` or ISO.
transitions_onlyboolean–Only rows where a boolean signal changed state. Accepted spellings: `true`/`1`/`yes` and `false`/`0`/`no` (case-insensitive) — anything else is a 400, never silently off. Requires at least one boolea…
NameTypeReqDescription
_metaobjectyesPer-column `sources` (`bars`, `state`, or `custom` for your own signals; `earnings`/`statements` at 1q) and per-ticker `coverage`, plus `non_trading_days_dropped` / `transitions_only` / `from_default…
as_ofstringyesServer time this response was assembled (ISO 8601).
columnsarrayyesColumns in the response, echoed.
countnumberyesRows per ticker in this page.
intervalstringyesThe grid granularity served.
next_cursorstringyesOpaque token for the next page; `null` on the last page. Pass it back as `cursor`.
seriesobjectyesKeyed by ticker: an array of flat rows, chronological, each keyed `t` plus the columns you asked for.
tickersarrayyesSymbols in the response, echoed.

No examples provided.

tickerbot_get_signal ~825

The state of a signal is the set of tickers matching it right now, or with `asof`, as of any moment. One name, the whole market, one call. Booleans need no `condition`; every other type needs one, typed like the signal: ">70" (numeric), "<YYYY-MM-DDTHH:MM:SSZ" (timestamp), ">=YYYY-MM-DD" (date), "=ETF" (string). Sorted by signal value desc for non-booleans.

NameTypeReqDescription
asofstring–Optional. Target moment as `YYYY-MM-DD` (that day's close) or an ISO timestamp (that intraday moment; daily-only signals then carry the previous session's close, never that day's) — the same read as…
conditionstring–Required for every non-boolean signal; the shape follows the signal's `type` in the catalog. Single bound, `<op><value>`. numeric: `>70`, `<=200`, `!=0` (operators `>`, `>=`, `=`, `!=`, `<`, `<=`). t…
cursorstring–Opaque cursor from the previous response.
include_active_sinceboolean–Built-in booleans only: adds `active_since` and `days_live` per row — the first day of the current true streak, from daily state (the day after the last false day; if the boolean has never been false…
intervalstring–Grain the past state is read at: `1m`, `1h`, `1d`, or `auto` (default). `auto` blends: each signal comes from its freshest grain at or before the instant (minute, then hourly, then the last closed da…
limitinteger–Page size. Max 200.
signalstringyesA signal name. Booleans (e.g. `golden_cross`, `above_sma_50`) are detected automatically; every other type (numeric `rsi_14`, timestamp `price_asof`, date `earnings_date`, string `asset_class`) requi…
sort_bystring–Row order: `default` (alphabetic for booleans, highest-value-first for numerics) or `market_cap` (desc NULLS LAST; adds `market_cap` to each row). Live only — with `asof` it is a 400 (the snapshot's…
universestring–Optional. Scope to a system or caller-owned universe slug.
NameTypeReqDescription
_metaobject–With `asof`: how the read was resolved — interval served and requested, blending, sources, frozen fields (see the as-of read below). On any read, `deprecated_columns` when you named the signal under…
as_ofstringyesServer time this response was assembled (ISO 8601).
conditionstringyesThe bound you passed, echoed; `null` for boolean and custom signals.
countnumberyesRows in this page.
next_cursorstringyesOpaque token for the next page; `null` on the last page. Pass it back as `cursor`.
resultsarrayyesMatching tickers with the signal value.
signalstringyesThe signal you asked for.
universestringyesThe universe you scoped to, echoed; `null` when unscoped.

No examples provided.

tickerbot_get_ticker ~458

The full ticker row, every signal on the schema page, for one symbol or a comma list of up to 50. Right now, or with `asof`, as of any past date. Pass a comma list of up to 50 symbols for a batch (`data` keyed by symbol plus `not_found`). Crypto is the X-prefixed pair (X:BTCUSD) — bare BTC/ETH are US-listed ETFs.

NameTypeReqDescription
asofstring–Optional. Target moment as `YYYY-MM-DD` (that day's close) or an ISO timestamp (that intraday moment; daily-only signals then carry the previous session's close, never that day's) — the same read as…
intervalstring–Grain the past state is read at: `1m`, `1h`, `1d`, or `auto` (default). `auto` blends: each signal comes from its freshest grain at or before the instant (minute, then hourly, then the last closed da…
tickerstringyesOne symbol, or a comma-separated list of up to 50 for a batch response keyed by symbol. Case-insensitive. Equities are bare symbols (`AAPL`); every other class carries a prefix — rates (`R:SOFR`), cr…
NameTypeReqDescription
_metaobject–With `asof` only: how the read was resolved — the interval served and requested, whether rows blend intervals, sources and frozen fields. See the as-of read below.
as_ofstringyesServer time this response was assembled (ISO 8601).
countnumber–List form only — how many of `requested` were found.
dataobjectyesThe full ticker row — every signal on the schema page. On the list form, an object keyed by symbol, one full row each.
not_foundstring–List form only — the requested symbols we do not track, in request order. An empty array when every symbol was found.
requestedstring–List form only — the canonical symbols asked for, de-duplicated, in request order.
tickerstring–The symbol you asked for, normalised. Single form only.

No examples provided.

tickerbot_get_ticker_coverage ~141

For one ticker, what we hold and how far back — so an empty result is never ambiguous. Ask this before treating a gap in bars or series as an outage. An absent `minute` span is not a gap — sub-hour bars load on the first request for a symbol.

NameTypeReqDescription
tickerstringyesCase-insensitive. Equities are bare symbols (`AAPL`); every other class carries a prefix — rates (`R:SOFR`), crypto (`X:BTCUSD`), fx (`X:EURUSD`). Bare `BTC`/`ETH` are US-listed ETFs, not spot crypto…
NameTypeReqDescription
as_ofstringyesServer time this response was assembled (ISO 8601).
measured_fieldsarrayyesPer-field measured depth where the backfill engine has probed — `field`, the grain it was measured at (`daily`, `hourly`, `minute`), `first_date`, `last_date`, `pct_complete`. Capped at 1500 rows.
minute_tierobjectyesDeprecated (see the changelog): an internal precompute roster that has no bearing on what bars you can read — sub-hour bars are available for every active symbol. Do not branch on it.
namestringyesCompany or instrument name.
spansobjectyesPer resolution — `oldest`, `newest`, `rows`.
tickerstringyesThe symbol you asked for.

No examples provided.

tickerbot_get_universe ~53

Returns the universe doc. Use `top_10`/`top_100` to fetch a system universe; any other slug must be one your account owns.

NameTypeReqDescription
idstringyesUniverse slug.
NameTypeReqDescription
as_ofstringyesServer time this response was assembled (ISO 8601).
created_atnumberyesCreation timestamp.
descriptionstringyesFree-form notes; `""` when unset.
effective_atnumber–System universes only: when this membership took effect.
idstringyesThe slug — the universe's handle in `?universe=`.
namestringyesDisplay label.
next_rebalance_atnumber–System universes only: when membership is next recomputed.
rebalance_methodstring–System universes only: how membership is chosen.
sizenumberyesMember count.
systembooleanyes`true` for a built-in universe, `false` for one you created.
tickersarrayyesMembers.
updated_atnumberyesLast modification timestamp.

No examples provided.

tickerbot_get_webhook ~47

The current state of one webhook subscription.

NameTypeReqDescription
idstringyesWebhook id returned by a subscribe endpoint (`POST /v2/tickers/{T}/subscribe`, etc.).
NameTypeReqDescription
as_ofstringyesServer time this response was assembled (ISO 8601).
cadencestringyesHow often the trigger is evaluated — `realtime`, `hourly`, or `nyse_open`.
channelstringyesWhere deliveries go: `webhook`, `discord`, `in_app`, or `mobile_push`.
created_atnumberyesCreation timestamp.
deliverystringyesLegacy alias of `channel`, kept aligned for older readers.
dirstringyesSort direction for that list; `null` means the default (`desc`).
event_kindsarray–Event-trigger webhooks only: the kinds subscribed (`split`, `dividend`, `insider`, `analyst`, `earnings`).
event_qstring–Event-trigger webhooks only: the payload filter, or `null`.
event_tickersarray–Event-trigger webhooks only: the symbols the trigger is scoped to, or `null` for the universe / whole market.
fieldsstringyesExtra signals carried on each fired match row; `null` means the standard set.
idstringyesThe webhook id — `wh_…`, the handle for every other call on this record.
last_errorstring–The last evaluation error; `null` on a healthy hook. The answer to "why is my webhook not firing?".
last_eval_error_atnumber–When the last evaluation error happened; `null` on a healthy hook.
last_evaluated_atnumberyesWhen it was last evaluated; `null` until the first run.
last_firednumberyesWhen a delivery last went out; `null` if it never has.
last_match_setarrayyesTickers matching at the last evaluation — the set the next run is diffed against, which is what makes firing edge-triggered.
last_predicate_valuestringyesThe trigger's value at the last evaluation; `null` until it has run.
namestringyesYour label for the subscription.
next_eval_atnumberyesWhen the evaluator will next consider this subscription.
orderstringyesSort signal for the payload row list; `null` means the evaluator default (`market_cap`).
qstringyesThe stored predicate. Custom signals appear expanded: the SQL is frozen at creation.
rule_idstringyesLegacy link to a v1 alert rule; `null` on everything created through v2.
sourcestringyesWhich API version created the record; `v2` for anything you create today.
statusstringyes`active` or `disabled`. Auto-disable follows repeated delivery failure.
subscription_originobjectyesWhich door created it — `type` (`ticker`/`signal`/`scan`/`event`), its `ref`, and the `condition` in display form.
target_urlstringyesYour HTTPS endpoint; `null` on every channel except `webhook`.
trigger_kindstring–Event-trigger webhooks only: `event`.
universe_idstringyesUniverse the trigger is scoped to, or `null` for the whole market.
updated_atnumberyesLast modification timestamp.

No examples provided.

tickerbot_list_events ~1,215

One timeline across every ticker: earnings, dividends, splits, insider filings, analyst actions, plus opt-in signal firings and news. Requires at least one bound: a ticker scope (ticker/tickers/universe), a time window (from/to), or firm/action — `q` alone is not a bound. `firm`/`action` match case-insensitively; a `q` payload match is case-sensitive. `join: state` attaches the ticker state as of each event.

NameTypeReqDescription
actionstring–Analyst-only structured filter — requires `kind=analyst` alone. Same `action` vocabulary as Analyst actions.
cursorstring–Opaque cursor from the previous response — carries the original filters (and `q` when short), so pass it alone. Not valid with `group_by`.
dirstring–Aggregate-mode sort direction.
firmstring–Analyst-only structured filter — requires `kind=analyst` alone (`400` otherwise). Exact firm-name match on the ratings feed.
fromstring–Events at/after this instant — strict ISO: `YYYY-MM-DD` or `YYYY-MM-DDTHH:MM[:SS]Z`. A bare `YYYY-MM-DD` means from the start of that day. (`since` accepted as an alias.)
group_bystring–Comma list of rollup keys — switches the response to aggregate rows. Columns (`kind`, `ticker`), payload fields (`firm`, or the explicit `payload->>'firm'`), and expressions over them all roll up. Na…
havingstring–Post-aggregation filter. Requires `group_by`.
intervalstring–Grain the per-event state is read at, when `join=state`: `1m`, `1h`, `1d`, or `auto` (default). Under `auto`, row reads blend each signal at its freshest grain at or before the event across hourly an…
joinstring–Set to `state` to allow ticker-state signals in `q`/`select`/`group_by`/`having`, evaluated as of each event's timestamp at daily resolution: an event on day D sees the daily state through D-1, never…
kindstring–Comma list of kinds. Omitted → the five corporate kinds; `signal`, `news` and `estimate_revision` join only when named here.
limitinteger–Page size (row modes) / max rollup rows (aggregate mode). Max 1000.
orderstring–Aggregate-mode sort — a bare column name or an output name only (put expressions in `select` and sort by their alias). A group key's name works too, whether you aliased it or it was named for you: `g…
qstring–SQL WHERE over the projection — `ticker`, `ts`, `kind`, `payload` (plus ticker-state signals when `join=state`). When exactly ONE `kind` is named, that kind's payload fields are additionally first-cl…
selectstring–Aggregate-mode output columns (requires `group_by`). Default: group keys + `COUNT(*) AS events`. Same naming rule as `group_by` — alias with `AS`, or take the name derived for you.
signalstring–Signal-only filter — requires `kind=signal` alone (`400` otherwise). One built-in boolean signal; REQUIRED with `q` or `join=state` on that kind. See Signal firings.
tickerstring–Single-ticker filter. When both `ticker` and `tickers` are passed, `ticker` wins.
tickersstring–Comma list of tickers (max 50). Mutually exclusive with `universe`.
tostring–Window end — same strict ISO subset. A bare `YYYY-MM-DD` means through the end of that day, matching bars/series/spans; a timestamp is exclusive (events strictly before it). (`until` accepted as an a…
transitionstring–Signal-only filter — requires `kind=signal` alone. `enter` (false→true) or `exit` (true→false).
universestring–Universe slug (`top_10`, `top_100`, or one of yours) to scope the stream. Mutually exclusive with `tickers`.
NameTypeReqDescription
_metaobject–With `join=state` only: `state_interval`, the grain the joined state was read at, and `deprecated_columns` when a state column was named under its pre-2026-09-07 spelling and served under its current…
as_ofstringyesServer time this response was assembled (ISO 8601).
countnumberyesRows in this page.
next_cursorstring–Opaque token for the next page; `null` on the last page. Carries `q_truncated: true` alongside it when an oversized `q` could not ride the token — resend `q` on later pages.
queryobjectyesYour filters, echoed exactly as you sent them — `q`, `select`, `group_by` and `having` come back in your spelling, not the SQL they compile to — including `join` and its grain when you passed `join=s…
resultsarrayyesOne row per event (`ticker`, `ts`, `kind`, `payload`), or rollup rows plus `truncated: true` when an aggregate exceeds `limit`.
truncatedboolean–Aggregate mode only (`group_by`): `true` when the rollup stopped at its row cap. Aggregate responses are unpaged, so `next_cursor` is absent there.

No examples provided.

tickerbot_list_signals ~119

Every signal you can name in a query — the built-in signals and your own custom signals, in one catalog. Use to discover the signal names and `q` vocabulary before composing a scan; custom signals appear with `kind: custom`.

NameTypeReqDescription
cursorstring–Opaque cursor from a prior response.
kindstring–Filter by kind (`expression` accepted as a legacy alias for `custom`). Omit to return both.
limitinteger–Page size for the custom-signal slice. Max 200.
NameTypeReqDescription
as_ofstringyesServer time this response was assembled (ISO 8601).
countnumberyesRows in this page — the canonical count, equal to `count_builtin` + `count_custom`.
count_builtinnumberyesBuilt-in signals in the catalog.
count_customnumberyesYour custom signals.
next_cursorstringyesOpaque token for the next page; `null` on the last page. Pass it back as `cursor`.
signalsarrayyesThe catalog, your custom signals first, then built-ins. Built-ins carry `kind: builtin` plus their taxonomy membership — `category`/`category_label`/`group`/`group_label` (slugs are stable, switch on…
taxonomyobject–Absent when the page holds no built-ins (`kind=custom`). The signal taxonomy tree, once per response: `groups[]` in derivation-ladder order (record → behavior → indicator → company side), each with `…

No examples provided.

tickerbot_list_tickers ~452

Every symbol we track, active or delisted, as one identity row each. Use `/v2/tickers/{ticker}` for the full row.

NameTypeReqDescription
asset_classstring–Filter by asset class — `stocks`, `rates`, `crypto`, `fx`, or a comma-separated list (the live classes today; validated for shape, not against a fixed list, so a well-formed class we don't track simp…
asset_typestring–Filter by instrument type WITHIN equities — the stored `asset_type` value (`CS`, `ETF`, `ADRC`, `PFD`, `FUND`, `UNIT`, `SP`, `ETS`, `WARRANT`, `RIGHT`, `ETN`, `ETV`), matched case-insensitively. `equ…
cursorstring–Opaque cursor from the previous response's `next_cursor` field. Continues the walk from after that page. A cursor minted under `search` only resumes the same search.
exchangestring–Filter by exchange name — the value rows carry in their `exchange` field. MIC codes (`XNAS`, `XNYS`, `BATS`) are also accepted and match `exchange_mic`. A malformed value (non-letters, over 16 chars)…
limitinteger–Page size. Max 1000.
searchstring–Case-insensitive match on `ticker` or `name`, max 64 characters (longer is a 400). Results are ranked: an exact ticker match first, then symbols that start with the term, then name matches — alphabet…
NameTypeReqDescription
_metaobject–With `asset_class` only: `scope.asset_class` lists the classes the page was filtered to.
as_ofstringyesServer time this response was assembled (ISO 8601).
countnumberyesRows in this page.
next_cursorstringyesOpaque token for the next page; `null` on the last page.
resultsarrayyesOne identity row per symbol — the thirteen signals named above, nothing else. `active: false` rows carry `delisted_utc`; they are still addressable on the state route with `asof`.

No examples provided.

tickerbot_list_universes ~138

Every universe you can reference: your own named ticker lists and the built-in ones. `owner: system` lists the built-in universes (top_10, top_100); `all` lists both. Use a slug as `universe` on scan, signal, and subscribe tools.

NameTypeReqDescription
cursorstring–Opaque cursor from the previous response.
limitinteger–Page size (applies to your own). Max 100.
ownerstring–Which universes to list: `me` (your own), `system` (built-ins), or `all` (both).
NameTypeReqDescription
as_ofstringyesServer time this response was assembled (ISO 8601).
countnumberyesRows in this page.
next_cursorstringyesOpaque token for the next page; `null` on the last page. Pass it back as `cursor`.
universesarrayyesThe universes in scope. Every row carries `system: true|false`.

No examples provided.

tickerbot_list_webhook_deliveries ~177

Recent deliveries for one webhook — what was sent, and what came back.

NameTypeReqDescription
cursorstring–Opaque cursor.
fromstring–Only deliveries created at/after this moment — epoch seconds, epoch milliseconds (13+ digits), or an ISO datetime (`since` is accepted as an alias). Delivery history is retained for 90 days; deleting…
idstringyesWebhook id.
limitinteger–Page size. Max 100.
statusstring–Filter by delivery status.
tostring–Only deliveries created at/before this moment — same value grammar as `from`. A date-only value means through the end of that UTC day. `from` after `to` is a 400.
NameTypeReqDescription
as_ofstringyesServer time this response was assembled (ISO 8601).
countnumberyesRows in this page.
deliveriesarrayyesAttempts, newest first: status, attempt, response code, error, and `body_string` — the exact JSON POSTed.
next_cursorstringyesOpaque token for the next page; `null` on the last page. Pass it back as `cursor`.

No examples provided.

tickerbot_list_webhooks ~112

Every webhook subscription on this account, newest first.

NameTypeReqDescription
cursorstring–Opaque cursor from the previous response.
limitinteger–Page size. Max 100.
statusstring–Filter by status: `active` or `disabled` — the only two states a webhook has (`disabled` covers both a user pause and the automatic disable after repeated delivery failures; `consecutive_failures`/`l…
NameTypeReqDescription
as_ofstringyesServer time this response was assembled (ISO 8601).
countnumberyesRows in this page.
next_cursorstringyesOpaque token for the next page; `null` on the last page. Pass it back as `cursor`.
webhooksarrayyesYour subscriptions, newest first, each with its `subscription_origin` and health fields. `signing_secret` is stripped — it is shown only on create.

No examples provided.

tickerbot_scan ~912

Every ticker matching a SQL WHERE clause. Right now, or with `asof`, as of any past date. The `q` grammar is a flat SQL WHERE over signal names: AND/OR/NOT, comparisons, numeric and string literals, custom signals by name. No JOIN or subqueries. With `group_by` the result is rollup rows, not tickers. Example: `gap_up AND market_cap < 2000000000 AND NOT earnings_this_week`.

NameTypeReqDescription
asofstring–Optional. Target moment as `YYYY-MM-DD` (that day's close) or an ISO timestamp (that intraday moment; daily-only signals then carry the previous session's close, never that day's) — the same read as…
asset_classstring–One or more asset classes — slug or comma-separated list (`stocks`, `rates`, `crypto`, `fx`). Validated for shape, not against a fixed list, so a well-formed class we don't track simply matches nothi…
columnsstring–Extra signals per row, ADDITIVE — the defaults are always present (ticker, name, asset_class, asset_type, price, change_1d_pct, gap_pct, relative_volume, market_cap). `fields` accepted as an alias.
cursorstring–Opaque cursor from the previous response's `next_cursor`. Row mode only.
dirstring–Sort direction.
fullboolean–Return every signal instead of the default set. Mutually exclusive with `columns` — passing both is a 400.
group_bystring–AGGREGATE MODE: 1–6 group keys (signals, expressions, or one of your custom signals as a boolean key). Results become rollup rows. Name a key with `AS` to choose its JSON key (`market_cap > 1e11 AS m…
havingstring–Filter the aggregate rows (requires `group_by`). Custom signals are valid here too.
intervalstring–Grain the past state is read at: `1m`, `1h`, `1d`, or `auto` (default). `auto` blends: each signal comes from its freshest grain at or before the instant (minute, then hourly, then the last closed da…
limitinteger–Page size. Max 100. Aggregate mode does not paginate — it sets `truncated: true` when groups were cut, so sort with `order` to keep the ones you want.
orderstring–Signal to sort by. In aggregate mode the default is the count alias `tickers` — or, with a custom `select`, the last item's alias — sorted NULLS LAST with the group keys as tiebreak.
qstringyesSQL WHERE expression. Max 4000 chars; semicolons, comments and write keywords are rejected. Your custom signals are valid here — each expands to its SQL at run time.
selectstring–Aggregate output items (requires `group_by`). Default: the group keys + `COUNT(*) AS tickers`. Supports count/avg/sum/min/max/stddev/string_agg/bool_and/bool_or plus `FILTER (WHERE …)`, and your cust…
universestring–Slug of a system universe (`top_10`, `top_100`) or one of your own. Omitted, the scan runs across all ~23,212 tracked tickers.
NameTypeReqDescription
_metaobject–`null_coverage` reports, per signal in the predicate, how many in-scope rows are NULL and therefore never evaluated — absence from `results` means "no value", not "did not match". `scope` additionall…
as_ofstringyesServer time this response was assembled (ISO 8601).
countnumberyesRows in this page.
next_cursorstring–Opaque token for the next page; `null` on the last page. Pass it back as `cursor`.
queryobjectyesYour query, echoed — `q`, `order`, `dir`, `limit`, and any scope.
resultsarrayyesOne row per match — every signal on the schema page, plus any you named.
truncatedboolean–Aggregate mode only (`group_by`): `true` when the rollup stopped at its row cap. Aggregate responses are unpaged, so `next_cursor` is absent there.

No examples provided.

tickerbot_search_news ~715

SQL query over the news archive. Article rows, or rollups when you group them. Filter to a ticker with the `ticker` param, or in `q` via the auto-unnest alias `tk = 'NVDA'`. `search` is full-text over title and summary. Rollups with group_by/having return `truncated: true` instead of paging.

NameTypeReqDescription
cursorstring–Opaque pagination cursor from a prior response's `next_cursor`.
dirstring–Sort direction.
fromstring–Earliest `time_published` (inclusive) — strict ISO: `YYYY-MM-DD` or `YYYY-MM-DDTHH:MM[:SS]Z`. (`since` accepted as an alias.)
group_bystring–AGGREGATE MODE: comma-separated group keys, 1-6 (max 1000 chars). Switches the response to rollup rows. Use `tk` to roll up per ticker without writing the UNNEST. Name a key with `AS` to choose its J…
havingstring–HAVING clause on the aggregate (max 1000 chars). Requires `group_by`.
limitinteger–Page size. Max 1000.
orderstring–Sort — a bare column name or SELECT alias only (put expressions in `select` and order by their alias). Defaults to `time_published` (article rows) or `volume` (aggregate rows).
qstring–WHERE clause over the news_article table. Max 4000 chars. Required UNLESS `search` or a scoping param (`ticker`/`tickers`/`universe`/`from`/`to`) is present — the simplest call needs no SQL. Queryabl…
searchstring–Full-text search over `title` + `summary` — websearch grammar: `apple earnings` (all words), `"price target"` (phrase), `chips OR semiconductors`, `-crypto` (negation). Max 200 chars. ANDs with `q` a…
selectstring–Columns/expressions to return (max 2000 chars). Defaults to article columns (no `group_by`) or `<group_by cols>, COUNT(*) AS volume` (with `group_by`).
tickerstring–Articles mentioning this symbol (ANDed with `q`).
tickersstring–Comma list, up to 50 — articles mentioning ANY of them. Not combinable with `ticker` or `universe`.
tostring–Articles strictly before this instant — same strict ISO subset, matching `/v2/events`. (`until` accepted as an alias.)
universestring–Universe slug — articles mentioning any member. Not combinable with `ticker`/`tickers`.
NameTypeReqDescription
as_ofstringyesServer time this response was assembled (ISO 8601).
countnumberyesRows in this page.
next_cursorstringyesOpaque token for the next page; `null` on the last page. Pass it back as `cursor`.
queryobjectyesYour filters, echoed.
resultsarrayyesArticle rows, or rollup rows when you passed `group_by`. Aggregate responses add `truncated: true` when `limit` cut the group list.
truncatedboolean–Aggregate mode only (`group_by`): `true` when the rollup stopped at its row cap.

No examples provided.

tickerbot_subscribe_events ~467

Push new events: we POST your endpoint when events of the kinds you chose land in the archives. Webhooks need a paid plan (Free has no webhook slots). `q` filters the ticker STATE; `event_q` filters the EVENT payload in the /v2/events grammar. Latency is the ingest cadence (analyst ≤1h, corporate kinds daily), not sub-minute.

NameTypeReqDescription
channelstring–Delivery channel. `slack` is reserved and returns `501`.
device_idstring–Device to notify, from `POST /v2/devices/register`. Required when `channel` is `mobile_push`; unknown ids are a 404 `device_not_found`.
discord_urlstring–Discord incoming-webhook URL. Required when `channel` is `discord`. Stored as a posting credential: the create response echoes it back under `channel_config`, but every later read (list, get, deliver…
event_qstring–Optional event-CONTENT filter in the `/v2/events` grammar — only `ticker`, `ts`, `kind`, `payload` may appear. Composes with `q`.
kindsstringyesEvent kinds to fire on — array or comma list.
namestring–Display name. Defaults to `events: <kinds> · <scope>`.
qstring–Optional row-STATE filter evaluated against the event's ticker at fire time. Same grammar as scan `q`; custom signals are expanded and frozen at creation.
target_urlstring–HTTPS delivery URL; or use `channel` + `discord_url`/`device_id`. Omit for in-app.
tickerstring–Single-symbol shorthand for `tickers`.
tickersstring–Scope to specific tickers (max 50). Mutually exclusive with `universe` — and with the singular alias `ticker` (sending both is a 400). Omit both for all tickers.
universestring–Scope to a universe slug (`top_10`, `top_100`, or one of yours). `universe_id` accepted as an alias.
NameTypeReqDescription
_metaobject–Returned on create only, and only when the rule or `columns` named a column under its pre-2026-09-07 spelling: `deprecated_columns` lists each one (`requested`, `use`, `note`). The stored rule carrie…
as_ofstringyesServer time this response was assembled (ISO 8601).
cadencestringyesHow often the trigger is evaluated — `realtime`, `hourly`, or `nyse_open`.
channelstringyesWhere deliveries go: `webhook`, `discord`, `in_app`, or `mobile_push`.
channel_configobjectyesReturned on create only: the channel-specific delivery settings as stored (e.g. the Discord URL, the device id).
created_atnumberyesCreation timestamp.
deliverystringyesLegacy alias of `channel`, kept aligned for older readers.
dirstringyesSort direction for that list; `null` means the default (`desc`).
event_kindsarray–Event-trigger webhooks only: the kinds subscribed (`split`, `dividend`, `insider`, `analyst`, `earnings`).
event_qstring–Event-trigger webhooks only: the payload filter, or `null`.
event_tickersarray–Event-trigger webhooks only: the symbols the trigger is scoped to, or `null` for the universe / whole market.
fieldsstringyesExtra signals carried on each fired match row; `null` means the standard set.
idstringyesThe webhook id — `wh_…`, the handle for every other call on this record.
last_errorstring–The last evaluation error; `null` on a healthy hook. The answer to "why is my webhook not firing?".
last_eval_error_atnumber–When the last evaluation error happened; `null` on a healthy hook.
last_evaluated_atnumberyesWhen it was last evaluated; `null` until the first run.
last_firednumberyesWhen a delivery last went out; `null` if it never has.
last_match_setarrayyesTickers matching at the last evaluation — the set the next run is diffed against, which is what makes firing edge-triggered.
last_predicate_valuestringyesThe trigger's value at the last evaluation; `null` until it has run.
namestringyesYour label for the subscription.
next_eval_atnumberyesWhen the evaluator will next consider this subscription.
orderstringyesSort signal for the payload row list; `null` means the evaluator default (`market_cap`).
qstringyesThe stored predicate. Custom signals appear expanded: the SQL is frozen at creation.
rule_idstringyesLegacy link to a v1 alert rule; `null` on everything created through v2.
signing_secretstringyesReturned on create only — shown once, never again. HMAC key for verifying the `X-Tickerbot-Signature` header on deliveries.
sourcestringyesWhich API version created the record; `v2` for anything you create today.
statusstringyes`active` or `disabled`. Auto-disable follows repeated delivery failure.
subscription_originobjectyesWhich door created it — `type` (`ticker`/`signal`/`scan`/`event`), its `ref`, and the `condition` in display form.
target_urlstringyesYour HTTPS endpoint; `null` on every channel except `webhook`.
test_urlstring–Returned on create only: the `POST /v2/webhooks/{id}/test` URL for this record.
trigger_kindstring–Event-trigger webhooks only: `event`.
universe_idstringyesUniverse the trigger is scoped to, or `null` for the whole market.
updated_atnumberyesLast modification timestamp.

No examples provided.

tickerbot_subscribe_scan ~597

Push a whole query: we POST your endpoint every time the match set changes. Webhooks need a paid plan (Free has no webhook slots). Use for "alert me when this happens" requests.

NameTypeReqDescription
cadencestring–`realtime` (the default) is evaluated on every data refresh (~1×/min); `hourly` and `nyse_open` throttle to a batch schedule. `1m` is a deprecated alias for `realtime`.
channelstring–Delivery channel. `webhook` (POST to `target_url`), `discord` (embed to `discord_url`), `in_app` (dashboard only), or `mobile_push` (requires a `device_id` from `POST /v2/devices/register`). Inferred…
columnsstring–Extra signals per fired payload match row, beyond the standard set (`ticker`, `name`, `asset_type`, `price`, `change_1d_pct`, `market_cap`). Each must be a real signal; unknown ones are rejected at c…
device_idstring–Device to notify, from `POST /v2/devices/register`. Required when `channel` is `mobile_push`; unknown ids are a 404 `device_not_found`.
dirstring–Sort direction for `order`.
discord_urlstring–Discord incoming-webhook URL. Required when `channel` is `discord`. Stored as a posting credential: the create response echoes it back under `channel_config`, but every later read (list, get, deliver…
namestring–Human-readable label (up to 80 chars). Defaults to `scan: <q>`.
orderstring–Signal the payload's match lists are sorted by before the 100-row cap applies, so a truncated list is the deterministic top 100 rather than an arbitrary sample. Must be a real signal (validated at cr…
qstringyesWHERE-clause expression using signal names — the same grammar and the same 4000-char cap as `POST /v2/scan`, so anything scannable is subscribable. Custom signals are expanded and frozen in at creati…
target_urlstring–https:// URL to POST when the match set changes. Omit for in-app delivery.
universestring–System or user-owned universe to scope the scan. `universe_id` accepted as an alias. Unknown universes are a 404 `universe_not_found`.
NameTypeReqDescription
_metaobject–Returned on create only, and only when the rule or `columns` named a column under its pre-2026-09-07 spelling: `deprecated_columns` lists each one (`requested`, `use`, `note`). The stored rule carrie…
as_ofstringyesServer time this response was assembled (ISO 8601).
cadencestringyesHow often the trigger is evaluated — `realtime`, `hourly`, or `nyse_open`.
channelstringyesWhere deliveries go: `webhook`, `discord`, `in_app`, or `mobile_push`.
channel_configobjectyesReturned on create only: the channel-specific delivery settings as stored (e.g. the Discord URL, the device id).
created_atnumberyesCreation timestamp.
deliverystringyesLegacy alias of `channel`, kept aligned for older readers.
dirstringyesSort direction for that list; `null` means the default (`desc`).
event_kindsarray–Event-trigger webhooks only: the kinds subscribed (`split`, `dividend`, `insider`, `analyst`, `earnings`).
event_qstring–Event-trigger webhooks only: the payload filter, or `null`.
event_tickersarray–Event-trigger webhooks only: the symbols the trigger is scoped to, or `null` for the universe / whole market.
fieldsstringyesExtra signals carried on each fired match row; `null` means the standard set.
idstringyesThe webhook id — `wh_…`, the handle for every other call on this record.
last_errorstring–The last evaluation error; `null` on a healthy hook. The answer to "why is my webhook not firing?".
last_eval_error_atnumber–When the last evaluation error happened; `null` on a healthy hook.
last_evaluated_atnumberyesWhen it was last evaluated; `null` until the first run.
last_firednumberyesWhen a delivery last went out; `null` if it never has.
last_match_setarrayyesTickers matching at the last evaluation — the set the next run is diffed against, which is what makes firing edge-triggered.
last_predicate_valuestringyesThe trigger's value at the last evaluation; `null` until it has run.
namestringyesYour label for the subscription.
next_eval_atnumberyesWhen the evaluator will next consider this subscription.
orderstringyesSort signal for the payload row list; `null` means the evaluator default (`market_cap`).
qstringyesThe stored predicate. Custom signals appear expanded: the SQL is frozen at creation.
rule_idstringyesLegacy link to a v1 alert rule; `null` on everything created through v2.
signing_secretstringyesReturned on create only — shown once, never again. HMAC key for verifying the `X-Tickerbot-Signature` header on deliveries.
sourcestringyesWhich API version created the record; `v2` for anything you create today.
statusstringyes`active` or `disabled`. Auto-disable follows repeated delivery failure.
subscription_originobjectyesWhich door created it — `type` (`ticker`/`signal`/`scan`/`event`), its `ref`, and the `condition` in display form.
target_urlstringyesYour HTTPS endpoint; `null` on every channel except `webhook`.
test_urlstring–Returned on create only: the `POST /v2/webhooks/{id}/test` URL for this record.
trigger_kindstring–Event-trigger webhooks only: `event`.
universe_idstringyesUniverse the trigger is scoped to, or `null` for the whole market.
updated_atnumberyesLast modification timestamp.

No examples provided.

tickerbot_subscribe_signal ~760

Push one signal: we POST your endpoint whenever any ticker starts matching it. Webhooks need a paid plan (Free has no webhook slots). Omit `ticker` to watch the whole universe.

NameTypeReqDescription
cadencestring–`realtime` (the default) is evaluated on every data refresh (~1×/min); `hourly` and `nyse_open` throttle to a batch schedule. `1m` is a deprecated alias for `realtime`.
channelstring–Delivery channel. `webhook` (POST to `target_url`), `discord` (post an embed to `discord_url`), `in_app` (dashboard only), or `mobile_push` (notify a phone signed in to the Tickerbot mobile app; requ…
columnsstring–Comma-separated extra signals to include in each fired payload match row, beyond the standard set (`ticker`, `name`, `asset_type`, `price`, `change_1d_pct`, `market_cap`). Each must be a real signal;…
conditionstring–Required for every non-boolean signal; the shape follows the signal's `type`. Numeric: `">70"`, `"<30"`, `">=100"`. Timestamp: `"<YYYY-MM-DDTHH:MM:SSZ"` (or a bare date). Date: `">=YYYY-MM-DD"`. Stri…
device_idstring–Device to notify, from `POST /v2/devices/register`. Required when `channel` is `mobile_push`; unknown ids are a 404 `device_not_found`.
dirstring–Sort direction for `order`.
discord_urlstring–Discord incoming-webhook URL (`https://discord.com/api/webhooks/…`). Required when `channel` is `discord`. Stored as a posting credential: the create response echoes it back under `channel_config`, b…
namestring–Human-readable label (up to 80 chars). Defaults to the predicate — `at_52w_high` for a boolean, `rsi_14 > 70` for a numeric, prefixed with `<TICKER>: ` when `ticker` scopes it.
orderstring–Signal the fired payload's match lists are sorted by before the 100-row cap is applied, so a truncated list is the deterministic top 100 rather than an arbitrary sample. Must be a real signal (valida…
signalstringyesSignal name from the schema (case-insensitive).
target_urlstring–https:// URL to POST when fired. Omit for in-app delivery.
tickerstring–Restrict to a single ticker. Default: any ticker.
universestring–Restrict to a system or user-owned universe (e.g. `top_100`). `universe_id` accepted as an alias. Unknown universes are a 404 `universe_not_found`.
NameTypeReqDescription
_metaobject–Returned on create only, and only when the rule or `columns` named a column under its pre-2026-09-07 spelling: `deprecated_columns` lists each one (`requested`, `use`, `note`). The stored rule carrie…
as_ofstringyesServer time this response was assembled (ISO 8601).
cadencestringyesHow often the trigger is evaluated — `realtime`, `hourly`, or `nyse_open`.
channelstringyesWhere deliveries go: `webhook`, `discord`, `in_app`, or `mobile_push`.
channel_configobjectyesReturned on create only: the channel-specific delivery settings as stored (e.g. the Discord URL, the device id).
created_atnumberyesCreation timestamp.
deliverystringyesLegacy alias of `channel`, kept aligned for older readers.
dirstringyesSort direction for that list; `null` means the default (`desc`).
event_kindsarray–Event-trigger webhooks only: the kinds subscribed (`split`, `dividend`, `insider`, `analyst`, `earnings`).
event_qstring–Event-trigger webhooks only: the payload filter, or `null`.
event_tickersarray–Event-trigger webhooks only: the symbols the trigger is scoped to, or `null` for the universe / whole market.
fieldsstringyesExtra signals carried on each fired match row; `null` means the standard set.
idstringyesThe webhook id — `wh_…`, the handle for every other call on this record.
last_errorstring–The last evaluation error; `null` on a healthy hook. The answer to "why is my webhook not firing?".
last_eval_error_atnumber–When the last evaluation error happened; `null` on a healthy hook.
last_evaluated_atnumberyesWhen it was last evaluated; `null` until the first run.
last_firednumberyesWhen a delivery last went out; `null` if it never has.
last_match_setarrayyesTickers matching at the last evaluation — the set the next run is diffed against, which is what makes firing edge-triggered.
last_predicate_valuestringyesThe trigger's value at the last evaluation; `null` until it has run.
namestringyesYour label for the subscription.
next_eval_atnumberyesWhen the evaluator will next consider this subscription.
orderstringyesSort signal for the payload row list; `null` means the evaluator default (`market_cap`).
qstringyesThe stored predicate. Custom signals appear expanded: the SQL is frozen at creation.
rule_idstringyesLegacy link to a v1 alert rule; `null` on everything created through v2.
signing_secretstringyesReturned on create only — shown once, never again. HMAC key for verifying the `X-Tickerbot-Signature` header on deliveries.
sourcestringyesWhich API version created the record; `v2` for anything you create today.
statusstringyes`active` or `disabled`. Auto-disable follows repeated delivery failure.
subscription_originobjectyesWhich door created it — `type` (`ticker`/`signal`/`scan`/`event`), its `ref`, and the `condition` in display form.
target_urlstringyesYour HTTPS endpoint; `null` on every channel except `webhook`.
test_urlstring–Returned on create only: the `POST /v2/webhooks/{id}/test` URL for this record.
trigger_kindstring–Event-trigger webhooks only: `event`.
universe_idstringyesUniverse the trigger is scoped to, or `null` for the whole market.
updated_atnumberyesLast modification timestamp.

No examples provided.

Common questions

What is the io.github.tickerbot/mcp-server server?

io.github.tickerbot/mcp-server is listed in the public MCP registry as io.github.tickerbot/mcp-server. The stock market, in SQL, scan, replay, or subscribe across ~12k US tickers and top 100 cryptos. This page covers its hosted endpoint (https://api.tickerbot.io/mcp).

Is the io.github.tickerbot/mcp-server server safe to use?

io.github.tickerbot/mcp-server scores 81 out of 100 on VerifyMCP. That is a record of what we were able to check automatically, not an endorsement. The category breakdown on this page shows every signal behind the number, including the ones we could not confirm.

What tools does the io.github.tickerbot/mcp-server server expose?

io.github.tickerbot/mcp-server exposes 32 tools: tickerbot_list_tickers, tickerbot_get_ticker, tickerbot_subscribe_ticker, tickerbot_get_ticker_coverage, tickerbot_list_signals, and 27 more. Their descriptions and schemas cost roughly 12,250 tokens of context every time the server is loaded.

Does the io.github.tickerbot/mcp-server server require authentication?

Yes. io.github.tickerbot/mcp-server asked us for credentials when we connected, so you will need to authorise it in your MCP client before it can do anything.

Is the io.github.tickerbot/mcp-server server still maintained?

io.github.tickerbot/mcp-server is still listed as active in the MCP registry. We last reached this channel on 5 October 2026. Those dates come from our own scans of the registry and the channel itself, not from anything the publisher announced.