API reference

Provider connections

Provider readiness, Meta onboarding, token rotation, and disconnect for public API integrations.

Credentials are write-only. Responses expose status, readiness, channel metadata, and provider identifiers, but never return plaintext access tokens, webhook secrets, app secrets, or payment receiver credentials.

Readiness

GET/v1/provider-connections/status

Requires provider_connections:read. Use this as the first integration check: one response answers whether WhatsApp, Instagram, merchant payments, or agentic payments are ready for the API key environment.

channels.agentic_payments.platform_default reports whether Tyxter’s managed connection is configured, whether a managed row exists, and its KYC eligibility. A missing or disconnected connection is provisioned on first agentic use when eligible; connected customer credentials keep precedence. Availability alone does not set ready.

Response

FieldTypeNotes
objectrequired"provider_connection_status"
environmentrequired"sandbox" | "production"
channelsrequiredobject

List

GET/v1/provider-connections

Response

FieldTypeNotes
objectrequired"list"
datarequiredobject[]
has_morerequiredboolean
next_cursorrequiredstring | null

Retrieve

GET/v1/provider-connections/{connection_id}

Response

FieldTypeNotes
idrequiredstring
objectrequired"provider_connection"
providerrequired"meta" | "iniciador" | "abacate_pay" | "salvy"
channelrequired"whatsapp" | "instagram" | "payments" | "agentic_payments" | "phone_numbers"
statusrequired"pending" | "connected" | "suspended" | "disconnected"
display_namerequiredstring
environmentrequired"sandbox" | "production"
waba_idrequiredstring | null
phone_number_idrequiredstring | null
display_phone_numberstring | null
ig_business_account_idrequiredstring | null
page_idrequiredstring | null
provider_account_idrequiredstring | null
salvyobject | null
operationobject | null
The worker operation behind an asynchronous connect, token rotation or complete-registration: a Meta registration (kind meta_registration), a Meta Embedded Signup OAuth code exchange (kind meta_oauth_exchange), a Meta token rotation (kind meta_token_rotation), a Meta complete-registration (kind meta_registration_completion), or an Iniciador agentic payments registration made in the dashboard (kind iniciador_agentic_registration, whose readiness check with Iniciador fails with agentic_provider_unauthorized for rejected credentials). queued means the worker has not finished; poll GET /v1/provider-connections/{connection_id} until state is succeeded or failed. error_code names why a failed operation failed. Null when the connection has no such operation, including after a later credential write replaced a queued one. A newer registration, code exchange, rotation or complete-registration replaces a queued one, so kind can change while you poll.
payment_receiverrequiredobject | null
payment_capabilitiesrequiredobject | null
agentic_capabilitiesrequiredobject | null
default_participant_idrequiredstring | null
agent_idrequiredstring | null
agentic_api_base_urlrequiredstring | null
webhook_secret_configuredrequiredboolean
suspension_reasonstring | null
last_policy_warning_typestring | null
last_policy_warning_atstring<ISO-8601> | null
send_capability"available" | "blocked" | null
Latest trusted Meta WABA send capability. Null means no trusted observation yet; it never changes the connection lifecycle status.
send_block_codes"141006" | "141008" | "141011"[] | null
Recognized Meta send-block diagnostics, ordered for remediation: 141006 payment, 141008 inactive WABA, then 141011 messaging permission.
send_capability_observed_atstring<ISO-8601> | null
ISO-8601 timestamp of the trusted Meta WABA capability observation.
waba_send_capabilitiesobject[]
WABA-keyed capability evidence observed through this connection. Includes the primary WABA when known; private refresh-attempt timestamps are omitted.
waba_ban_datestring<ISO-8601> | null
waba_ban_statestring | null
account_review_statusstring | null
restrictionsobject[] | null
credential_last_fourstring | null
token_sourcerequired"manual" | "embedded_signup" | null
token_expires_atrequiredstring<ISO-8601> | null
token_refreshed_atrequiredstring<ISO-8601> | null
token_rotated_atrequiredstring<ISO-8601> | null
created_atrequiredstring<ISO-8601>
pattern: ^(?:(?:\d\d[2468][048]|\d\d[13579][26]|\d\d0[48]|[02468][048]00|[13579][26]00)-02-29|\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\d|30)|(?:02)-(?:0[1-9]|1\d|2[0-8])))T(?:(?:[01]\d|2[0-3]):[0-5]\d(?::[0-5]\d(?:\.\d+)?)?(?:Z|([+-](?:[01]\d|2[0-3]):[0-5]\d)))$
updated_atrequiredstring<ISO-8601>
pattern: ^(?:(?:\d\d[2468][048]|\d\d[13579][26]|\d\d0[48]|[02468][048]00|[13579][26]00)-02-29|\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\d|30)|(?:02)-(?:0[1-9]|1\d|2[0-8])))T(?:(?:[01]\d|2[0-3]):[0-5]\d(?::[0-5]\d(?:\.\d+)?)?(?:Z|([+-](?:[01]\d|2[0-3]):[0-5]\d)))$
disconnected_atrequiredstring<ISO-8601> | null

Meta WABA send capability

Meta WhatsApp responses include optional, nullable compatibility fields for the connection's primary WABA: send_capability, send_block_codes, and send_capability_observed_at. The optional waba_send_capabilities array carries the same evidence keyed by waba_id for sender WABAs observed through the connection. Use the entry matching the sending phone's WABA; one token can legitimately reach more than one WABA. A null capability or missing entry means Tyxter has no trusted observation yet, not that sending is available. When Meta reports a block, codes are ordered for remediation: 141006 (add a payment method in WhatsApp Manager → Billing & payments), 141008 (reactivate the WABA in WhatsApp Manager or ask Meta support), then 141011 (reconnect and grant the requested WhatsApp messaging permissions, then ask support if it persists). All recognized codes remain in the array for diagnosis.

This is delivery evidence, not a connection or phone-number lifecycle state: a blocked capability leaves status: "connected" intact and inbound messages available. A fresh stored block can terminate a queued send before any Meta call, so that receipt has a stable error_code and provider_error: null. When a Meta send failure triggers a reactive health confirmation that proves a block, the same terminal receipt preserves the original bounded Meta provider_error for diagnosis. After the account is fixed, Tyxter can observe a positive available result and clear that WABA's capability evidence; private per-WABA check-attempt times are never returned. See delivery errors for the stable failed-message codes and retry posture.

Provider credential setup session

POST/v1/provider-credential-setup-sessions201 Created - Idempotency-Key supported

Creates a short-lived browser handoff so a human owner or admin can enter provider credentials without exposing secrets to the calling agent. Use target: "salvy" for Salvy BYOK: the returned setup_url opens Connections → Providers, where an owner or admin enters the Salvy key and accepts the BYOK terms. Salvy validation runs asynchronously; the hosted flow completes this setup session only after the connection is connected, and the poll response then includes completed_provider_connection_id. If completion arrives before the connection is configured, provider_credential_setup_target_not_configured (409) leaves the session pending so the dashboard can retry. Use target: "abacate_pay.payments" when merchant-payment workflows need a payment connection before calling POST /v1/payments. Use target: "openai.stt" when a production environment needs its own OpenAI transcription key. For an integrating agent, this target is the browser handoff to a signed-in human; signed-in dashboard owners and admins can instead use Connections → Speech-to-Text directly. The media guide covers that dashboard path and its validation, pricing, and fallback behavior. Sandbox transcription is deterministic and rejects that target with provider_credential_setup_stt_sandbox_unsupported (400, param: "target") because it needs no provider key or setup session. During a safe two-phase BYOK rollout, the STT target can temporarily return transcription_byok_runtime_inactive (503) before validation or persistence. Retry the same request and Idempotency-Key after activation; no setup session or provider call was created by the rejected request.

Request body

FieldTypeNotes
targetrequired"meta.whatsapp" | "salvy" | "abacate_pay.payments" | "iniciador.payments" | "iniciador.agentic_payments" | "openai.tts" | "elevenlabs.tts" | "xai.tts" | "openai.stt"

Response

Variant 1

FieldTypeNotes
objectrequired"provider_credential_setup_session"
request_idrequiredstring
len 1..∞
project_idrequiredstring
project_slugrequiredstring
environment_idrequiredstring
environmentrequired"sandbox" | "production"
setup_urlrequiredstring
poll_urlrequiredstring
pattern: ^\/v1\/provider-credential-setup-sessions\/.*
expires_atrequiredstring<ISO-8601>
pattern: ^(?:(?:\d\d[2468][048]|\d\d[13579][26]|\d\d0[48]|[02468][048]00|[13579][26]00)-02-29|\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\d|30)|(?:02)-(?:0[1-9]|1\d|2[0-8])))T(?:(?:[01]\d|2[0-3]):[0-5]\d(?::[0-5]\d(?:\.\d+)?)?(?:Z|([+-](?:[01]\d|2[0-3]):[0-5]\d)))$
completed_atrequiredstring<ISO-8601> | null
denied_atrequiredstring<ISO-8601> | null
created_atrequiredstring<ISO-8601>
pattern: ^(?:(?:\d\d[2468][048]|\d\d[13579][26]|\d\d0[48]|[02468][048]00|[13579][26]00)-02-29|\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\d|30)|(?:02)-(?:0[1-9]|1\d|2[0-8])))T(?:(?:[01]\d|2[0-3]):[0-5]\d(?::[0-5]\d(?:\.\d+)?)?(?:Z|([+-](?:[01]\d|2[0-3]):[0-5]\d)))$
updated_atrequiredstring<ISO-8601>
pattern: ^(?:(?:\d\d[2468][048]|\d\d[13579][26]|\d\d0[48]|[02468][048]00|[13579][26]00)-02-29|\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\d|30)|(?:02)-(?:0[1-9]|1\d|2[0-8])))T(?:(?:[01]\d|2[0-3]):[0-5]\d(?::[0-5]\d(?:\.\d+)?)?(?:Z|([+-](?:[01]\d|2[0-3]):[0-5]\d)))$
targetrequired"meta.whatsapp" | "salvy" | "abacate_pay.payments" | "iniciador.payments" | "iniciador.agentic_payments" | "openai.tts" | "elevenlabs.tts" | "xai.tts" | "openai.stt"
statusrequired"pending" | "denied" | "expired"
completed_provider_connection_idrequirednull
completed_tts_providerrequirednull
completed_stt_providerrequirednull

