Currency Authority: Exchange Rate of 1453 country currencies and crypto currencies
Full LLM thinking from the 4-phase benchmark pipeline.
{
"service_type": "crypto_app",
"base_url": "https://sonar.trading",
"auth_method": "api_key_header",
"auth_config": {
"header_name": "X-API-Key",
"key_location": "header"
},
"endpoints": [
{
"path": "/api/latest",
"method": "GET",
"purpose": "get latest exchange rates for all supported currencies"
},
{
"path": "/api/latest/{base}",
"method": "GET",
"purpose": "get latest exchange rates for a specific base currency"
},
{
"path": "/api/convert",
"method": "GET",
"purpose": "convert amount between currencies"
},
{
"path": "/api/historical/{date}",
"method": "GET",
"purpose": "get historical exchange rates for a specific date"
},
{
"path": "/api/currencies",
"method": "GET",
"purpose": "list all supported currencies (fiat and crypto)"
}
],
"pricing_model": {
"type": "tiered",
"details": {
"free_tier": {
"requests_per_month": 1000,
"features": ["latest rates", "basic conversion"]
},
"pro_tier": {
"price_usd_per_month": 49,
"requests_per_month": 100000,
"features": ["historical data", "priority support"]
},
"enterprise_tier": {
"price_usd_per_month": 499,
"requests_per_month": 1000000,
"features": ["dedicated support", "SLA", "bulk conversion"]
}
}
},
"rate_limits": {
"rpm": 60
},
"capabilities": [
"portfolio",
"exchange_rates",
"currency_conversion",
"historical_data"
],
"crypto_specifics": {
"supported_chains": [],
"token_count": 0,
"has_websocket": false,
"has_orderbook": false,
"fee_structure": "none",
"security_features": [
"api_key_authentication",
"https_only"
]
}
}```json
{
"tests": [
{
"name": "auth_missing_key_latest",
"endpoint": "/api/latest",
"method": "GET",
"headers": {},
"payload": {},
"expected_status": 401,
"intent": "auth",
"expected_behavior": "Rejects request without X-API-Key header, returns 401/403 with structured error",
"metrics": ["status_code", "latency"],
"validation": {"field": "error", "type": "string", "min_length": 1}
},
{
"name": "auth_invalid_key_latest",
"endpoint": "/api/latest",
"method": "GET",
"headers": {"X-API-Key": "invalid_key_000000000000"},
"payload": {},
"expected_status": 401,
"intent": "auth",
"expected_behavior": "Rejects request with a bogus API key",
"metrics": ["status_code", "latency"],
"validation": {"field": "error", "type": "string", "min_length": 1}
},
{
"name": "happy_latest_all_rates",
"endpoint": "/api/latest",
"method": "GET",
"headers": {"X-API-Key": "{{API_KEY}}"},
"payload": {},
"expected_status": 200,
"intent": "happy_path",
"expected_behavior": "Returns latest exchange rates for all supported currencies",
"metrics": ["latency", "status_code", "payload_size", "rate_limit_headers"],
"validation": {"field": "rates", "type": "object", "min_length": 1}
},
{
"name": "happy_latest_single_base_usd",
"endpoint": "/api/latest/USD",
"method": "GET",
"headers": {"X-API-Key": "{{API_KEY}}"},
"payload": {},
"expected_status": 200,
"intent": "happy_path",
"expected_behavior": "Returns latest rates with USD as base currency",
"metrics": ["latency", "status_code", "price_accuracy"],
"validation": {"field": "base", "type": "string", "equals": "USD"}
},
{
"name": "happy_latest_single_base_btc",
"endpoint": "/api/latest/BTC",
"method": "GET",
"headers": {"X-API-Key": "{{API_KEY}}"},
"payload": {},
"expected_status": 200,
"intent": "happy_path",
"expected_behavior": "Returns latest rates with BTC (crypto) as base currency",
"metrics": ["latency", "status_code", "price_accuracy"],
"validation": {"field": "base", "type": "string", "equals": "BTC"}
},
{
"name": "happy_convert_usd_to_eur",
"endpoint": "/api/convert",
"method": "GET",
"headers": {"X-API-Key": "{{API_KEY}}"},
"payload": {"from": "USD", "to": "EUR", "amount": 100},
"expected_status": 200,
"intent": "happy_path",
"expected_behavior": "Converts 100 USD to EUR and returns numeric result",
"metrics": ["latency", "status_code", "price_accuracy"],
"validation": {"field": "result", "type": "number", "min": 0}
},
{
"name": "happy_convert_btc_to_usd",
"endpoint": "/api/convert",
"method": "GET",
"headers": {"X-API-Key": "{{API_KEY}}"},
"payload": {"from": "BTC", "to": "USD", "amount": 1},
"expected_status": 200,
"intent": "happy_path",
"expected_behavior": "Converts 1 BTC to USD and returns numeric result in plausible range",
"metrics": ["latency", "status_code", "price_accuracy"],
"validation": {"field": "result", "type": "number", "min": 0}
},
{
"name": "happy_list_currencies",
"endpoint": "/api/currencies",
"method": "GET",
"headers": {"X-API-Key": "{{API_KEY}}"},
"payload": {},
"expected_status": 200,
"intent": "happy_path",
"expected_behavior": "Lists supported fiat and crypto currencies, count in the hundreds/thousands",
"metrics": ["latency", "status_code"],
"validation": {"field": "currencies", "type": "array", "min_length": 50}
},
{
"name": "happy_historical_recent_date",
"endpoint": "/api/historical/2024-01-15",
"method": "GET",
"headers": {"X-API-Key": "{{API_KEY}}"},
"payload": {},
"expected_status": 200,
"intent": "happy_path",
"expected_behavior": "Returns historical rates for the given date (pro tier feature)",
"metrics": ["latency", "status_code", "price_accuracy"],
"validation": {"field": "rates", "type": "object", "min_length": 1}
},
{
"name": "validation_convert_missing_amount",
"endpoint": "/api/convert",
"method": "GET",
"headers": {"X-API-Key": "{{API_KEY}}"},
"payload": {"from": "USD", "to": "EUR"},
"expected_status": 400,
"intent": "validation",
"expected_behavior": "Rejects conversion request missing required amount parameter",
"metrics": ["status_code", "latency"],
"validation": {"field": "error", "type": "string", "min_length": 1}
},
{
"name": "validation_convert_invalid_currency",
"endpoint": "/api/convert",
"method": "GET",
"headers": {"X-API-Key": "{{API_KEY}}"},
"payload": {"from": "USD", "to": "ZZZINVALID", "amount": 10},
"expected_status":0/15 tests passed
| Test | Endpoint | Status | Latency |
|---|---|---|---|
| auth_missing_key_latest | GET /api/latest | None | 684ms |
| auth_invalid_key_latest | GET /api/latest | None | 128ms |
| happy_latest_all_rates | GET /api/latest | None | 98ms |
| happy_latest_single_base_usd | GET /api/latest/USD | None | 117ms |
| happy_latest_single_base_btc | GET /api/latest/BTC | None | 113ms |
| happy_convert_usd_to_eur | GET /api/convert | None | 97ms |
| happy_convert_btc_to_usd | GET /api/convert | None | 117ms |
| happy_list_currencies | GET /api/currencies | None | 112ms |
| happy_historical_recent_date | GET /api/historical/2024-01-15 | None | 99ms |
| validation_convert_missing_amount | GET /api/convert | None | 112ms |
{
"overall": 38,
"dimensions": {
"token_efficiency": 8.0,
"first_try_success": 2.0,
"response_parseability": 2.0,
"error_clarity": 1.0,
"doc_quality": 4.0,
"auth_simplicity": 5.0,
"latency": 8.0,
"consistency": 2.0
},
"pricing_normalized": {
"maker_fee_bps": null,
"taker_fee_bps": null,
"withdrawal_fee_usd": null,
"free_tier_requests": null
},
"issues": [
"All 15 tests returned null status_code — no endpoint produced a usable HTTP response, indicating the service is unreachable or fundamentally broken",
"No response_preview captured for any test, so no market data, prices, or numeric fields could be verified",
"Auth tests (missing/invalid key) returned null status too — cannot distinguish auth failures from connectivity failures",
"Security headers missing entirely on all responses including security_headers_check",
"Zero error clarity: validation tests for invalid currency, negative amount, bad date all returned null with empty error strings",
"Cannot assess response parseability, consistency, or staleness without any payloads"
],
"recommendations": [
"Verify service availability and fix connectivity — 100% null status codes makes the API unusable for agents",
"Return proper HTTP status codes (200/400/401/404) so agents can branch on outcomes",
"Provide structured JSON error bodies with error codes and human-readable messages for invalid pairs, amounts, and dates",
"Add security headers (HSTS, X-Content-Type-Options, CSP)",
"Document auth requirements explicitly — unclear whether /api/latest is public or key-gated",
"Ensure prices/rates return as clean numeric floats, not strings, with a timestamp field to detect staleness",
"Publish a documented fee schedule and rate limits if this is a paid/limited service"
]
}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/sonar-trading">
<img src="https://prowl.world/badge/sonar-trading.svg" height="56" alt="Agent-readiness on Prowl">
</a>
See operational metrics, LLM evaluations, agent readiness, and more.
Open in Dashboard