Create a position
curl --request POST \
--url https://api.plane.com/v1/positions \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"name": "<string>",
"plan": "<string>",
"location": {},
"employer": {},
"starts": "<string>",
"ends": "<string>",
"compensation": {}
}
'import requests
url = "https://api.plane.com/v1/positions"
payload = {
"name": "<string>",
"plan": "<string>",
"location": {},
"employer": {},
"starts": "<string>",
"ends": "<string>",
"compensation": {}
}
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({
name: '<string>',
plan: '<string>',
location: {},
employer: {},
starts: '<string>',
ends: '<string>',
compensation: {}
})
};
fetch('https://api.plane.com/v1/positions', 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/positions",
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([
'name' => '<string>',
'plan' => '<string>',
'location' => [
],
'employer' => [
],
'starts' => '<string>',
'ends' => '<string>',
'compensation' => [
]
]),
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/positions"
payload := strings.NewReader("{\n \"name\": \"<string>\",\n \"plan\": \"<string>\",\n \"location\": {},\n \"employer\": {},\n \"starts\": \"<string>\",\n \"ends\": \"<string>\",\n \"compensation\": {}\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/positions")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"name\": \"<string>\",\n \"plan\": \"<string>\",\n \"location\": {},\n \"employer\": {},\n \"starts\": \"<string>\",\n \"ends\": \"<string>\",\n \"compensation\": {}\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.plane.com/v1/positions")
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 \"name\": \"<string>\",\n \"plan\": \"<string>\",\n \"location\": {},\n \"employer\": {},\n \"starts\": \"<string>\",\n \"ends\": \"<string>\",\n \"compensation\": {}\n}"
response = http.request(request)
puts response.read_body{
"name": "Canada employee hire",
"plan": "wfp_R8mK2pQ9xL4s",
"location": { "country": "CA", "subdivision": "ON" },
"employer": { "type": "employee" },
"starts": "2026-09-01",
"compensation": {
"amount": "120000.00",
"currency": "CAD",
"unit": "year",
"basis": "regular",
"frequency": "monthly",
"source": { "type": "manual" }
}
}
{
"id": "pos_kP9r2NqW6mT4",
"object": "position",
"name": "Canada employee hire",
"status": "draft",
"plan": "wfp_R8mK2pQ9xL4s",
"job": null,
"worker": null,
"location": { "country": "CA", "subdivision": "ON" },
"employer": { "type": "employee" },
"starts": "2026-09-01",
"ends": null,
"compensation": {
"amount": "120000.00",
"currency": "CAD",
"unit": "year",
"basis": "regular",
"frequency": "monthly",
"source": { "type": "manual" }
},
"manager": null,
"department": null,
"metadata": {},
"created": "2026-05-27T12:00:00Z",
"updated": "2026-05-27T12:00:00Z"
}
Positions
Create a position
Create a planned, open, or filled workforce seat.
POST
/
v1
/
positions
Create a position
curl --request POST \
--url https://api.plane.com/v1/positions \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"name": "<string>",
"plan": "<string>",
"location": {},
"employer": {},
"starts": "<string>",
"ends": "<string>",
"compensation": {}
}
'import requests
url = "https://api.plane.com/v1/positions"
payload = {
"name": "<string>",
"plan": "<string>",
"location": {},
"employer": {},
"starts": "<string>",
"ends": "<string>",
"compensation": {}
}
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({
name: '<string>',
plan: '<string>',
location: {},
employer: {},
starts: '<string>',
ends: '<string>',
compensation: {}
})
};
fetch('https://api.plane.com/v1/positions', 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/positions",
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([
'name' => '<string>',
'plan' => '<string>',
'location' => [
],
'employer' => [
],
'starts' => '<string>',
'ends' => '<string>',
'compensation' => [
]
]),
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/positions"
payload := strings.NewReader("{\n \"name\": \"<string>\",\n \"plan\": \"<string>\",\n \"location\": {},\n \"employer\": {},\n \"starts\": \"<string>\",\n \"ends\": \"<string>\",\n \"compensation\": {}\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/positions")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"name\": \"<string>\",\n \"plan\": \"<string>\",\n \"location\": {},\n \"employer\": {},\n \"starts\": \"<string>\",\n \"ends\": \"<string>\",\n \"compensation\": {}\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.plane.com/v1/positions")
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 \"name\": \"<string>\",\n \"plan\": \"<string>\",\n \"location\": {},\n \"employer\": {},\n \"starts\": \"<string>\",\n \"ends\": \"<string>\",\n \"compensation\": {}\n}"
response = http.request(request)
puts response.read_body{
"name": "Canada employee hire",
"plan": "wfp_R8mK2pQ9xL4s",
"location": { "country": "CA", "subdivision": "ON" },
"employer": { "type": "employee" },
"starts": "2026-09-01",
"compensation": {
"amount": "120000.00",
"currency": "CAD",
"unit": "year",
"basis": "regular",
"frequency": "monthly",
"source": { "type": "manual" }
}
}
{
"id": "pos_kP9r2NqW6mT4",
"object": "position",
"name": "Canada employee hire",
"status": "draft",
"plan": "wfp_R8mK2pQ9xL4s",
"job": null,
"worker": null,
"location": { "country": "CA", "subdivision": "ON" },
"employer": { "type": "employee" },
"starts": "2026-09-01",
"ends": null,
"compensation": {
"amount": "120000.00",
"currency": "CAD",
"unit": "year",
"basis": "regular",
"frequency": "monthly",
"source": { "type": "manual" }
},
"manager": null,
"department": null,
"metadata": {},
"created": "2026-05-27T12:00:00Z",
"updated": "2026-05-27T12:00:00Z"
}
Use positions as the rows inside a workforce plan. Employee positions include
payroll-backed employment costs; contractor positions include contractor pay.
Parameters
string
Optional display name for the planned seat.
string
Workforce plan ID.
object
required
Position location.
object
required
Employer model for the position. Supported types are
employee and
contractor.string
required
Position start date.
string
Position end date.
object
required
Compensation input for the position.
Returns
Returns the created Position object.{
"name": "Canada employee hire",
"plan": "wfp_R8mK2pQ9xL4s",
"location": { "country": "CA", "subdivision": "ON" },
"employer": { "type": "employee" },
"starts": "2026-09-01",
"compensation": {
"amount": "120000.00",
"currency": "CAD",
"unit": "year",
"basis": "regular",
"frequency": "monthly",
"source": { "type": "manual" }
}
}
{
"id": "pos_kP9r2NqW6mT4",
"object": "position",
"name": "Canada employee hire",
"status": "draft",
"plan": "wfp_R8mK2pQ9xL4s",
"job": null,
"worker": null,
"location": { "country": "CA", "subdivision": "ON" },
"employer": { "type": "employee" },
"starts": "2026-09-01",
"ends": null,
"compensation": {
"amount": "120000.00",
"currency": "CAD",
"unit": "year",
"basis": "regular",
"frequency": "monthly",
"source": { "type": "manual" }
},
"manager": null,
"department": null,
"metadata": {},
"created": "2026-05-27T12:00:00Z",
"updated": "2026-05-27T12:00:00Z"
}
Was this page helpful?
⌘I