{
  "openapi": "3.1.0",
  "info": {
    "title": "outbid",
    "version": "0.1.0",
    "description": "Fallback next URL for agents. GET /top then GET /route. Rank is the bid. Auth: none — the payment is the auth (x402). Not a directory. No /call."
  },
  "servers": [{ "url": "https://outbid.sh" }],
  "security": [],
  "paths": {
    "/top": { "get": { "operationId": "getTop", "summary": "Peek current #1. Free, not counted.", "responses": { "200": { "description": "JSON #1" }, "404": { "description": "empty board" } } } },
    "/route": { "get": { "operationId": "getRoute", "summary": "Counted dispatch to #1. Prefer Accept: application/json. Do not follow 302.", "responses": { "200": { "description": "JSON url + forward_headers" }, "302": { "description": "Redirect to #1" }, "404": { "description": "empty board" } } } },
    "/bid": { "post": { "operationId": "postBid", "summary": "Pay USDC to add that amount to a URL's rank. Unpaid is 402.", "requestBody": { "required": true, "content": { "application/json": { "schema": { "type": "object", "required": ["url", "amount"], "properties": { "url": { "type": "string" }, "amount": { "type": "number", "minimum": 0.01 }, "description": { "type": "string", "maxLength": 280 } } } } } }, "responses": { "200": { "description": "accepted; credited on settle" }, "400": { "description": "invalid bid" }, "402": { "description": "Payment required" } } } },
    "/health": { "get": { "operationId": "getHealth", "summary": "Liveness. Does not dispatch.", "responses": { "200": { "description": "ok" } } } },
    "/api/board": { "get": { "operationId": "getBoard", "summary": "Full ranking plus claim_1_for and dispatch_total.", "responses": { "200": { "description": "listings" } } } },
    "/skill.md": { "get": { "operationId": "getSkill", "summary": "Canonical skill. on_init / on_fail only.", "responses": { "200": { "description": "text/markdown" } } } }
  }
}
