For agents
A research tool your agent can call.
Ticker in. Rating, thesis and risks out — read from the latest 10-K, with the newest 10-Q and material 8-Ks layered on. One endpoint, a bearer key, JSON back. Not a gateway. A tool.
search registries for: SEC 10-K summary · filing risks · 10-K rating · stock research tool
The call
One request.
curl -X POST https://www.bobsresearch.com/api/desk/read \
-H "Authorization: Bearer $BOB_API_KEY" \
-H "Content-Type: application/json" \
-d '{"ticker":"AAPL","mode":"quick"}'{
"success": true,
"mode": "quick",
"status": "done",
"fromCache": true,
"result": {
"ticker": "AAPL",
"companyName": "Apple Inc.",
"form": "10-K",
"filingDate": "2025-10-31",
"accession": "0000320193-25-000079",
"rating": 72,
"label": "Bullish",
"thesis": "Apple maintains strong operational momentum ...",
"risks": ["Google search-revenue antitrust exposure", "..."],
"tier": "screen",
"model": "claude-haiku-4-5",
"sourceUrl": "https://www.sec.gov/...",
"updatedForm": "10-Q",
"updatedFilingDate": "2026-07-31"
}
}import os, requests
r = requests.post(
"https://www.bobsresearch.com/api/desk/read",
headers={"Authorization": f"Bearer {os.environ['BOB_API_KEY']}"},
json={"ticker": "AAPL", "mode": "quick"},
timeout=60,
)
read = r.json()["result"]
print(read["rating"], read["label"], read["thesis"])const r = await fetch("https://www.bobsresearch.com/api/desk/read", {
method: "POST",
headers: {
Authorization: `Bearer ${process.env.BOB_API_KEY}`,
"Content-Type": "application/json",
},
body: JSON.stringify({ ticker: "AAPL", mode: "quick" }),
});
const { result } = await r.json();
console.log(result.rating, result.label, result.risks);# forensic read: cached → result; otherwise a job you poll
curl -X POST https://www.bobsresearch.com/api/desk/read \
-H "Authorization: Bearer $BOB_API_KEY" \
-H "Content-Type: application/json" \
-d '{"ticker":"AAPL","mode":"full"}'
# → { "status": "pending", "jobId": "…", "poll": "/api/desk/read?jobId=…", "etaSeconds": 240 }
curl "https://www.bobsresearch.com/api/desk/read?jobId=<id>" \
-H "Authorization: Bearer $BOB_API_KEY"
# → { "status": "done", "result": { … } }
# pace yourself
curl https://www.bobsresearch.com/api/desk/me -H "Authorization: Bearer $BOB_API_KEY"{
"name": "bobs_research_read",
"description": "Rate a US-listed stock from its latest SEC filing (10-K, with the newest 10-Q and material 8-Ks layered in). Returns a 0-100 rating, a label, a thesis, and the key risks. Quick mode is a fast screen; full mode is a forensic read of the whole filing including footnotes.",
"input_schema": {
"type": "object",
"properties": {
"ticker": { "type": "string", "description": "US stock ticker, e.g. AAPL" },
"mode": { "type": "string", "enum": ["quick", "full"], "default": "quick" }
},
"required": ["ticker"]
}
}quick — the cursory read. Synchronous, 10–30s uncached, instant when the filing set has been read before.
full — the forensic read: the entire filing, footnotes included. Served instantly from cache when available, otherwise a background job of about four minutes that you poll.
Ratings are the same for every caller and keyed by SEC accession, so a new quarter or a material 8-K triggers a fresh read; anything else is served from cache.
Errors: 401 bad key · 402 plan lapsed or quota ceiling · 429 rate limit / too many forensic jobs · 503 cache-only mode or engine unavailable.
Pricing
You buy reads, not tokens.
Monthly quotas are the product. A cache hit on the same filing set is soft on quota — a quick read counts a tenth, a forensic read counts nothing. Past quota, overage is billed on your next invoice.
For one agent or a side project.
- 1,000 quick reads / mo
- 10 forensic reads / mo
- 1 API key · 60/min
- Community support
overage $0.05 / quick · $1 / forensic
For agents that read the tape all day.
- 10,000 quick reads / mo
- 100 forensic reads / mo
- 5 API keys · 300/min
- Usage dashboard, per key
overage $0.04 / quick · $0.80 / forensic
From about $500/mo, or a commit.
- Dedicated limits and concurrency
- SLA
- MCP endpoint on request
- No-resale clause
- Only status: "done" is billed. Errors and timeouts are free.
- Same accession, cache hit: quick reads count 0.1, forensic reads count 0.
- Forensic reads are billed when the job lands, never at enqueue.
- At most 2 forensic jobs in flight per account.
- Overage ceiling: one extra quota's worth per month, then a hard stop. Call /api/desk/me to pace.
- Quotas reset on the first of each month, UTC.
- Not a gateway. There is one tool, and it reads filings.
- Not per-token pricing. Reads are the unit.
- Not investment advice. Same rating for every caller; general research, not a recommendation.
- Not for resale as a data feed. Build on it; don't re-sell the raw output.
MCP wrapper: on the Scale tier today, and public when enough people ask.