Update PTO earned
curl --request PATCH \
--url https://{your-subdomain}.neetoinvoice.com/api/external/v2/monthly-ptos/update-earned \
--header 'Content-Type: application/json' \
--header 'X-Api-Key: <x-api-key>' \
--data '
{
"emails": [
"oliver@example.com",
"sam@example.com"
],
"month": 10,
"year": 2026,
"pto_earned": 12
}
'const options = {
method: 'PATCH',
headers: {'X-Api-Key': '<x-api-key>', 'Content-Type': 'application/json'},
body: JSON.stringify({
emails: ['oliver@example.com', 'sam@example.com'],
month: 10,
year: 2026,
pto_earned: 12
})
};
fetch('https://{your-subdomain}.neetoinvoice.com/api/external/v2/monthly-ptos/update-earned', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));import requests
url = "https://{your-subdomain}.neetoinvoice.com/api/external/v2/monthly-ptos/update-earned"
payload = {
"emails": ["oliver@example.com", "sam@example.com"],
"month": 10,
"year": 2026,
"pto_earned": 12
}
headers = {
"X-Api-Key": "<x-api-key>",
"Content-Type": "application/json"
}
response = requests.patch(url, json=payload, headers=headers)
print(response.text){
"month": 10,
"year": 2026,
"updated": [
{
"user_email": "jsmith@example.com",
"pto_earned": 123,
"net_pto": 123
}
],
"skipped": [
{
"user_email": "jsmith@example.com",
"reason": "User not found"
}
]
}Monthly PTO
Update PTO earned
Set the PTO earned for a month for one or more users. The value is in hours. Emails are matched case-insensitively and duplicates are ignored. An email that matches no active user is listed under skipped. A user whose PTO for that month is locked is also skipped and listed under skipped with the reason “Monthly PTO is locked”.
PATCH
/
monthly-ptos
/
update-earned
Update PTO earned
curl --request PATCH \
--url https://{your-subdomain}.neetoinvoice.com/api/external/v2/monthly-ptos/update-earned \
--header 'Content-Type: application/json' \
--header 'X-Api-Key: <x-api-key>' \
--data '
{
"emails": [
"oliver@example.com",
"sam@example.com"
],
"month": 10,
"year": 2026,
"pto_earned": 12
}
'const options = {
method: 'PATCH',
headers: {'X-Api-Key': '<x-api-key>', 'Content-Type': 'application/json'},
body: JSON.stringify({
emails: ['oliver@example.com', 'sam@example.com'],
month: 10,
year: 2026,
pto_earned: 12
})
};
fetch('https://{your-subdomain}.neetoinvoice.com/api/external/v2/monthly-ptos/update-earned', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));import requests
url = "https://{your-subdomain}.neetoinvoice.com/api/external/v2/monthly-ptos/update-earned"
payload = {
"emails": ["oliver@example.com", "sam@example.com"],
"month": 10,
"year": 2026,
"pto_earned": 12
}
headers = {
"X-Api-Key": "<x-api-key>",
"Content-Type": "application/json"
}
response = requests.patch(url, json=payload, headers=headers)
print(response.text){
"month": 10,
"year": 2026,
"updated": [
{
"user_email": "jsmith@example.com",
"pto_earned": 123,
"net_pto": 123
}
],
"skipped": [
{
"user_email": "jsmith@example.com",
"reason": "User not found"
}
]
}Replace
Learn how to find your subdomain in Workspace subdomain.
{your-subdomain} with your workspace’s subdomain. Learn how to find your subdomain in Workspace subdomain.
Headers
Use the X-Api-Key header to provide your workspace API key. Refer to Authentication for more information.
Body
application/json
Response
200 - application/json
OK - Request succeeded
Example:
10
Example:
2026