Build once, register reliably, and keep your AgentCash resources discoverable.
If agents can't discover your API, they can't call it. Bulletproof discovery turns your endpoint from merely listed to reliably invocable.
When metadata and runtime 402 behavior agree, agents succeed on the first pass. You get fewer AgentCash failures, less debugging churn, and more real agent traffic.
402 challenge behavior as the final source of truth.Paste this directly into your coding agent. It should handle discovery implementation and validation end-to-end.
OpenAPI is the canonical discovery format. Use it for the cleanest machine-readable contract and best agent compatibility.
The x-payment-info fields are a superset of the IETF API payment spec. The fields do not collide — if you already follow the IETF standard, your service is still compatible and you can define both without conflict.
Use this first. It gives the cleanest machine-readable contract and best tooling compatibility.
Expected location: GET /openapi.json
{
"openapi": "3.1.0",
"info": {
"title": "My API",
"version": "1.0.0",
"description": "example demo server",
"x-guidance": "Use POST /api/search for neural web search. Accepts a JSON body with a 'query' field."
},
"x-discovery": {
"ownershipProofs": ["<proof-1>"]
},
"paths": {
"/api/search": {
"post": {
"operationId": "search",
"summary": "Search - Neural search across the web",
"tags": ["Search"],
"x-payment-info": {
"price": { "mode": "fixed", "currency": "USD", "amount": "0.010000" },
"protocols": [{ "x402": {} }, { "mpp": { "method": "", "intent": "", "currency": "" } }]
},
"requestBody": {
"required": true,
"content": {
"application/json": {
"schema": {
"type": "object",
"properties": {
"query": { "type": "string", "minLength": 1, "description": "The query string for the search" }
},
"required": ["query"]
}
}
}
},
"responses": {
"200": {
"description": "Successful response",
"content": {
"application/json": {
"schema": {
"type": "object",
"properties": {
"results": { "type": "array", "items": { "type": "object" } }
},
"required": ["results"]
}
}
}
},
"402": { "description": "Payment Required" }
}
}
}
}
}Identity-gated routes require a wallet proof but no payment. Agents with an AgentCash wallet can call these for free.
siwx security scheme in components.securitySchemes and reference it via security: [{ "siwx": [] }]. Do not add x-payment-info — that classifies the route as paid."0" — the client signs the Challenge to prove key ownership without funds transfer. See mpp.dev/advanced/identity.// x402 example — SIWX security scheme
{
"components": {
"securitySchemes": {
"siwx": { "type": "apiKey", "in": "header", "name": "SIGN-IN-WITH-X" }
}
},
"paths": {
"/api/me": {
"get": {
"summary": "Get current user profile",
"security": [{ "siwx": [] }],
"responses": { "200": { "description": "OK" } }
}
}
}
}The scheme must be named siwx — discovery resolves it by name.
X402Scan/MPPScan uses the OpenAPI document at /openapi.json to discover your API. It will also check the runtime 402 challenge behavior to ensure it is correct.
| Order | Source | Expected Location |
|---|---|---|
| 1 | OpenAPI document | /openapi.json |
| 2 | 402 API Response | Correct 402 header response |
These are the most frequent errors seen during registration.
| Error | Likely Cause | Fix |
|---|---|---|
Not Found | OpenAPI not found at {origin}/openapi.json | Add a OpenAPI document at {origin}/openapi.json |
Input/Output Schema Missing | Operation has no input or output schema | Add an input and output schema to the operation |
No Payment Modes Detected | No payment modes detected in the response | Add a valid payment mode to the response (x402 or MPP) |