List ad accounts
The Meta ad accounts this workspace has connected, so Pilot Status can resolve the ad, ad set and campaign names of your Click-to-WhatsApp traffic, plus the accounts you can still connect.
There is no Meta login step: the advertiser adds the Pilot Status business portfolio (partnerBusinessId) as a partner of the ad account in Meta Business Manager, and Pilot Status reads with its own system user.
Account-wide credential only (a number-scoped key is refused with 403 NUMBER_SCOPE_NOT_ALLOWED): an ad account belongs to the workspace, not to a number. OAuth/MCP tokens need integrations:manage (workspace ADMIN or OWNER) on every verb, reads included.
linked are the active links; sharingActive is true while the partner grant is still in place, false when the advertiser revoked it, and null when Meta could not be asked right now (never read null as revoked). candidates are accounts shared with Pilot Status that provably belong to this workspace — an ad from them already reached one of your numbers — and are not linked yet; a new workspace starts with an empty list. sharingLookup is ok, unavailable (Meta could not be reached; linked still comes back) or not_configured.
curl --request GET \
--url https://pilotstatus.com.br/v1/ads/accounts \
--header 'x-api-key: <api-key>'import requests
url = "https://pilotstatus.com.br/v1/ads/accounts"
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/ads/accounts', 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/ads/accounts",
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/ads/accounts"
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/ads/accounts")
.header("x-api-key", "<api-key>")
.asString();require 'uri'
require 'net/http'
url = URI("https://pilotstatus.com.br/v1/ads/accounts")
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{
"linked": [
{
"adAccountId": "act_1234567890",
"adAccountName": "MM Design",
"linkedAt": "2026-10-05T14:02:11.000Z",
"sharingActive": true
}
],
"candidates": [
{
"adAccountId": "act_9876543210",
"adAccountName": "MM Design — Black Friday",
"accountStatus": 1
}
],
"partnerBusinessId": "123456789012345",
"sharingLookup": "ok"
}{
"error": "Unauthorized"
}{
"error": "This endpoint requires a tenant-scoped API key",
"code": "NUMBER_SCOPE_NOT_ALLOWED"
}{
"error": "Internal server error | Erro interno do servidor",
"code": "INTERNAL_ERROR"
}Authorizations
Your ps_ API key
Response
Linked and linkable ad accounts
Was this page helpful?
curl --request GET \
--url https://pilotstatus.com.br/v1/ads/accounts \
--header 'x-api-key: <api-key>'import requests
url = "https://pilotstatus.com.br/v1/ads/accounts"
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/ads/accounts', 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/ads/accounts",
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/ads/accounts"
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/ads/accounts")
.header("x-api-key", "<api-key>")
.asString();require 'uri'
require 'net/http'
url = URI("https://pilotstatus.com.br/v1/ads/accounts")
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{
"linked": [
{
"adAccountId": "act_1234567890",
"adAccountName": "MM Design",
"linkedAt": "2026-10-05T14:02:11.000Z",
"sharingActive": true
}
],
"candidates": [
{
"adAccountId": "act_9876543210",
"adAccountName": "MM Design — Black Friday",
"accountStatus": 1
}
],
"partnerBusinessId": "123456789012345",
"sharingLookup": "ok"
}{
"error": "Unauthorized"
}{
"error": "This endpoint requires a tenant-scoped API key",
"code": "NUMBER_SCOPE_NOT_ALLOWED"
}{
"error": "Internal server error | Erro interno do servidor",
"code": "INTERNAL_ERROR"
}