Skip to content

List duty arrangements

GET
/v1/rotations/{rotationId}/duty-arrangements
curl --request GET \
--url 'https://api.roundrobinbot.eu/v1/rotations/example/duty-arrangements?from=2026-04-15T12%3A00%3A00Z&to=2026-04-15T12%3A00%3A00Z' \
--header 'Authorization: Bearer <token>'

Requires read:oncall. Returns active arrangements overlapping a UTC range of at most 90 days. Cancelled arrangements are excluded. The response ETag identifies the rotation version for a later write. A range with missing bounds, a nonzero UTC offset or an end at or before its start returns 422 with invalidArrangementRange.

rotationId
required
string

The rotation identifier.

from
required
string format: date-time

The inclusive range start with UTC offset zero.

to
required
string format: date-time

The exclusive range end with UTC offset zero, at most 90 days after from.

OK

Media typeapplication/json

Active arrangements overlapping the requested range, with current cell capabilities.

object
asOfUtc
required

The instant every phase and capability in the response was evaluated.

string format: date-time
capabilities
required

Direct-assignment capability for each rotation cell.

Array<object>

Current direct-assignment capability for a rotation cell.

object
actionable
required

Whether to offer the assignment now: canAssign and no existingCommitment.

boolean
actionableReason
required

Why actionable is false: the reasonCode when canAssign is false, otherwise existingCommitment (an accepted cover or a swap leg holds the cell now). Null exactly when actionable is true.

null | string
canAssign
required

Whether the caller can submit a direct assignment, subject to term and conflict validation.

boolean
cellId
required

The rotation cell identifier.

string
eligibleUserIds
required

Slack user identifiers of current lane members, excluding known deactivated users and bots. An unknown profile does not remove lane membership.

Array<string>
reason
required

A refusal code when assignment is unavailable; otherwise null.

null | string
reasonCode
required

The same word as reason: why canAssign is false, null while it is true.

null | string
complete
required

Whether the full matching arrangement list was returned.

boolean
from
required

The requested inclusive UTC start.

string format: date-time
items
required

Matching arrangements ordered by start and identifier. Cancelled arrangements are excluded.

Array<object>

An interval assignment. Its recorded terms remain distinct from actual served history.

object
cellId
required

The rotation cell identifier.

string
changesAtUtc
required

The next instant at which phase changes, or null once it has ended.

null | string format: date-time
from
required

The inclusive UTC start.

string format: date-time
id
required

The arrangement identifier.

string
kind
required

directAssignment, acceptedCover or swapLeg. Direct-assignment writes change or end only directAssignment.

string
origin
One of:
null
originalSnapshot
One of:
null
phase
required

upcoming, running or ended, from from and to at the time the response is built.

string
revision
required

The arrangement revision used when changing or ending it.

integer format: int64
rotationId
required

The rotation identifier.

string
state
required

active or cancelled. An active record can describe an interval that has already ended.

string
to
required

The exclusive UTC end.

string format: date-time
turnSelection
One of:
null
userId
required

The assigned person’s Slack user identifier.

string
to
required

The requested exclusive UTC end.

string format: date-time
Examplegenerated
{
"asOfUtc": "2026-04-15T12:00:00Z",
"capabilities": [
{
"actionable": true,
"actionableReason": "example",
"canAssign": true,
"cellId": "example",
"eligibleUserIds": [
"example"
],
"reason": "example",
"reasonCode": "example"
}
],
"complete": true,
"from": "2026-04-15T12:00:00Z",
"items": [
{
"cellId": "example",
"changesAtUtc": "2026-04-15T12:00:00Z",
"from": "2026-04-15T12:00:00Z",
"id": "example",
"kind": "example",
"origin": {
"complete": true,
"userIds": [
"example"
]
},
"originalSnapshot": {
"asOfUtc": "2026-04-15T12:00:00Z",
"complete": true,
"from": "2026-04-15T12:00:00Z",
"segments": [
{
"from": "2026-04-15T12:00:00Z",
"resolved": true,
"to": "2026-04-15T12:00:00Z",
"userIds": [
"example"
]
}
],
"to": "2026-04-15T12:00:00Z"
},
"phase": "example",
"revision": 1,
"rotationId": "example",
"state": "example",
"to": "2026-04-15T12:00:00Z",
"turnSelection": {
"from": "2026-04-15T12:00:00Z",
"kind": "example",
"to": "2026-04-15T12:00:00Z"
},
"userId": "example"
}
],
"to": "2026-04-15T12:00:00Z"
}