curl --request GET \
--url https://api.cal.id/booking/ \
--header 'Authorization: Bearer <token>'import requests
url = "https://api.cal.id/booking/"
headers = {"Authorization": "Bearer <token>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {Authorization: 'Bearer <token>'}};
fetch('https://api.cal.id/booking/', 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.cal.id/booking/",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"net/http"
"io"
)
func main() {
url := "https://api.cal.id/booking/"
req, _ := http.NewRequest("GET", url, nil)
req.Header.Add("Authorization", "Bearer <token>")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.get("https://api.cal.id/booking/")
.header("Authorization", "Bearer <token>")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.cal.id/booking/")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
request["Authorization"] = 'Bearer <token>'
response = http.request(request)
puts response.read_body{
"success": true,
"data": [
{
"id": 5312,
"title": "Intro Call between Jordan Lee and Priya Sharma",
"userPrimaryEmail": "jordan.lee@example.com",
"description": null,
"customInputs": {},
"startTime": "2026-05-04T09:00:00.000Z",
"endTime": "2026-05-04T09:15:00.000Z",
"createdAt": "2026-04-27T16:22:04.000Z",
"updatedAt": "2026-04-27T16:22:04.000Z",
"metadata": {
"videoCallUrl": "https://meet.cal.id/intro-call/bk_9f2c1d7a4e"
},
"uid": "bk_9f2c1d7a4e",
"responses": {
"name": "Priya Sharma",
"email": "priya.sharma@example.com",
"notes": "Happy to run through pricing."
},
"recurringEventId": null,
"location": "integrations:daily",
"status": "ACCEPTED",
"paid": false,
"fromReschedule": null,
"rescheduled": null,
"isRecorded": false,
"routedFromRoutingFormReponse": null,
"eventType": {
"id": 100482,
"title": "Intro Call",
"slug": "intro-call",
"eventName": "Intro Call between {HOST} and {ATTENDEE}",
"price": 0,
"currency": "usd",
"recurringEvent": null,
"metadata": {},
"seatsShowAttendees": false,
"hosts": [
{
"user": {
"id": 4021,
"name": "Jordan Lee",
"email": "jordan.lee@example.com"
}
}
],
"calIdTeam": null,
"length": 15,
"customReplyToEmail": null,
"allowReschedulingPastBookings": false,
"hideOrganizerEmail": false,
"disableCancelling": false,
"disableRescheduling": false,
"eventTypeColor": null
},
"references": [],
"payment": [],
"user": {
"id": 4021,
"name": "Jordan Lee",
"email": "jordan.lee@example.com"
},
"attendees": [
{
"name": "Priya Sharma",
"email": "priya.sharma@example.com",
"timeZone": "Asia/Kolkata",
"locale": "en"
}
],
"seatsReferences": [],
"assignmentReason": [],
"rescheduler": null
}
],
"message": "User bookings retrieved",
"meta": {
"pagination": {
"page": 1,
"limit": 100,
"total": 1,
"totalPages": 1
}
}
}{
"success": false,
"message": "<string>",
"error": {
"code": "<string>",
"message": "<string>",
"details": "<unknown>"
}
}{
"success": false,
"message": "<string>",
"error": {
"code": "<string>",
"message": "<string>",
"details": "<unknown>"
}
}{
"success": false,
"message": "<string>",
"error": {
"code": "<string>",
"message": "<string>",
"details": "<unknown>"
}
}{
"success": false,
"message": "Rate limit exceeded",
"error": {
"code": "TOO_MANY_REQUESTS",
"message": "Too many requests. Please retry after the rate limit window resets."
}
}List bookings
Lists the authenticated user’s bookings. It defaults to status=upcoming, so a quiet account legitimately returns an empty data array — pass status=past or status=cancelled before concluding something is broken. The valid buckets are upcoming, past, cancelled, unconfirmed and recurring; any other value returns 400. Narrow further with attendee, event-type, team and date-range filters, sort with the sort* parameters, and page with page/limit (default 100, max 500) reading totals from meta.pagination.
curl --request GET \
--url https://api.cal.id/booking/ \
--header 'Authorization: Bearer <token>'import requests
url = "https://api.cal.id/booking/"
headers = {"Authorization": "Bearer <token>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {Authorization: 'Bearer <token>'}};
fetch('https://api.cal.id/booking/', 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.cal.id/booking/",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"net/http"
"io"
)
func main() {
url := "https://api.cal.id/booking/"
req, _ := http.NewRequest("GET", url, nil)
req.Header.Add("Authorization", "Bearer <token>")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.get("https://api.cal.id/booking/")
.header("Authorization", "Bearer <token>")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.cal.id/booking/")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
request["Authorization"] = 'Bearer <token>'
response = http.request(request)
puts response.read_body{
"success": true,
"data": [
{
"id": 5312,
"title": "Intro Call between Jordan Lee and Priya Sharma",
"userPrimaryEmail": "jordan.lee@example.com",
"description": null,
"customInputs": {},
"startTime": "2026-05-04T09:00:00.000Z",
"endTime": "2026-05-04T09:15:00.000Z",
"createdAt": "2026-04-27T16:22:04.000Z",
"updatedAt": "2026-04-27T16:22:04.000Z",
"metadata": {
"videoCallUrl": "https://meet.cal.id/intro-call/bk_9f2c1d7a4e"
},
"uid": "bk_9f2c1d7a4e",
"responses": {
"name": "Priya Sharma",
"email": "priya.sharma@example.com",
"notes": "Happy to run through pricing."
},
"recurringEventId": null,
"location": "integrations:daily",
"status": "ACCEPTED",
"paid": false,
"fromReschedule": null,
"rescheduled": null,
"isRecorded": false,
"routedFromRoutingFormReponse": null,
"eventType": {
"id": 100482,
"title": "Intro Call",
"slug": "intro-call",
"eventName": "Intro Call between {HOST} and {ATTENDEE}",
"price": 0,
"currency": "usd",
"recurringEvent": null,
"metadata": {},
"seatsShowAttendees": false,
"hosts": [
{
"user": {
"id": 4021,
"name": "Jordan Lee",
"email": "jordan.lee@example.com"
}
}
],
"calIdTeam": null,
"length": 15,
"customReplyToEmail": null,
"allowReschedulingPastBookings": false,
"hideOrganizerEmail": false,
"disableCancelling": false,
"disableRescheduling": false,
"eventTypeColor": null
},
"references": [],
"payment": [],
"user": {
"id": 4021,
"name": "Jordan Lee",
"email": "jordan.lee@example.com"
},
"attendees": [
{
"name": "Priya Sharma",
"email": "priya.sharma@example.com",
"timeZone": "Asia/Kolkata",
"locale": "en"
}
],
"seatsReferences": [],
"assignmentReason": [],
"rescheduler": null
}
],
"message": "User bookings retrieved",
"meta": {
"pagination": {
"page": 1,
"limit": 100,
"total": 1,
"totalPages": 1
}
}
}{
"success": false,
"message": "<string>",
"error": {
"code": "<string>",
"message": "<string>",
"details": "<unknown>"
}
}{
"success": false,
"message": "<string>",
"error": {
"code": "<string>",
"message": "<string>",
"details": "<unknown>"
}
}{
"success": false,
"message": "<string>",
"error": {
"code": "<string>",
"message": "<string>",
"details": "<unknown>"
}
}{
"success": false,
"message": "Rate limit exceeded",
"error": {
"code": "TOO_MANY_REQUESTS",
"message": "Too many requests. Please retry after the rate limit window resets."
}
}Authorizations
Use the Authorization header with Bearer scheme.
Examples:
- API Key: Authorization: Bearer calid_xxxxx
Query Parameters
Booking status bucket filter.
upcoming, recurring, past, cancelled, unconfirmed "upcoming"
Filter by a single team ID. Admin/owner receives all team bookings; members receive only host/attendee bookings.
x > 142
Filter by event type IDs.
[12]
Filter by attendee email.
"booker@example.com"
Filter by attendee name.
"Jane Doe"
Filter by booking UID.
"8d579e09-83f0-4f22-bb5c-89f0ef7fd5a4"
Include bookings starting after this ISO timestamp.
"2026-05-01T00:00:00.000Z"
Include bookings ending before this ISO timestamp.
"2026-05-31T23:59:59.000Z"
Include bookings updated after this ISO timestamp.
"2026-05-01T00:00:00.000Z"
Include bookings updated before this ISO timestamp.
"2026-05-31T23:59:59.000Z"
Include bookings created after this ISO timestamp.
"2026-05-01T00:00:00.000Z"
Include bookings created before this ISO timestamp.
"2026-05-31T23:59:59.000Z"
Sort direction for booking start time.
asc, desc "asc"
Sort direction for booking end time.
asc, desc "desc"
Sort direction for booking creation time.
asc, desc "desc"
Sort direction for booking update time.
asc, desc "desc"
Page number (1-based).
x > 11
Maximum number of bookings returned per page.
1 < x <= 500100
Was this page helpful?