Skip to main content

Tyxter

Envie mensagens pelo WhatsApp Business e gerencie contatos, templates, campanhas, automações, pagamentos e eventos.

Tyxter Logo

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:

ActionPurposeParameters
get_statusRead public component healthNo parameters
get_v1Unauthenticated 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_messagesAccepts 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; deliveidempotency-key (string)
tyxter-trace-id (string)
data required
get_v1_messagesLists 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_idRetrieves 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_transcriptionExplicitly 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 POSmessage_id (string) required
tyxter-trace-id (string)
data: {
. language (string)
. prompt (string)
. keywords (array)
} (object) required
get_v1_messages_by_message_id_transcriptionReturns 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_retryReopens 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 changemessage_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_cancelCancel a messageid (string) required
idempotency-key (string)
post_v1_messages_by_id_typingMarks 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 aid (string) required
tyxter-trace-id (string)
get_v1_mediaLists 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_uploadsCreates 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-oidempotency-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_completeVerifies 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_usageReturns 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_idReturns 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_idDeletes 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_urlAuthenticates 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_tokenStreams 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_tokenStreams 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_batchesAccepts 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 coolidempotency-key (string)
tyxter-trace-id (string)
data required
get_v1_batchesList broadcast batcheslimit (integer) required
starting_after (string)
tyxter-trace-id (string)
get_v1_batches_by_idRetrieve a broadcast batchid (string) required
tyxter-trace-id (string)
post_v1_batches_by_id_pausePause a broadcast batchid (string) required
idempotency-key (string)
tyxter-trace-id (string)
post_v1_batches_by_id_resumeResume a broadcast batchid (string) required
idempotency-key (string)
tyxter-trace-id (string)
post_v1_batches_by_id_cancelCancel a broadcast batchid (string) required
idempotency-key (string)
tyxter-trace-id (string)
get_v1_batches_by_id_failuresExport failed recipientsid (string) required
tyxter-trace-id (string)
post_v1_templatesCreates 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 HEADidempotency-key (string)
data: {
. name (string)
. language (string)
. category (string)
. parameter_format (string)
. components (array)
} (object) required
get_v1_templatesLists 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_generateUses 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_idRetrieves 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_idUpdates 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 isid (string) required
idempotency-key (string)
data: {
. name (string)
. language (string)
. category (string)
. parameter_format (string)
. components (array)
} (object) required
delete_v1_templates_by_idDelete a templateid (string) required
post_v1_templates_by_id_duplicateCopies 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 neiid (string) required
idempotency-key (string)
data: {
. name (string)
. language (string)
. category (string)
. parameter_format (string)
} (object) required
post_v1_templates_by_id_submitSnapshots 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_analyticsRead template analyticsid (string) required
post_v1_templates_by_id_estimate_costEstimate template costid (string) required
data: {
. recipients (integer)
} (object) required
post_v1_feedbackAgent-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 redactedidempotency-key (string) required
tyxter-trace-id (string)
data: {
. message (string)
. related_error (object)
. context (object)
} (object) required
get_v1_feedbackLists 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_idRetrieves 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_flowsStores 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 POidempotency-key (string)
data: {
. name (string)
. flow_json (object)
} (object) required
get_v1_flowsLists 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_idRetrieves 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_publishSnapshots 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 hid (string) required
idempotency-key (string)
get_v1_groups_eligibilityBeta. 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 anphone_number_id (string) required
post_v1_groups_eligibility_checksBeta. 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_groupsBeta. 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 callidempotency-key (string)
data: {
. phone_number_id (string)
. subject (string)
. description
. join_approval_mode (string)
} (object) required
get_v1_groupsBeta. 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/dlimit (integer) required
starting_after (string)
phone_number_id (string)
status (string)
get_v1_groups_by_group_idBeta. 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 422group_id (string) required
delete_v1_groups_by_group_idBeta. 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_tailAuthenticated 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 Pinvite_tail (string) required
delete_v1_groups_https_chat_whatsapp_com_by_invite_tailAuthenticated 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 byinvite_tail (string) required
get_v1_groups_http_chat_whatsapp_com_by_invite_tailAuthenticated 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 Pinvite_tail (string) required
delete_v1_groups_http_chat_whatsapp_com_by_invite_tailAuthenticated 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 byinvite_tail (string) required
get_v1_groups_chat_whatsapp_com_by_invite_tailAuthenticated 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 Pinvite_tail (string) required
delete_v1_groups_chat_whatsapp_com_by_invite_tailAuthenticated 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 byinvite_tail (string) required
post_v1_groups_by_group_id_invite_link_resetBeta. 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/ggroup_id (string) required
idempotency-key (string)
post_v1_automationsCreates 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_automationsList automationslimit (integer) required
starting_after (string)
status (string)
get_v1_automations_by_automation_idRetrieve an automationautomation_id (string) required
patch_v1_automations_by_automation_idUpdate an automationautomation_id (string) required
data: {
. name (string)
. description
. status (string)
} (object) required
delete_v1_automations_by_automation_idDelete an automationautomation_id (string) required
post_v1_automations_by_automation_id_versionsSnapshots 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_versionsList automation versionsautomation_id (string) required
limit (integer) required
starting_after (string)
post_v1_automations_by_automation_id_publishActivates 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_pausePause an automationautomation_id (string) required
idempotency-key (string)
post_v1_automations_by_automation_id_resumeResume an automationautomation_id (string) required
idempotency-key (string)
post_v1_automations_by_automation_id_webhook_triggers_by_slug_rotate_secretReturns 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_runsRequires 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_runsList automation runsautomation_id (string) required
limit (integer) required
starting_after (string)
status (string)
get_v1_automation_runs_by_run_idRetrieve an automation runrun_id (string) required
get_v1_automation_runs_by_run_id_stepsList automation run stepsrun_id (string) required
limit (integer) required
starting_after (string)
post_v1_automation_runs_by_run_id_cancelCancel an automation runrun_id (string) required
post_v1_automation_webhooks_by_slugPublic 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_inOpt a contact inidempotency-key (string)
data: {
. phone (string)
. source (string)
. metadata (object)
} (object) required
post_v1_contacts_opt_outOpt a contact outidempotency-key (string)
data: {
. phone (string)
. source (string)
. reason (string)
} (object) required
post_v1_contacts_bulk_importImports 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_contactsList contactslimit (integer) required
starting_after (string)
search (string)
status (string)
tag_id (string)
post_v1_contacts_by_id_exportReturns 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_idErases 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 theid (string) required
idempotency-key (string)
post_v1_audiencesCreate an audienceidempotency-key (string)
data: {
. name (string)
. description
. contact_ids (array)
} (object) required
get_v1_audiencesList audienceslimit (integer) required
starting_after (string)
get_v1_audiences_by_idRetrieve an audienceid (string) required
patch_v1_audiences_by_idUpdate an audienceid (string) required
idempotency-key (string)
data: {
. name (string)
. description
. contact_ids (array)
} (object) required
delete_v1_audiences_by_idDelete an audienceid (string) required
idempotency-key (string)
get_v1_phone_numbers_available_regionsList available regionsNo parameters
post_v1_phone_numbers_provisionTyxter 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, approvalidempotency-key (string)
data: {
. ddd (string)
. display_name (string)
} (object) required
post_v1_phone_numbers_ordersAsks 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 ordeidempotency-key (string)
data: {
. ddd (string)
. display_name (string)
. purpose (string)
} (object) required
get_v1_phone_numbers_orders_by_order_idReturns 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 phoorder_id (string) required
post_v1_phone_numbers_connectTyxter 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/connidempotency-key (string)
data: {
. phone (string)
. meta_phone_number_id (string)
. display_name (string)
} (object) required
post_v1_phone_numbers_import_salvyImports 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 enidempotency-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_registrationQueues 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_numbersList 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 thlimit (integer) required
starting_after (string)
status (string)
get_v1_phone_numbers_by_idRefresh 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_idUser-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_byonEnds 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_releaseReleases 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_transferMoves 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_connectionsLists active provider connections for the API key environment. Requires provider_connections:read.limit (integer) required
starting_after (string)
get_v1_provider_connections_statusReturns 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_onboardingReturns non-secret Meta Embedded Signup launch metadata. Requires provider_connections:write.No parameters
get_v1_provider_connections_by_connection_idRetrieves one active provider connection in the API key environment. Requires provider_connections:read.connection_id (string) required
delete_v1_provider_connections_by_connection_idDisconnects 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_metaFor 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_salvyCreates 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 pidempotency-key (string) required
data: {
. api_key (string)
. display_name (string)
. continuation_terms_version (string)
} (object) required
post_v1_provider_connections_meta_oauthFor 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_registrationFor 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 nconnection_id (string) required
idempotency-key (string)
post_v1_provider_connections_by_connection_id_rotateValidates 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_rotateQueues 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_discoveryQueues 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_numbersReturns 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_sessionsCreates 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 connidempotency-key (string)
data: {
. target (string)
} (object) required
get_v1_provider_credential_setup_sessions_by_request_idPolls 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_sessionsCreates 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_idPolls 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_endpointsReturns 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_endpointsList webhook endpointslimit (integer) required
starting_after (string)
get_v1_webhook_endpoints_by_idEvery 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_idPATCH 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_idSoft-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_secretReturns 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_testCreates 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 changid (string) required
idempotency-key (string)
get_v1_webhook_eventsList webhook eventslimit (integer) required
starting_after (string)
event_type (string)
event_types
webhook_endpoint_id (string)
status (string)
get_v1_webhook_events_listenLong-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 thelimit (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_sessionsProduction-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 secondsdata: {
. ttl_seconds (integer)
. reason (string)
} (object) required
delete_v1_webhook_events_listen_sessions_by_listen_session_idDisables 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_idRetrieves 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_idPoll 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_resendCreates 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_resendCreates 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_balanceReturns 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_currentRead the current rate cardNo parameters
get_v1_rate_cardsLists effective-dated rate cards, including historical and future cards.limit (integer) required
starting_after (string)
currency (string)
get_v1_billing_plansPublic 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 consumNo parameters
get_v1_billing_planThe 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_subscribeSubscribe 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_changeSwitch 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_cancelVoluntary 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_ledgerNewest-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 sandboxlimit (integer) required
starting_after (string)
environment (string)
source_type (string)
get_v1_billing_phone_managementCursor-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 exlimit (integer) required
starting_after (string)
get_v1_billing_phone_renewalsDeprecated. 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 cyclimit (integer) required
starting_after (string)
status (string)
get_v1_billing_phone_renewals_by_cycle_idDeprecated. 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 contacycle_id (string) required
get_v1_invoicesOrg-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_downloadReturns a short-lived 15 minute presigned CSV download URL for a ready invoice.id (string) required
get_v1_billing_packagesList billing packageslimit (integer) required
starting_after (string)
status (string)
post_v1_billing_packages_purchaseCharges 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_methodsReturns saved payment method summaries. Card data is never returned in full.No parameters
post_v1_billing_payment_methodsSaves 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_intentCreates 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_defaultMakes 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_idReplays 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_topupA 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_topupReplaces 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_retentionReturns 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_retentionUpserts 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_accountRequires 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_meAlias of GET /v1/account for clients and integrating agents that look for a whoami-style route.No parameters
post_v1_projectsCreates 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_projectsLists 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_idRetrieves 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_authorizationsUnauthenticated 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_tokenUnauthenticated 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_keysRequires 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_keysRequires api_keys:read. Responses include display prefixes, never plaintext secrets.limit (integer) required
starting_after (string)
get_v1_api_keys_by_api_key_idRequires api_keys:read. Cross-organization keys return 404.api_key_id (string) required
patch_v1_api_keys_by_api_key_idRequires api_keys:admin.api_key_id (string) required
data: {
. name (string)
} (object) required
delete_v1_api_keys_by_api_key_idRequires api_keys:admin. Revoke is idempotent for already revoked keys.api_key_id (string) required
post_v1_api_keys_by_api_key_id_rotateRequires 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_paymentsCreates 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 nullidempotency-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_paymentsList payment requestslimit (integer) required
starting_after (string)
status (string)
get_v1_payments_by_payment_idRetrieve a payment requestpayment_id (string) required
get_v1_sandbox_quickstartReports 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_statusSandbox-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_statusSandbox-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_participantsBeta. 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 evgroup_id (string) required
idempotency-key (string)
data: {
. wa_id (string)
. action (string)
} (object) required
post_v1_sandbox_llm_failureSandbox-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_cancelAccepts 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 takepayment_id (string) required
idempotency-key (string)
tyxter-trace-id (string)
data: {

} (object) required
post_v1_payments_by_payment_id_request_approvalMoves 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_usageRead usage summaryperiod_start (string) required
period_end (string) required
environment (string)
group_by (string)
get_v1_usage_recordsList usage recordslimit (integer) required
starting_after (string)
environment (string)
meter_id (string)
recorded_after (string)
recorded_before (string)
get_v1_fiscal_nfseOrg-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_idReturns 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_danfseReturns 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_xmlReturns 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_routesRequires 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_routesRead an LLM routephone_number_id (string)
patch_v1_llm_routesUpdate an LLM routephone_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_routesRequires llm:write and honors Idempotency-Key.phone_number_id (string)
idempotency-key (string)
get_v1_llm_routes_prompt_versionsList LLM prompt versionslimit (integer) required
starting_after (string)
phone_number_id (string)
post_v1_llm_completionsIn 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_responsesList LLM response logslimit (integer) required
starting_after (string)
post_v1_ai_agentsBeta. 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_agentsBeta. Requires ai_agents:read.limit (integer) required
starting_after (string)
include_archived (boolean)
get_v1_ai_agents_by_agent_idBeta. Requires ai_agents:read.agent_id (string) required
patch_v1_ai_agents_by_agent_idBeta. 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_idBeta. Requires ai_agents:write.agent_id (string) required
post_v1_ai_agents_by_agent_id_completionsBeta. 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 ragent_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_versionsBeta. Requires ai_agents:read.agent_id (string) required
limit (integer) required
starting_after (string)
get_v1_ai_agents_by_agent_id_response_logsBeta. Requires ai_agents:read.agent_id (string) required
limit (integer) required
starting_after (string)
get_v1_agentic_banksBeta. Requires agentic_payments:read.search (string)
limit (integer) required
post_v1_agentic_authorizationsBeta. 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_authorizationsBeta. Requires agentic_payments:read.limit (integer) required
starting_after (string)
status (string)
customer_tax_id (string)
get_v1_agentic_authorizations_by_authorization_idBeta. Requires agentic_payments:read.authorization_id (string) required
post_v1_agentic_authorizations_by_authorization_id_revokeBeta. Requires agentic_payments:write.authorization_id (string) required
idempotency-key (string)
tyxter-trace-id (string)
post_v1_agentic_paymentsBeta. 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 reidempotency-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_paymentsBeta. Requires agentic_payments:read.limit (integer) required
starting_after (string)
status (string)
customer_tax_id (string)
get_v1_agentic_payments_by_payment_idBeta. Requires agentic_payments:read.payment_id (string) required
post_v1_agentic_payments_by_payment_id_cancelBeta. Requires agentic_payments:write.payment_id (string) required
idempotency-key (string)
tyxter-trace-id (string)
post_v1_sandbox_inbound_messagesWhatsApp 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 refusedidempotency-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
customCall 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.

EventDescription
message-receivedMensagem recebida.
group-message-receivedMensagem recebida em um grupo.
message-sentMensagem enviada.
message-deliveredMensagem entregue.
message-readMensagem lida.
message-failedFalha no envio de uma mensagem.
message-expiredMensagem expirada.
message-delivery-timeoutPrazo de entrega da mensagem excedido.
message-cancelledMensagem cancelada.
message-reaction-receivedReação a uma mensagem recebida.
message-media-transcribedTranscrição de mídia concluída.
message-media-transcription-failedFalha na transcrição de mídia.
message-opted-outMensagem bloqueada por opt-out.
message-batch-completedCampanha concluída.
message-batch-cancelledCampanha cancelada.
message-batch-failedFalha em uma campanha.
template-approvedTemplate aprovado.
template-rejectedTemplate rejeitado.
template-pausedTemplate pausado.
template-disabledTemplate desativado.
flow-publishedFlow publicado.
flow-rejectedFlow rejeitado.
flow-completedFlow concluído.
phone-number-verifiedNúmero de telefone verificado.
phone-number-disconnectedNúmero de telefone desconectado.
phone-number-releasedNúmero de telefone liberado.
phone-number-tier-changedCategoria do número alterada.
phone-number-quality-changedQualidade do número alterada.
phone-number-messaging-tier-changedCategoria de mensagens do número alterada.
phone-number-name-status-changedStatus do nome do número alterado.
phone-number-messaging-limit-pausedEnvios pausados pelo limite de destinatários.
phone-number-messaging-limit-resumedEnvios retomados após o limite de destinatários.
contact-opted-inContato autorizou o recebimento de mensagens.
contact-opted-outContato revogou o recebimento de mensagens.
contact-erasedDados do contato apagados.
llm-handoff-requestedRoteamento de IA solicitou atendimento humano.
llm-cost-cap-reachedLimite de custo do roteamento de IA atingido.
llm-blocked-topic-triggeredTema bloqueado detectado no roteamento de IA.
ai-agent-handoff-requestedAgente de IA solicitou atendimento humano.
ai-agent-cost-cap-reachedLimite de custo do agente de IA atingido.
ai-agent-blocked-topic-triggeredTema bloqueado detectado pelo agente de IA.
automation-run-completedExecução de automação concluída.
automation-run-failedExecução de automação falhou.
automation-run-cancelledExecução de automação cancelada.
automation-step-completedEtapa de automação concluída.
automation-step-failedEtapa de automação falhou.
automation-customEvento customizado de automação.
credit-topped-upRecarga de créditos recebida.
credit-low-balanceSaldo de créditos baixo.
credit-hard-block-engagedRestrição por saldo de créditos ativada.
credit-hard-block-liftedRestrição por saldo de créditos removida.
credit-auto-topup-triggeredRecarga automática acionada.
spend-limit-hitLimite de gastos atingido.
rate-card-changedTabela de preços alterada.
meta-signup-session-completedCadastro na Meta concluído.
provider-connection-suspendedConexão do provedor suspensa.
provider-connection-reinstatedConexão do provedor restabelecida.
provider-connection-policy-warningAviso de política do provedor recebido.
payment-createdPedido de pagamento criado.
payment-approval-availableAprovação do pagamento disponível.
payment-link-generatedLink de pagamento gerado.
payment-paidPagamento recebido.
payment-failedPagamento falhou.
payment-expiredPagamento expirado.
payment-cancelledPagamento cancelado.
agentic-payment-authorization-requiredPagamento agentic requer autorização.
agentic-payment-authorization-completedAutorização de pagamento agentic concluída.
agentic-payment-confirmation-requiredPagamento agentic requer confirmação.
agentic-payment-paidPagamento agentic realizado.
agentic-payment-cancelledPagamento agentic cancelado.
agentic-payment-rejectedPagamento agentic rejeitado.
agentic-payment-expiredPagamento agentic expirado.
agentic-payment-errorErro no pagamento agentic.
provider-connection-disable-scheduledDesativação da conexão do provedor agendada.
group-createdGrupo criado.
group-create-failedCriação do grupo falhou.
group-deletedGrupo excluído.
group-delete-failedExclusão do grupo falhou.
group-invite-link-resetLink de convite do grupo renovado.
group-invite-link-reset-failedRenovação do link de convite do grupo falhou.
group-participant-joinedParticipante entrou no grupo.
group-participant-removedParticipante removido do grupo.