Remote pairing — hosted pairing link
For SaaS platforms that manage numbers for end customers, Remote Pairing lets you generate a pairing link instead of displaying the QR code yourself. Your customer opens the link, scans the QR (or runs Meta Embedded Signup), and the number connects to your account.POST /v1/numbers/remote-pairing
Same body asPOST /v1/numbers, plus pairing-specific options:
201:
POST /v1/numbers:
- The instance is created in
CLOSEstate (disconnected) — no QR code is returned. remotePairingUrlis the public link to send to the end customer.- When the end customer opens the URL and connects, the
number.connectedwebhook fires normally.
Automatic send via WhatsApp
WithsendViaWhatsApp: true, Pilot Status attempts to send a template message to the destination number containing the pairing link. Requires a template named pilot_status_remote_pairing (OTP category) created in the dashboard. If sending fails, the instance and URL are still created, but messageSent returns false with a messageError.
Per-link branding (white-label)
The body also accepts an optionalbranding object to override the connect page’s logo/colors/title for just this link (snapshotted onto the token). It overrides the tenant’s saved branding. See Connect page branding.
Meta numbers: metaFlow
For official Meta Cloud API numbers the pairing link can run Meta flows instead of QR pairing:
metaFlow: "embedded"— the hosted page runs Meta Embedded Signup so your customer connects their own WABA without leaving the link.metaFlow: "credentials"— the hosted page collects the customer’s existing WABA credentials.
Remote pairing with
metaFlow is the hosted option. If you already hold the WABA credentials server-side, use POST /v1/numbers/meta (direct BYO-WABA) instead — no link and no end-customer interaction needed.Public token endpoints (no authentication)
The pairing page uses these token-based endpoints — you can also call them to build your own connect UI:| Method | Endpoint | Returns |
|---|---|---|
GET | /v1/remote-pairing/{token} | { valid, name, maskedNumber, state, branding } |
POST | /v1/remote-pairing/{token}/connect | { qrcodeBase64, pairingCode } |
GET | /v1/remote-pairing/{token}/status | { state, isFullyConnected } |
GET | /v1/connect/{token}/branding | { branding } (also used by the Meta Embedded Signup flow) |
- The token expires after 24 hours or upon successful connection (single-use).
POST .../connectonly works when the state is notOPEN.- The same connection state shown in the dashboard and the webhooks (
number.created,number.connected) apply.