curl --request POST \
--url https://api.signupbreeze.com/v1/events \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"title": "Fall Festival",
"start_date": "2026-09-12",
"timezone": "America/Los_Angeles",
"description": "Our annual fundraiser.",
"location": "12 Main St",
"is_virtual": true,
"location_lat": -89,
"location_lng": -179,
"location_data": null,
"end_date": "2026-09-13",
"is_published": true,
"theme": "forest-green",
"badge_label": "g",
"shifts": [
[]
]
}
'import requests
url = "https://api.signupbreeze.com/v1/events"
payload = {
"title": "Fall Festival",
"start_date": "2026-09-12",
"timezone": "America/Los_Angeles",
"description": "Our annual fundraiser.",
"location": "12 Main St",
"is_virtual": True,
"location_lat": -89,
"location_lng": -179,
"location_data": None,
"end_date": "2026-09-13",
"is_published": True,
"theme": "forest-green",
"badge_label": "g",
"shifts": [[]]
}
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({
title: 'Fall Festival',
start_date: '2026-09-12',
timezone: 'America/Los_Angeles',
description: 'Our annual fundraiser.',
location: '12 Main St',
is_virtual: true,
location_lat: -89,
location_lng: -179,
location_data: null,
end_date: '2026-09-13',
is_published: true,
theme: 'forest-green',
badge_label: 'g',
shifts: [[]]
})
};
fetch('https://api.signupbreeze.com/v1/events', 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://api.signupbreeze.com/v1/events",
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([
'title' => 'Fall Festival',
'start_date' => '2026-09-12',
'timezone' => 'America/Los_Angeles',
'description' => 'Our annual fundraiser.',
'location' => '12 Main St',
'is_virtual' => true,
'location_lat' => -89,
'location_lng' => -179,
'location_data' => null,
'end_date' => '2026-09-13',
'is_published' => true,
'theme' => 'forest-green',
'badge_label' => 'g',
'shifts' => [
[
]
]
]),
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://api.signupbreeze.com/v1/events"
payload := strings.NewReader("{\n \"title\": \"Fall Festival\",\n \"start_date\": \"2026-09-12\",\n \"timezone\": \"America/Los_Angeles\",\n \"description\": \"Our annual fundraiser.\",\n \"location\": \"12 Main St\",\n \"is_virtual\": true,\n \"location_lat\": -89,\n \"location_lng\": -179,\n \"location_data\": null,\n \"end_date\": \"2026-09-13\",\n \"is_published\": true,\n \"theme\": \"forest-green\",\n \"badge_label\": \"g\",\n \"shifts\": [\n []\n ]\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://api.signupbreeze.com/v1/events")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"title\": \"Fall Festival\",\n \"start_date\": \"2026-09-12\",\n \"timezone\": \"America/Los_Angeles\",\n \"description\": \"Our annual fundraiser.\",\n \"location\": \"12 Main St\",\n \"is_virtual\": true,\n \"location_lat\": -89,\n \"location_lng\": -179,\n \"location_data\": null,\n \"end_date\": \"2026-09-13\",\n \"is_published\": true,\n \"theme\": \"forest-green\",\n \"badge_label\": \"g\",\n \"shifts\": [\n []\n ]\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.signupbreeze.com/v1/events")
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 \"title\": \"Fall Festival\",\n \"start_date\": \"2026-09-12\",\n \"timezone\": \"America/Los_Angeles\",\n \"description\": \"Our annual fundraiser.\",\n \"location\": \"12 Main St\",\n \"is_virtual\": true,\n \"location_lat\": -89,\n \"location_lng\": -179,\n \"location_data\": null,\n \"end_date\": \"2026-09-13\",\n \"is_published\": true,\n \"theme\": \"forest-green\",\n \"badge_label\": \"g\",\n \"shifts\": [\n []\n ]\n}"
response = http.request(request)
puts response.read_body{
"data": {
"id": "019ff256-eccd-70b9-8fb9-f8a45ef4a38e",
"title": "Eius et animi.",
"description": "Fugiat sunt nihil accusantium harum mollitia. Deserunt aut ab provident perspiciatis quo omnis nostrum. Adipisci quidem nostrum qui commodi incidunt iure.\n\nEt modi ipsum nostrum omnis autem et consequatur. Dolores enim non facere tempora. Voluptatem laboriosam praesentium quis adipisci.",
"slug": "eius-et-animi-372",
"location": "981 Nitzsche Route Apt. 203\nMadisenborough, MT 77824",
"is_virtual": false,
"start_date": "2026-11-11T09:07:51+00:00",
"end_date": "2026-11-11T10:11:09+00:00",
"timezone": "UTC",
"is_published": false,
"public_url": "http://localhost/e/eius-et-animi-372",
"slots": [
{
"id": "019ff256-ecce-71f3-b7d6-5a60e0d781c3",
"event_id": "019ff256-eccd-70b9-8fb9-f8a45ef4a38e",
"title": "Clean-up Crew",
"location": null,
"is_virtual": false,
"start_time": "2026-11-02T05:34:27+00:00",
"end_time": "2026-11-02T07:34:27+00:00",
"capacity": 8,
"filled": 0,
"remaining": 8,
"created_at": "2026-08-11T19:40:10+00:00",
"updated_at": "2026-08-11T19:40:10+00:00"
}
],
"created_at": "2026-08-11T19:40:10+00:00",
"updated_at": "2026-08-11T19:40:10+00:00"
}
}{
"message": "The title field is required.",
"errors": {
"title": [
"The title field is required."
]
}
}Create an event
Creates an event and, optionally, all of its shifts in the same call — which is usually what you want, since an event with no shifts has nothing to sign up for.
Send an Idempotency-Key header. Repeating a create with the same key replays the
original response instead of creating a second event.
Requires the events:write scope.
curl --request POST \
--url https://api.signupbreeze.com/v1/events \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"title": "Fall Festival",
"start_date": "2026-09-12",
"timezone": "America/Los_Angeles",
"description": "Our annual fundraiser.",
"location": "12 Main St",
"is_virtual": true,
"location_lat": -89,
"location_lng": -179,
"location_data": null,
"end_date": "2026-09-13",
"is_published": true,
"theme": "forest-green",
"badge_label": "g",
"shifts": [
[]
]
}
'import requests
url = "https://api.signupbreeze.com/v1/events"
payload = {
"title": "Fall Festival",
"start_date": "2026-09-12",
"timezone": "America/Los_Angeles",
"description": "Our annual fundraiser.",
"location": "12 Main St",
"is_virtual": True,
"location_lat": -89,
"location_lng": -179,
"location_data": None,
"end_date": "2026-09-13",
"is_published": True,
"theme": "forest-green",
"badge_label": "g",
"shifts": [[]]
}
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({
title: 'Fall Festival',
start_date: '2026-09-12',
timezone: 'America/Los_Angeles',
description: 'Our annual fundraiser.',
location: '12 Main St',
is_virtual: true,
location_lat: -89,
location_lng: -179,
location_data: null,
end_date: '2026-09-13',
is_published: true,
theme: 'forest-green',
badge_label: 'g',
shifts: [[]]
})
};
fetch('https://api.signupbreeze.com/v1/events', 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://api.signupbreeze.com/v1/events",
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([
'title' => 'Fall Festival',
'start_date' => '2026-09-12',
'timezone' => 'America/Los_Angeles',
'description' => 'Our annual fundraiser.',
'location' => '12 Main St',
'is_virtual' => true,
'location_lat' => -89,
'location_lng' => -179,
'location_data' => null,
'end_date' => '2026-09-13',
'is_published' => true,
'theme' => 'forest-green',
'badge_label' => 'g',
'shifts' => [
[
]
]
]),
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://api.signupbreeze.com/v1/events"
payload := strings.NewReader("{\n \"title\": \"Fall Festival\",\n \"start_date\": \"2026-09-12\",\n \"timezone\": \"America/Los_Angeles\",\n \"description\": \"Our annual fundraiser.\",\n \"location\": \"12 Main St\",\n \"is_virtual\": true,\n \"location_lat\": -89,\n \"location_lng\": -179,\n \"location_data\": null,\n \"end_date\": \"2026-09-13\",\n \"is_published\": true,\n \"theme\": \"forest-green\",\n \"badge_label\": \"g\",\n \"shifts\": [\n []\n ]\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://api.signupbreeze.com/v1/events")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"title\": \"Fall Festival\",\n \"start_date\": \"2026-09-12\",\n \"timezone\": \"America/Los_Angeles\",\n \"description\": \"Our annual fundraiser.\",\n \"location\": \"12 Main St\",\n \"is_virtual\": true,\n \"location_lat\": -89,\n \"location_lng\": -179,\n \"location_data\": null,\n \"end_date\": \"2026-09-13\",\n \"is_published\": true,\n \"theme\": \"forest-green\",\n \"badge_label\": \"g\",\n \"shifts\": [\n []\n ]\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.signupbreeze.com/v1/events")
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 \"title\": \"Fall Festival\",\n \"start_date\": \"2026-09-12\",\n \"timezone\": \"America/Los_Angeles\",\n \"description\": \"Our annual fundraiser.\",\n \"location\": \"12 Main St\",\n \"is_virtual\": true,\n \"location_lat\": -89,\n \"location_lng\": -179,\n \"location_data\": null,\n \"end_date\": \"2026-09-13\",\n \"is_published\": true,\n \"theme\": \"forest-green\",\n \"badge_label\": \"g\",\n \"shifts\": [\n []\n ]\n}"
response = http.request(request)
puts response.read_body{
"data": {
"id": "019ff256-eccd-70b9-8fb9-f8a45ef4a38e",
"title": "Eius et animi.",
"description": "Fugiat sunt nihil accusantium harum mollitia. Deserunt aut ab provident perspiciatis quo omnis nostrum. Adipisci quidem nostrum qui commodi incidunt iure.\n\nEt modi ipsum nostrum omnis autem et consequatur. Dolores enim non facere tempora. Voluptatem laboriosam praesentium quis adipisci.",
"slug": "eius-et-animi-372",
"location": "981 Nitzsche Route Apt. 203\nMadisenborough, MT 77824",
"is_virtual": false,
"start_date": "2026-11-11T09:07:51+00:00",
"end_date": "2026-11-11T10:11:09+00:00",
"timezone": "UTC",
"is_published": false,
"public_url": "http://localhost/e/eius-et-animi-372",
"slots": [
{
"id": "019ff256-ecce-71f3-b7d6-5a60e0d781c3",
"event_id": "019ff256-eccd-70b9-8fb9-f8a45ef4a38e",
"title": "Clean-up Crew",
"location": null,
"is_virtual": false,
"start_time": "2026-11-02T05:34:27+00:00",
"end_time": "2026-11-02T07:34:27+00:00",
"capacity": 8,
"filled": 0,
"remaining": 8,
"created_at": "2026-08-11T19:40:10+00:00",
"updated_at": "2026-08-11T19:40:10+00:00"
}
],
"created_at": "2026-08-11T19:40:10+00:00",
"updated_at": "2026-08-11T19:40:10+00:00"
}
}{
"message": "The title field is required.",
"errors": {
"title": [
"The title field is required."
]
}
}Authorizations
Create a token under Organization settings → API. Tokens are shown once, on creation. They belong to the organization, not to you, so they keep working if you leave the team. API access is included on every plan; the rate limit depends on the plan.
Headers
Body
The event's name.
"Fall Festival"
The day the event starts, as YYYY-MM-DD.
"2026-09-12"
An IANA timezone. Shift times are interpreted in it.
"America/Los_Angeles"
A longer description. Markdown is not rendered.
"Our annual fundraiser."
A street address, or a URL for a virtual event.
"12 Main St"
true
Must be between -90 and 90.
-89
Must be between -180 and 180.
-179
null
The last day, for multi-day events. Capped by your plan.
"2026-09-13"
Publish immediately. Defaults to false.
true
purple-indigo, ocean-blue, sunset-orange, forest-green, rose-pink, slate-charcoal, golden-hour, midnight "forest-green"
Must not be greater than 255 characters.
"g"
The shifts volunteers sign up for.
Show child attributes
Show child attributes
[[]]
Response
Show child attributes
Show child attributes

