Get personal shifts
using System.Net.Http.Headers;var client = new HttpClient();var request = new HttpRequestMessage{ Method = HttpMethod.Get, RequestUri = new Uri("https://api.roundrobinbot.eu/v1/users/example/shifts"), 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/users/example/shifts"
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/users/example/shifts") .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/users/example/shifts', 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/users/example/shifts';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/users/example/shifts \ --header 'Authorization: Bearer <token>'Requires read:oncall. Returns recorded and projected shifts for a Slack user in the API key’s workspace. Request a range of at most 31 days. Workspaces with more than 1000 rotations or callers with more than 100 accessible rotations are refused. Read every page and inspect each rotation’s completion and limitation codes before concluding that no duty exists. Each rotation has its own asOfUtc. Pages are fresh reads and do not share a fixed snapshot.
Authorizations
Section titled “Authorizations”Parameters
Section titled “Parameters”Path Parameters
Section titled “Path Parameters”The Slack user identifier.
Query Parameters
Section titled “Query Parameters”Required inclusive range start as an RFC 3339 timestamp.
Required exclusive range end, after from and at most 31 days later.
Page number, starting at 1. Defaults to 1. Values beyond the last page return the last page; an empty result returns page 1.
Rows per page, from 1 to 100. Defaults to 25.
Responses
Section titled “Responses”OK
A page of a person’s recorded and projected shifts across accessible rotations.
object
unknown: this response does not establish the freshness of availability sources.
A recorded or projected duty interval for the requested person.
object
The cell identifier, when available.
The earliest later instant at which phase changes by the clock alone: the start while upcoming, the end while running. Absent when it will not change.
The Plan display-row identifier, when available.
The exclusive interval end. Null means no end is known.
The lane identifier, when available.
Whether this interval begins at the start of the person’s turn. A turn on a window with hours is several intervals, one per opening, and only the first claims the start; the rest begin because cover opened. False at an edge created by splitting at the rotation’s asOfUtc, so a turn already part spent claims no start.
upcoming, running or ended: where the interval stands against the instant the response is read, the half-open [start, end) with no end meaning it never ends.
The Round Robin rotation identifier.
The rotation name.
history for recorded duty or projected for projected duty.
The inclusive interval start. Clip the displayed interval to the requested range.
The holder’s position in the list the cell deals from. It is a position and not a counter, so a three-person weekly rotation deals turn 0 again three weeks later: group openings by cell, user and turn, and cut the group at each row where onDutySinceIsDutyShift is true.
The Slack user identifier of the person assigned to this interval.
The coverage-window identifier, when available.
unsupported: this response does not identify the nominal holder beneath a substitution.
Read states for all accessible rotations examined for this request, including rotations with no matching shifts.
A rotation’s read state and limits on its projected shifts.
object
The instant separating this rotation’s history from projected duty. Other rotations may use different instants.
incomplete when future external duty is requested without a successful provider read; otherwise complete. Check limitationCodes separately.
projectionUnavailable when the rotation could not be projected on this page.
The limitations of this read: randomFutureUnknown for unknown randomized future duty, manualFutureContingent for duty dependent on a manual change.
One reason a read is not exhaustive, with the availability source it concerns when it concerns one.
object
The reason, one of recurrenceExpansionIncomplete, manualAvailabilityUnavailable, googleCalendarUnavailable, proposalRecurrenceIncomplete, externalRotation, rotationDisabled, calendarFreshnessUnknown, projectionUnavailable, candidateHorizon, randomFutureUnknown or manualFutureContingent.
The availability source the reason is about, manualAvailability or googleCalendar. Absent when it is about no source.
read, unreachable or notAsked for the external schedule provider. This is not availability-source freshness.
The Round Robin rotation identifier.
Examplegenerated
{ "availabilityFreshness": "example", "data": [ { "actions": { "canChangeAssignment": true, "canRequestCover": true }, "cellId": "example", "changesAtUtc": "2026-04-15T12:00:00Z", "displayRowId": "example", "end": "2026-04-15T12:00:00Z", "laneId": "example", "onDutySinceIsDutyShift": true, "phase": "example", "rotationId": "example", "rotationName": "example", "source": "example", "start": "2026-04-15T12:00:00Z", "turn": 1, "userId": "example", "windowId": "example" } ], "nominalProvenance": "example", "page": 1, "pageSize": 1, "rotations": [ { "asOfUtc": "2026-04-15T12:00:00Z", "completion": "example", "failureReason": "example", "limitationCodes": [ { "code": "example", "source": "example" } ], "providerReach": "example", "rotationId": "example" } ], "totalItems": 1, "totalPages": 1}