A Dark Vector Cognition product
Developer API

SEC filings API: sections, facts and changes.

The same parser behind every page, as JSON or markdown. Free tier: 25 calls a day per IP with no key, or 200 calls a day with a free key for your email. Starter is $19 a month for 10,000 calls a day; see pricing. Read existing filings; this is not an SEC submission service.

Make your first API request

Find Apple's latest 10-K. This request needs no account or key and uses one free API call.

curl -fsS "https://filings.tools/api/v1/filings?ticker=AAPL&form=10-K&limit=1"

The response contains the company, a filing ID, its date and the SEC source. Use that ID in the section and facts requests below.

Responses are not cached, because each carries your own allowance. Parsed filings are kept on our server so repeated calls usually avoid another EDGAR fetch.

Open the example response · Get a free API key · Compare monthly plans from $19

A free key allows 200 calls per day. Paid plans provide larger daily allowances and table exports; Pro adds bulk XBRL facts. Choose a plan for the work you need, not just to read a filing.

Use in an assistant

Connect an assistant or IDE that supports remote MCP to https://filings.tools/mcp using Streamable HTTP and no authentication. Free use shares the API's 25 calls per IP per UTC day, or a free key's 200. Each lookup uses one call; connecting and listing tools use none. Clients behind one proxy may share its allowance. Availability of custom connectors depends on your client and account.

Add to ClaudeAdd to CursorAdd to VS Code

Claude opens its Add custom connector dialog with the name and URL filled in: check both, continue, and choose no sign-in. ChatGPT has no install link: turn on developer mode (Settings, Apps, Advanced settings; available on some paid plans), then create an app with https://filings.tools/mcp and no authentication.

By hand: in Cursor, use mcpServers.filings.url; in VS Code, use servers.filings with type: http and the same URL. Connecting directly is separate from a directory listing.

Start with “Find Apple's latest 10-K and its SEC source.” Use its returned filing id to read a section or facts. Section replies are excerpts; comparisons show up to eight sections, two samples per change type and 400 characters per sample. These are not complete redlines. Missing data does not prove the company omitted a disclosure. Check important values against the cited original. Aggregate usage excludes arguments and filing text; see privacy.

List filings

GET /api/v1/filings?ticker=NVDA&form=10-K&limit=20
GET /api/v1/filings?cik=1045810              # or ?ticker=1045810: a CIK works in place of a ticker

Returns the company profile and the recent filings with ids. Forms: 10-K, 10-Q, 8-K, amendments, 20-F, 40-F. Any company in the SEC's ticker list works, by ticker (EDGAR spelling, so BRK-B; BRK.B is accepted) or by CIK. An unknown ticker or CIK returns 404 with unknown_ticker or unknown_cik, close matches when there are any, and a link to the SEC's company search. A ticker in ?cik= returns 400 invalid_cik.

The SEC allows ten requests a second, so filings not yet cached are fetched in turn. When too many are waiting, or EDGAR does not answer, any endpoint returns 503 with edgar_busy or edgar_unavailable and a Retry-After header in seconds.

Parsed sections

For section and comparison downloads in a script, send a free API key in the x-api-key header. API downloads without a key may require browser verification. The reader's Copy and Markdown controls export the document already on the page. Free keys retain the shared free capacity limit; subscription keys use their plan allowance. MCP does not require a browser check.

GET /api/v1/filings/{id}/sections            # JSON: sections[] with id, title, markdown, chars
GET /api/v1/filings/{id}/sections?format=md  # one markdown document
GET /api/v1/filings/{id}/sections?section=item-1a   # a single section

XBRL facts

GET /api/v1/filings/{id}/facts        # revenue, net income, EPS, assets, cash, debt, shares, opex, capex, operating cash flow
GET /api/v1/filings/{id}/facts?all=1  # every reported period for those concepts (Pro and Business)

Compare with the preceding filing

GET /api/v1/filings/{id}/diff   # counts of added, removed and changed sentences per section, against the preceding filing of the same form

Returns totals, one entry per section with limited samples, and the two filings compared. It is not a full redline. The earliest filing of a form has nothing to compare against: that is a 200 with comparable: false and a reason, not an error.

Tables as CSV (plans)

curl -H "x-api-key: YOUR_KEY" -OJ "https://filings.tools/api/v1/filings/{id}/tables"                 # every table in the filing
curl -H "x-api-key: YOUR_KEY" -OJ "https://filings.tools/api/v1/filings/{id}/tables?section=item-8"  # one section
curl -H "x-api-key: YOUR_KEY" "https://filings.tools/api/v1/filings/{id}/tables?format=json"         # rows as JSON

Every table in a filing or section, with split figures joined and spacer columns dropped, so columns line up in a spreadsheet. Values are copied as filed, never recomputed. Any plan; one call each. Without a subscription key it answers 401 or 403 and uses none of your allowance.

Keys and limits

curl -H "x-api-key: YOUR_KEY" https://filings.tools/api/v1/filings?ticker=AAPL

Every response carries X-RateLimit-Limit, X-RateLimit-Remaining and X-RateLimit-Reset. Without a key the limit is 25 calls a day per IP. Over the limit returns 429 with a free_key link and a pricing link: a free key for your email keeps 200 calls a day, and a plan from pricing raises it to 10,000 and more. Reading filings on the site never counts against the API.

Your own standing

GET /api/v1/me

Returns whether you are calling anonymously or with a key, your daily ceiling, how much is left, and when it resets. Counters run per UTC day. Reading this does not use any of your allowance.

{
  "product": "filings",
  "caller": "key",
  "plan": "filings_pro_monthly",
  "limitKind": "calls_day",
  "unit": "calls",
  "limit": 50000,
  "remaining": 49873,
  "used": 127,
  "resetIso": "2026-09-21T00:00:00.000Z",
  "persistent": true
}

persistent says whether the count is held in shared storage. When false it is held per instance and a deploy resets it.

Terms

Source documents are public domain SEC filings. Attribution to filings.tools is requested on the free tier. No warranty; verify against the original on sec.gov before relying on a number.