How OpenRate Measures P2P Rates
The data sources, filters, refresh cadence, and confidence rules behind every number on this site. Written for journalists, researchers, API consumers, and anyone who wants to verify what we publish before citing it.
Data sources
OpenRate aggregates live peer-to-peer USDT rates from 9 exchanges: Binance, Bybit, OKX, HTX, Bitget, MEXC, Gate, BingX, KuCoin. Five of these (Binance, Bybit, OKX, HTX, KuCoin) are crawled directly via each exchange's public P2P ad endpoints every 60 seconds. The remaining four (Bitget, MEXC, Gate, BingX) are read from p2p.army's daily aggregate, refreshed every 30 minutes.
Source labels are visible on every per-exchange page so consumers can distinguish direct-crawl from aggregate. The distinction matters: direct-crawled values are tick-by-tick; aggregate values are 30-minute median snapshots.
Refresh cadence
- Per-exchange ad books (Binance/Bybit/OKX/HTX/KuCoin): crawled every 60 seconds.
- Reference exchange snapshots (Bitget/MEXC/Gate/BingX): refreshed every 30 minutes.
- Materialized aggregates (`mv_markets_overview`): refreshed every 90 seconds from the underlying ad table.
- Public API responses: cached for 60s on the origin, 5 minutes at the CDN edge with stale-while-revalidate up to 1 hour.
- Page renders: ISR with 120-second revalidation; CDN holds the rendered HTML for 2 minutes.
The Last-Modified HTTP header on /api/v1/* and the dateModified field in JSON-LD reflect the actual underlying data timestamp, not the response generation time.
Outlier and quality filters
Raw P2P ad books contain extreme outliers (single merchants quoting prices 30%+ off the median). Without filtering, the published “best buy” can become a stale or anomalous quote that misrepresents the real market. OpenRate applies the following filters to every published number:
- Merchant completion rate: ≥ 95% (drops merchants who routinely cancel orders mid-flow).
- Merchant order count: ≥ 100 lifetime trades (filters out fresh accounts and wash-trading patterns).
- Active merchant floor: fiats with fewer than 10 active merchants are flagged
dataQuality: "thin"in the API and excluded from sitewide aggregates (gainers, losers, tightest spread). - Spread clamp: published spreads > 25% are treated as data anomalies (one-sided books or stale opposite-side quotes) and excluded from the tightest-spread leaderboard.
- Best price selection:
bestBuyis taken at the 5th percentile of qualifying buy ads (not the absolute minimum), which clips single-merchant outliers without distorting the bulk market.
Confidence scoring
Every API response includes a per-fiat confidence field in the range [0, 1]. The score is a deterministic function of active-merchant count:
- 200+ active merchants → 0.99
- 30–199 active merchants → 0.85–0.99 (linear)
- 10–29 active merchants → 0.50–0.85 (linear)
- Below 10 active merchants → 0.10–0.50, flagged thin
- Zero active merchants → 0
The score is intended for downstream consumers (LLMs, dashboards, analytics tools) to filter on quality before presenting numbers to end users. Treat anything below 0.50 as “reference only” rather than tradable.
USDT premium calculation
For fiats where we publish a USDT premium (the amount above or below the official forex rate at which P2P USDT trades), the calculation is:
premium = (P2P_USDT_midpoint / OFFICIAL_USD_RATE) - 1
Where P2P_USDT_midpoint is the average of qualifying best-buy and best-sell on /api/v1/rates, and OFFICIAL_USD_RATEis the daily reference forex rate from the country's central bank publication or the Bloomberg-reported interbank rate (whichever is more recent). Premium values are recomputed daily and exposed via /api/v1/spreads.
License and attribution
All OpenRate data — published rates, premium index values, historical snapshots, and dataset downloads — is licensed under Creative Commons Attribution 4.0 (CC BY 4.0). You may redistribute, modify, and build on the data for any purpose — commercial or non-commercial — provided you credit OpenRate as the source.
Recommended attribution format: “Data: OpenRate (openrate.live), CC BY 4.0”. For academic citation formats, see /cite.
Methodology changelog
Material methodology changes — new filters, calculation updates, source additions — are dated and recorded here.
- 2026-05-09: introduced
confidenceanddataQualityfields on /api/v1/rates; applied 5th-percentile best-price selection (replacing absolute min/max) to filter single-merchant outliers; addedLast-Modifiedheader on API responses. - 2026-04-15: TopMovers strip raised liquidity floor from 0 to 20 active merchants per fiat — fixes thin-fiat anomalies winning the “tightest spread” card.
- 2025-08-01: initial public methodology.
Corrections and disclosures
Spotted an error? Have a methodology question? Want to license historical data? Contact OpenRate. Material corrections are dated, logged in the changelog above, and disclosed in the next-published version of any affected dataset.