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 |
BitMidpoint exposes a Model Context Protocol (MCP) server, enabling AI agents like Claude, Cursor, ChatGPT, and any MCP-compatible client to access crypto price data directly through natural language.
The MCP endpoint is a Streamable HTTP server — no local installation needed. Point your client at the URL and start querying.
Add BitMidpoint to your MCP client configuration. The config file location depends on your client:
| Client | Config File |
|---|---|
| Cursor | .cursor/mcp.json (in your project root) |
| Claude Desktop | claude_desktop_config.json |
| VS Code (Copilot) | .vscode/mcp.json |
| Any MCP Client | See your client's MCP documentation |
Works immediately — no authentication required:
{
"mcpServers": {
"bitmidpoint": {
"url": "https://bitmidpoint.com/mcp"
}
}
}Add a headers block with your API key. Get a free key from your Account page. The key applies to all tool calls automatically — you never need to pass it in prompts.
{
"mcpServers": {
"bitmidpoint": {
"url": "https://bitmidpoint.com/mcp",
"headers": {
"X-API-Key": "cbv_your-key-here"
}
}
}
}Restart your client (or reload the window in Cursor). BitMidpoint tools will appear automatically.
Four tools are available via the MCP server. AI agents call these automatically based on your prompt — you don't need to specify tool names manually.
Returns all tracked tokens sorted by volume with price spreads, exchange data, and market rank. Equivalent to GET /api/v1/tokens.
No parameters required.
Returns detailed price and spread data for a specific token. Equivalent to GET /api/v1/tokens/:symbol.
| Parameter | Type | Required | Description |
|---|---|---|---|
symbol | string | Yes | Token symbol (BTC, ETH, SOL, XRP) |
Returns historical price data for a token over 24 hours, 7 days, or 30 days. Equivalent to GET /api/v1/tokens/:symbol/history.
| Parameter | Type | Required | Description |
|---|---|---|---|
symbol | string | Yes | Token symbol (BTC, ETH, SOL) |
range | string | — | 24h, 7d, or 30d (default: 24h) |
Returns market overview with average spreads, consensus score, and top 10 arbitrage opportunities. Equivalent to GET /api/v1/markets.
No parameters required.
The MCP server is available at:
https://bitmidpoint.com/mcp
Protocol: Streamable HTTP (JSON-RPC 2.0 over HTTP POST). No WebSocket or SSE subscription required. Stateless — each request is independent.
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']}")