{"openapi":"3.1.0","info":{"title":"FX Z-Score & Mean-Reversion API","version":"1.0.0","description":"How statistically stretched each currency pair is right now versus its own recent average — the z-score mean-reversion gauge — computed live from Yahoo Finance daily rates (no key, nothing stored). A price alone tells you nothing about whether a pair is cheap or dear; the z-score does: it measures how many standard deviations the current rate sits above or below its rolling mean. A pair two standard deviations above its average is statistically overbought and prone to snap back; two below is oversold. The zscore endpoint returns, for a pair, the current rate, its rolling mean and standard deviation, the z-score, the percent distance from the mean and a plain overbought / oversold label. The screener endpoint scans the major and cross pairs and ranks them by how stretched they are — the most overbought and most oversold at a glance, the mean-reversion opportunity scan. The pairs endpoint lists what is covered. The statistical-stretch / mean-reversion cut for FX — distinct from the FX range, pivot-point, volatility and signals APIs. It answers how far from normal a pair is, not where its support sits or how fast it moves.","contact":{"name":"PremiumApi","url":"https://www.oanor.com/by/premiumapi"}},"servers":[{"url":"https://api.oanor.com/fxzscore-api","description":"oanor gateway"}],"tags":[{"name":"Z-Score"},{"name":"Screener"},{"name":"Pairs"},{"name":"Meta"}],"components":{"securitySchemes":{"oanorKey":{"type":"apiKey","in":"header","name":"x-oanor-key","description":"Get your key at https://www.oanor.com/developer/keys"}}},"security":[{"oanorKey":[]}],"paths":{"/v1/zscore":{"get":{"operationId":"get_v1_zscore","tags":["Z-Score"],"summary":"Z-score, mean, std-dev and overbought/oversold label for one pair","description":"","parameters":[{"name":"pair","in":"query","required":true,"description":"FX pair (see /v1/pairs)","schema":{"type":"string"},"example":"EURUSD"},{"name":"window","in":"query","required":false,"description":"Rolling window in trading days (20-250)","schema":{"type":"string"},"example":"100"}],"security":[{"oanorKey":[]}],"responses":{"200":{"description":"OK","content":{"application/json":{"example":{"data":{"base":"EUR","mean":1.169,"note":"z_score = (current rate - rolling mean) / rolling standard deviation over window_days. Above +2 is statistically overbought (stretched high, mean-reversion expects a pullback); below -2 is oversold. Sample standard deviation. Not financial advice.","pair":"EURUSD","rate":1.15808,"quote":"USD","signal":"neutral / fair value","source":"Yahoo Finance","std_dev":0.01254,"z_score":-0.87,"window_low":1.14351,"window_days":100,"window_high":1.20176,"observations":100,"pct_from_mean":-0.93},"meta":{"timestamp":"2026-06-12T10:35:26.417Z","request_id":"e8479c4b-a8d8-48d6-b651-3171cce3a764"},"status":"ok","message":"Z-score retrieved successfully","success":true}}}},"401":{"description":"Missing or invalid x-oanor-key header"},"402":{"description":"Active subscription required"},"429":{"description":"Rate-limit or monthly quota reached"},"502":{"description":"Upstream did not respond"}}}},"/v1/screener":{"get":{"operationId":"get_v1_screener","tags":["Screener"],"summary":"Major/cross pairs ranked by absolute z-score","description":"","parameters":[{"name":"window","in":"query","required":false,"description":"Rolling window (20-250)","schema":{"type":"string"},"example":"100"},{"name":"pairs","in":"query","required":false,"description":"Optional comma list to restrict scan","schema":{"type":"string"},"example":"EURUSD,USDCAD,GBPJPY"}],"security":[{"oanorKey":[]}],"responses":{"200":{"description":"OK","content":{"application/json":{"example":{"data":{"note":"Major and cross FX pairs ranked by absolute z-score (most statistically stretched first). A high positive z-score is overbought (mean-reversion expects a fall); a low negative one is oversold. Use most_stretched for the headline opportunities.","pairs":[{"base":"USD","mean":1.37257,"pair":"USDCAD","rate":1.39825,"quote":"CAD","signal":"extremely overbought (mean-reversion: likely to fall)","std_dev":0.01113,"z_score":2.31,"window_low":1.3492,"window_high":1.39825,"observations":100,"pct_from_mean":1.87},{"base":"GBP","mean":212.59558,"pair":"GBPJPY","rate":214.808,"quote":"JPY","signal":"overbought","std_dev":2.00443,"z_score":1.1,"window_low":207.728,"window_high":216.05499,"observations":100,"pct_from_mean":1.04},{"base":"EUR","mean":1.169,"pair":"EURUSD","rate":1.15808,"quote":"USD","signal":"neutral / fair value","std_dev":0.01254,"z_score":-0.87,"window_low":1.14351,"window_high":1.20176,"observations":100,"pct_from_mean":-0.93}],"source":"Yahoo Finance","scanned":3,"window_days":100,"most_stretched":[{"pair":"USDCAD","signal":"extremely overbought (mean-reversion: likely to fall)","z_score":2.31},{"pair":"GBPJPY","signal":"overbought","z_score":1.1},{"pair":"EURUSD","signal":"neutral / fair value","z_score":-0.87}],"oversold_count":0,"overbought_count":2},"meta":{"timestamp":"2026-06-12T10:35:26.631Z","request_id":"96e7b428-2040-4b56-b02d-a78cf559b310"},"status":"ok","message":"Screener retrieved successfully","success":true}}}},"401":{"description":"Missing or invalid x-oanor-key header"},"402":{"description":"Active subscription required"},"429":{"description":"Rate-limit or monthly quota reached"},"502":{"description":"Upstream did not respond"}}}},"/v1/pairs":{"get":{"operationId":"get_v1_pairs","tags":["Pairs"],"summary":"Supported FX pairs","description":"","parameters":[],"security":[{"oanorKey":[]}],"responses":{"200":{"description":"OK","content":{"application/json":{"example":{"data":{"note":"Supported FX pairs (majors and popular crosses). Pass any of these as pair= to /v1/zscore or as a comma list to /v1/screener?pairs=.","count":25,"pairs":[{"base":"EUR","pair":"EURUSD","quote":"USD"},{"base":"GBP","pair":"GBPUSD","quote":"USD"},{"base":"USD","pair":"USDJPY","quote":"JPY"},{"base":"USD","pair":"USDCHF","quote":"CHF"},{"base":"AUD","pair":"AUDUSD","quote":"USD"},{"base":"USD","pair":"USDCAD","quote":"CAD"},{"base":"NZD","pair":"NZDUSD","quote":"USD"},{"base":"EUR","pair":"EURGBP","quote":"GBP"},{"base":"EUR","pair":"EURJPY","quote":"JPY"},{"base":"GBP","pair":"GBPJPY","quote":"JPY"},{"base":"EUR","pair":"EURCHF","quote":"CHF"},{"base":"AUD","pair":"AUDJPY","quote":"JPY"},{"base":"EUR","pair":"EURAUD","quote":"AUD"},{"base":"GBP","pair":"GBPCHF","quote":"CHF"},{"base":"CAD","pair":"CADJPY","quote":"JPY"},{"base":"AUD","pair":"AUDNZD","quote":"NZD"},{"base":"EUR","pair":"EURCAD","quote":"CAD"},{"base":"NZD","pair":"NZDJPY","quote":"JPY"},{"base":"CHF","pair":"CHFJPY","quote":"JPY"},{"base":"GBP","pair":"GBPAUD","quote":"AUD"},{"base":"USD","pair":"USDSEK","quote":"SEK"},{"base":"USD","pair":"USDNOK","quote":"NOK"},{"base":"USD","pair":"USDMXN","quote":"MXN"},{"base":"USD","pair":"USDZAR","quote":"ZAR"},{"base":"USD","pair":"USDSGD","quote":"SGD"}],"source":"Yahoo Finance"},"meta":{"timestamp":"2026-06-12T10:35:26.735Z","request_id":"0b7f4c1d-04f3-4251-978f-16934e614e23"},"status":"ok","message":"Pairs retrieved successfully","success":true}}}},"401":{"description":"Missing or invalid x-oanor-key header"},"402":{"description":"Active subscription required"},"429":{"description":"Rate-limit or monthly quota reached"},"502":{"description":"Upstream did not respond"}}}},"/v1/meta":{"get":{"operationId":"get_v1_meta","tags":["Meta"],"summary":"Service metadata","description":"","parameters":[],"security":[{"oanorKey":[]}],"responses":{"200":{"description":"OK","content":{"application/json":{"example":{"data":{"note":"pair is a supported FX pair (EURUSD, GBPJPY, ...; see /v1/pairs). window is 20-250 trading days (default 100). z-score uses the sample mean and standard deviation of the window. Read fresh per call, nothing cached.","source":"Yahoo Finance daily FX rates, live","service":"fxzscore-api","endpoints":{"GET /v1/meta":"This document.","GET /v1/pairs":"The supported FX pairs.","GET /v1/zscore":"Z-score, mean, std-dev and overbought/oversold label for one pair (pair=EURUSD, window=100).","GET /v1/screener":"All major/cross pairs ranked by absolute z-score, with overbought/oversold counts (window=100)."},"description":"FX z-score & mean-reversion — how statistically stretched each currency pair is versus its rolling average, live from Yahoo Finance (no key, nothing stored). zscore returns a pair's current rate, rolling mean and standard deviation, the z-score, percent from mean and an overbought/oversold label. screener ranks the major and cross pairs by how stretched they are. pairs lists what is covered. The statistical-stretch / mean-reversion cut for FX — distinct from the FX range, pivot-point, volatility and signals APIs. It answers how far from normal a pair is.","eurusd_z_score":-0.87,"pairs_supported":25,"upstream_status":"ok"},"meta":{"timestamp":"2026-06-12T10:35:26.826Z","request_id":"e6f43ae3-7d25-4fdf-b45b-2a4ee982dbab"},"status":"ok","message":"Meta","success":true}}}},"401":{"description":"Missing or invalid x-oanor-key header"},"402":{"description":"Active subscription required"},"429":{"description":"Rate-limit or monthly quota reached"},"502":{"description":"Upstream did not respond"}}}}},"x-oanor-pricing":[{"slug":"free","name":"Free","price_cents_month":0,"monthly_call_quota":900,"rps_limit":2,"hard_limit":true},{"slug":"starter","name":"Starter","price_cents_month":972,"monthly_call_quota":22500,"rps_limit":6,"hard_limit":true},{"slug":"pro","name":"Pro","price_cents_month":2944,"monthly_call_quota":110000,"rps_limit":18,"hard_limit":true},{"slug":"business","name":"Business","price_cents_month":7140,"monthly_call_quota":560000,"rps_limit":45,"hard_limit":true}],"x-oanor-marketplace-url":"https://www.oanor.com/api/fxzscore-api"}