Skip to content

Create a cover request

POST
/v1/rotations/{rotationId}/cover-requests
curl --request POST \
--url https://api.roundrobinbot.eu/v1/rotations/example/cover-requests \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/*+json' \
--header 'If-Match: example' \
--data '{ "cellId": "example", "from": "2026-04-15T12:00:00Z", "operationId": "example", "reason": "example", "recipientUserIds": [ "example" ], "to": "2026-04-15T12:00:00Z" }'

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.

rotationId
required
string
If-Match
required
string

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

UTC interval and selected audience for a new cover request.

object
cellId

Stable cell identifier from the rotation or personal duty read.

string
from

Inclusive requested start, with UTC offset zero.

string format: date-time
operationId

Caller-generated mutation identity, at most 128 characters. Reuse only for an identical retry.

string
reason

Optional explanation, at most 2000 characters. Use an empty string when omitted.

string
recipientUserIds

Between 1 and 100 distinct eligible Slack user identifiers, excluding the requester.

Array<string>
to

Exclusive requested end, with UTC offset zero.

string format: date-time
Examplegenerated
{
"cellId": "example",
"from": "2026-04-15T12:00:00Z",
"operationId": "example",
"reason": "example",
"recipientUserIds": [
"example"
],
"to": "2026-04-15T12:00:00Z"
}

OK

Media typeapplication/json

Committed mutation result. DeliveryState describes publication progress, not confirmed Slack receipt.

object
arrangements
required
Array<object>

An interval assignment. Its recorded terms remain distinct from actual served history.

object
cellId
required

The rotation cell identifier.

string
changesAtUtc
required

The next instant at which phase changes, or null once it has ended.

null | string format: date-time
from
required

The inclusive UTC start.

string format: date-time
id
required

The arrangement identifier.

string
kind
required

directAssignment, acceptedCover or swapLeg. Direct-assignment writes change or end only directAssignment.

string
origin
One of:
null
originalSnapshot
One of:
null
phase
required

upcoming, running or ended, from from and to at the time the response is built.

string
revision
required

The arrangement revision used when changing or ending it.

integer format: int64
rotationId
required

The rotation identifier.

string
state
required

active or cancelled. An active record can describe an interval that has already ended.

string
to
required

The exclusive UTC end.

string format: date-time
turnSelection
One of:
null
userId
required

The assigned person’s Slack user identifier.

string
deliveryState
required
string
effectiveFrom
required
string format: date-time
operationId
required
string
request
required

A permitted cover request, its rotation name and caller-specific capabilities.

object
actionable
required

True when the caller may accept, decline, cancel or end the request.

boolean
active
required

True while the request is pending or accepted.

boolean
asOfUtc
required

The instant the state, phase and capabilities were evaluated.

string format: date-time
capability
required

The actions available to the caller.

object
canAccept
required

Whether the caller may accept the request.

boolean
canCancel
required

Whether the caller may cancel the request.

boolean
canDecline
required

Whether the caller may decline the request.

boolean
canEnd
required

Whether the caller may end the accepted cover.

boolean
reason
required

The reason the actions are unavailable. Absent when they are available.

null | string
reasonCode
required

The same word as reason, or null when the actions are available.

null | string
changesAtUtc
required

The earliest later instant at which the state, phase, active or actionable changes by the clock alone. Null when none will.

null | string format: date-time
request
required

The request.

object
acceptedUserId
required

The user who accepted. Absent until accepted.

null | string
arrangementId
required

The assignment identifier created by acceptance. Absent until accepted.

null | string
cellId
required

The cell identifier.

string
declinedUserIds
required

The recipients who declined.

Array<string>
from
required

The inclusive interval start.

string format: date-time
id
required

The request identifier.

string
phase
required

upcoming, running or ended for the requested interval at the instant the response is built.

string
reason
required

The reason given with the request.

string
recipientUserIds
required

The users asked to cover.

Array<string>
requesterUserId
required

The user who made the request.

string
revision
required

The revision of the request.

integer format: int64
rotationId
required

The rotation identifier.

string
state
required

The lifecycle state of the request.

string
to
required

The exclusive interval end.

string format: date-time
rotationName
required

The name of the rotation.

string
rotationVersion
required
integer format: int64
Examplegenerated
{
"arrangements": [
{
"cellId": "example",
"changesAtUtc": "2026-04-15T12:00:00Z",
"from": "2026-04-15T12:00:00Z",
"id": "example",
"kind": "example",
"origin": {
"complete": true,
"userIds": [
"example"
]
},
"originalSnapshot": {
"asOfUtc": "2026-04-15T12:00:00Z",
"complete": true,
"from": "2026-04-15T12:00:00Z",
"segments": [
{
"from": "2026-04-15T12:00:00Z",
"resolved": true,
"to": "2026-04-15T12:00:00Z",
"userIds": [
"example"
]
}
],
"to": "2026-04-15T12:00:00Z"
},
"phase": "example",
"revision": 1,
"rotationId": "example",
"state": "example",
"to": "2026-04-15T12:00:00Z",
"turnSelection": {
"from": "2026-04-15T12:00:00Z",
"kind": "example",
"to": "2026-04-15T12:00:00Z"
},
"userId": "example"
}
],
"deliveryState": "example",
"effectiveFrom": "2026-04-15T12:00:00Z",
"operationId": "example",
"request": {
"actionable": true,
"active": true,
"asOfUtc": "2026-04-15T12:00:00Z",
"capability": {
"canAccept": true,
"canCancel": true,
"canDecline": true,
"canEnd": true,
"reason": "example",
"reasonCode": "example"
},
"changesAtUtc": "2026-04-15T12:00:00Z",
"request": {
"acceptedUserId": "example",
"arrangementId": "example",
"cellId": "example",
"declinedUserIds": [
"example"
],
"from": "2026-04-15T12:00:00Z",
"id": "example",
"phase": "example",
"reason": "example",
"recipientUserIds": [
"example"
],
"requesterUserId": "example",
"revision": 1,
"rotationId": "example",
"state": "example",
"to": "2026-04-15T12:00:00Z"
},
"rotationName": "example"
},
"rotationVersion": 1
}