Create campaign
curl --request POST \
--url https://app.famulor.de/api/user/campaign \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"name": "<string>"
}
'const options = {
method: 'POST',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({name: '<string>'})
};
fetch('https://app.famulor.de/api/user/campaign', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));import requests
url = "https://app.famulor.de/api/user/campaign"
payload = { "name": "<string>" }
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://app.famulor.de/api/user/campaign",
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([
'name' => '<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.de/api/user/campaign"
payload := strings.NewReader("{\n \"name\": \"<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))
}{
"message": "Campaign created successfully",
"data": {
"id": 1,
"name": "Product Demo Campaign",
"channel": "call",
"status": "draft",
"assistant_id": 42,
"timezone": "Europe/Berlin",
"max_calls_in_parallel": 3,
"messages_per_minute": null,
"schedule_windows": [
{ "start": "09:00", "end": "17:00" }
],
"scheduled_start_at": null,
"allowed_hours_start_time": "09:00",
"allowed_hours_end_time": "17:00",
"allowed_days": [
"monday",
"tuesday",
"wednesday",
"thursday",
"friday"
],
"max_retries": 3,
"retry_interval": 60,
"retry_on_voicemail": false,
"retry_on_goal_incomplete": false,
"goal_completion_variable": null,
"mark_complete_when_no_leads": true,
"phone_number_ids": [101],
"whatsapp_sender_id": null,
"whatsapp_template_id": null,
"sms_from_phone_number_id": null,
"sms_body": null,
"text_variable_mapping": null,
"fallback_channel": null,
"fallback_whatsapp_sender_id": null,
"fallback_whatsapp_template_id": null,
"fallback_sms_from_phone_number_id": null,
"fallback_sms_body": null,
"fallback_variable_mapping": null,
"created_at": "2026-02-23T10:00:00.000000Z",
"updated_at": "2026-02-23T10:00:00.000000Z"
}
}
{
"message": "The given data was invalid.",
"errors": {
"name": [
"The name field is required."
],
"assistant_id": [
"The assistant id field is required."
]
}
}
Create campaign
Create a draft call, WhatsApp, or SMS campaign in Famulor via API. Add leads, then start with Update campaign status.
POST
/
api
/
user
/
campaign
Create campaign
curl --request POST \
--url https://app.famulor.de/api/user/campaign \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"name": "<string>"
}
'const options = {
method: 'POST',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({name: '<string>'})
};
fetch('https://app.famulor.de/api/user/campaign', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));import requests
url = "https://app.famulor.de/api/user/campaign"
payload = { "name": "<string>" }
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://app.famulor.de/api/user/campaign",
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([
'name' => '<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.de/api/user/campaign"
payload := strings.NewReader("{\n \"name\": \"<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))
}{
"message": "Campaign created successfully",
"data": {
"id": 1,
"name": "Product Demo Campaign",
"channel": "call",
"status": "draft",
"assistant_id": 42,
"timezone": "Europe/Berlin",
"max_calls_in_parallel": 3,
"messages_per_minute": null,
"schedule_windows": [
{ "start": "09:00", "end": "17:00" }
],
"scheduled_start_at": null,
"allowed_hours_start_time": "09:00",
"allowed_hours_end_time": "17:00",
"allowed_days": [
"monday",
"tuesday",
"wednesday",
"thursday",
"friday"
],
"max_retries": 3,
"retry_interval": 60,
"retry_on_voicemail": false,
"retry_on_goal_incomplete": false,
"goal_completion_variable": null,
"mark_complete_when_no_leads": true,
"phone_number_ids": [101],
"whatsapp_sender_id": null,
"whatsapp_template_id": null,
"sms_from_phone_number_id": null,
"sms_body": null,
"text_variable_mapping": null,
"fallback_channel": null,
"fallback_whatsapp_sender_id": null,
"fallback_whatsapp_template_id": null,
"fallback_sms_from_phone_number_id": null,
"fallback_sms_body": null,
"fallback_variable_mapping": null,
"created_at": "2026-02-23T10:00:00.000000Z",
"updated_at": "2026-02-23T10:00:00.000000Z"
}
}
{
"message": "The given data was invalid.",
"errors": {
"name": [
"The name field is required."
],
"assistant_id": [
"The assistant id field is required."
]
}
}
Create a new campaign. Campaigns start in
draft — add leads, then start with Update campaign status.
Supported channels:
call(default) — outbound voice with an OUTBOUND assistantwhatsapp— approved WhatsApp template via one of your senderssms— SMS body from an SMS-capable number (may be temporarily unavailable on the platform)
Request body
Shared
string
required
Campaign name. Maximum 255 characters.
string
default:"call"
call, whatsapp, or sms.string
IANA timezone for the send/call window (e.g.
America/New_York). Defaults to the assistant timezone for call campaigns, otherwise your account timezone.array
Preferred schedule: one or more daily windows as objects with
start and end in HH:MM. Overnight windows are supported when end is earlier than start (e.g. 16:00 → 02:00).string
default:"00:00"
Legacy single-window start (
HH:MM). Used if schedule_windows is omitted.string
default:"23:59"
Legacy single-window end (
HH:MM). Overnight when end < start.string
Optional ISO datetime. When set, the campaign can be scheduled to auto-start at that time.
array
default:"all 7 days"
Weekdays:
monday … sunday.integer
default:"3"
Max retry attempts per lead. Range: 1–5.
integer
default:"60"
Minutes between retries. Range: 10–4320.
boolean
default:"true"
Automatically mark the campaign complete when no remaining work is left.
Call campaigns
integer
Required for
channel=call. Must be an OUTBOUND assistant you own.integer
default:"3"
Concurrent calls (plan-bounded, max 10).
array
Outbound from-number IDs available to your account.
boolean
Retry when a call hits voicemail.
boolean
Keep retrying until a boolean post-call goal variable is true.
string
Boolean post-call schema variable name used with
retry_on_goal_incomplete.string
Optional call→text follow-up after max call retries:
whatsapp or sms.integer
Required when
fallback_channel=whatsapp.integer
Required when
fallback_channel=whatsapp. Must be an approved template on that sender.integer
Required when
fallback_channel=sms.string
Required when
fallback_channel=sms. Supports {{variable}} placeholders.object
Maps WhatsApp template placeholders (e.g.
"1") to lead variable keys for the fallback send.WhatsApp campaigns
integer
Required for
channel=whatsapp. Sender you own.integer
Required for
channel=whatsapp. Approved template on that sender.object
Maps template placeholders (e.g.
"1") to lead variable keys.integer
Per-campaign send rate (1–10). WhatsApp campaigns also share a user-wide pool of 10 in-flight sends across all your active WhatsApp campaigns.
SMS campaigns
integer
Required for
channel=sms. Must be SMS-capable and available to you.string
Required for
channel=sms. Max 1600 characters. Supports {{variable}} placeholders.Response
string
Success message
object
Created campaign (same shape as Get campaign), including channel, schedule, text config, and fallback fields.
Error responses
Plan limit, invalid assistant/sender/template, disabled channel, or validation errors.
{
"message": "Campaign created successfully",
"data": {
"id": 1,
"name": "Product Demo Campaign",
"channel": "call",
"status": "draft",
"assistant_id": 42,
"timezone": "Europe/Berlin",
"max_calls_in_parallel": 3,
"messages_per_minute": null,
"schedule_windows": [
{ "start": "09:00", "end": "17:00" }
],
"scheduled_start_at": null,
"allowed_hours_start_time": "09:00",
"allowed_hours_end_time": "17:00",
"allowed_days": [
"monday",
"tuesday",
"wednesday",
"thursday",
"friday"
],
"max_retries": 3,
"retry_interval": 60,
"retry_on_voicemail": false,
"retry_on_goal_incomplete": false,
"goal_completion_variable": null,
"mark_complete_when_no_leads": true,
"phone_number_ids": [101],
"whatsapp_sender_id": null,
"whatsapp_template_id": null,
"sms_from_phone_number_id": null,
"sms_body": null,
"text_variable_mapping": null,
"fallback_channel": null,
"fallback_whatsapp_sender_id": null,
"fallback_whatsapp_template_id": null,
"fallback_sms_from_phone_number_id": null,
"fallback_sms_body": null,
"fallback_variable_mapping": null,
"created_at": "2026-02-23T10:00:00.000000Z",
"updated_at": "2026-02-23T10:00:00.000000Z"
}
}
{
"message": "The given data was invalid.",
"errors": {
"name": [
"The name field is required."
],
"assistant_id": [
"The assistant id field is required."
]
}
}
Related pages: Introduction and Authentication Guide, and API Integration Examples.
⌘I