curl --request GET \
--url https://app.famulor.io/api/v1/phone-numbers/available \
--header 'Authorization: Bearer <token>'import requests
url = "https://app.famulor.io/api/v1/phone-numbers/available"
headers = {"Authorization": "Bearer <token>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {Authorization: 'Bearer <token>'}};
fetch('https://app.famulor.io/api/v1/phone-numbers/available', 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/phone-numbers/available",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>"
],
]);
$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://app.famulor.io/api/v1/phone-numbers/available"
req, _ := http.NewRequest("GET", url, nil)
req.Header.Add("Authorization", "Bearer <token>")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.get("https://app.famulor.io/api/v1/phone-numbers/available")
.header("Authorization", "Bearer <token>")
.asString();require 'uri'
require 'net/http'
url = URI("https://app.famulor.io/api/v1/phone-numbers/available")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
request["Authorization"] = 'Bearer <token>'
response = http.request(request)
puts response.read_body{
"data": [
{
"number": "+4930123456",
"friendly_name": "+49 30 123456",
"type": "local",
"country": "DE",
"monthly_price_cents": 500,
"setup_fee_cents": 0,
"currency": "EUR",
"display_currency": "USD",
"display_currency_rate": 1.08,
"display_monthly_price_cents": 540,
"display_setup_fee_cents": 0,
"purchase_token": "eyJ2IjoxLCJvZmZlciI6IntcIn...",
"capabilities": {
"voice": true,
"sms": false
}
}
]
}Search purchasable numbers
Searches the marketplace for purchasable numbers, including the workspace’s final customer-facing retail price and a short-lived purchase_token required to buy that exact offer. The country and number type must be enabled by the platform admin; countries with regulatory requirements additionally need an approved regulatory bundle on file. Required scope: phone_numbers:read (keys without scope restrictions have full access).
curl --request GET \
--url https://app.famulor.io/api/v1/phone-numbers/available \
--header 'Authorization: Bearer <token>'import requests
url = "https://app.famulor.io/api/v1/phone-numbers/available"
headers = {"Authorization": "Bearer <token>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {Authorization: 'Bearer <token>'}};
fetch('https://app.famulor.io/api/v1/phone-numbers/available', 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/phone-numbers/available",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>"
],
]);
$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://app.famulor.io/api/v1/phone-numbers/available"
req, _ := http.NewRequest("GET", url, nil)
req.Header.Add("Authorization", "Bearer <token>")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.get("https://app.famulor.io/api/v1/phone-numbers/available")
.header("Authorization", "Bearer <token>")
.asString();require 'uri'
require 'net/http'
url = URI("https://app.famulor.io/api/v1/phone-numbers/available")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
request["Authorization"] = 'Bearer <token>'
response = http.request(request)
puts response.read_body{
"data": [
{
"number": "+4930123456",
"friendly_name": "+49 30 123456",
"type": "local",
"country": "DE",
"monthly_price_cents": 500,
"setup_fee_cents": 0,
"currency": "EUR",
"display_currency": "USD",
"display_currency_rate": 1.08,
"display_monthly_price_cents": 540,
"display_setup_fee_cents": 0,
"purchase_token": "eyJ2IjoxLCJvZmZlciI6IntcIn...",
"capabilities": {
"voice": true,
"sms": false
}
}
]
}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.
Query Parameters
ISO-2 country code, e.g. DE.
Number type to search. Omit it to search every type enabled for the country; each result reports its own type.
local, mobile, national Digit pattern the number must contain, e.g. 030.
Area code filter, e.g. 415.
Response
Purchasable numbers.
Show child attributes
Show child attributes