Every discrete thing that happens to a ticker, on one timeline: earnings reports with the estimate and the surprise, dividends with their four dates, splits, insider filings, analyst upgrades, downgrades and target changes — and, when you ask for them, the firings of any signal. One endpoint, one row shape, the SQL grammar over the payload, and a join to the ticker’s computed state as it stood at the moment of the event. An events feed you can filter by what the stock looked like when it happened.
Free plan. Every ticker, every signal, real-time data, all-time history.
what you get
| Earnings | Fiscal period, reported and estimated EPS, surprise and surprise %, report time — the next date sits on the row as earnings_date |
| Dividends & splits | Amount, declared / ex / record / pay dates, type and frequency; split ratios back through the archive |
| Insider transactions | Executive, title, security type, acquire/dispose, shares, price and value — every filing, per ticker or market-wide |
| Analyst actions | Firm, analyst, action, rating and prior rating, price target and prior target, back to 2012 — the feed behind the consensus columns |
| Signal firings, opt-in | Any boolean signal’s enter/exit transitions as point events (kind=signal&signal=golden_cross), custom signals included |
| SQL + join to state | q filters the payload, group_by rolls it up, and join=state lets the condition read any of the ticker’s columns as of the event |
Every read runs in three tenses: live, as of any past moment (add ?asof=; no look-ahead, no survivorship bias), or on push — the same query as a webhook that fires when the answer changes. Under it sits the computed table: every US equity plus rates, FX and crypto, every signal precomputed and refreshed continuously, all-time history. Data included — there’s no feed to bring.
one call
A payload filter and a state condition in one call — the state is evaluated as of each event’s own date:
GET /v2/events?kind=analyst&join=state&from=2026-08-17
&q=payload->>'action' = 'downgrades' AND above_sma_200 = true
// → { "as_of": "2026-08-24T14:38:30Z", "count": 2, "results": [
// { "ticker": "CMG", "ts": "2026-08-24", "kind": "analyst",
// "payload": { "firm": "Baird", "action": "downgrades",
// "rating": "neutral", "price_target": 40, … } },
// { "ticker": "BWMN", "ts": "2026-08-21", "kind": "analyst",
// "payload": { "firm": "JP Morgan", "action": "downgrades",
// "rating": "underweight", "price_target": 43, … } } ] }Swap the kind and the same grammar reads earnings — kind=earnings&q=(payload->>'surprise_pct')::numeric > 5 — or insiders: (payload->>'shares')::numeric > 1e6. Add group_by for counts per firm, per ticker or per week, and subscribe to get new events as a signed webhook.
Ready to wire it into something? Build a stock alert bot walks it end to end. Reference: the events timeline · analyst actions · signal firings · the SQL surface.
questions
Two ways. Forward: earnings_date is a column on every ticker’s row, so “who reports this week” is a /v2/scan with a date condition. Backward: kind=earnings on the timeline returns each past report with its estimate, actual and surprise.
It varies by kind: earnings, insider filings and splits reach the mid-2000s (AAPL’s earnings run from 2005), analyst actions to 2012, dividends through the last decade. Every kind is cursor-paged to the end of its archive on every plan.
Yes — scope with a time window instead of a ticker (from=/to=), or with a universe. The endpoint requires one bound so a bare kind can’t scan the entire log; inside that bound q, group_by and join=state all work.
Every call here is also a native tool call: install the MCP server and Claude, ChatGPT, Cursor, or any MCP runtime queries the market directly. Computed state is what makes that work well: hand a model raw data and its context window fills with math to do; hand it computed answers and the context goes to decisions. A scan returns the tickers matching your condition: a list, not a workload.
The Free plan needs no card and carries the full data side: every ticker, every signal, real-time data, all-time history and as-of queries, at 10,000 calls a month and 60 a minute. Paid plans start at $29/mo, remove the monthly cap, and raise the rate limit; webhooks and streaming come with them. Data depth is never a tier lever: every plan sees the same table.
in the wild
What people are saying.
“dude. whoah.”
“Tickerbot is insane. It turns Claude into a quant.”
“Best value for hobbyists and advanced traders alike.”
get started
Free plan. Every ticker, every signal, real-time data, all-time history.