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 projection limitations 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
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
projectionUnavailable when the rotation could not be projected on this page.
The Round Robin rotation identifier.
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 projection limitations separately.
read, unreachable or notAsked for the external schedule provider. This is not availability-source freshness.
randomFutureUnknown for unknown randomized future duty; manualFutureContingent for duty dependent on a manual change.
unsupported: this response does not identify the nominal holder beneath a substitution.
unknown: this response does not establish the freshness of availability sources.
A recorded or projected duty interval for the requested person.
object
The Round Robin rotation identifier.
The rotation name.
The cell identifier, when available.
The lane identifier, when available.
The coverage-window identifier, when available.
The Plan display-row identifier, when available.
The inclusive interval start. Clip the displayed interval to the requested range.
The exclusive interval end. Null means no end is known.
The Slack user identifier of the person assigned to this interval.
history for recorded duty or projected for projected duty.
Examplegenerated
{ "rotations": [ { "failureReason": "example", "rotationId": "example", "asOfUtc": "2026-04-15T12:00:00Z", "completion": "example", "providerReach": "example", "projectionLimitations": [ "example" ] } ], "nominalProvenance": "example", "availabilityFreshness": "example", "data": [ { "actions": { "canRequestCover": true, "canChangeAssignment": true }, "rotationId": "example", "rotationName": "example", "cellId": "example", "laneId": "example", "windowId": "example", "displayRowId": "example", "start": "2026-04-15T12:00:00Z", "end": "2026-04-15T12:00:00Z", "userId": "example", "source": "example" } ], "page": 1, "pageSize": 1, "totalItems": 1, "totalPages": 1}