curl --request POST \
--url https://app.famulor.io/api/v1/whatsapp/embedded-signup \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"code": "<string>",
"waba_id": "<string>",
"assistant_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"phone_number_id": "<string>",
"name": "<string>",
"display_phone_number": "<string>",
"phone_number_row_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"whatsapp_text_enabled": true,
"whatsapp_voice_enabled": true,
"whatsapp_outbound_voice_enabled": true,
"whatsapp_coexistence": true
}
'import requests
url = "https://app.famulor.io/api/v1/whatsapp/embedded-signup"
payload = {
"code": "<string>",
"waba_id": "<string>",
"assistant_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"phone_number_id": "<string>",
"name": "<string>",
"display_phone_number": "<string>",
"phone_number_row_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"whatsapp_text_enabled": True,
"whatsapp_voice_enabled": True,
"whatsapp_outbound_voice_enabled": True,
"whatsapp_coexistence": True
}
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({
code: '<string>',
waba_id: '<string>',
assistant_id: '3c90c3cc-0d44-4b50-8888-8dd25736052a',
phone_number_id: '<string>',
name: '<string>',
display_phone_number: '<string>',
phone_number_row_id: '3c90c3cc-0d44-4b50-8888-8dd25736052a',
whatsapp_text_enabled: true,
whatsapp_voice_enabled: true,
whatsapp_outbound_voice_enabled: true,
whatsapp_coexistence: true
})
};
fetch('https://app.famulor.io/api/v1/whatsapp/embedded-signup', 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://app.famulor.io/api/v1/whatsapp/embedded-signup",
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([
'code' => '<string>',
'waba_id' => '<string>',
'assistant_id' => '3c90c3cc-0d44-4b50-8888-8dd25736052a',
'phone_number_id' => '<string>',
'name' => '<string>',
'display_phone_number' => '<string>',
'phone_number_row_id' => '3c90c3cc-0d44-4b50-8888-8dd25736052a',
'whatsapp_text_enabled' => true,
'whatsapp_voice_enabled' => true,
'whatsapp_outbound_voice_enabled' => true,
'whatsapp_coexistence' => true
]),
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>",
"Content-Type: application/json"
],
]);
$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://app.famulor.io/api/v1/whatsapp/embedded-signup"
payload := strings.NewReader("{\n \"code\": \"<string>\",\n \"waba_id\": \"<string>\",\n \"assistant_id\": \"3c90c3cc-0d44-4b50-8888-8dd25736052a\",\n \"phone_number_id\": \"<string>\",\n \"name\": \"<string>\",\n \"display_phone_number\": \"<string>\",\n \"phone_number_row_id\": \"3c90c3cc-0d44-4b50-8888-8dd25736052a\",\n \"whatsapp_text_enabled\": true,\n \"whatsapp_voice_enabled\": true,\n \"whatsapp_outbound_voice_enabled\": true,\n \"whatsapp_coexistence\": true\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("Authorization", "Bearer <token>")
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://app.famulor.io/api/v1/whatsapp/embedded-signup")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"code\": \"<string>\",\n \"waba_id\": \"<string>\",\n \"assistant_id\": \"3c90c3cc-0d44-4b50-8888-8dd25736052a\",\n \"phone_number_id\": \"<string>\",\n \"name\": \"<string>\",\n \"display_phone_number\": \"<string>\",\n \"phone_number_row_id\": \"3c90c3cc-0d44-4b50-8888-8dd25736052a\",\n \"whatsapp_text_enabled\": true,\n \"whatsapp_voice_enabled\": true,\n \"whatsapp_outbound_voice_enabled\": true,\n \"whatsapp_coexistence\": true\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://app.famulor.io/api/v1/whatsapp/embedded-signup")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"code\": \"<string>\",\n \"waba_id\": \"<string>\",\n \"assistant_id\": \"3c90c3cc-0d44-4b50-8888-8dd25736052a\",\n \"phone_number_id\": \"<string>\",\n \"name\": \"<string>\",\n \"display_phone_number\": \"<string>\",\n \"phone_number_row_id\": \"3c90c3cc-0d44-4b50-8888-8dd25736052a\",\n \"whatsapp_text_enabled\": true,\n \"whatsapp_voice_enabled\": true,\n \"whatsapp_outbound_voice_enabled\": true,\n \"whatsapp_coexistence\": true\n}"
response = http.request(request)
puts response.read_body{
"error": {
"code": "rate_limited",
"message": "Too many requests. Retry after the indicated delay."
}
}{
"error": {
"code": "internal_error",
"message": "Request protection is temporarily unavailable."
}
}Complete WhatsApp Embedded Signup
Exchange the Meta popup code, subscribe WABA, register the phone (Cloud path) or skip registration and request Business-app sync (Coexistence), then create a connector. Required scope: assistants:write. Code TTL ~30s. phone_number_id may be omitted on Coexistence — the server discovers it from the WABA.
curl --request POST \
--url https://app.famulor.io/api/v1/whatsapp/embedded-signup \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"code": "<string>",
"waba_id": "<string>",
"assistant_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"phone_number_id": "<string>",
"name": "<string>",
"display_phone_number": "<string>",
"phone_number_row_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"whatsapp_text_enabled": true,
"whatsapp_voice_enabled": true,
"whatsapp_outbound_voice_enabled": true,
"whatsapp_coexistence": true
}
'import requests
url = "https://app.famulor.io/api/v1/whatsapp/embedded-signup"
payload = {
"code": "<string>",
"waba_id": "<string>",
"assistant_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"phone_number_id": "<string>",
"name": "<string>",
"display_phone_number": "<string>",
"phone_number_row_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"whatsapp_text_enabled": True,
"whatsapp_voice_enabled": True,
"whatsapp_outbound_voice_enabled": True,
"whatsapp_coexistence": True
}
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({
code: '<string>',
waba_id: '<string>',
assistant_id: '3c90c3cc-0d44-4b50-8888-8dd25736052a',
phone_number_id: '<string>',
name: '<string>',
display_phone_number: '<string>',
phone_number_row_id: '3c90c3cc-0d44-4b50-8888-8dd25736052a',
whatsapp_text_enabled: true,
whatsapp_voice_enabled: true,
whatsapp_outbound_voice_enabled: true,
whatsapp_coexistence: true
})
};
fetch('https://app.famulor.io/api/v1/whatsapp/embedded-signup', 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://app.famulor.io/api/v1/whatsapp/embedded-signup",
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([
'code' => '<string>',
'waba_id' => '<string>',
'assistant_id' => '3c90c3cc-0d44-4b50-8888-8dd25736052a',
'phone_number_id' => '<string>',
'name' => '<string>',
'display_phone_number' => '<string>',
'phone_number_row_id' => '3c90c3cc-0d44-4b50-8888-8dd25736052a',
'whatsapp_text_enabled' => true,
'whatsapp_voice_enabled' => true,
'whatsapp_outbound_voice_enabled' => true,
'whatsapp_coexistence' => true
]),
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>",
"Content-Type: application/json"
],
]);
$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://app.famulor.io/api/v1/whatsapp/embedded-signup"
payload := strings.NewReader("{\n \"code\": \"<string>\",\n \"waba_id\": \"<string>\",\n \"assistant_id\": \"3c90c3cc-0d44-4b50-8888-8dd25736052a\",\n \"phone_number_id\": \"<string>\",\n \"name\": \"<string>\",\n \"display_phone_number\": \"<string>\",\n \"phone_number_row_id\": \"3c90c3cc-0d44-4b50-8888-8dd25736052a\",\n \"whatsapp_text_enabled\": true,\n \"whatsapp_voice_enabled\": true,\n \"whatsapp_outbound_voice_enabled\": true,\n \"whatsapp_coexistence\": true\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("Authorization", "Bearer <token>")
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://app.famulor.io/api/v1/whatsapp/embedded-signup")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"code\": \"<string>\",\n \"waba_id\": \"<string>\",\n \"assistant_id\": \"3c90c3cc-0d44-4b50-8888-8dd25736052a\",\n \"phone_number_id\": \"<string>\",\n \"name\": \"<string>\",\n \"display_phone_number\": \"<string>\",\n \"phone_number_row_id\": \"3c90c3cc-0d44-4b50-8888-8dd25736052a\",\n \"whatsapp_text_enabled\": true,\n \"whatsapp_voice_enabled\": true,\n \"whatsapp_outbound_voice_enabled\": true,\n \"whatsapp_coexistence\": true\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://app.famulor.io/api/v1/whatsapp/embedded-signup")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"code\": \"<string>\",\n \"waba_id\": \"<string>\",\n \"assistant_id\": \"3c90c3cc-0d44-4b50-8888-8dd25736052a\",\n \"phone_number_id\": \"<string>\",\n \"name\": \"<string>\",\n \"display_phone_number\": \"<string>\",\n \"phone_number_row_id\": \"3c90c3cc-0d44-4b50-8888-8dd25736052a\",\n \"whatsapp_text_enabled\": true,\n \"whatsapp_voice_enabled\": true,\n \"whatsapp_outbound_voice_enabled\": true,\n \"whatsapp_coexistence\": true\n}"
response = http.request(request)
puts response.read_body{
"error": {
"code": "rate_limited",
"message": "Too many requests. Retry after the indicated delay."
}
}{
"error": {
"code": "internal_error",
"message": "Request protection is temporarily unavailable."
}
}Authorizations
API key (fam_..., created under Settings → API Keys) or an OAuth 2.0 access token (fam_at_...). REST operations also require API Access for the credential's workspace. Keys can be restricted to scopes such as assistants:read, calls:write, campaigns:write, automations:read, dashboards:read, dashboards:write, leads:write, segments:write, loop:read, loop:write, phone_numbers:write, sip_trunks:write, knowledge:write, voices:read, billing:read, billing:write, settings:write, platform:read, platform:write; a *:write scope implies the matching *:read. Automation and dashboard endpoints also accept the legacy calls:* scope. Keys without scope restrictions have full access within the workspace's available capabilities.
Body
True to complete Embedded Signup with Coexistence (WhatsApp Business app stays on the number). Skips phone registration and requests contact plus history sync.
Response
Created WhatsApp messaging connector.