Tyxter
Envie mensagens pelo WhatsApp Business e gerencie contatos, templates, campanhas, automações, pagamentos e eventos.
Authentication
This connector uses Token-based authentication.
info
Set up your connection in the Abstra Console before using it in your workflows.
How to use
Using the Smart Chat
Execute the action "CHOOSE_ONE_ACTION_BELOW" from my connector "YOUR_CONNECTOR_NAME" using the params "PARAMS_HERE".
Using the Web Editor
from abstra.connectors import run_connection_action
result = run_connection_action(
connection_name="your_connection_name",
action_name="your_action_name",
params={
"param1": "value1",
"param2": "value2"
})
Available Actions
This connector provides 209 actions:
| Action | Purpose | Parameters |
|---|---|---|
| get_status | Read public component health | No parameters |
| get_v1 | Unauthenticated API-root discovery document. Returns the same machine-readable capability and resource links as GET /.well-known/tyxter.json so an integrating agent that starts at the conventional version root does not encounter an unmatched 404. | No parameters |
| post_v1_messages | Accepts a message for delivery. WhatsApp Business groups use recipient.type=whatsapp_group and a Tyxter group id hosted by sender.id. Text/media need a same-group 24-hour inbound window; approved non-authentication text/media templates can be sent outside that window. Interactive, flows, reactions, quoted replies and interactive/authentication templates are refused. Group replies emit group.message_received, not private-message handlers. One ordinary transport fee per accepted group send; delive | idempotency-key (string) tyxter-trace-id (string) data required |
| get_v1_messages | Lists message resources. A production inbound WhatsApp message can have sender type: 'phone_e164', id: '' only when Meta withheld the customer phone number; treat that sender as unresolved and never as a sendable recipient. Recipients and outbound request identities remain non-empty. | limit (integer) required starting_after (string) created_after (string) status (string) batch_id (string) direction (string) include (string) |
| get_v1_messages_by_id | Retrieves one message resource. A production inbound WhatsApp message can have sender type: 'phone_e164', id: '' only when Meta withheld the customer phone number; treat that sender as unresolved and never as a sendable recipient. Recipients and outbound request identities remain non-empty. | id (string) required |
| post_v1_messages_by_message_id_transcription | Explicitly opts one inbound WhatsApp audio message into asynchronous transcription. The response starts as pending; poll the GET operation, or subscribe to message.media_transcribed for success and message.media_transcription_failed for terminal failure. A pending or succeeded receipt replays when supplied language and context hints match the newest generation after normalization; omitted fields replay unchanged. A failed receipt returns transcription_retry_required and must be reopened with POS | message_id (string) required tyxter-trace-id (string) data: { . language (string) . prompt (string) . keywords (array) } (object) required |
| get_v1_messages_by_message_id_transcription | Returns the pending, succeeded, or failed transcript for the caller-tenant message. Transcript text is nullable after configured message-data retention purges it. | message_id (string) required tyxter-trace-id (string) |
| post_v1_messages_by_message_id_transcription_retry | Reopens a failed transcription against its exact original inbound WhatsApp audio asset. Idempotency-Key is required: reuse it with the same body to replay the stored 202 without reopening another generation. Omitted prompt and keywords inherit from the newest generation; an empty prompt or empty keyword array clears that field. Same-key comparison uses supplied normalized fields, so omitted and explicitly empty hints are distinct intents. The stable transcript id and original asset do not change | message_id (string) required idempotency-key (string) required tyxter-trace-id (string) data: { . language (string) . prompt (string) . keywords (array) } (object) required |
| post_v1_messages_by_id_cancel | Cancel a message | id (string) required idempotency-key (string) |
| post_v1_messages_by_id_typing | Marks the named inbound WhatsApp message as read and shows the typing indicator on that conversation. Take the target from message.received.data.message_id event.data.message_id in a webhook handler. Do not use the webhook envelope id or data.provider_message_id. In untyped JavaScript, validate that data.message_id is a non-empty string before calling: a missing property can otherwise produce /v1/messages/undefined/typing, which returns message_not_found and shows no indicator. The two effects a | id (string) required tyxter-trace-id (string) |
| get_v1_media | Lists metadata for active and historical media assets with cursor pagination and lifecycle, status, kind, and source filters. The list covers both the media you uploaded source: customer and attachments captured from inbound messages source: inbound_provider; omitting source returns both, which is the unchanged default. Inbound attachments consume the same environment storage quota reported by GET /v1/media/storage-usage. | limit (integer) starting_after (string) lifecycle (string) status (string) kind (string) source (string) tyxter-trace-id (string) |
| post_v1_media_uploads | Creates a direct-upload session for single-use or library media. mime_type must be one WhatsApp accepts for the declared kind, checked here rather than at delivery — image: image/jpeg, image/png; sticker: image/webp; audio: audio/aac, audio/amr, audio/mpeg, audio/mp4, audio/ogg; video: video/mp4, video/3gpp; document: application/pdf, text/plain, application/msword, application/vnd.openxmlformats-officedocument.wordprocessingml.document, application/vnd.ms-excel, application/vnd.openxmlformats-o | idempotency-key (string) tyxter-trace-id (string) data: { . kind (string) . lifecycle (string) . filename (string) . mime_type (string) . byte_length (integer) } (object) required |
| post_v1_media_uploads_by_asset_id_complete | Verifies the uploaded object and marks the media asset ready for message sends by media.asset_id. | asset_id (string) required idempotency-key (string) tyxter-trace-id (string) |
| get_v1_media_storage_usage | Returns bytes used, bytes available, quota limit, and percent used for the caller environment. The totals cover every active asset in the environment, including attachments captured from inbound messages — inbound media consumes the same quota as media you upload. | tyxter-trace-id (string) |
| get_v1_media_by_asset_id | Returns metadata for a media asset. Raw bytes and object storage keys are never returned. | asset_id (string) required tyxter-trace-id (string) |
| delete_v1_media_by_asset_id | Deletes a media asset: permanently removes the stored object, soft-deletes the row status becomes deleted, metadata is retained, and releases storage quota for active assets. | asset_id (string) required tyxter-trace-id (string) |
| get_v1_media_by_asset_id_download_url | Authenticates and tenant-scopes the Tyxter asset id, then returns a fresh short-lived capability URL for ready or consumed bytes. Use this operation for inbound WhatsApp media; Meta media ids and lookaside URLs are provider-private inputs and are not customer download handles. Only ready and consumed assets have downloadable bytes: every other state answers a stable 4xx and never a URL. | asset_id (string) required tyxter-trace-id (string) |
| put_v1_media_blobs_by_token | Streams raw media bytes to storage for the upload session named by the opaque, signed, short-lived token returned as upload_url from POST /v1/media/uploads. The token is the sole authority — no API key is required. Send the bytes as the raw request body using the Content-Type from upload_headers. Object storage is never exposed directly. | token (string) required Content-Type (string) required data (string) required |
| get_v1_media_blobs_by_token | Streams the stored media bytes for the opaque, signed, short-lived token issued as preview_url dashboard previews or as the provider fetch link. The token is the sole authority — no API key is required, and object storage is never exposed directly. The response body is the raw bytes served with the stored Content-Type — there is no JSON envelope. | token (string) required |
| post_v1_batches | Accepts a WhatsApp template broadcast. Mandatory Tyxter guards apply to marketing in sandbox and production. Identical template name, language, parameters and media content remain blocked until an inbound message after the previous attempt; there is no timed duplicate expiry within retained message history. Reuploading identical bytes under a new asset ID does not change content. A read receipt is not engagement. Different content on a healthy sender is allowed. A seven-day sender/recipient cool | idempotency-key (string) tyxter-trace-id (string) data required |
| get_v1_batches | List broadcast batches | limit (integer) required starting_after (string) tyxter-trace-id (string) |
| get_v1_batches_by_id | Retrieve a broadcast batch | id (string) required tyxter-trace-id (string) |
| post_v1_batches_by_id_pause | Pause a broadcast batch | id (string) required idempotency-key (string) tyxter-trace-id (string) |
| post_v1_batches_by_id_resume | Resume a broadcast batch | id (string) required idempotency-key (string) tyxter-trace-id (string) |
| post_v1_batches_by_id_cancel | Cancel a broadcast batch | id (string) required idempotency-key (string) tyxter-trace-id (string) |
| get_v1_batches_by_id_failures | Export failed recipients | id (string) required tyxter-trace-id (string) |
| post_v1_templates | Creates a template draft. parameter_format is the uppercase POSITIONAL or NAMED enum; omitting it uses the compatible POSITIONAL default. POSITIONAL uses 1, 2, ... with existing body_text/header_text examples. NAMED accepts unique a-za-z0-9_ tokens in BODY, TEXT HEADER, and dynamic URL buttons; BODY/TEXT HEADER use exact body_text_named_params/header_text_named_params param_name, example arrays, while URL buttons have no authoring example array. A default or explicit POSITIONAL BODY, TEXT HEAD | idempotency-key (string) data: { . name (string) . language (string) . category (string) . parameter_format (string) . components (array) } (object) required |
| get_v1_templates | Lists template rows with their uppercase parameter_format. The durable live format is POSITIONAL or NAMED; an approved send resolves the submitted version rather than trusting a caller-supplied send format. | limit (integer) required starting_after (string) |
| post_v1_templates_generate | Uses Tyxter platform-owned template generation credentials to return an editable WhatsApp template draft. parameter_format defaults to POSITIONAL when omitted and the response echoes POSITIONAL or NAMED; a NAMED draft uses the same BODY/TEXT HEADER token grammar and exact named example arrays as create. Generation does not persist a Template or submit to Meta. | idempotency-key (string) data: { . name (string) . description (string) . language (string) . category (string) . parameter_format (string) . template_type (string) } (object) required |
| get_v1_templates_by_id | Retrieves a template row, including its uppercase parameter_format. The field describes live authoring state; approved send validation and provider serialization use the immutable submitted TemplateVersion binding. | id (string) required |
| patch_v1_templates_by_id | Updates a draft or rejected template. Omitting parameter_format preserves the live format; supplying POSITIONAL or NAMED changes the merged draft only at this editable-state boundary. Category, format, and component validation is applied to the merged stored template, including exact NAMED BODY/TEXT HEADER examples, the stable POSITIONAL named-token compatibility code, marketing-only standalone COPY_CODE constraints, and the format-aware variable-edge rule. Because the merged template is what is | id (string) required idempotency-key (string) data: { . name (string) . language (string) . category (string) . parameter_format (string) . components (array) } (object) required |
| delete_v1_templates_by_id | Delete a template | id (string) required |
| post_v1_templates_by_id_duplicate | Copies an existing template into a new draft with no provider template id. Omitting parameter_format inherits the source format; supplying POSITIONAL or NAMED overrides it. A category or format override re-validates copied components under the requested category and format, including Meta's fixed authentication BODY/FOOTER/OTP shape, exact NAMED BODY/TEXT HEADER examples, the stable POSITIONAL named-token compatibility code, and the format-aware variable-edge rule. A duplicate that overrides nei | id (string) required idempotency-key (string) data: { . name (string) . language (string) . category (string) . parameter_format (string) } (object) required |
| post_v1_templates_by_id_submit | Snapshots the current components and parameter_format into a fresh immutable TemplateVersion, then queues provider submission. Later draft/rejected PATCH changes do not rewrite that submitted version; approved sends resolve this binding. | id (string) required idempotency-key (string) |
| get_v1_templates_by_id_analytics | Read template analytics | id (string) required |
| post_v1_templates_by_id_estimate_cost | Estimate template cost | id (string) required data: { . recipients (integer) } (object) required |
| post_v1_feedback | Agent-facing failure reporting. Authenticated with any valid live or sandbox API key — no scope required — and accepted even when production credit is exhausted, because reporting a failure must never be gated on balance. Idempotency-Key is mandatory. message is required =2000 chars; related_error and a flat string-to-string context are optional, submitter-asserted, and stored as untrusted data; tenant provenance is derived from the key, never the body. Supported credential patterns are redacted | idempotency-key (string) required tyxter-trace-id (string) data: { . message (string) . related_error (object) . context (object) } (object) required |
| get_v1_feedback | Lists newest-first API-origin feedback reports for the API key organization, project, and environment. No scope or Idempotency-Key is required, and reads remain available when production credit is exhausted. The cursor is strict descending created_at, id; use next_cursor as after for the next page. Dashboard-origin reports are never included. Items contain only id, object, status, message_excerpt, created_at, and the latest customer-safe resolution projection. | after (string) limit (integer) required |
| get_v1_feedback_by_id | Retrieves one API-origin feedback report in the API key organization, project, and environment. A replacement key in that same tuple retains read access; dashboard-origin, foreign, and purged ids all return the same 404. The response is the minimized status projection and never includes the raw report, diagnostics, identities, provenance, or resolution history. | id (string) required |
| post_v1_flows | Stores a WhatsApp Flow definition flow_json for this environment and returns it as a validated draft. Requires flows:write and honors Idempotency-Key. Reusing a key with the same body replays the original response; a different body returns 409 idempotency_key_conflict. flow_json is validated structurally before storage — unsupported versions, missing screens, missing terminal screens, and duplicate screen ids fail with 400 invalid_flow_json. This does not send a flow to a recipient: sends use PO | idempotency-key (string) data: { . name (string) . flow_json (object) } (object) required |
| get_v1_flows | Lists WhatsApp Flows for the api-key environment, newest first, with cursor pagination limit, starting_after. Requires flows:read. | limit (integer) required starting_after (string) |
| get_v1_flows_by_id | Retrieves one WhatsApp Flow, including its current status and provider_flow_id once published. Requires flows:read. Poll this after publish until status leaves validated, then read provider_flow_id to address the flow from a POST /v1/messages flow send flow.action.parameters.flow_id. | id (string) required |
| post_v1_flows_by_id_publish | Snapshots the current flow_json as an append-only FlowVersion and enqueues the Meta sync worker. Requires flows:write and honors Idempotency-Key. Returns 202 with the flow still status = validated — the response is not the published flow. The transition to published with a provider_flow_id or rejected happens asynchronously; poll GET /v1/flows/id or consume the flow.published / flow.rejected webhook. Numeric Meta error 139000 is account-scoped, not a single diagnosis. When Meta exposes Account h | id (string) required idempotency-key (string) |
| get_v1_groups_eligibility | Beta. Requires groups:read. Answers whether the Tyxter phone number phone_number_id can host WhatsApp Business groups, from Tyxter records only — the call never reaches Meta. status is eligible, not_eligible, unknown Meta answered without every fact needed and nothing reported disqualifies, not_checked no check has run or read_failed the last check could not read Meta or did not finish; reasons is non-empty only when status is not_eligible. Sandbox numbers answer eligible. A production number an | phone_number_id (string) required |
| post_v1_groups_eligibility_checks | Beta. Requires groups:write and honors Idempotency-Key. Accepts an eligibility check for the Tyxter phone number phone_number_id and returns 202 with the answer stored at that moment the previous answer, or not_checked / eligible when none and the new check_requested_at; the call itself never reaches Meta. A Tyxter worker then reads the facts from Meta for a production number, or answers eligible for a sandbox number without a provider call, and stores one of eligible, not_eligible with reasons, | idempotency-key (string) data: { . phone_number_id (string) } (object) required |
| post_v1_groups | Beta. Requires groups:write and honors Idempotency-Key. Accepts a WhatsApp Business group on the Tyxter phone number phone_number_id and returns 202 with the group, its Tyxter id and status pending; the call itself never reaches Meta. A new group stays pending until a Tyxter worker resolves its create outcome; until then provider_group_id, invite_link and failure are null. A group whose Meta outcome never arrives stays pending. A create the worker finds it cannot send ends failed without a call | idempotency-key (string) data: { . phone_number_id (string) . subject (string) . description . join_approval_mode (string) } (object) required |
| get_v1_groups | Beta. Requires groups:read. Lists the WhatsApp Business groups of the api-key environment from Tyxter records, newest first, with cursor pagination limit, starting_after and optional phone_number_id and status filters; the call never reaches Meta. Deleted groups stay listed. A new group stays pending until a Tyxter worker resolves its create outcome. A phone_number_id from another environment matches no group and returns an empty page. These are not personal WhatsApp groups: https://tyxter.com/d | limit (integer) required starting_after (string) phone_number_id (string) status (string) |
| get_v1_groups_by_group_id | Beta. Requires groups:read. Retrieves one WhatsApp Business group by its Tyxter id from Tyxter records; the call never reaches Meta. group_id is the id POST /v1/groups returned, never Meta's group id that is provider_group_id. A deleted group stays readable. A new group stays pending until a Tyxter worker resolves its create outcome. A group_id path segment shaped like a personal WhatsApp group, an app-style group id ending in @g.us or a percent-encoded invite link chat.whatsapp.com, returns 422 | group_id (string) required |
| delete_v1_groups_by_group_id | Beta. Requires groups:write and honors Idempotency-Key. Deletes one WhatsApp Business group by its Tyxter id and returns 202 with the group; the call itself never reaches Meta. An active group becomes deleting and a Tyxter worker then deletes it: in sandbox it becomes deleted by itself; in production Tyxter sends the delete to Meta once and Meta reports the result later by webhook, which Tyxter applies — deleted, or back to active with failure set to Meta's refusal and detail when Meta refuses. | group_id (string) required idempotency-key (string) |
| get_v1_groups_https_chat_whatsapp_com_by_invite_tail | Authenticated teaching-only route for an unencoded personal WhatsApp invite pasted after /v1/groups/. invite_tail may span multiple path segments or be empty; it is never echoed. Requires groups:read and remains available when groups is disabled. Returns 422 personal_whatsapp_group_not_supported with error.feedback and https://tyxter.com/docs/groups/not-personal-whatsapp-groups; it reads or changes no Group, records no idempotency receipt and offers no SDK method. Use the Tyxter id returned by P | invite_tail (string) required |
| delete_v1_groups_https_chat_whatsapp_com_by_invite_tail | Authenticated teaching-only route for an unencoded personal WhatsApp invite pasted after /v1/groups/. invite_tail may span multiple path segments or be empty; it is never echoed. Requires groups:write and remains available when groups is disabled. Returns 422 personal_whatsapp_group_not_supported with error.feedback and https://tyxter.com/docs/groups/not-personal-whatsapp-groups; it reads or changes no Group, records no idempotency receipt and offers no SDK method. Use the Tyxter id returned by | invite_tail (string) required |
| get_v1_groups_http_chat_whatsapp_com_by_invite_tail | Authenticated teaching-only route for an unencoded personal WhatsApp invite pasted after /v1/groups/. invite_tail may span multiple path segments or be empty; it is never echoed. Requires groups:read and remains available when groups is disabled. Returns 422 personal_whatsapp_group_not_supported with error.feedback and https://tyxter.com/docs/groups/not-personal-whatsapp-groups; it reads or changes no Group, records no idempotency receipt and offers no SDK method. Use the Tyxter id returned by P | invite_tail (string) required |
| delete_v1_groups_http_chat_whatsapp_com_by_invite_tail | Authenticated teaching-only route for an unencoded personal WhatsApp invite pasted after /v1/groups/. invite_tail may span multiple path segments or be empty; it is never echoed. Requires groups:write and remains available when groups is disabled. Returns 422 personal_whatsapp_group_not_supported with error.feedback and https://tyxter.com/docs/groups/not-personal-whatsapp-groups; it reads or changes no Group, records no idempotency receipt and offers no SDK method. Use the Tyxter id returned by | invite_tail (string) required |
| get_v1_groups_chat_whatsapp_com_by_invite_tail | Authenticated teaching-only route for an unencoded personal WhatsApp invite pasted after /v1/groups/. invite_tail may span multiple path segments or be empty; it is never echoed. Requires groups:read and remains available when groups is disabled. Returns 422 personal_whatsapp_group_not_supported with error.feedback and https://tyxter.com/docs/groups/not-personal-whatsapp-groups; it reads or changes no Group, records no idempotency receipt and offers no SDK method. Use the Tyxter id returned by P | invite_tail (string) required |
| delete_v1_groups_chat_whatsapp_com_by_invite_tail | Authenticated teaching-only route for an unencoded personal WhatsApp invite pasted after /v1/groups/. invite_tail may span multiple path segments or be empty; it is never echoed. Requires groups:write and remains available when groups is disabled. Returns 422 personal_whatsapp_group_not_supported with error.feedback and https://tyxter.com/docs/groups/not-personal-whatsapp-groups; it reads or changes no Group, records no idempotency receipt and offers no SDK method. Use the Tyxter id returned by | invite_tail (string) required |
| post_v1_groups_by_group_id_invite_link_reset | Beta. Requires groups:write and honors Idempotency-Key. Resets the invite link of one active WhatsApp Business group by its Tyxter id and returns 202 with the group, still active and still showing the link the reset will replace; the call itself never reaches Meta, and there is no request body. A Tyxter worker then replaces invite_link: in sandbox with a new sandbox link; in production with the link Meta returns for the reset, after which earlier links stop working. Read the group with GET /v1/g | group_id (string) required idempotency-key (string) |
| post_v1_automations | Creates an automation container. Add an immutable version and publish it to activate the graph. Requires automations:write. | idempotency-key (string) data: { . name (string) . description (string) } (object) required |
| get_v1_automations | List automations | limit (integer) required starting_after (string) status (string) |
| get_v1_automations_by_automation_id | Retrieve an automation | automation_id (string) required |
| patch_v1_automations_by_automation_id | Update an automation | automation_id (string) required data: { . name (string) . description . status (string) } (object) required |
| delete_v1_automations_by_automation_id | Delete an automation | automation_id (string) required |
| post_v1_automations_by_automation_id_versions | Snapshots an immutable graph version. A run always points at the exact version it executes. | automation_id (string) required idempotency-key (string) data: { . graph (object) } (object) required |
| get_v1_automations_by_automation_id_versions | List automation versions | automation_id (string) required limit (integer) required starting_after (string) |
| post_v1_automations_by_automation_id_publish | Activates a version and materializes its triggers. For an inbound_message auto-reply, at most one enabled automation may be bound to a given phone_number_id per environment; a second conflicts with automation_inbound_number_conflict 409. | automation_id (string) required idempotency-key (string) data: { . version_id (string) } (object) required |
| post_v1_automations_by_automation_id_pause | Pause an automation | automation_id (string) required idempotency-key (string) |
| post_v1_automations_by_automation_id_resume | Resume an automation | automation_id (string) required idempotency-key (string) |
| post_v1_automations_by_automation_id_webhook_triggers_by_slug_rotate_secret | Returns the new plaintext webhook trigger signing secret once. Requires automations:write and honors Idempotency-Key; a keyed replay returns the same plaintext secret without rotating again. | automation_id (string) required slug (string) required idempotency-key (string) |
| post_v1_automations_by_automation_id_runs | Requires automations:run. | automation_id (string) required idempotency-key (string) data: { . input (object) . idempotency_key (string) . trace_id (string) } (object) required |
| get_v1_automations_by_automation_id_runs | List automation runs | automation_id (string) required limit (integer) required starting_after (string) status (string) |
| get_v1_automation_runs_by_run_id | Retrieve an automation run | run_id (string) required |
| get_v1_automation_runs_by_run_id_steps | List automation run steps | run_id (string) required limit (integer) required starting_after (string) |
| post_v1_automation_runs_by_run_id_cancel | Cancel an automation run | run_id (string) required |
| post_v1_automation_webhooks_by_slug | Public webhook trigger URL. The slug identifies the automation trigger; requests must include tyxter-webhook-timestamp and tyxter-webhook-signature headers signed with the trigger secret. | slug (string) required idempotency-key (string) |
| post_v1_contacts_opt_in | Opt a contact in | idempotency-key (string) data: { . phone (string) . source (string) . metadata (object) } (object) required |
| post_v1_contacts_opt_out | Opt a contact out | idempotency-key (string) data: { . phone (string) . source (string) . reason (string) } (object) required |
| post_v1_contacts_bulk_import | Imports up to 1,000 contacts as opted-in in one call and reports per-row results. | idempotency-key (string) data: { . rows (array) . source (string) } (object) required |
| get_v1_contacts | List contacts | limit (integer) required starting_after (string) search (string) status (string) tag_id (string) |
| post_v1_contacts_by_id_export | Returns the contact plus a metadata summary of its associated messages LGPD right of access. Gated by the environment's data-retention policy: when data_export_enabled is false the call fails with 403 data_export_disabled before any contact lookup, so a disabled export never reveals whether a contact exists. An environment with no policy row defaults to export-enabled. | id (string) required idempotency-key (string) |
| delete_v1_contacts_by_id | Erases the contact and the personal data of its messages, including the stored bytes of every inbound attachment they carry. Object storage is checked lazily: erasing a contact who never received media succeeds on a deployment with no storage adapter, while one who did fails with 503 media_storage_not_configured rather than reporting bytes gone that still exist. Retry the same call unchanged once an operator configures storage — the erasure is idempotent and converges, so a 503 means part of the | id (string) required idempotency-key (string) |
| post_v1_audiences | Create an audience | idempotency-key (string) data: { . name (string) . description . contact_ids (array) } (object) required |
| get_v1_audiences | List audiences | limit (integer) required starting_after (string) |
| get_v1_audiences_by_id | Retrieve an audience | id (string) required |
| patch_v1_audiences_by_id | Update an audience | id (string) required idempotency-key (string) data: { . name (string) . description . contact_ids (array) } (object) required |
| delete_v1_audiences_by_id | Delete an audience | id (string) required idempotency-key (string) |
| get_v1_phone_numbers_available_regions | List available regions | No parameters |
| post_v1_phone_numbers_provision | Tyxter display-name warnings are advisory and do not block submission or represent Meta approval. In sandbox, provisions a simulated number at once and answers 202 with the requested number; sandbox provisioning is KYC-free, capped by neither number limit and free of charge. In production this route rents nothing: it creates a rental order as POST /v1/phone-numbers/orders does and answers 409 phone_number_rental_approval_required, whose required error.details.order carries the order id, approval | idempotency-key (string) data: { . ddd (string) . display_name (string) } (object) required |
| post_v1_phone_numbers_orders | Asks to rent one Tyxter-provisioned number. In production the order is created awaiting_approval and nothing is rented or charged: the response carries the priced preview the activation amount and month, then each later rental charge with its month, amount and earliest charge instant, terms_version, expires_at 24 hours after the preview and approval_url. Hand approval_url to an owner or admin of the organization, who approves or declines the order in the dashboard; no API key can approve an orde | idempotency-key (string) data: { . ddd (string) . display_name (string) . purpose (string) } (object) required |
| get_v1_phone_numbers_orders_by_order_id | Returns one rental order in the API key project and environment with its status computed now: awaiting_approval with approval_url until an owner or admin decides; declined failure.code phone_number_order_declined; expired when 24 hours passed without approval phone_number_order_expired or the price, a charge date or the rental terms changed before approval phone_number_order_terms_changed; approved once the rental started; then provisioning, fulfilled or failed as the number progresses, with pho | order_id (string) required |
| post_v1_phone_numbers_connect | Tyxter display-name warnings are advisory and do not block submission or represent Meta approval. Bring-Your-Own-Number: connects a number that is ALREADY registered with Meta — you must supply its Meta phone_number_id. This endpoint cannot register a number with Meta. A Salvy number rented through an approved order POST /v1/phone-numbers/orders is NOT yet on Meta and has no phone_number_id; register it with your WABA through the dashboard WhatsApp Embedded Signup flow at https://tyxter.com/conn | idempotency-key (string) data: { . phone (string) . meta_phone_number_id (string) . display_name (string) } (object) required |
| post_v1_phone_numbers_import_salvy | Imports one explicitly selected account-owned Salvy resource from the caller’s cached discovery inventory. The resulting customer-owned phone keeps source byon and provider_number_id null; salvy_management contains the selected connection/resource relationship. Idempotency-Key is required. Discovery never imports a number, and this route does not provision, release, or call Salvy. Importing needs an active Standard or Growth plan. Management costs nothing while it stays active and through the en | idempotency-key (string) required data: { . provider_connection_id (string) . provider_number_id (string) . meta_phone_number_id (string) . display_name (string) . continuation_terms_version (string) } (object) required |
| post_v1_phone_numbers_by_id_salvy_complete_registration | Queues an independent Meta WABA ownership check for one active Salvy-managed BYON attachment. Idempotency-Key is required. A current Salvy credential only permits the check; messaging becomes active only after the worker confirms the supplied Meta phone belongs to the same-environment Meta WABA. | id (string) required idempotency-key (string) required data: { . meta_phone_number_id (string) } (object) required |
| get_v1_phone_numbers | List the credential-scoped non-released phone roster with required nullable renewal. For a production number Tyxter rents, renewal reports the current UTC month under the renewal policy /phone-numbers renewal-policy: next_renewal_at is the next monthly charge 00:05 UTC on the 1st; state at_risk with recommended_action add_credit_or_enable_auto_topup means the month's rental charge left the balance below zero and it has not come back to zero or above; on the free plan release_cutoff_at is when th | limit (integer) required starting_after (string) status (string) |
| get_v1_phone_numbers_by_id | Refresh the same per-phone renewal assessment without email or lifecycle repair, including during production credit exhaustion. renewal reports the current UTC month under the renewal policy /phone-numbers renewal-policy: the next monthly charge, whether the month is unpaid with the recommended action, and on the free plan the release instant release_cutoff_at. A requested release reads release_pending and a completed one released. Requires phone_numbers:read and the owning project/environment; | id (string) required |
| delete_v1_phone_numbers_by_id | User-initiated disconnect. Flips the number to disconnected, emits phone_number.disconnected, and writes an audit log row in one transaction. Idempotent on already-terminal rows. Disconnecting does not end a rental: a Tyxter-rented number keeps billing until POST /v1/phone-numbers/id/release. | id (string) required |
| post_v1_phone_numbers_by_id_convert_to_byon | Ends the current customer-Salvy management episode without releasing, deregistering, replacing, or changing the phone or its Meta link. The request body must be exactly and Idempotency-Key is required. It returns the same phone id with source byon and salvy_management null. A live attachment whose Salvy credential is disconnected is still eligible for this free exit. | id (string) required idempotency-key (string) required data: { } (object) required |
| post_v1_phone_numbers_by_id_release | Releases a Salvy-provisioned number back to the carrier release_requested, then released by the worker or releases a BYON number directly. Idempotent on already-terminal rows. | id (string) required idempotency-key (string) |
| post_v1_phone_numbers_by_id_transfer | Moves a phone number between environments of the same kind in the same organization: production to production, or sandbox to sandbox. The body must re-confirm the route phone number id plus the source and target tuples. | id (string) required idempotency-key (string) data: { . source_project_id (string) . source_environment_id (string) . target_project_id (string) . target_environment_id (string) . confirm_phone_number_id (string) . reason (string) } (object) required |
| get_v1_provider_connections | Lists active provider connections for the API key environment. Requires provider_connections:read. | limit (integer) required starting_after (string) |
| get_v1_provider_connections_status | Returns aggregate per-channel readiness for the API key environment so one call answers whether the caller can send WhatsApp or Instagram, collect payments, or initiate agentic Pix. Each channel reports ready, status, and an advisory reason; the payments channel additionally reports active_connection_id and active_mode. Requires provider_connections:read. | No parameters |
| get_v1_provider_connections_meta_onboarding | Returns non-secret Meta Embedded Signup launch metadata. Requires provider_connections:write. | No parameters |
| get_v1_provider_connections_by_connection_id | Retrieves one active provider connection in the API key environment. Requires provider_connections:read. | connection_id (string) required |
| delete_v1_provider_connections_by_connection_id | Disconnects a provider connection and clears credentials without deleting audit history. Returns a compact id, object, status: 'disconnected' stub, not the full connection object. Requires provider_connections:write. | connection_id (string) required |
| post_v1_provider_connections_meta | For WhatsApp registrations, Tyxter display-name warnings are advisory and do not block submission or represent Meta approval. Registers or replaces the Meta WhatsApp or Instagram connection for the API key environment. Requires provider_connections:write. | idempotency-key (string) data: { . channel (string) . display_name (string) . waba_id (string) . phone_number_id (string) . ig_business_account_id (string) . page_id (string) . access_token (string) . token_source (string) . token_expires_at } (object) required |
| post_v1_provider_connections_salvy | Creates a customer-owned Salvy BYOK connection after runtime and active-plan admission. Production uses the Salvy adapter; sandbox uses the same sealed lifecycle with a deterministic provider-free simulator. The credential is sealed and validation/discovery run asynchronously in the provider-phone worker; this request never calls Salvy. A 202 means that the operation was queued: poll the returned connection until its operation is succeeded, then read the cached Salvy numbers snapshot. Requires p | idempotency-key (string) required data: { . api_key (string) . display_name (string) . continuation_terms_version (string) } (object) required |
| post_v1_provider_connections_meta_oauth | For WhatsApp registrations, Tyxter display-name warnings are advisory and do not block submission or represent Meta approval. Exchanges a Facebook JS SDK OAuth code and registers the resulting Meta connection. waba_id is optional only for a code-only signup relay: Tyxter continues when Meta granular scopes identify exactly one WhatsApp Business Account; otherwise it preserves a retryable pending setup. Requires provider_connections:write. | idempotency-key (string) data: { . code (string) . waba_id (string) . phone_number_id (string) . display_name (string) . business_id (string) . signup_session_id (string) } (object) required |
| post_v1_provider_connections_by_connection_id_meta_complete_registration | For WhatsApp registrations, Tyxter display-name warnings are advisory and do not block submission or represent Meta approval. Finishes a Meta WhatsApp connection whose signup stopped after the access token was already brokered — the connection reads status 'pending'. Re-runs WABA discovery when the signup relay did not supply one, then completes the remaining provider steps from the stored credentials, revalidates them, and returns the connection as 'connected'. Takes no request body, and does n | connection_id (string) required idempotency-key (string) |
| post_v1_provider_connections_by_connection_id_rotate | Validates and stores a replacement provider access token without returning plaintext secrets. Requires provider_connections:write. | connection_id (string) required idempotency-key (string) data: { . access_token (string) . token_source (string) . token_expires_at } (object) required |
| post_v1_provider_connections_by_connection_id_salvy_rotate | Queues a generation-fenced Salvy replacement credential. The current stored credential is retained while the worker validates the candidate and proves that every managed provider number remains visible; the candidate is considered validated only after its connection reaches connected. A failed candidate is discarded without replacing the retained credential. Requires provider_connections:write. | connection_id (string) required idempotency-key (string) required data: { . api_key (string) } (object) required |
| post_v1_provider_connections_by_connection_id_salvy_discovery | Queues a refresh of the persisted Salvy number inventory using the current stored credential on a connected connection. The API continues to serve the last successful snapshot until the worker completes; it does not call Salvy on this request. Requires provider_connections:write. | connection_id (string) required idempotency-key (string) required data: { } (object) required |
| get_v1_provider_connections_by_connection_id_salvy_numbers | Returns only the scoped, persisted Salvy number discovery snapshot with cursor pagination. This read never decrypts credentials or calls Salvy; an empty snapshot is returned before the first successful discovery. Requires provider_connections:read. | connection_id (string) required limit (integer) required starting_after (string) |
| post_v1_provider_credential_setup_sessions | Creates a short-lived hosted dashboard handoff so a human can enter provider credentials without exposing secrets to the calling agent. Accepted targets include salvy target: 'salvy' for Salvy BYOK and openai.stt for a production OpenAI transcription override. A Salvy setup_url opens Connections → Providers; after the connection reaches connected, the hosted flow completes the session and its poll response reports completed_provider_connection_id. If completion is attempted before the Salvy conn | idempotency-key (string) data: { . target (string) } (object) required |
| get_v1_provider_credential_setup_sessions_by_request_id | Polls the status of a credential setup session. A completed salvy target reports the connected Salvy id in completed_provider_connection_id, while the TTS and STT completion axes remain null. A completed openai.stt target reports OpenAI on its dedicated STT completion axis while the provider-connection and TTS completion axes remain null. Requires provider_credentials:setup. Never returns plaintext credentials. | request_id (string) required |
| post_v1_meta_signup_sessions | Creates a 30-minute Tyxter-hosted Meta Embedded Signup handoff for the API key production environment. Requires provider_connections:write and Idempotency-Key. return_url must match a deployment allowlist. | idempotency-key (string) data: { . return_url (string) . end_customer_ref (string) } (object) required |
| get_v1_meta_signup_sessions_by_session_id | Polls a hosted signup session in the API key scope. Requires provider_connections:read. The one-time launch URL is returned only on create/replay; polling returns url: null. A completion that started before expires_at is allowed to finish, so status can stay processing for up to 10 minutes past expires_at before it settles on completed or expired. | session_id (string) required |
| post_v1_webhook_endpoints | Returns signing_secret once on creation. Store it for verifying Tyxter webhook delivery signatures; retrieve/list/update responses never reveal it. The endpoint is registered in the calling key’s project and environment and receives only that environment’s events; an integration spanning several projects registers one endpoint per project and environment. | idempotency-key (string) data: { . url (string) . description (string) . subscribed_events (array) } (object) required |
| get_v1_webhook_endpoints | List webhook endpoints | limit (integer) required starting_after (string) |
| get_v1_webhook_endpoints_by_id | Every endpoint response includes nullable disabled_detail. An auto-disabled endpoint reports its triggering last_status_code or null when no response arrived, failure_class, and optional probation_retrip: true; active, manually disabled, and legacy rows return null. The probation boolean is true after breaker recovery until the first successful real delivery. The diagnosis never includes breaker counters, internal events, or a signing secret. | id (string) required |
| patch_v1_webhook_endpoints_by_id | PATCH status active is the only recovery action for an auto-disabled endpoint: it clears counters, disabled_reason and disabled_detail and sets probation true after a breaker trip. Probation re-trips at three consecutive real delivery failures; the first real delivery success restores the normal twenty-failure threshold. A failed test never blocks PATCH. It never sends customer HTTP, rotates the signing secret or replays terminal events. | id (string) required idempotency-key (string) data: { . url (string) . description . subscribed_events (array) . status (string) } (object) required |
| delete_v1_webhook_endpoints_by_id | Soft-deletes a webhook endpoint and returns it with status = disabled. Idempotent: replaying with the same Idempotency-Key or re-deleting an already-deleted endpoint returns the same body. | id (string) required idempotency-key (string) |
| post_v1_webhook_endpoints_by_id_rotate_signing_secret | Returns the new signing_secret once. Existing webhook endpoint details continue to hide signing secrets. | id (string) required idempotency-key (string) |
| post_v1_webhook_endpoints_by_id_test | Creates one durable webhook.test event and its first delivery attempt for this scoped active or breaker-disabled endpoint, without re-enabling it. This direct signed probe ignores subscribed_events, returns a pending receipt with webhook_event_id to poll GET /v1/webhook-events/id for attempts.status_code and attempts.failure_class, and records transport evidence. A test delivery is always terminal after attempt 1 and never schedules a retry. Probes read while disabled or on probation never chang | id (string) required idempotency-key (string) |
| get_v1_webhook_events | List webhook events | limit (integer) required starting_after (string) event_type (string) event_types webhook_endpoint_id (string) status (string) |
| get_v1_webhook_events_listen | Long-poll pull API used by the Tyxter CLI and conformance probes. Sandbox keys can call it directly. Production keys must first create and, with the owning API key, pass a short-lived listen_session_id from POST /v1/webhook-events/listen-sessions; production reads include only events with created_at = session.created_at and session.expires_at. Pass webhook_endpoint_id to filter events to that endpoint subscription and attach a signature_preview generated with that endpoint secret, including the | limit (integer) required cursor (string) start_at (string) required event_type (string) event_types wait_ms (integer) required webhook_endpoint_id (string) listen_session_id (string) |
| post_v1_webhook_events_listen_sessions | Production-only diagnostic lease for temporary no-public-URL webhook polling. Requested TTL is 30 to 300 seconds; sessions default to and cannot exceed 5 minutes, are rate-limited, and should be disabled with DELETE when the probe finishes. They expose events with created_at = session.created_at and session.expires_at only, and are not a durable or gapless transport. If one is active, only its owning API key may retain, reuse, and poll the returned id outside grace or POST again with 30 seconds | data: { . ttl_seconds (integer) . reason (string) } (object) required |
| delete_v1_webhook_events_listen_sessions_by_listen_session_id | Disables a production listen session before its automatic expiry so CLI polling remains an ephemeral validation path, not a production transport. | listen_session_id (string) required |
| get_v1_webhook_events_listen_by_outbox_event_id | Retrieves one listen event. Sandbox keys can call it directly. Production keys must pass their owning API key's active listen_session_id and can retrieve only an event with created_at = session.created_at and session.expires_at. Pass webhook_endpoint_id to attach the same signature_preview shape returned by the list listen endpoint. Automatically suppressed phone-bound inbound content uses webhook_listen_event_not_found. | outbox_event_id (string) required webhook_endpoint_id (string) listen_session_id (string) |
| get_v1_webhook_events_by_id | Poll the webhook_event_id from POST /v1/webhook-endpoints/id/test until status is delivered or failed. Attempts expose status_code and failure_class; pending, successful, historical and unclassified outcomes have null failure_class. | id (string) required |
| post_v1_webhook_events_by_id_resend | Creates a distinct replay attempt under current phone-service policy. Automatic suppression remains terminal; after recovery an explicit replay may use the unchanged historical snapshot. An accepted idempotent replay returns its original result. | id (string) required idempotency-key (string) |
| post_v1_webhook_events_bulk_resend | Creates distinct explicit replay attempts for eligible historical events. Events whose current phone-service policy refuses forwarding count as skipped. Replay does not reset permanent automatic-source suppression. | idempotency-key (string) data: { . webhook_event_ids (array) . event_type (string) . status (string) . limit (integer) } (object) required |
| get_v1_billing_balance | Returns the organization wallet and production_blocked, the current production API-key/MCP credit restriction including existing recovery exemptions, independently of the selected environment. production_blocked is true while balance_brl is at or below -5 BRL and false as soon as it is above -5 BRL. A lifted block does not promise coverage of the next rental fee, pay a phone rental month that is still unpaid it counts as paid once the balance is zero or above, or clear other sending gates. held_ | No parameters |
| get_v1_rate_cards_current | Read the current rate card | No parameters |
| get_v1_rate_cards | Lists effective-dated rate cards, including historical and future cards. | limit (integer) required starting_after (string) currency (string) |
| get_v1_billing_plans | Public plan catalog FREE is the absence of a subscription, never a row. salvy_byok_enabled identifies SKUs eligible for Salvy BYOK admission; Standard and Growth are enabled in the seeded catalog, while runtime availability follows the rollout fence. net_transport_rate_brl is the accepted-message transport fee on each plan base × the plan multiplier. The same multiplier applies to eligible pre-acceptance failure processing, whose separate list rate is on the rate card; failure fees do not consum | No parameters |
| get_v1_billing_plan | The organization current plan. status: 'none' means FREE. salvy_byok_enabled is true only when the active paid term uses an eligible SKU; runtime availability follows the rollout fence. net_transport_rate_brl is the rate you are actually billed per provider-accepted outbound WhatsApp message. | No parameters |
| post_v1_billing_plan_subscribe | Subscribe by card rail: 'stripe_card', requires a saved payment method, recurring or by annual Pix rail: 'pix_annual', returns a one-time Pix charge to pay for a 12-month term. Entitlement discount/tier/phone allowance activates ONLY on the provider webhook, never optimistically from this call. Honors Idempotency-Key; a duplicate sent while the first request is still in flight returns 409 idempotency_key_in_progress — retry after the original finishes. | idempotency-key (string) data: { . plan_offering_id (string) . rail (string) } (object) required |
| post_v1_billing_plan_change | Switch the active card subscription to another plan. Upgrades prorate immediately; downgrades take effect at the next billing cycle. The new plan is applied when the Stripe webhook confirms. Honors Idempotency-Key; a duplicate sent while the first request is still in flight returns 409 idempotency_key_in_progress — retry after the original finishes. | idempotency-key (string) data: { . plan_offering_id (string) } (object) required |
| post_v1_billing_plan_cancel | Voluntary cancel: the current term rides to its period end the discount + tier persist, then the org reverts to FREE. Non-payment is handled separately and drops to FREE immediately. Honors Idempotency-Key; a duplicate sent while the first request is still in flight returns 409 idempotency_key_in_progress — retry after the original finishes. | idempotency-key (string) |
| get_v1_billing_ledger | Newest-first, cursor-paginated debits usage, credits top-ups and payment completion-fee hold and release entries. Only debit is spend. A payment fee entry carries payment_fee with the payment object, the payment id and the fee reservation id: the payment.initiation debit, the completion hold, and then either its release or its payment.completion debit. A settled hold keeps its hold entry and is charged once, by that debit. Usage and holds default to production; environment=sandbox lists sandbox | limit (integer) required starting_after (string) environment (string) source_type (string) |
| get_v1_billing_phone_management | Cursor-paginated management coverage for numbers imported from your own Salvy account, scoped to the API key project and environment. coverage plan means a Standard or Growth plan covers management at no fee, including the whole UTC month in which the plan ends; covered_until is then the 1st after the covered months, when the first fee is due. prepaid means one full phone.management.month fee was charged for the current UTC month; covered_until is the next 1st. none means neither applies, for ex | limit (integer) required starting_after (string) |
| get_v1_billing_phone_renewals | Deprecated. Migration: read the renewal field of GET /v1/phone-numbers and GET /v1/phone-numbers/id, which reports each rented number's current month next charge on the 1st, unpaid state, and the release instant on the free plan. This route keeps answering with the renewal cycles recorded by the retired prepaid renewal design, cursor-paginated and scoped to the API key project and environment; no new cycle is recorded, so a number rented or renewed under the current policy has none. A stored cyc | limit (integer) required starting_after (string) status (string) |
| get_v1_billing_phone_renewals_by_cycle_id | Deprecated. Migration: read the renewal field of GET /v1/phone-numbers/id. Retrieves one renewal cycle recorded by the retired prepaid renewal design in the API key tenant, project, and environment. The cycle's status and actions describe that recorded cycle, not the current month; a month charged on its 1st may show as cancelled, and renewed does not mean wallet debt is paid. The nullable display identifier is the independently retained business phone resource when available; no recipient conta | cycle_id (string) required |
| get_v1_invoices | Org-scoped invoice list with cursor pagination. Pass project_id to narrow to one project. | limit (integer) required starting_after (string) project_id (string) |
| get_v1_invoices_by_id_download | Returns a short-lived 15 minute presigned CSV download URL for a ready invoice. | id (string) required |
| get_v1_billing_packages | List billing packages | limit (integer) required starting_after (string) status (string) |
| post_v1_billing_packages_purchase | Charges the saved default payment method for a credit package and returns the resulting top-up. Honors Idempotency-Key; a duplicate sent while the first request is still in flight returns 409 idempotency_key_in_progress — retry after the original finishes. | idempotency-key (string) data: { . package_code (string) . payment_method (string) . payment_method_id (string) } (object) required |
| get_v1_billing_payment_methods | Returns saved payment method summaries. Card data is never returned in full. | No parameters |
| post_v1_billing_payment_methods | Saves a card after SetupIntent confirmation. When a failed automatic top-up turned auto top-up off, saving a card turns it back on and points it at this card, with no immediate charge; a configuration turned off with PUT /v1/billing/auto-topup, or by deleting its card, stays off. Honors Idempotency-Key; a duplicate sent while the first request is still in flight returns 409 idempotency_key_in_progress — retry after the original finishes. | idempotency-key (string) data: { . stripe_payment_method_id (string) . set_default (boolean) } (object) required |
| post_v1_billing_payment_methods_setup_intent | Creates a Stripe SetupIntent so a browser can tokenize a card without exposing card data to the API caller. Honors Idempotency-Key; a duplicate sent while the first request is still in flight returns 409 idempotency_key_in_progress — retry after the original finishes. | idempotency-key (string) |
| post_v1_billing_payment_methods_by_payment_method_id_default | Makes an active saved card the default. When a failed automatic top-up turned auto top-up off, this turns it back on and points it at this card, with no immediate charge; a configuration turned off with PUT /v1/billing/auto-topup, or by deleting its card, stays off. Honors Idempotency-Key; a duplicate sent while the first request is still in flight returns 409 idempotency_key_in_progress — retry after the original finishes. | payment_method_id (string) required idempotency-key (string) |
| delete_v1_billing_payment_methods_by_payment_method_id | Replays with the same Idempotency-Key return the original response instead of 404ing on the already-deleted row. Honors Idempotency-Key; a duplicate sent while the first request is still in flight returns 409 idempotency_key_in_progress — retry after the original finishes. | payment_method_id (string) required idempotency-key (string) |
| get_v1_billing_auto_topup | A failed automatic top-up turns enabled off. Saving a card or making one default turns back on only a configuration a failure turned off, and PUT with enabled: true turns it on; none of these charges immediately. | No parameters |
| put_v1_billing_auto_topup | Replaces the configuration. enabled: true turns auto top-up on, including a configuration a failed automatic top-up turned off; enabled: false keeps it off even when a card is saved later. Turning it on charges nothing immediately: the next automatic top-up starts when a debit takes the balance from above threshold_brl to at or below it. Honors Idempotency-Key; a duplicate sent while the first request is still in flight returns 409 idempotency_key_in_progress — retry after the original finishes. | idempotency-key (string) data: { . enabled (boolean) . threshold_brl (string) . amount_brl (string) . payment_method_id } (object) required |
| get_v1_data_retention | Returns the environment data-retention policy: retention_days default 90, bounds 7-365 and data_export_enabled default true. An environment with no policy set returns the platform default with updated_at null — never a 404. The environment is taken from the API key; sandbox and production keys read their own environment. | No parameters |
| patch_v1_data_retention | Upserts the environment data-retention policy. Send at least one of retention_days 7-365 or data_export_enabled. The environment is taken from the API key, never the body. Repeats with the same Idempotency-Key and body replay the stored response. | idempotency-key (string) data: { . retention_days (integer) . data_export_enabled (boolean) } (object) required |
| get_v1_account | Requires a valid bearer API key but no additional scope. Returns the organization, project, environment, current API key summary, and one dashboard owner contact so agents can identify which dashboard account a key belongs to. Does not return plaintext secrets or the full member list. | No parameters |
| get_v1_me | Alias of GET /v1/account for clients and integrating agents that look for a whoami-style route. | No parameters |
| post_v1_projects | Creates an active project in the API key organization with sandbox and production environments. Requires projects:write. Idempotency-Key is optional; reusing a key with the same parsed request replays the original 201 response, while a changed request returns 409 idempotency_key_conflict. | idempotency-key (string) data: { . name (string) . slug (string) } (object) required |
| get_v1_projects | Lists active projects in the API key organization in created_at/id descending cursor order. Requires projects:read. Archived projects are omitted. | limit (integer) required starting_after (string) |
| get_v1_projects_by_project_id | Retrieves one active project in the API key organization. Requires projects:read. Archived and foreign project ids are hidden as not found. | project_id (string) required |
| post_v1_agent_api_key_device_authorizations | Unauthenticated RFC 8628-shaped bootstrap for integrating agents that do not yet have a Tyxter key. Returns short-lived device_code and user_code values plus dashboard verification URLs. It does not issue OAuth access tokens; approved requests are later redeemed for a one-time Tyxter kind=agent API key. | tyxter-trace-id (string) data: { . client_name (string) . environment (string) . scopes (array) . expires_at (string) } (object) required |
| post_v1_agent_api_key_device_authorizations_token | Unauthenticated polling endpoint for the agent API-key device flow. Pending approvals return HTTP 202 with interval/expires metadata. After owner/admin approval, HTTP 200 returns the one-time API-key secret plus preflight checks. Stable terminal errors include invalid_device_code, device_code_expired, and authorization_denied. | tyxter-trace-id (string) data: { . grant_type (string) . device_code (string) } (object) required |
| post_v1_api_keys | Requires api_keys:admin. The plaintext secret is returned once on create. API-key callers can only mint strict subset scopes and cannot grant api_keys:admin. Omit project_id to mint into the caller’s current project and environment. An API-key caller may instead name one active project in its own organization; Tyxter resolves that project’s environment of the caller’s sandbox or production kind server-side. This cannot select another organization or cross the sandbox/production boundary. | idempotency-key (string) data: { . name (string) . environment (string) . project_id (string) . scopes (array) . expires_at (string) } (object) required |
| get_v1_api_keys | Requires api_keys:read. Responses include display prefixes, never plaintext secrets. | limit (integer) required starting_after (string) |
| get_v1_api_keys_by_api_key_id | Requires api_keys:read. Cross-organization keys return 404. | api_key_id (string) required |
| patch_v1_api_keys_by_api_key_id | Requires api_keys:admin. | api_key_id (string) required data: { . name (string) } (object) required |
| delete_v1_api_keys_by_api_key_id | Requires api_keys:admin. Revoke is idempotent for already revoked keys. | api_key_id (string) required |
| post_v1_api_keys_by_api_key_id_rotate | Requires api_keys:admin. Returns the new plaintext secret once and invalidates the previous secret hash. Replays with the same Idempotency-Key return the same secret. | api_key_id (string) required idempotency-key (string) |
| post_v1_payments | Creates a merchant-facing BRL payment_request record and queues the configured merchant payment provider. The offered merchant provider is currently abacate_pay; requests that resolve to a provider the platform does not offer fail with payment_provider_disabled. When sandbox has no selected provider connection, active_mode sandbox_default uses a deterministic hosted-link fixture reported as provider iniciador, its schema name and rejects provider_options.abacate_pay. payment_link_url can be null | idempotency-key (string) tyxter-trace-id (string) data: { . amount_brl_centavos (integer) . description (string) . customer_name (string) . customer_tax_id (string) . customer_phone (string) . customer_email (string) . external_reference (string) . metadata (object) . provider_options (object) } (object) required |
| get_v1_payments | List payment requests | limit (integer) required starting_after (string) status (string) |
| get_v1_payments_by_payment_id | Retrieve a payment request | payment_id (string) required |
| get_v1_sandbox_quickstart | Reports sandbox sender availability, approved template readiness, missing scopes, webhook listen settings, and local signature headers without creating resources. Read it before the first send: capabilities.send_outbound_messages and capabilities.send_template_messages tell you whether that send can succeed, so you never have to discover missing setup from a rejected request. | No parameters |
| post_v1_sandbox_templates_by_template_id_status | Sandbox-only fixture for rejected, paused, and disabled template states so integrations can validate send refusal behavior deterministically. | template_id (string) required tyxter-trace-id (string) data: { . status (string) . rejection_reason (string) } (object) required |
| post_v1_sandbox_payments_by_payment_id_status | Sandbox-only fixture for paid, failed, expired, and cancelled payment_request states. Emits the same customer-visible payment lifecycle event that a provider webhook would emit, such as payment.paid, without calling a payment provider. The connectionless sandbox default is a deterministic hosted-link fixture; use a selected Abacate Pay sandbox connection for provider_options.abacate_pay. | payment_id (string) required idempotency-key (string) tyxter-trace-id (string) data: { . status (string) . provider_event_id (string) . metadata (object) } (object) required |
| post_v1_sandbox_groups_by_group_id_participants | Beta. Sandbox keys only; requires groups:write and honors Idempotency-Key. Simulates Meta reporting that the participant with WhatsApp ID wa_id joined action join or was removed action remove on an active WhatsApp Business group, and returns 200 with the group and its participants; the call never reaches Meta. In production a group's participants change only when Meta reports a join or a removal by webhook. A join of a current member or a removal of a non-member changes nothing and records no ev | group_id (string) required idempotency-key (string) data: { . wa_id (string) . action (string) } (object) required |
| post_v1_sandbox_llm_failure | Sandbox-only fixture that arms a forced LLM provider failure provider_down, auth_failed, timeout, or cost_cap_reached so integrators can exercise their error handling deterministically without misconfiguring a real BYOK key. Omit ttl_seconds for a one-shot arm spent by the next completion; pass it to bound the arm to a time window. Re-arming replaces the current fixture. Requires a sandbox api key; a production key is rejected with 400 sandbox_llm_failure_sandbox_only. | idempotency-key (string) tyxter-trace-id (string) data: { . failure (string) . ttl_seconds (integer) } (object) required |
| post_v1_payments_by_payment_id_cancel | Accepts an empty JSON object. Returns HTTP 200 with the current payment while cancellation runs asynchronously. Poll GET /v1/payments/payment_id for provider confirmation. Same-key replay returns the original response; it is not a fresh status read. Terminal hosted payments are a no-op. Transparent Pix and unsupported providers return 400 payment_cancellation_unsupported with error.feedback and no mutation. A link that is not ready returns 409 payment_link_not_ready. A confirmed paid result take | payment_id (string) required idempotency-key (string) tyxter-trace-id (string) data: { } (object) required |
| post_v1_payments_by_payment_id_request_approval | Moves a pending payment request into approval_requested for operator review. This does not generate a provider payment link. | payment_id (string) required idempotency-key (string) tyxter-trace-id (string) data: { . note (string) . metadata (object) } (object) required |
| get_v1_usage | Read usage summary | period_start (string) required period_end (string) required environment (string) group_by (string) |
| get_v1_usage_records | List usage records | limit (integer) required starting_after (string) environment (string) meter_id (string) recorded_after (string) recorded_before (string) |
| get_v1_fiscal_nfse | Org-scoped, environment-agnostic NFS-e list with cursor pagination no project_id — fiscal is org-level. Optional status / source_kind filters. Reachable with a sandbox or production key; reads never expose the certificate, signed DPS, stored event bodies, or config snapshots. | limit (integer) required starting_after (string) status (string) source_kind (string) |
| get_v1_fiscal_nfse_by_id | Returns the public fields of one NFS-e fiscal document. Cross-org lookups return 404, never 403. | id (string) required |
| get_v1_fiscal_nfse_by_id_danfse | Returns a short-lived 15 minute presigned DANFSE PDF download URL. Reachable even when production credit is exhausted a legal tax document is never balance-gated. | id (string) required |
| get_v1_fiscal_nfse_by_id_xml | Returns a short-lived 15 minute presigned authorized NFS-e XML download URL. Reachable even when production credit is exhausted. | id (string) required |
| put_v1_llm_routes | Requires llm:write and honors Idempotency-Key. | idempotency-key (string) data: { . phone_number_id (string) . provider (string) . model (string) . api_key (string) . system_prompt (string) . max_tokens (integer) . temperature (number) . daily_cost_cap_brl (string) . handoff_phrases (array) . blocked_topics (array) . blocked_topic_fallback_response (string) . max_context_messages (integer) . max_context_age_seconds . memory_persistence (string) . enabled (boolean) } (object) required |
| get_v1_llm_routes | Read an LLM route | phone_number_id (string) |
| patch_v1_llm_routes | Update an LLM route | phone_number_id (string) data: { . model (string) . api_key (string) . system_prompt (string) . max_tokens (integer) . temperature (number) . daily_cost_cap_brl . handoff_phrases (array) . blocked_topics (array) . blocked_topic_fallback_response (string) . max_context_messages (integer) . max_context_age_seconds . memory_persistence (string) . enabled (boolean) } (object) required |
| delete_v1_llm_routes | Requires llm:write and honors Idempotency-Key. | phone_number_id (string) idempotency-key (string) |
| get_v1_llm_routes_prompt_versions | List LLM prompt versions | limit (integer) required starting_after (string) phone_number_id (string) |
| post_v1_llm_completions | In sandbox, POST /v1/sandbox/llm/failure can arm a forced provider failure the next completion surfaces through this same error mapping auth_failed → 400 llm_provider_auth_failed, provider_down/timeout → 502 provider_error, cost_cap_reached → 402 llm_cost_cap_reached so integrators can test error handling deterministically. | idempotency-key (string) tyxter-trace-id (string) data: { . messages (array) . contact_phone (string) . phone_number_id (string) . trace_id (string) } (object) required |
| get_v1_llm_responses | List LLM response logs | limit (integer) required starting_after (string) |
| post_v1_ai_agents | Beta. Creates a customer-configured LLM persona for WhatsApp automation. Requires ai_agents:write. For inbound automations, memory_persistence defaults to disabled current prompt only; opt_in and opt_out both include stored conversation text scoped to the contact and business number, bounded by max_context_messages including the current prompt and max_context_age_seconds. This does not create a separate durable memory store. Explicit completions use only caller-supplied messages in every mode. | idempotency-key (string) data: { . name (string) . description (string) . provider (string) . model (string) . api_key (string) . system_prompt (string) . max_tokens (integer) . temperature (number) . daily_cost_cap_brl (string) . handoff_phrases (array) . blocked_topics (array) . blocked_topic_fallback_response (string) . max_context_messages (integer) . max_context_age_seconds . memory_persistence (string) . enabled (boolean) } (object) required |
| get_v1_ai_agents | Beta. Requires ai_agents:read. | limit (integer) required starting_after (string) include_archived (boolean) |
| get_v1_ai_agents_by_agent_id | Beta. Requires ai_agents:read. | agent_id (string) required |
| patch_v1_ai_agents_by_agent_id | Beta. Requires ai_agents:write. | agent_id (string) required data: { . name (string) . description . model (string) . api_key (string) . system_prompt (string) . max_tokens (integer) . temperature (number) . daily_cost_cap_brl . handoff_phrases (array) . blocked_topics (array) . blocked_topic_fallback_response (string) . max_context_messages (integer) . max_context_age_seconds . memory_persistence (string) . enabled (boolean) . archived (boolean) } (object) required |
| delete_v1_ai_agents_by_agent_id | Beta. Requires ai_agents:write. | agent_id (string) required |
| post_v1_ai_agents_by_agent_id_completions | Beta. Runs one completion against the agent persona using only caller-supplied messages, regardless of memory_persistence; stored-history lookup is limited to inbound automations. Requires ai_agents:invoke and honors Idempotency-Key; a keyed replay returns the stored completion without calling or billing the provider again, and a duplicate sent while the first request is still in flight returns 409 idempotency_key_in_progress — retry after the original finishes. A completion with handoff: true r | agent_id (string) required idempotency-key (string) tyxter-trace-id (string) data: { . messages (array) . contact_phone (string) . trace_id (string) } (object) required |
| get_v1_ai_agents_by_agent_id_prompt_versions | Beta. Requires ai_agents:read. | agent_id (string) required limit (integer) required starting_after (string) |
| get_v1_ai_agents_by_agent_id_response_logs | Beta. Requires ai_agents:read. | agent_id (string) required limit (integer) required starting_after (string) |
| get_v1_agentic_banks | Beta. Requires agentic_payments:read. | search (string) limit (integer) required |
| post_v1_agentic_authorizations | Beta. Requires agentic_payments:write. | idempotency-key (string) tyxter-trace-id (string) data: { . participant_id (string) . participant_name (string) . customer_name (string) . customer_tax_id (string) . business_entity (object) . agent_reason (string) . external_reference (string) . metadata (object) . redirect_url (string) . redirect_on_error_url (string) } (object) required |
| get_v1_agentic_authorizations | Beta. Requires agentic_payments:read. | limit (integer) required starting_after (string) status (string) customer_tax_id (string) |
| get_v1_agentic_authorizations_by_authorization_id | Beta. Requires agentic_payments:read. | authorization_id (string) required |
| post_v1_agentic_authorizations_by_authorization_id_revoke | Beta. Requires agentic_payments:write. | authorization_id (string) required idempotency-key (string) tyxter-trace-id (string) |
| post_v1_agentic_payments | Beta. Requires agentic_payments:write and an active authorization. description is the Iniciador bank-statement memo and is limited to 140 characters; agent_reason is the hosted-page reason shown to the payer. Every accepted payment is charged a flat initiation fee and holds a completion fee, a percentage of the amount, until the outcome; the response reports both in fees, and a sandbox payment reports them with fees.simulated = true and moves no balance. A replay with the same Idempotency-Key re | idempotency-key (string) tyxter-trace-id (string) data: { . amount_brl_centavos (integer) . method (string) . participant_id (string) . participant_name (string) . customer_name (string) . customer_tax_id (string) . business_entity (object) . agent_reason (string) . description (string) . pix_key (string) . qr_code (string) . creditor (object) . external_reference (string) . metadata (object) . redirect_url (string) . redirect_on_error_url (string) } (object) required |
| get_v1_agentic_payments | Beta. Requires agentic_payments:read. | limit (integer) required starting_after (string) status (string) customer_tax_id (string) |
| get_v1_agentic_payments_by_payment_id | Beta. Requires agentic_payments:read. | payment_id (string) required |
| post_v1_agentic_payments_by_payment_id_cancel | Beta. Requires agentic_payments:write. | payment_id (string) required idempotency-key (string) tyxter-trace-id (string) |
| post_v1_sandbox_inbound_messages | WhatsApp inbound from must be a possible E.164 subscriber number: a real provider can never deliver a message from an impossible number, so the sandbox simulator rejects one too. The check runs before rate-limit, idempotency, and any persistence. Instagram from values are opaque provider ids and are not phone-validated. type accepts text, media, interactive, flow, unsupported, and unknown. The first four carry the matching content field. type: 'unsupported' simulates content the provider refused | idempotency-key (string) tyxter-trace-id (string) data: { . channel (string) . from (string) . group_id (string) . to (string) . type (string) . reaction (object) . text (object) . media (object) . interactive (object) . flow (object) . unsupported (object) . unknown (object) . metadata (object) } (object) required |
| custom | Call any endpoint of the connected service while reusing the connection auth. Pass the full URL as _url. Other reserved keys: _method, _query, _body, _headers. Remaining params flow naturally — empty → GET, non-empty → POST JSON body. | _url (string) required _method (string) _query (object) _body _headers (object) |
Webhook Events
This connector emits 82 events back to your workflow. To receive one, create a hook whose path is <connection-name>/<event> — the connection name you configured plus the event from the table below.
| Event | Description |
|---|---|
| message-received | Mensagem recebida. |
| group-message-received | Mensagem recebida em um grupo. |
| message-sent | Mensagem enviada. |
| message-delivered | Mensagem entregue. |
| message-read | Mensagem lida. |
| message-failed | Falha no envio de uma mensagem. |
| message-expired | Mensagem expirada. |
| message-delivery-timeout | Prazo de entrega da mensagem excedido. |
| message-cancelled | Mensagem cancelada. |
| message-reaction-received | Reação a uma mensagem recebida. |
| message-media-transcribed | Transcrição de mídia concluída. |
| message-media-transcription-failed | Falha na transcrição de mídia. |
| message-opted-out | Mensagem bloqueada por opt-out. |
| message-batch-completed | Campanha concluída. |
| message-batch-cancelled | Campanha cancelada. |
| message-batch-failed | Falha em uma campanha. |
| template-approved | Template aprovado. |
| template-rejected | Template rejeitado. |
| template-paused | Template pausado. |
| template-disabled | Template desativado. |
| flow-published | Flow publicado. |
| flow-rejected | Flow rejeitado. |
| flow-completed | Flow concluído. |
| phone-number-verified | Número de telefone verificado. |
| phone-number-disconnected | Número de telefone desconectado. |
| phone-number-released | Número de telefone liberado. |
| phone-number-tier-changed | Categoria do número alterada. |
| phone-number-quality-changed | Qualidade do número alterada. |
| phone-number-messaging-tier-changed | Categoria de mensagens do número alterada. |
| phone-number-name-status-changed | Status do nome do número alterado. |
| phone-number-messaging-limit-paused | Envios pausados pelo limite de destinatários. |
| phone-number-messaging-limit-resumed | Envios retomados após o limite de destinatários. |
| contact-opted-in | Contato autorizou o recebimento de mensagens. |
| contact-opted-out | Contato revogou o recebimento de mensagens. |
| contact-erased | Dados do contato apagados. |
| llm-handoff-requested | Roteamento de IA solicitou atendimento humano. |
| llm-cost-cap-reached | Limite de custo do roteamento de IA atingido. |
| llm-blocked-topic-triggered | Tema bloqueado detectado no roteamento de IA. |
| ai-agent-handoff-requested | Agente de IA solicitou atendimento humano. |
| ai-agent-cost-cap-reached | Limite de custo do agente de IA atingido. |
| ai-agent-blocked-topic-triggered | Tema bloqueado detectado pelo agente de IA. |
| automation-run-completed | Execução de automação concluída. |
| automation-run-failed | Execução de automação falhou. |
| automation-run-cancelled | Execução de automação cancelada. |
| automation-step-completed | Etapa de automação concluída. |
| automation-step-failed | Etapa de automação falhou. |
| automation-custom | Evento customizado de automação. |
| credit-topped-up | Recarga de créditos recebida. |
| credit-low-balance | Saldo de créditos baixo. |
| credit-hard-block-engaged | Restrição por saldo de créditos ativada. |
| credit-hard-block-lifted | Restrição por saldo de créditos removida. |
| credit-auto-topup-triggered | Recarga automática acionada. |
| spend-limit-hit | Limite de gastos atingido. |
| rate-card-changed | Tabela de preços alterada. |
| meta-signup-session-completed | Cadastro na Meta concluído. |
| provider-connection-suspended | Conexão do provedor suspensa. |
| provider-connection-reinstated | Conexão do provedor restabelecida. |
| provider-connection-policy-warning | Aviso de política do provedor recebido. |
| payment-created | Pedido de pagamento criado. |
| payment-approval-available | Aprovação do pagamento disponível. |
| payment-link-generated | Link de pagamento gerado. |
| payment-paid | Pagamento recebido. |
| payment-failed | Pagamento falhou. |
| payment-expired | Pagamento expirado. |
| payment-cancelled | Pagamento cancelado. |
| agentic-payment-authorization-required | Pagamento agentic requer autorização. |
| agentic-payment-authorization-completed | Autorização de pagamento agentic concluída. |
| agentic-payment-confirmation-required | Pagamento agentic requer confirmação. |
| agentic-payment-paid | Pagamento agentic realizado. |
| agentic-payment-cancelled | Pagamento agentic cancelado. |
| agentic-payment-rejected | Pagamento agentic rejeitado. |
| agentic-payment-expired | Pagamento agentic expirado. |
| agentic-payment-error | Erro no pagamento agentic. |
| provider-connection-disable-scheduled | Desativação da conexão do provedor agendada. |
| group-created | Grupo criado. |
| group-create-failed | Criação do grupo falhou. |
| group-deleted | Grupo excluído. |
| group-delete-failed | Exclusão do grupo falhou. |
| group-invite-link-reset | Link de convite do grupo renovado. |
| group-invite-link-reset-failed | Renovação do link de convite do grupo falhou. |
| group-participant-joined | Participante entrou no grupo. |
| group-participant-removed | Participante removido do grupo. |