Create an offer
curl --request POST \
--url https://api.plane.com/v1/offers \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"recipient": {},
"terms": {},
"expires": "<string>",
"metadata": {}
}
'import requests
url = "https://api.plane.com/v1/offers"
payload = {
"recipient": {},
"terms": {},
"expires": "<string>",
"metadata": {}
}
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({recipient: {}, terms: {}, expires: '<string>', metadata: {}})
};
fetch('https://api.plane.com/v1/offers', 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/offers",
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([
'recipient' => [
],
'terms' => [
],
'expires' => '<string>',
'metadata' => [
]
]),
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/offers"
payload := strings.NewReader("{\n \"recipient\": {},\n \"terms\": {},\n \"expires\": \"<string>\",\n \"metadata\": {}\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/offers")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"recipient\": {},\n \"terms\": {},\n \"expires\": \"<string>\",\n \"metadata\": {}\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.plane.com/v1/offers")
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 \"recipient\": {},\n \"terms\": {},\n \"expires\": \"<string>\",\n \"metadata\": {}\n}"
response = http.request(request)
puts response.read_body{
"recipient": {
"name": "Jane Smith",
"email": "jane@example.com"
},
"terms": {
"role": {
"title": "Software Engineer",
"responsibilities": "Build and maintain Plane's payroll platform."
},
"employment": {
"starts": "2026-07-15",
"types": ["employee"],
"countries": ["US"]
},
"compensations": [
{
"label": "Base salary",
"amount": "180000.00",
"currency": "USD",
"unit": "year",
"frequency": "twice_monthly",
"stock": "10000 stock options"
}
],
"benefits": [
{
"name": "Health insurance",
"description": "Medical, dental, and vision coverage.",
"icon": "heart-pulse"
}
]
},
"expires": "2026-06-20T23:59:59Z",
"metadata": {}
}
{
"id": "ofr_8kY3pQmNvT2sW9xF",
"object": "offer",
"workspace": "ws_5kR2nLpXvH8dM3yT",
"status": "draft",
"recipient": {
"name": "Jane Smith",
"email": "jane@example.com"
},
"terms": {
"role": {
"title": "Software Engineer",
"responsibilities": "Build and maintain Plane's payroll platform."
},
"employment": {
"starts": "2026-07-15",
"types": ["employee"],
"countries": ["US"]
},
"compensations": [
{
"label": "Base salary",
"amount": "180000.00",
"currency": "USD",
"unit": "year",
"frequency": "twice_monthly",
"stock": "10000 stock options",
"other": null
}
],
"benefits": []
},
"position": null,
"job": null,
"expires": "2026-06-20T23:59:59Z",
"delivery": null,
"decision": null,
"document": null,
"worker": null,
"onboarding": null,
"metadata": {},
"created": "2026-06-13T16:45:00Z",
"updated": "2026-06-13T16:45:00Z"
}
Offers
Create an offer
Create a draft employment offer.
POST
/
v1
/
offers
Create an offer
curl --request POST \
--url https://api.plane.com/v1/offers \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"recipient": {},
"terms": {},
"expires": "<string>",
"metadata": {}
}
'import requests
url = "https://api.plane.com/v1/offers"
payload = {
"recipient": {},
"terms": {},
"expires": "<string>",
"metadata": {}
}
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({recipient: {}, terms: {}, expires: '<string>', metadata: {}})
};
fetch('https://api.plane.com/v1/offers', 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/offers",
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([
'recipient' => [
],
'terms' => [
],
'expires' => '<string>',
'metadata' => [
]
]),
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/offers"
payload := strings.NewReader("{\n \"recipient\": {},\n \"terms\": {},\n \"expires\": \"<string>\",\n \"metadata\": {}\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/offers")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"recipient\": {},\n \"terms\": {},\n \"expires\": \"<string>\",\n \"metadata\": {}\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.plane.com/v1/offers")
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 \"recipient\": {},\n \"terms\": {},\n \"expires\": \"<string>\",\n \"metadata\": {}\n}"
response = http.request(request)
puts response.read_body{
"recipient": {
"name": "Jane Smith",
"email": "jane@example.com"
},
"terms": {
"role": {
"title": "Software Engineer",
"responsibilities": "Build and maintain Plane's payroll platform."
},
"employment": {
"starts": "2026-07-15",
"types": ["employee"],
"countries": ["US"]
},
"compensations": [
{
"label": "Base salary",
"amount": "180000.00",
"currency": "USD",
"unit": "year",
"frequency": "twice_monthly",
"stock": "10000 stock options"
}
],
"benefits": [
{
"name": "Health insurance",
"description": "Medical, dental, and vision coverage.",
"icon": "heart-pulse"
}
]
},
"expires": "2026-06-20T23:59:59Z",
"metadata": {}
}
{
"id": "ofr_8kY3pQmNvT2sW9xF",
"object": "offer",
"workspace": "ws_5kR2nLpXvH8dM3yT",
"status": "draft",
"recipient": {
"name": "Jane Smith",
"email": "jane@example.com"
},
"terms": {
"role": {
"title": "Software Engineer",
"responsibilities": "Build and maintain Plane's payroll platform."
},
"employment": {
"starts": "2026-07-15",
"types": ["employee"],
"countries": ["US"]
},
"compensations": [
{
"label": "Base salary",
"amount": "180000.00",
"currency": "USD",
"unit": "year",
"frequency": "twice_monthly",
"stock": "10000 stock options",
"other": null
}
],
"benefits": []
},
"position": null,
"job": null,
"expires": "2026-06-20T23:59:59Z",
"delivery": null,
"decision": null,
"document": null,
"worker": null,
"onboarding": null,
"metadata": {},
"created": "2026-06-13T16:45:00Z",
"updated": "2026-06-13T16:45:00Z"
}
Create an offer with the proposed recipient and employment terms. The request
uses the workspace from the API key or OAuth token.
This endpoint creates a
draft offer. Use
Send an offer after the offer is ready to send.
Use an Idempotency-Key header when retrying create requests. See
Idempotency.
Use an Idempotency-Key header when retrying create requests. See
Idempotency.
Parameters
object
required
Recipient name and email.
object
required
Proposed role, employment constraints, compensations, and benefits.
string
Offer expiration timestamp.
object
Set of key-value pairs to attach to the offer.
Returns
Returns the created Offer object.{
"recipient": {
"name": "Jane Smith",
"email": "jane@example.com"
},
"terms": {
"role": {
"title": "Software Engineer",
"responsibilities": "Build and maintain Plane's payroll platform."
},
"employment": {
"starts": "2026-07-15",
"types": ["employee"],
"countries": ["US"]
},
"compensations": [
{
"label": "Base salary",
"amount": "180000.00",
"currency": "USD",
"unit": "year",
"frequency": "twice_monthly",
"stock": "10000 stock options"
}
],
"benefits": [
{
"name": "Health insurance",
"description": "Medical, dental, and vision coverage.",
"icon": "heart-pulse"
}
]
},
"expires": "2026-06-20T23:59:59Z",
"metadata": {}
}
{
"id": "ofr_8kY3pQmNvT2sW9xF",
"object": "offer",
"workspace": "ws_5kR2nLpXvH8dM3yT",
"status": "draft",
"recipient": {
"name": "Jane Smith",
"email": "jane@example.com"
},
"terms": {
"role": {
"title": "Software Engineer",
"responsibilities": "Build and maintain Plane's payroll platform."
},
"employment": {
"starts": "2026-07-15",
"types": ["employee"],
"countries": ["US"]
},
"compensations": [
{
"label": "Base salary",
"amount": "180000.00",
"currency": "USD",
"unit": "year",
"frequency": "twice_monthly",
"stock": "10000 stock options",
"other": null
}
],
"benefits": []
},
"position": null,
"job": null,
"expires": "2026-06-20T23:59:59Z",
"delivery": null,
"decision": null,
"document": null,
"worker": null,
"onboarding": null,
"metadata": {},
"created": "2026-06-13T16:45:00Z",
"updated": "2026-06-13T16:45:00Z"
}
Was this page helpful?
⌘I