Add time off
const url = 'https://api.keptslot.com/v1/staff/2489E9AD-2EE2-8E00-8EC9-32D5F69181C0/time-off';const options = { method: 'POST', headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'}, body: '{"starts_at":"2026-09-10T00:00:00+01:00","ends_at":"2026-09-17T00:00:00+01:00","reason":"Annual leave"}'};
try { const response = await fetch(url, options); const data = await response.json(); console.log(data);} catch (error) { console.error(error);}curl --request POST \ --url https://api.keptslot.com/v1/staff/2489E9AD-2EE2-8E00-8EC9-32D5F69181C0/time-off \ --header 'Authorization: Bearer <token>' \ --header 'Content-Type: application/json' \ --data '{ "starts_at": "2026-09-10T00:00:00+01:00", "ends_at": "2026-09-17T00:00:00+01:00", "reason": "Annual leave" }'This endpoint blocks a period on one calendar. Availability removes the period.
It does not cancel a booking that already sits inside the period.
Authorizations
Section titled “ Authorizations ”Parameters
Section titled “ Parameters ”Path Parameters
Section titled “ Path Parameters ”The calendar id.
Request Body required
Section titled “ Request Body required ”object
Example
{ "starts_at": "2026-09-10T00:00:00+01:00", "ends_at": "2026-09-17T00:00:00+01:00", "reason": "Annual leave"}Responses
Section titled “ Responses ”The time off is added.
object
Example generated
{ "id": "2489E9AD-2EE2-8E00-8EC9-32D5F69181C0", "staff_id": "2489E9AD-2EE2-8E00-8EC9-32D5F69181C0", "starts_at": "2026-04-15T12:00:00Z", "ends_at": "2026-04-15T12:00:00Z", "reason": "example"}The key is missing, malformed or revoked.
object
object
A stable machine-readable code. Match on this.
A sentence for a person. Do not match on this.
The field that caused the refusal, if one field did.
The plan limit that refused the request. It is present only on a 402, and only for a secret key or an account key. See the errors guide.
The current count for that dimension. It is present only on a 402, and only for an account key. It is absent when the refusal has no count to report. Absent and zero are different answers.
The cap for that dimension. It is present only on a 402, and only for an account key. A cap of zero is a real value.
Example generated
{ "error": { "type": "example", "message": "example", "param": "example", "dimension": "example", "used": 1, "limit": 1 }}There is no such resource in this workspace.
object
object
A stable machine-readable code. Match on this.
A sentence for a person. Do not match on this.
The field that caused the refusal, if one field did.
The plan limit that refused the request. It is present only on a 402, and only for a secret key or an account key. See the errors guide.
The current count for that dimension. It is present only on a 402, and only for an account key. It is absent when the refusal has no count to report. Absent and zero are different answers.
The cap for that dimension. It is present only on a 402, and only for an account key. A cap of zero is a real value.
Example generated
{ "error": { "type": "example", "message": "example", "param": "example", "dimension": "example", "used": 1, "limit": 1 }}The request body or the query is not valid.
object
object
A stable machine-readable code. Match on this.
A sentence for a person. Do not match on this.
The field that caused the refusal, if one field did.
The plan limit that refused the request. It is present only on a 402, and only for a secret key or an account key. See the errors guide.
The current count for that dimension. It is present only on a 402, and only for an account key. It is absent when the refusal has no count to report. Absent and zero are different answers.
The cap for that dimension. It is present only on a 402, and only for an account key. A cap of zero is a real value.
Example generated
{ "error": { "type": "example", "message": "example", "param": "example", "dimension": "example", "used": 1, "limit": 1 }}