REST API for managing profiles, events, bookings, availability, and schedules.
https://skdul.ai/api/v1curl -X GET https://skdul.ai/api/v1/profile \
-H "Authorization: Bearer sk_live_<your_key>"All /api/v1/* endpoints require an API key passed via the Authorization header.
Authorization: Bearer sk_live_xxxxxxxxxxxxxxxx{ "error": "Missing or invalid API key" }/api/v1/profileGet your full profile including name, username, timezone, and settings
{
"id": "uuid",
"username": "janedoe",
"full_name": "Jane Doe",
"timezone": "America/New_York",
"time_format": "12h",
"brand_color": "#E8634A",
"bio": "Product designer based in NYC",
"week_start": "sunday",
"avatar_url": "https://...",
"plan": "free"
}curl -X GET https://skdul.ai/api/v1/profile \
-H "Authorization: Bearer sk_live_<your_key>"/api/v1/profileUpdate your profile settings
| Name | Type | Required | Description |
|---|---|---|---|
fullName | string | No | Your display name |
timezone | string | No | IANA timezone (e.g. America/New_York) |
timeFormat | "12h" | "24h" | No | Time display format |
brandColor | string | No | Hex color code (e.g. #E8634A) |
bio | string | No | Short bio for your booking page |
weekStart | "sunday" | "monday" | No | First day of the week |
{
"id": "uuid",
"username": "janedoe",
"full_name": "Jane Doe",
"timezone": "America/New_York",
"time_format": "12h",
"brand_color": "#E8634A",
"bio": "Updated bio",
"week_start": "sunday"
}curl -X PATCH https://skdul.ai/api/v1/profile \
-H "Authorization: Bearer sk_live_<your_key>" \
-H "Content-Type: application/json" \
-d '{"fullName": "Jane Doe", "timezone": "America/New_York"}'/api/v1/event-typesList all your events
| Name | Type | Required | Description |
|---|---|---|---|
includeInactive | boolean | No | Include disabled events (default false) |
[
{
"id": "uuid",
"title": "30 Minute Meeting",
"slug": "30min",
"duration_minutes": 30,
"description": "Quick chat",
"location_type": "video",
"buffer_before": 0,
"buffer_after": 5,
"minimum_notice": 60,
"max_per_day": null,
"color": "#E8634A",
"is_active": true
}
]curl -X GET "https://skdul.ai/api/v1/event-types?includeInactive=true" \
-H "Authorization: Bearer sk_live_<your_key>"/api/v1/event-typesCreate a new event (meeting template)
| Name | Type | Required | Description |
|---|---|---|---|
title | string | Yes | Event title (e.g. '30 Minute Meeting') |
slug | string | Yes | URL slug (e.g. '30min') |
durationMinutes | number | Yes | Duration in minutes |
description | string | No | Description shown on booking page |
locationType | "video" | "phone" | "in_person" | "custom" | No | Meeting location type |
bufferBefore | number | No | Buffer minutes before the meeting |
bufferAfter | number | No | Buffer minutes after the meeting |
minimumNotice | number | No | Minimum notice in minutes before booking |
maxPerDay | number | No | Maximum bookings per day |
color | string | No | Display color hex code |
{
"id": "uuid",
"title": "30 Minute Meeting",
"slug": "30min",
"duration_minutes": 30,
"location_type": "video",
"is_active": true
}curl -X POST https://skdul.ai/api/v1/event-types \
-H "Authorization: Bearer sk_live_<your_key>" \
-H "Content-Type: application/json" \
-d '{
"title": "30 Minute Meeting",
"slug": "30min",
"durationMinutes": 30,
"locationType": "video"
}'/api/v1/event-types/[id]Update an existing event
| Name | Type | Required | Description |
|---|---|---|---|
title | string | No | Event title |
slug | string | No | URL slug |
durationMinutes | number | No | Duration in minutes |
description | string | No | Description |
locationType | "video" | "phone" | "in_person" | "custom" | No | Location type |
bufferBefore | number | No | Buffer minutes before |
bufferAfter | number | No | Buffer minutes after |
minimumNotice | number | No | Minimum notice in minutes |
maxPerDay | number | No | Maximum bookings per day |
color | string | No | Display color hex code |
isActive | boolean | No | Whether the event is active |
{
"id": "uuid",
"title": "Updated Meeting",
"slug": "30min",
"duration_minutes": 30,
"is_active": true
}curl -X PATCH https://skdul.ai/api/v1/event-types/<event_type_id> \
-H "Authorization: Bearer sk_live_<your_key>" \
-H "Content-Type: application/json" \
-d '{"title": "Updated Meeting", "isActive": true}'/api/v1/event-types/[id]Delete an event
{ "success": true }curl -X DELETE https://skdul.ai/api/v1/event-types/<event_type_id> \
-H "Authorization: Bearer sk_live_<your_key>"/api/v1/availability/slotsGet available time slots for an event within a date range
| Name | Type | Required | Description |
|---|---|---|---|
eventTypeId | string | Yes | Event ID to check availability for |
startDate | string | Yes | Start date (YYYY-MM-DD) |
endDate | string | Yes | End date (YYYY-MM-DD) |
timezone | string | No | IANA timezone (defaults to UTC) |
[
{ "start": "2026-02-21T09:00:00Z", "end": "2026-02-21T09:30:00Z" },
{ "start": "2026-02-21T09:30:00Z", "end": "2026-02-21T10:00:00Z" },
{ "start": "2026-02-21T10:00:00Z", "end": "2026-02-21T10:30:00Z" }
]curl -X GET "https://skdul.ai/api/v1/availability/slots?eventTypeId=<id>&startDate=2026-02-21&endDate=2026-02-28" \
-H "Authorization: Bearer sk_live_<your_key>"/api/v1/bookingsList your bookings with optional filters
| Name | Type | Required | Description |
|---|---|---|---|
status | string | No | Filter by status: confirmed, cancelled_by_host, cancelled_by_guest, rescheduled, completed, no_show |
upcoming | boolean | No | Only show future bookings (default true) |
guestEmail | string | No | Filter by guest email |
limit | number | No | Max number of bookings to return (default 20) |
[
{
"id": "uuid",
"event_type_id": "uuid",
"start_time": "2026-02-21T14:00:00Z",
"end_time": "2026-02-21T14:30:00Z",
"guest_name": "John Smith",
"guest_email": "john@example.com",
"guest_timezone": "America/Chicago",
"status": "confirmed",
"guest_notes": "Looking forward to it"
}
]curl -X GET "https://skdul.ai/api/v1/bookings?status=confirmed&upcoming=true&limit=10" \
-H "Authorization: Bearer sk_live_<your_key>"/api/v1/bookingsCreate a new booking for a guest on one of your events
| Name | Type | Required | Description |
|---|---|---|---|
eventTypeId | string | Yes | Event ID to book |
startTime | string | Yes | Start time (ISO 8601) |
endTime | string | Yes | End time (ISO 8601) |
guestName | string | Yes | Guest's full name |
guestEmail | string | Yes | Guest's email address |
durationMinutes | number | Yes | Duration in minutes |
guestTimezone | string | No | Guest's IANA timezone |
guestNotes | string | No | Notes from the guest |
{
"id": "uuid",
"event_type_id": "uuid",
"start_time": "2026-02-21T14:00:00Z",
"end_time": "2026-02-21T14:30:00Z",
"guest_name": "John Smith",
"guest_email": "john@example.com",
"status": "confirmed"
}curl -X POST https://skdul.ai/api/v1/bookings \
-H "Authorization: Bearer sk_live_<your_key>" \
-H "Content-Type: application/json" \
-d '{
"eventTypeId": "<event_type_id>",
"startTime": "2026-02-21T14:00:00Z",
"endTime": "2026-02-21T14:30:00Z",
"guestName": "John Smith",
"guestEmail": "john@example.com",
"durationMinutes": 30
}'/api/v1/bookings/[id]Get full details for a specific booking including event info
{
"id": "uuid",
"event_type_id": "uuid",
"start_time": "2026-02-21T14:00:00Z",
"end_time": "2026-02-21T14:30:00Z",
"guest_name": "John Smith",
"guest_email": "john@example.com",
"guest_timezone": "America/Chicago",
"status": "confirmed",
"guest_notes": "Looking forward to it",
"event_types": {
"title": "30 Minute Meeting",
"duration_minutes": 30,
"location_type": "video"
}
}curl -X GET https://skdul.ai/api/v1/bookings/<booking_id> \
-H "Authorization: Bearer sk_live_<your_key>"/api/v1/bookings/[id]/cancelCancel a confirmed booking
| Name | Type | Required | Description |
|---|---|---|---|
reason | string | No | Cancellation reason |
{
"id": "uuid",
"status": "cancelled_by_host",
"guest_name": "John Smith",
"guest_email": "john@example.com"
}curl -X POST https://skdul.ai/api/v1/bookings/<booking_id>/cancel \
-H "Authorization: Bearer sk_live_<your_key>" \
-H "Content-Type: application/json" \
-d '{"reason": "Schedule conflict"}'/api/v1/bookings/[id]/rescheduleReschedule a booking to a new time slot
| Name | Type | Required | Description |
|---|---|---|---|
newStartTime | string | Yes | New start time (ISO 8601) |
newEndTime | string | Yes | New end time (ISO 8601) |
{
"id": "uuid",
"start_time": "2026-02-22T10:00:00Z",
"end_time": "2026-02-22T10:30:00Z",
"status": "confirmed",
"guest_name": "John Smith"
}curl -X POST https://skdul.ai/api/v1/bookings/<booking_id>/reschedule \
-H "Authorization: Bearer sk_live_<your_key>" \
-H "Content-Type: application/json" \
-d '{
"newStartTime": "2026-02-22T10:00:00Z",
"newEndTime": "2026-02-22T10:30:00Z"
}'/api/v1/scheduleGet your weekly working hours and availability rules
{
"schedule": {
"id": "uuid",
"name": "Default",
"timezone": "America/New_York"
},
"rules": [
{ "day_of_week": 1, "start_time": "09:00", "end_time": "17:00", "is_enabled": true },
{ "day_of_week": 2, "start_time": "09:00", "end_time": "17:00", "is_enabled": true },
{ "day_of_week": 3, "start_time": "09:00", "end_time": "17:00", "is_enabled": true },
{ "day_of_week": 4, "start_time": "09:00", "end_time": "17:00", "is_enabled": true },
{ "day_of_week": 5, "start_time": "09:00", "end_time": "17:00", "is_enabled": true }
]
}curl -X GET https://skdul.ai/api/v1/schedule \
-H "Authorization: Bearer sk_live_<your_key>"/api/v1/scheduleSet your weekly working hours for each day of the week
| Name | Type | Required | Description |
|---|---|---|---|
rules | array | Yes | Array of availability rules |
rules[].dayOfWeek | number (0-6) | Yes | Day of week (0=Sunday, 6=Saturday) |
rules[].startTime | string | Yes | Start time (HH:MM, 24h format) |
rules[].endTime | string | Yes | End time (HH:MM, 24h format) |
rules[].isEnabled | boolean | No | Whether this day is enabled (default true) |
{
"schedule": { "id": "uuid", "name": "Default" },
"rules": [
{ "day_of_week": 1, "start_time": "09:00", "end_time": "17:00", "is_enabled": true }
]
}curl -X PUT https://skdul.ai/api/v1/schedule \
-H "Authorization: Bearer sk_live_<your_key>" \
-H "Content-Type: application/json" \
-d '{
"rules": [
{ "dayOfWeek": 1, "startTime": "09:00", "endTime": "17:00", "isEnabled": true },
{ "dayOfWeek": 2, "startTime": "09:00", "endTime": "17:00", "isEnabled": true },
{ "dayOfWeek": 3, "startTime": "09:00", "endTime": "17:00", "isEnabled": true },
{ "dayOfWeek": 4, "startTime": "09:00", "endTime": "17:00", "isEnabled": true },
{ "dayOfWeek": 5, "startTime": "09:00", "endTime": "17:00", "isEnabled": true }
]
}'/api/availabilityGet available time slots (no authentication required)
| Name | Type | Required | Description |
|---|---|---|---|
eventTypeId | string | Yes | Event ID to check |
startDate | string | Yes | Start date (YYYY-MM-DD) |
endDate | string | Yes | End date (YYYY-MM-DD) |
timezone | string | No | IANA timezone (defaults to UTC) |
{
"slots": [
{ "start": "2026-02-21T09:00:00Z", "end": "2026-02-21T09:30:00Z" },
{ "start": "2026-02-21T09:30:00Z", "end": "2026-02-21T10:00:00Z" }
]
}curl -X GET "https://skdul.ai/api/availability?eventTypeId=<id>&startDate=2026-02-21&endDate=2026-02-28"/api/bookingsCreate a booking on behalf of a guest (requires hostId instead of API key auth)
| Name | Type | Required | Description |
|---|---|---|---|
hostId | string | Yes | Host's user ID (unlike v1 which infers from API key) |
eventTypeId | string | Yes | Event ID to book |
startTime | string | Yes | Start time (ISO 8601) |
endTime | string | Yes | End time (ISO 8601) |
guestName | string | Yes | Guest's full name |
guestEmail | string | Yes | Guest's email address |
durationMinutes | number | Yes | Duration in minutes |
guestTimezone | string | No | Guest's IANA timezone |
guestNotes | string | No | Notes from the guest |
{
"id": "uuid",
"event_type_id": "uuid",
"start_time": "2026-02-21T14:00:00Z",
"end_time": "2026-02-21T14:30:00Z",
"guest_name": "John Smith",
"guest_email": "john@example.com",
"status": "confirmed"
}curl -X POST https://skdul.ai/api/bookings \
-H "Content-Type: application/json" \
-d '{
"hostId": "<host_user_id>",
"eventTypeId": "<event_type_id>",
"startTime": "2026-02-21T14:00:00Z",
"endTime": "2026-02-21T14:30:00Z",
"guestName": "John Smith",
"guestEmail": "john@example.com",
"durationMinutes": 30
}'{ "error": "Description of what went wrong" }| Code | Meaning | Description |
|---|---|---|
400 | Bad Request | Missing required fields or invalid data |
401 | Unauthorized | Missing or invalid API key |
404 | Not Found | Resource does not exist or you don't own it |
409 | Conflict | Time slot no longer available (booking conflict) |
500 | Internal Server Error | Something went wrong on our end |
Set up your booking page in two minutes. No credit card required.
Start building with skdul