Front page
GET /v1/latest
What bullpen.news shows on its front page now, or on a past day: stories and videos, X posts, and investor letters, each list in the page's order. sector narrows the stories and X posts by their topic tags; it doesn't narrow letters. mincap and maxcap narrow all three by the market cap of the companies they're about. Any other parameter is refused.
Parameters
| Parameter | Type | Description |
|---|---|---|
day | string | A day as YYYY-MM-DD in New York time, for the front page as it stood. Leave it out for today's. It must be a real date, and not after today. |
sector | string | Only stories and X posts tagged with this sector or one of its industries: semiconductors are technology. Letters aren't narrowed. One of communication-services, consumer-discretionary, consumer-staples, energy, financials, healthcare, industrials, technology, materials, real-estate or utilities. |
mincap | string | Only results about a company with a market cap over this: 50m is $50 million, 2b is $2 billion. It must be below maxcap. One of 50m, 300m, 2b or 10b. |
maxcap | string | Only results about a company with a market cap under this: 1b is $1 billion. It must be above mincap. One of 1b, 10b, 100b or 500b. |
limit | integer, 1 to 100, default 10 | How many results to return, from 1 to 100. |
cursor | string | One of the nextCursors a previous call returned, for that list's next page. Keep the other arguments the same. |
curl "https://api.bullpen.news/v1/latest?limit=1" \
-H "Authorization: Bearer $BULLPEN_KEY"import os, requests
r = requests.get(
"https://api.bullpen.news/v1/latest",
params={"limit": 1},
headers={"Authorization": f"Bearer {os.environ['BULLPEN_KEY']}"},
)
r.raise_for_status()
print(r.json())const r = await fetch('https://api.bullpen.news/v1/latest?limit=1', {
headers: { Authorization: `Bearer ${process.env.BULLPEN_KEY}` }
});
if (!r.ok) throw new Error((await r.json()).detail);
console.log(await r.json());What comes back
| Field | Type | Description |
|---|---|---|
stories | array of Story or Video | The front page's stories and videos in its order: the top of the page, then the feed under it. Never X posts. Left out when the call pages another list. |
xPosts | array of XPost | The front page's X posts, newest first. Left out when the call pages another list. |
letters | array of Letter | The front page's investor letters, newest first. The market-cap range narrows them; sector doesn't. Left out when the call pages another list. |
tickers | map of TickerEntry | Each company the results name, by ticker. |
nextCursors | object | Each list's cursor for its next page: pass one as cursor. A list on its last page has none. |
nextCursors.stories | string | |
nextCursors.xPosts | string | |
nextCursors.letters | string |
| Header | Sent with | Description |
|---|---|---|
Request-Id | every answer | This request's id, such as req_ followed by 24 letters and digits. Quote it to support. |
RateLimit-Policy | 200, 400, 429, 500, 503 | Your plan's quotas, per minute and per day (IETF draft-11). It may change to match the RFC. |
RateLimit | 200, 400, 429, 500, 503 | What each window has left, and the seconds until it resets (IETF draft-11). |
WWW-Authenticate | 401 | Bearer realm="bullpen.news" |
Retry-After | 429, 503 | How many seconds to wait. |
GET /v1/latest?limit=1
{
"stories": [
{
"id": "story:5301754",
"kind": "story",
"title": "When the liquidity does not add up",
"summary": "Arbor Realty Trust’s dividend suspension is presented as creating $60 million of liquidity, raising questions about its ability to meet 2027 debt maturities.",
"source": "John Hempton's Newsletter",
"published": "2026-10-31T05:50:32Z",
"wentLive": "2026-10-31T05:55:59Z",
"url": "https://johnhempton.substack.com/p/when-the-liquidity-does-not-add-up",
"companies": [
"ABR"
]
}
],
"xPosts": [
{
"id": "x:5344093",
"kind": "x_post",
"postId": "2116553324942032987",
"url": "https://x.com/i/web/status/2116553324942032987",
"published": "2026-10-31T15:30:10Z",
"wentLive": "2026-10-31T15:30:58Z",
"companies": [
"APP"
]
}
],
"letters": [
{
"id": "letter:1249",
"kind": "letter",
"title": "Aristotle Core Bond Fund Commentary",
"firm": "Aristotle Funds",
"period": "3Q26",
"published": "2026-09-30T12:00:00Z",
"wentLive": "2026-10-31T16:30:21Z",
"summary": "Aristotle Core Bond Fund increased investment-grade corporate and agency and non-agency mortgage-backed securities exposure while reducing government and agency holdings. The portfolio favored BBB issuers, securitized credit, higher-quality hyperscalers, global systemically important banks, utilities and select office REITs, while remaining cautious on consumer cyclicals, healthcare and retail.",
"url": "https://cdn.prod.website-files.com/642414d0e893bb832996f598/6ae514b69037df5e7f874c4a_Aristotle%20Core%20Bond%20Fund%20Commentary.pdf",
"companies": []
}
],
"tickers": {
"ABR": {
"name": "Arbor Realty Trust INC",
"sector": "Financials",
"marketCapUsd": 2244160000,
"bullpenUrl": "https://bullpen.news/ticker/ABR"
},
"APP": {
"name": "AppLovin Corp",
"sector": "Technology",
"marketCapUsd": 86870000000,
"bullpenUrl": "https://bullpen.news/ticker/APP"
}
},
"nextCursors": {
"stories": "WyJsYXRlc3QiLCJzdG9yaWVzIiwiaU1PaHZSVEhIZnlLSjlBeCIsWzAsMV1d",
"xPosts": "WyJsYXRlc3QiLCJ4UG9zdHMiLCJpTU9odlJUSEhmeUtKOUF4IiwxXQ",
"letters": "WyJsYXRlc3QiLCJsZXR0ZXJzIiwiaU1PaHZSVEhIZnlLSjlBeCIsWzEsMV1d"
}
}Status codes
| Status | Meaning | Codes |
|---|---|---|
200 | The answer. | |
400 | A parameter is invalid or unknown (invalid_request), a key is in the URL (key_in_url), or a cursor is not this call's (invalid_cursor). | key_in_url, invalid_request, invalid_cursor |
401 | No valid key (unauthorized), or a revoked one (revoked). | unauthorized, revoked |
403 | Your account can't use this endpoint now: invite, disabled, terms, no_plan, ended, unpaid or tool. | no_plan, ended, unpaid, terms, disabled, invite, tool |
429 | Your plan's minute or day limit is reached (minute, day). | minute, day |
500 | Something went wrong on bullpen.news (internal). | internal |
503 | The API is paused (off), busy (ceiling) or having trouble (unavailable). Retry-After comes with all but off. | ceiling, off, unavailable |
Fresh: The front page as it is now, up to a minute old. A past day never changes.
History: Any day from 28 July 2026.
Cost: One call, for all three lists.