On-chain lottery, draw history, jackpot and advertising endpoints
Full LLM thinking from the 4-phase benchmark pipeline.
{
"service_type": "crypto_app",
"base_url": "https://blocklottos.com",
"auth_method": "none",
"auth_config": {},
"endpoints": [
{"path": "/openapi.json", "method": "GET", "purpose": "openapi specification"}
],
"pricing_model": {"type": "free", "details": {}},
"rate_limits": {},
"capabilities": ["lottery", "draw_history", "jackpot", "advertising"],
"crypto_specifics": {
"supported_chains": [],
"token_count": 0,
"has_websocket": false,
"has_orderbook": false,
"fee_structure": "unknown",
"security_features": []
}
}```json
{
"tests": [
{
"name": "fetch_openapi_spec",
"endpoint": "/openapi.json",
"method": "GET",
"headers": {},
"payload": {},
"expected_status": 200,
"intent": "happy_path",
"expected_behavior": "Returns the OpenAPI specification document describing available endpoints",
"metrics": ["latency", "status_code", "accuracy"],
"validation": {"field": "openapi", "type": "string", "min_length": 1}
},
{
"name": "openapi_has_paths",
"endpoint": "/openapi.json",
"method": "GET",
"headers": {},
"payload": {},
"expected_status": 200,
"intent": "happy_path",
"expected_behavior": "OpenAPI spec contains a non-empty 'paths' object enumerating endpoints",
"metrics": ["accuracy"],
"validation": {"field": "paths", "type": "object", "min_length": 1}
},
{
"name": "security_headers_check",
"endpoint": "/",
"method": "GET",
"headers": {},
"payload": {},
"expected_status": 200,
"intent": "happy_path",
"expected_behavior": "Root endpoint responds and response includes security headers (HSTS or CSP or X-Frame-Options)",
"metrics": ["status_code", "latency"],
"validation": {"field": "headers.strict-transport-security", "type": "string", "min_length": 1}
},
{
"name": "unknown_endpoint_error",
"endpoint": "/v1/definitely-not-a-real-endpoint-xyz",
"method": "GET",
"headers": {},
"payload": {},
"expected_status": 404,
"intent": "validation",
"expected_behavior": "Unknown path is cleanly rejected with 404 rather than 500 or hang",
"metrics": ["status_code", "latency"],
"validation": {"field": "status", "type": "number", "min_length": 1}
},
{
"name": "invalid_draw_id_validation",
"endpoint": "/v1/draws/not-a-number",
"method": "GET",
"headers": {},
"payload": {},
"expected_status": 400,
"intent": "validation",
"expected_behavior": "Malformed draw identifier is rejected with a 4xx error, not a 5xx",
"metrics": ["status_code", "accuracy"],
"validation": {"field": "status", "type": "number", "min_length": 1}
},
{
"name": "invalid_trading_pair_validation",
"endpoint": "/v1/ticker/INVALID_PAIR_ZZZ",
"method": "GET",
"headers": {},
"payload": {},
"expected_status": 400,
"intent": "validation",
"expected_behavior": "Unsupported pair/token is rejected with structured 4xx error describing the bad input",
"metrics": ["status_code", "accuracy"],
"validation": {"field": "status", "type": "number", "min_length": 1}
},
{
"name": "invalid_http_method",
"endpoint": "/openapi.json",
"method": "POST",
"headers": {"Content-Type": "application/json"},
"payload": {"test": true},
"expected_status": 405,
"intent": "validation",
"expected_behavior": "POST to a GET-only endpoint returns 405 Method Not Allowed rather than 500",
"metrics": ["status_code", "accuracy"],
"validation": {"field": "status", "type": "number", "min_length": 1}
}
],
"pricing_probes": [
{
"name": "verify_free_tier_no_auth",
"description": "Service declares free pricing with no auth. Confirm public endpoint returns 2xx without any Authorization header.",
"endpoint": "/openapi.json",
"method": "GET",
"payload": {},
"check": "response.status == 200 and no 401/403 returned when Authorization header is absent"
},
{
"name": "verify_no_usage_billing_headers",
"description": "Since pricing is 'free' with empty details, confirm no unexpected billing/usage/cost headers are present claiming metered usage.",
"endpoint": "/openapi.json",
"method": "GET",
"payload": {},
"check": "response headers should NOT include x-usage, x-cost, or x-price headers implying paid metering"
}
],
"stress_profile": {
"concurrent_requests": 5,
"duration_seconds": 10,
"ramp_up": true
}
}
```4/7 tests passed
| Test | Endpoint | Status | Latency |
|---|---|---|---|
| fetch_openapi_spec | GET /openapi.json | 200 | 619ms |
| openapi_has_paths | GET /openapi.json | 200 | 208ms |
| security_headers_check | GET / | 200 | 121ms |
| unknown_endpoint_error | GET /v1/definitely-not-a-real-endpoint-xyz | 404 | 120ms |
| invalid_draw_id_validation | GET /v1/draws/not-a-number | 404 | 119ms |
| invalid_trading_pair_validation | GET /v1/ticker/INVALID_PAIR_ZZZ | 404 | 121ms |
| invalid_http_method | POST /openapi.json | 200 | 115ms |
{
"overall": 34,
"dimensions": {
"token_efficiency": 4.0,
"first_try_success": 3.0,
"response_parseability": 4.0,
"error_clarity": 2.0,
"doc_quality": 5.0,
"auth_simplicity": 8.0,
"latency": 6.0,
"consistency": 5.0
},
"pricing_normalized": {
"maker_fee_bps": null,
"taker_fee_bps": null,
"withdrawal_fee_usd": null,
"free_tier_requests": null
},
"issues": [
"Service is a lottery/advertising API, not a crypto market-data service; market-data scoring criteria (ticker, prices, trading pairs, fees) do not apply.",
"All non-/openapi.json paths (/, /v1/definitely-not-a-real-endpoint-xyz, /v1/draws/not-a-number, /v1/ticker/INVALID_PAIR_ZZZ) return HTML instead of JSON, causing CONTENT_TYPE_MISMATCH errors.",
"Error responses return full HTML pages with Google Tag Manager/gtag scripts instead of structured JSON error bodies; agents cannot reliably parse error reasons.",
"Invalid draw ID returns generic 404 HTML rather than a clear validation error (e.g., 'draw_id must be an integer').",
"Root path '/' returns a marketing HTML page rather than API metadata or a JSON index.",
"Invalid HTTP method test on /openapi.json returned 200, indicating the test may not have actually exercised a non-GET method or the server does not enforce method restrictions."
],
"recommendations": [
"Ensure all documented API endpoints (draws, jackpot, advertising, purchase flow) return application/json; route 404s to a JSON error handler.",
"Add a JSON error schema: {error, code, message, details} for 400/404/422/429/500 responses with actionable messages (invalid pair, invalid draw id, rate limit).",
"Disable or selectively serve the marketing SPA for API routes so unknown paths don't fall through to HTML.",
"Return 405 Method Not Allowed with JSON body for unsupported HTTP methods instead of 200.",
"If a market-data or trading capability exists (lottery pricing/tickets), expose ticker/jackpot endpoints with numeric JSON fields (price, jackpot_amount, currency, timestamp).",
"Publish fee/rate-limit docs for the agent purchase flow (non-custodial Base ticket purchases) so agents know costs before transacting.",
"Add caching/ETag guidance for /openapi.json since first call took 619ms."
]
}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/block-lottos">
<img src="https://prowl.world/badge/block-lottos.svg" height="56" alt="Agent-readiness on Prowl">
</a>
See operational metrics, LLM evaluations, agent readiness, and more.
Open in Dashboard