Variant 2

FieldTypeNotes
objectrequired"provider_credential_setup_session"
request_idrequiredstring
len 1..∞
project_idrequiredstring
project_slugrequiredstring
environment_idrequiredstring
environmentrequired"sandbox" | "production"
setup_urlrequiredstring
poll_urlrequiredstring
pattern: ^\/v1\/provider-credential-setup-sessions\/.*
expires_atrequiredstring<ISO-8601>
pattern: ^(?:(?:\d\d[2468][048]|\d\d[13579][26]|\d\d0[48]|[02468][048]00|[13579][26]00)-02-29|\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\d|30)|(?:02)-(?:0[1-9]|1\d|2[0-8])))T(?:(?:[01]\d|2[0-3]):[0-5]\d(?::[0-5]\d(?:\.\d+)?)?(?:Z|([+-](?:[01]\d|2[0-3]):[0-5]\d)))$
completed_atrequiredstring<ISO-8601> | null
denied_atrequiredstring<ISO-8601> | null
created_atrequiredstring<ISO-8601>
pattern: ^(?:(?:\d\d[2468][048]|\d\d[13579][26]|\d\d0[48]|[02468][048]00|[13579][26]00)-02-29|\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\d|30)|(?:02)-(?:0[1-9]|1\d|2[0-8])))T(?:(?:[01]\d|2[0-3]):[0-5]\d(?::[0-5]\d(?:\.\d+)?)?(?:Z|([+-](?:[01]\d|2[0-3]):[0-5]\d)))$
updated_atrequiredstring<ISO-8601>
pattern: ^(?:(?:\d\d[2468][048]|\d\d[13579][26]|\d\d0[48]|[02468][048]00|[13579][26]00)-02-29|\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\d|30)|(?:02)-(?:0[1-9]|1\d|2[0-8])))T(?:(?:[01]\d|2[0-3]):[0-5]\d(?::[0-5]\d(?:\.\d+)?)?(?:Z|([+-](?:[01]\d|2[0-3]):[0-5]\d)))$
targetrequired"meta.whatsapp" | "salvy" | "abacate_pay.payments" | "iniciador.payments" | "iniciador.agentic_payments"
statusrequired"completed"
completed_provider_connection_idrequiredstring
len 1..∞
completed_tts_providerrequirednull
completed_stt_providerrequirednull

Variant 3

FieldTypeNotes
objectrequired"provider_credential_setup_session"
request_idrequiredstring
len 1..∞
project_idrequiredstring
project_slugrequiredstring
environment_idrequiredstring
environmentrequired"sandbox" | "production"
setup_urlrequiredstring
poll_urlrequiredstring
pattern: ^\/v1\/provider-credential-setup-sessions\/.*
expires_atrequiredstring<ISO-8601>
pattern: ^(?:(?:\d\d[2468][048]|\d\d[13579][26]|\d\d0[48]|[02468][048]00|[13579][26]00)-02-29|\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\d|30)|(?:02)-(?:0[1-9]|1\d|2[0-8])))T(?:(?:[01]\d|2[0-3]):[0-5]\d(?::[0-5]\d(?:\.\d+)?)?(?:Z|([+-](?:[01]\d|2[0-3]):[0-5]\d)))$
completed_atrequiredstring<ISO-8601> | null
denied_atrequiredstring<ISO-8601> | null
created_atrequiredstring<ISO-8601>
pattern: ^(?:(?:\d\d[2468][048]|\d\d[13579][26]|\d\d0[48]|[02468][048]00|[13579][26]00)-02-29|\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\d|30)|(?:02)-(?:0[1-9]|1\d|2[0-8])))T(?:(?:[01]\d|2[0-3]):[0-5]\d(?::[0-5]\d(?:\.\d+)?)?(?:Z|([+-](?:[01]\d|2[0-3]):[0-5]\d)))$
updated_atrequiredstring<ISO-8601>
pattern: ^(?:(?:\d\d[2468][048]|\d\d[13579][26]|\d\d0[48]|[02468][048]00|[13579][26]00)-02-29|\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\d|30)|(?:02)-(?:0[1-9]|1\d|2[0-8])))T(?:(?:[01]\d|2[0-3]):[0-5]\d(?::[0-5]\d(?:\.\d+)?)?(?:Z|([+-](?:[01]\d|2[0-3]):[0-5]\d)))$
targetrequired"openai.tts"
statusrequired"completed"
completed_provider_connection_idrequirednull
completed_tts_providerrequired"openai"
completed_stt_providerrequirednull

Variant 4

FieldTypeNotes
objectrequired"provider_credential_setup_session"
request_idrequiredstring
len 1..∞
project_idrequiredstring
project_slugrequiredstring
environment_idrequiredstring
environmentrequired"sandbox" | "production"
setup_urlrequiredstring
poll_urlrequiredstring
pattern: ^\/v1\/provider-credential-setup-sessions\/.*
expires_atrequiredstring<ISO-8601>
pattern: ^(?:(?:\d\d[2468][048]|\d\d[13579][26]|\d\d0[48]|[02468][048]00|[13579][26]00)-02-29|\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\d|30)|(?:02)-(?:0[1-9]|1\d|2[0-8])))T(?:(?:[01]\d|2[0-3]):[0-5]\d(?::[0-5]\d(?:\.\d+)?)?(?:Z|([+-](?:[01]\d|2[0-3]):[0-5]\d)))$
completed_atrequiredstring<ISO-8601> | null
denied_atrequiredstring<ISO-8601> | null
created_atrequiredstring<ISO-8601>
pattern: ^(?:(?:\d\d[2468][048]|\d\d[13579][26]|\d\d0[48]|[02468][048]00|[13579][26]00)-02-29|\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\d|30)|(?:02)-(?:0[1-9]|1\d|2[0-8])))T(?:(?:[01]\d|2[0-3]):[0-5]\d(?::[0-5]\d(?:\.\d+)?)?(?:Z|([+-](?:[01]\d|2[0-3]):[0-5]\d)))$
updated_atrequiredstring<ISO-8601>
pattern: ^(?:(?:\d\d[2468][048]|\d\d[13579][26]|\d\d0[48]|[02468][048]00|[13579][26]00)-02-29|\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\d|30)|(?:02)-(?:0[1-9]|1\d|2[0-8])))T(?:(?:[01]\d|2[0-3]):[0-5]\d(?::[0-5]\d(?:\.\d+)?)?(?:Z|([+-](?:[01]\d|2[0-3]):[0-5]\d)))$
targetrequired"elevenlabs.tts"
statusrequired"completed"
completed_provider_connection_idrequirednull
completed_tts_providerrequired"elevenlabs"
completed_stt_providerrequirednull

Variant 5

FieldTypeNotes
objectrequired"provider_credential_setup_session"
request_idrequiredstring
len 1..∞
project_idrequiredstring
project_slugrequiredstring
environment_idrequiredstring
environmentrequired"sandbox" | "production"
setup_urlrequiredstring
poll_urlrequiredstring
pattern: ^\/v1\/provider-credential-setup-sessions\/.*
expires_atrequiredstring<ISO-8601>
pattern: ^(?:(?:\d\d[2468][048]|\d\d[13579][26]|\d\d0[48]|[02468][048]00|[13579][26]00)-02-29|\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\d|30)|(?:02)-(?:0[1-9]|1\d|2[0-8])))T(?:(?:[01]\d|2[0-3]):[0-5]\d(?::[0-5]\d(?:\.\d+)?)?(?:Z|([+-](?:[01]\d|2[0-3]):[0-5]\d)))$
completed_atrequiredstring<ISO-8601> | null
denied_atrequiredstring<ISO-8601> | null
created_atrequiredstring<ISO-8601>
pattern: ^(?:(?:\d\d[2468][048]|\d\d[13579][26]|\d\d0[48]|[02468][048]00|[13579][26]00)-02-29|\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\d|30)|(?:02)-(?:0[1-9]|1\d|2[0-8])))T(?:(?:[01]\d|2[0-3]):[0-5]\d(?::[0-5]\d(?:\.\d+)?)?(?:Z|([+-](?:[01]\d|2[0-3]):[0-5]\d)))$
updated_atrequiredstring<ISO-8601>
pattern: ^(?:(?:\d\d[2468][048]|\d\d[13579][26]|\d\d0[48]|[02468][048]00|[13579][26]00)-02-29|\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\d|30)|(?:02)-(?:0[1-9]|1\d|2[0-8])))T(?:(?:[01]\d|2[0-3]):[0-5]\d(?::[0-5]\d(?:\.\d+)?)?(?:Z|([+-](?:[01]\d|2[0-3]):[0-5]\d)))$
targetrequired"xai.tts"
statusrequired"completed"
completed_provider_connection_idrequirednull
completed_tts_providerrequired"xai"
completed_stt_providerrequirednull

Variant 6

