{"openapi":"3.1.0","info":{"title":"FX Cross-Rate & Triangular Arbitrage API","version":"1.0.0","description":"Live cross-rate, triangular-arbitrage and conversion-path maths that FX desks and trading bots run on a set of quoted rates, computed on demand from the legs you pass in — no key, no cache, nothing stored. The cross endpoint chains two pairs that share a currency into the implied third rate (EUR/USD x USD/JPY gives EUR/JPY) and, if you supply the quoted cross, returns the discrepancy in basis points and whether it is arbitrageable. The triangular endpoint takes a closed loop of three rates and detects a triangular-arbitrage opportunity — the cycle product, the profit in percent, the winning direction (forward or reverse) and the payout on a notional. The chain endpoint converts an amount along a path of pairs and returns the amount at every hop with the effective rate. Each leg is written FROMTO:rate, meaning one unit of FROM buys that many of TO (e.g. EURUSD:1.08). This is an FX cross-rate and arbitrage engine that reasons across several pairs at once, distinct from pip/lot calculators and single-pair converters. Computed locally and deterministically, so it is instant and private. Ideal for FX arbitrage scanners, multi-currency pricing, treasury routing and trading dashboards. Live, nothing stored. 3 compute endpoints. For live quotes feed in rates from an FX or exchange API.","contact":{"name":"PremiumApi","url":"https://www.oanor.com/by/premiumapi"}},"servers":[{"url":"https://api.oanor.com/fxcross-api","description":"oanor gateway"}],"tags":[{"name":"FX"},{"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/chain":{"get":{"operationId":"get_v1_chain","tags":["FX"],"summary":"Convert an amount along a path of pairs","description":"","parameters":[{"name":"legs","in":"query","required":true,"description":"Chained pairs FROMTO:rate","schema":{"type":"string"},"example":"EURUSD:1.08,USDJPY:150"},{"name":"amount","in":"query","required":true,"description":"Amount in the first currency","schema":{"type":"string"},"example":"1000"}],"security":[{"oanorKey":[]}],"responses":{"200":{"description":"OK","content":{"application/json":{"example":{"data":{"hops":[{"pair":"EUR/USD","rate":1.08,"to_amount":1080,"from_amount":1000,"to_currency":"USD","from_currency":"EUR"},{"pair":"USD/JPY","rate":150,"to_amount":162000,"from_amount":1080,"to_currency":"JPY","from_currency":"USD"}],"path":"EUR -> USD -> JPY","source":"FX-CROSS","final_amount":162000,"start_amount":1000,"effective_rate":162,"final_currency":"JPY","start_currency":"EUR"},"meta":{"timestamp":"2026-06-11T07:49:27.931Z","request_id":"f38d62ed-930e-4e91-b297-d5a2ef15c5be"},"status":"ok","message":"Conversion chain computed","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/cross":{"get":{"operationId":"get_v1_cross","tags":["FX"],"summary":"Implied cross rate from chained pairs","description":"","parameters":[{"name":"legs","in":"query","required":true,"description":"Chained pairs FROMTO:rate, comma-separated","schema":{"type":"string"},"example":"EURUSD:1.08,USDJPY:150"},{"name":"quoted","in":"query","required":false,"description":"Quoted cross to compare against","schema":{"type":"string"},"example":"163"}],"security":[{"oanorKey":[]}],"responses":{"200":{"description":"OK","content":{"application/json":{"example":{"data":{"base":"EUR","legs":[{"pair":"EUR/USD","rate":1.08},{"pair":"USD/JPY","rate":150}],"pair":"EUR/JPY","path":"EUR -> USD -> JPY","quote":"JPY","source":"FX-CROSS","arbitrage":true,"discrepancy":1,"quoted_rate":163,"implied_rate":162,"inverse_rate":0.0061728395,"discrepancy_bps":61.73},"meta":{"timestamp":"2026-06-11T07:49:28.023Z","request_id":"51be726c-6bda-439a-bb9b-556acd55f42e"},"status":"ok","message":"Cross rate computed","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/triangular":{"get":{"operationId":"get_v1_triangular","tags":["FX"],"summary":"Triangular-arbitrage detection","description":"","parameters":[{"name":"legs","in":"query","required":true,"description":"Closed 3-rate loop FROMTO:rate","schema":{"type":"string"},"example":"EURUSD:1.08,USDJPY:150,JPYEUR:0.00617"},{"name":"notional","in":"query","required":false,"description":"Notional to compute payout on (default 1)","schema":{"type":"string"},"example":"10000"}],"security":[{"oanorKey":[]}],"responses":{"200":{"description":"OK","content":{"application/json":{"example":{"data":{"legs":[{"pair":"EUR/USD","rate":1.08},{"pair":"USD/JPY","rate":150},{"pair":"JPY/EUR","rate":0.00617}],"note":"product>1 means cycling in the given (forward) direction profits; otherwise the reverse cycle does. Edge below 1 bp is treated as no arbitrage.","source":"FX-CROSS","notional":10000,"arbitrage":true,"direction":"reverse","currencies":["EUR","USD","JPY"],"profit_pct":0.046021,"cycle_product":0.99954,"forward_cycle":"EUR -> USD -> JPY -> EUR","start_currency":"EUR","profit_on_notional":4.60211697},"meta":{"timestamp":"2026-06-11T07:49:28.122Z","request_id":"0c4b6c24-4e99-4036-a3dc-178f7567005a"},"status":"ok","message":"Triangular arbitrage computed","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":"Spec","description":"","parameters":[],"security":[{"oanorKey":[]}],"responses":{"200":{"description":"OK","content":{"application/json":{"example":{"data":{"note":"Each leg is FROMTO:rate, where 1 FROM = rate TO (e.g. EURUSD:1.08). Legs must chain (each TO matches the next FROM).","source":"Computed in-process from caller-supplied quoted rates (no upstream)","service":"fxcross-api","endpoints":{"GET /v1/meta":"This document.","GET /v1/chain":"Convert an amount along a path of pairs, per hop (legs=EURUSD:1.08,USDJPY:150&amount=1000).","GET /v1/cross":"Implied cross from chained pairs + discrepancy vs a quoted cross (legs=EURUSD:1.08,USDJPY:150&quoted=163).","GET /v1/triangular":"Triangular-arbitrage detection on a closed 3-rate loop (legs=EURUSD:1.08,USDJPY:150,JPYEUR:0.00617)."},"description":"Live cross-rate, triangular-arbitrage and conversion-path maths computed on demand from the quoted rates you pass in. The cross endpoint chains two pairs sharing a currency into the implied third rate plus the discrepancy vs a quoted cross; the triangular endpoint detects a triangular-arbitrage opportunity in a closed loop of three rates (cycle product, profit %, winning direction, payout on a notional); the chain endpoint converts an amount along a path of pairs with a per-hop breakdown. An FX cross-rate and arbitrage engine that reasons across several pairs at once, distinct from pip/lot calculators and single-pair converters. Computed locally, nothing stored.","upstream_status":"ok"},"meta":{"timestamp":"2026-06-11T07:49:28.224Z","request_id":"81fdafe9-b2a4-4d11-b7fb-be3d7cd5e32b"},"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":4500,"rps_limit":2,"hard_limit":true},{"slug":"starter","name":"Starter","price_cents_month":790,"monthly_call_quota":88000,"rps_limit":6,"hard_limit":true},{"slug":"pro","name":"Pro","price_cents_month":2280,"monthly_call_quota":465000,"rps_limit":18,"hard_limit":true},{"slug":"business","name":"Business","price_cents_month":5300,"monthly_call_quota":2850000,"rps_limit":45,"hard_limit":true}],"x-oanor-marketplace-url":"https://www.oanor.com/api/fxcross-api"}