Preview availability impact
using System.Net.Http.Headers;var client = new HttpClient();var request = new HttpRequestMessage{ Method = HttpMethod.Post, RequestUri = new Uri("https://api.roundrobinbot.eu/v1/teams/example/availability/impact-preview"), Headers = { { "Authorization", "Bearer <token>" }, }, Content = new StringContent("{ \"afterRotationId\": \"example\", \"expectedPreviewRevision\": \"example\", \"previewFrom\": \"2026-04-15T12:00:00Z\", \"previewTo\": \"2026-04-15T12:00:00Z\", \"proposal\": { \"endTime\": \"2026-04-15T12:00:00Z\", \"isActive\": true, \"reason\": \"example\", \"recurrenceRule\": { \"dayOfMonth\": 1, \"daysOfWeek\": [ \"sunday\" ], \"endDateUtc\": \"2026-04-15T12:00:00Z\", \"endType\": 1, \"interval\": 1, \"maxOccurrences\": 1, \"nthWeekdayDayOfWeek\": \"sunday\", \"type\": 1, \"weekOfMonth\": 1 }, \"rotationIds\": [ \"example\" ], \"rotationScope\": 1, \"startTime\": \"2026-04-15T12:00:00Z\", \"timeZone\": \"example\" }, \"replacedSettingId\": \"example\", \"rotationLimit\": 1 }") { Headers = { ContentType = new MediaTypeHeaderValue("application/*+json") } }};using (var response = await client.SendAsync(request)){ response.EnsureSuccessStatusCode(); var body = await response.Content.ReadAsStringAsync(); Console.WriteLine(body);}package main
import ( "fmt" "strings" "net/http" "io")
func main() {
url := "https://api.roundrobinbot.eu/v1/teams/example/availability/impact-preview"
payload := strings.NewReader("{ \"afterRotationId\": \"example\", \"expectedPreviewRevision\": \"example\", \"previewFrom\": \"2026-04-15T12:00:00Z\", \"previewTo\": \"2026-04-15T12:00:00Z\", \"proposal\": { \"endTime\": \"2026-04-15T12:00:00Z\", \"isActive\": true, \"reason\": \"example\", \"recurrenceRule\": { \"dayOfMonth\": 1, \"daysOfWeek\": [ \"sunday\" ], \"endDateUtc\": \"2026-04-15T12:00:00Z\", \"endType\": 1, \"interval\": 1, \"maxOccurrences\": 1, \"nthWeekdayDayOfWeek\": \"sunday\", \"type\": 1, \"weekOfMonth\": 1 }, \"rotationIds\": [ \"example\" ], \"rotationScope\": 1, \"startTime\": \"2026-04-15T12:00:00Z\", \"timeZone\": \"example\" }, \"replacedSettingId\": \"example\", \"rotationLimit\": 1 }")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("Authorization", "Bearer <token>") req.Header.Add("Content-Type", "application/*+json")
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();
MediaType mediaType = MediaType.parse("application/*+json");RequestBody body = RequestBody.create(mediaType, "{ \"afterRotationId\": \"example\", \"expectedPreviewRevision\": \"example\", \"previewFrom\": \"2026-04-15T12:00:00Z\", \"previewTo\": \"2026-04-15T12:00:00Z\", \"proposal\": { \"endTime\": \"2026-04-15T12:00:00Z\", \"isActive\": true, \"reason\": \"example\", \"recurrenceRule\": { \"dayOfMonth\": 1, \"daysOfWeek\": [ \"sunday\" ], \"endDateUtc\": \"2026-04-15T12:00:00Z\", \"endType\": 1, \"interval\": 1, \"maxOccurrences\": 1, \"nthWeekdayDayOfWeek\": \"sunday\", \"type\": 1, \"weekOfMonth\": 1 }, \"rotationIds\": [ \"example\" ], \"rotationScope\": 1, \"startTime\": \"2026-04-15T12:00:00Z\", \"timeZone\": \"example\" }, \"replacedSettingId\": \"example\", \"rotationLimit\": 1 }");Request request = new Request.Builder() .url("https://api.roundrobinbot.eu/v1/teams/example/availability/impact-preview") .post(body) .addHeader("Authorization", "Bearer <token>") .addHeader("Content-Type", "application/*+json") .build();
Response response = client.newCall(request).execute();import axios from 'axios';
const options = { method: 'POST', url: 'https://api.roundrobinbot.eu/v1/teams/example/availability/impact-preview', headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/*+json'}, data: '{ "afterRotationId": "example", "expectedPreviewRevision": "example", "previewFrom": "2026-04-15T12:00:00Z", "previewTo": "2026-04-15T12:00:00Z", "proposal": { "endTime": "2026-04-15T12:00:00Z", "isActive": true, "reason": "example", "recurrenceRule": { "dayOfMonth": 1, "daysOfWeek": [ "sunday" ], "endDateUtc": "2026-04-15T12:00:00Z", "endType": 1, "interval": 1, "maxOccurrences": 1, "nthWeekdayDayOfWeek": "sunday", "type": 1, "weekOfMonth": 1 }, "rotationIds": [ "example" ], "rotationScope": 1, "startTime": "2026-04-15T12:00:00Z", "timeZone": "example" }, "replacedSettingId": "example", "rotationLimit": 1 }'};
try { const { data } = await axios.request(options); console.log(data);} catch (error) { console.error(error);}const url = 'https://api.roundrobinbot.eu/v1/teams/example/availability/impact-preview';const options = { method: 'POST', headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/*+json'}, body: '{ "afterRotationId": "example", "expectedPreviewRevision": "example", "previewFrom": "2026-04-15T12:00:00Z", "previewTo": "2026-04-15T12:00:00Z", "proposal": { "endTime": "2026-04-15T12:00:00Z", "isActive": true, "reason": "example", "recurrenceRule": { "dayOfMonth": 1, "daysOfWeek": [ "sunday" ], "endDateUtc": "2026-04-15T12:00:00Z", "endType": 1, "interval": 1, "maxOccurrences": 1, "nthWeekdayDayOfWeek": "sunday", "type": 1, "weekOfMonth": 1 }, "rotationIds": [ "example" ], "rotationScope": 1, "startTime": "2026-04-15T12:00:00Z", "timeZone": "example" }, "replacedSettingId": "example", "rotationLimit": 1 }'};
try { const response = await fetch(url, options); const data = await response.json(); console.log(data);} catch (error) { console.error(error);}curl --request POST \ --url https://api.roundrobinbot.eu/v1/teams/example/availability/impact-preview \ --header 'Authorization: Bearer <token>' \ --header 'Content-Type: application/*+json' \ --data '{ "afterRotationId": "example", "expectedPreviewRevision": "example", "previewFrom": "2026-04-15T12:00:00Z", "previewTo": "2026-04-15T12:00:00Z", "proposal": { "endTime": "2026-04-15T12:00:00Z", "isActive": true, "reason": "example", "recurrenceRule": { "dayOfMonth": 1, "daysOfWeek": [ "sunday" ], "endDateUtc": "2026-04-15T12:00:00Z", "endType": 1, "interval": 1, "maxOccurrences": 1, "nthWeekdayDayOfWeek": "sunday", "type": 1, "weekOfMonth": 1 }, "rotationIds": [ "example" ], "rotationScope": 1, "startTime": "2026-04-15T12:00:00Z", "timeZone": "example" }, "replacedSettingId": "example", "rotationLimit": 1 }'Requires a Slack member access token for this workspace. API keys cannot perform this preview. Compares current duty with the proposed availability without saving it or changing duty. Supply UTC preview dates spanning at most 31 days, ending after the current time and within six months. Set rotationLimit from 1 through 5. Continue with nextAfterRotationId as afterRotationId. The response complete describes paging. Check each rotation’s complete, source states and limitationCodes separately. Pass expectedPreviewRevision to compare with a reviewed preview; false matchesExpectedRevision means it changed. Invalid ranges return 422 with invalidImpactRange; invalid proposals return 422 with invalidAvailabilityTerms.
Authorizations
Section titled “Authorizations”Parameters
Section titled “Parameters”Path Parameters
Section titled “Path Parameters”Request Bodyrequired
Section titled “Request Bodyrequired”object
object
object
object
object
object
object
object
object
object
object
object
Responses
Section titled “Responses”OK
object
The effect of an availability change on one rotation.
object
False when the effect may be incomplete.
The intervals whose holders change.
object
The reasons the effect may be incomplete, each as a code with the availability source it concerns when it concerns one. Empty when complete is true.
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.
The rotation identifier.
The name of the rotation.
The version of the rotation the effect was read at.
How each availability source answered.
object
Examplegenerated
{ "asOfUtc": "2026-04-15T12:00:00Z", "complete": true, "effectiveFrom": "2026-04-15T12:00:00Z", "matchesExpectedRevision": true, "nextAfterRotationId": "example", "previewRevision": "example", "rotations": [ { "complete": true, "intervals": [ { "afterUserIds": [ "example" ], "arrangementIds": [ "example" ], "arrangementKinds": [ "example" ], "beforeUserIds": [ "example" ], "cellId": "example", "from": "2026-04-15T12:00:00Z", "kind": "example", "laneName": "example", "to": "2026-04-15T12:00:00Z", "windowName": "example" } ], "limitationCodes": [ { "code": "example", "source": "example" } ], "rotationId": "example", "rotationName": "example", "rotationVersion": 1, "sourceStatuses": [ { "source": "example", "state": "example" } ] } ], "to": "2026-04-15T12:00:00Z"}