FieldTypeNotes
objectrequired"provider_credential_setup_session"
request_idrequiredstring
len 1..∞
project_idrequiredstring
project_slugrequiredstring
environment_idrequiredstring
environmentrequired"sandbox" | "production"
setup_urlrequiredstring
poll_urlrequiredstring
pattern: ^\/v1\/provider-credential-setup-sessions\/.*
expires_atrequiredstring<ISO-8601>
pattern: ^(?:(?:\d\d[2468][048]|\d\d[13579][26]|\d\d0[48]|[02468][048]00|[13579][26]00)-02-29|\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\d|30)|(?:02)-(?:0[1-9]|1\d|2[0-8])))T(?:(?:[01]\d|2[0-3]):[0-5]\d(?::[0-5]\d(?:\.\d+)?)?(?:Z|([+-](?:[01]\d|2[0-3]):[0-5]\d)))$
completed_atrequiredstring<ISO-8601> | null
denied_atrequiredstring<ISO-8601> | null
created_atrequiredstring<ISO-8601>
pattern: ^(?:(?:\d\d[2468][048]|\d\d[13579][26]|\d\d0[48]|[02468][048]00|[13579][26]00)-02-29|\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\d|30)|(?:02)-(?:0[1-9]|1\d|2[0-8])))T(?:(?:[01]\d|2[0-3]):[0-5]\d(?::[0-5]\d(?:\.\d+)?)?(?:Z|([+-](?:[01]\d|2[0-3]):[0-5]\d)))$
updated_atrequiredstring<ISO-8601>
pattern: ^(?:(?:\d\d[2468][048]|\d\d[13579][26]|\d\d0[48]|[02468][048]00|[13579][26]00)-02-29|\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\d|30)|(?:02)-(?:0[1-9]|1\d|2[0-8])))T(?:(?:[01]\d|2[0-3]):[0-5]\d(?::[0-5]\d(?:\.\d+)?)?(?:Z|([+-](?:[01]\d|2[0-3]):[0-5]\d)))$
targetrequired"openai.stt"
statusrequired"completed"
completed_provider_connection_idrequirednull
completed_tts_providerrequirednull
completed_stt_providerrequired"openai"
GET/v1/provider-credential-setup-sessions/{request_id}

Polls the setup handoff. Retry the payment or provider-dependent workflow only after the session returns status: "completed". Pending, denied, and expired sessions have every completion field set to null. A completed session populates only the field for its target: an STT handoff reports completed_stt_provider: "openai" while the provider-connection and TTS fields remain null. It never returns the key.

Response

Variant 1

FieldTypeNotes
objectrequired"provider_credential_setup_session"
request_idrequiredstring
len 1..∞
project_idrequiredstring
project_slugrequiredstring
environment_idrequiredstring
environmentrequired"sandbox" | "production"
setup_urlrequiredstring
poll_urlrequiredstring
pattern: ^\/v1\/provider-credential-setup-sessions\/.*
expires_atrequiredstring<ISO-8601>
pattern: ^(?:(?:\d\d[2468][048]|\d\d[13579][26]|\d\d0[48]|[02468][048]00|[13579][26]00)-02-29|\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\d|30)|(?:02)-(?:0[1-9]|1\d|2[0-8])))T(?:(?:[01]\d|2[0-3]):[0-5]\d(?::[0-5]\d(?:\.\d+)?)?(?:Z|([+-](?:[01]\d|2[0-3]):[0-5]\d)))$
completed_atrequiredstring<ISO-8601> | null
denied_atrequiredstring<ISO-8601> | null
created_atrequiredstring<ISO-8601>
pattern: ^(?:(?:\d\d[2468][048]|\d\d[13579][26]|\d\d0[48]|[02468][048]00|[13579][26]00)-02-29|\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\d|30)|(?:02)-(?:0[1-9]|1\d|2[0-8])))T(?:(?:[01]\d|2[0-3]):[0-5]\d(?::[0-5]\d(?:\.\d+)?)?(?:Z|([+-](?:[01]\d|2[0-3]):[0-5]\d)))$
updated_atrequiredstring<ISO-8601>
pattern: ^(?:(?:\d\d[2468][048]|\d\d[13579][26]|\d\d0[48]|[02468][048]00|[13579][26]00)-02-29|\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\d|30)|(?:02)-(?:0[1-9]|1\d|2[0-8])))T(?:(?:[01]\d|2[0-3]):[0-5]\d(?::[0-5]\d(?:\.\d+)?)?(?:Z|([+-](?:[01]\d|2[0-3]):[0-5]\d)))$
targetrequired"meta.whatsapp" | "salvy" | "abacate_pay.payments" | "iniciador.payments" | "iniciador.agentic_payments" | "openai.tts" | "elevenlabs.tts" | "xai.tts" | "openai.stt"
statusrequired"pending" | "denied" | "expired"
completed_provider_connection_idrequirednull
completed_tts_providerrequirednull
completed_stt_providerrequirednull

Variant 2

FieldTypeNotes
objectrequired"provider_credential_setup_session"
request_idrequiredstring
len 1..∞
project_idrequiredstring
project_slugrequiredstring
environment_idrequiredstring
environmentrequired"sandbox" | "production"
setup_urlrequiredstring
poll_urlrequiredstring
pattern: ^\/v1\/provider-credential-setup-sessions\/.*
expires_atrequiredstring<ISO-8601>
pattern: ^(?:(?:\d\d[2468][048]|\d\d[13579][26]|\d\d0[48]|[02468][048]00|[13579][26]00)-02-29|\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\d|30)|(?:02)-(?:0[1-9]|1\d|2[0-8])))T(?:(?:[01]\d|2[0-3]):[0-5]\d(?::[0-5]\d(?:\.\d+)?)?(?:Z|([+-](?:[01]\d|2[0-3]):[0-5]\d)))$
completed_atrequiredstring<ISO-8601> | null
denied_atrequiredstring<ISO-8601> | null
created_atrequiredstring<ISO-8601>
pattern: ^(?:(?:\d\d[2468][048]|\d\d[13579][26]|\d\d0[48]|[02468][048]00|[13579][26]00)-02-29|\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\d|30)|(?:02)-(?:0[1-9]|1\d|2[0-8])))T(?:(?:[01]\d|2[0-3]):[0-5]\d(?::[0-5]\d(?:\.\d+)?)?(?:Z|([+-](?:[01]\d|2[0-3]):[0-5]\d)))$
updated_atrequiredstring<ISO-8601>
pattern: ^(?:(?:\d\d[2468][048]|\d\d[13579][26]|\d\d0[48]|[02468][048]00|[13579][26]00)-02-29|\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\d|30)|(?:02)-(?:0[1-9]|1\d|2[0-8])))T(?:(?:[01]\d|2[0-3]):[0-5]\d(?::[0-5]\d(?:\.\d+)?)?(?:Z|([+-](?:[01]\d|2[0-3]):[0-5]\d)))$
targetrequired"meta.whatsapp" | "salvy" | "abacate_pay.payments" | "iniciador.payments" | "iniciador.agentic_payments"
statusrequired"completed"
completed_provider_connection_idrequiredstring
len 1..∞
completed_tts_providerrequirednull
completed_stt_providerrequirednull

Variant 3

FieldTypeNotes
objectrequired"provider_credential_setup_session"
request_idrequiredstring
len 1..∞
project_idrequiredstring
project_slugrequiredstring
environment_idrequiredstring
environmentrequired"sandbox" | "production"
setup_urlrequiredstring
poll_urlrequiredstring
pattern: ^\/v1\/provider-credential-setup-sessions\/.*
expires_atrequiredstring<ISO-8601>
pattern: ^(?:(?:\d\d[2468][048]|\d\d[13579][26]|\d\d0[48]|[02468][048]00|[13579][26]00)-02-29|\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\d|30)|(?:02)-(?:0[1-9]|1\d|2[0-8])))T(?:(?:[01]\d|2[0-3]):[0-5]\d(?::[0-5]\d(?:\.\d+)?)?(?:Z|([+-](?:[01]\d|2[0-3]):[0-5]\d)))$
completed_atrequiredstring<ISO-8601> | null
denied_atrequiredstring<ISO-8601> | null
created_atrequiredstring<ISO-8601>
pattern: ^(?:(?:\d\d[2468][048]|\d\d[13579][26]|\d\d0[48]|[02468][048]00|[13579][26]00)-02-29|\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\d|30)|(?:02)-(?:0[1-9]|1\d|2[0-8])))T(?:(?:[01]\d|2[0-3]):[0-5]\d(?::[0-5]\d(?:\.\d+)?)?(?:Z|([+-](?:[01]\d|2[0-3]):[0-5]\d)))$
updated_atrequiredstring<ISO-8601>
pattern: ^(?:(?:\d\d[2468][048]|\d\d[13579][26]|\d\d0[48]|[02468][048]00|[13579][26]00)-02-29|\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\d|30)|(?:02)-(?:0[1-9]|1\d|2[0-8])))T(?:(?:[01]\d|2[0-3]):[0-5]\d(?::[0-5]\d(?:\.\d+)?)?(?:Z|([+-](?:[01]\d|2[0-3]):[0-5]\d)))$
targetrequired"openai.tts"
statusrequired"completed"
completed_provider_connection_idrequirednull
completed_tts_providerrequired"openai"
completed_stt_providerrequirednull

Variant 4

FieldTypeNotes
objectrequired"provider_credential_setup_session"
request_idrequiredstring
len 1..∞
project_idrequiredstring
project_slugrequiredstring
environment_idrequiredstring
environmentrequired"sandbox" | "production"
setup_urlrequiredstring
poll_urlrequiredstring
pattern: ^\/v1\/provider-credential-setup-sessions\/.*
expires_atrequiredstring<ISO-8601>
pattern: ^(?:(?:\d\d[2468][048]|\d\d[13579][26]|\d\d0[48]|[02468][048]00|[13579][26]00)-02-29|\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\d|30)|(?:02)-(?:0[1-9]|1\d|2[0-8])))T(?:(?:[01]\d|2[0-3]):[0-5]\d(?::[0-5]\d(?:\.\d+)?)?(?:Z|([+-](?:[01]\d|2[0-3]):[0-5]\d)))$
completed_atrequiredstring<ISO-8601> | null
denied_atrequiredstring<ISO-8601> | null
created_atrequiredstring<ISO-8601>
pattern: ^(?:(?:\d\d[2468][048]|\d\d[13579][26]|\d\d0[48]|[02468][048]00|[13579][26]00)-02-29|\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\d|30)|(?:02)-(?:0[1-9]|1\d|2[0-8])))T(?:(?:[01]\d|2[0-3]):[0-5]\d(?::[0-5]\d(?:\.\d+)?)?(?:Z|([+-](?:[01]\d|2[0-3]):[0-5]\d)))$
updated_atrequiredstring<ISO-8601>
pattern: ^(?:(?:\d\d[2468][048]|\d\d[13579][26]|\d\d0[48]|[02468][048]00|[13579][26]00)-02-29|\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\d|30)|(?:02)-(?:0[1-9]|1\d|2[0-8])))T(?:(?:[01]\d|2[0-3]):[0-5]\d(?::[0-5]\d(?:\.\d+)?)?(?:Z|([+-](?:[01]\d|2[0-3]):[0-5]\d)))$
targetrequired"elevenlabs.tts"
statusrequired"completed"
completed_provider_connection_idrequirednull
completed_tts_providerrequired"elevenlabs"
completed_stt_providerrequirednull

