{"openapi":"3.1.0","info":{"title":"Odile Direct","version":"1.0.0","description":"Reach a business that has no API by its phone number: leave a message the business receives by text, or book a time.","x-guidance":"Step 1 (free): GET /a2a/v1/resolve?number=<E.164> returns the business id (biz) and the skills its card lists. Step 2 (paid): POST /a2a/v1/x402/b/{biz} with an A2A JSON-RPC SendMessage whose single part data is {skill:\"take_message\", caller_name, callback_number, need} ($0.10, delivered to the business by text) or {skill:\"book\", slot, caller_name, callback_number} ($0.50 for a confirmed booking). Pay with x402 in USDC on Base or Solana (PAYMENT-SIGNATURE or X-Payment); it settles only after delivery, and failed, refused or unconfirmed tasks are never charged. Keep one messageId per task and reuse it on every retry. Read result.task.status.state: only TASK_STATE_COMPLETED is success. Confirmed book and book_first_available results include booking_id and a private cancel_token. Cancel free at POST /a2a/v1/b/{biz} with data {skill:\"cancel_booking\",booking_id,cancel_token,reason?}; reason is at most 300 characters. It uses no credits or monthly allowance and does not refund the delivered booking fee. The x402 business route also accepts cancellation without payment. An agent with a USDC wallet can buy an answering line without signing in: POST https://api.odilelabs.com/a2a/v1/x402/lines, with the first minute pack paid through x402 (Base or Solana) and the line set up once payment settles. POST /a2a/v1/x402/demo with {site, timezone?} builds a hosted receptionist demo for $0.50 in USDC, valid for 30 days, settling only after a successful build. POST /a2a/v1/x402/audit with {site} returns mobile speed, AI booking access and basic website checks for $0.25 in USDC, settling only after success; reuse the same payment header for either tool to retrieve its stored result for 30 days. POST /a2a/v1/x402/arena with {task, context?} runs a 16-contestant judged knockout bracket on the task and returns the winning answer revised against every attack it survived, for $2.00 in USDC, settling only after a winner exists. POST /a2a/v1/x402/call with {number,business_name,caller_name,callback_number,need,on_behalf_consent:true} makes one informational call for $1.00 per answered call, up to 240 seconds, in USDC on Base only (eip155:8453). No developer account opt-in is needed; consent and all voice safety checks still apply. Payment is verified before dialing and settled only after an answered call; unanswered, voicemail, refused-before-dial and failed calls are never charged. Poll the signed status_url, or include configuration.pushNotificationConfig with a public https url and optional token for the final A2A Task. The callback configuration is bound to the payment too; reuse the same body and payment for the same task. Docs: https://odilelabs.com/a2a. POST /a2a/v1/x402/test-call with {number,scenario,owner_attests:true,language?} tests an AI phone agent for $1.00 per answered call, up to 180 seconds, in USDC on Base only (eip155:8453), amount 1000000, maxTimeoutSeconds 1800. Owner-requested E.164 landline or VoIP only; mobile, unknown, our own lines and permanent stop-list numbers are refused before verification. Caps: 5 tests per number and 20 per wallet per 24 hours, plus the shared voice global daily cap. The caller discloses the automated test first and ends on stop or wrong number. Payment settles once only after a far-end reply; no answer, busy and failed calls are never charged. Poll the signed status_url for {number,scenario,answered,duration_s,transcript,scores,summary,settlement,charged}; scores is [{measure,pass,quote}], or null if scoring fails. Results expire after 30 days. Optional configuration.pushNotificationConfig sends the final A2A Task to a public HTTPS url. Reuse the same payment and body, including callback configuration, for the same job.","contact":{"email":"hello@odilelabs.com","url":"https://odilelabs.com/a2a"}},"servers":[{"url":"https://api.odilelabs.com"}],"paths":{"/a2a/v1/x402/b/{biz}":{"post":{"operationId":"sendToBusiness","summary":"Leave a message for a business or book a time, paid per task with x402","x-payment-info":{"price":{"mode":"dynamic","currency":"USD","min":"0.10","max":"0.50"},"protocols":[{"x402":{}}]},"parameters":[{"name":"biz","in":"path","required":true,"schema":{"type":"string"},"description":"The biz id returned by /a2a/v1/resolve"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["jsonrpc","id","method","params"],"properties":{"jsonrpc":{"const":"2.0"},"id":{"type":["string","integer"]},"method":{"const":"SendMessage"},"params":{"type":"object","required":["message"],"properties":{"message":{"type":"object","required":["messageId","role","parts"],"properties":{"messageId":{"type":"string","description":"One stable id per task, reused on retries"},"role":{"const":"ROLE_USER"},"parts":{"type":"array","minItems":1,"maxItems":1,"items":{"type":"object","required":["data"],"properties":{"mediaType":{"const":"application/json"},"data":{"type":"object","required":["skill"],"properties":{"skill":{"type":"string","enum":["take_message","book","book_first_available","cancel_booking"],"description":"take_message ($0.10 when delivered), book or book_first_available ($0.50 when confirmed); cancel_booking is always free, without payment. Use only skills the business card lists."},"caller_name":{"type":"string","maxLength":100,"description":"Who the message is from or who the booking is for"},"callback_number":{"type":"string","pattern":"^\\+[1-9]\\d{7,14}$","description":"E.164 number the business should call back"},"need":{"type":"string","maxLength":500,"description":"What the caller needs, in a sentence or two"},"slot":{"type":"string","description":"For book: a slot value returned by check_availability"},"booking_id":{"type":"string","pattern":"^[A-Za-z0-9_-]{5,200}$","description":"For cancel_booking: the confirmed booking id."},"cancel_token":{"type":"string","pattern":"^[a-fA-F0-9]{1,200}$","description":"For cancel_booking: the private token returned with the booking id."},"reason":{"type":"string","maxLength":300,"description":"Optional cancellation reason."},"on_behalf_of":{"type":"string","maxLength":100,"description":"The person the agent acts for, when different from caller_name"}}}}}}}}}}}}}}},"responses":{"200":{"description":"A2A JSON-RPC result; success only when result.task.status.state is TASK_STATE_COMPLETED","content":{"application/json":{"schema":{"type":"object","properties":{"jsonrpc":{"const":"2.0"},"id":{},"result":{"type":"object"},"error":{"type":"object"}}}}}},"402":{"description":"Payment Required"}}}},"/a2a/v1/x402/lines":{"post":{"operationId":"setUpAnsweringLine","summary":"Buy an After Hours answering line with a first minute pack paid through x402","x-payment-info":{"price":{"mode":"dynamic","currency":"USD","min":"10.00","max":"50.00"},"protocols":[{"x402":{}}]},"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["business_name","business_phone","owner_mobile","owner_email","pack","owner_confirmed_terms"],"properties":{"business_name":{"type":"string","minLength":1,"maxLength":120,"description":"The business name callers should hear."},"business_phone":{"type":"string","maxLength":40,"description":"The existing US business number, with area code."},"owner_mobile":{"type":"string","maxLength":40,"description":"The owner's own US mobile number, with area code."},"owner_email":{"type":"string","format":"email","description":"Receives the number and forwarding codes, and signs in at https://odilelabs.com/owner."},"description":{"type":"string","maxLength":300},"city":{"type":"string","maxLength":80},"services":{"type":"array","maxItems":12,"items":{"type":"string","maxLength":80}},"hours":{"type":"object","additionalProperties":{"anyOf":[{"type":"object","required":["open","close"],"properties":{"open":{"type":"string","maxLength":12},"close":{"type":"string","maxLength":12}}},{"const":"closed"}]},"description":"Opening hours by day name; omitted days are closed. Omit hours for Monday to Friday, 9 to 5."},"languages":{"type":"array","maxItems":6,"items":{"type":"string","enum":["es","pt","fr","tr","ru","de"]}},"extra":{"type":"string","maxLength":600},"pack":{"type":"string","enum":["min40","min200"]},"country":{"type":"string","enum":["US"]},"owner_confirmed_terms":{"type":"boolean","const":true,"description":"True only after showing the owner https://odilelabs.com/terms and receiving their agreement."}}}}}},"responses":{"200":{"description":"Paid answering line, active or being built","content":{"application/json":{"schema":{"type":"object","required":["setup_id","business_id","status","business_name","pack","minutes","price_cents","settlement","manage"],"properties":{"setup_id":{"type":"string"},"business_id":{"type":"string"},"status":{"type":"string","enum":["active","building"]},"business_name":{"type":"string"},"pack":{"type":"string","enum":["min40","min200"]},"minutes":{"type":"integer"},"price_cents":{"type":"integer"},"number":{"type":["string","null"]},"forwarding":{"type":["array","null"],"items":{"type":"object","properties":{"carrier":{"type":"string"},"note":{"type":["string","null"]},"codes":{"type":"array","items":{"type":"object","properties":{"what":{"type":"string"},"dial":{"type":"string"},"stop":{"type":"string"}}}}}}},"settlement":{"type":"object","required":["network","transaction"],"properties":{"network":{"type":"string"},"transaction":{"type":"string"}}},"manage":{"type":"string"}}}}}},"202":{"description":"Settlement or line activation pending; retry the same body and payment header"},"400":{"description":"Invalid line input, or stripe_checkout_required for out50/out200: sign in at https://odilelabs.com/developers and POST /v1/lines with an API key for Stripe checkout. Outcome packs are not sold through x402; no payment is verified or settled."},"402":{"description":"Payment Required"},"409":{"description":"Payment was already bound to a different request"}}}},"/a2a/v1/x402/demo":{"post":{"operationId":"buildReceptionistDemo","summary":"Build a receptionist demo from a business website","x-payment-info":{"price":{"mode":"fixed","currency":"USD","amount":"0.50"},"protocols":[{"x402":{}}]},"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"required":["site"],"properties":{"site":{"type":"string","format":"uri","maxLength":200,"description":"A public http or https business website."},"timezone":{"type":"string","maxLength":80,"default":"America/New_York","description":"IANA timezone for the receptionist."}}}}}},"responses":{"200":{"description":"Completed result; settlement is null if payment could not be confirmed. Replay the same payment for the stored result for 30 days.","headers":{"PAYMENT-RESPONSE":{"description":"Base64 x402 settlement receipt when confirmed.","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"type":"object","required":["demo_url","business_name","language","area","services","expires_at","settlement"],"properties":{"demo_url":{"type":"string","format":"uri"},"business_name":{"type":"string"},"language":{"type":"string"},"area":{"type":["string","null"]},"services":{"type":["string","null"]},"expires_at":{"type":"string","format":"date-time"},"settlement":{"type":["object","null"],"required":["network","transaction"],"properties":{"network":{"type":"string"},"transaction":{"type":"string"}}}}}}}},"202":{"description":"Build in progress; retry the same body and payment header."},"400":{"description":"Invalid input; nothing charged."},"402":{"description":"Payment Required"},"404":{"description":"Tool unavailable."},"409":{"description":"Payment bound to another request or verification pending."},"410":{"description":"Stored result expired after 30 days."},"413":{"description":"Body exceeds 4 KB."},"422":{"description":"Website could not be read; nothing charged."},"429":{"description":"IP rate limit reached."}}}},"/a2a/v1/x402/audit":{"post":{"operationId":"auditWebsite","summary":"Audit mobile speed, AI booking access and website basics","x-payment-info":{"price":{"mode":"fixed","currency":"USD","amount":"0.25"},"protocols":[{"x402":{}}]},"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"required":["site"],"properties":{"site":{"type":"string","format":"uri","maxLength":200,"description":"A public http or https business website."}}}}}},"responses":{"200":{"description":"Completed result; settlement is null if payment could not be confirmed. Replay the same payment for the stored result for 30 days.","headers":{"PAYMENT-RESPONSE":{"description":"Base64 x402 settlement receipt when confirmed.","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"type":"object","required":["site","checked_at","mobile_speed","ai_booking","basics","fixes","settlement"],"properties":{"site":{"type":"string","format":"uri"},"checked_at":{"type":"string","format":"date-time"},"mobile_speed":{"type":["object","null"],"required":["score","lcp_seconds"],"properties":{"score":{"type":"integer","minimum":0,"maximum":100},"lcp_seconds":{"type":["number","null"],"minimum":0}}},"ai_booking":{"type":"string","enum":["online_booking","request_form","phone_only"]},"basics":{"type":"object","required":["https","title","meta_description","structured_data","llms_txt","tel_link"],"properties":{"https":{"type":"boolean"},"title":{"type":"boolean"},"meta_description":{"type":"boolean"},"structured_data":{"type":"boolean"},"llms_txt":{"type":"boolean"},"tel_link":{"type":"boolean"}}},"fixes":{"type":"array","maxItems":6,"items":{"type":"string"}},"settlement":{"type":["object","null"],"required":["network","transaction"],"properties":{"network":{"type":"string"},"transaction":{"type":"string"}}}}}}}},"202":{"description":"Build in progress; retry the same body and payment header."},"400":{"description":"Invalid input; nothing charged."},"402":{"description":"Payment Required"},"404":{"description":"Tool unavailable."},"409":{"description":"Payment bound to another request or verification pending."},"410":{"description":"Stored result expired after 30 days."},"413":{"description":"Body exceeds 4 KB."},"422":{"description":"Website could not be read; nothing charged."},"429":{"description":"IP rate limit reached."}}}},"/a2a/v1/x402/arena":{"post":{"operationId":"runArena","summary":"Run a 16-contestant judged bracket on a task and return the surviving answer","x-payment-info":{"price":{"mode":"fixed","currency":"USD","amount":"2.00"},"protocols":[{"x402":{}}]},"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"required":["task"],"properties":{"task":{"type":"string","minLength":10,"maxLength":4000,"description":"The question or job, word for word as you want it answered."},"context":{"type":"string","maxLength":8000,"description":"Optional facts, drafts or constraints the contestants should use."}}}}}},"responses":{"200":{"description":"Completed result; settlement is null if payment could not be confirmed. Replay the same payment for the stored result for 30 days.","headers":{"PAYMENT-RESPONSE":{"description":"Base64 x402 settlement receipt when confirmed.","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"type":"object","required":["answer","bracket_winner","approach","attacks_survived","contestants","rounds","model","settlement"],"properties":{"answer":{"type":"string","description":"The bracket winner revised against every attack it survived."},"bracket_winner":{"type":"string"},"approach":{"type":"string"},"attacks_survived":{"type":"array","items":{"type":"string"}},"contestants":{"type":"integer","minimum":2,"maximum":16},"rounds":{"type":"integer","minimum":1},"model":{"type":"string"},"settlement":{"type":["object","null"],"required":["network","transaction"],"properties":{"network":{"type":"string"},"transaction":{"type":"string"}}}}}}}},"202":{"description":"Build in progress; retry the same body and payment header."},"400":{"description":"Invalid input; nothing charged."},"402":{"description":"Payment Required"},"404":{"description":"Tool unavailable."},"409":{"description":"Payment bound to another request or verification pending."},"410":{"description":"Stored result expired after 30 days."},"413":{"description":"Body exceeds 16 KB."},"422":{"description":"The bracket could not finish; nothing charged."},"429":{"description":"IP rate limit reached."}}}},"/a2a/v1/x402/test-call":{"post":{"operationId":"testPhoneAgent","summary":"Test an AI phone agent with a scored scenario, $1.00 per answered call","description":"POST /a2a/v1/x402/test-call with {number,scenario,owner_attests:true,language?} tests an AI phone agent for $1.00 per answered call, up to 180 seconds, in USDC on Base only (eip155:8453), amount 1000000, maxTimeoutSeconds 1800. Owner-requested E.164 landline or VoIP only; mobile, unknown, our own lines and permanent stop-list numbers are refused before verification. Caps: 5 tests per number and 20 per wallet per 24 hours, plus the shared voice global daily cap. The caller discloses the automated test first and ends on stop or wrong number. Payment settles once only after a far-end reply; no answer, busy and failed calls are never charged. Poll the signed status_url for {number,scenario,answered,duration_s,transcript,scores,summary,settlement,charged}; scores is [{measure,pass,quote}], or null if scoring fails. Results expire after 30 days. Optional configuration.pushNotificationConfig sends the final A2A Task to a public HTTPS url. Reuse the same payment and body, including callback configuration, for the same job.","x-payment-info":{"price":{"mode":"fixed","currency":"USD","amount":"1.00"},"protocols":[{"x402":{}}]},"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"required":["number","scenario","owner_attests"],"properties":{"number":{"type":"string","pattern":"^\\+[1-9]\\d{6,14}$","description":"E.164 line owned by the person requesting this test. Twilio Lookup must confirm landline, fixedVoip or nonFixedVoip; mobile and unknown are refused."},"scenario":{"type":"string","enum":["emergency","booking","price","disclosure","spanish","chinese","vietnamese","filipino","arabic","polish","unavailable","cancel","handoff","interrupt"]},"owner_attests":{"type":"boolean","const":true,"description":"True only when the owner of this line requested the automated test call."},"language":{"type":"string","enum":["spanish","chinese","vietnamese","filipino","arabic","polish","es","zh","vi","tl","ar","pl"],"description":"Optional name or code matching the selected language scenario."},"configuration":{"type":"object","additionalProperties":false,"properties":{"pushNotificationConfig":{"type":"object","additionalProperties":false,"required":["url"],"properties":{"url":{"type":"string","format":"uri","pattern":"^https://","maxLength":500,"description":"Public HTTPS URL for the final A2A Task; redirects and private hosts are refused."},"token":{"type":"string","minLength":1,"maxLength":256,"pattern":"^[^\\x00-\\x1f\\x7f]+$","description":"Optional token returned in X-A2A-Notification-Token. authentication is not supported."}}}},"description":"Optional A2A push configuration. It is bound to this payment with the call data; reuse the same configuration on retries."}}}}}},"responses":{"202":{"description":"Test accepted; poll the signed status_url or receive the configured push for the scored result and settlement.","content":{"application/json":{"schema":{"type":"object","required":["result"],"properties":{"result":{"type":"object","required":["task"],"properties":{"task":{"type":"object","required":["id","status","artifacts"],"properties":{"id":{"type":"string"},"status":{"type":"object","required":["state"],"properties":{"state":{"const":"TASK_STATE_WORKING"}}},"artifacts":{"type":"array","minItems":1,"items":{"type":"object","required":["parts"],"properties":{"parts":{"type":"array","minItems":1,"items":{"type":"object","required":["data"],"properties":{"data":{"type":"object","required":["status_url"],"properties":{"status_url":{"type":"string","format":"uri","description":"Signed URL to poll for the final result and settlement. Keep it private."}}}}}}}}}}}}}}}}}},"400":{"description":"Invalid test data or owner attestation; nothing charged."},"402":{"description":"Payment Required; Base USDC only."},"404":{"description":"Test calls unavailable."},"409":{"description":"Payment bound to another request or verification pending."},"413":{"description":"Body exceeds 8 KB."},"422":{"description":"Line safety checks or caps refused the test; nothing charged."},"429":{"description":"IP rate limit reached."}}}},"/a2a/v1/x402/call":{"post":{"operationId":"callBusiness","summary":"Make one informational business call for $1.00 per answered call, up to 240 seconds","description":"USDC on Base only (eip155:8453), amount 1000000, maxTimeoutSeconds 1800. Payment is verified before dialing and settled only after an answered call, capped at 240 seconds. Unanswered, voicemail, refused-before-dial and failed calls are never charged. Requires human consent; US/Canada landlines or verified SIP claims, weekdays 09:00–17:00 local, one call per number per 24 hours, per-wallet daily cap (default three) and global daily cap. Informational only, AI disclosure first, permanent opt-out. No developer account opt-in is needed. Poll the signed status_url or supply configuration.pushNotificationConfig with a public HTTPS url and optional token for the final A2A Task. Call data and callback configuration are bound to the payment; reuse the same payment and body to retrieve the same task without another call or changing its callback.","x-payment-info":{"price":{"mode":"fixed","currency":"USD","amount":"1.00"},"protocols":[{"x402":{}}]},"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"required":["number","business_name","caller_name","callback_number","need","on_behalf_consent"],"properties":{"skill":{"type":"string","const":"call_business"},"number":{"type":"string","pattern":"^\\+[1-9]\\d{6,14}$","description":"E.164 business number: US/Canada landline, or a verified SIP claim."},"business_name":{"type":"string","minLength":1,"maxLength":120},"caller_name":{"type":"string","minLength":1,"maxLength":100},"callback_number":{"type":"string","pattern":"^\\+[1-9]\\d{6,14}$","description":"Callable E.164 US/Canada callback number, different from the business number."},"need":{"type":"string","minLength":1,"maxLength":500,"description":"An informational request; no sales, payment or account access."},"on_behalf_consent":{"type":"boolean","const":true,"description":"True only after the named human agrees to this call on their behalf."},"configuration":{"type":"object","additionalProperties":false,"properties":{"pushNotificationConfig":{"type":"object","additionalProperties":false,"required":["url"],"properties":{"url":{"type":"string","format":"uri","pattern":"^https://","maxLength":500,"description":"Public HTTPS URL for the final A2A Task; redirects and private hosts are refused."},"token":{"type":"string","minLength":1,"maxLength":256,"pattern":"^[^\\x00-\\x1f\\x7f]+$","description":"Optional token returned in X-A2A-Notification-Token. authentication is not supported."}}}},"description":"Optional A2A push configuration. It is bound to this payment with the call data; reuse the same configuration on retries."}}}}}},"responses":{"202":{"description":"Call accepted; TASK_STATE_WORKING with a signed status_url. The final task contains charged and settlement.","content":{"application/json":{"schema":{"type":"object","required":["result"],"properties":{"result":{"type":"object","required":["task"],"properties":{"task":{"type":"object","required":["id","status","artifacts"],"properties":{"id":{"type":"string"},"status":{"type":"object","required":["state"],"properties":{"state":{"const":"TASK_STATE_WORKING"}}},"artifacts":{"type":"array","minItems":1,"items":{"type":"object","required":["parts"],"properties":{"parts":{"type":"array","minItems":1,"items":{"type":"object","required":["data"],"properties":{"data":{"type":"object","required":["status_url"],"properties":{"status_url":{"type":"string","format":"uri","description":"Signed URL to poll for the final result and settlement. Keep it private."}}}}}}}}}}}}}}}}}},"400":{"description":"Invalid call data; nothing charged."},"402":{"description":"Payment Required; Base USDC only."},"404":{"description":"Wallet calls or voice pilot unavailable."},"409":{"description":"Payment bound to another request or verification pending."},"413":{"description":"Body exceeds 8 KB."},"422":{"description":"TASK_STATE_REJECTED: voice safety checks refused the call; nothing charged."}}}},"/a2a/v1/b/{biz}/holds":{"post":{"operationId":"holdBusinessSlot","summary":"Pay a non-refundable fee to hold a bookable slot","parameters":[{"name":"biz","in":"path","required":true,"schema":{"type":"string"}}],"description":"The hold lasts 30 minutes when configured; pass hold_id to Direct or MCP booking.","x-payment-info":{"price":{"mode":"fixed","currency":"USD","amount":"0.050000"},"protocols":[{"x402":{}}]},"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"required":["start"],"properties":{"start":{"type":"string","format":"date-time","description":"ISO 8601 timestamp with timezone and whole-minute precision."},"service":{"type":"string","maxLength":120}}}}}},"responses":{"201":{"description":"Hold created. Pass hold_id to the Direct or MCP booking before expires_at; the fee is non-refundable.","content":{"application/json":{"schema":{"type":"object","properties":{"hold_id":{"type":"string"},"business_id":{"type":"string"},"start":{"type":"string","format":"date-time"},"expires_at":{"type":"string","format":"date-time"},"book_with":{"type":"string"},"fee":{"const":"non-refundable"}}}}}},"400":{"description":"Invalid start or service."},"402":{"description":"Payment Required; x402 v2, USDC on Base (eip155:8453), accepts amount 50000 in USDC base units."},"409":{"description":"Slot on hold or otherwise unavailable."},"503":{"description":"Hold, payment or calendar service unavailable."}}}},"/a2a/v1/b/{biz}/reputation":{"get":{"operationId":"getBusinessReputation","summary":"Read 90-day business outcome counts","parameters":[{"name":"biz","in":"path","required":true,"schema":{"type":"string"}}],"x-payment-info":{"price":{"mode":"fixed","currency":"USD","amount":"0.020000"},"protocols":[{"x402":{}}]},"responses":{"200":{"description":"Counts after payment, or insufficient_data and events free when the record is thin. Opted-out businesses return 404.","content":{"application/json":{"schema":{"type":"object","properties":{"business_id":{"type":"string"},"computed_at":{"type":"string","format":"date-time"},"window_days":{"type":"integer"},"insufficient_data":{"type":"boolean"},"events":{"type":"integer"},"verified":{"type":["object","null"],"properties":{"level":{"type":"integer"},"since":{"type":["string","null"]}}},"direct":{"type":"object","properties":{"tasks":{"type":"integer"},"delivered":{"type":["integer","null"]},"bookings":{"type":["integer","null"]},"refused":{"type":"integer"},"owner_reply_rate":{"type":["number","null"]},"owner_reply_median_minutes":{"type":["number","null"]}}},"agent_ops":{"type":["object","null"],"properties":{"runs":{"type":"integer"},"pass_rate":{"type":["number","null"]},"last_run":{"type":"string","format":"date-time"}}}}}}}},"402":{"description":"Payment Required; x402 v2, USDC on Base (eip155:8453), accepts amount 20000 in USDC base units."},"404":{"description":"Business not found or opted out."},"503":{"description":"Payment service unavailable."}}}},"/a2a/v1/verify/{number}":{"get":{"operationId":"verifyBusinessNumber","summary":"Read a Verified business attestation and its anchor proof","parameters":[{"name":"number","in":"path","required":true,"schema":{"type":"string"}}],"x-payment-info":{"price":{"mode":"fixed","currency":"USD","amount":"0.020000"},"protocols":[{"x402":{}}]},"responses":{"200":{"description":"Verified attestation with proof, possibly pending; negative results are free.","content":{"application/json":{"schema":{"type":"object","properties":{"number":{"type":"string"},"verified":{"type":"boolean"},"level":{"type":"integer"},"since":{"type":"string"},"attestation":{"type":"object"},"leaf":{"type":"string"},"day":{"type":"string","format":"date"},"root":{"type":"string"},"path":{"type":"array","items":{"type":"object","properties":{"sibling":{"type":"string"},"side":{"type":"string","enum":["L","R"]}}}},"root_signature":{"type":"string"},"kid":{"type":"string"},"anchor":{"type":["object","null"]},"pending":{"type":"boolean"},"closes_at":{"type":"string","format":"date-time"}}}}}},"400":{"description":"A valid E.164 number is required."},"402":{"description":"Payment Required; x402 v2, USDC on Base (eip155:8453), accepts amount 20000 in USDC base units."},"503":{"description":"Attestation, proof or payment unavailable."}}}},"/a2a/v1/receipts/{id}/proof":{"get":{"operationId":"getReceiptProof","summary":"Read a receipt Merkle proof","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}},{"name":"claim_id","in":"query","schema":{"type":"string"}},{"name":"token","in":"query","schema":{"type":"string"},"description":"Managed claim token."}],"x-payment-info":{"price":{"mode":"fixed","currency":"USD","amount":"0.010000"},"protocols":[{"x402":{}}]},"responses":{"200":{"description":"Proof after payment; the owner reads it free. Before the day closes, pending status is free.","content":{"application/json":{"schema":{"type":"object","properties":{"task_id":{"type":"string"},"kind":{"const":"receipt"},"keys":{"type":"string"},"leaf":{"type":"string"},"day":{"type":"string","format":"date"},"root":{"type":"string"},"path":{"type":"array","items":{"type":"object","properties":{"sibling":{"type":"string"},"side":{"type":"string","enum":["L","R"]}}}},"root_signature":{"type":"string"},"kid":{"type":"string"},"anchor":{"type":["object","null"]},"pending":{"type":"boolean"},"closes_at":{"type":"string","format":"date-time"}}}}}},"402":{"description":"Payment Required; x402 v2, USDC on Base (eip155:8453), accepts amount 10000 in USDC base units."},"404":{"description":"Receipt not found."},"503":{"description":"Proof or payment unavailable."}}}},"/a2a/v1/anchors/{day}":{"get":{"operationId":"getDailyAnchor","summary":"Read a free signed daily Merkle root","parameters":[{"name":"day","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Public root, closed after the day ends at 06:00 UTC; leaves are private.","content":{"application/json":{"schema":{"type":"object","properties":{"day":{"type":"string","format":"date"},"root":{"type":["string","null"]},"count":{"type":"integer"},"root_signature":{"type":"string"},"kid":{"type":"string"},"closed_at":{"type":"string","format":"date-time"},"chain":{"type":["object","null"]}}}}}},"404":{"description":"Invalid day or root not yet available."}}}}}}