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
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"}'
response
{
  "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"
  }
}
python
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"])
javascript
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 + polling + pacing
# 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"
tool card (drop into your tool list)
{
  "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"]
  }
}
Semantics

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.

Builder
$29/month

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

Agent
VOLUME
$99/month

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

Scale
custom

From about $500/mo, or a commit.

  • Dedicated limits and concurrency
  • SLA
  • MCP endpoint on request
  • No-resale clause
Talk to Bob
Metering rules
  • 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.
What it is not
  • 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.