CalendarJet API Documentation
Build powerful scheduling integrations with our RESTful API. Simple, secure, and developer-friendly.
Authentication
All API requests require authentication using Bearer tokens. Include your API key in the Authorization header:
Authorization: Bearer cjet_live_YOUR_API_KEY_HERE
Base URL
https://www.calendarjet.com/api/v1
Rate Limits
Free Plan
- 10 req/month
Pro Plan
- Unlimited
- 100 req/min
Error Codes
200Success201Resource created400Bad request401Unauthorized403Forbidden404Not found422Validation error429Rate limit exceeded500Server error
Webhook Payloads
When events occur, CalendarJet sends POST requests to your configured webhook URLs. Each payload includes comprehensive data with HMAC-SHA256 signatures for verification.
booking.created
When a new booking is created
{
"id": "evt_a1b2c3d4-e5f6-7890-abcd-ef1234567890",
"event": "booking.created",
"created_at": "2025-01-15T10:00:00.000Z",
"data": {
"booking": {
"id": "book_abc123",
"scheduled_at": "2025-01-16T14:00:00.000Z",
"end_time": "2025-01-16T14:30:00.000Z",
"invitee_name": "John Doe",
"invitee_email": "john@example.com",
"invitee_timezone": "America/New_York",
"status": "pending",
"reschedule_url": "https://www.calendarjet.com/booking/manage/book_abc123?token=xxx&action=reschedule",
"cancel_url": "https://www.calendarjet.com/booking/manage/book_abc123?token=xxx&action=cancel"
},
"organizer": {
"id": "user_xyz789",
"name": "Jane Smith",
"email": "jane@company.com",
"timezone": "America/Los_Angeles"
},
"event_type": {
"id": "evt_type_123",
"name": "30 Minute Meeting",
"slug": "30min-meeting",
"duration_minutes": 30
},
"metadata": { "api_version": "2.0" }
}
}
booking.confirmed
When a booking is confirmed
Same structure as booking.created with status: "confirmed" and meeting_link if applicable.
booking.rescheduled
When a booking is rescheduled
{
"id": "evt_...",
"event": "booking.rescheduled",
"data": {
"booking": {
"id": "book_abc123",
"previous_scheduled_at": "2025-01-16T14:00:00.000Z",
"previous_end_time": "2025-01-16T14:30:00.000Z",
"scheduled_at": "2025-01-17T10:00:00.000Z",
"end_time": "2025-01-17T10:30:00.000Z",
"status": "confirmed",
"reschedule_url": "...",
"cancel_url": "..."
},
"rescheduling": {
"rescheduled_by": "invitee",
"rescheduled_at": "2025-01-15T12:00:00.000Z"
}
}
}
booking.cancelled
When a booking is cancelled
{
"id": "evt_...",
"event": "booking.cancelled",
"data": {
"booking": { "id": "book_abc123", "status": "cancelled" },
"cancellation": {
"cancelled_at": "2025-01-15T15:00:00.000Z",
"cancelled_by": "invitee",
"cancellation_reason": "Schedule conflict"
}
}
}
booking.reminder
When a reminder is sent before a booking
{
"id": "evt_...",
"event": "booking.reminder",
"data": {
"booking": { "id": "book_abc123", "meeting_link": "https://zoom.us/j/..." },
"reminder": {
"type": "24h",
"sent_at": "2025-01-15T14:00:00.000Z",
"hours_before": 24
},
"location": {
"type": "zoom",
"meeting_url": "https://zoom.us/j/..."
}
}
}
Signature Verification
Each webhook includes a X-Webhook-Signature header with HMAC-SHA256 signature:
const crypto = require('crypto');
function verifySignature(payload, signature, secret) {
const expected = crypto
.createHmac('sha256', secret)
.update(JSON.stringify(payload))
.digest('hex');
return crypto.timingSafeEqual(
Buffer.from(signature),
Buffer.from(expected)
);
}
Resources
Support
Built with ❤️ by CalendarJet • API Version 1.0.0