Skip to main content
POST
Search financial statements

Overview

The Financial Datasets stock screener API returns the stocks that match your filters on financial statement fields, financial metrics, sector, and industry. It covers 17,000+ US tickers and screens the latest reported data, updated within 1 second. With as_of it screens the data that was public on any date since 2010, for backtests without lookahead. Financial statement data is parsed directly from SEC filings (data provenance). You can call it as a REST endpoint with an API key, or from Claude, ChatGPT, Cursor, and other AI apps through the MCP server. Pricing starts at $20. You can combine multiple conditions (such as revenue thresholds, valuation ratios, profitability margins, debt levels, and industry/sector classifications) to screen for stocks that fit your strategy. All available metrics are listed in the Available Filters section below. For example, you can search for companies with revenue greater than $100 million and a P/E ratio less than 20 with the following request body:
And receive the following search results, sorted by ticker:

Coverage

Request Body

A JSON object with the following properties:
  • filters (array, required): An array of filter objects to apply.
  • limit (integer, optional): The maximum number of results to return. Defaults to 10.
  • order_by (object, optional): Sort the matches before the limit applies, for example {"field": "market_cap", "direction": "desc"}. field is any numeric filter field; direction is asc or desc (default desc). Without it, results come back sorted by ticker. The sort field is added to every result row.
  • as_of (date, optional): Screen as of this date, YYYY-MM-DD. See Point-in-time screening.
  • currency (string, optional): The currency of the statement values. Defaults to USD.
A company is on the screen while its latest reported period is at most 180 days old. That is the longest legal gap between a period end and the next filing, so a company between quarters stays on the screen and a company that stopped filing drops off. Filters Each filter object in the filters array must contain:
  • field (string): The financial metric or company attribute to filter on.
  • operator (string): The comparison operator.
  • value (integer, decimal, or string): The value to compare against. Use strings for company fields like sector and industry.
Operators The operator must be one of the following:
  • "eq" (equal to)
  • "gt" (greater than)
  • "gte" (greater than or equal to)
  • "lt" (less than)
  • "lte" (less than or equal to)
  • "in" (value is in the provided array)
in works on every field: a list of numbers for a numeric field, a list of strings for sector, industry, and ticker.

Available Filters

You can filter by any of the fields below, which are grouped by their source. You can also fetch these programmatically via GET /financials/search/screener/filters.
Margins and ratios (e.g. gross_margin, operating_margin, net_margin, revenue_growth) are stored as decimals, not percentages. For example, a 10% operating margin is 0.10, not 10.Valuation ratios like pe_ratio can be negative for companies with negative earnings. To screen for a “reasonable” P/E range, use two filters — e.g. pe_ratio gte 0 and pe_ratio lte 25.Company fields (sector, industry) accept string values and only support the eq and in operators. Values are case-insensitive — e.g. "health care" matches "Health Care". These fields use the GICS (Global Industry Classification Standard) classification system.

Point-in-time screening for backtests

Add as_of to screen on the data that was public on that date. For each company, the screener takes the newest filing it had made public on or before as_of and applies your filters to that filing. A report filed after as_of is never used, even when its period ends before as_of. This is the universe a backtest could have picked from on that day, with no lookahead.
Every row carries filing_date, the day the matched filing became public, and report_period, the period it covers. The response carries as_of and coverage_start, the earliest date you can screen as of.
  • as_of must be between coverage_start (2010-03-01) and today. A date outside that range returns a 400 that names the earliest date.
  • stock_price is not available with as_of. Market cap and the price ratios (pe_ratio, pb_ratio, ps_ratio, ev_ebitda_ratio, ev_revenue_ratio) are as computed when the filing was processed, not recomputed at the close of as_of.
  • The 180-day rule applies to as_of too: a company is on the screen while its latest period on that date is at most 180 days old.

Code Example

FAQ

Which fields can I screen on?

Income statement, balance sheet, cash flow statement, and financial metrics fields, plus sector and industry. The full list is in Available Filters, or fetch it with GET /financials/search/screener/filters.

How do I screen by sector or industry?

Use sector or industry with the eq or in operator. Values are case-insensitive and follow the GICS classification.

Can I run the screen as of a past date for a backtest?

Yes. Add as_of (YYYY-MM-DD, from 2010-03-01). The screen uses only filings that were public on that date, so a backtest never sees a report filed later. See Point-in-time screening.

Can I sort the results, for example the top 50 by market cap?

Yes. Add order_by, for example {"field": "market_cap", "direction": "desc"} with "limit": 50. The sort runs before the limit, so you get the top rows without fetching the whole universe.

Why did a company disappear from the screen?

Its latest reported period is more than 180 days old, which means it has missed a filing deadline or stopped filing. It returns when its next filing is processed.

Do I enter margins as percentages?

No. Margins and ratios are decimals: a 10% operating margin is 0.10, not 10.

Can an AI agent use this data?

Yes. Claude, ChatGPT, Cursor, and other MCP clients reach it through the Financial Datasets MCP server.

Authorizations

X-API-KEY
string
header
required

API key for authentication.

Body

application/json
filters
object[]
required

An array of filter objects to apply to the search.

Minimum array length: 1
limit
integer
default:10

The maximum number of results to return.

Required range: x >= 1
currency
string
default:USD

The currency of the statement values to screen. Defaults to USD.

order_by
object

Sort the matches before the limit applies. Without it, results come back sorted by ticker. The sort field is added to every result row.

as_of
string<date>

Point-in-time screen for backtests: screen on the newest filing each company had made public on or before this date (YYYY-MM-DD). Without it, the screen uses today's latest data. The date must be between coverage_start (2010-03-01) and today. stock_price is not available with as_of.

Response

Successful search response

results
object[]

The companies that match every filter, sorted by ticker, or by order_by when given.

as_of
string<date>

With as_of only: the date the screen was run as of, echoed back.

coverage_start
string<date>

With as_of only: the earliest date a point-in-time screen can be run for.