A new kind of corporate events API.

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

The capability, itemized.

EarningsFiscal period, reported and estimated EPS, surprise and surprise %, report time — the next date sits on the row as earnings_date
Dividends & splitsAmount, declared / ex / record / pay dates, type and frequency; split ratios back through the archive
Insider transactionsExecutive, title, security type, acquire/dispose, shares, price and value — every filing, per ticker or market-wide
Analyst actionsFirm, analyst, action, rating and prior rating, price target and prior target, back to 2012 — the feed behind the consensus columns
Signal firings, opt-inAny boolean signal’s enter/exit transitions as point events (kind=signal&signal=golden_cross), custom signals included
SQL + join to stateq 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

Downgrades on stocks still above their 200-day.

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

FAQ

Is there an earnings calendar?

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.

How far back does the archive go?

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.

Can I query across the whole market, not one ticker?

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.

How does Tickerbot work with AI agents?

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.

How does Tickerbot pricing work?

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

900K+ calls served, and counting.

What people are saying.

“dude. whoah.”
President, ShopifyHarley Finkelstein
“Tickerbot is insane. It turns Claude into a quant.”
Quantitative Finance MScLounes Vennema
“Best value for hobbyists and advanced traders alike.”
AI Engineer, ImergeRon Reid

get started

Get a key. Run a scan.

Free plan. Every ticker, every signal, real-time data, all-time history.