{"openapi":"3.1.0","info":{"title":"Wabi API","version":"1","summary":"The operating platform for WhatsApp Business","description":"Wabi runs your WhatsApp Business Account on Meta's Cloud API: managed webhooks, a live team inbox, localized templates, AI support agents with traces, and usage and cost analytics, from the dashboard, the REST API, MCP or the CLI. Bring your own WABA, pay Meta at cost.\n\nEvery op is POST /api/v1/{op} with its input as a JSON body. The same ops are MCP tools at https://getwabi.dev/api/mcp and CLI commands (npx @meterapp/wabi). Errors are RFC 9457 problem details; see https://getwabi.dev/docs/errors.","contact":{"name":"Meter","email":"jonathan@getwabi.dev","url":"https://getwabi.dev/docs"}},"servers":[{"url":"https://getwabi.dev"}],"externalDocs":{"description":"API reference","url":"https://getwabi.dev/docs/api"},"security":[{"bearerAuth":[]}],"tags":[{"name":"meta","description":"The API catalog."},{"name":"sandbox","description":"Sandbox: The simulated number every organization gets, for trying everything before Meta."},{"name":"accounts","description":"WhatsApp accounts: Connect WhatsApp Business Accounts and phone numbers, check their health."},{"name":"messages","description":"Messages: Send text, media and templates; read the delivery timeline."},{"name":"conversations","description":"Conversations: The inbox: assignment, turn state, notes and resolution."},{"name":"contacts","description":"Contacts: Profiles, custom attributes, consent and opt-outs."},{"name":"segments","description":"Segments: Rule-based groups of contacts."},{"name":"templates","description":"Templates: Template groups, AI localization and Meta approval status."},{"name":"campaigns","description":"Bulk sends: Send an approved template to a segment with every safeguard."},{"name":"flows","description":"Flows: Send a published WhatsApp Flow and read its submissions."},{"name":"agents","description":"AI agents: Agents, versions, sessions and traces."},{"name":"knowledge","description":"Knowledge: The sources an agent answers from."},{"name":"webhooks","description":"Webhooks: Customer webhook endpoints and their delivery log."},{"name":"events","description":"Events: The organization's event stream."},{"name":"usage","description":"Usage and costs: Messages, AI replies and estimated Meta costs."},{"name":"organization","description":"Organization: Settings, onboarding and the activity log."},{"name":"members","description":"Members and sharing: Members, teams, resource sharing and the audit log."},{"name":"keys","description":"API keys: Organization keys for your backend, the CLI, MCP and CI."},{"name":"billing","description":"Billing: Plans, prices, checkout links, the budget cap and the subscription."},{"name":"profile","description":"Profile: Your own name and email preferences."},{"name":"feedback","description":"Feedback: Request features, report issues and upvote what matters to you."}],"paths":{"/api/v1":{"get":{"operationId":"list_ops","summary":"List every op","description":"The machine-readable catalog of every op with its input JSON Schema. Public; needs no credential.","tags":["meta"],"security":[],"responses":{"200":{"description":"The op catalog.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/OpsManifest"}}}}}}},"/api/v1/get_organization":{"post":{"operationId":"get_organization","summary":"Get organization","description":"The organization this credential acts in: id, slug, name, default timezone and language (used by the inbox, reports and AI agents), and the caller's role. Call first to orient yourself; get_account adds the plan and usage.","tags":["organization"],"x-read-only":true,"x-admin-only":false,"x-min-role":"viewer","x-scope":"organization:read","requestBody":{"required":false,"content":{"application/json":{"schema":{"type":"object","properties":{}}}}},"responses":{"200":{"description":"The op's output.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"400":{"description":"Invalid JSON or input that fails the schema (invalid_json, invalid_input).","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"401":{"description":"Missing or invalid credential (unauthorized, invalid_key, invalid_token).","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"402":{"description":"Payment failed or a plan limit was reached; carries checkout_url and the paid plans.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"403":{"description":"The credential's role or scopes do not allow the op, or no organization is available (forbidden, scope_missing, no_organization).","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"404":{"description":"Unknown op or record (unknown_op, not_found).","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"409":{"description":"The request conflicts with the current state.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"422":{"description":"The input is well-formed but cannot be applied.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"429":{"description":"Rate limited. Retry after Retry-After seconds.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"500":{"description":"Internal error. Retry and quote request_id.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}},"get":{"operationId":"get_organization_get","summary":"Get organization (GET)","description":"Read-only ops also answer GET with the input as URL-encoded JSON in ?input=. The organization this credential acts in: id, slug, name, default timezone and language (used by the inbox, reports and AI agents), and the caller's role. Call first to orient yourself; get_account adds the plan and usage.","tags":["organization"],"parameters":[{"name":"input","in":"query","required":false,"description":"The op's input as URL-encoded JSON.","schema":{"type":"string"}}],"responses":{"200":{"description":"The op's output.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"400":{"description":"Invalid JSON or input that fails the schema (invalid_json, invalid_input).","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"401":{"description":"Missing or invalid credential (unauthorized, invalid_key, invalid_token).","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"402":{"description":"Payment failed or a plan limit was reached; carries checkout_url and the paid plans.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"403":{"description":"The credential's role or scopes do not allow the op, or no organization is available (forbidden, scope_missing, no_organization).","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"404":{"description":"Unknown op or record (unknown_op, not_found).","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"409":{"description":"The request conflicts with the current state.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"422":{"description":"The input is well-formed but cannot be applied.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"429":{"description":"Rate limited. Retry after Retry-After seconds.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"500":{"description":"Internal error. Retry and quote request_id.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}}},"/api/v1/update_organization":{"post":{"operationId":"update_organization","summary":"Update organization","description":"Change the organization's name, default timezone (IANA, e.g. Europe/Madrid: business hours, reports, quiet hours) or default language (BCP 47: AI agent replies and template fallbacks when a contact has none). Owners and admins.","tags":["organization"],"x-read-only":false,"x-admin-only":true,"x-min-role":"admin","x-scope":"organization:write","requestBody":{"required":false,"content":{"application/json":{"schema":{"type":"object","properties":{"name":{"type":"string","minLength":1,"maxLength":100},"timezone":{"type":"string","maxLength":64},"default_locale":{"type":"string","minLength":2,"maxLength":35}}}}}},"responses":{"200":{"description":"The op's output.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"400":{"description":"Invalid JSON or input that fails the schema (invalid_json, invalid_input).","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"401":{"description":"Missing or invalid credential (unauthorized, invalid_key, invalid_token).","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"402":{"description":"Payment failed or a plan limit was reached; carries checkout_url and the paid plans.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"403":{"description":"The credential's role or scopes do not allow the op, or no organization is available (forbidden, scope_missing, no_organization).","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"404":{"description":"Unknown op or record (unknown_op, not_found).","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"409":{"description":"The request conflicts with the current state.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"422":{"description":"The input is well-formed but cannot be applied.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"429":{"description":"Rate limited. Retry after Retry-After seconds.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"500":{"description":"Internal error. Retry and quote request_id.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}}},"/api/v1/list_activity":{"post":{"operationId":"list_activity","summary":"List activity","description":"Every change made through the platform, newest first: who (a person, an API key, an AI agent, a worker), from which surface (dashboard, api, mcp, cli, worker, ai) and what. The audit log (list_audit_log) has the sensitive changes with their details.","tags":["organization"],"x-read-only":true,"x-admin-only":false,"x-min-role":"viewer","x-scope":"organization:read","requestBody":{"required":false,"content":{"application/json":{"schema":{"type":"object","properties":{"limit":{"default":50,"description":"Page size, at most 200.","type":"integer","minimum":1,"maximum":200},"offset":{"default":0,"type":"integer","minimum":0,"maximum":9007199254740991}}}}}},"responses":{"200":{"description":"The op's output.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"400":{"description":"Invalid JSON or input that fails the schema (invalid_json, invalid_input).","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"401":{"description":"Missing or invalid credential (unauthorized, invalid_key, invalid_token).","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"402":{"description":"Payment failed or a plan limit was reached; carries checkout_url and the paid plans.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"403":{"description":"The credential's role or scopes do not allow the op, or no organization is available (forbidden, scope_missing, no_organization).","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"404":{"description":"Unknown op or record (unknown_op, not_found).","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"409":{"description":"The request conflicts with the current state.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"422":{"description":"The input is well-formed but cannot be applied.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"429":{"description":"Rate limited. Retry after Retry-After seconds.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"500":{"description":"Internal error. Retry and quote request_id.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}},"get":{"operationId":"list_activity_get","summary":"List activity (GET)","description":"Read-only ops also answer GET with the input as URL-encoded JSON in ?input=. Every change made through the platform, newest first: who (a person, an API key, an AI agent, a worker), from which surface (dashboard, api, mcp, cli, worker, ai) and what. The audit log (list_audit_log) has the sensitive changes with their details.","tags":["organization"],"parameters":[{"name":"input","in":"query","required":false,"description":"The op's input as URL-encoded JSON.","schema":{"type":"string"}}],"responses":{"200":{"description":"The op's output.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"400":{"description":"Invalid JSON or input that fails the schema (invalid_json, invalid_input).","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"401":{"description":"Missing or invalid credential (unauthorized, invalid_key, invalid_token).","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"402":{"description":"Payment failed or a plan limit was reached; carries checkout_url and the paid plans.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"403":{"description":"The credential's role or scopes do not allow the op, or no organization is available (forbidden, scope_missing, no_organization).","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"404":{"description":"Unknown op or record (unknown_op, not_found).","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"409":{"description":"The request conflicts with the current state.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"422":{"description":"The input is well-formed but cannot be applied.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"429":{"description":"Rate limited. Retry after Retry-After seconds.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"500":{"description":"Internal error. Retry and quote request_id.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}}},"/api/v1/get_onboarding":{"post":{"operationId":"get_onboarding","summary":"Get onboarding checklist","description":"The organization's setup checklist, in order: send a message from the sandbox number, receive a reply, connect a live WhatsApp Business Account, get a template approved, deploy an AI agent, connect a developer surface (API key, MCP or CLI), invite a teammate. Each step has done, a one-line how-to for an agent (which op or command does it) and the dashboard path. Use it to tell a person what to do next in Wabi.","tags":["organization"],"x-read-only":true,"x-admin-only":false,"x-min-role":"viewer","x-scope":"organization:read","requestBody":{"required":false,"content":{"application/json":{"schema":{"type":"object","properties":{}}}}},"responses":{"200":{"description":"The op's output.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"400":{"description":"Invalid JSON or input that fails the schema (invalid_json, invalid_input).","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"401":{"description":"Missing or invalid credential (unauthorized, invalid_key, invalid_token).","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"402":{"description":"Payment failed or a plan limit was reached; carries checkout_url and the paid plans.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"403":{"description":"The credential's role or scopes do not allow the op, or no organization is available (forbidden, scope_missing, no_organization).","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"404":{"description":"Unknown op or record (unknown_op, not_found).","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"409":{"description":"The request conflicts with the current state.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"422":{"description":"The input is well-formed but cannot be applied.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"429":{"description":"Rate limited. Retry after Retry-After seconds.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"500":{"description":"Internal error. Retry and quote request_id.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}},"get":{"operationId":"get_onboarding_get","summary":"Get onboarding checklist (GET)","description":"Read-only ops also answer GET with the input as URL-encoded JSON in ?input=. The organization's setup checklist, in order: send a message from the sandbox number, receive a reply, connect a live WhatsApp Business Account, get a template approved, deploy an AI agent, connect a developer surface (API key, MCP or CLI), invite a teammate. Each step has done, a one-line how-to for an agent (which op or command does it) and the dashboard path. Use it to tell a person what to do next in Wabi.","tags":["organization"],"parameters":[{"name":"input","in":"query","required":false,"description":"The op's input as URL-encoded JSON.","schema":{"type":"string"}}],"responses":{"200":{"description":"The op's output.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"400":{"description":"Invalid JSON or input that fails the schema (invalid_json, invalid_input).","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"401":{"description":"Missing or invalid credential (unauthorized, invalid_key, invalid_token).","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"402":{"description":"Payment failed or a plan limit was reached; carries checkout_url and the paid plans.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"403":{"description":"The credential's role or scopes do not allow the op, or no organization is available (forbidden, scope_missing, no_organization).","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"404":{"description":"Unknown op or record (unknown_op, not_found).","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"409":{"description":"The request conflicts with the current state.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"422":{"description":"The input is well-formed but cannot be applied.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"429":{"description":"Rate limited. Retry after Retry-After seconds.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"500":{"description":"Internal error. Retry and quote request_id.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}}},"/api/v1/get_referral_stats":{"post":{"operationId":"get_referral_stats","summary":"Referral signups (staff)","description":"Wabi team only. Signups by first-touch referral: how many new organizations arrived through a `?ref=<name>` link (a partner, a docs page, an agent surface) or utm_* campaign, per referral_ref, utm_source and utm_medium, in total and within the last `days`. Reads every organization (the only cross-organization read besides the feedback board), returns counts only, never organization names.","tags":["organization"],"x-read-only":true,"x-admin-only":false,"x-min-role":"viewer","x-scope":"organization:read","requestBody":{"required":false,"content":{"application/json":{"schema":{"type":"object","properties":{"days":{"default":30,"description":"Window for signups_since. Default 30.","type":"integer","minimum":1,"maximum":3650}}}}}},"responses":{"200":{"description":"The op's output.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"400":{"description":"Invalid JSON or input that fails the schema (invalid_json, invalid_input).","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"401":{"description":"Missing or invalid credential (unauthorized, invalid_key, invalid_token).","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"402":{"description":"Payment failed or a plan limit was reached; carries checkout_url and the paid plans.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"403":{"description":"The credential's role or scopes do not allow the op, or no organization is available (forbidden, scope_missing, no_organization).","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"404":{"description":"Unknown op or record (unknown_op, not_found).","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"409":{"description":"The request conflicts with the current state.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"422":{"description":"The input is well-formed but cannot be applied.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"429":{"description":"Rate limited. Retry after Retry-After seconds.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"500":{"description":"Internal error. Retry and quote request_id.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}},"get":{"operationId":"get_referral_stats_get","summary":"Referral signups (staff) (GET)","description":"Read-only ops also answer GET with the input as URL-encoded JSON in ?input=. Wabi team only. Signups by first-touch referral: how many new organizations arrived through a `?ref=<name>` link (a partner, a docs page, an agent surface) or utm_* campaign, per referral_ref, utm_source and utm_medium, in total and within the last `days`. Reads every organization (the only cross-organization read besides the feedback board), returns counts only, never organization names.","tags":["organization"],"parameters":[{"name":"input","in":"query","required":false,"description":"The op's input as URL-encoded JSON.","schema":{"type":"string"}}],"responses":{"200":{"description":"The op's output.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"400":{"description":"Invalid JSON or input that fails the schema (invalid_json, invalid_input).","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"401":{"description":"Missing or invalid credential (unauthorized, invalid_key, invalid_token).","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"402":{"description":"Payment failed or a plan limit was reached; carries checkout_url and the paid plans.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"403":{"description":"The credential's role or scopes do not allow the op, or no organization is available (forbidden, scope_missing, no_organization).","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"404":{"description":"Unknown op or record (unknown_op, not_found).","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"409":{"description":"The request conflicts with the current state.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"422":{"description":"The input is well-formed but cannot be applied.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"429":{"description":"Rate limited. Retry after Retry-After seconds.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"500":{"description":"Internal error. Retry and quote request_id.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}}},"/api/v1/list_members":{"post":{"operationId":"list_members","summary":"List members","description":"Everyone in this organization with their email, role (owner, admin, member, viewer) and teams. Read-only: inviting, removing people and changing roles are done by a person in the dashboard (Settings → Members).","tags":["members"],"x-read-only":true,"x-admin-only":false,"x-min-role":"viewer","x-scope":"members:read","requestBody":{"required":false,"content":{"application/json":{"schema":{"type":"object","properties":{}}}}},"responses":{"200":{"description":"The op's output.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"400":{"description":"Invalid JSON or input that fails the schema (invalid_json, invalid_input).","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"401":{"description":"Missing or invalid credential (unauthorized, invalid_key, invalid_token).","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"402":{"description":"Payment failed or a plan limit was reached; carries checkout_url and the paid plans.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"403":{"description":"The credential's role or scopes do not allow the op, or no organization is available (forbidden, scope_missing, no_organization).","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"404":{"description":"Unknown op or record (unknown_op, not_found).","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"409":{"description":"The request conflicts with the current state.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"422":{"description":"The input is well-formed but cannot be applied.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"429":{"description":"Rate limited. Retry after Retry-After seconds.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"500":{"description":"Internal error. Retry and quote request_id.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}},"get":{"operationId":"list_members_get","summary":"List members (GET)","description":"Read-only ops also answer GET with the input as URL-encoded JSON in ?input=. Everyone in this organization with their email, role (owner, admin, member, viewer) and teams. Read-only: inviting, removing people and changing roles are done by a person in the dashboard (Settings → Members).","tags":["members"],"parameters":[{"name":"input","in":"query","required":false,"description":"The op's input as URL-encoded JSON.","schema":{"type":"string"}}],"responses":{"200":{"description":"The op's output.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"400":{"description":"Invalid JSON or input that fails the schema (invalid_json, invalid_input).","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"401":{"description":"Missing or invalid credential (unauthorized, invalid_key, invalid_token).","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"402":{"description":"Payment failed or a plan limit was reached; carries checkout_url and the paid plans.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"403":{"description":"The credential's role or scopes do not allow the op, or no organization is available (forbidden, scope_missing, no_organization).","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"404":{"description":"Unknown op or record (unknown_op, not_found).","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"409":{"description":"The request conflicts with the current state.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"422":{"description":"The input is well-formed but cannot be applied.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"429":{"description":"Rate limited. Retry after Retry-After seconds.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"500":{"description":"Internal error. Retry and quote request_id.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}}},"/api/v1/list_invites":{"post":{"operationId":"list_invites","summary":"List invites","description":"Pending invitations to this organization (email, role, teams, who invited, when it expires). Owners and admins.","tags":["members"],"x-read-only":true,"x-admin-only":true,"x-min-role":"admin","x-scope":"members:read","requestBody":{"required":false,"content":{"application/json":{"schema":{"type":"object","properties":{"include_closed":{"default":false,"description":"Also list accepted, revoked and expired invites.","type":"boolean"}}}}}},"responses":{"200":{"description":"The op's output.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"400":{"description":"Invalid JSON or input that fails the schema (invalid_json, invalid_input).","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"401":{"description":"Missing or invalid credential (unauthorized, invalid_key, invalid_token).","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"402":{"description":"Payment failed or a plan limit was reached; carries checkout_url and the paid plans.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"403":{"description":"The credential's role or scopes do not allow the op, or no organization is available (forbidden, scope_missing, no_organization).","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"404":{"description":"Unknown op or record (unknown_op, not_found).","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"409":{"description":"The request conflicts with the current state.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"422":{"description":"The input is well-formed but cannot be applied.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"429":{"description":"Rate limited. Retry after Retry-After seconds.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"500":{"description":"Internal error. Retry and quote request_id.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}},"get":{"operationId":"list_invites_get","summary":"List invites (GET)","description":"Read-only ops also answer GET with the input as URL-encoded JSON in ?input=. Pending invitations to this organization (email, role, teams, who invited, when it expires). Owners and admins.","tags":["members"],"parameters":[{"name":"input","in":"query","required":false,"description":"The op's input as URL-encoded JSON.","schema":{"type":"string"}}],"responses":{"200":{"description":"The op's output.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"400":{"description":"Invalid JSON or input that fails the schema (invalid_json, invalid_input).","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"401":{"description":"Missing or invalid credential (unauthorized, invalid_key, invalid_token).","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"402":{"description":"Payment failed or a plan limit was reached; carries checkout_url and the paid plans.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"403":{"description":"The credential's role or scopes do not allow the op, or no organization is available (forbidden, scope_missing, no_organization).","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"404":{"description":"Unknown op or record (unknown_op, not_found).","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"409":{"description":"The request conflicts with the current state.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"422":{"description":"The input is well-formed but cannot be applied.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"429":{"description":"Rate limited. Retry after Retry-After seconds.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"500":{"description":"Internal error. Retry and quote request_id.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}}},"/api/v1/list_teams":{"post":{"operationId":"list_teams","summary":"List teams","description":"Teams in this organization with their members (maintainer or member) and the resources (WhatsApp accounts, AI agents) shared with each team.","tags":["members"],"x-read-only":true,"x-admin-only":false,"x-min-role":"viewer","x-scope":"members:read","requestBody":{"required":false,"content":{"application/json":{"schema":{"type":"object","properties":{}}}}},"responses":{"200":{"description":"The op's output.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"400":{"description":"Invalid JSON or input that fails the schema (invalid_json, invalid_input).","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"401":{"description":"Missing or invalid credential (unauthorized, invalid_key, invalid_token).","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"402":{"description":"Payment failed or a plan limit was reached; carries checkout_url and the paid plans.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"403":{"description":"The credential's role or scopes do not allow the op, or no organization is available (forbidden, scope_missing, no_organization).","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"404":{"description":"Unknown op or record (unknown_op, not_found).","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"409":{"description":"The request conflicts with the current state.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"422":{"description":"The input is well-formed but cannot be applied.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"429":{"description":"Rate limited. Retry after Retry-After seconds.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"500":{"description":"Internal error. Retry and quote request_id.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}},"get":{"operationId":"list_teams_get","summary":"List teams (GET)","description":"Read-only ops also answer GET with the input as URL-encoded JSON in ?input=. Teams in this organization with their members (maintainer or member) and the resources (WhatsApp accounts, AI agents) shared with each team.","tags":["members"],"parameters":[{"name":"input","in":"query","required":false,"description":"The op's input as URL-encoded JSON.","schema":{"type":"string"}}],"responses":{"200":{"description":"The op's output.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"400":{"description":"Invalid JSON or input that fails the schema (invalid_json, invalid_input).","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"401":{"description":"Missing or invalid credential (unauthorized, invalid_key, invalid_token).","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"402":{"description":"Payment failed or a plan limit was reached; carries checkout_url and the paid plans.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"403":{"description":"The credential's role or scopes do not allow the op, or no organization is available (forbidden, scope_missing, no_organization).","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"404":{"description":"Unknown op or record (unknown_op, not_found).","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"409":{"description":"The request conflicts with the current state.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"422":{"description":"The input is well-formed but cannot be applied.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"429":{"description":"Rate limited. Retry after Retry-After seconds.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"500":{"description":"Internal error. Retry and quote request_id.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}}},"/api/v1/create_team":{"post":{"operationId":"create_team","summary":"Create team","description":"Create a team (a group of members to share WhatsApp accounts and agents with, and to route conversations to). You become its maintainer. Members and above.","tags":["members"],"x-read-only":false,"x-admin-only":false,"x-min-role":"member","x-scope":"members:write","requestBody":{"required":false,"content":{"application/json":{"schema":{"type":"object","properties":{"name":{"type":"string","minLength":1,"maxLength":100},"slug":{"description":"URL-safe id; derived from the name when omitted.","type":"string","pattern":"^[a-z0-9][a-z0-9-]{0,47}$"},"description":{"default":"","type":"string","maxLength":1000}},"required":["name"]}}}},"responses":{"200":{"description":"The op's output.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"400":{"description":"Invalid JSON or input that fails the schema (invalid_json, invalid_input).","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"401":{"description":"Missing or invalid credential (unauthorized, invalid_key, invalid_token).","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"402":{"description":"Payment failed or a plan limit was reached; carries checkout_url and the paid plans.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"403":{"description":"The credential's role or scopes do not allow the op, or no organization is available (forbidden, scope_missing, no_organization).","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"404":{"description":"Unknown op or record (unknown_op, not_found).","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"409":{"description":"The request conflicts with the current state.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"422":{"description":"The input is well-formed but cannot be applied.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"429":{"description":"Rate limited. Retry after Retry-After seconds.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"500":{"description":"Internal error. Retry and quote request_id.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}}},"/api/v1/update_team":{"post":{"operationId":"update_team","summary":"Update team","description":"Rename a team or change its description. Its maintainers, owners and admins.","tags":["members"],"x-read-only":false,"x-admin-only":false,"x-min-role":"member","x-scope":"members:write","requestBody":{"required":false,"content":{"application/json":{"schema":{"type":"object","properties":{"team":{"type":"string","minLength":1,"maxLength":100,"description":"Team slug or id."},"name":{"type":"string","minLength":1,"maxLength":100},"description":{"type":"string","maxLength":1000}},"required":["team"]}}}},"responses":{"200":{"description":"The op's output.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"400":{"description":"Invalid JSON or input that fails the schema (invalid_json, invalid_input).","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"401":{"description":"Missing or invalid credential (unauthorized, invalid_key, invalid_token).","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"402":{"description":"Payment failed or a plan limit was reached; carries checkout_url and the paid plans.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"403":{"description":"The credential's role or scopes do not allow the op, or no organization is available (forbidden, scope_missing, no_organization).","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"404":{"description":"Unknown op or record (unknown_op, not_found).","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"409":{"description":"The request conflicts with the current state.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"422":{"description":"The input is well-formed but cannot be applied.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"429":{"description":"Rate limited. Retry after Retry-After seconds.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"500":{"description":"Internal error. Retry and quote request_id.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}}},"/api/v1/delete_team":{"post":{"operationId":"delete_team","summary":"Delete team","description":"Delete a team. Its members stay in the organization but lose what was shared with the team.","tags":["members"],"x-read-only":false,"x-admin-only":false,"x-min-role":"member","x-scope":"members:write","requestBody":{"required":false,"content":{"application/json":{"schema":{"type":"object","properties":{"team":{"type":"string","minLength":1,"maxLength":100,"description":"Team slug or id."}},"required":["team"]}}}},"responses":{"200":{"description":"The op's output.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"400":{"description":"Invalid JSON or input that fails the schema (invalid_json, invalid_input).","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"401":{"description":"Missing or invalid credential (unauthorized, invalid_key, invalid_token).","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"402":{"description":"Payment failed or a plan limit was reached; carries checkout_url and the paid plans.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"403":{"description":"The credential's role or scopes do not allow the op, or no organization is available (forbidden, scope_missing, no_organization).","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"404":{"description":"Unknown op or record (unknown_op, not_found).","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"409":{"description":"The request conflicts with the current state.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"422":{"description":"The input is well-formed but cannot be applied.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"429":{"description":"Rate limited. Retry after Retry-After seconds.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"500":{"description":"Internal error. Retry and quote request_id.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}}},"/api/v1/set_team_member":{"post":{"operationId":"set_team_member","summary":"Add to team","description":"Add an organization member to a team, or change their team role (maintainer manages the team; member is in it). Its maintainers, owners and admins.","tags":["members"],"x-read-only":false,"x-admin-only":false,"x-min-role":"member","x-scope":"members:write","requestBody":{"required":false,"content":{"application/json":{"schema":{"type":"object","properties":{"team":{"type":"string","minLength":1,"maxLength":100,"description":"Team slug or id."},"user":{"type":"string","minLength":3,"maxLength":320,"description":"An organization member's user id or email address."},"role":{"default":"member","type":"string","enum":["maintainer","member"]}},"required":["team","user"]}}}},"responses":{"200":{"description":"The op's output.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"400":{"description":"Invalid JSON or input that fails the schema (invalid_json, invalid_input).","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"401":{"description":"Missing or invalid credential (unauthorized, invalid_key, invalid_token).","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"402":{"description":"Payment failed or a plan limit was reached; carries checkout_url and the paid plans.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"403":{"description":"The credential's role or scopes do not allow the op, or no organization is available (forbidden, scope_missing, no_organization).","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"404":{"description":"Unknown op or record (unknown_op, not_found).","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"409":{"description":"The request conflicts with the current state.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"422":{"description":"The input is well-formed but cannot be applied.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"429":{"description":"Rate limited. Retry after Retry-After seconds.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"500":{"description":"Internal error. Retry and quote request_id.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}}},"/api/v1/remove_team_member":{"post":{"operationId":"remove_team_member","summary":"Remove from team","description":"Take someone out of a team (they stay in the organization). Its maintainers, owners and admins; anyone can leave a team themselves.","tags":["members"],"x-read-only":false,"x-admin-only":false,"x-min-role":"viewer","x-scope":"members:write","requestBody":{"required":false,"content":{"application/json":{"schema":{"type":"object","properties":{"team":{"type":"string","minLength":1,"maxLength":100,"description":"Team slug or id."},"user":{"type":"string","minLength":3,"maxLength":320,"description":"An organization member's user id or email address."}},"required":["team","user"]}}}},"responses":{"200":{"description":"The op's output.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"400":{"description":"Invalid JSON or input that fails the schema (invalid_json, invalid_input).","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"401":{"description":"Missing or invalid credential (unauthorized, invalid_key, invalid_token).","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"402":{"description":"Payment failed or a plan limit was reached; carries checkout_url and the paid plans.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"403":{"description":"The credential's role or scopes do not allow the op, or no organization is available (forbidden, scope_missing, no_organization).","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"404":{"description":"Unknown op or record (unknown_op, not_found).","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"409":{"description":"The request conflicts with the current state.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"422":{"description":"The input is well-formed but cannot be applied.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"429":{"description":"Rate limited. Retry after Retry-After seconds.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"500":{"description":"Internal error. Retry and quote request_id.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}}},"/api/v1/list_resource_access":{"post":{"operationId":"list_resource_access","summary":"List resource access","description":"Who can see a shareable resource (a WhatsApp account or an AI agent): its visibility (org or restricted), its creator, and every grant to a team or person with its access (read, write, admin). Owners and admins always have admin.","tags":["members"],"x-read-only":true,"x-admin-only":false,"x-min-role":"viewer","x-scope":"members:read","requestBody":{"required":false,"content":{"application/json":{"schema":{"type":"object","properties":{"resource_type":{"type":"string","enum":["whatsapp_account","agent"],"description":"whatsapp_account or agent."},"resource_id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"}},"required":["resource_type","resource_id"]}}}},"responses":{"200":{"description":"The op's output.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"400":{"description":"Invalid JSON or input that fails the schema (invalid_json, invalid_input).","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"401":{"description":"Missing or invalid credential (unauthorized, invalid_key, invalid_token).","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"402":{"description":"Payment failed or a plan limit was reached; carries checkout_url and the paid plans.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"403":{"description":"The credential's role or scopes do not allow the op, or no organization is available (forbidden, scope_missing, no_organization).","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"404":{"description":"Unknown op or record (unknown_op, not_found).","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"409":{"description":"The request conflicts with the current state.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"422":{"description":"The input is well-formed but cannot be applied.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"429":{"description":"Rate limited. Retry after Retry-After seconds.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"500":{"description":"Internal error. Retry and quote request_id.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}},"get":{"operationId":"list_resource_access_get","summary":"List resource access (GET)","description":"Read-only ops also answer GET with the input as URL-encoded JSON in ?input=. Who can see a shareable resource (a WhatsApp account or an AI agent): its visibility (org or restricted), its creator, and every grant to a team or person with its access (read, write, admin). Owners and admins always have admin.","tags":["members"],"parameters":[{"name":"input","in":"query","required":false,"description":"The op's input as URL-encoded JSON.","schema":{"type":"string"}}],"responses":{"200":{"description":"The op's output.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"400":{"description":"Invalid JSON or input that fails the schema (invalid_json, invalid_input).","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"401":{"description":"Missing or invalid credential (unauthorized, invalid_key, invalid_token).","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"402":{"description":"Payment failed or a plan limit was reached; carries checkout_url and the paid plans.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"403":{"description":"The credential's role or scopes do not allow the op, or no organization is available (forbidden, scope_missing, no_organization).","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"404":{"description":"Unknown op or record (unknown_op, not_found).","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"409":{"description":"The request conflicts with the current state.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"422":{"description":"The input is well-formed but cannot be applied.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"429":{"description":"Rate limited. Retry after Retry-After seconds.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"500":{"description":"Internal error. Retry and quote request_id.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}}},"/api/v1/set_resource_visibility":{"post":{"operationId":"set_resource_visibility","summary":"Set resource visibility","description":"org: every organization member sees the resource (viewers read, members write). restricted: only its creator, owners and admins, and the teams and people it is shared with (share_resource). Works on WhatsApp accounts and AI agents. Needs admin access to the resource.","tags":["members"],"x-read-only":false,"x-admin-only":false,"x-min-role":"member","x-scope":"members:write","requestBody":{"required":false,"content":{"application/json":{"schema":{"type":"object","properties":{"resource_type":{"type":"string","enum":["whatsapp_account","agent"],"description":"whatsapp_account or agent."},"resource_id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"visibility":{"type":"string","enum":["org","restricted"]}},"required":["resource_type","resource_id","visibility"]}}}},"responses":{"200":{"description":"The op's output.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"400":{"description":"Invalid JSON or input that fails the schema (invalid_json, invalid_input).","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"401":{"description":"Missing or invalid credential (unauthorized, invalid_key, invalid_token).","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"402":{"description":"Payment failed or a plan limit was reached; carries checkout_url and the paid plans.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"403":{"description":"The credential's role or scopes do not allow the op, or no organization is available (forbidden, scope_missing, no_organization).","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"404":{"description":"Unknown op or record (unknown_op, not_found).","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"409":{"description":"The request conflicts with the current state.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"422":{"description":"The input is well-formed but cannot be applied.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"429":{"description":"Rate limited. Retry after Retry-After seconds.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"500":{"description":"Internal error. Retry and quote request_id.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}}},"/api/v1/share_resource":{"post":{"operationId":"share_resource","summary":"Share resource","description":"Give a team or a person read, write or admin access to a WhatsApp account or AI agent (replacing what that team or person had). read: see it and its data; write: use it (send from the account, edit the agent); admin: also change its settings and who it is shared with. Viewers never get past read. Needs admin access to the resource.","tags":["members"],"x-read-only":false,"x-admin-only":false,"x-min-role":"member","x-scope":"members:write","requestBody":{"required":false,"content":{"application/json":{"schema":{"type":"object","properties":{"resource_type":{"type":"string","enum":["whatsapp_account","agent"],"description":"whatsapp_account or agent."},"resource_id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"team":{"type":"string","minLength":1,"maxLength":100,"description":"Team slug or id."},"user":{"type":"string","minLength":3,"maxLength":320,"description":"An organization member's user id or email address."},"access":{"type":"string","enum":["read","write","admin"]}},"required":["resource_type","resource_id","access"]}}}},"responses":{"200":{"description":"The op's output.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"400":{"description":"Invalid JSON or input that fails the schema (invalid_json, invalid_input).","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"401":{"description":"Missing or invalid credential (unauthorized, invalid_key, invalid_token).","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"402":{"description":"Payment failed or a plan limit was reached; carries checkout_url and the paid plans.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"403":{"description":"The credential's role or scopes do not allow the op, or no organization is available (forbidden, scope_missing, no_organization).","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"404":{"description":"Unknown op or record (unknown_op, not_found).","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"409":{"description":"The request conflicts with the current state.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"422":{"description":"The input is well-formed but cannot be applied.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"429":{"description":"Rate limited. Retry after Retry-After seconds.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"500":{"description":"Internal error. Retry and quote request_id.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}}},"/api/v1/unshare_resource":{"post":{"operationId":"unshare_resource","summary":"Unshare resource","description":"Remove a team's or person's grant on a WhatsApp account or AI agent. They keep whatever their organization role gives them (nothing, on a restricted resource). Needs admin access to the resource.","tags":["members"],"x-read-only":false,"x-admin-only":false,"x-min-role":"member","x-scope":"members:write","requestBody":{"required":false,"content":{"application/json":{"schema":{"type":"object","properties":{"resource_type":{"type":"string","enum":["whatsapp_account","agent"],"description":"whatsapp_account or agent."},"resource_id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"team":{"type":"string","minLength":1,"maxLength":100,"description":"Team slug or id."},"user":{"type":"string","minLength":3,"maxLength":320,"description":"An organization member's user id or email address."}},"required":["resource_type","resource_id"]}}}},"responses":{"200":{"description":"The op's output.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"400":{"description":"Invalid JSON or input that fails the schema (invalid_json, invalid_input).","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"401":{"description":"Missing or invalid credential (unauthorized, invalid_key, invalid_token).","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"402":{"description":"Payment failed or a plan limit was reached; carries checkout_url and the paid plans.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"403":{"description":"The credential's role or scopes do not allow the op, or no organization is available (forbidden, scope_missing, no_organization).","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"404":{"description":"Unknown op or record (unknown_op, not_found).","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"409":{"description":"The request conflicts with the current state.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"422":{"description":"The input is well-formed but cannot be applied.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"429":{"description":"Rate limited. Retry after Retry-After seconds.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"500":{"description":"Internal error. Retry and quote request_id.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}}},"/api/v1/list_audit_log":{"post":{"operationId":"list_audit_log","summary":"List audit log","description":"Membership, role, team, invite, API key, billing, settings and sharing changes in this organization, newest first: who (a person, an API key, an OAuth client or the system), what, to what, and when. Owners and admins. The activity log (list_activity) has content changes.","tags":["members"],"x-read-only":true,"x-admin-only":true,"x-min-role":"admin","x-scope":"members:read","requestBody":{"required":false,"content":{"application/json":{"schema":{"type":"object","properties":{"action":{"description":"Only this action or prefix, e.g. member. or invite.accepted.","type":"string","maxLength":100},"limit":{"default":50,"description":"Page size, at most 200.","type":"integer","minimum":1,"maximum":200},"offset":{"default":0,"type":"integer","minimum":0,"maximum":9007199254740991}}}}}},"responses":{"200":{"description":"The op's output.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"400":{"description":"Invalid JSON or input that fails the schema (invalid_json, invalid_input).","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"401":{"description":"Missing or invalid credential (unauthorized, invalid_key, invalid_token).","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"402":{"description":"Payment failed or a plan limit was reached; carries checkout_url and the paid plans.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"403":{"description":"The credential's role or scopes do not allow the op, or no organization is available (forbidden, scope_missing, no_organization).","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"404":{"description":"Unknown op or record (unknown_op, not_found).","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"409":{"description":"The request conflicts with the current state.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"422":{"description":"The input is well-formed but cannot be applied.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"429":{"description":"Rate limited. Retry after Retry-After seconds.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"500":{"description":"Internal error. Retry and quote request_id.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}},"get":{"operationId":"list_audit_log_get","summary":"List audit log (GET)","description":"Read-only ops also answer GET with the input as URL-encoded JSON in ?input=. Membership, role, team, invite, API key, billing, settings and sharing changes in this organization, newest first: who (a person, an API key, an OAuth client or the system), what, to what, and when. Owners and admins. The activity log (list_activity) has content changes.","tags":["members"],"parameters":[{"name":"input","in":"query","required":false,"description":"The op's input as URL-encoded JSON.","schema":{"type":"string"}}],"responses":{"200":{"description":"The op's output.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"400":{"description":"Invalid JSON or input that fails the schema (invalid_json, invalid_input).","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"401":{"description":"Missing or invalid credential (unauthorized, invalid_key, invalid_token).","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"402":{"description":"Payment failed or a plan limit was reached; carries checkout_url and the paid plans.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"403":{"description":"The credential's role or scopes do not allow the op, or no organization is available (forbidden, scope_missing, no_organization).","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"404":{"description":"Unknown op or record (unknown_op, not_found).","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"409":{"description":"The request conflicts with the current state.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"422":{"description":"The input is well-formed but cannot be applied.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"429":{"description":"Rate limited. Retry after Retry-After seconds.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"500":{"description":"Internal error. Retry and quote request_id.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}}},"/api/v1/list_api_keys":{"post":{"operationId":"list_api_keys","summary":"List API keys","description":"API keys of this organization (prefix only; the full key is shown once at creation), each with the role it acts with, its scopes and who created it. Owners and admins see every key; members see their own. Also returns available_scopes.","tags":["keys"],"x-read-only":true,"x-admin-only":false,"x-min-role":"member","x-scope":"keys:read","requestBody":{"required":false,"content":{"application/json":{"schema":{"type":"object","properties":{}}}}},"responses":{"200":{"description":"The op's output.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"400":{"description":"Invalid JSON or input that fails the schema (invalid_json, invalid_input).","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"401":{"description":"Missing or invalid credential (unauthorized, invalid_key, invalid_token).","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"402":{"description":"Payment failed or a plan limit was reached; carries checkout_url and the paid plans.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"403":{"description":"The credential's role or scopes do not allow the op, or no organization is available (forbidden, scope_missing, no_organization).","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"404":{"description":"Unknown op or record (unknown_op, not_found).","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"409":{"description":"The request conflicts with the current state.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"422":{"description":"The input is well-formed but cannot be applied.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"429":{"description":"Rate limited. Retry after Retry-After seconds.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"500":{"description":"Internal error. Retry and quote request_id.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}},"get":{"operationId":"list_api_keys_get","summary":"List API keys (GET)","description":"Read-only ops also answer GET with the input as URL-encoded JSON in ?input=. API keys of this organization (prefix only; the full key is shown once at creation), each with the role it acts with, its scopes and who created it. Owners and admins see every key; members see their own. Also returns available_scopes.","tags":["keys"],"parameters":[{"name":"input","in":"query","required":false,"description":"The op's input as URL-encoded JSON.","schema":{"type":"string"}}],"responses":{"200":{"description":"The op's output.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"400":{"description":"Invalid JSON or input that fails the schema (invalid_json, invalid_input).","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"401":{"description":"Missing or invalid credential (unauthorized, invalid_key, invalid_token).","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"402":{"description":"Payment failed or a plan limit was reached; carries checkout_url and the paid plans.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"403":{"description":"The credential's role or scopes do not allow the op, or no organization is available (forbidden, scope_missing, no_organization).","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"404":{"description":"Unknown op or record (unknown_op, not_found).","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"409":{"description":"The request conflicts with the current state.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"422":{"description":"The input is well-formed but cannot be applied.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"429":{"description":"Rate limited. Retry after Retry-After seconds.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"500":{"description":"Internal error. Retry and quote request_id.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}}},"/api/v1/create_api_key":{"post":{"operationId":"create_api_key","summary":"Create API key","description":"Create an organization API key for your backend, the CLI, an MCP host or CI. It acts with your role (an owner's key acts as admin), optionally narrowed to scopes, and keeps working if you leave the organization; admins can revoke it. The full key (wabi_…) is returned only once; store it as a secret and never ship it to a browser or app.","tags":["keys"],"x-read-only":false,"x-admin-only":false,"x-min-role":"member","x-scope":"keys:write","requestBody":{"required":false,"content":{"application/json":{"schema":{"type":"object","properties":{"name":{"type":"string","minLength":1,"maxLength":100},"scopes":{"default":[],"description":"Narrow the key to these scopes: `<group>:read`, `<group>:write`, `<group>:*`, `*:read`, or `billing:purchase` (groups: messages, conversations, contacts, templates, agents, webhooks, usage…). Empty (default): everything the key's role allows.","maxItems":64,"type":"array","items":{"type":"string"}},"expires_in_days":{"description":"Expire the key after this many days. Default: never.","type":"integer","minimum":1,"maximum":3650}},"required":["name"]}}}},"responses":{"200":{"description":"The op's output.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"400":{"description":"Invalid JSON or input that fails the schema (invalid_json, invalid_input).","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"401":{"description":"Missing or invalid credential (unauthorized, invalid_key, invalid_token).","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"402":{"description":"Payment failed or a plan limit was reached; carries checkout_url and the paid plans.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"403":{"description":"The credential's role or scopes do not allow the op, or no organization is available (forbidden, scope_missing, no_organization).","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"404":{"description":"Unknown op or record (unknown_op, not_found).","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"409":{"description":"The request conflicts with the current state.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"422":{"description":"The input is well-formed but cannot be applied.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"429":{"description":"Rate limited. Retry after Retry-After seconds.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"500":{"description":"Internal error. Retry and quote request_id.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}}},"/api/v1/revoke_api_key":{"post":{"operationId":"revoke_api_key","summary":"Revoke API key","description":"Revoke an API key immediately; every backend, CLI, CI job or MCP host using it stops working. Owners and admins revoke any key; members their own.","tags":["keys"],"x-read-only":false,"x-admin-only":false,"x-min-role":"member","x-scope":"keys:write","requestBody":{"required":false,"content":{"application/json":{"schema":{"type":"object","properties":{"key":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"}},"required":["key"]}}}},"responses":{"200":{"description":"The op's output.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"400":{"description":"Invalid JSON or input that fails the schema (invalid_json, invalid_input).","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"401":{"description":"Missing or invalid credential (unauthorized, invalid_key, invalid_token).","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"402":{"description":"Payment failed or a plan limit was reached; carries checkout_url and the paid plans.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"403":{"description":"The credential's role or scopes do not allow the op, or no organization is available (forbidden, scope_missing, no_organization).","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"404":{"description":"Unknown op or record (unknown_op, not_found).","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"409":{"description":"The request conflicts with the current state.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"422":{"description":"The input is well-formed but cannot be applied.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"429":{"description":"Rate limited. Retry after Retry-After seconds.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"500":{"description":"Internal error. Retry and quote request_id.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}}},"/api/v1/get_pricing":{"post":{"operationId":"get_pricing","summary":"Get pricing","description":"The plans (Free, Starter, Growth, Scale, Enterprise): price {monthly, yearly} in USD, included messages and AI replies a month, limits (live numbers, WhatsApp accounts, members, agents, history days; null is unlimited), features, overage rates and the default budget cap, a checkout_url per paid plan, and how_to_buy. Meta's own message fees are billed by Meta to the customer's WABA at cost and are not part of these prices. The same document as GET /api/v1/pricing; needs no credential (REST, the catalog MCP server at /api/mcp/catalog, `wabi pricing`). Call before recommending or buying a plan.","tags":["billing"],"x-read-only":true,"x-admin-only":false,"x-min-role":"viewer","x-scope":"billing:read","security":[{},{"bearerAuth":[]}],"requestBody":{"required":false,"content":{"application/json":{"schema":{"type":"object","properties":{}}}}},"responses":{"200":{"description":"The op's output.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"400":{"description":"Invalid JSON or input that fails the schema (invalid_json, invalid_input).","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"401":{"description":"Missing or invalid credential (unauthorized, invalid_key, invalid_token).","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"402":{"description":"Payment failed or a plan limit was reached; carries checkout_url and the paid plans.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"403":{"description":"The credential's role or scopes do not allow the op, or no organization is available (forbidden, scope_missing, no_organization).","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"404":{"description":"Unknown op or record (unknown_op, not_found).","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"409":{"description":"The request conflicts with the current state.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"422":{"description":"The input is well-formed but cannot be applied.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"429":{"description":"Rate limited. Retry after Retry-After seconds.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"500":{"description":"Internal error. Retry and quote request_id.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}},"get":{"operationId":"get_pricing_get","summary":"Get pricing (GET)","description":"Read-only ops also answer GET with the input as URL-encoded JSON in ?input=. The plans (Free, Starter, Growth, Scale, Enterprise): price {monthly, yearly} in USD, included messages and AI replies a month, limits (live numbers, WhatsApp accounts, members, agents, history days; null is unlimited), features, overage rates and the default budget cap, a checkout_url per paid plan, and how_to_buy. Meta's own message fees are billed by Meta to the customer's WABA at cost and are not part of these prices. The same document as GET /api/v1/pricing; needs no credential (REST, the catalog MCP server at /api/mcp/catalog, `wabi pricing`). Call before recommending or buying a plan.","tags":["billing"],"security":[{},{"bearerAuth":[]}],"parameters":[{"name":"input","in":"query","required":false,"description":"The op's input as URL-encoded JSON.","schema":{"type":"string"}}],"responses":{"200":{"description":"The op's output.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"400":{"description":"Invalid JSON or input that fails the schema (invalid_json, invalid_input).","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"401":{"description":"Missing or invalid credential (unauthorized, invalid_key, invalid_token).","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"402":{"description":"Payment failed or a plan limit was reached; carries checkout_url and the paid plans.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"403":{"description":"The credential's role or scopes do not allow the op, or no organization is available (forbidden, scope_missing, no_organization).","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"404":{"description":"Unknown op or record (unknown_op, not_found).","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"409":{"description":"The request conflicts with the current state.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"422":{"description":"The input is well-formed but cannot be applied.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"429":{"description":"Rate limited. Retry after Retry-After seconds.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"500":{"description":"Internal error. Retry and quote request_id.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}}},"/api/v1/get_account":{"post":{"operationId":"get_account","summary":"Get account","description":"Who this credential acts for and what it may use: the organization, your role in it (viewer, member, admin, owner) and whether you are a person, an OAuth client or an API key (acting_as, with the key's scopes), the plan in force (status, interval, renewal or end date, budget cap), usage this period against every limit (messages, AI replies, live numbers, members, agents) with what remains and the overage so far, and next_tier: what the next plan adds, its price and a checkout_url. Same data as GET /api/v1/account and `wabi account`. Call before a bulk send or when a human asks about plan or usage.","tags":["billing"],"x-read-only":true,"x-admin-only":false,"x-min-role":"viewer","x-scope":"billing:read","requestBody":{"required":false,"content":{"application/json":{"schema":{"type":"object","properties":{}}}}},"responses":{"200":{"description":"The op's output.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"400":{"description":"Invalid JSON or input that fails the schema (invalid_json, invalid_input).","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"401":{"description":"Missing or invalid credential (unauthorized, invalid_key, invalid_token).","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"402":{"description":"Payment failed or a plan limit was reached; carries checkout_url and the paid plans.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"403":{"description":"The credential's role or scopes do not allow the op, or no organization is available (forbidden, scope_missing, no_organization).","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"404":{"description":"Unknown op or record (unknown_op, not_found).","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"409":{"description":"The request conflicts with the current state.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"422":{"description":"The input is well-formed but cannot be applied.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"429":{"description":"Rate limited. Retry after Retry-After seconds.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"500":{"description":"Internal error. Retry and quote request_id.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}},"get":{"operationId":"get_account_get","summary":"Get account (GET)","description":"Read-only ops also answer GET with the input as URL-encoded JSON in ?input=. Who this credential acts for and what it may use: the organization, your role in it (viewer, member, admin, owner) and whether you are a person, an OAuth client or an API key (acting_as, with the key's scopes), the plan in force (status, interval, renewal or end date, budget cap), usage this period against every limit (messages, AI replies, live numbers, members, agents) with what remains and the overage so far, and next_tier: what the next plan adds, its price and a checkout_url. Same data as GET /api/v1/account and `wabi account`. Call before a bulk send or when a human asks about plan or usage.","tags":["billing"],"parameters":[{"name":"input","in":"query","required":false,"description":"The op's input as URL-encoded JSON.","schema":{"type":"string"}}],"responses":{"200":{"description":"The op's output.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"400":{"description":"Invalid JSON or input that fails the schema (invalid_json, invalid_input).","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"401":{"description":"Missing or invalid credential (unauthorized, invalid_key, invalid_token).","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"402":{"description":"Payment failed or a plan limit was reached; carries checkout_url and the paid plans.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"403":{"description":"The credential's role or scopes do not allow the op, or no organization is available (forbidden, scope_missing, no_organization).","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"404":{"description":"Unknown op or record (unknown_op, not_found).","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"409":{"description":"The request conflicts with the current state.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"422":{"description":"The input is well-formed but cannot be applied.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"429":{"description":"Rate limited. Retry after Retry-After seconds.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"500":{"description":"Internal error. Retry and quote request_id.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}}},"/api/v1/get_billing":{"post":{"operationId":"get_billing","summary":"Get billing","description":"This organization's plan, subscription status, renewal or end date, budget cap, whether a card is saved (so subscribe can charge it), and usage this period against the plan (messages, AI replies, numbers, members, agents, overage so far). Pass refresh: true right after a human finished a checkout to pull the latest state from Stripe.","tags":["billing"],"x-read-only":true,"x-admin-only":false,"x-min-role":"viewer","x-scope":"billing:read","requestBody":{"required":false,"content":{"application/json":{"schema":{"type":"object","properties":{"refresh":{"default":false,"description":"Re-read the subscription from Stripe instead of the stored copy.","type":"boolean"}}}}}},"responses":{"200":{"description":"The op's output.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"400":{"description":"Invalid JSON or input that fails the schema (invalid_json, invalid_input).","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"401":{"description":"Missing or invalid credential (unauthorized, invalid_key, invalid_token).","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"402":{"description":"Payment failed or a plan limit was reached; carries checkout_url and the paid plans.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"403":{"description":"The credential's role or scopes do not allow the op, or no organization is available (forbidden, scope_missing, no_organization).","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"404":{"description":"Unknown op or record (unknown_op, not_found).","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"409":{"description":"The request conflicts with the current state.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"422":{"description":"The input is well-formed but cannot be applied.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"429":{"description":"Rate limited. Retry after Retry-After seconds.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"500":{"description":"Internal error. Retry and quote request_id.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}},"get":{"operationId":"get_billing_get","summary":"Get billing (GET)","description":"Read-only ops also answer GET with the input as URL-encoded JSON in ?input=. This organization's plan, subscription status, renewal or end date, budget cap, whether a card is saved (so subscribe can charge it), and usage this period against the plan (messages, AI replies, numbers, members, agents, overage so far). Pass refresh: true right after a human finished a checkout to pull the latest state from Stripe.","tags":["billing"],"parameters":[{"name":"input","in":"query","required":false,"description":"The op's input as URL-encoded JSON.","schema":{"type":"string"}}],"responses":{"200":{"description":"The op's output.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"400":{"description":"Invalid JSON or input that fails the schema (invalid_json, invalid_input).","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"401":{"description":"Missing or invalid credential (unauthorized, invalid_key, invalid_token).","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"402":{"description":"Payment failed or a plan limit was reached; carries checkout_url and the paid plans.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"403":{"description":"The credential's role or scopes do not allow the op, or no organization is available (forbidden, scope_missing, no_organization).","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"404":{"description":"Unknown op or record (unknown_op, not_found).","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"409":{"description":"The request conflicts with the current state.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"422":{"description":"The input is well-formed but cannot be applied.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"429":{"description":"Rate limited. Retry after Retry-After seconds.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"500":{"description":"Internal error. Retry and quote request_id.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}}},"/api/v1/create_checkout_link":{"post":{"operationId":"create_checkout_link","summary":"Create checkout link","description":"A Stripe Checkout URL where a human pays for a plan; hand it to them (or open it in their browser). Works before signup: with no credential (REST, the catalog MCP server, `wabi upgrade` before login) the human pays first, then signs in with the same email and the plan attaches to their organization. Nothing is charged and the plan does not change until they complete it; then get_billing {refresh: true} shows the new plan. The link expires after 24 hours. If the organization already has a subscription, the URL is a Stripe page where they confirm the plan change instead. Returns {url, kind: checkout | plan_change, plan, interval, amount_cents, expires_at, session_id}. Never collect card details yourself.","tags":["billing"],"x-read-only":false,"x-admin-only":true,"x-min-role":"admin","x-scope":"billing:write","security":[{},{"bearerAuth":[]}],"requestBody":{"required":false,"content":{"application/json":{"schema":{"type":"object","properties":{"plan":{"type":"string","enum":["starter","growth","scale"],"description":"starter, growth or scale. get_pricing lists what each includes. Enterprise is sold by email."},"interval":{"default":"month","description":"month, or year (two months free: 10x the monthly price).","type":"string","enum":["month","year"]},"ref":{"description":"Optional attribution slug for the link (e.g. agent-cursor). Defaults to the surface: agent-mcp, agent-cli or agent-api.","type":"string","pattern":"^[a-z0-9][a-z0-9_-]{0,39}$"}},"required":["plan"]}}}},"responses":{"200":{"description":"The op's output.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"400":{"description":"Invalid JSON or input that fails the schema (invalid_json, invalid_input).","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"401":{"description":"Missing or invalid credential (unauthorized, invalid_key, invalid_token).","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"402":{"description":"Payment failed or a plan limit was reached; carries checkout_url and the paid plans.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"403":{"description":"The credential's role or scopes do not allow the op, or no organization is available (forbidden, scope_missing, no_organization).","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"404":{"description":"Unknown op or record (unknown_op, not_found).","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"409":{"description":"The request conflicts with the current state.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"422":{"description":"The input is well-formed but cannot be applied.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"429":{"description":"Rate limited. Retry after Retry-After seconds.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"500":{"description":"Internal error. Retry and quote request_id.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}}},"/api/v1/subscribe":{"post":{"operationId":"subscribe","summary":"Subscribe","description":"Start or change this organization's paid plan in one call, charging the card already saved for the organization. Only after a human approved this plan and price: confirm must be true. Without a saved card (or if the card needs the human, e.g. 3-D Secure) nothing is charged and it returns status checkout_required with a checkout_url for a human to finish. A plan change is prorated and invoiced immediately. Returns {status: subscribed | changed | unchanged | checkout_required, billing}.","tags":["billing"],"x-read-only":false,"x-admin-only":true,"x-min-role":"admin","x-scope":"billing:write","requestBody":{"required":false,"content":{"application/json":{"schema":{"type":"object","properties":{"plan":{"type":"string","enum":["starter","growth","scale"],"description":"starter, growth or scale. get_pricing lists what each includes. Enterprise is sold by email."},"interval":{"default":"month","description":"month, or year (two months free: 10x the monthly price).","type":"string","enum":["month","year"]},"confirm":{"type":"boolean","const":true,"description":"Must be true: a human has seen the plan and price and asked you to buy it. Never set it on your own initiative."}},"required":["plan","confirm"]}}}},"responses":{"200":{"description":"The op's output.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"400":{"description":"Invalid JSON or input that fails the schema (invalid_json, invalid_input).","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"401":{"description":"Missing or invalid credential (unauthorized, invalid_key, invalid_token).","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"402":{"description":"Payment failed or a plan limit was reached; carries checkout_url and the paid plans.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"403":{"description":"The credential's role or scopes do not allow the op, or no organization is available (forbidden, scope_missing, no_organization).","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"404":{"description":"Unknown op or record (unknown_op, not_found).","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"409":{"description":"The request conflicts with the current state.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"422":{"description":"The input is well-formed but cannot be applied.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"429":{"description":"Rate limited. Retry after Retry-After seconds.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"500":{"description":"Internal error. Retry and quote request_id.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}}},"/api/v1/cancel_subscription":{"post":{"operationId":"cancel_subscription","summary":"Cancel subscription","description":"Cancel the paid plan at the end of the current period (no refund; the plan stays until then, then the organization is on Free). Only when a human asked: confirm must be true. resume_subscription undoes it before the period ends.","tags":["billing"],"x-read-only":false,"x-admin-only":true,"x-min-role":"admin","x-scope":"billing:write","requestBody":{"required":false,"content":{"application/json":{"schema":{"type":"object","properties":{"confirm":{"type":"boolean","const":true,"description":"Must be true: a human has seen the plan and price and asked you to buy it. Never set it on your own initiative."}},"required":["confirm"]}}}},"responses":{"200":{"description":"The op's output.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"400":{"description":"Invalid JSON or input that fails the schema (invalid_json, invalid_input).","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"401":{"description":"Missing or invalid credential (unauthorized, invalid_key, invalid_token).","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"402":{"description":"Payment failed or a plan limit was reached; carries checkout_url and the paid plans.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"403":{"description":"The credential's role or scopes do not allow the op, or no organization is available (forbidden, scope_missing, no_organization).","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"404":{"description":"Unknown op or record (unknown_op, not_found).","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"409":{"description":"The request conflicts with the current state.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"422":{"description":"The input is well-formed but cannot be applied.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"429":{"description":"Rate limited. Retry after Retry-After seconds.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"500":{"description":"Internal error. Retry and quote request_id.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}}},"/api/v1/resume_subscription":{"post":{"operationId":"resume_subscription","summary":"Resume subscription","description":"Undo a cancellation that has not taken effect yet, so the plan renews as before. Nothing is charged until the normal renewal date.","tags":["billing"],"x-read-only":false,"x-admin-only":true,"x-min-role":"admin","x-scope":"billing:write","requestBody":{"required":false,"content":{"application/json":{"schema":{"type":"object","properties":{}}}}},"responses":{"200":{"description":"The op's output.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"400":{"description":"Invalid JSON or input that fails the schema (invalid_json, invalid_input).","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"401":{"description":"Missing or invalid credential (unauthorized, invalid_key, invalid_token).","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"402":{"description":"Payment failed or a plan limit was reached; carries checkout_url and the paid plans.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"403":{"description":"The credential's role or scopes do not allow the op, or no organization is available (forbidden, scope_missing, no_organization).","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"404":{"description":"Unknown op or record (unknown_op, not_found).","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"409":{"description":"The request conflicts with the current state.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"422":{"description":"The input is well-formed but cannot be applied.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"429":{"description":"Rate limited. Retry after Retry-After seconds.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"500":{"description":"Internal error. Retry and quote request_id.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}}},"/api/v1/set_budget_cap":{"post":{"operationId":"set_budget_cap","summary":"Set budget cap","description":"Set this organization's monthly overage budget cap in US dollars: usage past the plan's allowance is billed up to this amount, then non-critical sends (campaigns, bulk sends) stop until the next period. null restores the default (2x the plan price). Free has no overage and ignores it. Owners and admins; a human decision, so only when asked.","tags":["billing"],"x-read-only":false,"x-admin-only":true,"x-min-role":"admin","x-scope":"billing:write","requestBody":{"required":false,"content":{"application/json":{"schema":{"type":"object","properties":{"amount":{"anyOf":[{"type":"number","minimum":0,"maximum":1000000},{"type":"null"}],"description":"Dollars per billing period, or null for the default."}},"required":["amount"]}}}},"responses":{"200":{"description":"The op's output.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"400":{"description":"Invalid JSON or input that fails the schema (invalid_json, invalid_input).","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"401":{"description":"Missing or invalid credential (unauthorized, invalid_key, invalid_token).","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"402":{"description":"Payment failed or a plan limit was reached; carries checkout_url and the paid plans.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"403":{"description":"The credential's role or scopes do not allow the op, or no organization is available (forbidden, scope_missing, no_organization).","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"404":{"description":"Unknown op or record (unknown_op, not_found).","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"409":{"description":"The request conflicts with the current state.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"422":{"description":"The input is well-formed but cannot be applied.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"429":{"description":"Rate limited. Retry after Retry-After seconds.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"500":{"description":"Internal error. Retry and quote request_id.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}}},"/api/v1/claim_checkout":{"post":{"operationId":"claim_checkout","summary":"Claim checkout","description":"Attach a checkout paid before signup (create_checkout_link without a credential) to this organization, by its session_id (cs_…). Usually automatic: returning from Stripe, or signing up with the email used at checkout, claims it. Call it when a human paid first and the plan has not appeared. Returns {outcome: claimed | already_yours, billing}.","tags":["billing"],"x-read-only":false,"x-admin-only":true,"x-min-role":"admin","x-scope":"billing:write","requestBody":{"required":false,"content":{"application/json":{"schema":{"type":"object","properties":{"session_id":{"type":"string","pattern":"^cs_(live|test)_[A-Za-z0-9]+$","description":"The Checkout Session id create_checkout_link returned (cs_live_… or cs_test_…)."}},"required":["session_id"]}}}},"responses":{"200":{"description":"The op's output.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"400":{"description":"Invalid JSON or input that fails the schema (invalid_json, invalid_input).","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"401":{"description":"Missing or invalid credential (unauthorized, invalid_key, invalid_token).","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"402":{"description":"Payment failed or a plan limit was reached; carries checkout_url and the paid plans.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"403":{"description":"The credential's role or scopes do not allow the op, or no organization is available (forbidden, scope_missing, no_organization).","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"404":{"description":"Unknown op or record (unknown_op, not_found).","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"409":{"description":"The request conflicts with the current state.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"422":{"description":"The input is well-formed but cannot be applied.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"429":{"description":"Rate limited. Retry after Retry-After seconds.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"500":{"description":"Internal error. Retry and quote request_id.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}}},"/api/v1/create_billing_portal_link":{"post":{"operationId":"create_billing_portal_link","summary":"Create billing portal link","description":"A private Stripe page where a human downloads invoices, updates the card or billing details, or cancels. The link is for a human and expires after a few minutes of inactivity; never open it on your own.","tags":["billing"],"x-read-only":false,"x-admin-only":true,"x-min-role":"admin","x-scope":"billing:write","requestBody":{"required":false,"content":{"application/json":{"schema":{"type":"object","properties":{}}}}},"responses":{"200":{"description":"The op's output.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"400":{"description":"Invalid JSON or input that fails the schema (invalid_json, invalid_input).","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"401":{"description":"Missing or invalid credential (unauthorized, invalid_key, invalid_token).","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"402":{"description":"Payment failed or a plan limit was reached; carries checkout_url and the paid plans.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"403":{"description":"The credential's role or scopes do not allow the op, or no organization is available (forbidden, scope_missing, no_organization).","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"404":{"description":"Unknown op or record (unknown_op, not_found).","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"409":{"description":"The request conflicts with the current state.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"422":{"description":"The input is well-formed but cannot be applied.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"429":{"description":"Rate limited. Retry after Retry-After seconds.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"500":{"description":"Internal error. Retry and quote request_id.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}}},"/api/v1/get_billing_link":{"post":{"operationId":"get_billing_link","summary":"Get billing link","description":"The Stripe customer portal for a human: invoices, card and billing details, plan change and cancellation. The same as create_billing_portal_link, under the name every Meter product uses (POST /api/v1/billing/portal, `wabi billing portal`). The link expires after a few minutes of inactivity; never open it on your own.","tags":["billing"],"x-read-only":false,"x-admin-only":true,"x-min-role":"admin","x-scope":"billing:write","requestBody":{"required":false,"content":{"application/json":{"schema":{"type":"object","properties":{}}}}},"responses":{"200":{"description":"The op's output.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"400":{"description":"Invalid JSON or input that fails the schema (invalid_json, invalid_input).","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"401":{"description":"Missing or invalid credential (unauthorized, invalid_key, invalid_token).","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"402":{"description":"Payment failed or a plan limit was reached; carries checkout_url and the paid plans.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"403":{"description":"The credential's role or scopes do not allow the op, or no organization is available (forbidden, scope_missing, no_organization).","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"404":{"description":"Unknown op or record (unknown_op, not_found).","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"409":{"description":"The request conflicts with the current state.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"422":{"description":"The input is well-formed but cannot be applied.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"429":{"description":"Rate limited. Retry after Retry-After seconds.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"500":{"description":"Internal error. Retry and quote request_id.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}}},"/api/v1/list_feedback":{"post":{"operationId":"list_feedback","summary":"List feature requests and issues","description":"The Wabi feedback board: feature requests every customer can see, plus your own issue reports (and ones the team published), with status and upvotes, most upvoted first. Each item says whether your organization voted for it or filed it. Call it before request_feature or report_issue to find an existing item to upvote instead of filing a duplicate, or when the human asks what is planned. Works without a credential (public items only).","tags":["feedback"],"x-read-only":true,"x-admin-only":false,"x-min-role":"viewer","x-scope":"feedback:read","security":[{},{"bearerAuth":[]}],"requestBody":{"required":false,"content":{"application/json":{"schema":{"type":"object","properties":{"kind":{"default":"all","description":"feature = feature requests, issue = bug reports (yours, and ones the team published).","type":"string","enum":["feature","issue","all"]},"status":{"default":"active","description":"active = open, planned, in_progress.","type":"string","enum":["active","all","open","planned","in_progress","done","declined","duplicate"]},"sort":{"default":"top","description":"top = most upvoted, new = most recent, recent_activity = latest vote, comment or status change.","type":"string","enum":["top","new","recent_activity"]},"q":{"description":"Words to find in the title.","type":"string","maxLength":100},"mine":{"default":false,"description":"Only items your organization filed.","type":"boolean"},"limit":{"default":20,"description":"Page size, at most 100.","type":"integer","minimum":1,"maximum":100},"offset":{"default":0,"type":"integer","minimum":0,"maximum":9007199254740991},"cursor":{"description":"next_cursor from the previous page (same as offset).","type":"string","pattern":"^\\d+$"}}}}}},"responses":{"200":{"description":"The op's output.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"400":{"description":"Invalid JSON or input that fails the schema (invalid_json, invalid_input).","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"401":{"description":"Missing or invalid credential (unauthorized, invalid_key, invalid_token).","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"402":{"description":"Payment failed or a plan limit was reached; carries checkout_url and the paid plans.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"403":{"description":"The credential's role or scopes do not allow the op, or no organization is available (forbidden, scope_missing, no_organization).","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"404":{"description":"Unknown op or record (unknown_op, not_found).","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"409":{"description":"The request conflicts with the current state.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"422":{"description":"The input is well-formed but cannot be applied.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"429":{"description":"Rate limited. Retry after Retry-After seconds.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"500":{"description":"Internal error. Retry and quote request_id.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}},"get":{"operationId":"list_feedback_get","summary":"List feature requests and issues (GET)","description":"Read-only ops also answer GET with the input as URL-encoded JSON in ?input=. The Wabi feedback board: feature requests every customer can see, plus your own issue reports (and ones the team published), with status and upvotes, most upvoted first. Each item says whether your organization voted for it or filed it. Call it before request_feature or report_issue to find an existing item to upvote instead of filing a duplicate, or when the human asks what is planned. Works without a credential (public items only).","tags":["feedback"],"security":[{},{"bearerAuth":[]}],"parameters":[{"name":"input","in":"query","required":false,"description":"The op's input as URL-encoded JSON.","schema":{"type":"string"}}],"responses":{"200":{"description":"The op's output.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"400":{"description":"Invalid JSON or input that fails the schema (invalid_json, invalid_input).","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"401":{"description":"Missing or invalid credential (unauthorized, invalid_key, invalid_token).","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"402":{"description":"Payment failed or a plan limit was reached; carries checkout_url and the paid plans.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"403":{"description":"The credential's role or scopes do not allow the op, or no organization is available (forbidden, scope_missing, no_organization).","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"404":{"description":"Unknown op or record (unknown_op, not_found).","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"409":{"description":"The request conflicts with the current state.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"422":{"description":"The input is well-formed but cannot be applied.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"429":{"description":"Rate limited. Retry after Retry-After seconds.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"500":{"description":"Internal error. Retry and quote request_id.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}}},"/api/v1/get_feedback":{"post":{"operationId":"get_feedback","summary":"Get a feature request or issue","description":"One feedback item with its status, upvotes, comments (oldest first; official answers from the Wabi team are marked `official`) and its timeline of status changes with the team's notes. Your own issues include the context you attached.","tags":["feedback"],"x-read-only":true,"x-admin-only":false,"x-min-role":"viewer","x-scope":"feedback:read","security":[{},{"bearerAuth":[]}],"requestBody":{"required":false,"content":{"application/json":{"schema":{"type":"object","properties":{"id":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991,"description":"The item's id from list_feedback, request_feature or report_issue (e.g. 42)."}},"required":["id"]}}}},"responses":{"200":{"description":"The op's output.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"400":{"description":"Invalid JSON or input that fails the schema (invalid_json, invalid_input).","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"401":{"description":"Missing or invalid credential (unauthorized, invalid_key, invalid_token).","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"402":{"description":"Payment failed or a plan limit was reached; carries checkout_url and the paid plans.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"403":{"description":"The credential's role or scopes do not allow the op, or no organization is available (forbidden, scope_missing, no_organization).","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"404":{"description":"Unknown op or record (unknown_op, not_found).","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"409":{"description":"The request conflicts with the current state.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"422":{"description":"The input is well-formed but cannot be applied.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"429":{"description":"Rate limited. Retry after Retry-After seconds.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"500":{"description":"Internal error. Retry and quote request_id.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}},"get":{"operationId":"get_feedback_get","summary":"Get a feature request or issue (GET)","description":"Read-only ops also answer GET with the input as URL-encoded JSON in ?input=. One feedback item with its status, upvotes, comments (oldest first; official answers from the Wabi team are marked `official`) and its timeline of status changes with the team's notes. Your own issues include the context you attached.","tags":["feedback"],"security":[{},{"bearerAuth":[]}],"parameters":[{"name":"input","in":"query","required":false,"description":"The op's input as URL-encoded JSON.","schema":{"type":"string"}}],"responses":{"200":{"description":"The op's output.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"400":{"description":"Invalid JSON or input that fails the schema (invalid_json, invalid_input).","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"401":{"description":"Missing or invalid credential (unauthorized, invalid_key, invalid_token).","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"402":{"description":"Payment failed or a plan limit was reached; carries checkout_url and the paid plans.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"403":{"description":"The credential's role or scopes do not allow the op, or no organization is available (forbidden, scope_missing, no_organization).","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"404":{"description":"Unknown op or record (unknown_op, not_found).","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"409":{"description":"The request conflicts with the current state.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"422":{"description":"The input is well-formed but cannot be applied.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"429":{"description":"Rate limited. Retry after Retry-After seconds.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"500":{"description":"Internal error. Retry and quote request_id.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}}},"/api/v1/list_my_feedback":{"post":{"operationId":"list_my_feedback","summary":"List my feedback and subscriptions","description":"What your organization filed (every status), the items you get email about (filed, upvoted, commented, followed) with whether you muted them, your organization's review, and whether feedback email reaches you. Use it to follow up on earlier reports.","tags":["feedback"],"x-read-only":true,"x-admin-only":false,"x-min-role":"viewer","x-scope":"feedback:read","requestBody":{"required":false,"content":{"application/json":{"schema":{"type":"object","properties":{}}}}},"responses":{"200":{"description":"The op's output.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"400":{"description":"Invalid JSON or input that fails the schema (invalid_json, invalid_input).","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"401":{"description":"Missing or invalid credential (unauthorized, invalid_key, invalid_token).","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"402":{"description":"Payment failed or a plan limit was reached; carries checkout_url and the paid plans.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"403":{"description":"The credential's role or scopes do not allow the op, or no organization is available (forbidden, scope_missing, no_organization).","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"404":{"description":"Unknown op or record (unknown_op, not_found).","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"409":{"description":"The request conflicts with the current state.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"422":{"description":"The input is well-formed but cannot be applied.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"429":{"description":"Rate limited. Retry after Retry-After seconds.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"500":{"description":"Internal error. Retry and quote request_id.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}},"get":{"operationId":"list_my_feedback_get","summary":"List my feedback and subscriptions (GET)","description":"Read-only ops also answer GET with the input as URL-encoded JSON in ?input=. What your organization filed (every status), the items you get email about (filed, upvoted, commented, followed) with whether you muted them, your organization's review, and whether feedback email reaches you. Use it to follow up on earlier reports.","tags":["feedback"],"parameters":[{"name":"input","in":"query","required":false,"description":"The op's input as URL-encoded JSON.","schema":{"type":"string"}}],"responses":{"200":{"description":"The op's output.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"400":{"description":"Invalid JSON or input that fails the schema (invalid_json, invalid_input).","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"401":{"description":"Missing or invalid credential (unauthorized, invalid_key, invalid_token).","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"402":{"description":"Payment failed or a plan limit was reached; carries checkout_url and the paid plans.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"403":{"description":"The credential's role or scopes do not allow the op, or no organization is available (forbidden, scope_missing, no_organization).","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"404":{"description":"Unknown op or record (unknown_op, not_found).","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"409":{"description":"The request conflicts with the current state.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"422":{"description":"The input is well-formed but cannot be applied.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"429":{"description":"Rate limited. Retry after Retry-After seconds.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"500":{"description":"Internal error. Retry and quote request_id.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}}},"/api/v1/request_feature":{"post":{"operationId":"request_feature","summary":"Request a feature","description":"Files a feature request on the Wabi board and upvotes it for your organization. Use it when the human wishes Wabi did something it cannot do yet (an integration, an op, a Meta feature, a dashboard view). It checks for duplicates first: an identical request gets your vote instead, and when likely matches exist nothing is filed and `similar` lists them (filed: false): upvote_feedback the match, or call again with force: true if yours is different. 10 new items per organization a day. The person behind the call gets a thank-you email and one at every status change. Feature requests and comments are public (never who wrote them beyond a first name): no API keys, message content or customer data.","tags":["feedback"],"x-read-only":false,"x-admin-only":false,"x-min-role":"viewer","x-scope":"feedback:write","requestBody":{"required":false,"content":{"application/json":{"schema":{"type":"object","properties":{"title":{"type":"string","minLength":3,"maxLength":140,"description":"What you want, in one line."},"details":{"default":"","description":"Why you need it and what you are building; concrete examples help it get planned.","type":"string","maxLength":5000},"body":{"description":"Alias of details.","type":"string","maxLength":5000},"force":{"default":false,"description":"File even when similar items exist.","type":"boolean"}},"required":["title"]}}}},"responses":{"200":{"description":"The op's output.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"400":{"description":"Invalid JSON or input that fails the schema (invalid_json, invalid_input).","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"401":{"description":"Missing or invalid credential (unauthorized, invalid_key, invalid_token).","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"402":{"description":"Payment failed or a plan limit was reached; carries checkout_url and the paid plans.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"403":{"description":"The credential's role or scopes do not allow the op, or no organization is available (forbidden, scope_missing, no_organization).","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"404":{"description":"Unknown op or record (unknown_op, not_found).","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"409":{"description":"The request conflicts with the current state.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"422":{"description":"The input is well-formed but cannot be applied.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"429":{"description":"Rate limited. Retry after Retry-After seconds.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"500":{"description":"Internal error. Retry and quote request_id.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}}},"/api/v1/report_issue":{"post":{"operationId":"report_issue","summary":"Report an issue","description":"Reports a problem with Wabi itself: a failing or wrong call (pass the request_id from the error or the X-Request-Id header, and the op), a message that was not delivered or delivered twice, a webhook that never arrived, a template that will not submit, an agent that misbehaved, a docs error. Attach context (account_id, conversation_id, message_id or wamid, template, Meta's error code, the error) so the team can reproduce it; ids are checked against your organization. Issues are private: only your organization and the Wabi team see them, and the team may publish a sanitized title so others can upvote it. Upvote a matching report from list_feedback (kind issue) instead of filing again; likely duplicates are returned in `similar` with filed: false unless force: true. 10 new items per organization a day. The reporter gets an email with what was captured and one at every status change.","tags":["feedback"],"x-read-only":false,"x-admin-only":false,"x-min-role":"viewer","x-scope":"feedback:write","requestBody":{"required":false,"content":{"application/json":{"schema":{"type":"object","properties":{"title":{"type":"string","minLength":3,"maxLength":140,"description":"What is wrong, in one line."},"details":{"default":"","description":"What you did, what you expected and what happened (status, error code, format).","type":"string","maxLength":5000},"body":{"description":"Alias of details.","type":"string","maxLength":5000},"request_id":{"description":"The request_id of the failing call (shortcut for context.request_id).","type":"string","maxLength":128},"op":{"description":"The op the failing call used, e.g. send_message (shortcut for context.op).","type":"string","maxLength":80},"context":{"description":"Wabi identifiers for what failed: request_id, op, account_id, conversation_id, message_id, wamid, template, meta_error_code, status, error_code, error, client. Never shown publicly; at most 128 KB.","type":"object","properties":{"request_id":{"description":"The request_id of the failing call (X-Request-Id header, or request_id in the error).","type":"string","pattern":"^[A-Za-z0-9._:-]{1,128}$"},"op":{"description":"The op or endpoint that failed, e.g. send_message.","type":"string","pattern":"^[a-z][a-z0-9_]{1,79}$"},"account_id":{"description":"The WhatsApp account (whatsapp_accounts.id) the problem is in; must be one of your organization's.","type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"conversation_id":{"description":"The conversation involved; must be one of your organization's.","type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"message_id":{"description":"The message involved (our id, not the wamid); must be one of your organization's.","type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"wamid":{"description":"Meta's message id (wamid.…) when you have no message_id.","type":"string","maxLength":200},"template":{"description":"The template name involved.","type":"string","maxLength":512},"locale":{"description":"The language involved, e.g. pt_BR.","type":"string","pattern":"^[A-Za-z]{2,8}([-_][A-Za-z0-9]{1,8})*$"},"meta_error_code":{"description":"Meta's error code, when Meta returned one (e.g. 131047).","type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"status":{"description":"The HTTP status the call returned.","type":"integer","minimum":100,"maximum":599},"error_code":{"description":"The error code, e.g. outside_service_window.","type":"string","maxLength":100},"error":{"description":"The error message as the client saw it (no keys or customer strings).","type":"string","maxLength":2000},"client":{"description":"Client and version, e.g. wabi-cli/0.5.0 or Claude Code.","type":"string","maxLength":100},"version":{"type":"string","maxLength":50},"extra":{"description":"Anything else that helps reproduce it (no secrets).","type":"object","propertyNames":{"type":"string"},"additionalProperties":{}}},"additionalProperties":false},"force":{"default":false,"description":"File even when similar reports exist.","type":"boolean"}},"required":["title"]}}}},"responses":{"200":{"description":"The op's output.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"400":{"description":"Invalid JSON or input that fails the schema (invalid_json, invalid_input).","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"401":{"description":"Missing or invalid credential (unauthorized, invalid_key, invalid_token).","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"402":{"description":"Payment failed or a plan limit was reached; carries checkout_url and the paid plans.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"403":{"description":"The credential's role or scopes do not allow the op, or no organization is available (forbidden, scope_missing, no_organization).","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"404":{"description":"Unknown op or record (unknown_op, not_found).","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"409":{"description":"The request conflicts with the current state.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"422":{"description":"The input is well-formed but cannot be applied.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"429":{"description":"Rate limited. Retry after Retry-After seconds.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"500":{"description":"Internal error. Retry and quote request_id.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}}},"/api/v1/upvote_feedback":{"post":{"operationId":"upvote_feedback","summary":"Upvote a feature request or issue","description":"Adds your organization's upvote to a feature request or issue (\"me too\"); votes decide what gets built and fixed first, and you get an email when its status changes. Idempotent: one vote per organization. A vote on a duplicate goes to the original. Returns the item with its new vote count.","tags":["feedback"],"x-read-only":false,"x-admin-only":false,"x-min-role":"viewer","x-scope":"feedback:write","requestBody":{"required":false,"content":{"application/json":{"schema":{"type":"object","properties":{"id":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991,"description":"The item's id from list_feedback, request_feature or report_issue (e.g. 42)."}},"required":["id"]}}}},"responses":{"200":{"description":"The op's output.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"400":{"description":"Invalid JSON or input that fails the schema (invalid_json, invalid_input).","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"401":{"description":"Missing or invalid credential (unauthorized, invalid_key, invalid_token).","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"402":{"description":"Payment failed or a plan limit was reached; carries checkout_url and the paid plans.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"403":{"description":"The credential's role or scopes do not allow the op, or no organization is available (forbidden, scope_missing, no_organization).","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"404":{"description":"Unknown op or record (unknown_op, not_found).","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"409":{"description":"The request conflicts with the current state.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"422":{"description":"The input is well-formed but cannot be applied.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"429":{"description":"Rate limited. Retry after Retry-After seconds.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"500":{"description":"Internal error. Retry and quote request_id.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}}},"/api/v1/remove_feedback_vote":{"post":{"operationId":"remove_feedback_vote","summary":"Remove an upvote","description":"Takes back your organization's upvote on a feature request or issue, and stops its emails unless you filed or commented on it. Returns the item with its new vote count.","tags":["feedback"],"x-read-only":false,"x-admin-only":false,"x-min-role":"viewer","x-scope":"feedback:write","requestBody":{"required":false,"content":{"application/json":{"schema":{"type":"object","properties":{"id":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991,"description":"The item's id from list_feedback, request_feature or report_issue (e.g. 42)."}},"required":["id"]}}}},"responses":{"200":{"description":"The op's output.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"400":{"description":"Invalid JSON or input that fails the schema (invalid_json, invalid_input).","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"401":{"description":"Missing or invalid credential (unauthorized, invalid_key, invalid_token).","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"402":{"description":"Payment failed or a plan limit was reached; carries checkout_url and the paid plans.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"403":{"description":"The credential's role or scopes do not allow the op, or no organization is available (forbidden, scope_missing, no_organization).","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"404":{"description":"Unknown op or record (unknown_op, not_found).","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"409":{"description":"The request conflicts with the current state.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"422":{"description":"The input is well-formed but cannot be applied.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"429":{"description":"Rate limited. Retry after Retry-After seconds.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"500":{"description":"Internal error. Retry and quote request_id.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}}},"/api/v1/comment_on_feedback":{"post":{"operationId":"comment_on_feedback","summary":"Comment on a feature request or issue","description":"Adds context to an existing feature request or issue: your use case, another failing request, a workaround. Prefer it (with upvote_feedback) over filing a near-duplicate. You then get emails about the item; its author gets a daily digest of new comments. 50 comments per organization a day. Feature requests and comments are public (never who wrote them beyond a first name): no API keys, message content or customer data.","tags":["feedback"],"x-read-only":false,"x-admin-only":false,"x-min-role":"viewer","x-scope":"feedback:write","requestBody":{"required":false,"content":{"application/json":{"schema":{"type":"object","properties":{"id":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991,"description":"The item's id from list_feedback, request_feature or report_issue (e.g. 42)."},"body":{"type":"string","minLength":1,"maxLength":5000,"description":"The comment."}},"required":["id","body"]}}}},"responses":{"200":{"description":"The op's output.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"400":{"description":"Invalid JSON or input that fails the schema (invalid_json, invalid_input).","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"401":{"description":"Missing or invalid credential (unauthorized, invalid_key, invalid_token).","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"402":{"description":"Payment failed or a plan limit was reached; carries checkout_url and the paid plans.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"403":{"description":"The credential's role or scopes do not allow the op, or no organization is available (forbidden, scope_missing, no_organization).","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"404":{"description":"Unknown op or record (unknown_op, not_found).","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"409":{"description":"The request conflicts with the current state.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"422":{"description":"The input is well-formed but cannot be applied.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"429":{"description":"Rate limited. Retry after Retry-After seconds.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"500":{"description":"Internal error. Retry and quote request_id.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}}},"/api/v1/set_feedback_subscription":{"post":{"operationId":"set_feedback_subscription","summary":"Start or stop feedback emails","description":"With id: start or stop emails about one feature request or issue. Without id: turn every feedback email (thank-yous, status changes, replies) on or off for the person behind this credential. Lifecycle and product emails are separate.","tags":["feedback"],"x-read-only":false,"x-admin-only":false,"x-min-role":"viewer","x-scope":"feedback:write","requestBody":{"required":false,"content":{"application/json":{"schema":{"type":"object","properties":{"id":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991,"description":"The item's id from list_feedback, request_feature or report_issue (e.g. 42)."},"subscribed":{"type":"boolean","description":"true to get emails, false to stop them."}},"required":["subscribed"]}}}},"responses":{"200":{"description":"The op's output.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"400":{"description":"Invalid JSON or input that fails the schema (invalid_json, invalid_input).","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"401":{"description":"Missing or invalid credential (unauthorized, invalid_key, invalid_token).","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"402":{"description":"Payment failed or a plan limit was reached; carries checkout_url and the paid plans.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"403":{"description":"The credential's role or scopes do not allow the op, or no organization is available (forbidden, scope_missing, no_organization).","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"404":{"description":"Unknown op or record (unknown_op, not_found).","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"409":{"description":"The request conflicts with the current state.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"422":{"description":"The input is well-formed but cannot be applied.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"429":{"description":"Rate limited. Retry after Retry-After seconds.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"500":{"description":"Internal error. Retry and quote request_id.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}}},"/api/v1/submit_review":{"post":{"operationId":"submit_review","summary":"Post or edit a review","description":"Posts your organization's public review of Wabi (1–5 stars, what you like, what you don't, what you use it for), or edits it (once an hour; earlier versions are kept). Ask the human for the rating and words; never invent a review or post one they did not approve. It publishes on /reviews right away unless an automated check holds it for a quick look (new accounts, links, profanity). marketing_consent: true lets Meter quote it. The reviewer gets a thank-you email and one when the team replies.","tags":["feedback"],"x-read-only":false,"x-admin-only":false,"x-min-role":"member","x-scope":"feedback:write","requestBody":{"required":false,"content":{"application/json":{"schema":{"type":"object","properties":{"rating":{"type":"integer","minimum":1,"maximum":5,"description":"1 (poor) to 5 (excellent)."},"title":{"default":"","description":"One-line summary.","type":"string","maxLength":120},"body":{"default":"","description":"The review.","type":"string","maxLength":2000},"likes":{"default":"","description":"What works well.","type":"string","maxLength":1000},"dislikes":{"default":"","description":"What should be better.","type":"string","maxLength":1000},"use_case":{"default":"","description":"What you use Wabi for.","type":"string","maxLength":200},"display_name":{"description":"Name shown with the review; defaults to your first name.","type":"string","maxLength":60},"display_company":{"description":"Company shown with the review, if any.","type":"string","maxLength":80},"marketing_consent":{"default":false,"description":"May Meter quote this review on the site and in marketing.","type":"boolean"}},"required":["rating"]}}}},"responses":{"200":{"description":"The op's output.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"400":{"description":"Invalid JSON or input that fails the schema (invalid_json, invalid_input).","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"401":{"description":"Missing or invalid credential (unauthorized, invalid_key, invalid_token).","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"402":{"description":"Payment failed or a plan limit was reached; carries checkout_url and the paid plans.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"403":{"description":"The credential's role or scopes do not allow the op, or no organization is available (forbidden, scope_missing, no_organization).","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"404":{"description":"Unknown op or record (unknown_op, not_found).","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"409":{"description":"The request conflicts with the current state.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"422":{"description":"The input is well-formed but cannot be applied.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"429":{"description":"Rate limited. Retry after Retry-After seconds.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"500":{"description":"Internal error. Retry and quote request_id.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}}},"/api/v1/list_reviews":{"post":{"operationId":"list_reviews","summary":"List reviews","description":"Published reviews of Wabi with the aggregate (average rating, count and distribution) and the team's responses. Works without a credential.","tags":["feedback"],"x-read-only":true,"x-admin-only":false,"x-min-role":"viewer","x-scope":"feedback:read","security":[{},{"bearerAuth":[]}],"requestBody":{"required":false,"content":{"application/json":{"schema":{"type":"object","properties":{"sort":{"default":"newest","description":"helpful = most detailed first.","type":"string","enum":["newest","helpful","highest","lowest"]},"rating":{"description":"Only reviews with this rating.","type":"integer","minimum":1,"maximum":5},"status":{"default":"published","description":"Wabi team only: held or hidden reviews too.","type":"string","enum":["published","pending","hidden","all"]},"limit":{"default":20,"type":"integer","minimum":1,"maximum":100},"offset":{"default":0,"type":"integer","minimum":0,"maximum":9007199254740991}}}}}},"responses":{"200":{"description":"The op's output.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"400":{"description":"Invalid JSON or input that fails the schema (invalid_json, invalid_input).","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"401":{"description":"Missing or invalid credential (unauthorized, invalid_key, invalid_token).","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"402":{"description":"Payment failed or a plan limit was reached; carries checkout_url and the paid plans.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"403":{"description":"The credential's role or scopes do not allow the op, or no organization is available (forbidden, scope_missing, no_organization).","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"404":{"description":"Unknown op or record (unknown_op, not_found).","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"409":{"description":"The request conflicts with the current state.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"422":{"description":"The input is well-formed but cannot be applied.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"429":{"description":"Rate limited. Retry after Retry-After seconds.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"500":{"description":"Internal error. Retry and quote request_id.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}},"get":{"operationId":"list_reviews_get","summary":"List reviews (GET)","description":"Read-only ops also answer GET with the input as URL-encoded JSON in ?input=. Published reviews of Wabi with the aggregate (average rating, count and distribution) and the team's responses. Works without a credential.","tags":["feedback"],"security":[{},{"bearerAuth":[]}],"parameters":[{"name":"input","in":"query","required":false,"description":"The op's input as URL-encoded JSON.","schema":{"type":"string"}}],"responses":{"200":{"description":"The op's output.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"400":{"description":"Invalid JSON or input that fails the schema (invalid_json, invalid_input).","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"401":{"description":"Missing or invalid credential (unauthorized, invalid_key, invalid_token).","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"402":{"description":"Payment failed or a plan limit was reached; carries checkout_url and the paid plans.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"403":{"description":"The credential's role or scopes do not allow the op, or no organization is available (forbidden, scope_missing, no_organization).","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"404":{"description":"Unknown op or record (unknown_op, not_found).","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"409":{"description":"The request conflicts with the current state.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"422":{"description":"The input is well-formed but cannot be applied.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"429":{"description":"Rate limited. Retry after Retry-After seconds.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"500":{"description":"Internal error. Retry and quote request_id.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}}},"/api/v1/update_feedback":{"post":{"operationId":"update_feedback","summary":"Update feedback (staff)","description":"Wabi team only. Moves an item through open → planned → in_progress → done, or declined, or duplicate (with duplicate_of: votes and subscribers move to the original), with a note every subscriber gets by email. Also publishes or hides an issue (visibility, with a sanitized public_title) and links the GitHub issue or PR (external_ref).","tags":["feedback"],"x-read-only":false,"x-admin-only":false,"x-min-role":"member","x-scope":"feedback:write","requestBody":{"required":false,"content":{"application/json":{"schema":{"type":"object","properties":{"id":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991,"description":"The item's id from list_feedback, request_feature or report_issue (e.g. 42)."},"status":{"type":"string","enum":["open","planned","in_progress","done","declined","duplicate"]},"note":{"description":"Why, or what shipped and how to use it; emailed with the status change.","type":"string","maxLength":5000},"duplicate_of":{"description":"The original, with status duplicate.","type":"integer","exclusiveMinimum":0,"maximum":9007199254740991},"external_ref":{"description":"GitHub issue or PR URL; empty clears it.","anyOf":[{"type":"string","maxLength":500,"format":"uri"},{"type":"string","const":""}]},"visibility":{"type":"string","enum":["public","private"]},"public_title":{"description":"Sanitized title others see for a published issue.","type":"string","maxLength":140}},"required":["id"]}}}},"responses":{"200":{"description":"The op's output.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"400":{"description":"Invalid JSON or input that fails the schema (invalid_json, invalid_input).","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"401":{"description":"Missing or invalid credential (unauthorized, invalid_key, invalid_token).","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"402":{"description":"Payment failed or a plan limit was reached; carries checkout_url and the paid plans.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"403":{"description":"The credential's role or scopes do not allow the op, or no organization is available (forbidden, scope_missing, no_organization).","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"404":{"description":"Unknown op or record (unknown_op, not_found).","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"409":{"description":"The request conflicts with the current state.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"422":{"description":"The input is well-formed but cannot be applied.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"429":{"description":"Rate limited. Retry after Retry-After seconds.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"500":{"description":"Internal error. Retry and quote request_id.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}}},"/api/v1/respond_to_feedback":{"post":{"operationId":"respond_to_feedback","summary":"Respond officially (staff)","description":"Wabi team only. Posts an official response on an item (emailed to every subscriber), optionally changing its status in the same call.","tags":["feedback"],"x-read-only":false,"x-admin-only":false,"x-min-role":"member","x-scope":"feedback:write","requestBody":{"required":false,"content":{"application/json":{"schema":{"type":"object","properties":{"id":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991,"description":"The item's id from list_feedback, request_feature or report_issue (e.g. 42)."},"body":{"type":"string","minLength":1,"maxLength":5000,"description":"The response, signed as the Wabi team."},"status":{"type":"string","enum":["open","planned","in_progress","done","declined","duplicate"]},"note":{"type":"string","maxLength":5000},"duplicate_of":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991},"external_ref":{"type":"string","maxLength":500,"format":"uri"}},"required":["id","body"]}}}},"responses":{"200":{"description":"The op's output.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"400":{"description":"Invalid JSON or input that fails the schema (invalid_json, invalid_input).","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"401":{"description":"Missing or invalid credential (unauthorized, invalid_key, invalid_token).","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"402":{"description":"Payment failed or a plan limit was reached; carries checkout_url and the paid plans.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"403":{"description":"The credential's role or scopes do not allow the op, or no organization is available (forbidden, scope_missing, no_organization).","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"404":{"description":"Unknown op or record (unknown_op, not_found).","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"409":{"description":"The request conflicts with the current state.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"422":{"description":"The input is well-formed but cannot be applied.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"429":{"description":"Rate limited. Retry after Retry-After seconds.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"500":{"description":"Internal error. Retry and quote request_id.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}}},"/api/v1/respond_to_review":{"post":{"operationId":"respond_to_review","summary":"Respond to or moderate a review (staff)","description":"Wabi team only. Replies publicly under a review (the reviewer gets an email), and/or hides or publishes it with a reason. Never hide a review for being negative.","tags":["feedback"],"x-read-only":false,"x-admin-only":false,"x-min-role":"member","x-scope":"feedback:write","requestBody":{"required":false,"content":{"application/json":{"schema":{"type":"object","properties":{"id":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991,"description":"The review id from list_reviews."},"response":{"type":"string","minLength":1,"maxLength":2000},"status":{"type":"string","enum":["published","hidden","pending"]},"reason":{"description":"Why it is hidden; kept internal.","type":"string","maxLength":300}},"required":["id"]}}}},"responses":{"200":{"description":"The op's output.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"400":{"description":"Invalid JSON or input that fails the schema (invalid_json, invalid_input).","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"401":{"description":"Missing or invalid credential (unauthorized, invalid_key, invalid_token).","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"402":{"description":"Payment failed or a plan limit was reached; carries checkout_url and the paid plans.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"403":{"description":"The credential's role or scopes do not allow the op, or no organization is available (forbidden, scope_missing, no_organization).","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"404":{"description":"Unknown op or record (unknown_op, not_found).","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"409":{"description":"The request conflicts with the current state.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"422":{"description":"The input is well-formed but cannot be applied.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"429":{"description":"Rate limited. Retry after Retry-After seconds.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"500":{"description":"Internal error. Retry and quote request_id.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}}},"/api/v1/get_profile":{"post":{"operationId":"get_profile","summary":"Get my profile","description":"Your own settings, the same in every organization: `locale`, the language the dashboard and every email to you are written in (one of en), or null when you never chose one (the dashboard then follows the browser, emails are English). With an API key, the key creator's profile.","tags":["organization"],"x-read-only":true,"x-admin-only":false,"x-min-role":"viewer","x-scope":"organization:read","requestBody":{"required":false,"content":{"application/json":{"schema":{"type":"object","properties":{}}}}},"responses":{"200":{"description":"The op's output.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"400":{"description":"Invalid JSON or input that fails the schema (invalid_json, invalid_input).","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"401":{"description":"Missing or invalid credential (unauthorized, invalid_key, invalid_token).","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"402":{"description":"Payment failed or a plan limit was reached; carries checkout_url and the paid plans.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"403":{"description":"The credential's role or scopes do not allow the op, or no organization is available (forbidden, scope_missing, no_organization).","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"404":{"description":"Unknown op or record (unknown_op, not_found).","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"409":{"description":"The request conflicts with the current state.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"422":{"description":"The input is well-formed but cannot be applied.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"429":{"description":"Rate limited. Retry after Retry-After seconds.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"500":{"description":"Internal error. Retry and quote request_id.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}},"get":{"operationId":"get_profile_get","summary":"Get my profile (GET)","description":"Read-only ops also answer GET with the input as URL-encoded JSON in ?input=. Your own settings, the same in every organization: `locale`, the language the dashboard and every email to you are written in (one of en), or null when you never chose one (the dashboard then follows the browser, emails are English). With an API key, the key creator's profile.","tags":["organization"],"parameters":[{"name":"input","in":"query","required":false,"description":"The op's input as URL-encoded JSON.","schema":{"type":"string"}}],"responses":{"200":{"description":"The op's output.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"400":{"description":"Invalid JSON or input that fails the schema (invalid_json, invalid_input).","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"401":{"description":"Missing or invalid credential (unauthorized, invalid_key, invalid_token).","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"402":{"description":"Payment failed or a plan limit was reached; carries checkout_url and the paid plans.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"403":{"description":"The credential's role or scopes do not allow the op, or no organization is available (forbidden, scope_missing, no_organization).","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"404":{"description":"Unknown op or record (unknown_op, not_found).","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"409":{"description":"The request conflicts with the current state.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"422":{"description":"The input is well-formed but cannot be applied.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"429":{"description":"Rate limited. Retry after Retry-After seconds.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"500":{"description":"Internal error. Retry and quote request_id.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}}},"/api/v1/update_profile":{"post":{"operationId":"update_profile","summary":"Update my profile","description":"Changes your own settings: `locale` (en) is the language of the dashboard and of every email Wabi sends you; null forgets it. The dashboard's language picker calls this. Returns the profile.","tags":["organization"],"x-read-only":false,"x-admin-only":false,"x-min-role":"viewer","x-scope":"organization:write","requestBody":{"required":false,"content":{"application/json":{"schema":{"type":"object","properties":{"locale":{"anyOf":[{"type":"string","enum":["en"]},{"type":"null"}],"description":"Your language: en, or null for none."}},"required":["locale"]}}}},"responses":{"200":{"description":"The op's output.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"400":{"description":"Invalid JSON or input that fails the schema (invalid_json, invalid_input).","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"401":{"description":"Missing or invalid credential (unauthorized, invalid_key, invalid_token).","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"402":{"description":"Payment failed or a plan limit was reached; carries checkout_url and the paid plans.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"403":{"description":"The credential's role or scopes do not allow the op, or no organization is available (forbidden, scope_missing, no_organization).","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"404":{"description":"Unknown op or record (unknown_op, not_found).","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"409":{"description":"The request conflicts with the current state.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"422":{"description":"The input is well-formed but cannot be applied.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"429":{"description":"Rate limited. Retry after Retry-After seconds.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"500":{"description":"Internal error. Retry and quote request_id.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}}},"/api/v1/get_sandbox":{"post":{"operationId":"get_sandbox","summary":"Get the sandbox","description":"This organization's sandbox: a simulated WhatsApp number every organization gets, for trying messaging, templates, the inbox, AI agents and webhooks without Meta. Creates it on first call. Returns the sandbox account (use account.id wherever an account id is asked for), its phone number (phone_number.id is the sender id for sends), the test recipients you can message, the failure recipient, and an explanation of how the simulator behaves. Call it before sending sandbox messages.","tags":["sandbox"],"x-read-only":true,"x-admin-only":false,"x-min-role":"viewer","x-scope":"sandbox:read","requestBody":{"required":false,"content":{"application/json":{"schema":{"type":"object","properties":{}}}}},"responses":{"200":{"description":"The op's output.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"400":{"description":"Invalid JSON or input that fails the schema (invalid_json, invalid_input).","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"401":{"description":"Missing or invalid credential (unauthorized, invalid_key, invalid_token).","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"402":{"description":"Payment failed or a plan limit was reached; carries checkout_url and the paid plans.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"403":{"description":"The credential's role or scopes do not allow the op, or no organization is available (forbidden, scope_missing, no_organization).","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"404":{"description":"Unknown op or record (unknown_op, not_found).","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"409":{"description":"The request conflicts with the current state.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"422":{"description":"The input is well-formed but cannot be applied.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"429":{"description":"Rate limited. Retry after Retry-After seconds.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"500":{"description":"Internal error. Retry and quote request_id.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}},"get":{"operationId":"get_sandbox_get","summary":"Get the sandbox (GET)","description":"Read-only ops also answer GET with the input as URL-encoded JSON in ?input=. This organization's sandbox: a simulated WhatsApp number every organization gets, for trying messaging, templates, the inbox, AI agents and webhooks without Meta. Creates it on first call. Returns the sandbox account (use account.id wherever an account id is asked for), its phone number (phone_number.id is the sender id for sends), the test recipients you can message, the failure recipient, and an explanation of how the simulator behaves. Call it before sending sandbox messages.","tags":["sandbox"],"parameters":[{"name":"input","in":"query","required":false,"description":"The op's input as URL-encoded JSON.","schema":{"type":"string"}}],"responses":{"200":{"description":"The op's output.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"400":{"description":"Invalid JSON or input that fails the schema (invalid_json, invalid_input).","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"401":{"description":"Missing or invalid credential (unauthorized, invalid_key, invalid_token).","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"402":{"description":"Payment failed or a plan limit was reached; carries checkout_url and the paid plans.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"403":{"description":"The credential's role or scopes do not allow the op, or no organization is available (forbidden, scope_missing, no_organization).","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"404":{"description":"Unknown op or record (unknown_op, not_found).","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"409":{"description":"The request conflicts with the current state.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"422":{"description":"The input is well-formed but cannot be applied.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"429":{"description":"Rate limited. Retry after Retry-After seconds.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"500":{"description":"Internal error. Retry and quote request_id.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}}},"/api/v1/simulate_inbound_message":{"post":{"operationId":"simulate_inbound_message","summary":"Simulate an inbound message","description":"Make a sandbox test customer send a WhatsApp text to this organization's sandbox number, as if they typed it on their phone. It arrives through the same webhook pipeline as real Meta traffic (inbox, AI agents, automations, your webhooks) within seconds, and opens that customer's 24-hour window so free-form replies are allowed. Use it to test an agent or a flow without a phone. Returns the raw provider event id and the simulated message's wamid.","tags":["sandbox"],"x-read-only":false,"x-admin-only":false,"x-min-role":"member","x-scope":"sandbox:write","requestBody":{"required":false,"content":{"application/json":{"schema":{"type":"object","properties":{"from":{"default":"15550100001","description":"Test recipient WhatsApp id sending the message (get_sandbox → test_recipients). Default 15550100001.","type":"string","enum":["15550100000","15550100001","15550100002","15550100003","15550100004","15550100005"]},"text":{"type":"string","minLength":1,"maxLength":4096,"description":"The message text."},"name":{"description":"The customer's WhatsApp profile name. Default: the test recipient's name.","type":"string","minLength":1,"maxLength":100}},"required":["text"]}}}},"responses":{"200":{"description":"The op's output.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"400":{"description":"Invalid JSON or input that fails the schema (invalid_json, invalid_input).","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"401":{"description":"Missing or invalid credential (unauthorized, invalid_key, invalid_token).","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"402":{"description":"Payment failed or a plan limit was reached; carries checkout_url and the paid plans.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"403":{"description":"The credential's role or scopes do not allow the op, or no organization is available (forbidden, scope_missing, no_organization).","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"404":{"description":"Unknown op or record (unknown_op, not_found).","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"409":{"description":"The request conflicts with the current state.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"422":{"description":"The input is well-formed but cannot be applied.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"429":{"description":"Rate limited. Retry after Retry-After seconds.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"500":{"description":"Internal error. Retry and quote request_id.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}}},"/api/v1/list_events":{"post":{"operationId":"list_events","summary":"List events","description":"The organization's event log, newest first: every platform event (message.received, message.sent, message.delivered, message.read, message.failed…) with its payload, subject, source and time. Filter by type (exact, or a prefix ending in a dot such as \"message.\") and subject. The same events customer webhooks deliver; use it to debug a webhook or to catch up after downtime (pass after_id to read forward).","tags":["events"],"x-read-only":true,"x-admin-only":false,"x-min-role":"viewer","x-scope":"events:read","requestBody":{"required":false,"content":{"application/json":{"schema":{"type":"object","properties":{"type":{"description":"An event type, or a prefix ending in \".\" (e.g. \"message.\").","type":"string","maxLength":100},"subject_type":{"description":"message, conversation, template, agent_session…","type":"string","maxLength":50},"subject_id":{"type":"string","maxLength":200},"after_id":{"description":"Only events with a larger id, oldest first: to read forward from the last id you saw.","type":"integer","minimum":0,"maximum":9007199254740991},"limit":{"default":50,"description":"Page size, at most 200.","type":"integer","minimum":1,"maximum":200},"offset":{"default":0,"type":"integer","minimum":0,"maximum":9007199254740991}}}}}},"responses":{"200":{"description":"The op's output.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"400":{"description":"Invalid JSON or input that fails the schema (invalid_json, invalid_input).","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"401":{"description":"Missing or invalid credential (unauthorized, invalid_key, invalid_token).","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"402":{"description":"Payment failed or a plan limit was reached; carries checkout_url and the paid plans.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"403":{"description":"The credential's role or scopes do not allow the op, or no organization is available (forbidden, scope_missing, no_organization).","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"404":{"description":"Unknown op or record (unknown_op, not_found).","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"409":{"description":"The request conflicts with the current state.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"422":{"description":"The input is well-formed but cannot be applied.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"429":{"description":"Rate limited. Retry after Retry-After seconds.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"500":{"description":"Internal error. Retry and quote request_id.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}},"get":{"operationId":"list_events_get","summary":"List events (GET)","description":"Read-only ops also answer GET with the input as URL-encoded JSON in ?input=. The organization's event log, newest first: every platform event (message.received, message.sent, message.delivered, message.read, message.failed…) with its payload, subject, source and time. Filter by type (exact, or a prefix ending in a dot such as \"message.\") and subject. The same events customer webhooks deliver; use it to debug a webhook or to catch up after downtime (pass after_id to read forward).","tags":["events"],"parameters":[{"name":"input","in":"query","required":false,"description":"The op's input as URL-encoded JSON.","schema":{"type":"string"}}],"responses":{"200":{"description":"The op's output.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"400":{"description":"Invalid JSON or input that fails the schema (invalid_json, invalid_input).","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"401":{"description":"Missing or invalid credential (unauthorized, invalid_key, invalid_token).","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"402":{"description":"Payment failed or a plan limit was reached; carries checkout_url and the paid plans.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"403":{"description":"The credential's role or scopes do not allow the op, or no organization is available (forbidden, scope_missing, no_organization).","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"404":{"description":"Unknown op or record (unknown_op, not_found).","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"409":{"description":"The request conflicts with the current state.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"422":{"description":"The input is well-formed but cannot be applied.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"429":{"description":"Rate limited. Retry after Retry-After seconds.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"500":{"description":"Internal error. Retry and quote request_id.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}}},"/api/v1/get_event":{"post":{"operationId":"get_event","summary":"Get event","description":"One event from the organization's event log by id, with its payload and how each internal consumer handled it (done, failed with the error, dead after its retries).","tags":["events"],"x-read-only":true,"x-admin-only":false,"x-min-role":"viewer","x-scope":"events:read","requestBody":{"required":false,"content":{"application/json":{"schema":{"type":"object","properties":{"id":{"type":"integer","minimum":1,"maximum":9007199254740991}},"required":["id"]}}}},"responses":{"200":{"description":"The op's output.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"400":{"description":"Invalid JSON or input that fails the schema (invalid_json, invalid_input).","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"401":{"description":"Missing or invalid credential (unauthorized, invalid_key, invalid_token).","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"402":{"description":"Payment failed or a plan limit was reached; carries checkout_url and the paid plans.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"403":{"description":"The credential's role or scopes do not allow the op, or no organization is available (forbidden, scope_missing, no_organization).","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"404":{"description":"Unknown op or record (unknown_op, not_found).","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"409":{"description":"The request conflicts with the current state.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"422":{"description":"The input is well-formed but cannot be applied.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"429":{"description":"Rate limited. Retry after Retry-After seconds.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"500":{"description":"Internal error. Retry and quote request_id.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}},"get":{"operationId":"get_event_get","summary":"Get event (GET)","description":"Read-only ops also answer GET with the input as URL-encoded JSON in ?input=. One event from the organization's event log by id, with its payload and how each internal consumer handled it (done, failed with the error, dead after its retries).","tags":["events"],"parameters":[{"name":"input","in":"query","required":false,"description":"The op's input as URL-encoded JSON.","schema":{"type":"string"}}],"responses":{"200":{"description":"The op's output.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"400":{"description":"Invalid JSON or input that fails the schema (invalid_json, invalid_input).","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"401":{"description":"Missing or invalid credential (unauthorized, invalid_key, invalid_token).","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"402":{"description":"Payment failed or a plan limit was reached; carries checkout_url and the paid plans.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"403":{"description":"The credential's role or scopes do not allow the op, or no organization is available (forbidden, scope_missing, no_organization).","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"404":{"description":"Unknown op or record (unknown_op, not_found).","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"409":{"description":"The request conflicts with the current state.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"422":{"description":"The input is well-formed but cannot be applied.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"429":{"description":"Rate limited. Retry after Retry-After seconds.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"500":{"description":"Internal error. Retry and quote request_id.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}}},"/api/v1/pricing":{"get":{"operationId":"pricing","summary":"Pricing document","description":"Every plan with price {monthly, yearly} in USD, included messages and AI replies a month, limits, features, overage and a checkout_url, plus free_tier, meta_fees and how_to_buy. Public and cacheable; the same shape on every Meter product. ?ref= names the referrer carried on the checkout links.","tags":["billing"],"security":[],"parameters":[{"name":"ref","in":"query","required":false,"description":"Attribution slug, e.g. agent-cursor.","schema":{"type":"string"}}],"responses":{"200":{"description":"The pricing document.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}}}}},"/api/v1/feedback":{"get":{"operationId":"list_feedback_get_api_v_feedback","summary":"List the feedback board","description":"Feature requests and your own issues with status and votes. Public without a credential; ?mine=true returns list_my_feedback instead. Same as POST /api/v1/list_feedback.","tags":["feedback"],"security":[{},{"bearerAuth":[]}],"parameters":[{"name":"kind","in":"query","required":false,"description":"feature, issue or all.","schema":{"type":"string"}},{"name":"status","in":"query","required":false,"description":"active, all, open, planned, in_progress, done, declined or duplicate.","schema":{"type":"string"}},{"name":"sort","in":"query","required":false,"description":"top, new or recent_activity.","schema":{"type":"string"}},{"name":"q","in":"query","required":false,"description":"Words in the title.","schema":{"type":"string"}},{"name":"mine","in":"query","required":false,"description":"true for your items, subscriptions and review (list_my_feedback).","schema":{"type":"boolean"}},{"name":"limit","in":"query","required":false,"description":"Page size.","schema":{"type":"integer"}},{"name":"cursor","in":"query","required":false,"description":"next_cursor from the previous page.","schema":{"type":"string"}}],"responses":{"200":{"description":"The op's output.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"400":{"description":"Invalid JSON or input that fails the schema (invalid_json, invalid_input).","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"401":{"description":"Missing or invalid credential (unauthorized, invalid_key, invalid_token).","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"402":{"description":"Payment failed or a plan limit was reached; carries checkout_url and the paid plans.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"403":{"description":"The credential's role or scopes do not allow the op, or no organization is available (forbidden, scope_missing, no_organization).","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"404":{"description":"Unknown op or record (unknown_op, not_found).","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"409":{"description":"The request conflicts with the current state.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"422":{"description":"The input is well-formed but cannot be applied.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"429":{"description":"Rate limited. Retry after Retry-After seconds.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"500":{"description":"Internal error. Retry and quote request_id.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}}},"/api/v1/feedback/{id}":{"get":{"operationId":"get_feedback_get_api_v_feedback_id","summary":"Get a feedback item","description":"One item with comments and timeline. Same as POST /api/v1/get_feedback.","tags":["feedback"],"security":[{},{"bearerAuth":[]}],"parameters":[{"name":"id","in":"path","required":true,"description":"The feedback item id.","schema":{"type":"integer","minimum":1}}],"responses":{"200":{"description":"The op's output.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"400":{"description":"Invalid JSON or input that fails the schema (invalid_json, invalid_input).","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"401":{"description":"Missing or invalid credential (unauthorized, invalid_key, invalid_token).","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"402":{"description":"Payment failed or a plan limit was reached; carries checkout_url and the paid plans.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"403":{"description":"The credential's role or scopes do not allow the op, or no organization is available (forbidden, scope_missing, no_organization).","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"404":{"description":"Unknown op or record (unknown_op, not_found).","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"409":{"description":"The request conflicts with the current state.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"422":{"description":"The input is well-formed but cannot be applied.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"429":{"description":"Rate limited. Retry after Retry-After seconds.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"500":{"description":"Internal error. Retry and quote request_id.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}}},"/api/v1/feedback/features":{"post":{"operationId":"request_feature_post_api_v_feedback_features","summary":"Request a feature","description":"Files a feature request (or returns similar items, filed: false). Same as POST /api/v1/request_feature.","tags":["feedback"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"title":{"type":"string","minLength":3,"maxLength":140,"description":"What you want, in one line."},"details":{"default":"","description":"Why you need it and what you are building; concrete examples help it get planned.","type":"string","maxLength":5000},"body":{"description":"Alias of details.","type":"string","maxLength":5000},"force":{"default":false,"description":"File even when similar items exist.","type":"boolean"}},"required":["title"]}}}},"responses":{"200":{"description":"The op's output.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"400":{"description":"Invalid JSON or input that fails the schema (invalid_json, invalid_input).","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"401":{"description":"Missing or invalid credential (unauthorized, invalid_key, invalid_token).","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"402":{"description":"Payment failed or a plan limit was reached; carries checkout_url and the paid plans.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"403":{"description":"The credential's role or scopes do not allow the op, or no organization is available (forbidden, scope_missing, no_organization).","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"404":{"description":"Unknown op or record (unknown_op, not_found).","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"409":{"description":"The request conflicts with the current state.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"422":{"description":"The input is well-formed but cannot be applied.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"429":{"description":"Rate limited. Retry after Retry-After seconds.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"500":{"description":"Internal error. Retry and quote request_id.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}}},"/api/v1/feedback/issues":{"post":{"operationId":"report_issue_post_api_v_feedback_issues","summary":"Report an issue","description":"Files a private issue report with request context. Same as POST /api/v1/report_issue.","tags":["feedback"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"title":{"type":"string","minLength":3,"maxLength":140,"description":"What is wrong, in one line."},"details":{"default":"","description":"What you did, what you expected and what happened (status, error code, format).","type":"string","maxLength":5000},"body":{"description":"Alias of details.","type":"string","maxLength":5000},"request_id":{"description":"The request_id of the failing call (shortcut for context.request_id).","type":"string","maxLength":128},"op":{"description":"The op the failing call used, e.g. send_message (shortcut for context.op).","type":"string","maxLength":80},"context":{"description":"Wabi identifiers for what failed: request_id, op, account_id, conversation_id, message_id, wamid, template, meta_error_code, status, error_code, error, client. Never shown publicly; at most 128 KB.","type":"object","properties":{"request_id":{"description":"The request_id of the failing call (X-Request-Id header, or request_id in the error).","type":"string","pattern":"^[A-Za-z0-9._:-]{1,128}$"},"op":{"description":"The op or endpoint that failed, e.g. send_message.","type":"string","pattern":"^[a-z][a-z0-9_]{1,79}$"},"account_id":{"description":"The WhatsApp account (whatsapp_accounts.id) the problem is in; must be one of your organization's.","type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"conversation_id":{"description":"The conversation involved; must be one of your organization's.","type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"message_id":{"description":"The message involved (our id, not the wamid); must be one of your organization's.","type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"wamid":{"description":"Meta's message id (wamid.…) when you have no message_id.","type":"string","maxLength":200},"template":{"description":"The template name involved.","type":"string","maxLength":512},"locale":{"description":"The language involved, e.g. pt_BR.","type":"string","pattern":"^[A-Za-z]{2,8}([-_][A-Za-z0-9]{1,8})*$"},"meta_error_code":{"description":"Meta's error code, when Meta returned one (e.g. 131047).","type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"status":{"description":"The HTTP status the call returned.","type":"integer","minimum":100,"maximum":599},"error_code":{"description":"The error code, e.g. outside_service_window.","type":"string","maxLength":100},"error":{"description":"The error message as the client saw it (no keys or customer strings).","type":"string","maxLength":2000},"client":{"description":"Client and version, e.g. wabi-cli/0.5.0 or Claude Code.","type":"string","maxLength":100},"version":{"type":"string","maxLength":50},"extra":{"description":"Anything else that helps reproduce it (no secrets).","type":"object","propertyNames":{"type":"string"},"additionalProperties":{}}},"additionalProperties":false},"force":{"default":false,"description":"File even when similar reports exist.","type":"boolean"}},"required":["title"]}}}},"responses":{"200":{"description":"The op's output.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"400":{"description":"Invalid JSON or input that fails the schema (invalid_json, invalid_input).","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"401":{"description":"Missing or invalid credential (unauthorized, invalid_key, invalid_token).","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"402":{"description":"Payment failed or a plan limit was reached; carries checkout_url and the paid plans.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"403":{"description":"The credential's role or scopes do not allow the op, or no organization is available (forbidden, scope_missing, no_organization).","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"404":{"description":"Unknown op or record (unknown_op, not_found).","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"409":{"description":"The request conflicts with the current state.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"422":{"description":"The input is well-formed but cannot be applied.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"429":{"description":"Rate limited. Retry after Retry-After seconds.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"500":{"description":"Internal error. Retry and quote request_id.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}}},"/api/v1/feedback/{id}/votes":{"post":{"operationId":"upvote_feedback_post_api_v_feedback_id_votes","summary":"Upvote","description":"Adds your organization's vote. Same as POST /api/v1/upvote_feedback.","tags":["feedback"],"parameters":[{"name":"id","in":"path","required":true,"description":"The feedback item id.","schema":{"type":"integer","minimum":1}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"id":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991,"description":"The item's id from list_feedback, request_feature or report_issue (e.g. 42)."}},"required":["id"]}}}},"responses":{"200":{"description":"The op's output.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"400":{"description":"Invalid JSON or input that fails the schema (invalid_json, invalid_input).","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"401":{"description":"Missing or invalid credential (unauthorized, invalid_key, invalid_token).","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"402":{"description":"Payment failed or a plan limit was reached; carries checkout_url and the paid plans.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"403":{"description":"The credential's role or scopes do not allow the op, or no organization is available (forbidden, scope_missing, no_organization).","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"404":{"description":"Unknown op or record (unknown_op, not_found).","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"409":{"description":"The request conflicts with the current state.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"422":{"description":"The input is well-formed but cannot be applied.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"429":{"description":"Rate limited. Retry after Retry-After seconds.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"500":{"description":"Internal error. Retry and quote request_id.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}},"delete":{"operationId":"remove_feedback_vote_delete_api_v_feedback_id_votes","summary":"Remove upvote","description":"Takes your organization's vote back. Same as POST /api/v1/remove_feedback_vote.","tags":["feedback"],"parameters":[{"name":"id","in":"path","required":true,"description":"The feedback item id.","schema":{"type":"integer","minimum":1}}],"responses":{"200":{"description":"The op's output.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"400":{"description":"Invalid JSON or input that fails the schema (invalid_json, invalid_input).","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"401":{"description":"Missing or invalid credential (unauthorized, invalid_key, invalid_token).","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"402":{"description":"Payment failed or a plan limit was reached; carries checkout_url and the paid plans.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"403":{"description":"The credential's role or scopes do not allow the op, or no organization is available (forbidden, scope_missing, no_organization).","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"404":{"description":"Unknown op or record (unknown_op, not_found).","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"409":{"description":"The request conflicts with the current state.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"422":{"description":"The input is well-formed but cannot be applied.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"429":{"description":"Rate limited. Retry after Retry-After seconds.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"500":{"description":"Internal error. Retry and quote request_id.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}}},"/api/v1/feedback/{id}/comments":{"post":{"operationId":"comment_on_feedback_post_api_v_feedback_id_comments","summary":"Comment","description":"Adds a comment ({\"body\": \"…\"}). Same as POST /api/v1/comment_on_feedback.","tags":["feedback"],"parameters":[{"name":"id","in":"path","required":true,"description":"The feedback item id.","schema":{"type":"integer","minimum":1}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"id":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991,"description":"The item's id from list_feedback, request_feature or report_issue (e.g. 42)."},"body":{"type":"string","minLength":1,"maxLength":5000,"description":"The comment."}},"required":["id","body"]}}}},"responses":{"200":{"description":"The op's output.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"400":{"description":"Invalid JSON or input that fails the schema (invalid_json, invalid_input).","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"401":{"description":"Missing or invalid credential (unauthorized, invalid_key, invalid_token).","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"402":{"description":"Payment failed or a plan limit was reached; carries checkout_url and the paid plans.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"403":{"description":"The credential's role or scopes do not allow the op, or no organization is available (forbidden, scope_missing, no_organization).","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"404":{"description":"Unknown op or record (unknown_op, not_found).","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"409":{"description":"The request conflicts with the current state.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"422":{"description":"The input is well-formed but cannot be applied.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"429":{"description":"Rate limited. Retry after Retry-After seconds.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"500":{"description":"Internal error. Retry and quote request_id.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}}},"/api/v1/reviews":{"get":{"operationId":"list_reviews_get_api_v_reviews","summary":"List reviews","description":"Published reviews with the aggregate rating. Public. Same as POST /api/v1/list_reviews.","tags":["feedback"],"security":[{},{"bearerAuth":[]}],"parameters":[{"name":"sort","in":"query","required":false,"description":"newest, helpful, highest or lowest.","schema":{"type":"string"}},{"name":"rating","in":"query","required":false,"description":"Only this rating.","schema":{"type":"integer"}}],"responses":{"200":{"description":"The op's output.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"400":{"description":"Invalid JSON or input that fails the schema (invalid_json, invalid_input).","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"401":{"description":"Missing or invalid credential (unauthorized, invalid_key, invalid_token).","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"402":{"description":"Payment failed or a plan limit was reached; carries checkout_url and the paid plans.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"403":{"description":"The credential's role or scopes do not allow the op, or no organization is available (forbidden, scope_missing, no_organization).","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"404":{"description":"Unknown op or record (unknown_op, not_found).","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"409":{"description":"The request conflicts with the current state.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"422":{"description":"The input is well-formed but cannot be applied.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"429":{"description":"Rate limited. Retry after Retry-After seconds.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"500":{"description":"Internal error. Retry and quote request_id.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}}},"/api/v1/reviews/me":{"put":{"operationId":"submit_review_put_api_v_reviews_me","summary":"Post or edit your review","description":"Your organization's one review. Same as POST /api/v1/submit_review.","tags":["feedback"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"rating":{"type":"integer","minimum":1,"maximum":5,"description":"1 (poor) to 5 (excellent)."},"title":{"default":"","description":"One-line summary.","type":"string","maxLength":120},"body":{"default":"","description":"The review.","type":"string","maxLength":2000},"likes":{"default":"","description":"What works well.","type":"string","maxLength":1000},"dislikes":{"default":"","description":"What should be better.","type":"string","maxLength":1000},"use_case":{"default":"","description":"What you use Wabi for.","type":"string","maxLength":200},"display_name":{"description":"Name shown with the review; defaults to your first name.","type":"string","maxLength":60},"display_company":{"description":"Company shown with the review, if any.","type":"string","maxLength":80},"marketing_consent":{"default":false,"description":"May Meter quote this review on the site and in marketing.","type":"boolean"}},"required":["rating"]}}}},"responses":{"200":{"description":"The op's output.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"400":{"description":"Invalid JSON or input that fails the schema (invalid_json, invalid_input).","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"401":{"description":"Missing or invalid credential (unauthorized, invalid_key, invalid_token).","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"402":{"description":"Payment failed or a plan limit was reached; carries checkout_url and the paid plans.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"403":{"description":"The credential's role or scopes do not allow the op, or no organization is available (forbidden, scope_missing, no_organization).","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"404":{"description":"Unknown op or record (unknown_op, not_found).","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"409":{"description":"The request conflicts with the current state.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"422":{"description":"The input is well-formed but cannot be applied.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"429":{"description":"Rate limited. Retry after Retry-After seconds.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"500":{"description":"Internal error. Retry and quote request_id.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}}},"/api/v1/account":{"get":{"operationId":"get_account_account","summary":"Get account","description":"Plan, renewal, usage against every limit, what remains and what the next plan adds. Same as GET /api/v1/get_account.","tags":["billing"],"responses":{"200":{"description":"The op's output.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"400":{"description":"Invalid JSON or input that fails the schema (invalid_json, invalid_input).","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"401":{"description":"Missing or invalid credential (unauthorized, invalid_key, invalid_token).","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"402":{"description":"Payment failed or a plan limit was reached; carries checkout_url and the paid plans.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"403":{"description":"The credential's role or scopes do not allow the op, or no organization is available (forbidden, scope_missing, no_organization).","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"404":{"description":"Unknown op or record (unknown_op, not_found).","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"409":{"description":"The request conflicts with the current state.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"422":{"description":"The input is well-formed but cannot be applied.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"429":{"description":"Rate limited. Retry after Retry-After seconds.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"500":{"description":"Internal error. Retry and quote request_id.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}}},"/api/v1/billing/checkout":{"post":{"operationId":"create_checkout_link_checkout","summary":"Create checkout link","description":"A Stripe Checkout URL for a human, with or without a credential (before signup). Same as POST /api/v1/create_checkout_link.","tags":["billing"],"security":[{},{"bearerAuth":[]}],"requestBody":{"required":false,"content":{"application/json":{"schema":{"type":"object","properties":{"plan":{"type":"string","enum":["starter","growth","scale"],"description":"starter, growth or scale. get_pricing lists what each includes. Enterprise is sold by email."},"interval":{"default":"month","description":"month, or year (two months free: 10x the monthly price).","type":"string","enum":["month","year"]},"ref":{"description":"Optional attribution slug for the link (e.g. agent-cursor). Defaults to the surface: agent-mcp, agent-cli or agent-api.","type":"string","pattern":"^[a-z0-9][a-z0-9_-]{0,39}$"}},"required":["plan"]}}}},"responses":{"200":{"description":"The op's output.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"400":{"description":"Invalid JSON or input that fails the schema (invalid_json, invalid_input).","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"401":{"description":"Missing or invalid credential (unauthorized, invalid_key, invalid_token).","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"402":{"description":"Payment failed or a plan limit was reached; carries checkout_url and the paid plans.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"403":{"description":"The credential's role or scopes do not allow the op, or no organization is available (forbidden, scope_missing, no_organization).","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"404":{"description":"Unknown op or record (unknown_op, not_found).","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"409":{"description":"The request conflicts with the current state.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"422":{"description":"The input is well-formed but cannot be applied.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"429":{"description":"Rate limited. Retry after Retry-After seconds.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"500":{"description":"Internal error. Retry and quote request_id.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}}},"/api/v1/billing/portal":{"post":{"operationId":"get_billing_link_portal","summary":"Get billing link","description":"The Stripe customer portal for a human: invoices, card, plan change, cancellation. Same as POST /api/v1/get_billing_link.","tags":["billing"],"requestBody":{"required":false,"content":{"application/json":{"schema":{"type":"object","properties":{}}}}},"responses":{"200":{"description":"The op's output.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"400":{"description":"Invalid JSON or input that fails the schema (invalid_json, invalid_input).","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"401":{"description":"Missing or invalid credential (unauthorized, invalid_key, invalid_token).","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"402":{"description":"Payment failed or a plan limit was reached; carries checkout_url and the paid plans.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"403":{"description":"The credential's role or scopes do not allow the op, or no organization is available (forbidden, scope_missing, no_organization).","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"404":{"description":"Unknown op or record (unknown_op, not_found).","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"409":{"description":"The request conflicts with the current state.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"422":{"description":"The input is well-formed but cannot be applied.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"429":{"description":"Rate limited. Retry after Retry-After seconds.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"500":{"description":"Internal error. Retry and quote request_id.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}}}},"components":{"securitySchemes":{"bearerAuth":{"type":"http","scheme":"bearer","description":"An organization API key (wabi_…) or an OAuth access token. X-Api-Key is accepted as an alternative header."}},"schemas":{"Problem":{"type":"object","description":"RFC 9457 problem details.","required":["type","title","status","detail"],"properties":{"type":{"type":"string","format":"uri","description":"https://getwabi.dev/docs/errors#{status}"},"title":{"type":"string","description":"The error code."},"status":{"type":"integer"},"detail":{"type":"string","description":"What went wrong and what to do about it."},"code":{"type":"string","enum":["invalid_json","invalid_input","invalid_slug","confirm_mismatch","principal_required","same_person","no_person","invalid_grant","expired_token","access_denied","unauthorized","invalid_key","expired_key","invalid_token","payment_failed","forbidden","scope_missing","scope_escalation","dashboard_only","person_required","no_organization","unknown_op","not_found","method_not_allowed","organization_exists","team_exists","already_member","last_owner","sandbox_not_provisioned","already_subscribed","subscription_active","no_subscription","checkout_incomplete","already_claimed","context_too_large","authorization_pending","rate_limited","internal_error","billing_unavailable"]},"request_id":{"type":"string"},"issues":{"type":"array","items":{"type":"object"},"description":"Schema issues for invalid_input."}}},"OpsManifest":{"type":"object","properties":{"name":{"type":"string"},"description":{"type":"string"},"mcp":{"type":"string","format":"uri"},"openapi":{"type":"string","format":"uri"},"ops":{"type":"array","items":{"type":"object","properties":{"name":{"type":"string"},"group":{"type":"string"},"title":{"type":"string"},"description":{"type":"string"},"read_only":{"type":"boolean"},"admin_only":{"type":"boolean"},"input_schema":{"type":"object"}}}}}}}}}