Skip to content
/api/v1/sec/filings/{accession_number}/html

Get the primary document's HTML content by accession number.

Get the primary document's HTML content by accession number. Returns the full raw HTML of the main filing document (e.g. the 10-K, 8-K body, or — for `13F-HR` / `13F-HR/A` — the INFORMATION TABLE with positions, not the cover page). For XBRL filings, automatically resolves through the SEC viewer to the actual inline XBRL document.

5 tokensSince v1.0.0

Why use this

One-call shortcut to the filing's PRIMARY document body — the actual 10-K / 10-Q / 8-K / 13F-HR HTML, not the index page. Auto-resolves through SEC's `/ix?doc=` inline-XBRL viewer wrapper to the underlying tagged HTML so customers don't have to handle the redirect themselves. Critical for: feeding a 10-K straight into an LLM context window without scraping EDGAR yourself, rendering filings in an embedded iframe in your dashboard, building diff tools that compare 10-K filings year-over-year. Returns `Content-Type: text/html` — NOT a JSON response (one of the few non-JSON endpoints in the surface). Pair with [`GET /api/v1/sec/document?url=...`](/docs/sec-filings/sec-filings-api/get-sec-document) when you need a specific exhibit or data file rather than the primary doc.

Common use case

Feed a 10-K annual report or 8-K directly into an LLM context window for summarization, without needing to scrape SEC EDGAR yourself.

One-call shortcut to the primary filing document's HTML body. Auto-resolves SEC's /ix?doc= inline-XBRL viewer wrapper to the underlying tagged HTML — so calls like ?accession=0000320193-25-000123 return the actual 10-K body, not the viewer chrome. 13F-HR / 13F-HR/A special-case (since v3.37.1, PR #295): these filings have multiple documents in the same accession folder — the cover page (primary_doc.xml, Form 13F front matter) plus the actual positions in a separate XML file (xslForm13F_X02/<infotable>.xml). The endpoint now returns the INFORMATION TABLE (positions) for 13F-HR / 13F-HR/A, not the cover page — the XSL-rendered URL is preferred so SEC's server-side XSLT returns styled HTML with the COLUMN 1-8 position headers. Pre-fix cached cover pages are detected on read (title contains FORM 13F COVER PAGE and not FORM 13F INFORMATION TABLE) and re-fetched automatically; no client action required. The server-side _fix_sec_html post-processor strips <noscript> warnings and rewrites relative URLs to absolute https://www.sec.gov/... — the HTML is renderable in a browser outside sec.gov without broken images or stylesheets. Returns Content-Type: text/html, NOT JSON — most clients will need to set Accept: text/html or read response.text() rather than response.json(). Returns 404 with a JSON error body when the accession is unknown OR when the filing has no extractable HTML (some pre-2001 filings are TXT-only — for those use GET /api/v1/sec/document?url=... with the .txt URL from the filing's all_links). For specific exhibits or data files within a filing, use the per-URL fetcher. For surgical item-level extraction (e.g. just Item 1A Risk Factors), use GET /api/v1/scrapping/extractor instead.

Parameters

NameInRequiredDefaultAllowedDescriptionExample
accession_numberpathrequiredSEC accession number in 18-char dashed format `XXXXXXXXXX-YY-NNNNNN`. Returns 404 with a JSON error body when the accession is not in the local index (or has no extractable HTML — e.g. some pre-2001 filings are TXT-only).0000320193-25-000123
offsetqueryoptional0Byte offset (UTF-8) at which to start the returned slice. Combine with `length`/`max_bytes` to page through a large document instead of pulling it whole. Omit (with no `length`/`max_bytes`) to get the full document — the default, unchanged behaviour.0
lengthqueryoptionalMax number of UTF-8 bytes to return starting at `offset`. Alias of `max_bytes` (if both are given the smaller wins). A raw 10-K can be tens of MB; agents should bound the response (e.g. 200000) and page via `offset` to avoid context/token blow-up. When the response is sliced, truncation is reported in the response HEADERS (`X-Content-Total-Bytes`, `X-Content-Offset`, `X-Content-Returned-Bytes`, `X-Content-Truncated`) — the body stays valid HTML.200000
max_bytesqueryoptionalAlias of `length` — max UTF-8 bytes to return from `offset`. Provided for clients that think in terms of a hard response-size cap.200000

Response schema

FieldTypeNullableDescription
(body)stringnoRaw filing HTML — UTF-8 encoded `text/html` body. NOT a JSON envelope (this endpoint returns the document body directly). Server-side post-processing strips `<noscript>` blocks (the SEC "Javascript required" warning) and rewrites relative `href`/`src` URLs to absolute `https://www.sec.gov/...` — so the HTML can be rendered in a browser outside sec.gov without broken assets. Length ranges from 50 KB (Form 4) to 2 MB+ (large 10-K filings).
(headers).Content-TypestringnoAlways `text/html`. Distinguishes this endpoint from JSON-returning siblings — your client must accept HTML responses, not assume JSON.

Sample response

·
"<html>\n<head>\n <title>Apple Inc. 10-K (Fiscal 2025)</title>\n</head>\n<body>\n <h1>UNITED STATES SECURITIES AND EXCHANGE COMMISSION</h1>\n <h2>FORM 10-K</h2>\n <p>Annual report pursuant to Section 13 or 15(d) of the Securities Exchange Act of 1934</p>\n <p>For the fiscal year ended September 28, 2025</p>\n ...\n <h2>PART I — Item 1. Business</h2>\n <p>The Company designs, manufactures and markets smartphones, personal computers, tablets...</p>\n ...\n</body>\n</html>"

Errors

StatusLabelDescription
200OKRequest succeeded.
400Bad RequestInvalid query, body, or path parameter.
401UnauthorizedMissing or invalid Authorization header / api_Token.
402Payment RequiredInsufficient token balance for this call. Top up
429Too Many RequestsRate limit exceeded for your tier (see /pricing for tier limits). Tier limits
500Server ErrorUnexpected server-side failure. Retry with backoff; report if persistent.

Code samples

curl "https://api.finradar.ai/api/v1/sec/filings/{accession_number}/html?api_Token=YOUR_API_KEY" \
  -H "Authorization: Bearer YOUR_JWT_TOKEN"

Generate an API key in /account/credentials to run live queries (literal YOUR_API_KEY placeholder shown until then).