## Terms and Definitions Throughout this document and the Velo platform the following terms are used: * **Payor.** An entity (typically a corporation) which wishes to pay funds to one or more payees
Full LLM thinking from the 4-phase benchmark pipeline.
{
"service_type": "defi_protocol",
"base_url": "https://velopayments.com",
"auth_method": "api_key_header",
"auth_config": {},
"endpoints": [],
"pricing_model": {
"type": "per_request",
"details": {}
},
"rate_limits": {},
"capabilities": [],
"defi_specifics": {
"chains": [],
"protocols": [],
"yield_types": [],
"has_tvl_data": false,
"has_apy_data": false,
"has_price_feeds": false,
"contract_verified": false
}
}{
"tests": [
{
"name": "auth_missing_api_key",
"endpoint": "/v1/payments",
"method": "GET",
"headers": {},
"payload": null,
"expected_status": 401,
"intent": "auth",
"expected_behavior": "Rejects request without X-API-Key header, returns structured auth error",
"metrics": ["status_code", "latency"],
"validation": {"field": "error", "type": "string", "min_length": 1}
},
{
"name": "auth_wrong_api_key",
"endpoint": "/v1/payments",
"method": "GET",
"headers": {"X-API-Key": "invalid-key-000"},
"payload": null,
"expected_status": 401,
"intent": "auth",
"expected_behavior": "Rejects malformed/unknown API key with 401",
"metrics": ["status_code", "latency"],
"validation": {"field": "error", "type": "string", "min_length": 1}
},
{
"name": "list_payments_happy",
"endpoint": "/v1/payments",
"method": "GET",
"headers": {"X-API-Key": "{{api_key}}"},
"payload": null,
"expected_status": 200,
"intent": "happy_path",
"expected_behavior": "Returns paginated list of payments for authenticated payor",
"metrics": ["latency", "status_code", "accuracy"],
"validation": {"field": "payments", "type": "array", "min_length": 0}
},
{
"name": "create_payment_happy",
"endpoint": "/v1/payments",
"method": "POST",
"headers": {"X-API-Key": "{{api_key}}", "Content-Type": "application/json"},
"payload": {
"payorId": "{{payor_id}}",
"payeeId": "{{payee_id}}",
"amount": 100,
"currency": "USD",
"sourceAccountId": "{{account_id}}",
"paymentChannel": "ACH"
},
"expected_status": 201,
"intent": "happy_path",
"expected_behavior": "Accepts valid payment instruction and returns created payment with id",
"metrics": ["latency", "status_code", "accuracy"],
"validation": {"field": "paymentId", "type": "string", "min_length": 1}
},
{
"name": "create_payment_missing_amount_validation",
"endpoint": "/v1/payments",
"method": "POST",
"headers": {"X-API-Key": "{{api_key}}", "Content-Type": "application/json"},
"payload": {
"payorId": "{{payor_id}}",
"payeeId": "{{payee_id}}",
"currency": "USD"
},
"expected_status": 400,
"intent": "validation",
"expected_behavior": "Rejects payment missing required amount field with structured error",
"metrics": ["status_code", "latency"],
"validation": {"field": "error", "type": "string", "min_length": 1}
},
{
"name": "create_payment_bad_currency_validation",
"endpoint": "/v1/payments",
"method": "POST",
"headers": {"X-API-Key": "{{api_key}}", "Content-Type": "application/json"},
"payload": {
"payorId": "{{payor_id}}",
"payeeId": "{{payee_id}}",
"amount": 100,
"currency": "NOTACURRENCY",
"sourceAccountId": "{{account_id}}"
},
"expected_status": 400,
"intent": "validation",
"expected_behavior": "Rejects unsupported currency code with structured error",
"metrics": ["status_code", "latency"],
"validation": {"field": "error", "type": "string", "min_length": 1}
},
{
"name": "get_payment_by_id_happy",
"endpoint": "/v1/payments/{{payment_id}}",
"method": "GET",
"headers": {"X-API-Key": "{{api_key}}"},
"payload": null,
"expected_status": 200,
"intent": "happy_path",
"expected_behavior": "Returns single payment record with matching id and status",
"metrics": ["latency", "status_code", "accuracy"],
"validation": {"field": "paymentId", "type": "string", "min_length": 1}
},
{
"name": "get_payment_invalid_id_validation",
"endpoint": "/v1/payments/00000000-0000-0000-0000-000000000000",
"method": "GET",
"headers": {"X-API-Key": "{{api_key}}"},
"payload": null,
"expected_status": 404,
"intent": "validation",
"expected_behavior": "Returns 404 for non-existent payment id",
"metrics": ["status_code", "latency"],
"validation": {"field": "error", "type": "string", "min_length": 1}
},
{
"name": "list_payees_happy",
"endpoint": "/v1/payees",
"method": "GET",
"headers": {"X-API-Key": "{{api_key}}"},
"payload": null,
"expected_status": 200,
"intent": "happy_path",
"expected_behavior": "Returns paginated list of payees for the authenticated payor",
"metrics": ["latency", "status_code", "accuracy"],
"validation": {"field": "payees", "type": "array", "min_length": 0}
},
{
"name": "list_payment_channels_happy",
"endpoint": "/v1/paymentChannels",
"method": "GET",
"headers": {"X-API-Key": "{{api_key}}"},
"payload": null,
"expected_status": 200,
"intent": "happy_path",
"expected_1/13 tests passed
| Test | Endpoint | Status | Latency |
|---|---|---|---|
| auth_missing_api_key | GET /v1/payments | 301 | 120ms |
| auth_wrong_api_key | GET /v1/payments | 301 | 26ms |
| list_payments_happy | GET /v1/payments | 301 | 15ms |
| create_payment_happy | POST /v1/payments | 403 | 13ms |
| create_payment_missing_amount_validation | POST /v1/payments | 403 | 14ms |
| create_payment_bad_currency_validation | POST /v1/payments | 403 | 14ms |
| get_payment_by_id_happy | GET /v1/payments/{{payment_id}} | 301 | 60ms |
| get_payment_invalid_id_validation | GET /v1/payments/00000000-0000-0000-0000-000000000000 | 301 | 131ms |
| list_payees_happy | GET /v1/payees | 301 | 52ms |
| list_payment_channels_happy | GET /v1/paymentChannels | 301 | 49ms |
{
"overall": 18,
"dimensions": {
"token_efficiency": 1.0,
"first_try_success": 0.5,
"response_parseability": 1.0,
"error_clarity": 2.0,
"doc_quality": 1.0,
"auth_simplicity": 3.0,
"latency": 6.0,
"consistency": 2.0
},
"pricing_normalized": {
"cost_per_1k_requests": null,
"free_tier_requests": null
},
"issues": [
"All /v1/* endpoints return HTTP 301 redirects — base_url or path is wrong, so no real API is reached",
"POST requests return 403 HTML (CloudFront distribution misconfigured), not JSON — API is effectively unusable",
"No DeFi-specific endpoints exposed (no yields, staking, APY, TVL). Capabilities and endpoints arrays are empty",
"Error messages are generic CONTENT_TYPE_MISMATCH, not DeFi-relevant (no unsupported chain, invalid pool, APY method errors)",
"Auth tests (missing/wrong API key) return 301 instead of 401/403 JSON — auth semantics completely broken",
"No yield/APY data present, so accuracy, freshness, and consistency of DeFi values cannot be verified",
"DefiLlama crossref returned a TVL for 'Re' — no matching protocol TVL from this service to compare against",
"Documentation on APY vs APR, yield calculation methodology, or chain support is absent"
],
"recommendations": [
"Fix base URL and routing so /v1/* returns JSON instead of 301 redirects",
"Configure CloudFront to allow POST and return application/json error payloads",
"Expose concrete DeFi endpoints: /yields, /pools, /pools/{id}, /protocols, /tvl",
"Return standard numeric JSON for APY/APR/TVL with units documented",
"Return 401/403 JSON with clear auth error codes instead of redirects/HTML",
"Document APY calculation method (compounding frequency, fee handling, reward-token valuation) and chain coverage",
"Add validation error responses for missing amount, bad currency, unsupported chain, unknown pool",
"Provide public read-only endpoints for yield data without API key where possible"
]
}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/velo-payments-apis">
<img src="https://prowl.world/badge/velo-payments-apis.svg" height="56" alt="Agent-readiness on Prowl">
</a>
See operational metrics, LLM evaluations, agent readiness, and more.
Open in Dashboard