Cryptomaker

API

Public REST and a single multiplexed WebSocket. Same origin: /api/v1 and /ws/v1. Paid keys add the same routes with higher limits; scopes still apply.

GET /api/v1/markets?limit=100&sort=volume_24h_desc
GET /api/v1/markets/facets
GET /api/v1/search?q=BTC
GET /api/v1/assets/BTC
GET /api/v1/compare?ids=id1,id2
GET /api/v1/opportunities?capital=100000
GET /api/v1/opportunities/{slug}
GET /api/v1/execution-cost?asset=BTC&side=buy&capital=250000
GET /api/v1/liquidity?asset=BTC&capital=100000
GET /api/v1/funding-reliability
POST /api/v1/backtest
GET /api/v1/new-markets
GET /api/v1/oi
GET /api/v1/spreads
GET /api/v1/heatmap
GET /api/v1/signals/stats
GET /api/v1/fees
WS  /ws/v1  { "op":"subscribe","channel":"markets","ids":["..."] }

Authorization: Bearer <api_key>
Scopes: market:read funding:read history:read opportunity:read execution:read

Official clients

Thin wrappers over the same REST surface. They do not invent missing history fields.

// TypeScript — sdk/typescript
import { Cryptomaker } from "@cryptomaker/sdk";
const cm = new Cryptomaker({ baseUrl: "https://your.origin", apiKey: process.env.CM_KEY });
const { items } = await cm.spreads();

# Python — sdk/python/cryptomaker.py
from cryptomaker import Cryptomaker
cm = Cryptomaker(base_url="https://your.origin", api_key="...")
print(cm.oi(sort="oi_change_1h_desc")["items"][:5])