Almost every "free stock API" hands you a key, then meters it: 25 calls a day, 5 a minute, fundamentals locked behind the paid tier. For a dashboard, a backtest, or a watchlist, you blow through that before lunch. The workaround most people reach for — the public Yahoo Finance JSON endpoints — genuinely needs no key, but it has a cookie-and-crumb handshake and a hair-trigger rate limit that turns a working script into empty responses overnight. This walks the clean path.
Three kinds of data, one source
Decide which of these you need — the request shape and the gotchas differ for each:
Live quote
The near-real-time snapshot you'd see on the ticker page.
marketCap · dayHigh/Low
bid · ask
Fundamentals
The valuation and profile numbers for screening.
dividendYield · beta
fiftyTwoWeekHigh/Low
Price history
OHLCV bars back years, for charts and backtests.
low · close · adjClose
volume
The history feed is the one with the most knobs: you set an interval (1d, 1wk, 1mo) and a range (1mo, 1y, 5y, max). Asking for 1d bars over max on a 30-year-old stock returns thousands of rows — fine, but size your request to the chart you're actually drawing.
Worked example: a 5-stock dashboard feed
Say you want a morning feed for five tickers: current price plus a few fundamentals, refreshed daily. You list the symbols, ask for quote-plus-fundamentals, and run it.
curl -X POST "https://api.apify.com/v2/acts/YOUR_ACTOR_ID/run-sync-get-dataset-items?token=YOUR_APIFY_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"tickers": ["AAPL", "MSFT", "NVDA", "AMZN", "GOOGL"],
"dataType": "quote"
}'
Response (one row per ticker)
[
{
"symbol": "AAPL",
"regularMarketPrice": 228.52,
"regularMarketChangePercent": 1.34,
"marketCap": 3470000000000,
"trailingPE": 34.8,
"epsTrailingTwelveMonths": 6.57,
"dividendYield": 0.43,
"fiftyTwoWeekHigh": 260.10,
"fiftyTwoWeekLow": 169.21,
"currency": "USD"
}
]
That's the whole task for a quote feed. Swap "dataType": "quote" for "dataType": "history" and add "interval": "1d" plus "range": "1y" to get a year of daily bars per ticker instead. Append &format=csv to the dataset URL and the same data lands as a spreadsheet you can chart in Sheets.
Why the DIY version breaks — and what to watch for
If you skip the Actor and hit the endpoints yourself, you'll meet these in roughly this order. None of them throw a friendly error; they just return nothing, which is what makes them maddening:
| Symptom | Cause | Fix |
|---|---|---|
| 401 / "Invalid Crumb" | Yahoo's quote endpoints require a crumb token paired with a session cookie you have to fetch first. | Do the cookie handshake, then attach the crumb to every call. The Actor does this transparently. |
| HTTP 429, then empties | Too many requests from one IP. The rate ceiling is low and unpublished, and it cools down slowly. | Pace requests and rotate IPs. A few hundred tickers in a tight loop will trip it. |
| Missing fundamentals | Quote and fundamentals come from different modules; one request doesn't return both unless you ask the right module. | Request the correct data type, or let the Actor merge the modules into one row. |
| Wrong number of bars | Interval and range interact: some pairings silently cap or thin the series. | Pick a sane interval/range pair and validate the row count against the date span. |
| Stale or delayed price | The public feed is near-real-time for US equities but can lag, and is delayed for some exchanges. | Treat it as "near-real-time," not tick data. For most dashboards and backtests it's plenty. |
Notice the theme: the data is free and good, but the access layer is hostile by design. The reason a maintained Actor is worth it here isn't the parsing — it's that the cookie/crumb handshake and the throttling are exactly the parts that rot and need babysitting.
Skip the cookie-and-crumb circus
The Yahoo Finance Actor handles the session handshake, the crumb token and the rate-limit pacing, then returns quotes, fundamentals or full price history as clean JSON or CSV — no key, no quota to ration.
Run the Yahoo Finance Actor → Or get done-for-you leadsWhen you'd want a paid key instead
Being honest about the trade-off: if you need a contractual data license, guaranteed sub-second tick data, or coverage of exotic instruments and exchanges, a paid market-data vendor is the right call. The no-key route shines for the 90% case — building a watchlist, screening on fundamentals, backtesting on daily bars, powering a side-project dashboard — where paying per call or rationing a free quota is the only thing standing between you and the data.
Disclosure: links to Apify on this page are affiliate links, marked rel="sponsored". If you create a paid account through them we may earn a commission at no extra cost to you. We recommend Apify because we build and ship Actors on it ourselves, including the Yahoo Finance Actor linked above.