Create a leave
curl --request POST \
--url https://api.plane.com/v1/leaves \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"worker": "<string>",
"type": "<string>",
"dates": [
{}
],
"note": "<string>"
}
'import requests
url = "https://api.plane.com/v1/leaves"
payload = {
"worker": "<string>",
"type": "<string>",
"dates": [{}],
"note": "<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({worker: '<string>', type: '<string>', dates: [{}], note: '<string>'})
};
fetch('https://api.plane.com/v1/leaves', 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",
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([
'worker' => '<string>',
'type' => '<string>',
'dates' => [
[
]
],
'note' => '<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"
payload := strings.NewReader("{\n \"worker\": \"<string>\",\n \"type\": \"<string>\",\n \"dates\": [\n {}\n ],\n \"note\": \"<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")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"worker\": \"<string>\",\n \"type\": \"<string>\",\n \"dates\": [\n {}\n ],\n \"note\": \"<string>\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.plane.com/v1/leaves")
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 \"worker\": \"<string>\",\n \"type\": \"<string>\",\n \"dates\": [\n {}\n ],\n \"note\": \"<string>\"\n}"
response = http.request(request)
puts response.read_body{
"id": "lv_1HPCXADYAhh5k1NMU0r1WUqs",
"status": "approved",
"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": "Imported from HRIS",
"request": {
"id": "lvr_6r3wLwX44s0Ak0bDkP5n2r7Q",
"status": "approved",
"created": "2026-03-10T18:42:11Z",
"updated": "2026-03-10T18:42:11Z"
},
"created": "2026-03-10T18:42:11Z",
"updated": "2026-03-10T18:42:11Z"
}
Time Off
Create a leave
Record approved leave for a worker.
POST
/
v1
/
leaves
Create a leave
curl --request POST \
--url https://api.plane.com/v1/leaves \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"worker": "<string>",
"type": "<string>",
"dates": [
{}
],
"note": "<string>"
}
'import requests
url = "https://api.plane.com/v1/leaves"
payload = {
"worker": "<string>",
"type": "<string>",
"dates": [{}],
"note": "<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({worker: '<string>', type: '<string>', dates: [{}], note: '<string>'})
};
fetch('https://api.plane.com/v1/leaves', 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",
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([
'worker' => '<string>',
'type' => '<string>',
'dates' => [
[
]
],
'note' => '<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"
payload := strings.NewReader("{\n \"worker\": \"<string>\",\n \"type\": \"<string>\",\n \"dates\": [\n {}\n ],\n \"note\": \"<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")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"worker\": \"<string>\",\n \"type\": \"<string>\",\n \"dates\": [\n {}\n ],\n \"note\": \"<string>\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.plane.com/v1/leaves")
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 \"worker\": \"<string>\",\n \"type\": \"<string>\",\n \"dates\": [\n {}\n ],\n \"note\": \"<string>\"\n}"
response = http.request(request)
puts response.read_body{
"id": "lv_1HPCXADYAhh5k1NMU0r1WUqs",
"status": "approved",
"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": "Imported from HRIS",
"request": {
"id": "lvr_6r3wLwX44s0Ak0bDkP5n2r7Q",
"status": "approved",
"created": "2026-03-10T18:42:11Z",
"updated": "2026-03-10T18:42:11Z"
},
"created": "2026-03-10T18:42:11Z",
"updated": "2026-03-10T18:42:11Z"
}
Use this endpoint when time off is already approved and you want Plane to record
it directly for balances, scheduling, or payroll calculations. For request
workflows that still need review, use
Create a leave request.
Parameters
ID of the worker the leave belongs to.
Leave type for the leave.
List of ISO 8601 leave dates covered by the leave.
Optional note attached to the leave.
Returns
Returns the created Leave object.{
"id": "lv_1HPCXADYAhh5k1NMU0r1WUqs",
"status": "approved",
"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": "Imported from HRIS",
"request": {
"id": "lvr_6r3wLwX44s0Ak0bDkP5n2r7Q",
"status": "approved",
"created": "2026-03-10T18:42:11Z",
"updated": "2026-03-10T18:42:11Z"
},
"created": "2026-03-10T18:42:11Z",
"updated": "2026-03-10T18:42:11Z"
}
Was this page helpful?
⌘I