Ver a chave de endpoint do Flow
O par de chaves do endpoint data_exchange de UM número: se existe (configured), a metade pública (publicKey), quando a Meta a aceitou (uploadedAt), a URL base para registrar num Flow (endpointUrl) e — a parte que não tem outro sintoma — o que a META diz que tem (metaStatus).
⛔ metaStatus tem QUATRO valores e UNKNOWN não é NOT_SET. VALID é a Meta ter a chave que nós temos; MISMATCH é a Meta ter OUTRA, o que quebra em silêncio todos os Flows data_exchange do número e não levanta erro nenhum do nosso lado; NOT_SET é a Meta responder que não tem chave; UNKNOWN é nós não termos conseguido perguntar. Juntar os dois últimos faz um operador rotacionar por causa de um 500 passageiro do Graph — e rotacionar substitui a chave que a Meta tem.
uploadedAt: null significa que um par foi gerado aqui mas a Meta nunca o aceitou. Não é o mesmo que não ter chave nenhuma, e é o estado que um POST repetido RETOMA em vez de substituir.
A metade PRIVADA nunca está neste payload. endpointUrl é uma credencial — embute o token de caminho do endpoint do número — e é por isso que a permissão é flows:manage e deliberadamente não flows:read. Acrescente o id do Flow como último segmento para obter o endpoint_uri de um Flow.
⚠️ O {id} do caminho é CONFERIDO contra o número da própria credencial, nunca usado para procurar um. Um id que não bate responde 404 FLOW_NUMBER_NOT_FOUND — nunca 403, e com o mesmo corpo quer o id seja de outro tenant, quer de outro número seu, para que um palpite errado não aprenda nada.
Exige chave com escopo de número. Uma chave de tenant precisa nomear o número no header x-whatsapp-number-id, senão recebe 403 TENANT_SCOPE_NOT_ALLOWED.
curl --request GET \
--url https://pilotstatus.com.br/v1/numbers/{id}/flow-endpoint-key \
--header 'x-api-key: <api-key>'import requests
url = "https://pilotstatus.com.br/v1/numbers/{id}/flow-endpoint-key"
headers = {"x-api-key": "<api-key>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {'x-api-key': '<api-key>'}};
fetch('https://pilotstatus.com.br/v1/numbers/{id}/flow-endpoint-key', 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/{id}/flow-endpoint-key",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
CURLOPT_HTTPHEADER => [
"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"
"net/http"
"io"
)
func main() {
url := "https://pilotstatus.com.br/v1/numbers/{id}/flow-endpoint-key"
req, _ := http.NewRequest("GET", url, nil)
req.Header.Add("x-api-key", "<api-key>")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.get("https://pilotstatus.com.br/v1/numbers/{id}/flow-endpoint-key")
.header("x-api-key", "<api-key>")
.asString();require 'uri'
require 'net/http'
url = URI("https://pilotstatus.com.br/v1/numbers/{id}/flow-endpoint-key")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
request["x-api-key"] = '<api-key>'
response = http.request(request)
puts response.read_body{
"configured": true,
"publicKey": "-----BEGIN PUBLIC KEY-----\nMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA...\n-----END PUBLIC KEY-----\n",
"uploadedAt": "2026-09-02T10:00:00.000Z",
"endpointUrl": "https://pilotstatus.com.br/api/flows/endpoint/AbC123...",
"metaStatus": "VALID"
}{
"error": "Unauthorized"
}{
"error": "This endpoint acts on a single WhatsApp number: send the x-whatsapp-number-id header naming the number to act on (its id or instance id from GET /v1/numbers) | Este endpoint atua sobre um único número de WhatsApp: envie o header x-whatsapp-number-id indicando o número desejado (o id dele ou o id da instância, obtidos em GET /v1/numbers)",
"code": "TENANT_SCOPE_NOT_ALLOWED"
}{
"error": "Número não encontrado para esta chave. Esta rota atua sobre o número ao qual a chave está vinculada — use a chave do número em questão, ou o header x-whatsapp-number-id se a chave for de conta.",
"errorEN": "Number not found for this key. This route acts on the number the key is bound to — use that number's key, or the x-whatsapp-number-id header if the key is an account-wide one.",
"code": "FLOW_NUMBER_NOT_FOUND"
}{
"error": "Flows existem apenas em números Meta (API Oficial). O número desta chave não é Meta ou não tem uma WABA associada — use uma chave de um número Meta.",
"errorEN": "Flows only exist on Meta (Cloud API) numbers. This key's number is not a Meta number, or has no WABA behind it — use a key bound to a Meta number.",
"code": "FLOW_REQUIRES_META_NUMBER"
}{
"error": "Too many requests"
}{
"error": "Erro interno do servidor.",
"errorEN": "Internal server error.",
"code": "INTERNAL_ERROR"
}Autorizações
Sua chave de API ps_
Parâmetros de caminho
O id do número ao qual a chave está vinculada — o id (ou o id da instância) que GET /v1/numbers devolve. Ele é CONFERIDO contra o número da própria credencial, nunca usado para procurar um.
Resposta
O par de chaves do endpoint data_exchange do número, como está aqui e na Meta. A metade privada nunca vai no payload
Esta página foi útil?
curl --request GET \
--url https://pilotstatus.com.br/v1/numbers/{id}/flow-endpoint-key \
--header 'x-api-key: <api-key>'import requests
url = "https://pilotstatus.com.br/v1/numbers/{id}/flow-endpoint-key"
headers = {"x-api-key": "<api-key>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {'x-api-key': '<api-key>'}};
fetch('https://pilotstatus.com.br/v1/numbers/{id}/flow-endpoint-key', 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/{id}/flow-endpoint-key",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
CURLOPT_HTTPHEADER => [
"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"
"net/http"
"io"
)
func main() {
url := "https://pilotstatus.com.br/v1/numbers/{id}/flow-endpoint-key"
req, _ := http.NewRequest("GET", url, nil)
req.Header.Add("x-api-key", "<api-key>")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.get("https://pilotstatus.com.br/v1/numbers/{id}/flow-endpoint-key")
.header("x-api-key", "<api-key>")
.asString();require 'uri'
require 'net/http'
url = URI("https://pilotstatus.com.br/v1/numbers/{id}/flow-endpoint-key")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
request["x-api-key"] = '<api-key>'
response = http.request(request)
puts response.read_body{
"configured": true,
"publicKey": "-----BEGIN PUBLIC KEY-----\nMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA...\n-----END PUBLIC KEY-----\n",
"uploadedAt": "2026-09-02T10:00:00.000Z",
"endpointUrl": "https://pilotstatus.com.br/api/flows/endpoint/AbC123...",
"metaStatus": "VALID"
}{
"error": "Unauthorized"
}{
"error": "This endpoint acts on a single WhatsApp number: send the x-whatsapp-number-id header naming the number to act on (its id or instance id from GET /v1/numbers) | Este endpoint atua sobre um único número de WhatsApp: envie o header x-whatsapp-number-id indicando o número desejado (o id dele ou o id da instância, obtidos em GET /v1/numbers)",
"code": "TENANT_SCOPE_NOT_ALLOWED"
}{
"error": "Número não encontrado para esta chave. Esta rota atua sobre o número ao qual a chave está vinculada — use a chave do número em questão, ou o header x-whatsapp-number-id se a chave for de conta.",
"errorEN": "Number not found for this key. This route acts on the number the key is bound to — use that number's key, or the x-whatsapp-number-id header if the key is an account-wide one.",
"code": "FLOW_NUMBER_NOT_FOUND"
}{
"error": "Flows existem apenas em números Meta (API Oficial). O número desta chave não é Meta ou não tem uma WABA associada — use uma chave de um número Meta.",
"errorEN": "Flows only exist on Meta (Cloud API) numbers. This key's number is not a Meta number, or has no WABA behind it — use a key bound to a Meta number.",
"code": "FLOW_REQUIRES_META_NUMBER"
}{
"error": "Too many requests"
}{
"error": "Erro interno do servidor.",
"errorEN": "Internal server error.",
"code": "INTERNAL_ERROR"
}