curl --request PATCH \
--url https://api.cal.id/slots/{uid} \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"eventTypeId": 123,
"slotStart": "2026-05-02T10:00:00.000Z"
}
'import requests
url = "https://api.cal.id/slots/{uid}"
payload = {
"eventTypeId": 123,
"slotStart": "2026-05-02T10:00:00.000Z"
}
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.patch(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'PATCH',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({eventTypeId: 123, slotStart: '2026-05-02T10:00:00.000Z'})
};
fetch('https://api.cal.id/slots/{uid}', 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/slots/{uid}",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "PATCH",
CURLOPT_POSTFIELDS => json_encode([
'eventTypeId' => 123,
'slotStart' => '2026-05-02T10:00:00.000Z'
]),
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>",
"Content-Type: application/json"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://api.cal.id/slots/{uid}"
payload := strings.NewReader("{\n \"eventTypeId\": 123,\n \"slotStart\": \"2026-05-02T10:00:00.000Z\"\n}")
req, _ := http.NewRequest("PATCH", url, payload)
req.Header.Add("Authorization", "Bearer <token>")
req.Header.Add("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.patch("https://api.cal.id/slots/{uid}")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"eventTypeId\": 123,\n \"slotStart\": \"2026-05-02T10:00:00.000Z\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.cal.id/slots/{uid}")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Patch.new(url)
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"eventTypeId\": 123,\n \"slotStart\": \"2026-05-02T10:00:00.000Z\"\n}"
response = http.request(request)
puts response.read_body{
"success": true,
"data": {
"eventTypeId": 100482,
"slotStart": "2026-05-04T14:00:00.000Z",
"slotEnd": "2026-05-04T14:15:00.000Z",
"slotDuration": 15,
"reservationUid": "3f0b7c92-4a1e-4d6b-9c2f-7a5e1b8d0c34",
"reservationDuration": 10,
"reservationUntil": "2026-05-01T12:10:00.000Z"
},
"message": "Slot updated"
}{
"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": "<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."
}
}{
"success": false,
"message": "<string>",
"error": {
"code": "<string>",
"message": "<string>",
"details": "<unknown>"
}
}Update a reserved slot
Moves an existing reservation to a different slotStart or extends its hold via reservationDuration; eventTypeId and slotStart are both required. The refreshed reservation comes back with reservationUid, slotStart, slotEnd and reservationUntil. As with reserving, this does not verify that the new time is actually bookable — confirm against GET /slots/ first.
curl --request PATCH \
--url https://api.cal.id/slots/{uid} \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"eventTypeId": 123,
"slotStart": "2026-05-02T10:00:00.000Z"
}
'import requests
url = "https://api.cal.id/slots/{uid}"
payload = {
"eventTypeId": 123,
"slotStart": "2026-05-02T10:00:00.000Z"
}
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.patch(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'PATCH',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({eventTypeId: 123, slotStart: '2026-05-02T10:00:00.000Z'})
};
fetch('https://api.cal.id/slots/{uid}', 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/slots/{uid}",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "PATCH",
CURLOPT_POSTFIELDS => json_encode([
'eventTypeId' => 123,
'slotStart' => '2026-05-02T10:00:00.000Z'
]),
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>",
"Content-Type: application/json"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://api.cal.id/slots/{uid}"
payload := strings.NewReader("{\n \"eventTypeId\": 123,\n \"slotStart\": \"2026-05-02T10:00:00.000Z\"\n}")
req, _ := http.NewRequest("PATCH", url, payload)
req.Header.Add("Authorization", "Bearer <token>")
req.Header.Add("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.patch("https://api.cal.id/slots/{uid}")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"eventTypeId\": 123,\n \"slotStart\": \"2026-05-02T10:00:00.000Z\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.cal.id/slots/{uid}")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Patch.new(url)
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"eventTypeId\": 123,\n \"slotStart\": \"2026-05-02T10:00:00.000Z\"\n}"
response = http.request(request)
puts response.read_body{
"success": true,
"data": {
"eventTypeId": 100482,
"slotStart": "2026-05-04T14:00:00.000Z",
"slotEnd": "2026-05-04T14:15:00.000Z",
"slotDuration": 15,
"reservationUid": "3f0b7c92-4a1e-4d6b-9c2f-7a5e1b8d0c34",
"reservationDuration": 10,
"reservationUntil": "2026-05-01T12:10:00.000Z"
},
"message": "Slot updated"
}{
"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": "<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."
}
}{
"success": false,
"message": "<string>",
"error": {
"code": "<string>",
"message": "<string>",
"details": "<unknown>"
}
}Authorizations
Use the Authorization header with Bearer scheme.
Examples:
- API Key: Authorization: Bearer calid_xxxxx
Path Parameters
Selected slot reservation UID.
"2f33b5cd-8ec7-4eb0-91fd-9488c30f4744"
Body
Event type identifier for the slot reservation.
x > 1123
Slot start time in ISO-8601 format with timezone offset.
"2026-05-02T10:00:00.000Z"
Optional duration in minutes. Can be sent as a number or numeric string and must match event type allowed durations when configured.
^[1-9]\d*$"30"
Optional reservation hold duration in minutes. Defaults to 5 when omitted and requires authenticated requests.
x > 110
Was this page helpful?