Yahoo Finance hub

Yahoo Finance Custom Screener API

Your own filters over a screened universe, one page at a time.

POST /v1/yahoo-finance/screener

1 credit Failed requests are free

About this endpoint

POST /v1/yahoo-finance/screener takes instrumentType, filters, query, sort, order, limit, offset and cursor in a JSON body and returns data.instrumentType, data.total, data.start, data.count, data.quotes, data.page and data.windowClamped. instrumentType is one of equity, etf, mutualfund, crypto, index, future, currency or option.

Each filter is { field, operator, value } or { field, operator, values }, and filters combine with AND. Operators are EQ, GT, GTE, LT, LTE, BTWN, GTELT, MATCH_PHRASE, MATCH_ANY, MATCH_ALL and MUST_NOT; the operator defaults to EQ. Up to 20 filters are accepted. When no filter sets region or exchange, the screen is limited to US instruments; crypto and currency screens have no US default, and currency screens have no exchange filter. The default sort is intradaymarketcap for equity and crypto and ticker for the other types. Add a region or exchange filter to screen another market and it is sent as your filters alone. A raw query is sent as-is and no US default is added. An unknown filter or sort field is refused with a 400 before anything is fetched on equity and ETF screens, the types whose fields are listed at /v1/yahoo-finance/screener/fields; other instrument types pass fields through as given. Premium-flagged fields are refused the same way. Page with offset or the opaque cursor from data.page.nextCursor; only the first 10,000 rows are available.

Yahoo Finance Custom Screener API FAQ

How do I build a filter?

Send filters as an array of objects with field, operator and value or values. For example { field: "intradaymarketcap", operator: "GT", value: 1000000 }. Filters combine with AND.

Which operators are supported?

EQ, GT, GTE, LT, LTE, BTWN, GTELT, MATCH_PHRASE, MATCH_ANY, MATCH_ALL and MUST_NOT. EQ is the default when operator is omitted.

Can I sort by any field?

Only fields the screener supports and that are not premium-flagged. A premium sort field is refused before any request, so no credits are spent on it.

How do I page the result?

Read data.page.nextCursor and post again with cursor and the same filters while data.page.hasMore is true. A page past the 10,000-row limit reports windowClamped: true.

How many credits does this route cost?

Pricing is documented on the operation in the API registry (shown on this page). Confirm on every response with meta.creditsCharged: that field is the billing source of truth.