Mark somebody away
using System.Net.Http.Headers;var client = new HttpClient();var request = new HttpRequestMessage{ Method = HttpMethod.Post, RequestUri = new Uri("https://api.roundrobinbot.eu/v1/rotations/example/availability"), Headers = { { "Authorization", "Bearer <token>" }, }, Content = new StringContent("{ \"userId\": \"example\", \"from\": \"2026-04-15T12:00:00Z\", \"until\": \"2026-04-15T12:00:00Z\", \"reason\": \"example\", \"appliesTo\": \"example\" }") { Headers = { ContentType = new MediaTypeHeaderValue("application/json-patch+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/rotations/example/availability"
payload := strings.NewReader("{ \"userId\": \"example\", \"from\": \"2026-04-15T12:00:00Z\", \"until\": \"2026-04-15T12:00:00Z\", \"reason\": \"example\", \"appliesTo\": \"example\" }")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("Authorization", "Bearer <token>") req.Header.Add("Content-Type", "application/json-patch+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-patch+json");RequestBody body = RequestBody.create(mediaType, "{ \"userId\": \"example\", \"from\": \"2026-04-15T12:00:00Z\", \"until\": \"2026-04-15T12:00:00Z\", \"reason\": \"example\", \"appliesTo\": \"example\" }");Request request = new Request.Builder() .url("https://api.roundrobinbot.eu/v1/rotations/example/availability") .post(body) .addHeader("Authorization", "Bearer <token>") .addHeader("Content-Type", "application/json-patch+json") .build();
Response response = client.newCall(request).execute();import axios from 'axios';
const options = { method: 'POST', url: 'https://api.roundrobinbot.eu/v1/rotations/example/availability', headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json-patch+json'}, data: '{ "userId": "example", "from": "2026-04-15T12:00:00Z", "until": "2026-04-15T12:00:00Z", "reason": "example", "appliesTo": "example" }'};
try { const { data } = await axios.request(options); console.log(data);} catch (error) { console.error(error);}const url = 'https://api.roundrobinbot.eu/v1/rotations/example/availability';const options = { method: 'POST', headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json-patch+json'}, body: '{ "userId": "example", "from": "2026-04-15T12:00:00Z", "until": "2026-04-15T12:00:00Z", "reason": "example", "appliesTo": "example" }'};
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/rotations/example/availability \ --header 'Authorization: Bearer <token>' \ --header 'Content-Type: application/json-patch+json' \ --data '{ "userId": "example", "from": "2026-04-15T12:00:00Z", "until": "2026-04-15T12:00:00Z", "reason": "example", "appliesTo": "example" }'Records that a member of this rotation cannot take a shift between from and until. Answers 201 with the absence and its Location. Sending the same absence again answers 200 with the absence that already exists, and creates nothing, so a nightly sync of next month’s leave is safe to run as often as you like. Two requests are the same absence when they name the same person, the same period and the same appliesTo. No Idempotency-Key is needed for that reason. The person must already be a member of the rotation: this says when somebody cannot take a shift, never who is in the rotation. Somebody this workspace has never heard of answers 404, and somebody it knows who is not in this rotation answers 400.
Authorizations
Section titled “Authorizations”Parameters
Section titled “Parameters”Path Parameters
Section titled “Path Parameters”Request Bodyrequired
Section titled “Request Bodyrequired”Marks somebody away, so the next hand-over passes over them.
object
The Slack user id of the person who is away. Required.
When the absence starts, as an RFC 3339 timestamp. Required.
When the absence ends, as an RFC 3339 timestamp. Required, and later than from.
Why, in your own words, or leave it out. Shown next to the absence and never acted on.
What the absence covers: rotation, the default, for this rotation only, or allRotations for every rotation in the workspace.
Examplegenerated
{ "userId": "example", "from": "2026-04-15T12:00:00Z", "until": "2026-04-15T12:00:00Z", "reason": "example", "appliesTo": "example"}Marks somebody away, so the next hand-over passes over them.
object
The Slack user id of the person who is away. Required.
When the absence starts, as an RFC 3339 timestamp. Required.
When the absence ends, as an RFC 3339 timestamp. Required, and later than from.
Why, in your own words, or leave it out. Shown next to the absence and never acted on.
What the absence covers: rotation, the default, for this rotation only, or allRotations for every rotation in the workspace.
Examplegenerated
{ "userId": "example", "from": "2026-04-15T12:00:00Z", "until": "2026-04-15T12:00:00Z", "reason": "example", "appliesTo": "example"}Marks somebody away, so the next hand-over passes over them.
object
The Slack user id of the person who is away. Required.
When the absence starts, as an RFC 3339 timestamp. Required.
When the absence ends, as an RFC 3339 timestamp. Required, and later than from.
Why, in your own words, or leave it out. Shown next to the absence and never acted on.
What the absence covers: rotation, the default, for this rotation only, or allRotations for every rotation in the workspace.
Examplegenerated
{ "userId": "example", "from": "2026-04-15T12:00:00Z", "until": "2026-04-15T12:00:00Z", "reason": "example", "appliesTo": "example"}Marks somebody away, so the next hand-over passes over them.
object
The Slack user id of the person who is away. Required.
When the absence starts, as an RFC 3339 timestamp. Required.
When the absence ends, as an RFC 3339 timestamp. Required, and later than from.
Why, in your own words, or leave it out. Shown next to the absence and never acted on.
What the absence covers: rotation, the default, for this rotation only, or allRotations for every rotation in the workspace.
Examplegenerated
{ "userId": "example", "from": "2026-04-15T12:00:00Z", "until": "2026-04-15T12:00:00Z", "reason": "example", "appliesTo": "example"}Responses
Section titled “Responses”OK
A period a member of a rotation cannot take a shift.
object
The absence’s id, which is what the delete takes.
The Slack user id of the person who is away.
When the absence starts, in UTC.
When the absence ends, in UTC.
Whatever was recorded about why, or null. Free text, and never used for anything but display.
What the absence covers: rotation for one rotation, allRotations for every rotation in the workspace.
The rotations it covers when appliesTo is rotation, and empty otherwise.
Whether this absence repeats. A repeating absence can only be set in the dashboard, so anything the public API created answers false.
Where the absence came from. Always internalAvailability: these are the absences Round Robin stores and this API can delete, spelled the same way as the source on skippedForAbsence, so an absence and the skip it caused read as one vocabulary. An out-of-office event mirrored from a connected calendar is not one of these and is not returned here.
Examplegenerated
{ "id": "example", "userId": "example", "from": "2026-04-15T12:00:00Z", "until": "2026-04-15T12:00:00Z", "reason": "example", "appliesTo": "example", "rotationIds": [ "example" ], "recurring": true, "source": "example"}Created
A period a member of a rotation cannot take a shift.
object
The absence’s id, which is what the delete takes.
The Slack user id of the person who is away.
When the absence starts, in UTC.
When the absence ends, in UTC.
Whatever was recorded about why, or null. Free text, and never used for anything but display.
What the absence covers: rotation for one rotation, allRotations for every rotation in the workspace.
The rotations it covers when appliesTo is rotation, and empty otherwise.
Whether this absence repeats. A repeating absence can only be set in the dashboard, so anything the public API created answers false.
Where the absence came from. Always internalAvailability: these are the absences Round Robin stores and this API can delete, spelled the same way as the source on skippedForAbsence, so an absence and the skip it caused read as one vocabulary. An out-of-office event mirrored from a connected calendar is not one of these and is not returned here.
Examplegenerated
{ "id": "example", "userId": "example", "from": "2026-04-15T12:00:00Z", "until": "2026-04-15T12:00:00Z", "reason": "example", "appliesTo": "example", "rotationIds": [ "example" ], "recurring": true, "source": "example"}Bad Request
object
Examplegenerated
{ "type": "example", "title": "example", "status": 1, "detail": "example", "instance": "example"}Unauthorized
object
Examplegenerated
{ "type": "example", "title": "example", "status": 1, "detail": "example", "instance": "example"}Forbidden
object
Examplegenerated
{ "type": "example", "title": "example", "status": 1, "detail": "example", "instance": "example"}Not Found
object
Examplegenerated
{ "type": "example", "title": "example", "status": 1, "detail": "example", "instance": "example"}