curl --request POST \
--url https://app.famulor.io/api/v1/sms/send \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"from_number_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"to": "+14155550100",
"body": "<string>"
}
'import requests
url = "https://app.famulor.io/api/v1/sms/send"
payload = {
"from_number_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"to": "+14155550100",
"body": "<string>"
}
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({
from_number_id: '3c90c3cc-0d44-4b50-8888-8dd25736052a',
to: '+14155550100',
body: JSON.stringify('<string>')
})
};
fetch('https://app.famulor.io/api/v1/sms/send', 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/sms/send",
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([
'from_number_id' => '3c90c3cc-0d44-4b50-8888-8dd25736052a',
'to' => '+14155550100',
'body' => '<string>'
]),
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/sms/send"
payload := strings.NewReader("{\n \"from_number_id\": \"3c90c3cc-0d44-4b50-8888-8dd25736052a\",\n \"to\": \"+14155550100\",\n \"body\": \"<string>\"\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/sms/send")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"from_number_id\": \"3c90c3cc-0d44-4b50-8888-8dd25736052a\",\n \"to\": \"+14155550100\",\n \"body\": \"<string>\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://app.famulor.io/api/v1/sms/send")
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 \"from_number_id\": \"3c90c3cc-0d44-4b50-8888-8dd25736052a\",\n \"to\": \"+14155550100\",\n \"body\": \"<string>\"\n}"
response = http.request(request)
puts response.read_body{
"data": {
"message_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"status": "<string>",
"credits": 123
}
}Send an SMS
Send an outbound SMS from a workspace phone number that has outbound SMS enabled (platform marketplace or Twilio BYOC). US 10DLC senders must be registered with an approved A2P campaign in Twilio. Platform numbers charge SMS credits including carrier pass-through; BYOC charges only the platform SMS fee (customer pays Twilio carrier cost). Required scope: phone_numbers:write.
curl --request POST \
--url https://app.famulor.io/api/v1/sms/send \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"from_number_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"to": "+14155550100",
"body": "<string>"
}
'import requests
url = "https://app.famulor.io/api/v1/sms/send"
payload = {
"from_number_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"to": "+14155550100",
"body": "<string>"
}
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({
from_number_id: '3c90c3cc-0d44-4b50-8888-8dd25736052a',
to: '+14155550100',
body: JSON.stringify('<string>')
})
};
fetch('https://app.famulor.io/api/v1/sms/send', 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/sms/send",
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([
'from_number_id' => '3c90c3cc-0d44-4b50-8888-8dd25736052a',
'to' => '+14155550100',
'body' => '<string>'
]),
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/sms/send"
payload := strings.NewReader("{\n \"from_number_id\": \"3c90c3cc-0d44-4b50-8888-8dd25736052a\",\n \"to\": \"+14155550100\",\n \"body\": \"<string>\"\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/sms/send")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"from_number_id\": \"3c90c3cc-0d44-4b50-8888-8dd25736052a\",\n \"to\": \"+14155550100\",\n \"body\": \"<string>\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://app.famulor.io/api/v1/sms/send")
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 \"from_number_id\": \"3c90c3cc-0d44-4b50-8888-8dd25736052a\",\n \"to\": \"+14155550100\",\n \"body\": \"<string>\"\n}"
response = http.request(request)
puts response.read_body{
"data": {
"message_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"status": "<string>",
"credits": 123
}
}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
Response
SMS accepted.
Show child attributes
Show child attributes