Create a cover request
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/cover-requests"), Headers = { { "If-Match", "example" }, { "Authorization", "Bearer <token>" }, }, Content = new StringContent("{ \"operationId\": \"example\", \"cellId\": \"example\", \"from\": \"2026-04-15T12:00:00Z\", \"to\": \"2026-04-15T12:00:00Z\", \"recipientUserIds\": [ \"example\" ], \"reason\": \"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/cover-requests"
payload := strings.NewReader("{ \"operationId\": \"example\", \"cellId\": \"example\", \"from\": \"2026-04-15T12:00:00Z\", \"to\": \"2026-04-15T12:00:00Z\", \"recipientUserIds\": [ \"example\" ], \"reason\": \"example\" }")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("If-Match", "example") 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, "{ \"operationId\": \"example\", \"cellId\": \"example\", \"from\": \"2026-04-15T12:00:00Z\", \"to\": \"2026-04-15T12:00:00Z\", \"recipientUserIds\": [ \"example\" ], \"reason\": \"example\" }");Request request = new Request.Builder() .url("https://api.roundrobinbot.eu/v1/rotations/example/cover-requests") .post(body) .addHeader("If-Match", "example") .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/cover-requests', headers: { 'If-Match': 'example', Authorization: 'Bearer <token>', 'Content-Type': 'application/json-patch+json' }, data: '{ "operationId": "example", "cellId": "example", "from": "2026-04-15T12:00:00Z", "to": "2026-04-15T12:00:00Z", "recipientUserIds": [ "example" ], "reason": "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/cover-requests';const options = { method: 'POST', headers: { 'If-Match': 'example', Authorization: 'Bearer <token>', 'Content-Type': 'application/json-patch+json' }, body: '{ "operationId": "example", "cellId": "example", "from": "2026-04-15T12:00:00Z", "to": "2026-04-15T12:00:00Z", "recipientUserIds": [ "example" ], "reason": "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/cover-requests \ --header 'Authorization: Bearer <token>' \ --header 'Content-Type: application/json-patch+json' \ --header 'If-Match: example' \ --data '{ "operationId": "example", "cellId": "example", "from": "2026-04-15T12:00:00Z", "to": "2026-04-15T12:00:00Z", "recipientUserIds": [ "example" ], "reason": "example" }'Requires a Slack member access token and If-Match from the latest preview. Creates a pending request. Duty remains unchanged until acceptance. Reuse operationId and the same body when retrying an uncertain result. A missing If-Match returns 428. On 412, refresh the preview before retrying.
Authorizations
Section titled “Authorizations”Parameters
Section titled “Parameters”Path Parameters
Section titled “Path Parameters”Header Parameters
Section titled “Header Parameters”The ETag from your last read of this resource, sent back exactly as you received it, quotes included. The write happens only if nothing changed in between: a stale validator is answered 412 and nothing is written. Send * to write against whatever is current on purpose. Omitting the header is 428, never an unconditional write. https://docs.roundrobinbot.eu/api/conventions/#conditional-writes
Request Bodyrequired
Section titled “Request Bodyrequired”UTC interval and selected audience for a new cover request.
object
Caller-generated mutation identity, at most 128 characters. Reuse only for an identical retry.
Stable cell identifier from the rotation or personal duty read.
Inclusive requested start, with UTC offset zero.
Exclusive requested end, with UTC offset zero.
Between 1 and 100 distinct eligible Slack user identifiers, excluding the requester.
Optional explanation, at most 2000 characters. Use an empty string when omitted.
Examplegenerated
{ "operationId": "example", "cellId": "example", "from": "2026-04-15T12:00:00Z", "to": "2026-04-15T12:00:00Z", "recipientUserIds": [ "example" ], "reason": "example"}UTC interval and selected audience for a new cover request.
object
Caller-generated mutation identity, at most 128 characters. Reuse only for an identical retry.
Stable cell identifier from the rotation or personal duty read.
Inclusive requested start, with UTC offset zero.
Exclusive requested end, with UTC offset zero.
Between 1 and 100 distinct eligible Slack user identifiers, excluding the requester.
Optional explanation, at most 2000 characters. Use an empty string when omitted.
Examplegenerated
{ "operationId": "example", "cellId": "example", "from": "2026-04-15T12:00:00Z", "to": "2026-04-15T12:00:00Z", "recipientUserIds": [ "example" ], "reason": "example"}UTC interval and selected audience for a new cover request.
object
Caller-generated mutation identity, at most 128 characters. Reuse only for an identical retry.
Stable cell identifier from the rotation or personal duty read.
Inclusive requested start, with UTC offset zero.
Exclusive requested end, with UTC offset zero.
Between 1 and 100 distinct eligible Slack user identifiers, excluding the requester.
Optional explanation, at most 2000 characters. Use an empty string when omitted.
Examplegenerated
{ "operationId": "example", "cellId": "example", "from": "2026-04-15T12:00:00Z", "to": "2026-04-15T12:00:00Z", "recipientUserIds": [ "example" ], "reason": "example"}UTC interval and selected audience for a new cover request.
object
Caller-generated mutation identity, at most 128 characters. Reuse only for an identical retry.
Stable cell identifier from the rotation or personal duty read.
Inclusive requested start, with UTC offset zero.
Exclusive requested end, with UTC offset zero.
Between 1 and 100 distinct eligible Slack user identifiers, excluding the requester.
Optional explanation, at most 2000 characters. Use an empty string when omitted.
Examplegenerated
{ "operationId": "example", "cellId": "example", "from": "2026-04-15T12:00:00Z", "to": "2026-04-15T12:00:00Z", "recipientUserIds": [ "example" ], "reason": "example"}Responses
Section titled “Responses”OK
Committed mutation result. DeliveryState describes publication progress, not confirmed Slack receipt.
object
A permitted cover request, its rotation name and caller-specific capabilities.
object
Requested interval, selected audience and current cover lifecycle state.
object
Actions currently permitted for this caller. Mutations recheck these permissions.
object
An interval assignment. Its recorded terms remain distinct from actual served history.
object
The arrangement identifier.
The rotation identifier.
The rotation cell identifier.
The assigned person’s Slack user identifier.
The inclusive UTC start.
The exclusive UTC end.
The arrangement revision used when changing or ending it.
active or cancelled. An active record can describe an interval that has already ended.
directAssignment, acceptedCover or swapLeg. Direct-assignment writes change or end only directAssignment.
Original duty holders recorded before the first assignment, with completeness for this interval. Later edits retain that original record.
object
Distinct Slack user identifiers in the recorded portion of the arrangement interval.
Whether original duty is known throughout the interval. False includes assignments without an original record.
Original duty segments on detail reads. Null on list reads or when no original record is available.
object
The UTC time when the original duty was evaluated.
The inclusive UTC start of the returned interval.
The exclusive UTC end of the returned interval.
Whether every returned segment is resolved. An extension beyond the original recorded interval is unresolved.
Original holders by interval, including periods with no assignee and unresolved periods.
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.
The recorded full or remaining turn, or null when no verified selection was saved. Use the arrangement’s From and To for the affected interval.
object
fullTurn or remainingTurn.
The inclusive UTC start of the original turn, including any part already served.
The exclusive UTC end of the original turn.
Examplegenerated
{ "operationId": "example", "rotationVersion": 1, "effectiveFrom": "2026-04-15T12:00:00Z", "request": { "request": { "id": "example", "rotationId": "example", "cellId": "example", "requesterUserId": "example", "recipientUserIds": [ "example" ], "declinedUserIds": [ "example" ], "from": "2026-04-15T12:00:00Z", "to": "2026-04-15T12:00:00Z", "reason": "example", "revision": 1, "state": "example", "acceptedUserId": "example", "arrangementId": "example" }, "capability": { "canAccept": true, "canDecline": true, "canCancel": true, "canEnd": true, "reason": "example" }, "rotationName": "example" }, "arrangements": [ { "id": "example", "rotationId": "example", "cellId": "example", "userId": "example", "from": "2026-04-15T12:00:00Z", "to": "2026-04-15T12:00:00Z", "revision": 1, "state": "example", "kind": "example", "origin": { "userIds": [ "example" ], "complete": true }, "originalSnapshot": { "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 } ] }, "turnSelection": { "kind": "example", "from": "2026-04-15T12:00:00Z", "to": "2026-04-15T12:00:00Z" } } ], "deliveryState": "example"}