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_HEREBase URL
https://www.calendarjet.com/api/v1Rate Limits
Free Plan
10 req/month
Minimum
Pro Plan
Unlimited
100 req/min
Error Codes
200Success201Resource created400Bad request401Unauthorized403Forbidden404Not found422Validation error429Rate limit exceeded500Server errorWebhook 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.createdWhen 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": "[email protected]",
"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": "[email protected]",
"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.confirmedWhen a booking is confirmed
Same structure as booking.created with status: "confirmed" and meeting_link if applicable
booking.rescheduledWhen 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.cancelledWhen 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.reminderWhen 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)
);
}Quick Links
Built with ❤️ by CalendarJet • API Version 1.0.0