{"openapi":"3.1.0","info":{"title":"Charta Visa Agent API","version":"1.0.0","description":"REST surface designed for autonomous agents and AI assistants to file electronic travel-authorization applications (ESTA, US Visitor Visa (B1/B2), UK ETA, Canada eTA). ETIAS: information-only until the official portal opens — eligibility and requirements are served, but quote/checkout/apply answer 422 VISA_NOT_OPEN. Zero CAPTCHAs, deterministic JSON responses, signed webhooks, idempotency keys.","termsOfService":"https://chartavisa.com/legal/terms","contact":{"name":"Charta Visa developer support","url":"https://chartavisa.com/developers","email":"support@chartavisa.com"},"license":{"name":"Proprietary"},"x-origin":[{"format":"openapi","version":"3.1","url":"https://chartavisa.com/api/v1/agent/openapi.json"}],"x-apisguru-categories":["travel"],"x-providerName":"chartavisa.com","x-serviceName":"agent","x-independence-notice":"Charta Visa is an independent private service, not a government website. Government fees are stated separately and paid to the authorities in full."},"externalDocs":{"description":"Developer docs, MCP server, SDKs","url":"https://chartavisa.com/developers"},"servers":[{"url":"https://chartavisa.com"}],"tags":[{"name":"public","description":"Public read endpoints — no key required. Side-effect-free lookups served to any client (browsers included) with CORS `Access-Control-Allow-Origin: *`. Per-IP rate limit: 30 requests/minute."},{"name":"agent","description":"Guest-agent endpoints. Callable without an API key by non-browser clients or with `X-Agent-Friendly: true`; browser-shaped keyless requests receive 404."},{"name":"key-required","description":"Requires a real `Authorization: Bearer cv_agent_…` API key."}],"components":{"securitySchemes":{"apiKey":{"type":"http","scheme":"bearer","bearerFormat":"cv_agent_<64-hex>","description":"API key authentication. Issued at user-account creation."},"agentHeader":{"type":"apiKey","in":"header","name":"X-Agent-Friendly","description":"Set to `true` when calling without an API key (guest mode). Required so the API can distinguish agent traffic from browsers."}},"schemas":{"ErrorResponse":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"},"hint":{"type":"string"}}},"_meta":{"$ref":"#/components/schemas/Meta"}}},"SuccessResponse":{"type":"object","required":["success","data"],"properties":{"success":{"type":"boolean","enum":[true]},"data":{"type":"object","additionalProperties":true},"_meta":{"$ref":"#/components/schemas/Meta"}}},"Meta":{"type":"object","properties":{"service":{"type":"string"},"version":{"type":"string"},"timestamp":{"type":"string","format":"date-time"},"documentation":{"type":"string","format":"uri"}}},"VisaSchemaPreview":{"type":"object","properties":{"id":{"type":"string"},"name":{"type":"string"},"type":{"type":"string"},"destination":{"oneOf":[{"type":"string"},{"type":"array","items":{"type":"string"}}]},"eligible_nationalities":{"oneOf":[{"type":"array","items":{"type":"string"}},{"type":"string","enum":["ALL_EXCEPT_RESTRICTED"]}]},"validity_period":{"type":"string"},"processing_time":{"type":"string"},"pricing":{"type":"object"},"access":{"type":"string","enum":["preview","full"]}}},"CheckoutRequest":{"type":"object","required":["visa_type"],"properties":{"visa_type":{"type":"string","enum":["ESTA","DS160","UK_ETA","CANADA_ETA"],"example":"ESTA","description":"Only products open for applications today; a pre-launch id answers 422 VISA_NOT_OPEN."},"email":{"type":"string","format":"email"},"processing_speed":{"type":"string","enum":["standard","rush","super_rush"],"default":"standard"},"add_ons":{"type":"array","items":{"type":"string"}},"num_travelers":{"type":"integer","minimum":1,"default":1},"currency":{"type":"string","description":"ISO 4217 lowercase, e.g. usd / eur / gbp / jpy / brl / aed / cad. The Stripe session is created in this currency.","default":"usd"}}},"ApplyRequest":{"type":"object","required":["visa_type","payment_session_id"],"properties":{"visa_type":{"type":"string"},"payment_session_id":{"type":"string"},"profile_id":{"type":"string","description":"Optional saved TravelerProfile id; its columnar fields seed the merge, explicit fields win on collision. Authed agents only."},"travelers":{"type":"array","description":"Multi-traveler submission (authed agents only). Length must equal the num_travelers passed to /checkout. Each entry has the same shape as the single-traveler body — including its own profile_id if desired.","items":{"type":"object","properties":{"profile_id":{"type":"string"},"form_data":{"type":"object","additionalProperties":true},"applicant_data":{"type":"object","additionalProperties":true},"contact_info":{"type":"object","additionalProperties":true}}}},"form_data":{"type":"object","additionalProperties":true,"description":"Single-traveler: map of schema field name → value covering every required field for the chosen visa_type. File fields hold the URL returned by /api/v1/agent/documents (must scope to your account/guest_token). Run /api/v1/agent/validate first to dry-run."},"applicant_data":{"type":"object","additionalProperties":true,"description":"Legacy. Merged into form_data when present."},"contact_info":{"type":"object","additionalProperties":true,"description":"Legacy. Merged into form_data when present."}}},"ValidateRequest":{"type":"object","required":["visa_type","form_data"],"properties":{"visa_type":{"type":"string"},"form_data":{"type":"object","additionalProperties":true},"guest_token":{"type":"string","description":"Required for guest agents whose form_data references file URLs."}}},"ValidationErrorDetails":{"type":"object","additionalProperties":{"type":"object","properties":{"code":{"type":"string","enum":["MISSING","INVALID_PATTERN","MIN_LENGTH","MAX_LENGTH","INVALID_FILE_URL","FORBIDDEN_FILE_URL"]},"message":{"type":"string"}}}},"WebhookRegistration":{"type":"object","required":["application_id","callback_url"],"properties":{"application_id":{"type":"string"},"callback_url":{"type":"string","format":"uri"},"events":{"type":"array","items":{"type":"string","enum":["status_change","payment_confirmed","visa_approved","visa_denied"]}}}},"EligibilityRequest":{"type":"object","required":["nationality","destination"],"properties":{"nationality":{"type":"string","minLength":2,"maxLength":2,"example":"US"},"destination":{"type":"string","minLength":2,"maxLength":2,"example":"FR"}}},"ProfileInput":{"type":"object","properties":{"firstName":{"type":"string"},"lastName":{"type":"string"},"dateOfBirth":{"type":"string","format":"date"},"nationality":{"type":"string"},"passportNumber":{"type":"string"},"passportExpiry":{"type":"string","format":"date"},"gender":{"type":"string","enum":["M","F","X"]},"email":{"type":"string","format":"email"},"cityOfBirth":{"type":"string"},"countryOfBirth":{"type":"string"},"passportPhotoUrl":{"type":"string"},"selfieUrl":{"type":"string"}}}}},"security":[{"apiKey":[]},{"agentHeader":[]}],"paths":{"/api/v1/agent/schemas":{"get":{"summary":"List visa products and pricing (preview or full)","description":"No key required. Public read endpoint served to any client (browsers included) with CORS; per-IP rate limit 30/min.","tags":["public"],"security":[],"parameters":[{"name":"payment_session_id","in":"query","schema":{"type":"string"},"required":false}],"responses":{"200":{"description":"List of visa products","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SuccessResponse"}}}}}}},"/api/v1/agent/eligibility":{"post":{"summary":"Decide which visa product applies to a (nationality, destination)","description":"No key required. Public read endpoint served to any client (browsers included) with CORS; per-IP rate limit 30/min.","tags":["public"],"security":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/EligibilityRequest"}}}},"responses":{"200":{"description":"Eligibility result. `required:false` → no Charta Visa product (NOT a visa-free verdict). `required:true` adds `available` + `status` (\"open\" | \"not_open\"): an open product carries pricing.service_fee / total_estimated_usd, next_step = checkout, and links.apply_url; a pre-launch product (available:false, status:\"not_open\", status_note) carries only the announced official_fee (announced:true), service_fee:null, total_estimated_usd:null, no apply_url — nothing can be filed anywhere yet.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SuccessResponse"}}}},"400":{"description":"Validation error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/api/v1/agent/quote":{"post":{"summary":"Side-effect-free pricing preview (no Stripe session, no DB writes)","description":"No key required. Public read endpoint served to any client (browsers included) with CORS; per-IP rate limit 30/min.","tags":["public"],"security":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["visa_type"],"properties":{"visa_type":{"type":"string","enum":["ESTA","DS160","UK_ETA","CANADA_ETA"]},"processing_speed":{"type":"string","enum":["standard","rush","super_rush"]},"add_ons":{"type":"array","items":{"type":"string"}},"num_travelers":{"type":"integer","minimum":1,"maximum":50},"currency":{"type":"string","description":"ISO 4217 lowercase. Defaults to usd."}}}}}},"responses":{"200":{"description":"Pricing breakdown","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SuccessResponse"}}}},"400":{"description":"Validation error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"VISA_NOT_OPEN — the product is pre-launch (ETIAS): information-only, no application can be filed anywhere, no payment is taken. Use POST /eligibility (available:false, status:\"not_open\") and hand the traveler requirements_url / guide_url.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/api/v1/agent/checkout":{"post":{"summary":"Create a Stripe payment session","description":"Key or agent headers required (Authorization: Bearer cv_agent_… OR X-Agent-Friendly: true / non-browser User-Agent). Keyless browser-shaped requests receive 404. Mutating: send an Idempotency-Key.","tags":["agent"],"security":[{"apiKey":[]},{"agentHeader":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CheckoutRequest"}}}},"responses":{"201":{"description":"Payment session created (returns checkout_url + payment_session_id)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SuccessResponse"}}}},"400":{"description":"Validation error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"401":{"description":"Invalid API key","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"VISA_NOT_OPEN — the product is pre-launch (ETIAS): information-only, no application can be filed anywhere, no payment is taken. Use POST /eligibility (available:false, status:\"not_open\") and hand the traveler requirements_url / guide_url.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Rate limited","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/api/v1/agent/apply":{"post":{"summary":"Submit a visa application (after payment)","description":"Key or agent headers required (Authorization: Bearer cv_agent_… OR X-Agent-Friendly: true / non-browser User-Agent). Keyless browser-shaped requests receive 404. Mutating: send an Idempotency-Key.","tags":["agent"],"security":[{"apiKey":[]},{"agentHeader":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApplyRequest"}}}},"responses":{"201":{"description":"Application created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SuccessResponse"}}}},"402":{"description":"Payment session not verified","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Multi-traveler attempted as guest","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"409":{"description":"Idempotency-Key reused with different body","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"VALIDATION_FAILED — form_data failed schema validation (inspect error.details for per-field codes); or VISA_NOT_OPEN — the product is pre-launch and cannot be filed anywhere (see /quote).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/api/v1/agent/validate":{"post":{"summary":"Dry-run schema validation (no payment required, no side effects)","description":"Key or agent headers required (Authorization: Bearer cv_agent_… OR X-Agent-Friendly: true / non-browser User-Agent). Keyless browser-shaped requests receive 404. Mutating: send an Idempotency-Key.","tags":["agent"],"security":[{"apiKey":[]},{"agentHeader":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ValidateRequest"}}}},"responses":{"200":{"description":"Either { ok: true } or { ok: false, errors: [...] }","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SuccessResponse"}}}},"400":{"description":"Validation error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"form_data failed validation; details map per field","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/api/v1/agent/applications/{id}/refund":{"post":{"summary":"Issue a full Stripe refund and mark the application CANCELLED (7-day window)","description":"API key required (Authorization: Bearer cv_agent_…).","tags":["key-required"],"security":[{"apiKey":[]}],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Refunded (or already refunded — idempotent)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SuccessResponse"}}}},"401":{"description":"Auth required","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Application not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"409":{"description":"Already refunded","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"410":{"description":"Refund window expired (>7 days)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Order not in PAID status / no payment intent on file","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"502":{"description":"Stripe refund failed (safe to retry)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/api/v1/agent/applications/{id}":{"patch":{"summary":"Edit a draft application's form data","description":"API key required (Authorization: Bearer cv_agent_…).","tags":["key-required"],"security":[{"apiKey":[]}],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Updated","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SuccessResponse"}}}},"400":{"description":"Validation error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"401":{"description":"Auth required","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Not found / not yours","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"409":{"description":"Already submitted — cannot modify","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}},"delete":{"summary":"Soft-cancel a DRAFT or PAID application (no Stripe refund)","description":"API key required (Authorization: Bearer cv_agent_…).","tags":["key-required"],"security":[{"apiKey":[]}],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Cancelled (or already cancelled — idempotent)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SuccessResponse"}}}},"401":{"description":"Auth required","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Not found / not yours","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"409":{"description":"Already submitted — cannot cancel via API","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/api/v1/agent/status/{id}":{"get":{"summary":"Application status","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}},{"name":"guest_token","in":"query","required":false,"schema":{"type":"string"}}],"responses":{"200":{"description":"Status payload","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SuccessResponse"}}}},"401":{"description":"Auth required","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"410":{"description":"Expired guest session","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/api/v1/agent/summary/{id}":{"get":{"summary":"Plain-language summary","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}},{"name":"guest_token","in":"query","required":false,"schema":{"type":"string"}}],"responses":{"200":{"description":"Summary payload","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SuccessResponse"}}}},"401":{"description":"Auth required","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/api/v1/agent/documents":{"post":{"summary":"Upload a document (multipart or JSON+base64)","description":"Key or agent headers required (Authorization: Bearer cv_agent_… OR X-Agent-Friendly: true / non-browser User-Agent). Keyless browser-shaped requests receive 404. Mutating: send an Idempotency-Key.","tags":["agent"],"security":[{"apiKey":[]},{"agentHeader":[]}],"requestBody":{"required":true,"content":{"multipart/form-data":{"schema":{"type":"object","properties":{"file":{"type":"string","format":"binary"},"appId":{"type":"string"},"guestToken":{"type":"string"},"kind":{"type":"string"}}}},"application/json":{"schema":{"type":"object","required":["filename","mime","base64"],"properties":{"filename":{"type":"string"},"mime":{"type":"string"},"base64":{"type":"string"},"app_id":{"type":"string"},"guest_token":{"type":"string"},"kind":{"type":"string"}}}}}},"responses":{"201":{"description":"Uploaded","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SuccessResponse"}}}},"400":{"description":"Bad request (mime / size / extension)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"401":{"description":"Guest upload missing guest_token","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/api/v1/agent/ocr":{"post":{"summary":"Extract passport data from an image","description":"Key or agent headers required (Authorization: Bearer cv_agent_… OR X-Agent-Friendly: true / non-browser User-Agent). Keyless browser-shaped requests receive 404. Mutating: send an Idempotency-Key.","tags":["agent"],"security":[{"apiKey":[]},{"agentHeader":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["imageBase64"],"properties":{"imageBase64":{"type":"string"}}}}}},"responses":{"200":{"description":"Parsed MRZ + birth-place data","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SuccessResponse"}}}},"400":{"description":"Missing or oversized image","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"OCR could not detect MRZ","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"502":{"description":"Upstream OCR provider failure","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/api/v1/agent/profiles":{"get":{"summary":"List traveler profiles","description":"API key required (Authorization: Bearer cv_agent_…).","tags":["key-required"],"security":[{"apiKey":[]}],"responses":{"200":{"description":"Profile list","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SuccessResponse"}}}},"401":{"description":"Auth required","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}},"post":{"summary":"Create a traveler profile","description":"API key required (Authorization: Bearer cv_agent_…).","tags":["key-required"],"security":[{"apiKey":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProfileInput"}}}},"responses":{"201":{"description":"Created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SuccessResponse"}}}},"400":{"description":"Validation error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"401":{"description":"Auth required","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/api/v1/agent/profiles/{id}":{"get":{"summary":"Fetch one profile","description":"API key required (Authorization: Bearer cv_agent_…).","tags":["key-required"],"security":[{"apiKey":[]}],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Profile","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SuccessResponse"}}}},"401":{"description":"Auth required","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Profile not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}},"patch":{"summary":"Update a profile (partial)","description":"API key required (Authorization: Bearer cv_agent_…).","tags":["key-required"],"security":[{"apiKey":[]}],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Updated","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SuccessResponse"}}}},"401":{"description":"Auth required","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Profile not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}},"delete":{"summary":"Delete a profile and its applications","description":"API key required (Authorization: Bearer cv_agent_…).","tags":["key-required"],"security":[{"apiKey":[]}],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Deleted","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SuccessResponse"}}}},"401":{"description":"Auth required","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Profile not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/api/v1/agent/webhook":{"post":{"summary":"Register a webhook (returns the signing_secret once)","description":"API key required (Authorization: Bearer cv_agent_…).","tags":["key-required"],"security":[{"apiKey":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/WebhookRegistration"}}}},"responses":{"201":{"description":"Webhook registered — signing_secret returned once","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SuccessResponse"}}}},"400":{"description":"Validation error (URL / SSRF / events)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"401":{"description":"Auth required","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Application not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/api/v1/agent/webhooks/{id}/deliveries":{"get":{"summary":"List delivery attempts for a webhook","description":"API key required (Authorization: Bearer cv_agent_…).","tags":["key-required"],"security":[{"apiKey":[]}],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}},{"name":"status","in":"query","required":false,"schema":{"type":"string","enum":["pending","success","failed","exhausted"]}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","default":50}}],"responses":{"200":{"description":"Delivery history","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SuccessResponse"}}}},"401":{"description":"Auth required","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Webhook not found / not yours","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/api/v1/agent/capabilities":{"get":{"summary":"Per-product feature matrix","description":"No key required. Public read endpoint served to any client (browsers included) with CORS; per-IP rate limit 30/min.","tags":["public"],"security":[],"responses":{"200":{"description":"Capabilities","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SuccessResponse"}}}}}}},"/api/v1/agent/me":{"get":{"summary":"Self-introspection for the calling API key (authed only)","description":"API key required (Authorization: Bearer cv_agent_…).","tags":["key-required"],"security":[{"apiKey":[]}],"responses":{"200":{"description":"Key metadata + rate-limit budget","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SuccessResponse"}}}},"401":{"description":"Guest agents have no self","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/api/v1/agent/health":{"get":{"summary":"Liveness + readiness probe (response always 200)","description":"No key required. Public read endpoint served to any client (browsers included) with CORS; per-IP rate limit 30/min.","tags":["public"],"security":[],"responses":{"200":{"description":"Health snapshot","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SuccessResponse"}}}}}}},"/api/v1/agent/changelog":{"get":{"summary":"Newest-first machine-readable changelog","responses":{"200":{"description":"List of releases","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SuccessResponse"}}}}}}}}}