List open slots
const url = 'https://api.keptslot.com/v1/availability?service_id=2489E9AD-2EE2-8E00-8EC9-32D5F69181C0&from=2026-04-15T12%3A00%3A00Z&to=2026-04-15T12%3A00%3A00Z';const options = {method: 'GET', headers: {Authorization: 'Bearer <token>'}};
try { const response = await fetch(url, options); const data = await response.json(); console.log(data);} catch (error) { console.error(error);}curl --request GET \ --url 'https://api.keptslot.com/v1/availability?service_id=2489E9AD-2EE2-8E00-8EC9-32D5F69181C0&from=2026-04-15T12%3A00%3A00Z&to=2026-04-15T12%3A00%3A00Z' \ --header 'Authorization: Bearer <token>'This endpoint gives the times a customer can book for one service. The response groups the slots by calendar.
Give a range of 62 days or less. If the range is longer, the endpoint refuses the request with a 422.
All times in the response use the workspace timezone.
Authorizations
Section titled “ Authorizations ”Parameters
Section titled “ Parameters ”Query Parameters
Section titled “ Query Parameters ”An RFC3339 timestamp. The start of the range.
An RFC3339 timestamp. It must be after from, and no more than 62
days after it.
Removes one booking from the busy times. If you move a booking, use this parameter. Then the slot that the booking holds now stays available to it.
If you send this parameter with an empty value, the endpoint refuses the request with a 422. An empty value is not the same as an absent one.
Responses
Section titled “ Responses ”The open slots in the range, grouped by calendar.
object
object
The calendar these slots belong to.
object
The start of the slot, in the workspace timezone. The appointment happens at the business, so the offset is the business’s and not the customer’s.
Example
{ "data": [ { "staff_id": "6f1c0b52-9a3e-4f77-8d21-0b5a2c9e4d10", "slots": [ { "start": "2026-09-01T09:00:00+01:00", "end": "2026-09-01T09:30:00+01:00" }, { "start": "2026-09-01T09:30:00+01:00", "end": "2026-09-01T10:00:00+01:00" } ] } ]}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 }}