SEC Company Screener API: filter all US filers by financials
Coming soon to the StoreScreen every US company that files with the SEC by revenue, profit, margins, cash flow and balance sheet for one calendar year or quarter: "revenue over $10B and net margin above 20% in 2025", "top 20 by operating cash flow". For analysts, finance apps and AI agents. Every value cites the XBRL tag and the SEC filing it came from.
Pricing (pay per event): $0.002 per company returned ($2 per 1,000). A top 20 costs $0.04, the default 50 rows $0.10. maxResults caps the cost; screens that match nothing or fail are free.
Questions agents ask
- “Which US companies had revenue over $10B and net margin above 20% in fiscal 2025?”
- “Top 20 US companies by operating cash flow in 2025.”
- “Which companies with a ticker had an operating margin above 30% in Q3 2025?”
Example
Input
{
"period": "CY2025",
"filters": [
{ "metric": "revenue", "min": 10000000000 },
{ "metric": "net_margin", "min": 0.2 }
],
"sortBy": "revenue",
"maxResults": 50
}Output
[
{
"schema_version": "1",
"ticker": "AAPL",
"cik": "0000320193",
"company_name": "Apple Inc.",
"period": "CY2025",
"period_start": "2024-09-29",
"period_end": "2025-09-27",
"currency": "USD",
"revenue": 416161000000,
"net_margin": 0.2692,
"net_income": 112010000000,
"sources": {
"revenue": {
"tag": "us-gaap:RevenueFromContractWithCustomerExcludingAssessedTax",
"accession": "0000320193-26-000026",
"url": "https://www.sec.gov/Archives/edgar/data/320193/000032019326000026/0000320193-26-000026-index.htm"
},
"net_income": {
"tag": "us-gaap:NetIncomeLoss",
"accession": "0000320193-26-000026",
"url": "https://www.sec.gov/Archives/edgar/data/320193/000032019326000026/0000320193-26-000026-index.htm"
},
"net_margin": {
"derived": "net_income / revenue"
}
},
"warnings": [],
"retrieved_at": "2026-11-05T22:18:21+00:00"
},
{
"schema_version": "1",
"ticker": "JPM",
"cik": "0000019617",
"company_name": "JPMorgan Chase & Co",
"period": "CY2025",
"period_start": "2025-01-01",
"period_end": "2025-12-31",
"currency": "USD",
"revenue": 182447000000,
"net_margin": 0.3127,
"net_income": 57048000000,
"sources": {
"revenue": {
"tag": "us-gaap:Revenues",
"accession": "0001628280-26-008131",
"url": "https://www.sec.gov/Archives/edgar/data/19617/000162828026008131/0001628280-26-008131-index.htm"
},
"net_income": {
"tag": "us-gaap:NetIncomeLoss",
"accession": "0001628280-26-008131",
"url": "https://www.sec.gov/Archives/edgar/data/19617/000162828026008131/0001628280-26-008131-index.htm"
},
"net_margin": {
"derived": "net_income / revenue"
}
},
"warnings": [
"net_income: 57000000000 from filing 0000019617-26-000096 (not a 10-K/10-Q) replaced by 57048000000 from 0001628280-26-008131"
],
"retrieved_at": "2026-11-05T22:18:21+00:00"
}
]What you get
| Field | Type | Meaning |
|---|---|---|
schema_version | string | Output schema version. |
ticker | string | null | Main ticker in the SEC's current ticker list (null if the company has none, e.g. delisted or private debt issuers). |
cik | string | SEC CIK, 10 digits. |
company_name | string | null | Company name as in the SEC frame. |
period | string | The calendar period screened, e.g. CY2025 or CY2025Q3. SEC frames are calendar-aligned: each company appears with its own fiscal period that best fits this calendar period (Apple's year to 27 Sep 2025, Microsoft's to 30 Jun 2025 and Walmart's to 31 Jan 2026 are all in CY2025). See period_start/period_end. |
period_start | string | null | First day of the company's own fiscal period that SEC assigned to this calendar period (YYYY-MM-DD); null when the company reported no duration value (income, cash flow or EPS) for it. |
period_end | string | null | Last day of that fiscal period (YYYY-MM-DD); balance-sheet values are as of this date (when period_start is null: the balance-sheet date nearest the calendar period's end). |
currency | string | Always USD: frames are screened in USD (companies reporting in other currencies are not included). Values are in full dollars, not thousands. |
revenue | number | null | Total revenue / net sales (for banks: total net revenue). In USD. Only present when asked (sortBy, filters, metrics) or needed for a derived field. |
cost_of_revenue | number | null | Cost of revenue / cost of goods and services sold. In USD. Only present when asked (sortBy, filters, metrics) or needed for a derived field. |
gross_profit | number | null | Gross profit; when not tagged, revenue - cost_of_revenue (sources says derived). In USD. Only present when asked (sortBy, filters, metrics) or needed for a derived field. |
research_and_development | number | null | Research and development expense. In USD. Only present when asked (sortBy, filters, metrics) or needed for a derived field. |
selling_general_and_administrative | number | null | Selling, general and administrative expense (null when the company reports sales/marketing and G&A separately). In USD. Only present when asked (sortBy, filters, metrics) or needed for a derived field. |
operating_profit | number | null | Operating income (loss). Null for most banks and insurers. In USD. Only present when asked (sortBy, filters, metrics) or needed for a derived field. |
profit_before_tax | number | null | Income from continuing operations before income taxes. In USD. Only present when asked (sortBy, filters, metrics) or needed for a derived field. |
net_income | number | null | Net income including noncontrolling interests (ProfitLoss), else net income attributable to the parent; as in the esef-annual-reports Actor. In USD. Only present when asked (sortBy, filters, metrics) or needed for a derived field. |
net_income_attributable_to_parent | number | null | Net income attributable to the parent's shareholders (the US 'net income' headline). In USD. Only present when asked (sortBy, filters, metrics) or needed for a derived field. |
eps_basic | number | null | Basic earnings per share, in USD per share. Never derived (null for Q4 unless reported). Only present when asked (sortBy, filters, metrics) or needed for a derived field. |
eps_diluted | number | null | Diluted earnings per share, in USD per share. Never derived. Only present when asked (sortBy, filters, metrics) or needed for a derived field. |
weighted_average_shares_basic | number | null | Weighted average shares outstanding, basic. Never derived. Only present when asked (sortBy, filters, metrics) or needed for a derived field. |
weighted_average_shares_diluted | number | null | Weighted average shares outstanding, diluted. Never derived. Only present when asked (sortBy, filters, metrics) or needed for a derived field. |
depreciation_amortisation | number | null | Depreciation, depletion and amortization (cash flow statement). In USD. Only present when asked (sortBy, filters, metrics) or needed for a derived field. |
total_assets | number | null | Total assets at period end. In USD. Only present when asked (sortBy, filters, metrics) or needed for a derived field. |
current_assets | number | null | Total current assets at period end. Null for banks and insurers (unclassified balance sheet). In USD. Only present when asked (sortBy, filters, metrics) or needed for a derived field. |
cash_and_equivalents | number | null | Cash and cash equivalents at period end (banks: cash and due from banks). In USD. Only present when asked (sortBy, filters, metrics) or needed for a derived field. |
total_liabilities | number | null | Total liabilities; when not tagged, total_assets - total_equity (sources says derived). In USD. Only present when asked (sortBy, filters, metrics) or needed for a derived field. |
current_liabilities | number | null | Total current liabilities. Null for banks and insurers. In USD. Only present when asked (sortBy, filters, metrics) or needed for a derived field. |
noncurrent_liabilities | number | null | Total non-current liabilities, when tagged. In USD. Only present when asked (sortBy, filters, metrics) or needed for a derived field. |
long_term_debt | number | null | Long-term debt, non-current portion where tagged, else total long-term debt; sources shows the tag. In USD. Only present when asked (sortBy, filters, metrics) or needed for a derived field. |
total_equity | number | null | Total equity including noncontrolling interests, else stockholders' equity. In USD. Only present when asked (sortBy, filters, metrics) or needed for a derived field. |
equity_attributable_to_parent | number | null | Stockholders' equity attributable to the parent. In USD. Only present when asked (sortBy, filters, metrics) or needed for a derived field. |
shares_outstanding | number | null | Common shares outstanding at the balance-sheet date. Only present when asked (sortBy, filters, metrics) or needed for a derived field. |
operating_cash_flow | number | null | Net cash from operating activities. In USD. Only present when asked (sortBy, filters, metrics) or needed for a derived field. |
investing_cash_flow | number | null | Net cash from investing activities. In USD. Only present when asked (sortBy, filters, metrics) or needed for a derived field. |
financing_cash_flow | number | null | Net cash from financing activities. In USD. Only present when asked (sortBy, filters, metrics) or needed for a derived field. |
capex | number | null | Capital expenditure: payments for property, plant and equipment, as a positive number. Null for most banks. In USD. Only present when asked (sortBy, filters, metrics) or needed for a derived field. |
dividends_paid | number | null | Dividends paid in cash, as a positive number. In USD. Only present when asked (sortBy, filters, metrics) or needed for a derived field. |
free_cash_flow | number | null | Derived: operating_cash_flow - capex. Only present when asked (sortBy, filters, metrics) or needed for a derived field. |
ebitda | number | null | Derived: operating_profit + depreciation_amortisation. Only present when asked (sortBy, filters, metrics) or needed for a derived field. |
gross_margin | number | null | Derived: gross_profit / revenue (0.25 = 25%). Only present when asked (sortBy, filters, metrics) or needed for a derived field. |
operating_margin | number | null | Derived: operating_profit / revenue (0.25 = 25%). Only present when asked (sortBy, filters, metrics) or needed for a derived field. |
net_margin | number | null | Derived: net_income / revenue (0.25 = 25%). Only present when asked (sortBy, filters, metrics) or needed for a derived field. |
return_on_equity | number | null | Derived: net_income / total_equity (0.25 = 25%). Calendar-year periods only. Only present when asked (sortBy, filters, metrics) or needed for a derived field. |
equity_ratio | number | null | Derived: total_equity / total_assets (0.25 = 25%). Only present when asked (sortBy, filters, metrics) or needed for a derived field. |
sources | object | Only with includeSources: per metric {tag: XBRL concept used, accession: SEC filing the value comes from (the latest filing that reported it, or for re-checked values the first 10-K/10-Q that did), url: its EDGAR index page}, or {derived: formula} for derived values. |
warnings | array | Notes on this row: a value from a proxy statement replaced by the 10-K/10-Q figure, a value that could not be checked, or a metric left out because it was reported for a different period than the row's. |
retrieved_at | string | UTC time the row was produced. |
Use with AI agents (MCP)
Add this URL to your MCP client (Claude, Cursor, VS Code, ...) to load the Actor as a tool through the Apify hosted MCP server. It signs you in with OAuth or accepts Authorization: Bearer <APIFY_TOKEN>. It works once the Actor is live on the Apify Store.
https://mcp.apify.com?tools=bosco_labs/sec-company-screen
For “Which US companies had revenue over $10B and net margin above 20% in fiscal 2025?” the agent passes:
{"period": "CY2025", "sortBy": "operating_cash_flow", "maxResults": 20, "tickersOnly": true}
stable, typed JSON, one row per company, in rank order, each with schema_version, the company's own period_start/period_end, and per value the XBRL tag and SEC filing URL to cite. A top 20 is about 11 KB with sources; 50 rows about 40 KB.
Or call the Apify API: POST https://api.apify.com/v2/acts/bosco_labs~sec-company-screen/run-sync-get-dataset-items with the input as JSON body. Cost: $0.002 per company returned.
HTTP API
Also on the Bosco Labs HTTP API (beta, test mode): same input and same rows as the Actor, $0.002 per company returned from prepaid credits (max 200 companies (maxResults) per call). Get a key with a $0.50 free trial; see prices and limits.
curl https://api.boscolabs.dev/v1/sec-company-screen \
-H "Authorization: Bearer $BOSCO_API_KEY" \
-H "Content-Type: application/json" \
-d '{"period": "CY2025", "sortBy": "operating_cash_flow", "maxResults": 20, "tickersOnly": true}'
Input fields
| Field | Type | Meaning |
|---|---|---|
period | string (required) | Calendar period in SEC frames format: "CY2025" = annual figures, "CY2025Q3" = 3-month quarter figures. Required, 2009 to the current year. Calendar-aligned: each company comes with its own fiscal period that best fits it (e.g. CY2025 holds Apple's fiscal year to Sep 2025, Microsoft's to Jun 2025, Walmart's to Jan 2026), shown in period_start/period_end. Balance-sheet metrics are taken at each company's period end. |
filters | array | Conditions every company must meet, as a list of {metric, min, max} (either bound optional, both inclusive), e.g. [{"metric": "revenue", "min": 10000000000}, {"metric": "net_margin", "min": 0.2}] = revenue of at least $10B and net margin of at least 20%. Money in full USD (10000000000 = $10B), ratios as fractions (0.2 = 20%), EPS in USD per share. A company without a value for a filter metric is left out. Metrics: see sortBy. Empty = no filter (all companies with a sortBy value). |
sortBy | string | Metric to rank by, e.g. "operating_cash_flow". Same names as the SEC Company Financials Actor; the last seven (free_cash_flow to equity_ratio) are derived from two reported metrics. Companies without a value for it are left out. Empty = the first filter's metric, else revenue. |
sortOrder | string | "desc" = largest first (top N), "asc" = smallest first (e.g. the lowest net margin). Default "desc". |
maxResults | integer | Most companies to return (and charge for), e.g. 20 for a top 20. The status message says how many matched in total. Default 50, max 1000. |
metrics | array | More fields to show per company besides the sortBy and filter metrics, e.g. ["operating_cash_flow", "total_assets"]. Same names as sortBy. Each adds a few SEC requests. Empty = only the sortBy and filter metrics (plus the inputs of derived ones). |
tickersOnly | boolean | true = skip companies without a ticker in the SEC's company_tickers.json (delisted companies, private issuers of public debt, subsidiaries). Default false. |
includeSources | boolean | true = each row has sources: per value the XBRL tag, the SEC accession number and the filing URL (or the formula for derived values). false = values only, about 3x smaller rows. Default true. |
Sources, licence and limits
Which companies? Every SEC filer whose XBRL facts are in the frames: about 6,000 companies with annual revenue or net income for 2025, including some without a ticker (delisted companies, private issuers of public debt); tickersOnly drops those. Values are in USD only: companies reporting in another currency (many 20-F filers, e.g. in EUR or DKK) are not in USD frames, and the SEC publishes no frames for IFRS tags, so most IFRS filers are missing. Use the SEC Company Financials Actor for them.
How fresh? The SEC updates frames shortly after filings. A calendar year fills up as annual reports come in, up to about three months after each company's year end (and later for fiscal years ending early the next year), so screens of the latest year miss late filers.
Why is a company missing? It didn't tag the metric with one of the standard candidate tags, reported it for a period that doesn't fit the calendar period, has no value for a filter or the sort metric, or reports in another currency. Banks have no gross profit, operating profit or current assets; most companies report quarterly cash flow only year to date, so quarterly (CY2025Q3) cash-flow fields are usually null except for a company's first fiscal quarter. Calendar-year companies report no separate fourth quarter (the 10-K has only the full year), so a Q4 period (CY2025Q4) holds mostly companies with other fiscal years: use CY2025 instead.
Fiscal year or calendar year? Calendar-aligned, see above: each company appears with the fiscal period that best fits the calendar period. For exact fiscal years and quarters of a given company, use the SEC Company Financials Actor.
What is not included? Market data (prices, market cap, P/E), revenue growth, segment figures, non-GAAP figures, forecasts, and anything before 2009.
Legal basis? SEC filings are US government public records. See LEGAL.md.