Prowl
28/100
prowl
Benchmarked Oct 04, 2026

Ccxt

A cryptocurrency trading API with more than 100 exchanges in JavaScript / TypeScript / Python / C# / PHP / Go

developercryptoapi crypto_app Streaming api_key_header
Benchmark Your API

Score Breakdown

Documentation6/10
Consistency5/10
Auth Simplicity5/10
Token Efficiency3/10
Latency2/10
Error Clarity2/10
First-Try Success2/10
Parseability2/10

Benchmark Analysis Log

Full LLM thinking from the 4-phase benchmark pipeline.

Analyze
```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
  }
}
```
Plan
```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"
Execute

11/12 tests passed

TestEndpointStatusLatency
docs_home_reachableGET /docs200539ms
api_spec_by_methodGET /docs/base-spec200492ms
supported_exchanges_listingGET /docs/exchange-markets200137ms
exchanges_by_countryGET /docs/exchange-markets-by-country200150ms
manual_usage_referenceGET /docs/manual200600ms
websocket_pro_docsGET /docs/pro200127ms
mcp_server_docsGET /docs/mcp200144ms
nonexistent_doc_page_404GET /docs/this-page-does-not-exist-xyz123404128ms
invalid_http_method_rejectedPOST /docs/base-spec200279ms
security_headers_presentGET /docs200136ms
Interpret
{
  "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."
  ]
}

Agent Readiness

x402 Payments
Not supported
Streaming
Yes
Sandbox
None
Agent Auth
api_key_header
SDKs
None listed
MCP Support
No

Embed your Prowl badge

Show your live agent-readiness score on your own site. Free, no auth — it updates as your score changes.

Prowl agent-readiness badge
<a href="https://prowl.world/service/ccxt">
  <img src="https://prowl.world/badge/ccxt.svg" height="56" alt="Agent-readiness on Prowl">
</a>

Options: ?style=light|dark · ?size=sm|md · ?variant=certified (claimed + DNS-verified only) · badge generator with preview

Want the full interactive view?

See operational metrics, LLM evaluations, agent readiness, and more.

Open in Dashboard