Remote pairing (connection link)
Generates a link so another person connects their own number. provider=PILOT_STATUS (default) requires name + number and returns a QR pairing link; provider=META returns a hosted Embedded Signup link (the person picks the number inside the Facebook dialog, no name/number).
curl --request POST \
--url https://pilotstatus.com.br/v1/numbers/remote-pairing \
--header 'Content-Type: application/json' \
--header 'x-api-key: <api-key>' \
--data '
{
"provider": "PILOT_STATUS",
"name": "Cliente Acme",
"number": "5511988887777",
"sendViaWhatsApp": "false",
"redirectUrl": "https://app.acme.com/done",
"externalRef": "customer-42",
"linkToApiKey": "true",
"metaFlow": "embedded",
"settings": {
"historyImportEnabled": false,
"webhookHistoricalMessages": false,
"ignoreNewsletters": false
}
}
'import requests
url = "https://pilotstatus.com.br/v1/numbers/remote-pairing"
payload = {
"provider": "PILOT_STATUS",
"name": "Cliente Acme",
"number": "5511988887777",
"sendViaWhatsApp": "false",
"redirectUrl": "https://app.acme.com/done",
"externalRef": "customer-42",
"linkToApiKey": "true",
"metaFlow": "embedded",
"settings": {
"historyImportEnabled": False,
"webhookHistoricalMessages": False,
"ignoreNewsletters": False
}
}
headers = {
"x-api-key": "<api-key>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {'x-api-key': '<api-key>', 'Content-Type': 'application/json'},
body: JSON.stringify({
provider: 'PILOT_STATUS',
name: 'Cliente Acme',
number: '5511988887777',
sendViaWhatsApp: 'false',
redirectUrl: 'https://app.acme.com/done',
externalRef: 'customer-42',
linkToApiKey: 'true',
metaFlow: 'embedded',
settings: {
historyImportEnabled: false,
webhookHistoricalMessages: false,
ignoreNewsletters: false
}
})
};
fetch('https://pilotstatus.com.br/v1/numbers/remote-pairing', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://pilotstatus.com.br/v1/numbers/remote-pairing",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => json_encode([
'provider' => 'PILOT_STATUS',
'name' => 'Cliente Acme',
'number' => '5511988887777',
'sendViaWhatsApp' => 'false',
'redirectUrl' => 'https://app.acme.com/done',
'externalRef' => 'customer-42',
'linkToApiKey' => 'true',
'metaFlow' => 'embedded',
'settings' => [
'historyImportEnabled' => false,
'webhookHistoricalMessages' => false,
'ignoreNewsletters' => false
]
]),
CURLOPT_HTTPHEADER => [
"Content-Type: application/json",
"x-api-key: <api-key>"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://pilotstatus.com.br/v1/numbers/remote-pairing"
payload := strings.NewReader("{\n \"provider\": \"PILOT_STATUS\",\n \"name\": \"Cliente Acme\",\n \"number\": \"5511988887777\",\n \"sendViaWhatsApp\": \"false\",\n \"redirectUrl\": \"https://app.acme.com/done\",\n \"externalRef\": \"customer-42\",\n \"linkToApiKey\": \"true\",\n \"metaFlow\": \"embedded\",\n \"settings\": {\n \"historyImportEnabled\": false,\n \"webhookHistoricalMessages\": false,\n \"ignoreNewsletters\": false\n }\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("x-api-key", "<api-key>")
req.Header.Add("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.post("https://pilotstatus.com.br/v1/numbers/remote-pairing")
.header("x-api-key", "<api-key>")
.header("Content-Type", "application/json")
.body("{\n \"provider\": \"PILOT_STATUS\",\n \"name\": \"Cliente Acme\",\n \"number\": \"5511988887777\",\n \"sendViaWhatsApp\": \"false\",\n \"redirectUrl\": \"https://app.acme.com/done\",\n \"externalRef\": \"customer-42\",\n \"linkToApiKey\": \"true\",\n \"metaFlow\": \"embedded\",\n \"settings\": {\n \"historyImportEnabled\": false,\n \"webhookHistoricalMessages\": false,\n \"ignoreNewsletters\": false\n }\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://pilotstatus.com.br/v1/numbers/remote-pairing")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["x-api-key"] = '<api-key>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"provider\": \"PILOT_STATUS\",\n \"name\": \"Cliente Acme\",\n \"number\": \"5511988887777\",\n \"sendViaWhatsApp\": \"false\",\n \"redirectUrl\": \"https://app.acme.com/done\",\n \"externalRef\": \"customer-42\",\n \"linkToApiKey\": \"true\",\n \"metaFlow\": \"embedded\",\n \"settings\": {\n \"historyImportEnabled\": false,\n \"webhookHistoricalMessages\": false,\n \"ignoreNewsletters\": false\n }\n}"
response = http.request(request)
puts response.read_body{
"provider": "PILOT_STATUS",
"remotePairingToken": "rp_01HZX...",
"remotePairingUrl": "https://pilotstatus.com.br/connect/rp_01HZX...",
"numberId": "num_01HZX..."
}Authorizations
Your ps_ API key
Body
Link kind (default PILOT_STATUS).
"PILOT_STATUS"
Required for PILOT_STATUS; ignored for META.
"Cliente Acme"
Required for PILOT_STATUS; ignored for META.
"5511988887777"
Send the link over WhatsApp (PILOT_STATUS). Default false.
"false"
Redirect URL after completion (META).
"https://app.acme.com/done"
Optional external reference for correlation (META).
"customer-42"
Deprecated: accepted and ignored. No API key is touched and linkedApiKeyId is always null.
"true"
META only: embedded (default) runs Meta Embedded Signup on the hosted page; credentials collects an existing WABA's credentials.
embedded, credentials "embedded"
Per-number settings the number is BORN with — the same block as PATCH /v1/numbers/{id}. Applies to both providers: for META it is written on the placeholder the connection lands on. This is the moment to decide history: settings.historyImportEnabled defaults to true, the provider hands the device history over once, right after the person connects, and changing the flag afterwards cannot bring it back or undo it. Invalid values answer 400 INVALID_SETTINGS and nothing is created.
Show child attributes
Show child attributes
Response
Pairing link created. META answers with the placeholder numberId, the link, its expiresAt (30 min) and the settings the placeholder was created with.
Was this page helpful?
curl --request POST \
--url https://pilotstatus.com.br/v1/numbers/remote-pairing \
--header 'Content-Type: application/json' \
--header 'x-api-key: <api-key>' \
--data '
{
"provider": "PILOT_STATUS",
"name": "Cliente Acme",
"number": "5511988887777",
"sendViaWhatsApp": "false",
"redirectUrl": "https://app.acme.com/done",
"externalRef": "customer-42",
"linkToApiKey": "true",
"metaFlow": "embedded",
"settings": {
"historyImportEnabled": false,
"webhookHistoricalMessages": false,
"ignoreNewsletters": false
}
}
'import requests
url = "https://pilotstatus.com.br/v1/numbers/remote-pairing"
payload = {
"provider": "PILOT_STATUS",
"name": "Cliente Acme",
"number": "5511988887777",
"sendViaWhatsApp": "false",
"redirectUrl": "https://app.acme.com/done",
"externalRef": "customer-42",
"linkToApiKey": "true",
"metaFlow": "embedded",
"settings": {
"historyImportEnabled": False,
"webhookHistoricalMessages": False,
"ignoreNewsletters": False
}
}
headers = {
"x-api-key": "<api-key>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {'x-api-key': '<api-key>', 'Content-Type': 'application/json'},
body: JSON.stringify({
provider: 'PILOT_STATUS',
name: 'Cliente Acme',
number: '5511988887777',
sendViaWhatsApp: 'false',
redirectUrl: 'https://app.acme.com/done',
externalRef: 'customer-42',
linkToApiKey: 'true',
metaFlow: 'embedded',
settings: {
historyImportEnabled: false,
webhookHistoricalMessages: false,
ignoreNewsletters: false
}
})
};
fetch('https://pilotstatus.com.br/v1/numbers/remote-pairing', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://pilotstatus.com.br/v1/numbers/remote-pairing",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => json_encode([
'provider' => 'PILOT_STATUS',
'name' => 'Cliente Acme',
'number' => '5511988887777',
'sendViaWhatsApp' => 'false',
'redirectUrl' => 'https://app.acme.com/done',
'externalRef' => 'customer-42',
'linkToApiKey' => 'true',
'metaFlow' => 'embedded',
'settings' => [
'historyImportEnabled' => false,
'webhookHistoricalMessages' => false,
'ignoreNewsletters' => false
]
]),
CURLOPT_HTTPHEADER => [
"Content-Type: application/json",
"x-api-key: <api-key>"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://pilotstatus.com.br/v1/numbers/remote-pairing"
payload := strings.NewReader("{\n \"provider\": \"PILOT_STATUS\",\n \"name\": \"Cliente Acme\",\n \"number\": \"5511988887777\",\n \"sendViaWhatsApp\": \"false\",\n \"redirectUrl\": \"https://app.acme.com/done\",\n \"externalRef\": \"customer-42\",\n \"linkToApiKey\": \"true\",\n \"metaFlow\": \"embedded\",\n \"settings\": {\n \"historyImportEnabled\": false,\n \"webhookHistoricalMessages\": false,\n \"ignoreNewsletters\": false\n }\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("x-api-key", "<api-key>")
req.Header.Add("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.post("https://pilotstatus.com.br/v1/numbers/remote-pairing")
.header("x-api-key", "<api-key>")
.header("Content-Type", "application/json")
.body("{\n \"provider\": \"PILOT_STATUS\",\n \"name\": \"Cliente Acme\",\n \"number\": \"5511988887777\",\n \"sendViaWhatsApp\": \"false\",\n \"redirectUrl\": \"https://app.acme.com/done\",\n \"externalRef\": \"customer-42\",\n \"linkToApiKey\": \"true\",\n \"metaFlow\": \"embedded\",\n \"settings\": {\n \"historyImportEnabled\": false,\n \"webhookHistoricalMessages\": false,\n \"ignoreNewsletters\": false\n }\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://pilotstatus.com.br/v1/numbers/remote-pairing")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["x-api-key"] = '<api-key>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"provider\": \"PILOT_STATUS\",\n \"name\": \"Cliente Acme\",\n \"number\": \"5511988887777\",\n \"sendViaWhatsApp\": \"false\",\n \"redirectUrl\": \"https://app.acme.com/done\",\n \"externalRef\": \"customer-42\",\n \"linkToApiKey\": \"true\",\n \"metaFlow\": \"embedded\",\n \"settings\": {\n \"historyImportEnabled\": false,\n \"webhookHistoricalMessages\": false,\n \"ignoreNewsletters\": false\n }\n}"
response = http.request(request)
puts response.read_body{
"provider": "PILOT_STATUS",
"remotePairingToken": "rp_01HZX...",
"remotePairingUrl": "https://pilotstatus.com.br/connect/rp_01HZX...",
"numberId": "num_01HZX..."
}