Authentication
Base URL: https://metarates.online/api/v1
Pass your key in the X-API-Key header (or Authorization: Bearer <key>). You can create a key for free on the API page.
Quick start
curl -H "X-API-Key: YOUR_KEY" \ "https://metarates.online/api/v1/rates?fiat=UAH"
const res = await fetch("https://metarates.online/api/v1/rates?fiat=UAH", {
headers: { "X-API-Key": "YOUR_KEY" },
});
const data = await res.json();
console.log(data.best_buy);import requests
r = requests.get(
"https://metarates.online/api/v1/rates",
params={"fiat": "UAH"},
headers={"X-API-Key": "YOUR_KEY"},
timeout=10,
)
print(r.json()["best_buy"])GET /api/v1/markets
Exchanges, currencies and the capabilities of your plan. Available from plan: Free
{
"asset": "USDT",
"exchanges": ["Binance", "Bybit", "OKX", "HTX", "KuCoin", "Bitget"],
"fiats": [{"code": "UAH", "name": "Ukrainian hryvnia"}, ...],
"plan": {"name": "Pro", "monthly_quota": 2000000, "requests_per_minute": 300,
"orderbook_rows": 20, "history_hours": 720, "features": ["arbitrage", "history", "markets", "orderbook", "rates", "stats"]}
}
GET /api/v1/rates
The best reliable buy and sell price for every exchange and overall, plus the cross-exchange spread. Available from plan: Free
| Parameter | Default | Description |
|---|---|---|
fiat | UAH | Currency code from markets. |
{
"asset": "USDT", "fiat": "UAH", "updated_at": "2026-10-06T14:23:17Z",
"best_buy": {"price": 45.1, "exchange": "Binance"},
"best_sell": {"price": 47.6, "exchange": "Binance"},
"cross_exchange_spread_pct": null,
"exchanges": [
{"exchange": "Binance", "buy": 45.1, "sell": 47.6, "buy_ads": 18, "sell_ads": 16},
{"exchange": "Bybit", "buy": 46.06, "sell": 45.65, "buy_ads": 10, "sell_ads": 16}
]
}
GET /api/v1/orderbook
Live ads of an exchange in a single format with a trusted flag. Available from plan: Free
| Parameter | Default | Description |
|---|---|---|
exchange | required | Exchange: Binance, Bybit, OKX, HTX, KuCoin or Bitget. |
fiat | UAH | Currency code. |
side | BUY | BUY: sellers' prices, SELL: buyers' prices. |
rows | 10 | Number of ads; the maximum depends on the plan. |
payment_method | empty | Substring of a payment method name, for example monobank. |
{
"asset": "USDT", "exchange": "Binance", "fiat": "UAH", "side": "BUY", "payment_method": null, "count": 1,
"ads": [{
"price": 45.19, "min_amount": 900, "max_amount": 900,
"payment_methods": ["Monobank (Card)", "A-Bank (Card)"],
"completed_orders": 8093, "completion_rate": 100.0, "nickname": "trader", "trusted": true
}]
}
GET /api/v1/stats
24-hour and 7-day averages, the minimum, a verdict and the cheapest hours of the day (Kyiv time). Available from plan: Starter
| Parameter | Default | Description |
|---|---|---|
fiat | UAH | Currency code. |
{
"asset": "USDT", "fiat": "UAH", "best_buy_now": 45.1, "avg_24h": 44.6541, "avg_7d": 44.6302, "min_24h": 44.17,
"delta_vs_24h_pct": 1.0, "delta_vs_7d_pct": 1.05, "verdict": "high",
"cheapest_hours_kyiv": [{"hour": 6, "delta_pct": -0.82}, {"hour": 7, "delta_pct": -0.74}],
"data_points": 2019
}
GET /api/v1/history
History of the best reliable price in steps of about 5 minutes. Available from plan: Pro
| Parameter | Default | Description |
|---|---|---|
fiat | UAH | Currency code. |
exchange | best | An exchange name or best for the best across all. |
hours | 24 | History depth in hours, capped by the plan. |
max_points | 300 | Maximum points in the response, up to 1000. |
{
"asset": "USDT", "fiat": "PLN", "exchange": "best", "hours": 24,
"points": [{"t": "2026-10-06T13:00:00Z", "buy": 3.71, "sell": 3.78}, ...]
}
GET /api/v1/arbitrage
Buy→sell bundles between exchanges accounting for limits, the transfer fee and payment methods. Available from plan: Pro
| Parameter | Default | Description |
|---|---|---|
fiat | UAH | Currency code. |
amount | 1000 | Exchange amount in the chosen currency. |
transfer_fee_usdt | 1.0 | Transfer fee between exchanges in USDT. |
{
"asset": "USDT", "fiat": "UAH", "amount": 10000.0, "transfer_fee_usdt": 1.0,
"opportunities": [{
"buy_exchange": "Bitget", "sell_exchange": "Binance", "buy_price": 45.2, "sell_price": 47.6,
"gross_spread_pct": 5.31, "net_profit_pct": 4.83, "net_profit": 483.37,
"buy_limits": [4000, 18000], "sell_limits": [8000, 22000],
"buy_methods": ["Monobank"], "sell_methods": ["OTP BANK"]
}]
}
GET /api/v1/me
Your plan and usage for the current month. Available from plan: Free
{
"key_prefix": "mr_live_RfzXOE", "plan": "Free", "monthly_quota": 5000,
"used_this_month": 4, "requests_per_minute": 10
}
Limits and headers
Every response carries headers with your limit usage. Exceeding a limit returns 429.
X-Plan: Pro X-RateLimit-Limit-Minute: 300 X-RateLimit-Remaining-Minute: 299 X-Quota-Limit: 2000000 X-Quota-Remaining: 1999990 Retry-After: 12 (429)
Errors
Errors share one format: an HTTP status and JSON with a detail field holding code and message.
{"detail": {"code": "plan_required", "message": "The 'history' endpoint requires the Pro plan or above."}}
| Code | HTTP | When |
|---|---|---|
missing_key | 401 | No key was sent. |
invalid_key | 401 | The key is invalid or revoked. |
plan_required | 403 | The endpoint is not available on your plan. |
unsupported_fiat | 400 | Unknown currency. |
unsupported_exchange | 400 | Unknown exchange. |
rate_limited | 429 | Per-minute limit exceeded. |
quota_exceeded | 429 | Monthly quota used up. |
data_unavailable | 503 | No fresh data for this market yet. |
Good to know
- BUY is the price at which you buy USDT (sellers' ads). SELL is the price at which you sell USDT (buyers' ads).
- Prices in rates and history come from the best reliable ads regardless of payment method. For a specific payment method use orderbook with payment_method.
- Prices and limits change every second. Always check the ad on the exchange before you trade. The data is not financial advice.
Changelog: v1 First release: markets, rates, orderbook, stats, history, arbitrage, me.
Data comes from public P2P ads of third-party exchanges and is provided "as is". It is not financial advice.