Endpoints
/v1/pdf
https://secfeedapi.com/v1/pdfAny filing or exhibit rendered to PDF.
| Parameter | Type | Description | Example |
|---|---|---|---|
urlrequired | string | Any file under https://www.sec.gov/Archives/edgar/data/: a primary document, an exhibit, a .txt submission or a filing index page. sec.gov/ix?doc= viewer links are accepted. | https://www.sec.gov/Archives/edgar/data/1045810/000104581026000021/nvda-20260125.htm |
- Returns application/pdf, not JSON.
- Files that are already PDFs on EDGAR are passed through unchanged.
- Rendering uses headless Chrome with two documents at a time; large 10-K filings take a few seconds.
Request examples
Every response below is real output from the API, trimmed to the first records.
A filing index page as PDF
The index page lists every document in the filing; useful as a cover sheet.
curl -H "Authorization: Bearer $SECFEED_KEY" \ "https://secfeedapi.com/v1/pdf?url=https://www.sec.gov/Archives/edgar/data/1045810/000104581026000078/0001045810-26-000078-index.htm"
import os, requests
r = requests.get(
"https://secfeedapi.com/v1/pdf",
params={'url': 'https://www.sec.gov/Archives/edgar/data/1045810/000104581026000078/0001045810-26-000078-index.htm'},
headers={"Authorization": f"Bearer {os.environ['SECFEED_KEY']}"},
timeout=60,
)
r.raise_for_status()
print(r.json())A press release exhibit as PDF
An Exhibit 99.1 rendered with its tables and images.
curl -H "Authorization: Bearer $SECFEED_KEY" \ "https://secfeedapi.com/v1/pdf?url=https://www.sec.gov/Archives/edgar/data/32604/000003260426000047/apensionrestatementxex991.htm"
import os, requests
r = requests.get(
"https://secfeedapi.com/v1/pdf",
params={'url': 'https://www.sec.gov/Archives/edgar/data/32604/000003260426000047/apensionrestatementxex991.htm'},
headers={"Authorization": f"Bearer {os.environ['SECFEED_KEY']}"},
timeout=60,
)
r.raise_for_status()
print(r.json())A 10-K main document as PDF
The full annual report; the largest documents take the longest.
curl -H "Authorization: Bearer $SECFEED_KEY" \ "https://secfeedapi.com/v1/pdf?url=https://www.sec.gov/Archives/edgar/data/1045810/000104581026000021/nvda-20260125.htm"
import os, requests
r = requests.get(
"https://secfeedapi.com/v1/pdf",
params={'url': 'https://www.sec.gov/Archives/edgar/data/1045810/000104581026000021/nvda-20260125.htm'},
headers={"Authorization": f"Bearer {os.environ['SECFEED_KEY']}"},
timeout=60,
)
r.raise_for_status()
print(r.json())Response fields
| Field | Type | Meaning |
|---|---|---|
(body) | binary | The PDF file. Content-Type is application/pdf. |
Title metadata | string | The PDF title is the HTML title of the source document. |
error | string | On failure the body is JSON with an error message instead of a PDF. |
How to
How do I save the PDF with curl?
Add -o file.pdf to the request.
curl -H "Authorization: Bearer $SECFEED_KEY" \ "https://secfeedapi.com/v1/pdf?url=https://www.sec.gov/Archives/edgar/data/32604/000003260426000047/apensionrestatementxex991.htm"
How do I convert an exhibit rather than the main filing?
Pass the exhibit's own URL. Get it from /v1/files for the filing.
curl -H "Authorization: Bearer $SECFEED_KEY" \ "https://secfeedapi.com/v1/files?cik=32604&accessionNo=0000032604-26-000047"
Can I pass the sec.gov inline XBRL viewer link?
Yes. https://www.sec.gov/ix?doc=... links are rewritten to the archive file.
curl -H "Authorization: Bearer $SECFEED_KEY" \ "https://secfeedapi.com/v1/pdf?url=https://www.sec.gov/ix?doc=/Archives/edgar/data/32604/000003260426000047/emr-20261013.htm"
How do I get a cover sheet listing every document?
Pass the filing index URL ending in -index.htm.
curl -H "Authorization: Bearer $SECFEED_KEY" \ "https://secfeedapi.com/v1/pdf?url=https://www.sec.gov/Archives/edgar/data/32604/000003260426000047/0000032604-26-000047-index.htm"
What happens with documents that are already PDFs?
They are returned as filed, without re-rendering, for example the audited reports attached to X-17A-5 filings.
curl -H "Authorization: Bearer $SECFEED_KEY" \ "https://secfeedapi.com/v1/pdf?url=https://www.sec.gov/Archives/edgar/data/844934/000084493426000001/Audit2026completedsigned.pdf"
How do I find the URL for a company's latest 10-K?
Search with the Filing Query API and use linkToFilingDetails, or list files with /v1/files.
curl -H "Authorization: Bearer $SECFEED_KEY" \ "https://secfeedapi.com/v1/filings?query=ticker:NVDA%20AND%20formType:%2210-K%22&size=1"
Why do I get 400 for some URLs?
Only files under https://www.sec.gov/Archives/edgar/data/ are accepted.
curl -H "Authorization: Bearer $SECFEED_KEY" \ "https://secfeedapi.com/v1/pdf?url=https://www.sec.gov/Archives/edgar/data/32604/000003260426000047/apensionrestatementxex991.htm"
How long does a large filing take?
A few seconds for most documents; very long 10-K filings take longer. Requests run two at a time per server, so space out bulk jobs.
curl -H "Authorization: Bearer $SECFEED_KEY" \ "https://secfeedapi.com/v1/pdf?url=https://www.sec.gov/Archives/edgar/data/1045810/000104581026000078/0001045810-26-000078-index.htm"
Errors
- 400 missing parameter: url.
- 400 url must be an EDGAR archive file, for other hosts or paths.
See also the error codes every endpoint shares.
Try it with your own key
500 free calls a month.