Skip to content
Keptslot
Start free

List open slots

GET
/v1/availability
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.

service_id
required
string format: uuid
from
required
string format: date-time

An RFC3339 timestamp. The start of the range.

to
required
string format: date-time

An RFC3339 timestamp. It must be after from, and no more than 62 days after it.

exclude_booking_id
string format: uuid

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.

The open slots in the range, grouped by calendar.

Media type application/json
object
data
required
Array<object>
object
staff_id
required

The calendar these slots belong to.

string format: uuid
slots
required
Array<object>
object
start
required

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.

string format: date-time
end
required
string format: date-time
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.

Media type application/json
object
error
required
object
type
required

A stable machine-readable code. Match on this.

string
message
required

A sentence for a person. Do not match on this.

string
param

The field that caused the refusal, if one field did.

string
dimension

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.

string
used

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.

integer format: int64
limit

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.

integer format: int64
Example generated
{
"error": {
"type": "example",
"message": "example",
"param": "example",
"dimension": "example",
"used": 1,
"limit": 1
}
}

There is no such resource in this workspace.

Media type application/json
object
error
required
object
type
required

A stable machine-readable code. Match on this.

string
message
required

A sentence for a person. Do not match on this.

string
param

The field that caused the refusal, if one field did.

string
dimension

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.

string
used

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.

integer format: int64
limit

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.

integer format: int64
Example generated
{
"error": {
"type": "example",
"message": "example",
"param": "example",
"dimension": "example",
"used": 1,
"limit": 1
}
}

The request body or the query is not valid.

Media type application/json
object
error
required
object
type
required

A stable machine-readable code. Match on this.

string
message
required

A sentence for a person. Do not match on this.

string
param

The field that caused the refusal, if one field did.

string
dimension

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.

string
used

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.

integer format: int64
limit

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.

integer format: int64
Example generated
{
"error": {
"type": "example",
"message": "example",
"param": "example",
"dimension": "example",
"used": 1,
"limit": 1
}
}