Cancel a leave
curl --request POST \
--url https://api.plane.com/v1/leaves/{id}/cancel \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"reason": "<string>"
}
'import requests
url = "https://api.plane.com/v1/leaves/{id}/cancel"
payload = { "reason": "<string>" }
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: '<string>'})
};
fetch('https://api.plane.com/v1/leaves/{id}/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.plane.com/v1/leaves/{id}/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' => '<string>'
]),
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.plane.com/v1/leaves/{id}/cancel"
payload := strings.NewReader("{\n \"reason\": \"<string>\"\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.plane.com/v1/leaves/{id}/cancel")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"reason\": \"<string>\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.plane.com/v1/leaves/{id}/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\": \"<string>\"\n}"
response = http.request(request)
puts response.read_body{
"id": "lv_1HPCXADYAhh5k1NMU0r1WUqs",
"status": "cancelled",
"type": "vacation",
"worker": "wr_CgcLakmx4guire",
"starts": "2026-04-14",
"ends": "2026-04-16",
"days": 2.5,
"hours": 20,
"schedule": {
"2026-04-14": 8,
"2026-04-15": 8,
"2026-04-16": 4
},
"note": "Annual vacation",
"request": {
"id": "lvr_6r3wLwX44s0Ak0bDkP5n2r7Q",
"status": "cancelled",
"created": "2026-03-10T18:42:11Z",
"updated": "2026-03-11T09:05:52Z"
},
"created": "2026-03-10T18:42:11Z",
"updated": "2026-03-11T09:05:52Z"
}
Time Off
Cancel a leave
Cancel an existing leave.
POST
/
v1
/
leaves
/
{id}
/
cancel
Cancel a leave
curl --request POST \
--url https://api.plane.com/v1/leaves/{id}/cancel \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"reason": "<string>"
}
'import requests
url = "https://api.plane.com/v1/leaves/{id}/cancel"
payload = { "reason": "<string>" }
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: '<string>'})
};
fetch('https://api.plane.com/v1/leaves/{id}/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.plane.com/v1/leaves/{id}/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' => '<string>'
]),
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.plane.com/v1/leaves/{id}/cancel"
payload := strings.NewReader("{\n \"reason\": \"<string>\"\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.plane.com/v1/leaves/{id}/cancel")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"reason\": \"<string>\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.plane.com/v1/leaves/{id}/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\": \"<string>\"\n}"
response = http.request(request)
puts response.read_body{
"id": "lv_1HPCXADYAhh5k1NMU0r1WUqs",
"status": "cancelled",
"type": "vacation",
"worker": "wr_CgcLakmx4guire",
"starts": "2026-04-14",
"ends": "2026-04-16",
"days": 2.5,
"hours": 20,
"schedule": {
"2026-04-14": 8,
"2026-04-15": 8,
"2026-04-16": 4
},
"note": "Annual vacation",
"request": {
"id": "lvr_6r3wLwX44s0Ak0bDkP5n2r7Q",
"status": "cancelled",
"created": "2026-03-10T18:42:11Z",
"updated": "2026-03-11T09:05:52Z"
},
"created": "2026-03-10T18:42:11Z",
"updated": "2026-03-11T09:05:52Z"
}
Use this endpoint when an existing leave should no longer count for scheduling,
balances, or payroll. Plane marks the leave as
cancelled and reverses any
posted or scheduled leave usage tied to it.
Parameters
The ID of the leave to cancel.
Optional cancellation note attached to the leave decision.
Returns
Returns the updated Leave object.{
"id": "lv_1HPCXADYAhh5k1NMU0r1WUqs",
"status": "cancelled",
"type": "vacation",
"worker": "wr_CgcLakmx4guire",
"starts": "2026-04-14",
"ends": "2026-04-16",
"days": 2.5,
"hours": 20,
"schedule": {
"2026-04-14": 8,
"2026-04-15": 8,
"2026-04-16": 4
},
"note": "Annual vacation",
"request": {
"id": "lvr_6r3wLwX44s0Ak0bDkP5n2r7Q",
"status": "cancelled",
"created": "2026-03-10T18:42:11Z",
"updated": "2026-03-11T09:05:52Z"
},
"created": "2026-03-10T18:42:11Z",
"updated": "2026-03-11T09:05:52Z"
}
Was this page helpful?
⌘I