Variant 5

FieldTypeNotes
objectrequired"provider_credential_setup_session"
request_idrequiredstring
len 1..∞
project_idrequiredstring
project_slugrequiredstring
environment_idrequiredstring
environmentrequired"sandbox" | "production"
setup_urlrequiredstring
poll_urlrequiredstring
pattern: ^\/v1\/provider-credential-setup-sessions\/.*
expires_atrequiredstring<ISO-8601>
pattern: ^(?:(?:\d\d[2468][048]|\d\d[13579][26]|\d\d0[48]|[02468][048]00|[13579][26]00)-02-29|\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\d|30)|(?:02)-(?:0[1-9]|1\d|2[0-8])))T(?:(?:[01]\d|2[0-3]):[0-5]\d(?::[0-5]\d(?:\.\d+)?)?(?:Z|([+-](?:[01]\d|2[0-3]):[0-5]\d)))$
completed_atrequiredstring<ISO-8601> | null
denied_atrequiredstring<ISO-8601> | null
created_atrequiredstring<ISO-8601>
pattern: ^(?:(?:\d\d[2468][048]|\d\d[13579][26]|\d\d0[48]|[02468][048]00|[13579][26]00)-02-29|\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\d|30)|(?:02)-(?:0[1-9]|1\d|2[0-8])))T(?:(?:[01]\d|2[0-3]):[0-5]\d(?::[0-5]\d(?:\.\d+)?)?(?:Z|([+-](?:[01]\d|2[0-3]):[0-5]\d)))$
updated_atrequiredstring<ISO-8601>
pattern: ^(?:(?:\d\d[2468][048]|\d\d[13579][26]|\d\d0[48]|[02468][048]00|[13579][26]00)-02-29|\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\d|30)|(?:02)-(?:0[1-9]|1\d|2[0-8])))T(?:(?:[01]\d|2[0-3]):[0-5]\d(?::[0-5]\d(?:\.\d+)?)?(?:Z|([+-](?:[01]\d|2[0-3]):[0-5]\d)))$
targetrequired"xai.tts"
statusrequired"completed"
completed_provider_connection_idrequirednull
completed_tts_providerrequired"xai"
completed_stt_providerrequirednull

Variant 6

FieldTypeNotes
objectrequired"provider_credential_setup_session"
request_idrequiredstring
len 1..∞
project_idrequiredstring
project_slugrequiredstring
environment_idrequiredstring
environmentrequired"sandbox" | "production"
setup_urlrequiredstring
poll_urlrequiredstring
pattern: ^\/v1\/provider-credential-setup-sessions\/.*
expires_atrequiredstring<ISO-8601>
pattern: ^(?:(?:\d\d[2468][048]|\d\d[13579][26]|\d\d0[48]|[02468][048]00|[13579][26]00)-02-29|\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\d|30)|(?:02)-(?:0[1-9]|1\d|2[0-8])))T(?:(?:[01]\d|2[0-3]):[0-5]\d(?::[0-5]\d(?:\.\d+)?)?(?:Z|([+-](?:[01]\d|2[0-3]):[0-5]\d)))$
completed_atrequiredstring<ISO-8601> | null
denied_atrequiredstring<ISO-8601> | null
created_atrequiredstring<ISO-8601>
pattern: ^(?:(?:\d\d[2468][048]|\d\d[13579][26]|\d\d0[48]|[02468][048]00|[13579][26]00)-02-29|\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\d|30)|(?:02)-(?:0[1-9]|1\d|2[0-8])))T(?:(?:[01]\d|2[0-3]):[0-5]\d(?::[0-5]\d(?:\.\d+)?)?(?:Z|([+-](?:[01]\d|2[0-3]):[0-5]\d)))$
updated_atrequiredstring<ISO-8601>
pattern: ^(?:(?:\d\d[2468][048]|\d\d[13579][26]|\d\d0[48]|[02468][048]00|[13579][26]00)-02-29|\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\d|30)|(?:02)-(?:0[1-9]|1\d|2[0-8])))T(?:(?:[01]\d|2[0-3]):[0-5]\d(?::[0-5]\d(?:\.\d+)?)?(?:Z|([+-](?:[01]\d|2[0-3]):[0-5]\d)))$
targetrequired"openai.stt"
statusrequired"completed"
completed_provider_connection_idrequirednull
completed_tts_providerrequirednull
completed_stt_providerrequired"openai"

Hosted Meta signup session

POST/v1/meta-signup-sessions201 Created - Idempotency-Key required

Creates a 30-minute, Tyxter-hosted Embedded Signup URL for your own product. Open the URL in a popup or new tab; your end user completes Meta signup without receiving Tyxter dashboard access or your API key. The production environment must not already have a live Meta WhatsApp connection, and return_url must use an allowlisted origin.

Request body

FieldTypeNotes
return_urlrequiredstring
len 0..2048
end_customer_refstring
len 1..200

Response

FieldTypeNotes
idrequiredstring
pattern: ^mss_.*
objectrequired"meta_signup_session"
statusrequired"pending" | "processing" | "completed" | "expired" | "failed"
errorobject
urlrequiredstring | null
return_urlrequiredstring
end_customer_refrequiredstring | null
project_idrequiredstring
environment_idrequiredstring
environmentrequired"sandbox" | "production"
expires_atrequiredstring<ISO-8601>
pattern: ^(?:(?:\d\d[2468][048]|\d\d[13579][26]|\d\d0[48]|[02468][048]00|[13579][26]00)-02-29|\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\d|30)|(?:02)-(?:0[1-9]|1\d|2[0-8])))T(?:(?:[01]\d|2[0-3]):[0-5]\d(?::[0-5]\d(?:\.\d+)?)?(?:Z|([+-](?:[01]\d|2[0-3]):[0-5]\d)))$
completed_atrequiredstring<ISO-8601> | null
provider_connection_idrequiredstring | null
created_atrequiredstring<ISO-8601>
pattern: ^(?:(?:\d\d[2468][048]|\d\d[13579][26]|\d\d0[48]|[02468][048]00|[13579][26]00)-02-29|\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\d|30)|(?:02)-(?:0[1-9]|1\d|2[0-8])))T(?:(?:[01]\d|2[0-3]):[0-5]\d(?::[0-5]\d(?:\.\d+)?)?(?:Z|([+-](?:[01]\d|2[0-3]):[0-5]\d)))$
updated_atrequiredstring<ISO-8601>
pattern: ^(?:(?:\d\d[2468][048]|\d\d[13579][26]|\d\d0[48]|[02468][048]00|[13579][26]00)-02-29|\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\d|30)|(?:02)-(?:0[1-9]|1\d|2[0-8])))T(?:(?:[01]\d|2[0-3]):[0-5]\d(?::[0-5]\d(?:\.\d+)?)?(?:Z|([+-](?:[01]\d|2[0-3]):[0-5]\d)))$
GET/v1/meta-signup-sessions/{session_id}

Polls pending, processing, completed, or expired. The launch URL is one-time material: create and idempotent replay return it; this polling route returns url: null.

Response

FieldTypeNotes
idrequiredstring
pattern: ^mss_.*
objectrequired"meta_signup_session"
statusrequired"pending" | "processing" | "completed" | "expired" | "failed"
errorobject
urlrequiredstring | null
return_urlrequiredstring
end_customer_refrequiredstring | null
project_idrequiredstring
environment_idrequiredstring
environmentrequired"sandbox" | "production"
expires_atrequiredstring<ISO-8601>
pattern: ^(?:(?:\d\d[2468][048]|\d\d[13579][26]|\d\d0[48]|[02468][048]00|[13579][26]00)-02-29|\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\d|30)|(?:02)-(?:0[1-9]|1\d|2[0-8])))T(?:(?:[01]\d|2[0-3]):[0-5]\d(?::[0-5]\d(?:\.\d+)?)?(?:Z|([+-](?:[01]\d|2[0-3]):[0-5]\d)))$
completed_atrequiredstring<ISO-8601> | null
provider_connection_idrequiredstring | null
created_atrequiredstring<ISO-8601>
pattern: ^(?:(?:\d\d[2468][048]|\d\d[13579][26]|\d\d0[48]|[02468][048]00|[13579][26]00)-02-29|\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\d|30)|(?:02)-(?:0[1-9]|1\d|2[0-8])))T(?:(?:[01]\d|2[0-3]):[0-5]\d(?::[0-5]\d(?:\.\d+)?)?(?:Z|([+-](?:[01]\d|2[0-3]):[0-5]\d)))$
updated_atrequiredstring<ISO-8601>
pattern: ^(?:(?:\d\d[2468][048]|\d\d[13579][26]|\d\d0[48]|[02468][048]00|[13579][26]00)-02-29|\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\d|30)|(?:02)-(?:0[1-9]|1\d|2[0-8])))T(?:(?:[01]\d|2[0-3]):[0-5]\d(?::[0-5]\d(?:\.\d+)?)?(?:Z|([+-](?:[01]\d|2[0-3]):[0-5]\d)))$

Meta onboarding config

GET/v1/provider-connections/meta/onboarding

Returns non-secret Facebook SDK launch metadata for Meta Embedded Signup. This route does not return the Meta app secret or a raw OAuth URL.

Response

FieldTypeNotes
objectrequired"meta_onboarding_config"
moderequired"embedded_signup"
app_idrequiredstring
len 1..∞
config_idrequiredstring
len 1..∞
graph_api_versionrequiredstring
len 1..∞
sdk_urlrequiredstring
allowed_message_originsrequiredstring[]
message_typerequired"WA_EMBEDDED_SIGNUP"
login_optionsrequiredobject
completion_endpointrequired"/v1/provider-connections/meta/oauth"
manual_credentials_endpointrequired"/v1/provider-connections/meta"

