A cryptocurrency trading API with more than 100 exchanges in JavaScript / TypeScript / Python / C# / PHP / Go
Full LLM thinking from the 4-phase benchmark pipeline.
```json
{
"service_type": "crypto_app",
"base_url": "https://docs.ccxt.com",
"auth_method": "api_key_header",
"auth_config": {
"note": "This is a unified client library, not a single exchange. Auth credentials are exchange-specific and supplied via the exchange class constructor (apiKey/secret/password/uid). Keys are used to sign private requests per exchange.",
"credential_fields": ["apiKey", "secret", "password", "uid"],
"signing": "exchange_specific_hmac_or_signature"
},
"endpoints": [
{"path": "/docs/base-spec", "method": "GET", "purpose": "unified API specification — every method and implementing exchanges"},
{"path": "/docs/exchange-markets", "method": "GET", "purpose": "list all supported exchanges/markets and their symbols"},
{"path": "/docs/exchange-markets-by-country", "method": "GET", "purpose": "supported exchanges grouped by country"},
{"path": "/docs/manual", "method": "GET", "purpose": "public/private API usage and unified method reference"},
{"path": "/docs/pro", "method": "GET", "purpose": "WebSocket (CCXT Pro) streaming support"},
{"path": "/docs/pro-manual", "method": "GET", "purpose": "WebSocket streaming manual"},
{"path": "/docs/cli", "method": "GET", "purpose": "call exchange methods from command line"},
{"path": "/docs/mcp", "method": "GET", "purpose": "official MCP server for AI agents"},
{"path": "/docs/requirements", "method": "GET", "purpose": "methods/structures required for exchange integration"},
{"path": "/docs/certification", "method": "GET", "purpose": "portable cross-compatible API standard spec"}
],
"pricing_model": {
"type": "free",
"details": {
"library_cost": "open_source_free",
"note": "CCXT itself is free/open-source; CCXT Pro (WebSockets) is a free part of CCXT. Underlying trading fees, rate limits, and any costs are exchange-specific, not set by CCXT."
}
},
"rate_limits": {
"rpm": null,
"note": "Rate limits are enforced per underlying exchange and abstracted via rateLimit (throttle) settings; no single library-wide limit applies."
},
"capabilities": [
"spot_trading",
"futures",
"margin",
"options",
"prediction_markets",
"orderbook",
"websocket_streaming",
"ohlcv",
"trading",
"balances",
"deposits_withdrawals",
"portfolio"
],
"crypto_specifics": {
"supported_chains": ["exchange_dependent"],
"token_count": null,
"token_count_note": "Depends on the connected exchange; CCXT unifies 100+ exchanges and their markets/symbols.",
"exchange_count": 100,
"has_websocket": true,
"has_orderbook": true,
"fee_structure": "exchange_specific",
"fee_structure_note": "Maker/taker and withdrawal fee schedules come from each underlying exchange; CCXT normalizes fee metadata (fees, feeTiers, maker/taker).",
"security_features": [
"api_key_signing",
"server_side_nonce_management",
"no_credential_custody_library_only"
],
"languages": ["JavaScript", "Python", "PHP", "C#", "Go", "Java", "Rust"],
"unified_methods": [
"fetchMarkets",
"fetchTicker",
"fetchOrderBook",
"fetchOHLCV",
"fetchTrades",
"createOrder",
"cancelOrder",
"fetchOpenOrders",
"fetchClosedOrders",
"fetchMyTrades",
"fetchBalance",
"fetchPositions",
"fetchDeposits",
"fetchWithdrawals",
"withdraw"
]
},
"notes": {
"service_classification": "unified exchange client library / abstraction layer",
"not_an_exchange": true,
"interfaces": ["library", "CLI", "MCP server for AI agents"],
"prediction_markets_supported": true
}
}
``````json
{
"tests": [
{
"name": "docs_home_reachable",
"endpoint": "/docs",
"method": "GET",
"headers": {},
"payload": null,
"expected_status": 200,
"intent": "happy_path",
"expected_behavior": "Documentation landing page returns HTML describing CCXT unified API for 100+ exchanges",
"metrics": ["latency", "status_code", "content_length"],
"validation": {"field": "body", "type": "string", "contains": "CCXT"}
},
{
"name": "api_spec_by_method",
"endpoint": "/docs/base-spec",
"method": "GET",
"headers": {},
"payload": null,
"expected_status": 200,
"intent": "happy_path",
"expected_behavior": "Unified API specification page listing every method and implementing exchanges (fetchMarkets, fetchTicker, fetchOrderBook, fetchOHLCV, createOrder, etc.)",
"metrics": ["latency", "status_code", "content_length"],
"validation": {"field": "body", "type": "string", "contains": "fetchTicker"}
},
{
"name": "supported_exchanges_listing",
"endpoint": "/docs/exchange-markets",
"method": "GET",
"headers": {},
"payload": null,
"expected_status": 200,
"intent": "happy_path",
"expected_behavior": "Lists all supported crypto/prediction-market exchanges; should reference major venues (binance, coinbase, kraken) consistent with the 100+ exchange claim",
"metrics": ["latency", "status_code", "content_length"],
"validation": {"field": "body", "type": "string", "min_length": 1000}
},
{
"name": "exchanges_by_country",
"endpoint": "/docs/exchange-markets-by-country",
"method": "GET",
"headers": {},
"payload": null,
"expected_status": 200,
"intent": "happy_path",
"expected_behavior": "Returns exchanges grouped by jurisdiction/country",
"metrics": ["latency", "status_code"],
"validation": {"field": "body", "type": "string", "min_length": 500}
},
{
"name": "manual_usage_reference",
"endpoint": "/docs/manual",
"method": "GET",
"headers": {},
"payload": null,
"expected_status": 200,
"intent": "happy_path",
"expected_behavior": "Manual describing public/private API usage and unified method reference",
"metrics": ["latency", "status_code", "content_length"],
"validation": {"field": "body", "type": "string", "contains": "exchange"}
},
{
"name": "websocket_pro_docs",
"endpoint": "/docs/pro",
"method": "GET",
"headers": {},
"payload": null,
"expected_status": 200,
"intent": "happy_path",
"expected_behavior": "CCXT Pro WebSocket streaming documentation is present (capability has_websocket=true)",
"metrics": ["latency", "status_code", "content_length"],
"validation": {"field": "body", "type": "string", "contains": "WebSocket"}
},
{
"name": "mcp_server_docs",
"endpoint": "/docs/mcp",
"method": "GET",
"headers": {},
"payload": null,
"expected_status": 200,
"intent": "happy_path",
"expected_behavior": "Official MCP server documentation for AI agents is present (agent_readiness claim)",
"metrics": ["latency", "status_code", "content_length"],
"validation": {"field": "body", "type": "string", "contains": "MCP"}
},
{
"name": "nonexistent_doc_page_404",
"endpoint": "/docs/this-page-does-not-exist-xyz123",
"method": "GET",
"headers": {},
"payload": null,
"expected_status": 404,
"intent": "validation",
"expected_behavior": "Unknown documentation path is correctly rejected with 404 (or 200 SPA fallback that is explicitly noted). API behaving correctly = not returning a raw server error",
"metrics": ["status_code", "latency"],
"validation": {"field": "status", "type": "number", "one_of": [404, 200]}
},
{
"name": "invalid_http_method_rejected",
"endpoint": "/docs/base-spec",
"method": "POST",
"headers": {"Content-Type": "application/json"},
"payload": {"unexpected": "body"},
"expected_status": 405,
"intent": "validation",
"expected_behavior": "POST to a static documentation GET endpoint is rejected (405 Method Not Allowed) rather than silently accepted",
"metrics": ["status_code"],
"validation": {"field": "status", "type": "number", "one_of": [400, 404, 405]}
},
{
"name": "security_headers_present",
"endpoint": "/docs",
"method": "GET",
"headers": {},
"payload": null,
"expected_status": 200,
"intent": "stress",
"expected_behavior": "Response should include standard security headers (Strict-Transport-Security, X-Frame-Options or CSP) and confirm HTTPS/TLS termination",
"metrics": ["headers", "status_code"],
"validation": {"field": "headers", "type": "object", "contains_any": ["strict-transport-security"11/12 tests passed
| Test | Endpoint | Status | Latency |
|---|---|---|---|
| docs_home_reachable | GET /docs | 200 | 539ms |
| api_spec_by_method | GET /docs/base-spec | 200 | 492ms |
| supported_exchanges_listing | GET /docs/exchange-markets | 200 | 137ms |
| exchanges_by_country | GET /docs/exchange-markets-by-country | 200 | 150ms |
| manual_usage_reference | GET /docs/manual | 200 | 600ms |
| websocket_pro_docs | GET /docs/pro | 200 | 127ms |
| mcp_server_docs | GET /docs/mcp | 200 | 144ms |
| nonexistent_doc_page_404 | GET /docs/this-page-does-not-exist-xyz123 | 404 | 128ms |
| invalid_http_method_rejected | POST /docs/base-spec | 200 | 279ms |
| security_headers_present | GET /docs | 200 | 136ms |
{
"overall": 31,
"dimensions": {
"token_efficiency": 3.0,
"first_try_success": 2.0,
"response_parseability": 1.5,
"error_clarity": 1.5,
"doc_quality": 6.0,
"auth_simplicity": 5.0,
"latency": 2.0,
"consistency": 5.0
},
"pricing_normalized": {
"maker_fee_bps": null,
"taker_fee_bps": null,
"withdrawal_fee_usd": null,
"free_tier_requests": null
},
"issues": [
"All 12 probed endpoints returned text/html instead of JSON — no machine-readable market data, spec, or metadata surfaced.",
"Zero exchange market data, symbols, prices, volumes, or orderbook content returned; agent cannot get quotes in any call.",
"Docs are rendered as Next.js HTML pages, not JSON-returning API endpoints — agents must scrape HTML to extract method specs, wasting tokens.",
"No documented fee schedule, rate limits, or numeric pricing responses anywhere in the probe.",
"404 returns a full HTML error page (Next.js __next_error__) with no structured error code or message.",
"Invalid HTTP method was not rejected — server returned 200 for a bad-method call, breaking method semantics.",
"Latency 492–634ms on doc pages is slow for market-data-adjacent endpoints (>200ms).",
"Pricing fields (maker/taker bps, withdrawal fee, free tier) absent — no fee transparency.",
"Cannot verify price freshness or websocket stream behavior from the probe.",
"trading/futures/margin/options/prediction_markets claimed as capabilities but no verified market-data endpoint surfaced."
],
"recommendations": [
"Expose JSON endpoints (e.g. /api/v1/markets, /api/v1/ticker, /api/v1/orderbook, /api/v1/methods) with Content-Type: application/json so agents can parse without HTML scraping.",
"Return structured error bodies with codes (PAIR_NOT_FOUND, RATE_LIMITED, INVALID_METHOD) and appropriate HTTP statuses; stop returning 200 for bad methods.",
"Publish machine-readable fee schedule and rate-limit headers (X-RateLimit-Limit/Remaining/Reset).",
"Provide an OpenAPI/JSON spec endpoint rather than only HTML doc pages.",
"Cache or CDN doc pages to bring latency under 200ms.",
"Document public unauthenticated market-data endpoints clearly so first-try calls succeed.",
"Expose WebSocket subscription schema and example payloads as JSON.",
"Add a /health or /status JSON endpoint for consistency checks."
]
}Show your live agent-readiness score on your own site. Free, no auth — it updates as your score changes.
<a href="https://prowl.world/service/ccxt">
<img src="https://prowl.world/badge/ccxt.svg" height="56" alt="Agent-readiness on Prowl">
</a>
See operational metrics, LLM evaluations, agent readiness, and more.
Open in Dashboard