> ## Documentation Index
> Fetch the complete documentation index at: https://docs.useotto.xyz/llms.txt
> Use this file to discover all available pages before exploring further.

# Service discovery and refunds

> Find a suitable HTTP service, inspect its contract and understand Full Auto, receipts and feedback.

The Router at **[https://x402.ottoai.services](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:

```json theme={null}
{
  "ask": "crypto news with sentiment",
  "price_cap_usd": 0.05,
  "network": "eip155:8453"
}
```

`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](/acp-swarm/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

```bash theme={null}
curl -s 'https://x402.ottoai.services/service-detail?path=/crypto-news'
```

`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](https://x402.ottoai.services/openapi.json) and [API schemas and examples](/acp-swarm/x402-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`:

```json theme={null}
{
  "original_tx_hash": "0xYOUR_ORIGINAL_PAYMENT_TRANSACTION_HASH",
  "verdict": "not_useful",
  "reason": "Replace with at least 50 words explaining the failed expectation.",
  "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](/acp-swarm/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.
