APEXON API PLATFORM
FinMarkets API documentation
One key, one base URL, one set of conventions. FinMarkets is the first Apexon product: quotes, charts, options, screeners, news, and calendars for anything that touches a ticker.
https://api.apexon.dev
- Interactive explorer — Swagger UI at
api.apexon.dev/docs, ReDoc atapi.apexon.dev/redoc. - Machine-readable spec — OpenAPI 3.1 at
api.apexon.dev/openapi.jsonfor generating clients, mocks, and tests. - Upstream-shaped responses — data endpoints return the upstream payload as-is (e.g.
quoteResponse.result[…]), so field coverage stays complete and stable.
Quickstart
Grab a key (subscribe on the marketplace, or request a direct key), then make your first call:
curl https://api.apexon.dev/v1/stock/NVDA/quote \ -H "X-API-Key: $APEXON_KEY"
{
"quoteResponse": {
"result": [{
"symbol": "NVDA",
"regularMarketPrice": 128.42,
"regularMarketChangePercent": 1.8,
"marketState": "REGULAR",
…
}],
"error": null
}
}
Every response also carries X-Request-Id, X-Cache, and X-RateLimit-* headers — see Responses & headers.
Authentication
All /v1 data endpoints require a key. Send it any of these ways — first match wins:
| Method | How | Use when |
|---|---|---|
X-API-Key header | X-API-Key: <key> | Direct keys — the recommended default. |
| Bearer token | Authorization: Bearer <key> | Clients that standardize on Authorization headers. |
| RapidAPI | X-RapidAPI-Key: <key> | Sent automatically when you call through the RapidAPI gateway. |
| Query param | ?api_key=<key> | Quick tests only — keys in URLs end up in logs. |
Health, legal, and documentation routes (/health, /legal/*, /docs, /redoc) are public.
Responses & headers
Successful data responses are passed through in the upstream's shape rather than re-modelled — what the source publishes is what you get, full field coverage included. The exact shape per endpoint is visible in the interactive explorer.
Standard headers
| Header | Meaning |
|---|---|
X-Request-Id | Unique id for the request — include it in support emails. |
X-Plan | The plan your key resolved to (public when unauthenticated routes allow it). |
X-Cache | HIT or MISS — whether the response came from cache. |
X-Response-Time-ms | Server-side processing time in milliseconds. |
X-RateLimit-Limit / -Remaining / -Reset | Where you stand against your per-minute limit. |
Errors
Errors always return the same machine-readable envelope — never an HTML error page:
{
"success": false,
"error": {
"code": "rate_limited",
"message": "Per-minute limit reached",
"status": 429,
"retry_after_seconds": 18
},
"request_id": "req_9f3c…"
}
| Code | Status | Meaning |
|---|---|---|
unauthorized | 401 | Missing or invalid key. |
forbidden | 403 | Key valid but not allowed for this route or channel. |
not_found | 404 | Unknown route or resource. |
validation_error | 422 | Bad parameters — error.details lists each problem. |
rate_limited | 429 | Per-minute limit reached — honor retry_after_seconds. |
quota_exceeded | 429 | Monthly quota used up — upgrade or wait for reset. |
upstream_error / upstream_timeout | 502 / 504 | The upstream source failed or timed out; safe to retry with backoff. |
internal_error | 500 | Our fault — the request_id helps us find it. |
Rate limits & plans
Plans cap both monthly volume and burst rate. Requests-per-minute is enforced live and surfaced via X-RateLimit-*; monthly quota resets on your billing date. Same prices direct or via marketplace.
| Plan | Price | Requests / mo | Requests / min |
|---|---|---|---|
| BASIC | $0 | 500 | 10 |
| PRO | $9.99/mo | 10,000 | 60 |
| ULTRA | $29.99/mo | 100,000 | 180 |
| MEGA | $79.99/mo | 1,000,000 | 600 |
Caching & freshness
Hot paths are cached server-side so repeat calls skip the upstream round-trip entirely. Cache windows are tuned per route family — quotes, movers, and trending refresh on short intervals; charts and options a little longer; catalogs and filter metadata longest. The X-Cache header on every response tells you whether you got a cached copy.
Data is sourced from upstream providers on a best-effort basis and is not investment advice.
Endpoint reference
The native surface lives under /v1. Path parameters are shown in braces; query parameters list their defaults where one exists. Full request/response schemas are in the interactive explorer.
Meta
| Endpoint | Query params | Notes |
|---|---|---|
GET/health | — | Liveness + upstream session state. |
GET/metrics | — | Basic service counters. |
GET/legal/disclaimer | — | Data-source disclaimer (public). |
GET/legal/terms | — | Terms of use (public). |
GET/ | — | Service descriptor: version, auth modes, alias families. |
Search
| Endpoint | Query params | Notes |
|---|---|---|
GET/v1/autocomplete | q (required) · count=8 | Symbol / company-name suggestions. |
Market
| Endpoint | Query params | Notes |
|---|---|---|
GET/v1/market/summary | region=US · lang=en-US | Index snapshot; multi-region via region=GB, HK, ... |
GET/v1/market/time | key=finance · formatted=True | Session open/close times. |
GET/v1/market/trending | region=US · count=25 | Trending symbols by region. |
GET/v1/market/movers | which=day_gainers · count=25 | Predefined mover lists (day_gainers, day_losers, most_actives, ...). |
GET/v1/market/spark | symbols=AAPL,MSFT · interval=5m · range=1d | Mini chart series for multiple symbols. |
GET/v1/market/quotes | symbols (required) · fields | Multi-symbol quotes - comma-separated list. |
GET/v1/market/tickers | quote_type=EQUITY · size=25 · offset=0 · region=us · sort_field | Tickers by quote type (EQUITY, ETF, ...). |
GET/v1/market/watchlists | q=stocks · count=20 | Popular public watchlists. |
GET/v1/market/watchlist/{pf_id} | count=30 · q | Watchlist detail. |
GET/v1/market/watchlist/{pf_id}/performance | count=30 · q | Watchlist performance series. |
GET/v1/market/sector-performance | include_leaders=False · leaders_size=5 | Sector heatmap; optional per-sector leaders. |
GET/v1/market/industry-performance | sector · size=25 · sort_field=percentchange · sort_type=DESC · min_market_cap=1000000000 · region=us | Industry movers, filterable by sector. |
GET/v1/market/currency | base=EUR · quote=USD · symbols | FX quotes by pair or symbol list. |
GET/v1/market/currency/chart | base=EUR · quote=USD · interval=1d · range=1mo | FX OHLC series. |
GET/v1/market/index/{symbol}/components | count=30 | Index constituents via proxy ETF holdings. |
Stock
| Endpoint | Query params | Notes |
|---|---|---|
GET/v1/stock/{symbol}/quote | — | Full quote - upstream quoteResponse shape. |
GET/v1/stock/{symbol}/chart | interval=1d · range=1mo | OHLCV. Intervals 1m...3mo, ranges 1d...max. |
GET/v1/stock/{symbol}/download | period1 · period2 · interval=1d · range · format=json | Historical rows as CSV or JSON. |
GET/v1/stock/{symbol}/summary | modules=price,summaryDetail,summaryProfile | quoteSummary modules - comma list (price, financialData, ...). |
GET/v1/stock/{symbol}/options | date | Options chain; optional expiration date (epoch s). |
GET/v1/stock/{symbol}/options/bulk | max_expirations=6 · dates | Chain aggregated across expirations. |
GET/v1/stock/{symbol}/board | — | Message-board id for the symbol. |
GET/v1/stock/{symbol}/recommendations | — | Analyst recommendation trend. |
GET/v1/stock/{symbol}/related | — | Related tickers. |
GET/v1/stock/{symbol}/insights | — | Research insights bundle. |
GET/v1/stock/{symbol}/timeseries | types=annualTotalRevenue,trailingPE | Fundamental timeseries by type list. |
GET/v1/stock/{symbol}/recent-updates | news_count=8 | Recent filings, ratings, and news for the symbol. |
GET/v1/stock/{symbol}/holders | — | Institutional / fund ownership package. |
GET/v1/stock/{symbol}/insiders | — | Insider holders and transactions. |
GET/v1/stock/{symbol}/transcripts | — | Earnings-call transcript list. |
GET/v1/stock/{symbol}/transcripts/detail | transcript_id · event_id · url | One transcript with paragraphs. |
GET/v1/stock/{symbol}/futures-chain | include_options=False | Futures chain for an underlying. |
Futures
| Endpoint | Query params | Notes |
|---|---|---|
GET/v1/futures/chain | roots · include_options=False | Futures chain by root symbols. |
News
| Endpoint | Query params | Notes |
|---|---|---|
GET/v1/news/search | q (required) · count=15 | General news search - best default pull. |
GET/v1/news/detail | url (required) | Full article by URL. |
GET/v1/news/ncp | query_ref=latestNews · count=10 | Editorial streams by query ref (latestNews, newsAll, pressRelease). |
GET/v1/news/press-releases | count=10 | Press-release stream. |
GET/v1/news/latest | count=10 | Latest-news stream. |
Screener
| Endpoint | Query params | Notes |
|---|---|---|
GET/v1/screener/catalog | refresh=False | Available predefined screens. |
GET/v1/screener/predefined/{scr_id} | count=25 | Run a predefined screen (most_actives, day_gainers, ...). |
POST/v1/screener | JSON body | Custom screen - JSON body with query operators, size, sort. |
GET/v1/screener/filters | quote_type=EQUITY | Available filter fields per quote type. |
{
"size": 25,
"offset": 0,
"sort_field": "intradaymarketcap",
"sort_type": "DESC",
"quote_type": "EQUITY",
"query": {
"operator": "and",
"operands": [
{"operator": "eq", "operands": ["region", "us"]},
{"operator": "gte", "operands": ["intradaymarketcap", 10000000000]}
]
}
}
Calendar
| Endpoint | Query params | Notes |
|---|---|---|
GET/v1/calendar | modules=earnings,economic,ipo,splits · symbol · start · end | Events: modules earnings|economic|ipo|splits; start/end epoch ms. |
GET/v1/calendar/count | modules=earnings · symbol · start · end | Event counts per day for the window. |
GET/v1/calendar/earnings-viz | start · end · size=50 | Earnings with EPS estimate/actual/surprise. |
Community
| Endpoint | Query params | Notes |
|---|---|---|
GET/v1/community/feed | type=new · first=20 · cursor | Community feed - type new|popular, cursor paging. |
GET/v1/community/posts/{uuid} | comments=20 | One post with comments. |
GET/v1/community/symbol/{symbol} | first=25 | Board id + recent posts for a symbol. |
Marketplace aliases
If you subscribed through RapidAPI you can keep the marketplace-style paths — they alias the same engine, same data, same conventions. Families: /auto-complete, /market/*, /stock/*, /news/*, /screeners/*, /calendar/*, /community/*, /conversations/* (including v2 forms like /market/v2/get-quotes).
Switching between alias and native paths later needs no code changes beyond the path itself — auth, errors, and headers are identical.