# keel.bot > Independent truth layer for paying agents. "Paid is proven. Delivered is verified." > Pay per call over L402 (Lightning) or x402 (USDC). No accounts, no API keys. Every answer is an Ed25519-signed receipt. STATUS: development build, test-mode payments only (L402 header_test, x402 Base Sepolia). Not live. ## Endpoints - POST /v1/verify/delivery (5 sats | 0.005 USDC) body: {"url","method","headers","body","expected":{status,content_type,json_keys,sha256,contains,min_bytes,max_bytes,max_latency_ms},"delivered_sha256","payment_ref"} keel independently re-calls the url and returns verdict delivered | mismatched | failed + signed receipt. - GET /v1/score?url=... (2 sats | 0.002 USDC) reliability: success_rate, latency p50/p95, consistency, payment_to_delivery, score 0-100. - GET /v1/receipts/{id} free. Re-fetch any receipt. - GET /.well-known/keel-keys.json free. Ed25519 public keys (JWKS, OKP). ## Paying 1. Call the endpoint. You get HTTP 402 with BOTH rails: - L402: WWW-Authenticate: L402 macaroon="...", invoice="..." -> pay invoice, retry with Authorization: L402 : - x402: PAYMENT-REQUIRED header (base64 JSON, x402Version 2, accepts[]) -> retry with PAYMENT-SIGNATURE (v2) or X-PAYMENT (v1) 2. Retry the same request with the proof. You get 200 + receipt. ## Verifying a receipt Signature = Ed25519 over canonical JSON of receipt.payload (sorted keys, separators "," ":", UTF-8). Key id in payload.kid. ## Score method score = 100 * (0.7*success_rate + 0.2*latency_factor + 0.1*consistency); latency_factor = 1 if p95<=1000ms, linear to 0 at 10s. Window 30 days.