All pages

Result detail

GET /v1/items/{id}

Full detail for one result, by the id another endpoint returned: story:, x:, video: or letter:. A letter names every company it mentions, where lists name only the ones it is mainly about. Any other parameter is refused.

Parameters

ParameterTypeDescription
idstring, in the path, requiredThe id of a result another endpoint returned, such as story:123. Its number is at most 2147483647.
curl "https://api.bullpen.news/v1/items/story:5301754" \
  -H "Authorization: Bearer $BULLPEN_KEY"
import os, requests

r = requests.get(
    "https://api.bullpen.news/v1/items/story:5301754",
    headers={"Authorization": f"Bearer {os.environ['BULLPEN_KEY']}"},
)
r.raise_for_status()
print(r.json())
const r = await fetch('https://api.bullpen.news/v1/items/story:5301754', {
	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

FieldTypeDescription
resultStory, XPost, Video or Letter
tickersmap of TickerEntryEach company the results name, by ticker.
HeaderSent withDescription
Request-Idevery answerThis request's id, such as req_ followed by 24 letters and digits. Quote it to support.
RateLimit-Policy200, 400, 404, 429, 500, 503Your plan's quotas, per minute and per day (IETF draft-11). It may change to match the RFC.
RateLimit200, 400, 404, 429, 500, 503What each window has left, and the seconds until it resets (IETF draft-11).
WWW-Authenticate401Bearer realm="bullpen.news"
Retry-After429, 503How many seconds to wait.

GET /v1/items/story:5301754

{
  "result": {
    "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"
    ]
  },
  "tickers": {
    "ABR": {
      "name": "Arbor Realty Trust INC",
      "sector": "Financials",
      "marketCapUsd": 2244160000,
      "bullpenUrl": "https://bullpen.news/ticker/ABR"
    }
  }
}

Status codes

StatusMeaningCodes
200The answer.
400A 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
401No valid key (unauthorized), or a revoked one (revoked).unauthorized, revoked
403Your account can't use this endpoint now: invite, disabled, terms, no_plan, ended, unpaid or tool.no_plan, ended, unpaid, terms, disabled, invite, tool
404Nothing by that ticker, firm, id or day (not_found).not_found
429Your plan's minute or day limit is reached (minute, day).minute, day
500Something went wrong on bullpen.news (internal).internal
503The API is paused (off), busy (ceiling) or having trouble (unavailable). Retry-After comes with all but off.ceiling, off, unavailable

Fresh: Up to a minute old. A taken-down result answers 404.
History: Any result we've returned.
Cost: One call.