Company and financial data

SEC EDGAR Filings by Company: 10-K, 10-Q, 8-K list with links

Recent SEC EDGAR filings per company by ticker or CIK, up to 200 companies a run and 1,000 filings each: form, filing and report dates, 8-K items, accession number, document and index links, plus SIC, state and exchange per company, from the SEC's JSON API. Filter on form and date. Pay per filing.

$1.00per 1,000 · Filing listed

One filing delivered. Unknown companies and companies without matching filings are never charged.

Call it from your code

curl
ACTOR=steadydata~sec-edgar-filings
URL="https://api.apify.com/v2/acts/$ACTOR/run-sync-get-dataset-items"

curl -X POST "$URL?token=$APIFY_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"companies": ["AAPL", "320193", "TSLA"], "forms": ["10-K", "10-Q", "8-K"], "maxFilingsPerCompany": 50}'
python
import os, requests

ACTOR = "steadydata~sec-edgar-filings"
URL = f"https://api.apify.com/v2/acts/{ACTOR}/run-sync-get-dataset-items"

rows = requests.post(
    URL,
    params={"token": os.environ["APIFY_TOKEN"]},
    json={'companies': ['AAPL', '320193', 'TSLA'], 'forms': ['10-K', '10-Q', '8-K'], 'maxFilingsPerCompany': 50},
    timeout=900,
).json()

# every row carries a status; failures are records, not exceptions
ok = [r for r in rows if r.get("status") == "ok"]
print(len(ok), "rows delivered")
javascript
const ACTOR = "steadydata~sec-edgar-filings";
const url =
  `https://api.apify.com/v2/acts/${ACTOR}/run-sync-get-dataset-items` +
  `?token=${process.env.APIFY_TOKEN}`;

const rows = await fetch(url, {
  method: "POST",
  headers: { "Content-Type": "application/json" },
  body: JSON.stringify({"companies": ["AAPL", "320193", "TSLA"], "forms": ["10-K", "10-Q", "8-K"], "maxFilingsPerCompany": 50}),
}).then((r) => r.json());

// one object per delivered row, same shape every time
console.log(rows.filter((r) => r.status === "ok").length, "rows");

Use it in an agent

Point an MCP client at Apify's hosted server with this dataset in the tools list, or run our own server locally.

mcp url
https://mcp.apify.com?tools=steadydata/sec-edgar-filings

# the tool arrives in your agent as steadydata--sec-edgar-filings

Input

FieldTypeNameWhat it does
companies
required
array of stringCompaniesOne per row, up to 200: a ticker (AAPL), a CIK (320193) or an EDGAR company URL.
formsarray of stringForm typesOnly these forms, for example 10-K, 10-Q, 8-K, S-1, 4, 13F-HR, DEF 14A. Empty means every form.
sinceDatestringFiled sinceOnly filings filed on or after this date (YYYY-MM-DD). Empty means no date limit.
maxFilingsPerCompanyintegerMax filings per companyCost ceiling per company, newest first; the SEC API carries the latest 1,000 filings.

What you get back

output schema, one object per delivered row
{
  "cik": string | null,
  "companyName": string | null,
  "tickers": array | null,
  "exchanges": array | null,
  "sic": string | null,
  "sicDescription": string | null,
  "stateOfIncorporation": string | null,
  "fiscalYearEnd": string | null,
  "filerCategory": string | null,
  "form": string | null,
  "filingDate": string | null,
  "reportDate": string | null,
  "acceptedAt": string | null,
  "items": string | null,
  "accessionNumber": string | null,
  "primaryDocument": string | null,
  "primaryDocDescription": string | null,
  "documentUrl": string | null,
  "indexUrl": string | null,
  "sizeBytes": integer | null,
  "isXbrl": boolean | null,
  "isInlineXbrl": boolean | null,
  "status": string | null,
  "input": string | null,
  "errorCode": string | null,
  "error": string | null
}
FieldTypeWhen it is filled
cikstring, null
companyNamestring, null
tickersarray, null
exchangesarray, null
sicstring, null
sicDescriptionstring, null
stateOfIncorporationstring, null
fiscalYearEndstring, null
filerCategorystring, null
formstring, null
filingDatestring, null
reportDatestring, null
acceptedAtstring, null
itemsstring, null
accessionNumberstring, null
primaryDocumentstring, null
primaryDocDescriptionstring, null
documentUrlstring, null
indexUrlstring, null
sizeBytesinteger, null
isXbrlboolean, null
isInlineXbrlboolean, null
statusstring, nullEither 'ok' or 'error'. An error row carries errorCode and error, and leaves the data fields empty; it is never charged.
inputstring, nullThe input this row was built from, so a row can always be traced back.
errorCodestring, nullFilled on an error row only; a delivered row leaves it empty.
errorstring, nullFilled on an error row only; a delivered row leaves it empty.

Related datasets

Already using this one? Ratings are the first thing other buyers look at, and this dataset has none yet. If it does a job for you, a rating on its Apify page is the one thing that helps. It takes a minute and it is the only thing we ask for.

Open the Apify page