Preview restored duty
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/example/restore-preview"), 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/example/restore-preview"
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/example/restore-preview") .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/example/restore-preview', 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/example/restore-preview';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/example/restore-preview \ --header 'Authorization: Bearer <token>'Requires read:oncall, write:duty and rotation edit authority. The assignment must permit ending. Projects the remaining interval without this assignment, using the current schedule and availability. No duty changes. Inspect complete and each segment’s resolved value before identifying returning holders. An incomplete result does not confirm all holders. The original recorded holders can differ from this preview. To end the assignment, send arrangementRevision as expectedRevision and the response ETag in If-Match. Fetch another preview after a stale revision or ETag refusal and review the result before retrying.
Authorizations
Section titled “Authorizations”Parameters
Section titled “Parameters”Path Parameters
Section titled “Path Parameters”The rotation identifier.
The active direct assignment to preview ending.
Responses
Section titled “Responses”OK
Effective duty after ending the assignment, projected from the current schedule and availability.
object
The UTC time of the preview.
The later of the assignment start and preview time.
The exclusive UTC end of the assignment.
Whether duty is resolved throughout the remaining interval. False means the preview cannot confirm all returning holders.
Projected holders by interval after ending this assignment.
Effective duty during part of an assignment interval.
object
The inclusive UTC start.
The exclusive UTC end.
Slack user identifiers of the effective holders. An empty list means no assignee only when resolved is true.
Whether the holders or absence of duty are known for this interval.
Whether the returning holders differ from the original holders. Null when either result is incomplete.
The revision to submit as expectedRevision when ending the assignment. Use the response ETag in If-Match.
Examplegenerated
{ "asOfUtc": "2026-04-15T12:00:00Z", "from": "2026-04-15T12:00:00Z", "to": "2026-04-15T12:00:00Z", "complete": true, "segments": [ { "from": "2026-04-15T12:00:00Z", "to": "2026-04-15T12:00:00Z", "userIds": [ "example" ], "resolved": true } ], "originalDiffers": true, "arrangementRevision": 1}