Register Meta connection

POST/v1/provider-connections/meta202 Accepted - Idempotency-Key supported

The request never calls Meta. Tyxter seals the credential and returns the connection with its operation (kind: "meta_registration", state: "queued"); a worker then checks the credential with Meta. A new connection is pending until then, and re-registering a connected one keeps it connected on its current token. Poll GET /v1/provider-connections/{connection_id} until operation.state is succeeded (the connection is connected) or failed; operation.error_code is the code this route used to answer synchronously, and meta_validation_failed also marks a registration not finished within fifteen minutes. operation.kind becomes meta_token_rotation, meta_oauth_exchange or meta_registration_completion when a token rotation, an OAuth code exchange (including a hosted Embedded Signup completion's) or a complete-registration queued meanwhile replaced it. Refusals that need no Meta check (a sandbox environment, a policy-suspended account, a phone connected elsewhere) still answer synchronously. Reusing an Idempotency-Key returns the stored 202 body.

The access_token must be one Tyxter's own Meta app minted; a token from your own Meta app is rejected even when it is valid there. Tyxter identifies that case as meta_token_foreign_app on the failed operation whenever Meta's rejection is specific enough to recognize; shapes Meta reports differently still fail with whatsapp_credentials_invalid. The Rotate token section below explains why, and which flow to use when you do not hold a token at all.

Request body

FieldTypeNotes
channel"whatsapp" | "instagram"
display_namerequiredstring
len 1..∞
waba_idstring
len 1..∞
phone_number_idstring
len 1..∞
ig_business_account_idstring
len 1..∞
page_idstring
len 1..∞
access_tokenrequiredstring
len 1..∞
token_source"manual" | "embedded_signup"
token_expires_atstring<ISO-8601> | null

Response

FieldTypeNotes
idrequiredstring
objectrequired"provider_connection"
providerrequired"meta" | "iniciador" | "abacate_pay" | "salvy"
channelrequired"whatsapp" | "instagram" | "payments" | "agentic_payments" | "phone_numbers"
statusrequired"pending" | "connected" | "suspended" | "disconnected"
display_namerequiredstring
environmentrequired"sandbox" | "production"
waba_idrequiredstring | null
phone_number_idrequiredstring | null
display_phone_numberstring | null
ig_business_account_idrequiredstring | null
page_idrequiredstring | null
provider_account_idrequiredstring | null
salvyobject | null
operationobject | null
The worker operation behind an asynchronous connect, token rotation or complete-registration: a Meta registration (kind meta_registration), a Meta Embedded Signup OAuth code exchange (kind meta_oauth_exchange), a Meta token rotation (kind meta_token_rotation), a Meta complete-registration (kind meta_registration_completion), or an Iniciador agentic payments registration made in the dashboard (kind iniciador_agentic_registration, whose readiness check with Iniciador fails with agentic_provider_unauthorized for rejected credentials). queued means the worker has not finished; poll GET /v1/provider-connections/{connection_id} until state is succeeded or failed. error_code names why a failed operation failed. Null when the connection has no such operation, including after a later credential write replaced a queued one. A newer registration, code exchange, rotation or complete-registration replaces a queued one, so kind can change while you poll.
payment_receiverrequiredobject | null
payment_capabilitiesrequiredobject | null
agentic_capabilitiesrequiredobject | null
default_participant_idrequiredstring | null
agent_idrequiredstring | null
agentic_api_base_urlrequiredstring | null
webhook_secret_configuredrequiredboolean
suspension_reasonstring | null
last_policy_warning_typestring | null
last_policy_warning_atstring<ISO-8601> | null
send_capability"available" | "blocked" | null
Latest trusted Meta WABA send capability. Null means no trusted observation yet; it never changes the connection lifecycle status.
send_block_codes"141006" | "141008" | "141011"[] | null
Recognized Meta send-block diagnostics, ordered for remediation: 141006 payment, 141008 inactive WABA, then 141011 messaging permission.
send_capability_observed_atstring<ISO-8601> | null
ISO-8601 timestamp of the trusted Meta WABA capability observation.
waba_send_capabilitiesobject[]
WABA-keyed capability evidence observed through this connection. Includes the primary WABA when known; private refresh-attempt timestamps are omitted.
waba_ban_datestring<ISO-8601> | null
waba_ban_statestring | null
account_review_statusstring | null
restrictionsobject[] | null
credential_last_fourstring | null
token_sourcerequired"manual" | "embedded_signup" | null
token_expires_atrequiredstring<ISO-8601> | null
token_refreshed_atrequiredstring<ISO-8601> | null
token_rotated_atrequiredstring<ISO-8601> | null
created_atrequiredstring<ISO-8601>
pattern: ^(?:(?:\d\d[2468][048]|\d\d[13579][26]|\d\d0[48]|[02468][048]00|[13579][26]00)-02-29|\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\d|30)|(?:02)-(?:0[1-9]|1\d|2[0-8])))T(?:(?:[01]\d|2[0-3]):[0-5]\d(?::[0-5]\d(?:\.\d+)?)?(?:Z|([+-](?:[01]\d|2[0-3]):[0-5]\d)))$
updated_atrequiredstring<ISO-8601>
pattern: ^(?:(?:\d\d[2468][048]|\d\d[13579][26]|\d\d0[48]|[02468][048]00|[13579][26]00)-02-29|\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\d|30)|(?:02)-(?:0[1-9]|1\d|2[0-8])))T(?:(?:[01]\d|2[0-3]):[0-5]\d(?::[0-5]\d(?:\.\d+)?)?(?:Z|([+-](?:[01]\d|2[0-3]):[0-5]\d)))$
disconnected_atrequiredstring<ISO-8601> | null

Register a Salvy BYOK connection

POST/v1/provider-connections/salvy202 Accepted - Idempotency-Key required

Requires an active eligible paid Salvy BYOK plan and the runtime capability. Send the customer's Salvy API key with continuation_terms_version: "salvy_byok_v1". Tyxter seals the key and returns a pending connection; validation and the first number discovery run asynchronously in the provider worker. The API request never calls Salvy, and neither the response nor its idempotency record contains the plaintext key. A 202 means the operation was queued; poll the connection until it reports succeeded, then read the cached numbers route.

Request body

FieldTypeNotes
api_keyrequiredstring
len 1..4096
display_namestring
len 1..255
continuation_terms_versionrequired"salvy_byok_v1"

Response

FieldTypeNotes
idrequiredstring
objectrequired"provider_connection"
providerrequired"meta" | "iniciador" | "abacate_pay" | "salvy"
channelrequired"whatsapp" | "instagram" | "payments" | "agentic_payments" | "phone_numbers"
statusrequired"pending" | "connected" | "suspended" | "disconnected"
display_namerequiredstring
environmentrequired"sandbox" | "production"
waba_idrequiredstring | null
phone_number_idrequiredstring | null
display_phone_numberstring | null
ig_business_account_idrequiredstring | null
page_idrequiredstring | null
provider_account_idrequiredstring | null
salvyobject | null
operationobject | null
The worker operation behind an asynchronous connect, token rotation or complete-registration: a Meta registration (kind meta_registration), a Meta Embedded Signup OAuth code exchange (kind meta_oauth_exchange), a Meta token rotation (kind meta_token_rotation), a Meta complete-registration (kind meta_registration_completion), or an Iniciador agentic payments registration made in the dashboard (kind iniciador_agentic_registration, whose readiness check with Iniciador fails with agentic_provider_unauthorized for rejected credentials). queued means the worker has not finished; poll GET /v1/provider-connections/{connection_id} until state is succeeded or failed. error_code names why a failed operation failed. Null when the connection has no such operation, including after a later credential write replaced a queued one. A newer registration, code exchange, rotation or complete-registration replaces a queued one, so kind can change while you poll.
payment_receiverrequiredobject | null
payment_capabilitiesrequiredobject | null
agentic_capabilitiesrequiredobject | null
default_participant_idrequiredstring | null
agent_idrequiredstring | null
agentic_api_base_urlrequiredstring | null
webhook_secret_configuredrequiredboolean
suspension_reasonstring | null
last_policy_warning_typestring | null
last_policy_warning_atstring<ISO-8601> | null
send_capability"available" | "blocked" | null
Latest trusted Meta WABA send capability. Null means no trusted observation yet; it never changes the connection lifecycle status.
send_block_codes"141006" | "141008" | "141011"[] | null
Recognized Meta send-block diagnostics, ordered for remediation: 141006 payment, 141008 inactive WABA, then 141011 messaging permission.
send_capability_observed_atstring<ISO-8601> | null
ISO-8601 timestamp of the trusted Meta WABA capability observation.
waba_send_capabilitiesobject[]
WABA-keyed capability evidence observed through this connection. Includes the primary WABA when known; private refresh-attempt timestamps are omitted.
waba_ban_datestring<ISO-8601> | null
waba_ban_statestring | null
account_review_statusstring | null
restrictionsobject[] | null
credential_last_fourstring | null
token_sourcerequired"manual" | "embedded_signup" | null
token_expires_atrequiredstring<ISO-8601> | null
token_refreshed_atrequiredstring<ISO-8601> | null
token_rotated_atrequiredstring<ISO-8601> | null
created_atrequiredstring<ISO-8601>
pattern: ^(?:(?:\d\d[2468][048]|\d\d[13579][26]|\d\d0[48]|[02468][048]00|[13579][26]00)-02-29|\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\d|30)|(?:02)-(?:0[1-9]|1\d|2[0-8])))T(?:(?:[01]\d|2[0-3]):[0-5]\d(?::[0-5]\d(?:\.\d+)?)?(?:Z|([+-](?:[01]\d|2[0-3]):[0-5]\d)))$
updated_atrequiredstring<ISO-8601>
pattern: ^(?:(?:\d\d[2468][048]|\d\d[13579][26]|\d\d0[48]|[02468][048]00|[13579][26]00)-02-29|\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\d|30)|(?:02)-(?:0[1-9]|1\d|2[0-8])))T(?:(?:[01]\d|2[0-3]):[0-5]\d(?::[0-5]\d(?:\.\d+)?)?(?:Z|([+-](?:[01]\d|2[0-3]):[0-5]\d)))$
disconnected_atrequiredstring<ISO-8601> | null

