List duty arrangements
using System.Net.Http.Headers;var client = new HttpClient();var request = new HttpRequestMessage{ Method = HttpMethod.Get, RequestUri = new Uri("https://api.roundrobinbot.eu/v1/rotations/example/duty-arrangements?from=2026-04-15T12%3A00%3A00Z&to=2026-04-15T12%3A00%3A00Z"), Headers = { { "Authorization", "Bearer <token>" }, },};using (var response = await client.SendAsync(request)){ response.EnsureSuccessStatusCode(); var body = await response.Content.ReadAsStringAsync(); Console.WriteLine(body);}package main
import ( "fmt" "net/http" "io")
func main() {
url := "https://api.roundrobinbot.eu/v1/rotations/example/duty-arrangements?from=2026-04-15T12%3A00%3A00Z&to=2026-04-15T12%3A00%3A00Z"
req, _ := http.NewRequest("GET", url, nil)
req.Header.Add("Authorization", "Bearer <token>")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close() body, _ := io.ReadAll(res.Body)
fmt.Println(res) fmt.Println(string(body))
}OkHttpClient client = new OkHttpClient();
Request request = new Request.Builder() .url("https://api.roundrobinbot.eu/v1/rotations/example/duty-arrangements?from=2026-04-15T12%3A00%3A00Z&to=2026-04-15T12%3A00%3A00Z") .get() .addHeader("Authorization", "Bearer <token>") .build();
Response response = client.newCall(request).execute();import axios from 'axios';
const options = { method: 'GET', url: 'https://api.roundrobinbot.eu/v1/rotations/example/duty-arrangements', params: {from: '2026-04-15T12:00:00Z', to: '2026-04-15T12:00:00Z'}, headers: {Authorization: 'Bearer <token>'}};
try { const { data } = await axios.request(options); console.log(data);} catch (error) { console.error(error);}const url = 'https://api.roundrobinbot.eu/v1/rotations/example/duty-arrangements?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.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.
Authorizations
Section titled “Authorizations”Parameters
Section titled “Parameters”Path Parameters
Section titled “Path Parameters”The rotation identifier.
Query Parameters
Section titled “Query Parameters”The inclusive range start with UTC offset zero.
The exclusive range end with UTC offset zero, at most 90 days after from.
Responses
Section titled “Responses”OK
Active arrangements overlapping the requested range, with current cell capabilities.
object
The instant every phase and capability in the response was evaluated.
Direct-assignment capability for each rotation cell.
Current direct-assignment capability for a rotation cell.
object
Whether to offer the assignment now: canAssign and no existingCommitment.
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.
Whether the caller can submit a direct assignment, subject to term and conflict validation.
The rotation cell identifier.
Slack user identifiers of current lane members, excluding known deactivated users and bots. An unknown profile does not remove lane membership.
A refusal code when assignment is unavailable; otherwise null.
The same word as reason: why canAssign is false, null while it is true.
Whether the full matching arrangement list was returned.
The requested inclusive UTC start.
Matching arrangements ordered by start and identifier. Cancelled arrangements are excluded.
An interval assignment. Its recorded terms remain distinct from actual served history.
object
The rotation cell identifier.
The next instant at which phase changes, or null once it has ended.
The inclusive UTC start.
The arrangement identifier.
directAssignment, acceptedCover or swapLeg. Direct-assignment writes change or end only directAssignment.
Original duty holders recorded before the first assignment, with completeness for this interval. Later edits retain that original record.
object
Whether original duty is known throughout the interval. False includes assignments without an original record.
Distinct Slack user identifiers in the recorded portion of the arrangement interval.
Original duty segments on detail reads. Null on list reads or when no original record is available.
object
The UTC time when the original duty was evaluated.
Whether every returned segment is resolved. An extension beyond the original recorded interval is unresolved.
The inclusive UTC start of the returned interval.
Original holders by interval, including periods with no assignee and unresolved periods.
Effective duty during part of an assignment interval.
object
The inclusive UTC start.
Whether the holders or absence of duty are known for this interval.
The exclusive UTC end.
Slack user identifiers of the effective holders. An empty list means no assignee only when resolved is true.
The exclusive UTC end of the returned interval.
upcoming, running or ended, from from and to at the time the response is built.
The arrangement revision used when changing or ending it.
The rotation identifier.
active or cancelled. An active record can describe an interval that has already ended.
The exclusive UTC end.
The recorded full or remaining turn, or null when no verified selection was saved. Use the arrangement’s From and To for the affected interval.
object
The inclusive UTC start of the original turn, including any part already served.
fullTurn or remainingTurn.
The exclusive UTC end of the original turn.
The assigned person’s Slack user identifier.
The requested exclusive UTC end.
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"}