API

REST API at https://better-edgar.com/api/v1. Bearer-token auth, JSON in/out, cursor-paginated.

Just plugging Claude or ChatGPT into Better EDGAR? Use the MCP server instead →

1. API key

Send as Authorization: Bearer <key> on any /api/v1/* endpoint.

Sign in to generate a bearer key. Sign in free

2. Reference

Versioned under /api/v1. All responses are JSON. Results are cursor-paginated, newest-first.

Base URL
https://better-edgar.com/api/v1
Auth
Authorization: Bearer <key>
Content-Type
application/json (request & response)
Pagination
Responses carry a cursor. Pass it back to continue.

Endpoints

MethodPathSummary
POST/filings/searchSearch filings by ticker/CIK, form, topic, date, sector, market cap.
GET/filings/{accession}/pdfComposed PDF of the primary filing (vision-friendly).
GET/issuers/search?q=Resolve a fuzzy ticker or name to a CIK.
GET/metaEnum reference: active forms, sectors, industries, exchanges.
GET/watchlistsList, create, and manage named CIK watchlists.
GET/saved-searchesList, create, preview, and schedule email digests on feeds.
GET/system/statusData freshness and pipeline health.
Example response — POST /filings/search
{
  "filings": [
    {
      "accession": "0000320193-24-000123",
      "cik": "0000320193",
      "ticker": "AAPL",
      "form": "10-K",
      "filing_date": "2024-11-01",
      "topics": ["RESULTS"],
      "pdf_url": "https://better-edgar.com/api/v1/filings/0000320193-24-000123/pdf"
    }
  ],
  "cursor": "eyJhY2Nlc3Npb24iOiIwMDAw...",
  "count": 1
}

Errors

Every error has the shape { error: { code, message } }. Read the code to know what to fix.

CodeHTTPMeaning
unauthenticated401Missing or invalid bearer token.
validation400Request body failed schema validation.
filter_required400Search needs at least one filter.
invalid_cursor400Cursor is malformed or has expired.
unknown_field400Unsupported field in the request body.
rate_limited429Too many requests. Back off and retry.
internal500Server-side failure. Retry with backoff.
Rate limits. Free plan is capped per month; paid plans raise that cap. The X-RateLimit-* response headers report your current budget.

3. Examples

Set BEDGAR_API_KEY in your environment, then hit the search endpoint.

cURL
curl -X POST https://better-edgar.com/api/v1/filings/search \
  -H "Authorization: Bearer $BEDGAR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"tickers":["AAPL"],"form":["10-K"],"limit":5}'
Node / TypeScript
const r = await fetch('https://better-edgar.com/api/v1/filings/search', {
  method: 'POST',
  headers: {
    authorization: `Bearer ${process.env.BEDGAR_API_KEY}`,
    'content-type': 'application/json'
  },
  body: JSON.stringify({ tickers: ['AAPL'], form: ['10-K'], limit: 5 })
});
const { filings } = await r.json();
Python
import os, requests
r = requests.post(
    'https://better-edgar.com/api/v1/filings/search',
    headers={'Authorization': f'Bearer {os.environ["BEDGAR_API_KEY"]}'},
    json={'tickers': ['AAPL'], 'form': ['10-K'], 'limit': 5},
)
filings = r.json()['filings']
© 2026 betteredgar — from Actually Pretty Useful Software Ltd. · Data from public SEC filings