Salvy credential rotation

POST/v1/provider-connections/{connection_id}/salvy/rotate202 Accepted - Idempotency-Key required

Queues a generation-fenced replacement key. The current key is retained while the worker validates the candidate and proves that every currently managed provider number is still visible to it; a key is considered validated only after its connection reaches connected. Invalid credentials, provider transport failures, and a number missing from the candidate account discard the candidate and preserve the retained key.

Request body

FieldTypeNotes
api_keyrequiredstring
len 1..4096

Response

FieldTypeNotes
idrequiredstring
objectrequired"provider_connection"
providerrequired"meta" | "iniciador" | "abacate_pay" | "salvy"
channelrequired"whatsapp" | "instagram" | "payments" | "agentic_payments" | "phone_numbers"
statusrequired"pending" | "connected" | "suspended" | "disconnected"
display_namerequiredstring
environmentrequired"sandbox" | "production"
waba_idrequiredstring | null
phone_number_idrequiredstring | null
display_phone_numberstring | null
ig_business_account_idrequiredstring | null
page_idrequiredstring | null
provider_account_idrequiredstring | null
salvyobject | null
operationobject | null
The worker operation behind an asynchronous connect, token rotation or complete-registration: a Meta registration (kind meta_registration), a Meta Embedded Signup OAuth code exchange (kind meta_oauth_exchange), a Meta token rotation (kind meta_token_rotation), a Meta complete-registration (kind meta_registration_completion), or an Iniciador agentic payments registration made in the dashboard (kind iniciador_agentic_registration, whose readiness check with Iniciador fails with agentic_provider_unauthorized for rejected credentials). queued means the worker has not finished; poll GET /v1/provider-connections/{connection_id} until state is succeeded or failed. error_code names why a failed operation failed. Null when the connection has no such operation, including after a later credential write replaced a queued one. A newer registration, code exchange, rotation or complete-registration replaces a queued one, so kind can change while you poll.
payment_receiverrequiredobject | null
payment_capabilitiesrequiredobject | null
agentic_capabilitiesrequiredobject | null
default_participant_idrequiredstring | null
agent_idrequiredstring | null
agentic_api_base_urlrequiredstring | null
webhook_secret_configuredrequiredboolean
suspension_reasonstring | null
last_policy_warning_typestring | null
last_policy_warning_atstring<ISO-8601> | null
send_capability"available" | "blocked" | null
Latest trusted Meta WABA send capability. Null means no trusted observation yet; it never changes the connection lifecycle status.
send_block_codes"141006" | "141008" | "141011"[] | null
Recognized Meta send-block diagnostics, ordered for remediation: 141006 payment, 141008 inactive WABA, then 141011 messaging permission.
send_capability_observed_atstring<ISO-8601> | null
ISO-8601 timestamp of the trusted Meta WABA capability observation.
waba_send_capabilitiesobject[]
WABA-keyed capability evidence observed through this connection. Includes the primary WABA when known; private refresh-attempt timestamps are omitted.
waba_ban_datestring<ISO-8601> | null
waba_ban_statestring | null
account_review_statusstring | null
restrictionsobject[] | null
credential_last_fourstring | null
token_sourcerequired"manual" | "embedded_signup" | null
token_expires_atrequiredstring<ISO-8601> | null
token_refreshed_atrequiredstring<ISO-8601> | null
token_rotated_atrequiredstring<ISO-8601> | null
created_atrequiredstring<ISO-8601>
pattern: ^(?:(?:\d\d[2468][048]|\d\d[13579][26]|\d\d0[48]|[02468][048]00|[13579][26]00)-02-29|\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\d|30)|(?:02)-(?:0[1-9]|1\d|2[0-8])))T(?:(?:[01]\d|2[0-3]):[0-5]\d(?::[0-5]\d(?:\.\d+)?)?(?:Z|([+-](?:[01]\d|2[0-3]):[0-5]\d)))$
updated_atrequiredstring<ISO-8601>
pattern: ^(?:(?:\d\d[2468][048]|\d\d[13579][26]|\d\d0[48]|[02468][048]00|[13579][26]00)-02-29|\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\d|30)|(?:02)-(?:0[1-9]|1\d|2[0-8])))T(?:(?:[01]\d|2[0-3]):[0-5]\d(?::[0-5]\d(?:\.\d+)?)?(?:Z|([+-](?:[01]\d|2[0-3]):[0-5]\d)))$
disconnected_atrequiredstring<ISO-8601> | null

Salvy discovery refresh

POST/v1/provider-connections/{connection_id}/salvy/discovery202 Accepted - Idempotency-Key required

Queues a refresh using the current stored key on a connected connection. Send an empty JSON object. Until the worker succeeds, reads continue to return the last successful snapshot; the API does not call Salvy during this request.

Request body

FieldTypeNotes
No fields.

Response

FieldTypeNotes
idrequiredstring
objectrequired"provider_connection"
providerrequired"meta" | "iniciador" | "abacate_pay" | "salvy"
channelrequired"whatsapp" | "instagram" | "payments" | "agentic_payments" | "phone_numbers"
statusrequired"pending" | "connected" | "suspended" | "disconnected"
display_namerequiredstring
environmentrequired"sandbox" | "production"
waba_idrequiredstring | null
phone_number_idrequiredstring | null
display_phone_numberstring | null
ig_business_account_idrequiredstring | null
page_idrequiredstring | null
provider_account_idrequiredstring | null
salvyobject | null
operationobject | null
The worker operation behind an asynchronous connect, token rotation or complete-registration: a Meta registration (kind meta_registration), a Meta Embedded Signup OAuth code exchange (kind meta_oauth_exchange), a Meta token rotation (kind meta_token_rotation), a Meta complete-registration (kind meta_registration_completion), or an Iniciador agentic payments registration made in the dashboard (kind iniciador_agentic_registration, whose readiness check with Iniciador fails with agentic_provider_unauthorized for rejected credentials). queued means the worker has not finished; poll GET /v1/provider-connections/{connection_id} until state is succeeded or failed. error_code names why a failed operation failed. Null when the connection has no such operation, including after a later credential write replaced a queued one. A newer registration, code exchange, rotation or complete-registration replaces a queued one, so kind can change while you poll.
payment_receiverrequiredobject | null
payment_capabilitiesrequiredobject | null
agentic_capabilitiesrequiredobject | null
default_participant_idrequiredstring | null
agent_idrequiredstring | null
agentic_api_base_urlrequiredstring | null
webhook_secret_configuredrequiredboolean
suspension_reasonstring | null
last_policy_warning_typestring | null
last_policy_warning_atstring<ISO-8601> | null
send_capability"available" | "blocked" | null
Latest trusted Meta WABA send capability. Null means no trusted observation yet; it never changes the connection lifecycle status.
send_block_codes"141006" | "141008" | "141011"[] | null
Recognized Meta send-block diagnostics, ordered for remediation: 141006 payment, 141008 inactive WABA, then 141011 messaging permission.
send_capability_observed_atstring<ISO-8601> | null
ISO-8601 timestamp of the trusted Meta WABA capability observation.
waba_send_capabilitiesobject[]
WABA-keyed capability evidence observed through this connection. Includes the primary WABA when known; private refresh-attempt timestamps are omitted.
waba_ban_datestring<ISO-8601> | null
waba_ban_statestring | null
account_review_statusstring | null
restrictionsobject[] | null
credential_last_fourstring | null
token_sourcerequired"manual" | "embedded_signup" | null
token_expires_atrequiredstring<ISO-8601> | null
token_refreshed_atrequiredstring<ISO-8601> | null
token_rotated_atrequiredstring<ISO-8601> | null
created_atrequiredstring<ISO-8601>
pattern: ^(?:(?:\d\d[2468][048]|\d\d[13579][26]|\d\d0[48]|[02468][048]00|[13579][26]00)-02-29|\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\d|30)|(?:02)-(?:0[1-9]|1\d|2[0-8])))T(?:(?:[01]\d|2[0-3]):[0-5]\d(?::[0-5]\d(?:\.\d+)?)?(?:Z|([+-](?:[01]\d|2[0-3]):[0-5]\d)))$
updated_atrequiredstring<ISO-8601>
pattern: ^(?:(?:\d\d[2468][048]|\d\d[13579][26]|\d\d0[48]|[02468][048]00|[13579][26]00)-02-29|\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\d|30)|(?:02)-(?:0[1-9]|1\d|2[0-8])))T(?:(?:[01]\d|2[0-3]):[0-5]\d(?::[0-5]\d(?:\.\d+)?)?(?:Z|([+-](?:[01]\d|2[0-3]):[0-5]\d)))$
disconnected_atrequiredstring<ISO-8601> | null

List cached Salvy numbers

GET/v1/provider-connections/{connection_id}/salvy/numbers

Requires provider_connections:read. Returns cursor-paginated data from the scoped, persisted discovery snapshot. Before the first successful discovery it returns an empty list. This route never decrypts a credential or calls Salvy. imported_phone_number_id is a reserved nullable field and is currently null in this response surface.

Response

FieldTypeNotes
objectrequired"list"
datarequiredobject[]
has_morerequiredboolean
next_cursorrequiredstring | null

Exchange Meta OAuth code

POST/v1/provider-connections/meta/oauth202 Accepted - Idempotency-Key supported

The request never calls Meta. Tyxter seals the single-use code and returns the connection with its operation (kind: "meta_oauth_exchange", state: "queued"); a worker sends the code to Meta at most once, never twice, completes Embedded Signup and registers the connection. Posting the same code again while its exchange is queued returns that exchange’s connection and queues nothing; a different code replaces it. Poll GET /v1/provider-connections/{connection_id} until operation.state is succeeded (the connection is connected) or failed; operation.error_code is the code this route used to answer synchronously. meta_oauth_exchange_failed means Meta rejected the code, and meta_oauth_exchange_unavailable means the exchange could not be completed, including one not finished within fifteen minutes; the code is single-use, so both need a new signup. Refusals that need no Meta call (a sandbox environment, a policy-suspended account, an ended signup run) still answer synchronously. Reusing an Idempotency-Key returns the stored 202 body. The 202 carries display-name warnings only for a display_name the request supplied; the WhatsApp Business Account name the worker reads from Meta later gets none on this route.

