Quickstart
This page walks you from a clean slate to a working /v1/quote call in five minutes.
You will need a terminal with curl, and either Python 3.10+ or Node 18+ if you want
to follow the language-specific examples.
Five steps
-
Create an account. Go to oneapi.finance/signup and sign up with Google or email. No credit card is required for the free tier.
-
Mint an API key. From the dashboard, click Create key, give it a name (such as
local-dev), and copy the value. The key is shown exactly once. It looks likeoa_live_abcd1234.... Treat it like a password. -
Test the key with curl. Replace
oa_live_...with your key:Terminal window curl -H "Authorization: Bearer oa_live_..." \"https://api.oneapi.finance/v1/quote?symbol=AAPL"You should get back a JSON object with a
quotefield. If you see a401, re-check theAuthorizationheader. If you see a429, you have hit the per-minute limit on the free tier and should wait a minute. -
Make the same call from your language of choice.
Terminal window curl -H "Authorization: Bearer oa_live_..." \"https://api.oneapi.finance/v1/quote?symbol=AAPL"import osimport httpxAPI_KEY = os.environ["ONEAPI_KEY"]r = httpx.get("https://api.oneapi.finance/v1/quote",params={"symbol": "AAPL"},headers={"Authorization": f"Bearer {API_KEY}"},timeout=10.0,)r.raise_for_status()print(r.json()["quote"])const API_KEY = process.env.ONEAPI_KEY;const r = await fetch("https://api.oneapi.finance/v1/quote?symbol=AAPL",{ headers: { Authorization: `Bearer ${API_KEY}` } },);if (!r.ok) throw new Error(`HTTP ${r.status}`);const { quote } = await r.json();console.log(quote);import type { QuotesResponse } from "./oneapi-types";const r = await fetch("https://api.oneapi.finance/v1/quote?symbol=AAPL",{ headers: { Authorization: `Bearer ${process.env.ONEAPI_KEY}` } },);const body = (await r.json()) as QuotesResponse;console.log(body.quote); -
Batch up to eight symbols in one call. Use the
symbolsquery param with a comma-separated list:Terminal window curl -H "Authorization: Bearer oa_live_..." \"https://api.oneapi.finance/v1/quote?symbols=AAPL,MSFT,GOOGL,AMZN"The response shape changes from
{ "quote": {...} }to{ "quotes": { "AAPL": {...}, ... } }. See the batching recipe.
What you got back
A /v1/quote response for a single symbol looks like this:
{ "quote": { "symbol": "AAPL", "name": "Apple Inc.", "exchange": "NASDAQ", "currency": "USD", "price": 175.43, "open": 174.0, "high": 176.1, "low": 173.8, "previousClose": 174.5, "change": 0.93, "changePercent": 0.53, "volume": 52000000, "avgVolume": 60000000, "high52Week": 198.23, "low52Week": 124.17, "timestamp": "2026-05-04T20:00:00Z", "meta": { "source": "yahoo_query1", "fetched_at": "2026-05-04T20:14:32Z" } }}Two fields deserve attention up front:
timestampis the timestamp of the price tick, not when we fetched it.meta.fetched_atis when our worker pulled the data from the upstream source.
The difference between those two values, plus our 15-minute delay window, tells you how fresh the price is. Read the delayed-data page to understand why this matters and how to use it.
What’s next
- Authentication — header format, key rotation, and security tips.
- Rate limits — what 429 means and how to retry.
- API reference — every endpoint, every field.
- Migrating from another provider — if you are coming from a similar API.