BitMidpoint is a multi-exchange crypto price aggregation platform that surfaces real-time price spreads across major crypto exchanges. Our API provides developers with access to unified token pricing, exchange-level spread detection, and arbitrage opportunity identification.
Unlike traditional price aggregators (CoinGecko, CMC), BitMidpoint doesn't just average prices—we capture the full distribution across exchanges, letting you identify and exploit arbitrage windows that most tools hide.
Base URL: https://bitmidpoint.com/api/v1
The BitMidpoint API supports two authentication modes:
Public endpoints allow anonymous requests (rate limited to 30 req/min per session/IP). No authentication header required.
For higher rate limits (120 req/min) and usage tracking, generate a free API key from your Account dashboard. Include your key in the X-API-Key header.
API Key Format: cbv_<uuid> (e.g., cbv_3f9a2b1c-...)
| Header | Value | Required | Description |
|---|---|---|---|
X-API-Key |
cbv_your-key |
Optional | API key for higher rate limits |
Content-Type |
application/json |
POST | Required for POST requests |
Fetch all tracked tokens sorted by volume and spread. This is the primary entry point for discovering aggregated crypto pricing data.
| Parameter | Type | Required | Description |
|---|---|---|---|
| — | — | — | No query parameters |
Get detailed information for a single token by symbol. Returns the same data structure as the /tokens endpoint but for a specific cryptocurrency.
| Parameter | Type | Required | Description |
|---|---|---|---|
symbol | string | ✓ | Token symbol (e.g., BTC, ETH) |
Fetch historical price data for a token over a specified time range. Data points are hourly snapshots of min/avg/max prices across exchanges.
| Parameter | Type | Required | Description |
|---|---|---|---|
symbol | string | ✓ | Token symbol (path parameter) |
range | string | — | 24h, 7d, or 30d (default: 24h) |
Get aggregate market statistics including total tokens tracked, connected exchanges, average spread percentage, and top arbitrage opportunities.
| Parameter | Type | Required | Description |
|---|---|---|---|
| — | — | — | No query parameters |
The API implements a fixed 60-second sliding window rate limiter with burst-friendly parallelism. All requests are counted within a rolling 60-second window.
| Authentication Mode | Limit | Identifier | Window |
|---|---|---|---|
| Anonymous (no API key) | 30 req/min | Session ID or IP | 60 seconds |
| API Key (authenticated) | 120 req/min | Per API key | 60 seconds |
Every API response includes rate limit information in headers:
When the rate limit is exceeded, you'll receive a 429 response:
All errors follow a consistent response format with a machine-readable error code and human-readable description.
| Code | Meaning | Description |
|---|---|---|
| 200 | OK | Request succeeded |
| 400 | Bad Request | Invalid parameters or malformed request |
| 401 | Unauthorized | Invalid or missing API key |
| 404 | Not Found | Token or resource does not exist |
| 429 | Too Many Requests | Rate limit exceeded |
| 500 | Internal Server Error | Server error; try again later |
| 502 | Bad Gateway | Upstream service unavailable |
curl -X GET "https://bitmidpoint.com/api/v1/tokens" \ -H "X-API-Key: cbv_your-key-here"
curl -X GET "https://bitmidpoint.com/api/v1/tokens/BTC" \ -H "X-API-Key: cbv_your-key-here"
curl -X GET "https://bitmidpoint.com/api/v1/tokens/BTC/history?range=7d" \ -H "X-API-Key: cbv_your-key-here"
curl -X GET "https://bitmidpoint.com/api/v1/markets" \ -H "X-API-Key: cbv_your-key-here"
const res = await fetch('https://bitmidpoint.com/api/v1/tokens', {
method: 'GET',
headers: {
'X-API-Key': 'cbv_your-key-here',
'Content-Type': 'application/json'
}
});
const { data } = await res.json();
console.log(data);const symbol = 'BTC';
const res = await fetch(`https://bitmidpoint.com/api/v1/tokens/${symbol}`, {
headers: { 'X-API-Key': 'cbv_your-key-here' }
});
const { data } = await res.json();
console.log(`${data.symbol}: ${data.avgPrice}`);const res = await fetch('https://bitmidpoint.com/api/v1/tokens/BTC/history?range=7d', {
headers: { 'X-API-Key': 'cbv_your-key-here' }
});
const { data } = await res.json();
data.forEach(point => {
console.log(`${point.timestamp}: $${point.avgPrice}`);
});import requests
headers = {'X-API-Key': 'cbv_your-key-here'}
response = requests.get('https://bitmidpoint.com/api/v1/tokens', headers=headers)
data = response.json()['data']
for token in data:
print(f"{token['symbol']}: ${token['avgPrice']}")import requests
headers = {'X-API-Key': 'cbv_your-key-here'}
response = requests.get('https://bitmidpoint.com/api/v1/tokens/BTC', headers=headers)
token = response.json()['data']
print(f"Spread: {token['spreadPct']}%")import requests
from datetime import datetime
headers = {'X-API-Key': 'cbv_your-key-here'}
response = requests.get('https://bitmidpoint.com/api/v1/tokens/BTC/history?range=7d', headers=headers)
history = response.json()['data']
for point in history:
ts = datetime.fromisoformat(point['timestamp'].replace('Z', '+00:00'))
print(f"{ts}: ${point['avgPrice']}")