Send waba_id when Meta supplied it. If a valid OAuth code arrives without it, Tyxter continues only when the token’s WhatsApp granular scopes prove exactly one account. Otherwise the operation fails with meta_waba_missing and the connection keeps a retryable pending setup; no candidate account IDs are returned.

Request body

FieldTypeNotes
coderequiredstring
len 1..∞
waba_idstring
len 1..∞
phone_number_idstring
len 1..∞
display_namestring
len 1..∞
business_idstring
len 1..∞
signup_session_idstring
pattern: ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$

Response

FieldTypeNotes
idrequiredstring
objectrequired"provider_connection"
providerrequired"meta" | "iniciador" | "abacate_pay" | "salvy"
channelrequired"whatsapp" | "instagram" | "payments" | "agentic_payments" | "phone_numbers"
statusrequired"pending" | "connected" | "suspended" | "disconnected"
display_namerequiredstring
environmentrequired"sandbox" | "production"
waba_idrequiredstring | null
phone_number_idrequiredstring | null
display_phone_numberstring | null
ig_business_account_idrequiredstring | null
page_idrequiredstring | null
provider_account_idrequiredstring | null
salvyobject | null
operationobject | null
The worker operation behind an asynchronous connect, token rotation or complete-registration: a Meta registration (kind meta_registration), a Meta Embedded Signup OAuth code exchange (kind meta_oauth_exchange), a Meta token rotation (kind meta_token_rotation), a Meta complete-registration (kind meta_registration_completion), or an Iniciador agentic payments registration made in the dashboard (kind iniciador_agentic_registration, whose readiness check with Iniciador fails with agentic_provider_unauthorized for rejected credentials). queued means the worker has not finished; poll GET /v1/provider-connections/{connection_id} until state is succeeded or failed. error_code names why a failed operation failed. Null when the connection has no such operation, including after a later credential write replaced a queued one. A newer registration, code exchange, rotation or complete-registration replaces a queued one, so kind can change while you poll.
payment_receiverrequiredobject | null
payment_capabilitiesrequiredobject | null
agentic_capabilitiesrequiredobject | null
default_participant_idrequiredstring | null
agent_idrequiredstring | null
agentic_api_base_urlrequiredstring | null
webhook_secret_configuredrequiredboolean
suspension_reasonstring | null
last_policy_warning_typestring | null
last_policy_warning_atstring<ISO-8601> | null
send_capability"available" | "blocked" | null
Latest trusted Meta WABA send capability. Null means no trusted observation yet; it never changes the connection lifecycle status.
send_block_codes"141006" | "141008" | "141011"[] | null
Recognized Meta send-block diagnostics, ordered for remediation: 141006 payment, 141008 inactive WABA, then 141011 messaging permission.
send_capability_observed_atstring<ISO-8601> | null
ISO-8601 timestamp of the trusted Meta WABA capability observation.
waba_send_capabilitiesobject[]
WABA-keyed capability evidence observed through this connection. Includes the primary WABA when known; private refresh-attempt timestamps are omitted.
waba_ban_datestring<ISO-8601> | null
waba_ban_statestring | null
account_review_statusstring | null
restrictionsobject[] | null
credential_last_fourstring | null
token_sourcerequired"manual" | "embedded_signup" | null
token_expires_atrequiredstring<ISO-8601> | null
token_refreshed_atrequiredstring<ISO-8601> | null
token_rotated_atrequiredstring<ISO-8601> | null
created_atrequiredstring<ISO-8601>
pattern: ^(?:(?:\d\d[2468][048]|\d\d[13579][26]|\d\d0[48]|[02468][048]00|[13579][26]00)-02-29|\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\d|30)|(?:02)-(?:0[1-9]|1\d|2[0-8])))T(?:(?:[01]\d|2[0-3]):[0-5]\d(?::[0-5]\d(?:\.\d+)?)?(?:Z|([+-](?:[01]\d|2[0-3]):[0-5]\d)))$
updated_atrequiredstring<ISO-8601>
pattern: ^(?:(?:\d\d[2468][048]|\d\d[13579][26]|\d\d0[48]|[02468][048]00|[13579][26]00)-02-29|\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\d|30)|(?:02)-(?:0[1-9]|1\d|2[0-8])))T(?:(?:[01]\d|2[0-3]):[0-5]\d(?::[0-5]\d(?:\.\d+)?)?(?:Z|([+-](?:[01]\d|2[0-3]):[0-5]\d)))$
disconnected_atrequiredstring<ISO-8601> | null

Complete a pending Meta registration

POST/v1/provider-connections/{connection_id}/meta/complete-registration202 Accepted - Idempotency-Key supported - no request body

Finishes a Meta WhatsApp connection that reads status: "pending" because signup stopped after the access token was already brokered - without running WhatsApp signup in a browser again. Answers 202 without calling Meta: the connection, still pending, comes back with its operation (kind: "meta_registration_completion", state: "queued"). A worker then proves a WABA from the stored token when the original relay had none, re-runs the remaining provider steps and revalidates the credentials. Poll GET /v1/provider-connections/{connection_id} until operation.state is succeeded (the connection is connected) or failed; operation.error_code is the code this route used to answer synchronously, and meta_validation_failed also marks a completion not finished within fifteen minutes. A failed completion leaves the connection pending with its stored credentials, so it can be retried once the underlying cause (for example a missing payment method on the WhatsApp Business Account) is fixed. operation.kind changes when a newer registration, OAuth code exchange or token rotation replaced the queued completion, and sending this request again while one is queued returns that one. A connection that is not Meta WhatsApp, a sandbox environment, an already connected connection, a missing or unreadable stored credential (invalid_provider_connection_request), a policy-suspended account and a deployment without Meta app credentials still answer synchronously. Reusing an Idempotency-Key returns the stored 202 body.

Response

FieldTypeNotes
idrequiredstring
objectrequired"provider_connection"
providerrequired"meta" | "iniciador" | "abacate_pay" | "salvy"
channelrequired"whatsapp" | "instagram" | "payments" | "agentic_payments" | "phone_numbers"
statusrequired"pending" | "connected" | "suspended" | "disconnected"
display_namerequiredstring
environmentrequired"sandbox" | "production"
waba_idrequiredstring | null
phone_number_idrequiredstring | null
display_phone_numberstring | null
ig_business_account_idrequiredstring | null
page_idrequiredstring | null
provider_account_idrequiredstring | null
salvyobject | null
operationobject | null
The worker operation behind an asynchronous connect, token rotation or complete-registration: a Meta registration (kind meta_registration), a Meta Embedded Signup OAuth code exchange (kind meta_oauth_exchange), a Meta token rotation (kind meta_token_rotation), a Meta complete-registration (kind meta_registration_completion), or an Iniciador agentic payments registration made in the dashboard (kind iniciador_agentic_registration, whose readiness check with Iniciador fails with agentic_provider_unauthorized for rejected credentials). queued means the worker has not finished; poll GET /v1/provider-connections/{connection_id} until state is succeeded or failed. error_code names why a failed operation failed. Null when the connection has no such operation, including after a later credential write replaced a queued one. A newer registration, code exchange, rotation or complete-registration replaces a queued one, so kind can change while you poll.
payment_receiverrequiredobject | null
payment_capabilitiesrequiredobject | null
agentic_capabilitiesrequiredobject | null
default_participant_idrequiredstring | null
agent_idrequiredstring | null
agentic_api_base_urlrequiredstring | null
webhook_secret_configuredrequiredboolean
suspension_reasonstring | null
last_policy_warning_typestring | null
last_policy_warning_atstring<ISO-8601> | null
send_capability"available" | "blocked" | null
Latest trusted Meta WABA send capability. Null means no trusted observation yet; it never changes the connection lifecycle status.
send_block_codes"141006" | "141008" | "141011"[] | null
Recognized Meta send-block diagnostics, ordered for remediation: 141006 payment, 141008 inactive WABA, then 141011 messaging permission.
send_capability_observed_atstring<ISO-8601> | null
ISO-8601 timestamp of the trusted Meta WABA capability observation.
waba_send_capabilitiesobject[]
WABA-keyed capability evidence observed through this connection. Includes the primary WABA when known; private refresh-attempt timestamps are omitted.
waba_ban_datestring<ISO-8601> | null
waba_ban_statestring | null
account_review_statusstring | null
restrictionsobject[] | null
credential_last_fourstring | null
token_sourcerequired"manual" | "embedded_signup" | null
token_expires_atrequiredstring<ISO-8601> | null
token_refreshed_atrequiredstring<ISO-8601> | null
token_rotated_atrequiredstring<ISO-8601> | null
created_atrequiredstring<ISO-8601>
pattern: ^(?:(?:\d\d[2468][048]|\d\d[13579][26]|\d\d0[48]|[02468][048]00|[13579][26]00)-02-29|\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\d|30)|(?:02)-(?:0[1-9]|1\d|2[0-8])))T(?:(?:[01]\d|2[0-3]):[0-5]\d(?::[0-5]\d(?:\.\d+)?)?(?:Z|([+-](?:[01]\d|2[0-3]):[0-5]\d)))$
updated_atrequiredstring<ISO-8601>
pattern: ^(?:(?:\d\d[2468][048]|\d\d[13579][26]|\d\d0[48]|[02468][048]00|[13579][26]00)-02-29|\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\d|30)|(?:02)-(?:0[1-9]|1\d|2[0-8])))T(?:(?:[01]\d|2[0-3]):[0-5]\d(?::[0-5]\d(?:\.\d+)?)?(?:Z|([+-](?:[01]\d|2[0-3]):[0-5]\d)))$
disconnected_atrequiredstring<ISO-8601> | null

Rotate token

POST/v1/provider-connections/{connection_id}/rotate202 Accepted - Idempotency-Key supported

