Calendar API Specification
Calendar
Create Calendar
POST /calendars
Create a new calendar.
Payload
{
"name": "Engineering Team Calendar",
"color_theme": "blue",
"visibility": "public"
}
Response
{
"status": "ok",
"calendar": {
"id": "c1f0b7d2-74f8-4c39-8c1a-9db26dddbaf6",
"name": "Engineering Team Calendar",
"color_theme": "blue",
"visibility": "public",
"created_at": "2025-08-11T09:00:00Z"
}
}
Read Calendar
GET /calendars/:id
Get a calendar by ID.
Response
{
"status": "ok",
"calendar": {
"id": "c1f0b7d2-74f8-4c39-8c1a-9db26dddbaf6",
"name": "Engineering Team Calendar",
"color_theme": "blue",
"visibility": "public",
"created_at": "2025-08-11T09:00:00Z"
}
}
Update Calendar
PUT /calendars/:id
Update a calendar.
Payload
{
"name": "Engineering Calendar",
"color_theme": "green",
"visibility": "private"
}
Response
{
"status": "ok",
"calendar": {
"id": "c1f0b7d2-74f8-4c39-8c1a-9db26dddbaf6",
"name": "Engineering Calendar",
"color_theme": "green",
"visibility": "private"
}
}
Delete Calendar
DELETE /calendars/:id
Response
{ "status": "ok" }
List Calendars
GET /calendars
Response
{
"status": "ok",
"calendars": [
{ "id": "1", "name": "Engineering", "visibility": "public" },
{ "id": "2", "name": "Marketing", "visibility": "private" }
]
}
Event
Create Event
POST /events
Payload
{
"calendar_id": "c1f0b7d2-74f8-4c39-8c1a-9db26dddbaf6",
"name": "Weekly Standup",
"description": "Engineering sync",
"start_time": "2025-08-12T10:00:00Z",
"end_time": "2025-08-12T10:30:00Z",
"visibility": "private",
"location": "Zoom",
"all_day": false
}
Response
{
"status": "ok",
"event": {
"id": "a14cfe84-3d99-4d45-b1c1-d6f1ac676c2a",
"calendar_id": "c1f0b7d2-74f8-4c39-8c1a-9db26dddbaf6",
"name": "Weekly Standup",
"start_time": "2025-08-12T10:00:00Z",
"end_time": "2025-08-12T10:30:00Z"
}
}
Get Event
GET /events/:id
Response
{
"status": "ok",
"event": {
"id": "a14cfe84-3d99-4d45-b1c1-d6f1ac676c2a",
"name": "Weekly Standup",
"description": "Engineering sync",
"start_time": "2025-08-12T10:00:00Z",
"end_time": "2025-08-12T10:30:00Z",
"visibility": "private",
"location": "Zoom"
}
}
Update Event
PUT /events/:id
Payload
{
"name": "Weekly Sync",
"start_time": "2025-08-12T11:00:00Z"
}
Response
{
"status": "ok",
"event": {
"id": "a14cfe84-3d99-4d45-b1c1-d6f1ac676c2a",
"name": "Weekly Sync",
"start_time": "2025-08-12T11:00:00Z"
}
}
Delete Event
DELETE /events/:id
Response
{ "status": "ok" }
List Events in Calendar
GET /calendars/:calendar_id/events
Response
{
"status": "ok",
"events": [
{ "id": "1", "name": "Standup" },
{ "id": "2", "name": "Sprint Planning" }
]
}
Availability
Free/Busy
POST /availability/free-busy
Payload
{
"users": ["u1", "u2", "u3"],
"start_time": "2025-08-12T00:00:00Z",
"end_time": "2025-08-19T00:00:00Z"
}
Response
{
"status": "ok",
"availability": {
"u1": [{"start": "2025-08-12T09:00Z", "end": "2025-08-12T10:00Z"}],
"u2": [],
"u3": [{"start": "2025-08-14T15:00Z", "end": "2025-08-14T16:00Z"}]
}
}
Suggest Slots
POST /availability/suggest
Payload
{
"users": ["u1", "u2", "u3"],
"start_time": "2025-08-12T00:00:00Z",
"end_time": "2025-08-19T00:00:00Z",
"duration_minutes": 60
}
Response
{
"status": "ok",
"slots": [
{ "start": "2025-08-13T10:00Z", "end": "2025-08-13T11:00Z" },
{ "start": "2025-08-15T14:00Z", "end": "2025-08-15T15:00Z" }
]
}
Callbacks
/callbacks/event_reminder– server → participant before event start/callbacks/invitation_response– participant → server response to invite/callbacks/event_updated– server → subscribers when event changes/callbacks/event_status– generic for invites, updates, cancels, reschedules