Skip to content

List who is away

GET
/v1/rotations/{rotationId}/availability
curl --request GET \
--url https://api.roundrobinbot.eu/v1/rotations/example/availability \
--header 'Authorization: Bearer <token>'

Every absence covering a member of this rotation between from and to, which are both required and no more than 90 days apart. Absences that cover every rotation in the workspace are included, because they cover this one. Repeating absences are expanded, so one that falls three times inside the window is three entries carrying the same id. No ETag: this is a collection, and no single version stands behind it.

rotationId
required
string
from
string format: date-time
to
string format: date-time
page
integer | string format: int32
/^-?(?:0|[1-9]\d*)$/
pageSize
integer | string format: int32
/^-?(?:0|[1-9]\d*)$/
sort
string

OK

Media typeapplication/json

The envelope every /v1 collection comes back in.

object
data
Array<object>

A period a member of a rotation cannot take a shift.

object
id

The absence’s id, which is what the delete takes.

string
userId

The Slack user id of the person who is away.

string
from

When the absence starts, in UTC.

string format: date-time
until

When the absence ends, in UTC.

string format: date-time
reason

Whatever was recorded about why, or null. Free text, and never used for anything but display.

null | string
appliesTo

What the absence covers: rotation for one rotation, allRotations for every rotation in the workspace.

string
rotationIds

The rotations it covers when appliesTo is rotation, and empty otherwise.

Array<string>
recurring

Whether this absence repeats. A repeating absence can only be set in the dashboard, so anything the public API created answers false.

boolean
source

Where the absence came from. Always internalAvailability: these are the absences Round Robin stores and this API can delete, spelled the same way as the source on skippedForAbsence, so an absence and the skip it caused read as one vocabulary. An out-of-office event mirrored from a connected calendar is not one of these and is not returned here.

string
page
integer | string format: int32
/^-?(?:0|[1-9]\d*)$/
pageSize
integer | string format: int32
/^-?(?:0|[1-9]\d*)$/
totalItems
integer | string format: int64
/^-?(?:0|[1-9]\d*)$/
totalPages
integer | string format: int32
/^-?(?:0|[1-9]\d*)$/
Examplegenerated
{
"data": [
{
"id": "example",
"userId": "example",
"from": "2026-04-15T12:00:00Z",
"until": "2026-04-15T12:00:00Z",
"reason": "example",
"appliesTo": "example",
"rotationIds": [
"example"
],
"recurring": true,
"source": "example"
}
],
"page": 1,
"pageSize": 1,
"totalItems": 1,
"totalPages": 1
}

Bad Request

Media typeapplication/json
object
type
null | string
title
null | string
status
null | integer | string format: int32
/^-?(?:0|[1-9]\d*)$/
detail
null | string
instance
null | string
Examplegenerated
{
"type": "example",
"title": "example",
"status": 1,
"detail": "example",
"instance": "example"
}

Unauthorized

Media typeapplication/json
object
type
null | string
title
null | string
status
null | integer | string format: int32
/^-?(?:0|[1-9]\d*)$/
detail
null | string
instance
null | string
Examplegenerated
{
"type": "example",
"title": "example",
"status": 1,
"detail": "example",
"instance": "example"
}

Forbidden

Media typeapplication/json
object
type
null | string
title
null | string
status
null | integer | string format: int32
/^-?(?:0|[1-9]\d*)$/
detail
null | string
instance
null | string
Examplegenerated
{
"type": "example",
"title": "example",
"status": 1,
"detail": "example",
"instance": "example"
}

Not Found

Media typeapplication/json
object
type
null | string
title
null | string
status
null | integer | string format: int32
/^-?(?:0|[1-9]\d*)$/
detail
null | string
instance
null | string
Examplegenerated
{
"type": "example",
"title": "example",
"status": 1,
"detail": "example",
"instance": "example"
}