Answers 202 without calling Meta. Tyxter seals the replacement token and returns the connection, still on its current token and status, with its operation (kind: "meta_token_rotation", state: "queued"); the plaintext token is never returned. A worker then validates the token with Meta against the WhatsApp Business Account and phone already on the connection and swaps it in. Poll GET /v1/provider-connections/{connection_id} until operation.state is succeeded (the new token is stored) or failed; a failed rotation keeps the current token, its operation.error_code is one of the stable codes the operation schema enumerates, and meta_validation_failed also marks a rotation not finished within fifteen minutes. operation becomes null when a later credential write replaced the queued rotation, and names meta_registration, meta_oauth_exchange or meta_registration_completion when a later registration, OAuth code exchange or complete-registration replaced it. A disconnected connection, a policy-suspended account, remembered identity enforcement, a deployment without Meta app credentials and a connection missing the identifiers its channel is validated against (invalid_provider_connection_request) still answer synchronously. Reusing an Idempotency-Key returns the stored 202 body.

The replacement must be a token Tyxter's own Meta app minted. A token you created in your own Meta app is always rejected, even when it works in your app, because Tyxter verifies it with its own app credentials, receives your inbound messages on its own app webhook subscription, and refreshes credentials under that same app identity - none of which a token from another app can reach. Tyxter identifies that case as meta_token_foreign_app on the failed operation whenever Meta's rejection is specific enough to recognize; shapes Meta reports differently still fail with whatsapp_credentials_invalid (or instagram_credentials_invalid). The constraint itself does not depend on which code you get, and the same rule applies when registering a connection. A token that is simply invalid or expired also fails with whatsapp_credentials_invalid.

Use this route only when you already hold such a token. The signup flows never hand one back - they complete the connection server-side, and no response returns provider credentials. To replace a credential you do not hold, re-run Meta sign-in from the dashboard connection card or call POST /v1/provider-connections/meta/oauth with a fresh code; either one replaces the stored credential on the existing connection. Hosted signup sessions onboard a customer who has no connection yet, so they are not the rotation path.

Request body

FieldTypeNotes
access_tokenrequiredstring
len 1..∞
token_source"manual" | "embedded_signup"
token_expires_atstring<ISO-8601> | null

Response

FieldTypeNotes
idrequiredstring
objectrequired"provider_connection"
providerrequired"meta" | "iniciador" | "abacate_pay" | "salvy"
channelrequired"whatsapp" | "instagram" | "payments" | "agentic_payments" | "phone_numbers"
statusrequired"pending" | "connected" | "suspended" | "disconnected"
display_namerequiredstring
environmentrequired"sandbox" | "production"
waba_idrequiredstring | null
phone_number_idrequiredstring | null
display_phone_numberstring | null
ig_business_account_idrequiredstring | null
page_idrequiredstring | null
provider_account_idrequiredstring | null
salvyobject | null
operationobject | null
The worker operation behind an asynchronous connect, token rotation or complete-registration: a Meta registration (kind meta_registration), a Meta Embedded Signup OAuth code exchange (kind meta_oauth_exchange), a Meta token rotation (kind meta_token_rotation), a Meta complete-registration (kind meta_registration_completion), or an Iniciador agentic payments registration made in the dashboard (kind iniciador_agentic_registration, whose readiness check with Iniciador fails with agentic_provider_unauthorized for rejected credentials). queued means the worker has not finished; poll GET /v1/provider-connections/{connection_id} until state is succeeded or failed. error_code names why a failed operation failed. Null when the connection has no such operation, including after a later credential write replaced a queued one. A newer registration, code exchange, rotation or complete-registration replaces a queued one, so kind can change while you poll.
payment_receiverrequiredobject | null
payment_capabilitiesrequiredobject | null
agentic_capabilitiesrequiredobject | null
default_participant_idrequiredstring | null
agent_idrequiredstring | null
agentic_api_base_urlrequiredstring | null
webhook_secret_configuredrequiredboolean
suspension_reasonstring | null
last_policy_warning_typestring | null
last_policy_warning_atstring<ISO-8601> | null
send_capability"available" | "blocked" | null
Latest trusted Meta WABA send capability. Null means no trusted observation yet; it never changes the connection lifecycle status.
send_block_codes"141006" | "141008" | "141011"[] | null
Recognized Meta send-block diagnostics, ordered for remediation: 141006 payment, 141008 inactive WABA, then 141011 messaging permission.
send_capability_observed_atstring<ISO-8601> | null
ISO-8601 timestamp of the trusted Meta WABA capability observation.
waba_send_capabilitiesobject[]
WABA-keyed capability evidence observed through this connection. Includes the primary WABA when known; private refresh-attempt timestamps are omitted.
waba_ban_datestring<ISO-8601> | null
waba_ban_statestring | null
account_review_statusstring | null
restrictionsobject[] | null
credential_last_fourstring | null
token_sourcerequired"manual" | "embedded_signup" | null
token_expires_atrequiredstring<ISO-8601> | null
token_refreshed_atrequiredstring<ISO-8601> | null
token_rotated_atrequiredstring<ISO-8601> | null
created_atrequiredstring<ISO-8601>
pattern: ^(?:(?:\d\d[2468][048]|\d\d[13579][26]|\d\d0[48]|[02468][048]00|[13579][26]00)-02-29|\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\d|30)|(?:02)-(?:0[1-9]|1\d|2[0-8])))T(?:(?:[01]\d|2[0-3]):[0-5]\d(?::[0-5]\d(?:\.\d+)?)?(?:Z|([+-](?:[01]\d|2[0-3]):[0-5]\d)))$
updated_atrequiredstring<ISO-8601>
pattern: ^(?:(?:\d\d[2468][048]|\d\d[13579][26]|\d\d0[48]|[02468][048]00|[13579][26]00)-02-29|\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\d|30)|(?:02)-(?:0[1-9]|1\d|2[0-8])))T(?:(?:[01]\d|2[0-3]):[0-5]\d(?::[0-5]\d(?:\.\d+)?)?(?:Z|([+-](?:[01]\d|2[0-3]):[0-5]\d)))$
disconnected_atrequiredstring<ISO-8601> | null

Disconnect

DELETE/v1/provider-connections/{connection_id}

Clears provider credentials without deleting audit history. The connection disappears from list/retrieve and readiness reports it as disconnected or missing.

Response

FieldTypeNotes
idrequiredstring
objectrequired"provider_connection"
providerrequired"meta" | "iniciador" | "abacate_pay" | "salvy"
channelrequired"whatsapp" | "instagram" | "payments" | "agentic_payments" | "phone_numbers"
statusrequired"pending" | "connected" | "suspended" | "disconnected"
display_namerequiredstring
environmentrequired"sandbox" | "production"
waba_idrequiredstring | null
phone_number_idrequiredstring | null
display_phone_numberstring | null
ig_business_account_idrequiredstring | null
page_idrequiredstring | null
provider_account_idrequiredstring | null
salvyobject | null
operationobject | null
The worker operation behind an asynchronous connect, token rotation or complete-registration: a Meta registration (kind meta_registration), a Meta Embedded Signup OAuth code exchange (kind meta_oauth_exchange), a Meta token rotation (kind meta_token_rotation), a Meta complete-registration (kind meta_registration_completion), or an Iniciador agentic payments registration made in the dashboard (kind iniciador_agentic_registration, whose readiness check with Iniciador fails with agentic_provider_unauthorized for rejected credentials). queued means the worker has not finished; poll GET /v1/provider-connections/{connection_id} until state is succeeded or failed. error_code names why a failed operation failed. Null when the connection has no such operation, including after a later credential write replaced a queued one. A newer registration, code exchange, rotation or complete-registration replaces a queued one, so kind can change while you poll.
payment_receiverrequiredobject | null
payment_capabilitiesrequiredobject | null
agentic_capabilitiesrequiredobject | null
default_participant_idrequiredstring | null
agent_idrequiredstring | null
agentic_api_base_urlrequiredstring | null
webhook_secret_configuredrequiredboolean
suspension_reasonstring | null
last_policy_warning_typestring | null
last_policy_warning_atstring<ISO-8601> | null
send_capability"available" | "blocked" | null
Latest trusted Meta WABA send capability. Null means no trusted observation yet; it never changes the connection lifecycle status.
send_block_codes"141006" | "141008" | "141011"[] | null
Recognized Meta send-block diagnostics, ordered for remediation: 141006 payment, 141008 inactive WABA, then 141011 messaging permission.
send_capability_observed_atstring<ISO-8601> | null
ISO-8601 timestamp of the trusted Meta WABA capability observation.
waba_send_capabilitiesobject[]
WABA-keyed capability evidence observed through this connection. Includes the primary WABA when known; private refresh-attempt timestamps are omitted.
waba_ban_datestring<ISO-8601> | null
waba_ban_statestring | null
account_review_statusstring | null
restrictionsobject[] | null
credential_last_fourstring | null
token_sourcerequired"manual" | "embedded_signup" | null
token_expires_atrequiredstring<ISO-8601> | null
token_refreshed_atrequiredstring<ISO-8601> | null
token_rotated_atrequiredstring<ISO-8601> | null
created_atrequiredstring<ISO-8601>
pattern: ^(?:(?:\d\d[2468][048]|\d\d[13579][26]|\d\d0[48]|[02468][048]00|[13579][26]00)-02-29|\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\d|30)|(?:02)-(?:0[1-9]|1\d|2[0-8])))T(?:(?:[01]\d|2[0-3]):[0-5]\d(?::[0-5]\d(?:\.\d+)?)?(?:Z|([+-](?:[01]\d|2[0-3]):[0-5]\d)))$
updated_atrequiredstring<ISO-8601>
pattern: ^(?:(?:\d\d[2468][048]|\d\d[13579][26]|\d\d0[48]|[02468][048]00|[13579][26]00)-02-29|\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\d|30)|(?:02)-(?:0[1-9]|1\d|2[0-8])))T(?:(?:[01]\d|2[0-3]):[0-5]\d(?::[0-5]\d(?:\.\d+)?)?(?:Z|([+-](?:[01]\d|2[0-3]):[0-5]\d)))$
disconnected_atrequiredstring<ISO-8601> | null