cURL
curl --request POST \
--url https://api.teamfollowup.ai/api/native-calendar/appointments/{appointmentId}/cancel \
--header 'Authorization: Bearer YOUR_API_KEY' \
--header 'Content-Type: application/json' \
--data '{
"reason": "Patient called to cancel."
}'import requests
url = "https://api.teamfollowup.ai/api/native-calendar/appointments/{appointmentId}/cancel"
payload = { "reason": "Patient called to cancel." }
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({reason: 'Patient called to cancel.'})
};
fetch('https://api.teamfollowup.ai/api/native-calendar/appointments/{appointmentId}/cancel', 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.teamfollowup.ai/api/native-calendar/appointments/{appointmentId}/cancel",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => json_encode([
'reason' => 'Patient called to cancel.'
]),
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.teamfollowup.ai/api/native-calendar/appointments/{appointmentId}/cancel"
payload := strings.NewReader("{\n \"reason\": \"Patient called to cancel.\"\n}")
req, _ := http.NewRequest("POST", 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.post("https://api.teamfollowup.ai/api/native-calendar/appointments/{appointmentId}/cancel")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"reason\": \"Patient called to cancel.\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.teamfollowup.ai/api/native-calendar/appointments/{appointmentId}/cancel")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"reason\": \"Patient called to cancel.\"\n}"
response = http.request(request)
puts response.read_body{
"success": true,
"data": {
"ok": true,
"appointmentId": "apt_7d21c0f4a1",
"status": "cancelled"
}
}{
"success": false,
"error": "timezone is required"
}{
"success": false,
"error": "Unauthorized"
}{
"success": false,
"error": "calendar does not belong to this project"
}{
"success": false,
"error": "calendar not found"
}{
"success": false,
"error": "TooManyRequests"
}{
"success": false,
"error": "Calendar request failed."
}{
"success": false,
"error": "Calendar service is unreachable."
}Cancel an appointment
Cancels the appointment and frees its seat.
reason is kept with it. The reminder cadence that belonged to the booking is stopped in the same step, so nobody is texted about an appointment that is not happening.
Cookie-auth callers must send the x-csrf-token header.
Required API key scope: projects:write.
POST
/
api
/
native-calendar
/
appointments
/
{appointmentId}
/
cancel
cURL
curl --request POST \
--url https://api.teamfollowup.ai/api/native-calendar/appointments/{appointmentId}/cancel \
--header 'Authorization: Bearer YOUR_API_KEY' \
--header 'Content-Type: application/json' \
--data '{
"reason": "Patient called to cancel."
}'import requests
url = "https://api.teamfollowup.ai/api/native-calendar/appointments/{appointmentId}/cancel"
payload = { "reason": "Patient called to cancel." }
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({reason: 'Patient called to cancel.'})
};
fetch('https://api.teamfollowup.ai/api/native-calendar/appointments/{appointmentId}/cancel', 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.teamfollowup.ai/api/native-calendar/appointments/{appointmentId}/cancel",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => json_encode([
'reason' => 'Patient called to cancel.'
]),
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.teamfollowup.ai/api/native-calendar/appointments/{appointmentId}/cancel"
payload := strings.NewReader("{\n \"reason\": \"Patient called to cancel.\"\n}")
req, _ := http.NewRequest("POST", 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.post("https://api.teamfollowup.ai/api/native-calendar/appointments/{appointmentId}/cancel")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"reason\": \"Patient called to cancel.\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.teamfollowup.ai/api/native-calendar/appointments/{appointmentId}/cancel")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"reason\": \"Patient called to cancel.\"\n}"
response = http.request(request)
puts response.read_body{
"success": true,
"data": {
"ok": true,
"appointmentId": "apt_7d21c0f4a1",
"status": "cancelled"
}
}{
"success": false,
"error": "timezone is required"
}{
"success": false,
"error": "Unauthorized"
}{
"success": false,
"error": "calendar does not belong to this project"
}{
"success": false,
"error": "calendar not found"
}{
"success": false,
"error": "TooManyRequests"
}{
"success": false,
"error": "Calendar request failed."
}{
"success": false,
"error": "Calendar service is unreachable."
}Authorizations
Send your API key as Authorization: Bearer YOUR_API_KEY.
Path Parameters
The appointment id.
Minimum string length:
1Query Parameters
The sub-account this calendar belongs to. It is the only thing that identifies the tenant here, and access is re-checked against it on every call.
⌘I
