Skip to main content
The Router at https://x402.ottoai.services helps an agent choose an API. It searches Otto’s catalog and the public CDP Bazaar. Its recommendation fee is separate from buying the recommended service.

Find a service

POST /meta-intelligence accepts:
ask is required. price_cap_usd filters candidate prices and network expresses a preference. The same fields work as query parameters on GET; /meta is a compatibility alias. The call costs $0.001 through x402; the current challenge is definitive. The response separates otto_verified from open_bazaar_candidates. Each row includes source and verification labels, indicative price and pay_url. An Otto row’s call_card includes the method, required inputs and a service-detail link. Unmeasured quality and uptime stay null; a ranking is not a guarantee that a service will answer correctly. Set provider_scope: "otto_only" to exclude third-party services. Structured fields are authoritative, including provider_scope: "all" and an empty required_capabilities array. When the scope field is omitted, unambiguous unconditional wording such as “return only Otto-owned endpoints” is also recognized. The default is all. For block evidence, use required_capabilities: ["block_hashes", "source_identity", "observation_timestamps"]. These are hard filters against declared Otto output contracts; unverified Bazaar descriptions do not qualify. GET accepts a comma-separated list. The response echoes applied_constraints, and call cards list discovery_capabilities. No permitted match returns 503 without settling the discovery fee. Invalid filters return 400 without settlement. Capabilities mean the response contract supports those fields, not that every optional head is available or every requirement in free text has been certified. Chain Status provides mined-head hashes, provisional/nullable pending hashes, safe source identification and observation timestamps. Block age is measured at observation; response staleness is separate. Inspect the returned data before acting. Choose a candidate and pay that provider directly. Recommendation mode holds no balance and adds no markup to the downstream price. Third-party providers have their own contracts.

Inspect a request for free

GET /service-detail returns the Otto route’s methods, request schema, indicative cost, auth and measured signals. Unknown paths return 404 without a charge. For complete route discovery use OpenAPI and API schemas and examples.

Buy a result with Full Auto

POST /full-auto accepts ask and price_cap_usd. It chooses a service, pays on your behalf and returns the result. The charge is the downstream cost plus a flat $0.001 fee, within the request’s upto cap. This is per-call payment with no prepay balance. /auto is its compatibility alias. Use a client that supports the advertised upto requirement and review the total cap. Full Auto’s authorization differs from the exact-price read example in the HTTP guide. Keep its result, payment receipt and settlement transaction hash. GET /stats reports x402Enabled, fullAutoEnabled and refundsEnabled. These flags show enabled configuration; a successful paid response is the evidence for your particular call.

Refunds

POST /feedback is itself a paid route, currently $0.001. To request a refund, send the original settlement transaction hash, a verdict, a reason of at least 50 words, and refund_request: true:
The short sample reason is a placeholder and will not pass the minimum. tx_hash and call_id are accepted aliases for original_tx_hash. Take the transaction hash from the original settlement evidence, including X-Payment-Receipt where supplied; a payment challenge is not a receipt. The program covers qualifying Otto services reached through the Router and Full Auto calls. It does not reimburse third-party Bazaar charges or every direct API purchase. For a service claim, the payer needs an unused matching Router purchase in the receipt record; a standalone Meta fee is not a refundable original call. An approved claim includes eligible service/router charges and the feedback fee, subject to all limits:
  • Only the original payer can receive the refund, never more than its eligible payments to Otto.
  • Maximum $0.01 per transaction and 10 claims per wallet in a rolling 24 hours.
  • $10 per rolling 24 hours is the global budget, shared across all wallets. Service circuit breakers can also pause claims.
  • One original payment can back one refund. A feedback purchase cannot be recycled into another refund claim.
refund.status: "reserved" is approval, not a completed payout. Payout requires the feedback fee to settle from the same payer and the payout service to complete the transfer. An ambiguous payout is held for review rather than blindly retried. Keep the response and check the refund transaction before treating funds as returned. Otto evaluates its own claims; this is a counterparty guarantee, not an independent ruling.

Receipt lookup and outcome reports

ACP proof: GET /receipts/v1/{rail}/{chainId}/{contract}/{jobId} is a free on-chain metadata lookup. Use rail=acp-v1 or acp-v2, chain 8453 and that rail’s allowlisted contract. It returns job proof, never raw delivery content. ACP v2 commits a deliverable hash in submit(); supply optional submitTx to decode it. Without that transaction the hash can be null, with log-query information provided. ACP v1 does not commit a deliverable hash: its chainVerifiable and railCommitsArtifactHash are false. An Otto attestation does not turn that into a chain commitment. x402 content receipts arrive in the paid response’s PAYMENT-RESPONSE header where generated; this lookup does not support rail=x402. Outcome reports: POST /report-outcome and POST /report-pattern are free, data-only reports for settled Full Auto calls. They require call_id, success, an EIP-712 signature from the original payer, and optional network and diagnosis. They do not issue refunds. A duplicate returns 409 already_reported; a disabled reporting service returns an availability error. The signed OutcomeReport fields, in order, are callId: string, network: string, chainId: uint256, kind: string (outcome or pattern) and success: bool. Use domain { name: "Otto X402 Open Router", version: "1", chainId }, with the receipt’s numeric EVM chain ID and exact network string.

Router MCP

https://x402.ottoai.services/mcp exposes otto_meta_intelligence and otto_feedback. Both proxy their paid HTTP routes; this server has no free-call allowance. It is separate from Otto Intel MCP. Pass the route’s fields plus x_payment after signing its challenge. Keep _meta["com.ottoai/payment-response"]. After a dropped connection, retry the same input and authorization to recover the stored result; reusing it for another input is refused. There is no otto_full_auto tool in this interface.