Query news
https://api.tickerbot.io/ v2/ newsSQL query over the news archive. Article rows, or rollups when you group them.
Query parameters
stringArticles mentioning this symbol (ANDed with q).
string[]Comma list, up to 50 — articles mentioning ANY of them. Not combinable with ticker or universe.
stringUniverse slug — articles mentioning any member. Not combinable with ticker/tickers.
stringEarliest time_published (inclusive) — strict ISO: YYYY-MM-DD or YYYY-MM-DDTHH:MM[:SS]Z. (since accepted as an alias.)
stringArticles strictly before this instant — same strict ISO subset, matching /v2/events. (until accepted as an alias.)
stringFull-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 and the scoping params. Language-stemmed English.
stringWHERE 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. Queryable columns: time_published, title, summary, source, source_domain, category, authors, topics, overall_sentiment_score, overall_sentiment_label, tickers, ticker_data, banner_image, url, id, created_at — plus tk, the per-ticker UNNEST alias. Signal/state columns are not joinable here. See the signals catalog for columns + flags you can compose.
stringSort — 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).
enumdefault descSort direction.
asc | Ascending — smallest or earliest first. |
descdefault | Descending — largest or most recent first. |
integerdefault 50Page size. Max 1000.
stringOpaque pagination cursor from a prior response's next_cursor.
string[]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 JSON key; an un-named expression is named for you rather than returned as ?column?.
string[]Columns/expressions to return (max 2000 chars). Defaults to article columns (no group_by) or <group_by cols>, COUNT(*) AS volume (with group_by).
stringHAVING clause on the aggregate (max 1000 chars). Requires group_by.
Returns
as_ofstringServer time this response was assembled (ISO 8601).
queryobjectYour filters, echoed.
countnumberRows in this page.
next_cursorstringOpaque token for the next page; `null` on the last page. Pass it back as `cursor`.
truncatedbooleanAggregate mode only (`group_by`): `true` when the rollup stopped at its row cap.
resultsarrayArticle rows, or rollup rows when you passed `group_by`. Aggregate responses add `truncated: true` when `limit` cut the group list.
Status codes
200400Notes
- Without
group_by, each result is one article:id,time_published,title,source,tickers,overall_sentiment_score,overall_sentiment_label. Withgroup_byset, results become aggregate rollups and the default SELECT becomes<group_by cols>, COUNT(*) AS volume. Use thetkalias — an auto-UNNEST oftickers— to roll up per ticker without writing the join. - Same scoping sugar as
/v2/events:ticker/tickers/universeandfrom/toAND into the WHERE clause, andqis optional once any of them is present —?ticker=NVDA&from=2026-07-01needs no SQL at all. - There is no
asofparameter here: "as of" is a WHERE filter ontime_published, because every article already carries the moment it was published. - Both
GETandPOSTare supported; thePOSTbody takes the same parameter names, for queries too long to fit in a URL. /v2/newsis the canonical path — the log-shaped endpoints read uniformly (/v2/scan,/v2/news,/v2/events) — and the original spelling/v2/news/scananswers identically. The anonymous sandbox mirrors both spellings, GET and POST, capped at 50 rows.
More examples
curl "https://api.tickerbot.io/v2/news?from=2026-08-10&to=2026-08-11&group_by=tk&order=volume&dir=desc&limit=3" \
-H "Authorization: Bearer YOUR_KEY"{
"as_of": "2026-08-11T22:58:32.284Z",
"query": {
"q": null,
"from": "2026-08-10",
"to": "2026-08-11",
"select": null,
"group_by": ["tk"],
"having": null,
"order": "volume",
"dir": "desc",
"limit": 3
},
"count": 3,
"next_cursor": null,
"truncated": true,
"results": [
{ "tk": "AMD", "volume": 43 },
{ "tk": "BAC", "volume": 40 },
{ "tk": "JPM", "volume": 35 }
]
}