{"openapi":"3.1.0","info":{"title":"Chaconne Verify / Chaconne Agent","version":"0.1.0","summary":"Evidence-backed verification and conditional execution for tokenized US stocks on X Layer.","description":"Verification of data comparability and execution constraints for tokenized-stock trades (xStocks on X Layer, chain 196). Every result is a signed, hash-anchored report with re-checkable evidence. Not investment advice; no prediction of price direction; nothing is ever executed without the owner's own wallet signature.\n\nFree endpoints are rate-limited per client IP (RateLimit-Limit / RateLimit-Remaining / RateLimit-Reset headers; 429 + Retry-After when exceeded).\n\nA2MCP transport rule: these endpoints answer HTTP 200 for both delivered results and missing/invalid input (body.status = delivered | input_required; header X-A2MCP-Status mirrors it) and 402 for paid tiers; they never return 4xx for input problems, because the OKX client treats any other status as endpoint_unreachable.\n\nEvidence mode on this deployment: LIVE. Report price USD: 0. Payment network: eip155:1952.","contact":{"name":"Chaconne","url":"https://verify.chaconne.xyz"},"license":{"name":"MIT","url":"https://github.com/Bachamht/verify_chaconne"}},"servers":[{"url":"https://verify.chaconne.xyz"}],"tags":[{"name":"discovery","description":"Machine-readable entry points (no key)"},{"name":"public","description":"Free read-only endpoints (no key; per-IP rate limit)"},{"name":"a2mcp","description":"OKX AI A2MCP single-endpoint services (no key; 200-only transport; 402 for paid tiers)"},{"name":"keyed","description":"Owner-scoped endpoints (x-api-key or Authorization: Bearer). Wallet-bound keys are created at /agent/keys with one wallet signature and act for that wallet (no extra header); operator keys also send x-verify-caller: <0x address>."}],"components":{"securitySchemes":{"apiKey":{"type":"apiKey","in":"header","name":"x-api-key","description":"Operator-issued API key (Authorization: Bearer <key> also accepted). Wildcard keys (web:*) additionally require x-verify-caller: <EVM address>."}},"headers":{"RateLimit-Limit":{"schema":{"type":"integer"},"description":"Requests allowed per window on free endpoints"},"RateLimit-Remaining":{"schema":{"type":"integer"}},"RateLimit-Reset":{"schema":{"type":"integer"},"description":"Seconds until the window resets"},"X-A2MCP-Status":{"schema":{"type":"string","enum":["delivered","input_required","rate_limited"]},"description":"Mirrors body.status on /a2mcp/* responses (body stays the source of truth)"}},"schemas":{"A2mcpEnvelope":{"type":"object","description":"A2MCP envelope. status=delivered → ok:true and the result fields; status=input_required → ok:false with missingParams / problems / schema / example / howToCall so the caller can collect the parameters.","required":["ok","status"],"properties":{"ok":{"type":"boolean"},"status":{"type":"string","enum":["delivered","input_required","rate_limited"]},"summary":{"type":"string","description":"One-paragraph English summary (URLs are placed at the end of the sentence with no trailing punctuation)"},"missingParams":{"type":"array","items":{"type":"string"}},"problems":{"type":"array","items":{"type":"object","properties":{"field":{"type":"string"},"value":{"type":"string"},"hint":{"type":"string"}}}},"schema":{"type":"object"},"example":{},"howToCall":{"type":"object"}}},"A2mcpVerifyInput":{"type":"object","required":["ownerAddress","outputAssetKey"],"properties":{"ownerAddress":{"type":"string","description":"EVM wallet that will fund the trade (0x…, 40 hex). Aliases: owner, wallet, address"},"recipientAddress":{"type":"string","description":"EVM address that receives the stock token; defaults to ownerAddress"},"inputAssetKey":{"type":"string","description":"Stablecoin to spend: symbol (USDG | USDC | USDT0), 0x address, or eip155:196:<address>. Default USDG"},"outputAssetKey":{"type":"string","description":"Stock token to buy: symbol (AAPLx | NVDAx) or ticker (AAPL | NVDA), 0x address, or eip155:196:<address>. Aliases: stock, token, symbol"},"amount":{"type":"string","description":"Human amount of the stablecoin, e.g. \"100\" (= 100 USDG). Use this OR amountInRaw"},"amountInRaw":{"type":"string","description":"Input amount in the stablecoin's smallest unit (6 decimals: 5 USDG = \"5000000\")"},"policyId":{"type":"string","enum":["STRICT_LIVE","REFERENCE_CONTEXT","QUOTE_ONLY"],"description":"Verification policy; default REFERENCE_CONTEXT (official close as context). STRICT_LIVE requires US regular hours + live reference. No automatic downgrade"},"maxSlippageBps":{"type":"integer","minimum":1,"maximum":300,"description":"Max slippage in basis points (50 = 0.5%); default 50"},"maxPriceImpactBps":{"type":"integer","minimum":1,"maximum":1000,"description":"Optional; default 100"},"maxReferenceDeviationBps":{"type":"integer","minimum":1,"maximum":2000,"description":"Optional; default 300; not used by QUOTE_ONLY"},"clientRequestId":{"type":"string","description":"Optional idempotency key"}}},"A2mcpPlanInput":{"type":"object","required":["ownerAddress","inputAssetKeys","outputAssetKey","amountInRaw","policyId","maxSlippageBps"],"properties":{"ownerAddress":{"type":"string","description":"EVM address that will fund the trade (0x…, 40 hex)"},"recipientAddress":{"type":"string","description":"Receives the stock token; defaults to ownerAddress"},"inputAssetKeys":{"type":"array","items":{"type":"string"},"description":"Allowed funding stablecoins (eip155:<chainId>:<address>), first one is the budget unit; see GET /v1/assets"},"outputAssetKey":{"type":"string","description":"Stock token to buy (or sell), as eip155:<chainId>:<address>"},"legs":{"type":"array","description":"Optional basket instead of outputAssetKey: [{ outputAssetKey, weightBps }] summing to 10000","items":{"type":"object"}},"amountInRaw":{"type":"string","description":"Total budget in the first input asset's smallest unit"},"side":{"type":"string","enum":["buy","sell"],"description":"Default buy"},"policyId":{"type":"string","enum":["STRICT_LIVE","REFERENCE_CONTEXT","QUOTE_ONLY"]},"maxSlippageBps":{"type":"integer","minimum":1,"maximum":300},"maxPriceImpactBps":{"type":"integer","minimum":1,"maximum":1000},"maxReferenceDeviationBps":{"type":"integer","minimum":1,"maximum":2000},"deadline":{"type":"string","description":"ISO time; default now + 1 h"},"ladderBps":{"type":"array","items":{"type":"integer"},"description":"Optional amount ladder, default [10000,7500,5000,2500,1000]"},"clientRequestId":{"type":"string","description":"Optional idempotency key"}}},"A2mcpAgentTasksInput":{"type":"object","description":"Give either an owner wallet (impacts are computed against its holdings and tasks) or a set of assets (symbols like AAPLx / NVDAx / AAPL, or eip155 keys).","properties":{"owner":{"type":"string","description":"EVM address (0x…, 40 hex). Optional if `assets` is given."},"assets":{"type":"array","items":{"type":"string"},"description":"Stock tokens to plan for: symbols (AAPLx, NVDA) or eip155:<chainId>:<address>. Optional if `owner` is given. A comma-separated string is accepted too."},"horizonHours":{"type":"integer","minimum":1,"maximum":336,"description":"Event horizon for impacts, default 48"}}}}},"paths":{"/healthz":{"get":{"tags":["public"],"summary":"Liveness + public capability flags","description":"Public view: ok, time, evidenceMode, registryVersion, paymentNetwork, release.treeHash (public integrity anchor), capability flags. Internal detail (context source URL, key ids, startedAt) is only in /healthz?deep=1 with an API key.","security":[],"parameters":[{"name":"deep","in":"query","schema":{"type":"string","enum":["1"]},"description":"With a valid API key: the detailed object"}],"responses":{"200":{"description":"health","content":{"application/json":{"schema":{"type":"object"}}}}}}},"/v1/assets":{"get":{"tags":["public"],"summary":"Verified asset registry","description":"Chain + contract are the identity; symbols are display only. Current registry: stablecoins USDG / USDC / USD₮0; stock tokens AAPLx (AAPL) / NVDAx (NVDA) / SPYx (SPY) / SPCXx (SPCX) / CRCLx (CRCL) / HOODx (HOOD) / GMEx (GME) / COINx (COIN) / MSTRx (MSTR) / SNDKx (SNDK) / INTCx (INTC) / BMNRx (BMNR) / QQQx (QQQ) / MRVLx (MRVL) / TSLAx (TSLA) / DELLx (DELL) / MUx (MU) / GOOGLx (GOOGL) / ORCLx (ORCL) / AMDx (AMD) / AMZNx (AMZN) / AVGOx (AVGO) / SLVx (SLV) / ASMLx (ASML) / MSFTx (MSFT) / METAx (META) / PLTRx (PLTR) / MCDx (MCD) / TSMx (TSM) / BRK.Bx (BRK.B) / KOx (KO) / IWMx (IWM) / IBMx (IBM) / MRKx (MRK) / SMCIx (SMCI) / WMTx (WMT) / SKHYx (SKHY) / ICEx (ICE) / MRNAx (MRNA) / RDDTx (RDDT).","security":[],"responses":{"200":{"description":"registry","content":{"application/json":{"schema":{"type":"object"}}}}}}},"/v1/policies":{"get":{"tags":["public"],"summary":"Verification policies and hashes","description":"Policies: STRICT_LIVE / REFERENCE_CONTEXT / QUOTE_ONLY. Includes policyDefinitionHash per version, pricing and the re-verification entitlement. No automatic downgrade between policies.","security":[],"responses":{"200":{"description":"policies","content":{"application/json":{"schema":{"type":"object"}}}}}}},"/v1/products":{"get":{"tags":["public"],"summary":"Product catalog (SKUs, prices, what counts as delivered)","security":[],"responses":{"200":{"description":"products","content":{"application/json":{"schema":{"type":"object"}}}}}}},"/pub/openapi.json":{"get":{"tags":["discovery"],"summary":"This document","security":[],"responses":{"200":{"description":"OpenAPI 3.1","content":{"application/json":{"schema":{"type":"object"}}}}}}},"/pub/llms.txt":{"get":{"tags":["discovery"],"summary":"Plain-text guide for LLM agents","security":[],"responses":{"200":{"description":"text/plain"}}}},"/pub/agent-card.json":{"get":{"tags":["discovery"],"summary":"Agent card (name, endpoints, auth, contact)","security":[],"responses":{"200":{"description":"agent card","content":{"application/json":{"schema":{"type":"object"}}}}}}},"/v1/playbooks":{"get":{"tags":["public"],"summary":"Task playbooks (templates) with parameter specs","description":"Playbooks: session_dca / event_aware_accumulate / discount_watch / target_sell / portfolio_rebalance / agent_goal. Condition types: session / avoid_event_window / earnings_window / not_in_fed_blackout / max_vix / max_move / premium_bps_lte / min_gap_trading_days / max_steps_per_trading_day / require_cross_asset_confirmation / target_price_gte / target_price_lte / tracked_cost_pnl_pct_gte / cash_floor / thesis_holds.","security":[],"responses":{"200":{"description":"playbooks","content":{"application/json":{"schema":{"type":"object"}}}}}}},"/v1/context":{"get":{"tags":["public"],"summary":"Signed market context (free agent tier)","description":"Always 200; unavailable fields are status=unavailable and never omitted or replaced by 0. Without a key only tier=agent is served. Filters: assetKey, owner, taskId (the last two need a key).","security":[],"parameters":[{"name":"tier","in":"query","schema":{"type":"string","enum":["agent","paid","internal","display"]}},{"name":"assetKey","in":"query","schema":{"type":"string"}},{"name":"owner","in":"query","schema":{"type":"string"}},{"name":"taskId","in":"query","schema":{"type":"string"}}],"responses":{"200":{"description":"MarketContext (fields carry value/source/observedAt/fetchedAt/status)","content":{"application/json":{"schema":{"type":"object"}}}}}}},"/v1/events":{"get":{"tags":["public"],"summary":"Market events (earnings, macro, Fed, holidays)","description":"Kinds: MACRO_TIER1 / MACRO_TIER2 / FED_SPEECH / FED_BLACKOUT / EARNINGS / CORPORATE_ACTION / MARKET_HOLIDAY / EARLY_CLOSE. Stable ids, datePrecision exact|day|estimate, revision numbers. Windows are computed by each task from its own conditions, never by the producer.","security":[],"parameters":[{"name":"from","in":"query","schema":{"type":"string","format":"date"}},{"name":"to","in":"query","schema":{"type":"string","format":"date"}},{"name":"underlyingId","in":"query","schema":{"type":"string"}},{"name":"kind","in":"query","schema":{"type":"string","enum":["MACRO_TIER1","MACRO_TIER2","FED_SPEECH","FED_BLACKOUT","EARNINGS","CORPORATE_ACTION","MARKET_HOLIDAY","EARLY_CLOSE"]}}],"responses":{"200":{"description":"{ events: MarketEvent[] }","content":{"application/json":{"schema":{"type":"object"}}}}}}},"/v1/events/{id}/revisions":{"get":{"tags":["public"],"summary":"Revision history of one event","security":[],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"{ eventId, revisions }","content":{"application/json":{"schema":{"type":"object"}}}},"404":{"description":"event_not_found"}}}},"/a2mcp/verify":{"post":{"tags":["a2mcp"],"summary":"Verify once (StockProof)","description":"One-shot verification of a tokenized-stock purchase on X Layer: policy check, reference vs executable price, price impact, market session. Free tier delivers the report inline and auto-publishes a key-less public report (publicUrl, publicBundleUrl). Identical (owner, asset, amount, policy) within 60 s reuses the same job. Input is forgiving: symbols (AAPLx / NVDAx / SPYx / SPCXx / CRCLx / HOODx / GMEx / COINx / MSTRx / SNDKx / INTCx / BMNRx / QQQx / MRVLx / TSLAx / DELLx / MUx / GOOGLx / ORCLx / AMDx / AMZNx / AVGOx / SLVx / ASMLx / MSFTx / METAx / PLTRx / MCDx / TSMx / BRK.Bx / KOx / IWMx / IBMx / MRKx / SMCIx / WMTx / SKHYx / ICEx / MRNAx / RDDTx), 0x addresses or eip155 keys; human amounts (\"100\"); common aliases.\n\nA2MCP transport rule: these endpoints answer HTTP 200 for both delivered results and missing/invalid input (body.status = delivered | input_required; header X-A2MCP-Status mirrors it) and 402 for paid tiers; they never return 4xx for input problems, because the OKX client treats any other status as endpoint_unreachable.","security":[],"requestBody":{"required":false,"content":{"application/json":{"schema":{"type":"object","required":["ownerAddress","outputAssetKey"],"properties":{"ownerAddress":{"type":"string","description":"EVM wallet that will fund the trade (0x…, 40 hex). Aliases: owner, wallet, address"},"recipientAddress":{"type":"string","description":"EVM address that receives the stock token; defaults to ownerAddress"},"inputAssetKey":{"type":"string","description":"Stablecoin to spend: symbol (USDG | USDC | USDT0), 0x address, or eip155:196:<address>. Default USDG"},"outputAssetKey":{"type":"string","description":"Stock token to buy: symbol (AAPLx | NVDAx) or ticker (AAPL | NVDA), 0x address, or eip155:196:<address>. Aliases: stock, token, symbol"},"amount":{"type":"string","description":"Human amount of the stablecoin, e.g. \"100\" (= 100 USDG). Use this OR amountInRaw"},"amountInRaw":{"type":"string","description":"Input amount in the stablecoin's smallest unit (6 decimals: 5 USDG = \"5000000\")"},"policyId":{"type":"string","enum":["STRICT_LIVE","REFERENCE_CONTEXT","QUOTE_ONLY"],"description":"Verification policy; default REFERENCE_CONTEXT (official close as context). STRICT_LIVE requires US regular hours + live reference. No automatic downgrade"},"maxSlippageBps":{"type":"integer","minimum":1,"maximum":300,"description":"Max slippage in basis points (50 = 0.5%); default 50"},"maxPriceImpactBps":{"type":"integer","minimum":1,"maximum":1000,"description":"Optional; default 100"},"maxReferenceDeviationBps":{"type":"integer","minimum":1,"maximum":2000,"description":"Optional; default 300; not used by QUOTE_ONLY"},"clientRequestId":{"type":"string","description":"Optional idempotency key"}}}}}},"responses":{"200":{"description":"Delivered result or input_required envelope (always 200)","content":{"application/json":{"schema":{"type":"object","description":"A2MCP envelope. status=delivered → ok:true and the result fields; status=input_required → ok:false with missingParams / problems / schema / example / howToCall so the caller can collect the parameters.","required":["ok","status"],"properties":{"ok":{"type":"boolean"},"status":{"type":"string","enum":["delivered","input_required","rate_limited"]},"summary":{"type":"string","description":"One-paragraph English summary (URLs are placed at the end of the sentence with no trailing punctuation)"},"missingParams":{"type":"array","items":{"type":"string"}},"problems":{"type":"array","items":{"type":"object","properties":{"field":{"type":"string"},"value":{"type":"string"},"hint":{"type":"string"}}}},"schema":{"type":"object"},"example":{},"howToCall":{"type":"object"}}}}}},"402":{"description":"Paid tier: x402 challenge in the PAYMENT-REQUIRED header"},"429":{"description":"Rate limited (RateLimit-* and Retry-After headers)"}}},"get":{"tags":["a2mcp"],"summary":"Verify once (StockProof) (GET with query string; same body semantics)","security":[],"parameters":[{"name":"*","in":"query","description":"Same fields as the POST body, as query parameters","schema":{"type":"string"}}],"responses":{"200":{"description":"Delivered result or input_required envelope (always 200)","content":{"application/json":{"schema":{"type":"object","description":"A2MCP envelope. status=delivered → ok:true and the result fields; status=input_required → ok:false with missingParams / problems / schema / example / howToCall so the caller can collect the parameters.","required":["ok","status"],"properties":{"ok":{"type":"boolean"},"status":{"type":"string","enum":["delivered","input_required","rate_limited"]},"summary":{"type":"string","description":"One-paragraph English summary (URLs are placed at the end of the sentence with no trailing punctuation)"},"missingParams":{"type":"array","items":{"type":"string"}},"problems":{"type":"array","items":{"type":"object","properties":{"field":{"type":"string"},"value":{"type":"string"},"hint":{"type":"string"}}}},"schema":{"type":"object"},"example":{},"howToCall":{"type":"object"}}}}}},"402":{"description":"Paid tier: x402 challenge in the PAYMENT-REQUIRED header"},"429":{"description":"Rate limited (RateLimit-* and Retry-After headers)"}}}},"/a2mcp/plan":{"post":{"tags":["a2mcp"],"summary":"Plan a trade (candidates, no execution)","description":"Amount ladder × funding asset × three policies → evidence-checked candidates with completion ratio, blocking reasons and next step. Never executes.\n\nA2MCP transport rule: these endpoints answer HTTP 200 for both delivered results and missing/invalid input (body.status = delivered | input_required; header X-A2MCP-Status mirrors it) and 402 for paid tiers; they never return 4xx for input problems, because the OKX client treats any other status as endpoint_unreachable.","security":[],"requestBody":{"required":false,"content":{"application/json":{"schema":{"type":"object","required":["ownerAddress","inputAssetKeys","outputAssetKey","amountInRaw","policyId","maxSlippageBps"],"properties":{"ownerAddress":{"type":"string","description":"EVM address that will fund the trade (0x…, 40 hex)"},"recipientAddress":{"type":"string","description":"Receives the stock token; defaults to ownerAddress"},"inputAssetKeys":{"type":"array","items":{"type":"string"},"description":"Allowed funding stablecoins (eip155:<chainId>:<address>), first one is the budget unit; see GET /v1/assets"},"outputAssetKey":{"type":"string","description":"Stock token to buy (or sell), as eip155:<chainId>:<address>"},"legs":{"type":"array","description":"Optional basket instead of outputAssetKey: [{ outputAssetKey, weightBps }] summing to 10000","items":{"type":"object"}},"amountInRaw":{"type":"string","description":"Total budget in the first input asset's smallest unit"},"side":{"type":"string","enum":["buy","sell"],"description":"Default buy"},"policyId":{"type":"string","enum":["STRICT_LIVE","REFERENCE_CONTEXT","QUOTE_ONLY"]},"maxSlippageBps":{"type":"integer","minimum":1,"maximum":300},"maxPriceImpactBps":{"type":"integer","minimum":1,"maximum":1000},"maxReferenceDeviationBps":{"type":"integer","minimum":1,"maximum":2000},"deadline":{"type":"string","description":"ISO time; default now + 1 h"},"ladderBps":{"type":"array","items":{"type":"integer"},"description":"Optional amount ladder, default [10000,7500,5000,2500,1000]"},"clientRequestId":{"type":"string","description":"Optional idempotency key"}}}}}},"responses":{"200":{"description":"Delivered result or input_required envelope (always 200)","content":{"application/json":{"schema":{"type":"object","description":"A2MCP envelope. status=delivered → ok:true and the result fields; status=input_required → ok:false with missingParams / problems / schema / example / howToCall so the caller can collect the parameters.","required":["ok","status"],"properties":{"ok":{"type":"boolean"},"status":{"type":"string","enum":["delivered","input_required","rate_limited"]},"summary":{"type":"string","description":"One-paragraph English summary (URLs are placed at the end of the sentence with no trailing punctuation)"},"missingParams":{"type":"array","items":{"type":"string"}},"problems":{"type":"array","items":{"type":"object","properties":{"field":{"type":"string"},"value":{"type":"string"},"hint":{"type":"string"}}}},"schema":{"type":"object"},"example":{},"howToCall":{"type":"object"}}}}}},"402":{"description":"Paid tier: x402 challenge in the PAYMENT-REQUIRED header"},"429":{"description":"Rate limited (RateLimit-* and Retry-After headers)"}}},"get":{"tags":["a2mcp"],"summary":"Plan a trade (candidates, no execution) (GET with query string; same body semantics)","security":[],"parameters":[{"name":"*","in":"query","description":"Same fields as the POST body, as query parameters","schema":{"type":"string"}}],"responses":{"200":{"description":"Delivered result or input_required envelope (always 200)","content":{"application/json":{"schema":{"type":"object","description":"A2MCP envelope. status=delivered → ok:true and the result fields; status=input_required → ok:false with missingParams / problems / schema / example / howToCall so the caller can collect the parameters.","required":["ok","status"],"properties":{"ok":{"type":"boolean"},"status":{"type":"string","enum":["delivered","input_required","rate_limited"]},"summary":{"type":"string","description":"One-paragraph English summary (URLs are placed at the end of the sentence with no trailing punctuation)"},"missingParams":{"type":"array","items":{"type":"string"}},"problems":{"type":"array","items":{"type":"object","properties":{"field":{"type":"string"},"value":{"type":"string"},"hint":{"type":"string"}}}},"schema":{"type":"object"},"example":{},"howToCall":{"type":"object"}}}}}},"402":{"description":"Paid tier: x402 challenge in the PAYMENT-REQUIRED header"},"429":{"description":"Rate limited (RateLimit-* and Retry-After headers)"}}}},"/a2mcp/monitor":{"post":{"tags":["a2mcp"],"summary":"Register a signed TradeMandate for monitoring","description":"Same body as POST /v1/mandates. Returns the mandate view and a statusUrl; the id is unguessable.\n\nA2MCP transport rule: these endpoints answer HTTP 200 for both delivered results and missing/invalid input (body.status = delivered | input_required; header X-A2MCP-Status mirrors it) and 402 for paid tiers; they never return 4xx for input problems, because the OKX client treats any other status as endpoint_unreachable.","security":[],"requestBody":{"required":false,"content":{"application/json":{"schema":{"type":"object","description":"Signed TradeMandate registration (see POST /v1/mandates)"}}}},"responses":{"200":{"description":"Delivered result or input_required envelope (always 200)","content":{"application/json":{"schema":{"type":"object","description":"A2MCP envelope. status=delivered → ok:true and the result fields; status=input_required → ok:false with missingParams / problems / schema / example / howToCall so the caller can collect the parameters.","required":["ok","status"],"properties":{"ok":{"type":"boolean"},"status":{"type":"string","enum":["delivered","input_required","rate_limited"]},"summary":{"type":"string","description":"One-paragraph English summary (URLs are placed at the end of the sentence with no trailing punctuation)"},"missingParams":{"type":"array","items":{"type":"string"}},"problems":{"type":"array","items":{"type":"object","properties":{"field":{"type":"string"},"value":{"type":"string"},"hint":{"type":"string"}}}},"schema":{"type":"object"},"example":{},"howToCall":{"type":"object"}}}}}},"402":{"description":"Paid tier: x402 challenge in the PAYMENT-REQUIRED header"},"429":{"description":"Rate limited (RateLimit-* and Retry-After headers)"}}},"get":{"tags":["a2mcp"],"summary":"Register a signed TradeMandate for monitoring (GET with query string; same body semantics)","security":[],"parameters":[{"name":"*","in":"query","description":"Same fields as the POST body, as query parameters","schema":{"type":"string"}}],"responses":{"200":{"description":"Delivered result or input_required envelope (always 200)","content":{"application/json":{"schema":{"type":"object","description":"A2MCP envelope. status=delivered → ok:true and the result fields; status=input_required → ok:false with missingParams / problems / schema / example / howToCall so the caller can collect the parameters.","required":["ok","status"],"properties":{"ok":{"type":"boolean"},"status":{"type":"string","enum":["delivered","input_required","rate_limited"]},"summary":{"type":"string","description":"One-paragraph English summary (URLs are placed at the end of the sentence with no trailing punctuation)"},"missingParams":{"type":"array","items":{"type":"string"}},"problems":{"type":"array","items":{"type":"object","properties":{"field":{"type":"string"},"value":{"type":"string"},"hint":{"type":"string"}}}},"schema":{"type":"object"},"example":{},"howToCall":{"type":"object"}}}}}},"402":{"description":"Paid tier: x402 challenge in the PAYMENT-REQUIRED header"},"429":{"description":"Rate limited (RateLimit-* and Retry-After headers)"}}}},"/a2mcp/monitor/{id}":{"get":{"tags":["a2mcp"],"summary":"Mandate status (unguessable id, no key)","security":[],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"mandate view","content":{"application/json":{"schema":{"type":"object"}}}},"404":{"description":"mandate_not_found"}}}},"/a2mcp/agent-tasks":{"post":{"tags":["a2mcp"],"summary":"Agent Tasks: event impacts + ready-to-submit task drafts","description":"Give an owner wallet and/or a set of stock tokens. Returns event impacts (against holdings and tasks) and task drafts; each taskDrafts[].draft is a complete SIMULATION body for POST /v1/tasks (a dated replay suggestion, when no event is in range, is in taskDrafts[].replay, not in the body). Nothing is executed.\n\nA2MCP transport rule: these endpoints answer HTTP 200 for both delivered results and missing/invalid input (body.status = delivered | input_required; header X-A2MCP-Status mirrors it) and 402 for paid tiers; they never return 4xx for input problems, because the OKX client treats any other status as endpoint_unreachable.","security":[],"requestBody":{"required":false,"content":{"application/json":{"schema":{"type":"object","description":"Give either an owner wallet (impacts are computed against its holdings and tasks) or a set of assets (symbols like AAPLx / NVDAx / AAPL, or eip155 keys).","properties":{"owner":{"type":"string","description":"EVM address (0x…, 40 hex). Optional if `assets` is given."},"assets":{"type":"array","items":{"type":"string"},"description":"Stock tokens to plan for: symbols (AAPLx, NVDA) or eip155:<chainId>:<address>. Optional if `owner` is given. A comma-separated string is accepted too."},"horizonHours":{"type":"integer","minimum":1,"maximum":336,"description":"Event horizon for impacts, default 48"}}}}}},"responses":{"200":{"description":"Delivered result or input_required envelope (always 200)","content":{"application/json":{"schema":{"type":"object","description":"A2MCP envelope. status=delivered → ok:true and the result fields; status=input_required → ok:false with missingParams / problems / schema / example / howToCall so the caller can collect the parameters.","required":["ok","status"],"properties":{"ok":{"type":"boolean"},"status":{"type":"string","enum":["delivered","input_required","rate_limited"]},"summary":{"type":"string","description":"One-paragraph English summary (URLs are placed at the end of the sentence with no trailing punctuation)"},"missingParams":{"type":"array","items":{"type":"string"}},"problems":{"type":"array","items":{"type":"object","properties":{"field":{"type":"string"},"value":{"type":"string"},"hint":{"type":"string"}}}},"schema":{"type":"object"},"example":{},"howToCall":{"type":"object"}}}}}},"402":{"description":"Paid tier: x402 challenge in the PAYMENT-REQUIRED header"},"429":{"description":"Rate limited (RateLimit-* and Retry-After headers)"}}},"get":{"tags":["a2mcp"],"summary":"Agent Tasks: event impacts + ready-to-submit task drafts (GET with query string; same body semantics)","security":[],"parameters":[{"name":"*","in":"query","description":"Same fields as the POST body, as query parameters","schema":{"type":"string"}}],"responses":{"200":{"description":"Delivered result or input_required envelope (always 200)","content":{"application/json":{"schema":{"type":"object","description":"A2MCP envelope. status=delivered → ok:true and the result fields; status=input_required → ok:false with missingParams / problems / schema / example / howToCall so the caller can collect the parameters.","required":["ok","status"],"properties":{"ok":{"type":"boolean"},"status":{"type":"string","enum":["delivered","input_required","rate_limited"]},"summary":{"type":"string","description":"One-paragraph English summary (URLs are placed at the end of the sentence with no trailing punctuation)"},"missingParams":{"type":"array","items":{"type":"string"}},"problems":{"type":"array","items":{"type":"object","properties":{"field":{"type":"string"},"value":{"type":"string"},"hint":{"type":"string"}}}},"schema":{"type":"object"},"example":{},"howToCall":{"type":"object"}}}}}},"402":{"description":"Paid tier: x402 challenge in the PAYMENT-REQUIRED header"},"429":{"description":"Rate limited (RateLimit-* and Retry-After headers)"}}}},"/pub/reports":{"get":{"tags":["public"],"summary":"Public board of voluntarily shared reports","security":[],"responses":{"200":{"description":"{ items }","content":{"application/json":{"schema":{"type":"object"}}}}}}},"/pub/reports/{shareId}":{"get":{"tags":["public"],"summary":"One public report (wallet hidden, amounts per privacy setting)","security":[],"parameters":[{"name":"shareId","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"public report","content":{"application/json":{"schema":{"type":"object"}}}},"404":{"description":"share_not_found (private or unknown)"}}}},"/pub/reports/{shareId}/bundle":{"get":{"tags":["public"],"summary":"Evidence bundle of a public job/mandate report (bundleHash + attestation signature; verify offline with @chaconne/core verifyBundleOffline or the verify-bundle CLI)","security":[],"parameters":[{"name":"shareId","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"EvidenceBundle","content":{"application/json":{"schema":{"type":"object"}}}},"402":{"description":"paid report not settled"},"404":{"description":"share_not_found / bundle_not_available"}}}},"/pub/live":{"get":{"tags":["public"],"summary":"Same as /pub/reports","security":[],"responses":{"200":{"description":"{ items }","content":{"application/json":{"schema":{"type":"object"}}}}}}},"/pub/recaps/{shareId}":{"get":{"tags":["public"],"summary":"Public nightly recap (owner-published)","security":[],"parameters":[{"name":"shareId","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"recap","content":{"application/json":{"schema":{"type":"object"}}}},"404":{"description":"share_not_found"}}}},"/pub/market/xlayer":{"get":{"tags":["public"],"summary":"Public market snapshot for X Layer stock tokens","description":"Served from cached OKX DEX quotes (TTL 60 s).","security":[],"responses":{"200":{"description":"snapshot","content":{"application/json":{"schema":{"type":"object"}}}},"503":{"description":"unavailable"}}}},"/v1/jobs":{"post":{"tags":["keyed"],"summary":"Create a verification job (fixed intent; no payment, no trade permission)","description":"Idempotent per clientRequestId. Body: ownerAddress, recipientAddress?, executionChainId, inputAssetKey, outputAssetKey, amountInRaw, mode=exactIn, policyId, policyVersion, maxSlippageBps, maxPriceImpactBps?, maxReferenceDeviationBps?","security":[{"apiKey":[]}],"responses":{"201":{"description":"job view","content":{"application/json":{"schema":{"type":"object"}}}}}}},"/v1/jobs/{id}":{"get":{"tags":["keyed"],"summary":"Job status","description":"Owner-scoped.","security":[{"apiKey":[]}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object"}}}},"401":{"description":"missing_api_key"},"403":{"description":"invalid_api_key / not the owner"},"404":{"description":"not found (or not visible to this caller)"}},"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}]}},"/v1/jobs/{id}/report":{"get":{"tags":["keyed"],"summary":"Report (x402 paywall when priced)","description":"402 with PAYMENT-REQUIRED until paid; free tier returns the report directly.","security":[{"apiKey":[]}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object"}}}},"401":{"description":"missing_api_key"},"403":{"description":"invalid_api_key / not the owner"},"404":{"description":"not found (or not visible to this caller)"}},"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}]}},"/v1/jobs/{id}/bundle":{"get":{"tags":["keyed"],"summary":"Evidence bundle (owner)","description":"Same bundle as /pub/reports/{shareId}/bundle once the report is shared publicly.","security":[{"apiKey":[]}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object"}}}},"401":{"description":"missing_api_key"},"403":{"description":"invalid_api_key / not the owner"},"404":{"description":"not found (or not visible to this caller)"}},"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}]}},"/v1/tasks":{"post":{"tags":["keyed"],"summary":"Create a task from a playbook","description":"Body: clientRequestId, ownerAddress, playbookId (session_dca | event_aware_accumulate | discount_watch | target_sell | portfolio_rebalance | agent_goal), mode (SIMULATION | LIVE), params { inputAssetKey, outputAssetKey, steps, perStepAmountRaw, ... }, conditions? { version: \"conditions/1\", items }, thesis?. Returns the task with ALL blockers (codes: ASSET_UNSUPPORTED, REGISTRY_MISMATCH, SOURCE_TIME_MISSING, SOURCE_TIME_FUTURE, REFERENCE_MISSING, REFERENCE_STALE, REFERENCE_PROVISIONAL, REFERENCE_DEVIATION_EXCEEDED, …), nextCheckAt, executorPresence, a TradeMandate draft (LIVE) and the thesis card. Task statuses: DRAFT / AWAITING_AUTHORIZATION / ACTIVE / WAITING / STEP_PREPARED / PARTIAL / COMPLETED / PAUSED / REVOKE_PENDING / REVOKED / EXPIRED / CANCELLED.","security":[{"apiKey":[]}],"responses":{"201":{"description":"task view","content":{"application/json":{"schema":{"type":"object"}}}},"400":{"description":"invalid_request / invalid_playbook_params (English message + messageZh)"}}}},"/v1/tasks/{id}":{"get":{"tags":["keyed"],"summary":"Task view (blockers, nextCheckAt, executor presence, mandates, thesis)","description":"Owner-scoped.","security":[{"apiKey":[]}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object"}}}},"401":{"description":"missing_api_key"},"403":{"description":"invalid_api_key / not the owner"},"404":{"description":"not found (or not visible to this caller)"}},"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}]}},"/v1/tasks/{id}/pause":{"post":{"tags":["keyed"],"summary":"pause task","description":"Service-side stop semantics: only blocks new certificates; on-chain revokeMandate is the hard stop.","security":[{"apiKey":[]}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object"}}}},"401":{"description":"missing_api_key"},"403":{"description":"invalid_api_key / not the owner"},"404":{"description":"not found (or not visible to this caller)"}},"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}]}},"/v1/tasks/{id}/resume":{"post":{"tags":["keyed"],"summary":"resume task","description":"Service-side stop semantics: only blocks new certificates; on-chain revokeMandate is the hard stop.","security":[{"apiKey":[]}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object"}}}},"401":{"description":"missing_api_key"},"403":{"description":"invalid_api_key / not the owner"},"404":{"description":"not found (or not visible to this caller)"}},"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}]}},"/v1/tasks/{id}/cancel":{"post":{"tags":["keyed"],"summary":"cancel task","description":"Service-side stop semantics: only blocks new certificates; on-chain revokeMandate is the hard stop.","security":[{"apiKey":[]}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object"}}}},"401":{"description":"missing_api_key"},"403":{"description":"invalid_api_key / not the owner"},"404":{"description":"not found (or not visible to this caller)"}},"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}]}},"/v1/tasks/{id}/authorize":{"post":{"tags":["keyed"],"summary":"authorize task","description":"Submit the signed TradeMandate for a LIVE task.","security":[{"apiKey":[]}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object"}}}},"401":{"description":"missing_api_key"},"403":{"description":"invalid_api_key / not the owner"},"404":{"description":"not found (or not visible to this caller)"}},"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}]}},"/v1/tasks/{id}/prepare-step":{"post":{"tags":["keyed"],"summary":"prepare-step task","description":"200 READY (certificate) or 409 WAIT with all blockers.","security":[{"apiKey":[]}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object"}}}},"401":{"description":"missing_api_key"},"403":{"description":"invalid_api_key / not the owner"},"404":{"description":"not found (or not visible to this caller)"}},"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}]}},"/v1/tasks/{id}/explain-wait":{"get":{"tags":["keyed"],"summary":"Explain why a task waits (GET only; other methods → 405 + Allow)","description":"All blockers with evidence time, nextCheckAt and userActionRequired.","security":[{"apiKey":[]}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object"}}}},"401":{"description":"missing_api_key"},"403":{"description":"invalid_api_key / not the owner"},"404":{"description":"not found (or not visible to this caller)"}},"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}},{"name":"locale","in":"query","schema":{"type":"string","enum":["en","zh"]}}]}},"/v1/tasks/{id}/compare-policies":{"post":{"tags":["keyed"],"summary":"Compare two condition sets on the same evidence snapshot (SIMULATION)","description":"Body: { variants: [{ label, conditions }, { label, conditions }] }.","security":[{"apiKey":[]}],"responses":{"201":{"description":"comparison","content":{"application/json":{"schema":{"type":"object"}}}}},"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}]}},"/v1/replays":{"post":{"tags":["keyed"],"summary":"Decision replay without look-ahead","description":"Body: { playbookId, conditions, assetKey, from, to }. Gaps are reported as gaps; no returns are computed.","security":[{"apiKey":[]}],"responses":{"201":{"description":"replay","content":{"application/json":{"schema":{"type":"object"}}}}}}},"/v1/theses/{id}":{"get":{"tags":["keyed"],"summary":"Thesis card (machine / timing / research premises)","description":"timing premises (session, step gap, event windows) are shown but never invalidate the thesis.","security":[{"apiKey":[]}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object"}}}},"401":{"description":"missing_api_key"},"403":{"description":"invalid_api_key / not the owner"},"404":{"description":"not found (or not visible to this caller)"}},"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}]}},"/v1/event-impacts":{"get":{"tags":["keyed"],"summary":"Event impacts for an owner (events × holdings × tasks)","description":"Query: owner, horizonHours (default 48). Same implementation backs /a2mcp/agent-tasks.eventImpacts.","security":[{"apiKey":[]}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object"}}}},"401":{"description":"missing_api_key"},"403":{"description":"invalid_api_key / not the owner"},"404":{"description":"not found (or not visible to this caller)"}}}}},"x-mcp":{"package":"@chaconne/verify-mcp (workspace package, not on npm)","run":["git clone https://github.com/Bachamht/verify_chaconne && cd verify_chaconne","pnpm install","VERIFY_SERVICE_URL=<service base url> node packages/verify-mcp/bin/chaconne-verify-mcp.mjs   # free read-only tools need no VERIFY_API_KEY; keyed tools report not_available until VERIFY_API_KEY is set"],"freeTools":["get_market_context","list_supported_assets","get_verification_policy","get_events","verify_once_free","plan_free","agent_tasks_free"]}}