Endpoints
/v1/bulk
https://secfeedapi.com/v1/bulkCatalog of bulk datasets and months.
- Returns the dataset names, every month that has filings (newest first, back to 1993), and the download URL pattern.
- The month list comes from the filing index; a month can still be empty for a dataset whose history starts later (for example 8-K events or the XML form families).
/v1/bulk/download
https://secfeedapi.com/v1/bulk/downloadA dataset month as gzipped JSON Lines.
| Parameter | Type | Description | Example |
|---|---|---|---|
datasetrequired | string | Dataset name from /v1/bulk: filings, insider-transactions, 13f-holdings, 8-k-events, form-144, form-13d-13g, form-13f, form-d, form-c, reg-a, n-port, n-cen, n-px, x-17a-5. | form-d |
monthrequired | string | Month in YYYY-MM form. Records are selected by their filing date within that month. | 2026-09 |
formType | string | Only for dataset=filings: keep one exact form type. | S-1 |
- Response is application/gzip. Decompress and read one JSON object per line.
- Archives are built on request and cached, so the first download of a month can take a few seconds longer than repeat downloads.
- Rows follow the dataset's storage format: filings rows have accession, cik, company, form, filed, path; XML form rows have accession, form, filed, cik, company and the full parsed data object.
Request examples
Every response below is real output from the API, trimmed to the first records.
List datasets and available months
Pick a dataset name and a month from this list, then call /v1/bulk/download.
curl -H "Authorization: Bearer $SECFEED_KEY" \ "https://secfeedapi.com/v1/bulk"
import os, requests
r = requests.get(
"https://secfeedapi.com/v1/bulk",
headers={"Authorization": f"Bearer {os.environ['SECFEED_KEY']}"},
timeout=60,
)
r.raise_for_status()
print(r.json()){
"datasets": [
"13f-holdings",
"8-k-events"
],
"months": [
"2026-10",
"2026-09"
],
"download": "/v1/bulk/download?dataset=<dataset>&month=<YYYY-MM>[&formType=10-K]"
}Every S-1 filed in September 2026
Returns a .jsonl.gz file. Each line is one filing index row: accession, cik, company, form, filed and path.
curl -H "Authorization: Bearer $SECFEED_KEY" \ "https://secfeedapi.com/v1/bulk/download?dataset=filings&month=2026-09&formType=S-1"
import os, requests
r = requests.get(
"https://secfeedapi.com/v1/bulk/download",
params={'dataset': 'filings', 'month': '2026-09', 'formType': 'S-1'},
headers={"Authorization": f"Bearer {os.environ['SECFEED_KEY']}"},
timeout=60,
)
r.raise_for_status()
print(r.json())A month of Form D private placements
About 5,700 Form D filings for September 2026, each line with the full parsed XML under data.
curl -H "Authorization: Bearer $SECFEED_KEY" \ "https://secfeedapi.com/v1/bulk/download?dataset=form-d&month=2026-09"
import os, requests
r = requests.get(
"https://secfeedapi.com/v1/bulk/download",
params={'dataset': 'form-d', 'month': '2026-09'},
headers={"Authorization": f"Bearer {os.environ['SECFEED_KEY']}"},
timeout=60,
)
r.raise_for_status()
print(r.json())Response fields
| Field | Type | Meaning |
|---|---|---|
datasets | array of strings | /v1/bulk: dataset names accepted by /v1/bulk/download. |
months | array of strings | /v1/bulk: every YYYY-MM with filings in the index, newest first. |
download | string | /v1/bulk: URL pattern for downloads. |
(filings line).accession | string | Accession number. |
(filings line).cik | integer | Filer CIK. |
(filings line).company | string | Filer name as listed in the EDGAR index. |
(filings line).form | string | Form type. |
(filings line).filed | string | Filing date, YYYY-MM-DD. |
(filings line).path | string | Path of the full submission text file under https://www.sec.gov/Archives/. |
(XML form line).accession, form, filed, cik, company | mixed | Identity of the filing, same meaning as above. |
(XML form line).data | object | The full parsed XML of the filing, the same object the family's search endpoint returns under data. |
Datasets
| dataset | What each line is |
|---|---|
| filings | One EDGAR index row (any form type; filter with formType) |
| insider-transactions | One Form 3, 4 or 5 transaction or holding row joined with its filing |
| 13f-holdings | One 13F information table row |
| 8-k-events | One 8-K with its item list |
| form-144, form-13d-13g, form-13f, form-d, form-c, reg-a, n-port, n-cen, n-px, x-17a-5 | One parsed XML filing of that family |
How to
Which months can I download?
Call /v1/bulk. The months array runs from the latest month back to 1993.
curl -H "Authorization: Bearer $SECFEED_KEY" \ "https://secfeedapi.com/v1/bulk"
How do I get every 10-K filed in a month?
Use dataset=filings with formType=10-K. formType is an exact match, so request 10-K/A separately.
curl -H "Authorization: Bearer $SECFEED_KEY" \ "https://secfeedapi.com/v1/bulk/download?dataset=filings&month=2026-09&formType=10-K"
How do I read the file in Python?
Open it with gzip in text mode and json.loads each line. Stream it line by line rather than loading it all for large months.
curl -H "Authorization: Bearer $SECFEED_KEY" \ "https://secfeedapi.com/v1/bulk/download?dataset=filings&month=2026-09&formType=S-1"
How do I download a month of insider transactions for a backtest?
Use dataset=insider-transactions. Each line is one transaction row with the filing's form, date, issuer and owners.
curl -H "Authorization: Bearer $SECFEED_KEY" \ "https://secfeedapi.com/v1/bulk/download?dataset=insider-transactions&month=2026-09"
How do I get all Form D filings for a month with every original field?
Use dataset=form-d. The data object on each line holds the complete parsed XML.
curl -H "Authorization: Bearer $SECFEED_KEY" \ "https://secfeedapi.com/v1/bulk/download?dataset=form-d&month=2026-09"
How do I download 8-K item data in bulk?
Use dataset=8-k-events. Each line lists the 8-K's items; item history currently starts in mid 2024 while the backfill runs.
curl -H "Authorization: Bearer $SECFEED_KEY" \ "https://secfeedapi.com/v1/bulk/download?dataset=8-k-events&month=2026-09"
Can I filter a bulk file by company?
No. Bulk files are whole months. Filter while you read the file, or use the search APIs for a single company.
curl -H "Authorization: Bearer $SECFEED_KEY" \ "https://secfeedapi.com/v1/bulk/download?dataset=form-144&month=2026-09"
Does formType work for datasets other than filings?
No. It is applied only to dataset=filings and ignored elsewhere.
curl -H "Authorization: Bearer $SECFEED_KEY" \ "https://secfeedapi.com/v1/bulk/download?dataset=filings&month=2026-08&formType=8-K"
Why is the first download of a month slower?
Archives are built from the database on the first request and cached for later requests.
curl -H "Authorization: Bearer $SECFEED_KEY" \ "https://secfeedapi.com/v1/bulk/download?dataset=filings&month=2026-07&formType=S-1"
Errors
- 400 with a list of valid names when dataset is unknown.
- 400 when dataset or month is missing.
See also the error codes every endpoint shares.
Try it with your own key
500 free calls a month.