curl -X POST "https://app.famulor.de/api/user/whatsapp/send-freeform" \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"sender_id": 12,
"recipient_phone": "+1234567890",
"message": "Thank you for your inquiry! Our team will review your request and get back to you within 2 hours."
}'
const response = await fetch(
'https://app.famulor.de/api/user/whatsapp/send-freeform',
{
method: 'POST',
headers: {
'Authorization': 'Bearer YOUR_API_KEY',
'Content-Type': 'application/json'
},
body: JSON.stringify({
sender_id: 12,
recipient_phone: '+1234567890',
message: 'Thank you for your inquiry! Our team will review your request and get back to you within 2 hours.'
})
}
);
const data = await response.json();
console.log(data);
import requests
response = requests.post(
'https://app.famulor.de/api/user/whatsapp/send-freeform',
headers={
'Authorization': 'Bearer YOUR_API_KEY',
'Content-Type': 'application/json'
},
json={
'sender_id': 12,
'recipient_phone': '+1234567890',
'message': 'Thank you for your inquiry! Our team will review your request and get back to you within 2 hours.'
}
)
print(response.json())
{
"success": true,
"conversation_id": 1234,
"message_id": 567,
"whatsapp_message_id": 890,
"message_sid": "SMxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx",
"session_status": {
"is_open": true,
"can_send_freeform": true,
"requires_template": false,
"message": "Session open (23 hr 45 min remaining). Unlimited free-form messages allowed.",
"minutes_remaining": 1425,
"expires_at": "2026-02-25T10:30:00+00:00"
}
}
{
"success": false,
"error": "Insufficient balance. Please top up your account.",
"error_code": "INSUFFICIENT_BALANCE"
}
{
"success": false,
"error": "The 24-hour messaging window is closed. Customer must reply first, or use a template message.",
"error_code": "SESSION_EXPIRED",
"session_status": {
"is_open": false,
"can_send_freeform": false,
"requires_template": true,
"message": "Session expired. Send a template or wait for customer to reply.",
"expired_at": "2026-02-23T10:30:00+00:00"
}
}
{
"success": false,
"error": "Sender not found or does not belong to you",
"error_code": "SENDER_NOT_FOUND"
}
{
"success": false,
"error": "Invalid phone number format. Use E.164 format (e.g., +14155551234).",
"error_code": "INVALID_PHONE"
}
{
"success": false,
"error": "Sender is not online. Current status: Offline",
"error_code": "SENDER_OFFLINE"
}
Freiform-WhatsApp-Nachricht senden
Freitext-WhatsApp-Nachrichten innerhalb eines aktiven 24-Stunden-Fensters über Famulor senden
POST
/
api
/
user
/
whatsapp
/
send-freeform
curl -X POST "https://app.famulor.de/api/user/whatsapp/send-freeform" \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"sender_id": 12,
"recipient_phone": "+1234567890",
"message": "Thank you for your inquiry! Our team will review your request and get back to you within 2 hours."
}'
const response = await fetch(
'https://app.famulor.de/api/user/whatsapp/send-freeform',
{
method: 'POST',
headers: {
'Authorization': 'Bearer YOUR_API_KEY',
'Content-Type': 'application/json'
},
body: JSON.stringify({
sender_id: 12,
recipient_phone: '+1234567890',
message: 'Thank you for your inquiry! Our team will review your request and get back to you within 2 hours.'
})
}
);
const data = await response.json();
console.log(data);
import requests
response = requests.post(
'https://app.famulor.de/api/user/whatsapp/send-freeform',
headers={
'Authorization': 'Bearer YOUR_API_KEY',
'Content-Type': 'application/json'
},
json={
'sender_id': 12,
'recipient_phone': '+1234567890',
'message': 'Thank you for your inquiry! Our team will review your request and get back to you within 2 hours.'
}
)
print(response.json())
{
"success": true,
"conversation_id": 1234,
"message_id": 567,
"whatsapp_message_id": 890,
"message_sid": "SMxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx",
"session_status": {
"is_open": true,
"can_send_freeform": true,
"requires_template": false,
"message": "Session open (23 hr 45 min remaining). Unlimited free-form messages allowed.",
"minutes_remaining": 1425,
"expires_at": "2026-02-25T10:30:00+00:00"
}
}
{
"success": false,
"error": "Insufficient balance. Please top up your account.",
"error_code": "INSUFFICIENT_BALANCE"
}
{
"success": false,
"error": "The 24-hour messaging window is closed. Customer must reply first, or use a template message.",
"error_code": "SESSION_EXPIRED",
"session_status": {
"is_open": false,
"can_send_freeform": false,
"requires_template": true,
"message": "Session expired. Send a template or wait for customer to reply.",
"expired_at": "2026-02-23T10:30:00+00:00"
}
}
{
"success": false,
"error": "Sender not found or does not belong to you",
"error_code": "SENDER_NOT_FOUND"
}
{
"success": false,
"error": "Invalid phone number format. Use E.164 format (e.g., +14155551234).",
"error_code": "INVALID_PHONE"
}
{
"success": false,
"error": "Sender is not online. Current status: Offline",
"error_code": "SENDER_OFFLINE"
}
Freiform-WhatsApp-Nachricht senden
Eine Freitext-WhatsApp-Nachricht innerhalb eines aktiven 24-Stunden-Fensters sendenDieser Endpunkt sendet eine Freiform- (Freitext-) WhatsApp-Nachricht an einen Empfänger. Im Gegensatz zu Template-Nachrichten kann der Inhalt beliebigen Text enthalten, er erfordert jedoch ein aktives 24-Stunden-Messaging-Fenster – der Empfänger muss innerhalb der letzten 24 Stunden eine Nachricht an deinen WhatsApp-Sender geschickt haben.
Freiform-Nachrichten können nur während eines aktiven 24-Stunden-Fensters gesendet werden. Wenn die Session abgelaufen ist, musst du zunächst eine Template-Nachricht senden, um die Konversation wieder zu starten. Verwende den Endpunkt Session-Status, um zu prüfen, ob eine Session aktiv ist.
Dieser Endpunkt ist auf 5 Requests pro Sekunde pro Benutzer rate-limitiert.
Anfrage-Body
integer
erforderlich
Die ID des WhatsApp-Senders, von dem gesendet werden soll (erhalten über WhatsApp-Sender abrufen)
string
erforderlich
Die Telefonnummer des Empfängers im internationalen Format (z.B.
+1234567890)string
erforderlich
Der zu sendende Nachrichteninhalt (max. 4096 Zeichen)
Antwort-Felder
boolean
Ob die Nachricht erfolgreich gesendet wurde
integer
Die ID der mit dieser Nachricht verknüpften Konversation
integer
Die ID des Konversations-Nachrichteneintrags
integer
Die ID des WhatsApp-Nachrichteneintrags
string
Die Twilio Message SID zur Sendungsverfolgung
object
Aktualisierter Session-Status nach dem Versand der Nachricht
Anzeigen Session-Status Eigenschaften
Anzeigen Session-Status Eigenschaften
boolean
Ob das 24-Stunden-Fenster aktuell geöffnet ist
boolean
Ob aktuell Freiform-Nachrichten gesendet werden können
boolean
Ob eine Template-Nachricht erforderlich ist
string
Menschlich lesbare Beschreibung des Session-Zustands
integer
Verbleibende Minuten im 24-Stunden-Fenster
string
ISO-8601-Timestamp, wann die Session abläuft
Error Responses
curl -X POST "https://app.famulor.de/api/user/whatsapp/send-freeform" \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"sender_id": 12,
"recipient_phone": "+1234567890",
"message": "Thank you for your inquiry! Our team will review your request and get back to you within 2 hours."
}'
const response = await fetch(
'https://app.famulor.de/api/user/whatsapp/send-freeform',
{
method: 'POST',
headers: {
'Authorization': 'Bearer YOUR_API_KEY',
'Content-Type': 'application/json'
},
body: JSON.stringify({
sender_id: 12,
recipient_phone: '+1234567890',
message: 'Thank you for your inquiry! Our team will review your request and get back to you within 2 hours.'
})
}
);
const data = await response.json();
console.log(data);
import requests
response = requests.post(
'https://app.famulor.de/api/user/whatsapp/send-freeform',
headers={
'Authorization': 'Bearer YOUR_API_KEY',
'Content-Type': 'application/json'
},
json={
'sender_id': 12,
'recipient_phone': '+1234567890',
'message': 'Thank you for your inquiry! Our team will review your request and get back to you within 2 hours.'
}
)
print(response.json())
{
"success": true,
"conversation_id": 1234,
"message_id": 567,
"whatsapp_message_id": 890,
"message_sid": "SMxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx",
"session_status": {
"is_open": true,
"can_send_freeform": true,
"requires_template": false,
"message": "Session open (23 hr 45 min remaining). Unlimited free-form messages allowed.",
"minutes_remaining": 1425,
"expires_at": "2026-02-25T10:30:00+00:00"
}
}
{
"success": false,
"error": "Insufficient balance. Please top up your account.",
"error_code": "INSUFFICIENT_BALANCE"
}
{
"success": false,
"error": "The 24-hour messaging window is closed. Customer must reply first, or use a template message.",
"error_code": "SESSION_EXPIRED",
"session_status": {
"is_open": false,
"can_send_freeform": false,
"requires_template": true,
"message": "Session expired. Send a template or wait for customer to reply.",
"expired_at": "2026-02-23T10:30:00+00:00"
}
}
{
"success": false,
"error": "Sender not found or does not belong to you",
"error_code": "SENDER_NOT_FOUND"
}
{
"success": false,
"error": "Invalid phone number format. Use E.164 format (e.g., +14155551234).",
"error_code": "INVALID_PHONE"
}
{
"success": false,
"error": "Sender is not online. Current status: Offline",
"error_code": "SENDER_OFFLINE"
}
24-Hour Messaging Window
WhatsApp enforces a 24-hour messaging window policy:- When a customer sends a message to your WhatsApp Business number, a 24-hour window opens.
- During this window, you can send freeform messages without restrictions.
- After the window expires, you must use a template message to re-initiate the conversation.
- Each new customer message resets the 24-hour timer.
Notes
- Maximum message length is 4,096 characters (WhatsApp limit).
- The sender must be
online. Offline senders return a503error. - Message costs are automatically deducted from your account balance.
- Rate limit: 5 requests per second per user.
⌘I