{"openapi":"3.1.0","info":{"title":"AX1 Console","version":"1.0.0","description":"AX1 Console provides agent services paid on Base through x402.","x-guidance":"Send a Base token contract address, get an AI-written verdict: onchain metrics, a plain-language take, and a shareable verdict card. Entertainment, not trading advice.\n\nRequest: POST /api/dashboard/q-verdict/resource with Content-Type: application/json and JSON { \"requestKey\": \"q-verdict-3f7b2c1e-8a4d-4e9f-9c21-0b6d7a5e1f22\", \"tokenAddress\": \"0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913\" }. Both fields are required; no other JSON fields are accepted. tokenAddress is the Base token contract address (0x plus 40 hex characters), not a ticker. requestKey is a caller-created idempotency key matching ^[A-Za-z0-9][A-Za-z0-9._:-]{15,127}$ (16-128 characters). Reuse the same requestKey and tokenAddress for retries; do not create a new key to recover an existing payment.\n\nResponse: HTTP 200 when run.status is \"succeeded\", otherwise HTTP 202 after settlement. Both return JSON { \"requestId\": string, \"accepted\": true, \"run\": object }. accepted means the paid run was accepted, not that generation succeeded. run includes runId, requestId, requestKey, route, tokenAddress, status, payment, attempts, attemptsUsed, attemptsMax, replayEligible, result, share, contestPointCreated, createdAt, updatedAt and completedAt.\n\nWhen available, run.result contains grade (BASED, MID, COOKED or RADIOACTIVE), roast (the plain-language take), oneLiner (camelCase), metrics, generatedAt, fromCache and disclaimer. run.result.metrics contains tokenAddress, ticker, tokenName, fetchedAt and a metrics array. Each metrics item contains key, label, availability, value, unit, provenance and unavailableReason. Numeric metric values are strings; unavailable values are null, not zero.\n\nrun.share contains shareId, ticker, shortTokenAddress, grade, roast, price, attribution, disclaimer, imageUrl (verdict card), permalink (share page), xIntentUrl and createdAt. Payment amount is run.payment.amount, not a top-level price; amount and share.price contain symbol, amountRaw, decimals, display and network. The settlement hash is run.payment.transaction.txHash when transaction is non-null.\n\nrun.result and run.share can be null before successful delivery. For an accepted run, GET /api/dashboard/q-verdict/runs/{runId} with the same Privy session to read JSON { \"requestId\": string, \"run\": object }; inspect run.status rather than treating every 202 as still running. Do not initiate another payment to poll the result.\n\nAuthentication and payment: an unsigned request without a session can receive a quote-only HTTP 402 with a PAYMENT-REQUIRED header. Paid execution still requires the AX1 Dashboard Privy session controlling a supported paying agent wallet and the x402 PAYMENT-SIGNATURE header. A public quote does not grant execution access."},"servers":[{"url":"https://www.ax1.vc"}],"paths":{"/api/dashboard/q-verdict/resource":{"post":{"operationId":"createQVerdict","summary":"AI verdict on any Base token by contract address","description":"Send a Base token contract address, get an AI-written verdict: onchain metrics, a plain-language take, and a shareable verdict card. Entertainment, not trading advice.\n\nRequest: POST /api/dashboard/q-verdict/resource with Content-Type: application/json and JSON { \"requestKey\": \"q-verdict-3f7b2c1e-8a4d-4e9f-9c21-0b6d7a5e1f22\", \"tokenAddress\": \"0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913\" }. Both fields are required; no other JSON fields are accepted. tokenAddress is the Base token contract address (0x plus 40 hex characters), not a ticker. requestKey is a caller-created idempotency key matching ^[A-Za-z0-9][A-Za-z0-9._:-]{15,127}$ (16-128 characters). Reuse the same requestKey and tokenAddress for retries; do not create a new key to recover an existing payment.\n\nResponse: HTTP 200 when run.status is \"succeeded\", otherwise HTTP 202 after settlement. Both return JSON { \"requestId\": string, \"accepted\": true, \"run\": object }. accepted means the paid run was accepted, not that generation succeeded. run includes runId, requestId, requestKey, route, tokenAddress, status, payment, attempts, attemptsUsed, attemptsMax, replayEligible, result, share, contestPointCreated, createdAt, updatedAt and completedAt.\n\nWhen available, run.result contains grade (BASED, MID, COOKED or RADIOACTIVE), roast (the plain-language take), oneLiner (camelCase), metrics, generatedAt, fromCache and disclaimer. run.result.metrics contains tokenAddress, ticker, tokenName, fetchedAt and a metrics array. Each metrics item contains key, label, availability, value, unit, provenance and unavailableReason. Numeric metric values are strings; unavailable values are null, not zero.\n\nrun.share contains shareId, ticker, shortTokenAddress, grade, roast, price, attribution, disclaimer, imageUrl (verdict card), permalink (share page), xIntentUrl and createdAt. Payment amount is run.payment.amount, not a top-level price; amount and share.price contain symbol, amountRaw, decimals, display and network. The settlement hash is run.payment.transaction.txHash when transaction is non-null.\n\nrun.result and run.share can be null before successful delivery. For an accepted run, GET /api/dashboard/q-verdict/runs/{runId} with the same Privy session to read JSON { \"requestId\": string, \"run\": object }; inspect run.status rather than treating every 202 as still running. Do not initiate another payment to poll the result.\n\nAuthentication and payment: an unsigned request without a session can receive a quote-only HTTP 402 with a PAYMENT-REQUIRED header. Paid execution still requires the AX1 Dashboard Privy session controlling a supported paying agent wallet and the x402 PAYMENT-SIGNATURE header. A public quote does not grant execution access.","tags":["Agents","Token","Verdict"],"security":[{"privySession":[]}],"x-payment-info":{"price":{"mode":"fixed","currency":"USD","amount":"0.02"},"protocols":[{"x402":{}}]},"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"properties":{"requestKey":{"type":"string","minLength":16,"maxLength":128,"pattern":"^[A-Za-z0-9][A-Za-z0-9._:-]{15,127}$","description":"Caller-created idempotency key. Reuse with the same token never creates a second payment."},"tokenAddress":{"type":"string","pattern":"^0x[0-9a-fA-F]{40}$","description":"Base token contract address to evaluate."}},"required":["requestKey","tokenAddress"]},"example":{"requestKey":"q-verdict-discovery-3f7b2c1e8a4d4e9f","tokenAddress":"0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913"}}}},"responses":{"200":{"description":"Q-Verdict succeeded after payment settlement.","content":{"application/json":{"schema":{"type":"object","properties":{"requestId":{"type":"string"},"accepted":{"type":"boolean","const":true},"run":{"type":"object","properties":{"runId":{"type":"string"},"requestId":{"type":"string"},"requestKey":{"type":"string"},"tokenAddress":{"type":"string"},"status":{"enum":["awaiting_payment","queued","running","retry_wait","replay_available","succeeded","terminal_failed"]},"payment":{"type":"object","description":"Payment details; amount is a USDC amount object, transaction contains txHash when non-null."},"result":{"type":["object","null"],"properties":{"grade":{"enum":["BASED","MID","COOKED","RADIOACTIVE"]},"roast":{"type":"string","maxLength":220},"oneLiner":{"type":"string","maxLength":60},"metrics":{"type":"object","properties":{"tokenAddress":{"type":"string"},"ticker":{"type":"string"},"tokenName":{"type":["string","null"]},"fetchedAt":{"type":"string"},"metrics":{"type":"array","items":{"type":"object","properties":{"key":{"type":"string"},"label":{"type":"string"},"availability":{"enum":["available","unavailable"]},"value":{"type":["string","null"]},"unit":{"type":["string","null"]},"provenance":{"type":["object","null"]},"unavailableReason":{"type":["string","null"]}}}}}},"generatedAt":{"type":"string"},"fromCache":{"type":"boolean"},"disclaimer":{"type":"string","const":"Not financial advice."}},"required":["grade","roast","oneLiner","metrics","generatedAt","fromCache","disclaimer"]},"share":{"type":["object","null"],"properties":{"imageUrl":{"type":"string","format":"uri"},"permalink":{"type":"string","format":"uri"},"xIntentUrl":{"type":"string","format":"uri"}}}},"required":["runId","requestId","tokenAddress","status","payment","result","share"]}},"required":["requestId","accepted","run"]},"example":{"requestId":"3f7b2c1e-8a4d-4e9f-9c21-0b6d7a5e1f22","accepted":true,"run":{"runId":"4f7b2c1e-8a4d-4e9f-9c21-0b6d7a5e1f22","requestId":"3f7b2c1e-8a4d-4e9f-9c21-0b6d7a5e1f22","requestKey":"q-verdict-3f7b2c1e-8a4d-4e9f-9c21-0b6d7a5e1f22","route":"q_verdict","tokenAddress":"0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913","status":"succeeded","payment":{"paymentId":"5f7b2c1e-8a4d-4e9f-9c21-0b6d7a5e1f22","status":"settled","amount":{"network":"eip155:8453","symbol":"USDC","decimals":6,"amountRaw":"20000","display":"$0.02"},"network":"eip155:8453","scheme":"exact","transaction":{"network":"eip155:8453","txHash":"0x0000000000000000000000000000000000000000000000000000000000000000","confirmedAt":"2026-09-09T00:00:00.000Z"},"createdAt":"2026-09-09T00:00:00.000Z","settledAt":"2026-09-09T00:00:00.000Z","error":null},"attempts":[{"attempt":1,"status":"succeeded","startedAt":"2026-09-09T00:00:00.000Z","finishedAt":"2026-09-09T00:00:00.000Z","nextRetryAt":null,"error":null}],"attemptsUsed":1,"attemptsMax":3,"replayEligible":false,"result":{"grade":"MID","roast":"Liquidity data is unavailable in this example. An incomplete snapshot is not a trading signal.","oneLiner":"An incomplete snapshot, not a trading signal","metrics":{"tokenAddress":"0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913","ticker":"USDC","tokenName":"USD Coin","fetchedAt":"2026-09-09T00:00:00.000Z","metrics":[{"key":"liquidity_usd","label":"Liquidity","availability":"unavailable","value":null,"unit":"USD","provenance":null,"unavailableReason":"not_reported"}]},"generatedAt":"2026-09-09T00:00:00.000Z","fromCache":false,"disclaimer":"Not financial advice."},"share":{"shareId":"AUPT-OCnpJnVyybguja6M1","ticker":"USDC","shortTokenAddress":"0x8335…2913","grade":"MID","roast":"Liquidity data is unavailable in this example. An incomplete snapshot is not a trading signal.","price":{"network":"eip155:8453","symbol":"USDC","decimals":6,"amountRaw":"20000","display":"$0.02"},"attribution":"Verdict by AX1 agent · $0.02 paid onchain via x402 · not financial advice","disclaimer":"Not financial advice.","imageUrl":"https://www.ax1.vc/api/q-verdict/share/AUPT-OCnpJnVyybguja6M1/card","permalink":"https://www.ax1.vc/q-verdict/AUPT-OCnpJnVyybguja6M1","xIntentUrl":"https://x.com/intent/post?text=%24USDC%20verdict%3A%20MID.%20%22An%20incomplete%20snapshot%2C%20not%20a%20trading%20signal%22%20Bet%20yours%20does%20better%3A%20https%3A%2F%2Fwww.ax1.vc%2Fq-verdict%2FAUPT-OCnpJnVyybguja6M1","createdAt":"2026-09-09T00:00:00.000Z"},"contestPointCreated":false,"createdAt":"2026-09-09T00:00:00.000Z","updatedAt":"2026-09-09T00:00:00.000Z","completedAt":"2026-09-09T00:00:00.000Z"}}}}},"202":{"description":"Paid run accepted but not succeeded; inspect run.status. result and share may be null.","content":{"application/json":{"schema":{"type":"object","properties":{"requestId":{"type":"string"},"accepted":{"type":"boolean","const":true},"run":{"type":"object","properties":{"runId":{"type":"string"},"requestId":{"type":"string"},"requestKey":{"type":"string"},"tokenAddress":{"type":"string"},"status":{"enum":["awaiting_payment","queued","running","retry_wait","replay_available","succeeded","terminal_failed"]},"payment":{"type":"object","description":"Payment details; amount is a USDC amount object, transaction contains txHash when non-null."},"result":{"type":["object","null"],"properties":{"grade":{"enum":["BASED","MID","COOKED","RADIOACTIVE"]},"roast":{"type":"string","maxLength":220},"oneLiner":{"type":"string","maxLength":60},"metrics":{"type":"object","properties":{"tokenAddress":{"type":"string"},"ticker":{"type":"string"},"tokenName":{"type":["string","null"]},"fetchedAt":{"type":"string"},"metrics":{"type":"array","items":{"type":"object","properties":{"key":{"type":"string"},"label":{"type":"string"},"availability":{"enum":["available","unavailable"]},"value":{"type":["string","null"]},"unit":{"type":["string","null"]},"provenance":{"type":["object","null"]},"unavailableReason":{"type":["string","null"]}}}}}},"generatedAt":{"type":"string"},"fromCache":{"type":"boolean"},"disclaimer":{"type":"string","const":"Not financial advice."}},"required":["grade","roast","oneLiner","metrics","generatedAt","fromCache","disclaimer"]},"share":{"type":["object","null"],"properties":{"imageUrl":{"type":"string","format":"uri"},"permalink":{"type":"string","format":"uri"},"xIntentUrl":{"type":"string","format":"uri"}}}},"required":["runId","requestId","tokenAddress","status","payment","result","share"]}},"required":["requestId","accepted","run"]}}}},"400":{"description":"Invalid request."},"401":{"description":"AX1 Dashboard authentication required."},"402":{"description":"Payment Required."},"503":{"description":"Q-Verdict is unavailable or disabled."}}}}},"components":{"securitySchemes":{"privySession":{"type":"apiKey","in":"cookie","name":"privy-token","description":"AX1 Dashboard Privy access token used to bind execution to the paying agent wallet."}}}}