Provider connections
Provider readiness, Meta onboarding, token rotation, and disconnect for public API integrations.
Readiness
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
| Field | Type | Notes |
|---|---|---|
objectrequired | "provider_connection_status" | |
environmentrequired | "sandbox" | "production" | |
channelsrequired | object |
List
Response
| Field | Type | Notes |
|---|---|---|
objectrequired | "list" | |
datarequired | object[] | |
has_morerequired | boolean | |
next_cursorrequired | string | null |
Retrieve
Response
| Field | Type | Notes |
|---|---|---|
idrequired | string | |
objectrequired | "provider_connection" | |
providerrequired | "meta" | "iniciador" | "abacate_pay" | "salvy" | |
channelrequired | "whatsapp" | "instagram" | "payments" | "agentic_payments" | "phone_numbers" | |
statusrequired | "pending" | "connected" | "suspended" | "disconnected" | |
display_namerequired | string | |
environmentrequired | "sandbox" | "production" | |
waba_idrequired | string | null | |
phone_number_idrequired | string | null | |
display_phone_number | string | null | |
ig_business_account_idrequired | string | null | |
page_idrequired | string | null | |
provider_account_idrequired | string | null | |
salvy | object | null | |
operation | object | 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_receiverrequired | object | null | |
payment_capabilitiesrequired | object | null | |
agentic_capabilitiesrequired | object | null | |
default_participant_idrequired | string | null | |
agent_idrequired | string | null | |
agentic_api_base_urlrequired | string | null | |
webhook_secret_configuredrequired | boolean | |
suspension_reason | string | null | |
last_policy_warning_type | string | null | |
last_policy_warning_at | string<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_at | string<ISO-8601> | null | ISO-8601 timestamp of the trusted Meta WABA capability observation. |
waba_send_capabilities | object[] | WABA-keyed capability evidence observed through this connection. Includes the primary WABA when known; private refresh-attempt timestamps are omitted. |
waba_ban_date | string<ISO-8601> | null | |
waba_ban_state | string | null | |
account_review_status | string | null | |
restrictions | object[] | null | |
credential_last_four | string | null | |
token_sourcerequired | "manual" | "embedded_signup" | null | |
token_expires_atrequired | string<ISO-8601> | null | |
token_refreshed_atrequired | string<ISO-8601> | null | |
token_rotated_atrequired | string<ISO-8601> | null | |
created_atrequired | string<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_atrequired | string<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_atrequired | string<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
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
| Field | Type | Notes |
|---|---|---|
targetrequired | "meta.whatsapp" | "salvy" | "abacate_pay.payments" | "iniciador.payments" | "iniciador.agentic_payments" | "openai.tts" | "elevenlabs.tts" | "xai.tts" | "openai.stt" |
Response
Variant 1
| Field | Type | Notes |
|---|---|---|
objectrequired | "provider_credential_setup_session" | |
request_idrequired | string | len 1..∞ |
project_idrequired | string | |
project_slugrequired | string | |
environment_idrequired | string | |
environmentrequired | "sandbox" | "production" | |
setup_urlrequired | string | |
poll_urlrequired | string | pattern: ^\/v1\/provider-credential-setup-sessions\/.* |
expires_atrequired | string<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_atrequired | string<ISO-8601> | null | |
denied_atrequired | string<ISO-8601> | null | |
created_atrequired | string<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_atrequired | string<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_idrequired | null | |
completed_tts_providerrequired | null | |
completed_stt_providerrequired | null |
Variant 2
| Field | Type | Notes |
|---|---|---|
objectrequired | "provider_credential_setup_session" | |
request_idrequired | string | len 1..∞ |
project_idrequired | string | |
project_slugrequired | string | |
environment_idrequired | string | |
environmentrequired | "sandbox" | "production" | |
setup_urlrequired | string | |
poll_urlrequired | string | pattern: ^\/v1\/provider-credential-setup-sessions\/.* |
expires_atrequired | string<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_atrequired | string<ISO-8601> | null | |
denied_atrequired | string<ISO-8601> | null | |
created_atrequired | string<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_atrequired | string<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_idrequired | string | len 1..∞ |
completed_tts_providerrequired | null | |
completed_stt_providerrequired | null |
Variant 3
| Field | Type | Notes |
|---|---|---|
objectrequired | "provider_credential_setup_session" | |
request_idrequired | string | len 1..∞ |
project_idrequired | string | |
project_slugrequired | string | |
environment_idrequired | string | |
environmentrequired | "sandbox" | "production" | |
setup_urlrequired | string | |
poll_urlrequired | string | pattern: ^\/v1\/provider-credential-setup-sessions\/.* |
expires_atrequired | string<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_atrequired | string<ISO-8601> | null | |
denied_atrequired | string<ISO-8601> | null | |
created_atrequired | string<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_atrequired | string<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_idrequired | null | |
completed_tts_providerrequired | "openai" | |
completed_stt_providerrequired | null |
Variant 4
| Field | Type | Notes |
|---|---|---|
objectrequired | "provider_credential_setup_session" | |
request_idrequired | string | len 1..∞ |
project_idrequired | string | |
project_slugrequired | string | |
environment_idrequired | string | |
environmentrequired | "sandbox" | "production" | |
setup_urlrequired | string | |
poll_urlrequired | string | pattern: ^\/v1\/provider-credential-setup-sessions\/.* |
expires_atrequired | string<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_atrequired | string<ISO-8601> | null | |
denied_atrequired | string<ISO-8601> | null | |
created_atrequired | string<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_atrequired | string<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_idrequired | null | |
completed_tts_providerrequired | "elevenlabs" | |
completed_stt_providerrequired | null |
Variant 5
| Field | Type | Notes |
|---|---|---|
objectrequired | "provider_credential_setup_session" | |
request_idrequired | string | len 1..∞ |
project_idrequired | string | |
project_slugrequired | string | |
environment_idrequired | string | |
environmentrequired | "sandbox" | "production" | |
setup_urlrequired | string | |
poll_urlrequired | string | pattern: ^\/v1\/provider-credential-setup-sessions\/.* |
expires_atrequired | string<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_atrequired | string<ISO-8601> | null | |
denied_atrequired | string<ISO-8601> | null | |
created_atrequired | string<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_atrequired | string<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_idrequired | null | |
completed_tts_providerrequired | "xai" | |
completed_stt_providerrequired | null |
Variant 6
| Field | Type | Notes |
|---|---|---|
objectrequired | "provider_credential_setup_session" | |
request_idrequired | string | len 1..∞ |
project_idrequired | string | |
project_slugrequired | string | |
environment_idrequired | string | |
environmentrequired | "sandbox" | "production" | |
setup_urlrequired | string | |
poll_urlrequired | string | pattern: ^\/v1\/provider-credential-setup-sessions\/.* |
expires_atrequired | string<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_atrequired | string<ISO-8601> | null | |
denied_atrequired | string<ISO-8601> | null | |
created_atrequired | string<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_atrequired | string<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_idrequired | null | |
completed_tts_providerrequired | null | |
completed_stt_providerrequired | "openai" |
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
| Field | Type | Notes |
|---|---|---|
objectrequired | "provider_credential_setup_session" | |
request_idrequired | string | len 1..∞ |
project_idrequired | string | |
project_slugrequired | string | |
environment_idrequired | string | |
environmentrequired | "sandbox" | "production" | |
setup_urlrequired | string | |
poll_urlrequired | string | pattern: ^\/v1\/provider-credential-setup-sessions\/.* |
expires_atrequired | string<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_atrequired | string<ISO-8601> | null | |
denied_atrequired | string<ISO-8601> | null | |
created_atrequired | string<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_atrequired | string<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_idrequired | null | |
completed_tts_providerrequired | null | |
completed_stt_providerrequired | null |
Variant 2
| Field | Type | Notes |
|---|---|---|
objectrequired | "provider_credential_setup_session" | |
request_idrequired | string | len 1..∞ |
project_idrequired | string | |
project_slugrequired | string | |
environment_idrequired | string | |
environmentrequired | "sandbox" | "production" | |
setup_urlrequired | string | |
poll_urlrequired | string | pattern: ^\/v1\/provider-credential-setup-sessions\/.* |
expires_atrequired | string<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_atrequired | string<ISO-8601> | null | |
denied_atrequired | string<ISO-8601> | null | |
created_atrequired | string<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_atrequired | string<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_idrequired | string | len 1..∞ |
completed_tts_providerrequired | null | |
completed_stt_providerrequired | null |
Variant 3
| Field | Type | Notes |
|---|---|---|
objectrequired | "provider_credential_setup_session" | |
request_idrequired | string | len 1..∞ |
project_idrequired | string | |
project_slugrequired | string | |
environment_idrequired | string | |
environmentrequired | "sandbox" | "production" | |
setup_urlrequired | string | |
poll_urlrequired | string | pattern: ^\/v1\/provider-credential-setup-sessions\/.* |
expires_atrequired | string<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_atrequired | string<ISO-8601> | null | |
denied_atrequired | string<ISO-8601> | null | |
created_atrequired | string<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_atrequired | string<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_idrequired | null | |
completed_tts_providerrequired | "openai" | |
completed_stt_providerrequired | null |
Variant 4
| Field | Type | Notes |
|---|---|---|
objectrequired | "provider_credential_setup_session" | |
request_idrequired | string | len 1..∞ |
project_idrequired | string | |
project_slugrequired | string | |
environment_idrequired | string | |
environmentrequired | "sandbox" | "production" | |
setup_urlrequired | string | |
poll_urlrequired | string | pattern: ^\/v1\/provider-credential-setup-sessions\/.* |
expires_atrequired | string<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_atrequired | string<ISO-8601> | null | |
denied_atrequired | string<ISO-8601> | null | |
created_atrequired | string<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_atrequired | string<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_idrequired | null | |
completed_tts_providerrequired | "elevenlabs" | |
completed_stt_providerrequired | null |
Variant 5
| Field | Type | Notes |
|---|---|---|
objectrequired | "provider_credential_setup_session" | |
request_idrequired | string | len 1..∞ |
project_idrequired | string | |
project_slugrequired | string | |
environment_idrequired | string | |
environmentrequired | "sandbox" | "production" | |
setup_urlrequired | string | |
poll_urlrequired | string | pattern: ^\/v1\/provider-credential-setup-sessions\/.* |
expires_atrequired | string<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_atrequired | string<ISO-8601> | null | |
denied_atrequired | string<ISO-8601> | null | |
created_atrequired | string<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_atrequired | string<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_idrequired | null | |
completed_tts_providerrequired | "xai" | |
completed_stt_providerrequired | null |
Variant 6
| Field | Type | Notes |
|---|---|---|
objectrequired | "provider_credential_setup_session" | |
request_idrequired | string | len 1..∞ |
project_idrequired | string | |
project_slugrequired | string | |
environment_idrequired | string | |
environmentrequired | "sandbox" | "production" | |
setup_urlrequired | string | |
poll_urlrequired | string | pattern: ^\/v1\/provider-credential-setup-sessions\/.* |
expires_atrequired | string<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_atrequired | string<ISO-8601> | null | |
denied_atrequired | string<ISO-8601> | null | |
created_atrequired | string<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_atrequired | string<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_idrequired | null | |
completed_tts_providerrequired | null | |
completed_stt_providerrequired | "openai" |
Hosted Meta signup session
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
| Field | Type | Notes |
|---|---|---|
return_urlrequired | string | len 0..2048 |
end_customer_ref | string | len 1..200 |
Response
| Field | Type | Notes |
|---|---|---|
idrequired | string | pattern: ^mss_.* |
objectrequired | "meta_signup_session" | |
statusrequired | "pending" | "processing" | "completed" | "expired" | "failed" | |
error | object | |
urlrequired | string | null | |
return_urlrequired | string | |
end_customer_refrequired | string | null | |
project_idrequired | string | |
environment_idrequired | string | |
environmentrequired | "sandbox" | "production" | |
expires_atrequired | string<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_atrequired | string<ISO-8601> | null | |
provider_connection_idrequired | string | null | |
created_atrequired | string<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_atrequired | string<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)))$ |
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
| Field | Type | Notes |
|---|---|---|
idrequired | string | pattern: ^mss_.* |
objectrequired | "meta_signup_session" | |
statusrequired | "pending" | "processing" | "completed" | "expired" | "failed" | |
error | object | |
urlrequired | string | null | |
return_urlrequired | string | |
end_customer_refrequired | string | null | |
project_idrequired | string | |
environment_idrequired | string | |
environmentrequired | "sandbox" | "production" | |
expires_atrequired | string<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_atrequired | string<ISO-8601> | null | |
provider_connection_idrequired | string | null | |
created_atrequired | string<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_atrequired | string<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
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
| Field | Type | Notes |
|---|---|---|
objectrequired | "meta_onboarding_config" | |
moderequired | "embedded_signup" | |
app_idrequired | string | len 1..∞ |
config_idrequired | string | len 1..∞ |
graph_api_versionrequired | string | len 1..∞ |
sdk_urlrequired | string | |
allowed_message_originsrequired | string[] | |
message_typerequired | "WA_EMBEDDED_SIGNUP" | |
login_optionsrequired | object | |
completion_endpointrequired | "/v1/provider-connections/meta/oauth" | |
manual_credentials_endpointrequired | "/v1/provider-connections/meta" |
Register Meta connection
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
| Field | Type | Notes |
|---|---|---|
channel | "whatsapp" | "instagram" | |
display_namerequired | string | len 1..∞ |
waba_id | string | len 1..∞ |
phone_number_id | string | len 1..∞ |
ig_business_account_id | string | len 1..∞ |
page_id | string | len 1..∞ |
access_tokenrequired | string | len 1..∞ |
token_source | "manual" | "embedded_signup" | |
token_expires_at | string<ISO-8601> | null |
Response
| Field | Type | Notes |
|---|---|---|
idrequired | string | |
objectrequired | "provider_connection" | |
providerrequired | "meta" | "iniciador" | "abacate_pay" | "salvy" | |
channelrequired | "whatsapp" | "instagram" | "payments" | "agentic_payments" | "phone_numbers" | |
statusrequired | "pending" | "connected" | "suspended" | "disconnected" | |
display_namerequired | string | |
environmentrequired | "sandbox" | "production" | |
waba_idrequired | string | null | |
phone_number_idrequired | string | null | |
display_phone_number | string | null | |
ig_business_account_idrequired | string | null | |
page_idrequired | string | null | |
provider_account_idrequired | string | null | |
salvy | object | null | |
operation | object | 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_receiverrequired | object | null | |
payment_capabilitiesrequired | object | null | |
agentic_capabilitiesrequired | object | null | |
default_participant_idrequired | string | null | |
agent_idrequired | string | null | |
agentic_api_base_urlrequired | string | null | |
webhook_secret_configuredrequired | boolean | |
suspension_reason | string | null | |
last_policy_warning_type | string | null | |
last_policy_warning_at | string<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_at | string<ISO-8601> | null | ISO-8601 timestamp of the trusted Meta WABA capability observation. |
waba_send_capabilities | object[] | WABA-keyed capability evidence observed through this connection. Includes the primary WABA when known; private refresh-attempt timestamps are omitted. |
waba_ban_date | string<ISO-8601> | null | |
waba_ban_state | string | null | |
account_review_status | string | null | |
restrictions | object[] | null | |
credential_last_four | string | null | |
token_sourcerequired | "manual" | "embedded_signup" | null | |
token_expires_atrequired | string<ISO-8601> | null | |
token_refreshed_atrequired | string<ISO-8601> | null | |
token_rotated_atrequired | string<ISO-8601> | null | |
created_atrequired | string<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_atrequired | string<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_atrequired | string<ISO-8601> | null |
Register a Salvy BYOK connection
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
| Field | Type | Notes |
|---|---|---|
api_keyrequired | string | len 1..4096 |
display_name | string | len 1..255 |
continuation_terms_versionrequired | "salvy_byok_v1" |
Response
| Field | Type | Notes |
|---|---|---|
idrequired | string | |
objectrequired | "provider_connection" | |
providerrequired | "meta" | "iniciador" | "abacate_pay" | "salvy" | |
channelrequired | "whatsapp" | "instagram" | "payments" | "agentic_payments" | "phone_numbers" | |
statusrequired | "pending" | "connected" | "suspended" | "disconnected" | |
display_namerequired | string | |
environmentrequired | "sandbox" | "production" | |
waba_idrequired | string | null | |
phone_number_idrequired | string | null | |
display_phone_number | string | null | |
ig_business_account_idrequired | string | null | |
page_idrequired | string | null | |
provider_account_idrequired | string | null | |
salvy | object | null | |
operation | object | 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_receiverrequired | object | null | |
payment_capabilitiesrequired | object | null | |
agentic_capabilitiesrequired | object | null | |
default_participant_idrequired | string | null | |
agent_idrequired | string | null | |
agentic_api_base_urlrequired | string | null | |
webhook_secret_configuredrequired | boolean | |
suspension_reason | string | null | |
last_policy_warning_type | string | null | |
last_policy_warning_at | string<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_at | string<ISO-8601> | null | ISO-8601 timestamp of the trusted Meta WABA capability observation. |
waba_send_capabilities | object[] | WABA-keyed capability evidence observed through this connection. Includes the primary WABA when known; private refresh-attempt timestamps are omitted. |
waba_ban_date | string<ISO-8601> | null | |
waba_ban_state | string | null | |
account_review_status | string | null | |
restrictions | object[] | null | |
credential_last_four | string | null | |
token_sourcerequired | "manual" | "embedded_signup" | null | |
token_expires_atrequired | string<ISO-8601> | null | |
token_refreshed_atrequired | string<ISO-8601> | null | |
token_rotated_atrequired | string<ISO-8601> | null | |
created_atrequired | string<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_atrequired | string<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_atrequired | string<ISO-8601> | null |
Salvy credential rotation
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
| Field | Type | Notes |
|---|---|---|
api_keyrequired | string | len 1..4096 |
Response
| Field | Type | Notes |
|---|---|---|
idrequired | string | |
objectrequired | "provider_connection" | |
providerrequired | "meta" | "iniciador" | "abacate_pay" | "salvy" | |
channelrequired | "whatsapp" | "instagram" | "payments" | "agentic_payments" | "phone_numbers" | |
statusrequired | "pending" | "connected" | "suspended" | "disconnected" | |
display_namerequired | string | |
environmentrequired | "sandbox" | "production" | |
waba_idrequired | string | null | |
phone_number_idrequired | string | null | |
display_phone_number | string | null | |
ig_business_account_idrequired | string | null | |
page_idrequired | string | null | |
provider_account_idrequired | string | null | |
salvy | object | null | |
operation | object | 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_receiverrequired | object | null | |
payment_capabilitiesrequired | object | null | |
agentic_capabilitiesrequired | object | null | |
default_participant_idrequired | string | null | |
agent_idrequired | string | null | |
agentic_api_base_urlrequired | string | null | |
webhook_secret_configuredrequired | boolean | |
suspension_reason | string | null | |
last_policy_warning_type | string | null | |
last_policy_warning_at | string<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_at | string<ISO-8601> | null | ISO-8601 timestamp of the trusted Meta WABA capability observation. |
waba_send_capabilities | object[] | WABA-keyed capability evidence observed through this connection. Includes the primary WABA when known; private refresh-attempt timestamps are omitted. |
waba_ban_date | string<ISO-8601> | null | |
waba_ban_state | string | null | |
account_review_status | string | null | |
restrictions | object[] | null | |
credential_last_four | string | null | |
token_sourcerequired | "manual" | "embedded_signup" | null | |
token_expires_atrequired | string<ISO-8601> | null | |
token_refreshed_atrequired | string<ISO-8601> | null | |
token_rotated_atrequired | string<ISO-8601> | null | |
created_atrequired | string<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_atrequired | string<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_atrequired | string<ISO-8601> | null |
Salvy discovery refresh
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
| Field | Type | Notes |
|---|---|---|
| No fields. | ||
Response
| Field | Type | Notes |
|---|---|---|
idrequired | string | |
objectrequired | "provider_connection" | |
providerrequired | "meta" | "iniciador" | "abacate_pay" | "salvy" | |
channelrequired | "whatsapp" | "instagram" | "payments" | "agentic_payments" | "phone_numbers" | |
statusrequired | "pending" | "connected" | "suspended" | "disconnected" | |
display_namerequired | string | |
environmentrequired | "sandbox" | "production" | |
waba_idrequired | string | null | |
phone_number_idrequired | string | null | |
display_phone_number | string | null | |
ig_business_account_idrequired | string | null | |
page_idrequired | string | null | |
provider_account_idrequired | string | null | |
salvy | object | null | |
operation | object | 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_receiverrequired | object | null | |
payment_capabilitiesrequired | object | null | |
agentic_capabilitiesrequired | object | null | |
default_participant_idrequired | string | null | |
agent_idrequired | string | null | |
agentic_api_base_urlrequired | string | null | |
webhook_secret_configuredrequired | boolean | |
suspension_reason | string | null | |
last_policy_warning_type | string | null | |
last_policy_warning_at | string<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_at | string<ISO-8601> | null | ISO-8601 timestamp of the trusted Meta WABA capability observation. |
waba_send_capabilities | object[] | WABA-keyed capability evidence observed through this connection. Includes the primary WABA when known; private refresh-attempt timestamps are omitted. |
waba_ban_date | string<ISO-8601> | null | |
waba_ban_state | string | null | |
account_review_status | string | null | |
restrictions | object[] | null | |
credential_last_four | string | null | |
token_sourcerequired | "manual" | "embedded_signup" | null | |
token_expires_atrequired | string<ISO-8601> | null | |
token_refreshed_atrequired | string<ISO-8601> | null | |
token_rotated_atrequired | string<ISO-8601> | null | |
created_atrequired | string<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_atrequired | string<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_atrequired | string<ISO-8601> | null |
List cached 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
| Field | Type | Notes |
|---|---|---|
objectrequired | "list" | |
datarequired | object[] | |
has_morerequired | boolean | |
next_cursorrequired | string | null |
Exchange Meta OAuth code
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
| Field | Type | Notes |
|---|---|---|
coderequired | string | len 1..∞ |
waba_id | string | len 1..∞ |
phone_number_id | string | len 1..∞ |
display_name | string | len 1..∞ |
business_id | string | len 1..∞ |
signup_session_id | string | 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
| Field | Type | Notes |
|---|---|---|
idrequired | string | |
objectrequired | "provider_connection" | |
providerrequired | "meta" | "iniciador" | "abacate_pay" | "salvy" | |
channelrequired | "whatsapp" | "instagram" | "payments" | "agentic_payments" | "phone_numbers" | |
statusrequired | "pending" | "connected" | "suspended" | "disconnected" | |
display_namerequired | string | |
environmentrequired | "sandbox" | "production" | |
waba_idrequired | string | null | |
phone_number_idrequired | string | null | |
display_phone_number | string | null | |
ig_business_account_idrequired | string | null | |
page_idrequired | string | null | |
provider_account_idrequired | string | null | |
salvy | object | null | |
operation | object | 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_receiverrequired | object | null | |
payment_capabilitiesrequired | object | null | |
agentic_capabilitiesrequired | object | null | |
default_participant_idrequired | string | null | |
agent_idrequired | string | null | |
agentic_api_base_urlrequired | string | null | |
webhook_secret_configuredrequired | boolean | |
suspension_reason | string | null | |
last_policy_warning_type | string | null | |
last_policy_warning_at | string<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_at | string<ISO-8601> | null | ISO-8601 timestamp of the trusted Meta WABA capability observation. |
waba_send_capabilities | object[] | WABA-keyed capability evidence observed through this connection. Includes the primary WABA when known; private refresh-attempt timestamps are omitted. |
waba_ban_date | string<ISO-8601> | null | |
waba_ban_state | string | null | |
account_review_status | string | null | |
restrictions | object[] | null | |
credential_last_four | string | null | |
token_sourcerequired | "manual" | "embedded_signup" | null | |
token_expires_atrequired | string<ISO-8601> | null | |
token_refreshed_atrequired | string<ISO-8601> | null | |
token_rotated_atrequired | string<ISO-8601> | null | |
created_atrequired | string<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_atrequired | string<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_atrequired | string<ISO-8601> | null |
Complete a pending Meta registration
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
| Field | Type | Notes |
|---|---|---|
idrequired | string | |
objectrequired | "provider_connection" | |
providerrequired | "meta" | "iniciador" | "abacate_pay" | "salvy" | |
channelrequired | "whatsapp" | "instagram" | "payments" | "agentic_payments" | "phone_numbers" | |
statusrequired | "pending" | "connected" | "suspended" | "disconnected" | |
display_namerequired | string | |
environmentrequired | "sandbox" | "production" | |
waba_idrequired | string | null | |
phone_number_idrequired | string | null | |
display_phone_number | string | null | |
ig_business_account_idrequired | string | null | |
page_idrequired | string | null | |
provider_account_idrequired | string | null | |
salvy | object | null | |
operation | object | 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_receiverrequired | object | null | |
payment_capabilitiesrequired | object | null | |
agentic_capabilitiesrequired | object | null | |
default_participant_idrequired | string | null | |
agent_idrequired | string | null | |
agentic_api_base_urlrequired | string | null | |
webhook_secret_configuredrequired | boolean | |
suspension_reason | string | null | |
last_policy_warning_type | string | null | |
last_policy_warning_at | string<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_at | string<ISO-8601> | null | ISO-8601 timestamp of the trusted Meta WABA capability observation. |
waba_send_capabilities | object[] | WABA-keyed capability evidence observed through this connection. Includes the primary WABA when known; private refresh-attempt timestamps are omitted. |
waba_ban_date | string<ISO-8601> | null | |
waba_ban_state | string | null | |
account_review_status | string | null | |
restrictions | object[] | null | |
credential_last_four | string | null | |
token_sourcerequired | "manual" | "embedded_signup" | null | |
token_expires_atrequired | string<ISO-8601> | null | |
token_refreshed_atrequired | string<ISO-8601> | null | |
token_rotated_atrequired | string<ISO-8601> | null | |
created_atrequired | string<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_atrequired | string<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_atrequired | string<ISO-8601> | null |
Rotate token
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
| Field | Type | Notes |
|---|---|---|
access_tokenrequired | string | len 1..∞ |
token_source | "manual" | "embedded_signup" | |
token_expires_at | string<ISO-8601> | null |
Response
| Field | Type | Notes |
|---|---|---|
idrequired | string | |
objectrequired | "provider_connection" | |
providerrequired | "meta" | "iniciador" | "abacate_pay" | "salvy" | |
channelrequired | "whatsapp" | "instagram" | "payments" | "agentic_payments" | "phone_numbers" | |
statusrequired | "pending" | "connected" | "suspended" | "disconnected" | |
display_namerequired | string | |
environmentrequired | "sandbox" | "production" | |
waba_idrequired | string | null | |
phone_number_idrequired | string | null | |
display_phone_number | string | null | |
ig_business_account_idrequired | string | null | |
page_idrequired | string | null | |
provider_account_idrequired | string | null | |
salvy | object | null | |
operation | object | 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_receiverrequired | object | null | |
payment_capabilitiesrequired | object | null | |
agentic_capabilitiesrequired | object | null | |
default_participant_idrequired | string | null | |
agent_idrequired | string | null | |
agentic_api_base_urlrequired | string | null | |
webhook_secret_configuredrequired | boolean | |
suspension_reason | string | null | |
last_policy_warning_type | string | null | |
last_policy_warning_at | string<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_at | string<ISO-8601> | null | ISO-8601 timestamp of the trusted Meta WABA capability observation. |
waba_send_capabilities | object[] | WABA-keyed capability evidence observed through this connection. Includes the primary WABA when known; private refresh-attempt timestamps are omitted. |
waba_ban_date | string<ISO-8601> | null | |
waba_ban_state | string | null | |
account_review_status | string | null | |
restrictions | object[] | null | |
credential_last_four | string | null | |
token_sourcerequired | "manual" | "embedded_signup" | null | |
token_expires_atrequired | string<ISO-8601> | null | |
token_refreshed_atrequired | string<ISO-8601> | null | |
token_rotated_atrequired | string<ISO-8601> | null | |
created_atrequired | string<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_atrequired | string<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_atrequired | string<ISO-8601> | null |
Disconnect
Clears provider credentials without deleting audit history. The connection disappears from list/retrieve and readiness reports it as disconnected or missing.
Response
| Field | Type | Notes |
|---|---|---|
idrequired | string | |
objectrequired | "provider_connection" | |
providerrequired | "meta" | "iniciador" | "abacate_pay" | "salvy" | |
channelrequired | "whatsapp" | "instagram" | "payments" | "agentic_payments" | "phone_numbers" | |
statusrequired | "pending" | "connected" | "suspended" | "disconnected" | |
display_namerequired | string | |
environmentrequired | "sandbox" | "production" | |
waba_idrequired | string | null | |
phone_number_idrequired | string | null | |
display_phone_number | string | null | |
ig_business_account_idrequired | string | null | |
page_idrequired | string | null | |
provider_account_idrequired | string | null | |
salvy | object | null | |
operation | object | 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_receiverrequired | object | null | |
payment_capabilitiesrequired | object | null | |
agentic_capabilitiesrequired | object | null | |
default_participant_idrequired | string | null | |
agent_idrequired | string | null | |
agentic_api_base_urlrequired | string | null | |
webhook_secret_configuredrequired | boolean | |
suspension_reason | string | null | |
last_policy_warning_type | string | null | |
last_policy_warning_at | string<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_at | string<ISO-8601> | null | ISO-8601 timestamp of the trusted Meta WABA capability observation. |
waba_send_capabilities | object[] | WABA-keyed capability evidence observed through this connection. Includes the primary WABA when known; private refresh-attempt timestamps are omitted. |
waba_ban_date | string<ISO-8601> | null | |
waba_ban_state | string | null | |
account_review_status | string | null | |
restrictions | object[] | null | |
credential_last_four | string | null | |
token_sourcerequired | "manual" | "embedded_signup" | null | |
token_expires_atrequired | string<ISO-8601> | null | |
token_refreshed_atrequired | string<ISO-8601> | null | |
token_rotated_atrequired | string<ISO-8601> | null | |
created_atrequired | string<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_atrequired | string<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_atrequired | string<ISO-8601> | null |