curl --request POST \
--url https://app.famulor.io/api/v1/bookings \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"event_type_id": "5c9f6e2a-4b1d-4b7a-9c1e-8f2a1b3c4d5e",
"start": "2026-08-14T09:00:00Z",
"name": "Anna Schmidt",
"email": "anna@example.com"
}
'import requests
url = "https://app.famulor.io/api/v1/bookings"
payload = {
"event_type_id": "5c9f6e2a-4b1d-4b7a-9c1e-8f2a1b3c4d5e",
"start": "2026-08-14T09:00:00Z",
"name": "Anna Schmidt",
"email": "anna@example.com"
}
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({
event_type_id: '5c9f6e2a-4b1d-4b7a-9c1e-8f2a1b3c4d5e',
start: '2026-08-14T09:00:00Z',
name: 'Anna Schmidt',
email: 'anna@example.com'
})
};
fetch('https://app.famulor.io/api/v1/bookings', 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/bookings",
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([
'event_type_id' => '5c9f6e2a-4b1d-4b7a-9c1e-8f2a1b3c4d5e',
'start' => '2026-08-14T09:00:00Z',
'name' => 'Anna Schmidt',
'email' => 'anna@example.com'
]),
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/bookings"
payload := strings.NewReader("{\n \"event_type_id\": \"5c9f6e2a-4b1d-4b7a-9c1e-8f2a1b3c4d5e\",\n \"start\": \"2026-08-14T09:00:00Z\",\n \"name\": \"Anna Schmidt\",\n \"email\": \"anna@example.com\"\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/bookings")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"event_type_id\": \"5c9f6e2a-4b1d-4b7a-9c1e-8f2a1b3c4d5e\",\n \"start\": \"2026-08-14T09:00:00Z\",\n \"name\": \"Anna Schmidt\",\n \"email\": \"anna@example.com\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://app.famulor.io/api/v1/bookings")
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 \"event_type_id\": \"5c9f6e2a-4b1d-4b7a-9c1e-8f2a1b3c4d5e\",\n \"start\": \"2026-08-14T09:00:00Z\",\n \"name\": \"Anna Schmidt\",\n \"email\": \"anna@example.com\"\n}"
response = http.request(request)
puts response.read_body{
"data": {
"id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"event_type_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"event_type_name": "<string>",
"event_type_slug": "<string>",
"invitee_name": "<string>",
"invitee_email": "<string>",
"invitee_phone": "<string>",
"invitee_timezone": "<string>",
"start_at": "2023-11-07T05:31:56Z",
"end_at": "2023-11-07T05:31:56Z",
"status": "confirmed",
"source": "web",
"call_id": "<string>",
"notes": "<string>",
"answers": {},
"created_at": "2023-11-07T05:31:56Z",
"email_scheduled": true,
"meeting_url": "<string>"
}
}Create a booking
Book a free start time of an event type for an invitee. start must come from List free slots, unless allow_outside_availability is true (staff override: any future time within 2 years that does not overlap a confirmed booking of the same event type); otherwise a slot that is no longer free returns 409. The invitee receives the confirmation email with a calendar invitation (when an email address is given), and the event type’s webhook and automations fire. Stored source is api.
There is no idempotency key: retrying the same request for the same slot returns 409 via the database’s overlap constraint.
A 503 here can mean either request protection is temporarily unavailable (internal_error) or the availability engine itself failed to load (service_unavailable, message “Could not load availability”) — see AvailabilityOrProtectionUnavailable.
Required scope: bookings:write (keys without scope restrictions have full access).
curl --request POST \
--url https://app.famulor.io/api/v1/bookings \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"event_type_id": "5c9f6e2a-4b1d-4b7a-9c1e-8f2a1b3c4d5e",
"start": "2026-08-14T09:00:00Z",
"name": "Anna Schmidt",
"email": "anna@example.com"
}
'import requests
url = "https://app.famulor.io/api/v1/bookings"
payload = {
"event_type_id": "5c9f6e2a-4b1d-4b7a-9c1e-8f2a1b3c4d5e",
"start": "2026-08-14T09:00:00Z",
"name": "Anna Schmidt",
"email": "anna@example.com"
}
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({
event_type_id: '5c9f6e2a-4b1d-4b7a-9c1e-8f2a1b3c4d5e',
start: '2026-08-14T09:00:00Z',
name: 'Anna Schmidt',
email: 'anna@example.com'
})
};
fetch('https://app.famulor.io/api/v1/bookings', 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/bookings",
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([
'event_type_id' => '5c9f6e2a-4b1d-4b7a-9c1e-8f2a1b3c4d5e',
'start' => '2026-08-14T09:00:00Z',
'name' => 'Anna Schmidt',
'email' => 'anna@example.com'
]),
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/bookings"
payload := strings.NewReader("{\n \"event_type_id\": \"5c9f6e2a-4b1d-4b7a-9c1e-8f2a1b3c4d5e\",\n \"start\": \"2026-08-14T09:00:00Z\",\n \"name\": \"Anna Schmidt\",\n \"email\": \"anna@example.com\"\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/bookings")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"event_type_id\": \"5c9f6e2a-4b1d-4b7a-9c1e-8f2a1b3c4d5e\",\n \"start\": \"2026-08-14T09:00:00Z\",\n \"name\": \"Anna Schmidt\",\n \"email\": \"anna@example.com\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://app.famulor.io/api/v1/bookings")
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 \"event_type_id\": \"5c9f6e2a-4b1d-4b7a-9c1e-8f2a1b3c4d5e\",\n \"start\": \"2026-08-14T09:00:00Z\",\n \"name\": \"Anna Schmidt\",\n \"email\": \"anna@example.com\"\n}"
response = http.request(request)
puts response.read_body{
"data": {
"id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"event_type_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"event_type_name": "<string>",
"event_type_slug": "<string>",
"invitee_name": "<string>",
"invitee_email": "<string>",
"invitee_phone": "<string>",
"invitee_timezone": "<string>",
"start_at": "2023-11-07T05:31:56Z",
"end_at": "2023-11-07T05:31:56Z",
"status": "confirmed",
"source": "web",
"call_id": "<string>",
"notes": "<string>",
"answers": {},
"created_at": "2023-11-07T05:31:56Z",
"email_scheduled": true,
"meeting_url": "<string>"
}
}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
Event type ID.
Start time in ISO 8601 UTC — must be a value returned by List free slots, unless allow_outside_availability is set.
Invitee name.
1 - 128Invitee email — required when the event type requires it (e.g. a Google Meet/Teams location).
International format, e.g. +4915123456789. Required when the event type requires it.
Notes attached to the booking.
2000Answers to the event type's custom booking questions, keyed by BookingField.id.
IANA time zone used for the invitee's confirmation email and calendar invite; does not affect how start is parsed. Default the workspace time zone.
Time format used in the invitee's confirmation email; default 24h.
12h, 24h Set true to book outside the event type's open times (staff override). Any future time within the next 2 years is accepted; the time must not overlap another confirmed booking of the same event type. Guests on the public booking page only ever see open times.
Response
The created booking.
Show child attributes
Show child attributes