Change a duty arrangement
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/duty-arrangements/example/changes"), Headers = { { "If-Match", "example" }, { "Authorization", "Bearer <token>" }, }, Content = new StringContent("{ \"acknowledgedConflictIds\": [ \"example\" ], \"cellId\": \"example\", \"expectedRevision\": 1, \"from\": \"2026-04-15T12:00:00Z\", \"operationId\": \"example\", \"to\": \"2026-04-15T12:00:00Z\", \"turnSelection\": { \"from\": \"2026-04-15T12:00:00Z\", \"kind\": \"example\", \"to\": \"2026-04-15T12:00:00Z\" }, \"userId\": \"example\" }") { 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/rotations/example/duty-arrangements/example/changes"
payload := strings.NewReader("{ \"acknowledgedConflictIds\": [ \"example\" ], \"cellId\": \"example\", \"expectedRevision\": 1, \"from\": \"2026-04-15T12:00:00Z\", \"operationId\": \"example\", \"to\": \"2026-04-15T12:00:00Z\", \"turnSelection\": { \"from\": \"2026-04-15T12:00:00Z\", \"kind\": \"example\", \"to\": \"2026-04-15T12:00:00Z\" }, \"userId\": \"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")
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, "{ \"acknowledgedConflictIds\": [ \"example\" ], \"cellId\": \"example\", \"expectedRevision\": 1, \"from\": \"2026-04-15T12:00:00Z\", \"operationId\": \"example\", \"to\": \"2026-04-15T12:00:00Z\", \"turnSelection\": { \"from\": \"2026-04-15T12:00:00Z\", \"kind\": \"example\", \"to\": \"2026-04-15T12:00:00Z\" }, \"userId\": \"example\" }");Request request = new Request.Builder() .url("https://api.roundrobinbot.eu/v1/rotations/example/duty-arrangements/example/changes") .post(body) .addHeader("If-Match", "example") .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/rotations/example/duty-arrangements/example/changes', headers: { 'If-Match': 'example', Authorization: 'Bearer <token>', 'Content-Type': 'application/*+json' }, data: '{ "acknowledgedConflictIds": [ "example" ], "cellId": "example", "expectedRevision": 1, "from": "2026-04-15T12:00:00Z", "operationId": "example", "to": "2026-04-15T12:00:00Z", "turnSelection": { "from": "2026-04-15T12:00:00Z", "kind": "example", "to": "2026-04-15T12:00:00Z" }, "userId": "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/duty-arrangements/example/changes';const options = { method: 'POST', headers: { 'If-Match': 'example', Authorization: 'Bearer <token>', 'Content-Type': 'application/*+json' }, body: '{ "acknowledgedConflictIds": [ "example" ], "cellId": "example", "expectedRevision": 1, "from": "2026-04-15T12:00:00Z", "operationId": "example", "to": "2026-04-15T12:00:00Z", "turnSelection": { "from": "2026-04-15T12:00:00Z", "kind": "example", "to": "2026-04-15T12:00:00Z" }, "userId": "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/duty-arrangements/example/changes \ --header 'Authorization: Bearer <token>' \ --header 'Content-Type: application/*+json' \ --header 'If-Match: example' \ --data '{ "acknowledgedConflictIds": [ "example" ], "cellId": "example", "expectedRevision": 1, "from": "2026-04-15T12:00:00Z", "operationId": "example", "to": "2026-04-15T12:00:00Z", "turnSelection": { "from": "2026-04-15T12:00:00Z", "kind": "example", "to": "2026-04-15T12:00:00Z" }, "userId": "example" }'Requires write:duty, rotation edit authority, If-Match and the current expectedRevision. Cancels the active direct assignment and creates a replacement with the supplied terms. Served history is unchanged. Accepted cover and swap legs return 409 with repairNotSupported. A changed arrangement revision returns 409 with arrangementChanged. Read current state and preview the replacement before retrying. Operation IDs and conflict acknowledgments follow the create operation. Success returns 200, the changed arrangement records and the rotation ETag.
Authorizations
Section titled “Authorizations”Parameters
Section titled “Parameters”Path Parameters
Section titled “Path Parameters”The rotation identifier.
The active direct assignment to replace.
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”Request cancellation.
Terms for a direct assignment or its preview.
object
Conflict identifiers explicitly acknowledged by the rotation editor.
The rotation cell receiving the assignment.
The current arrangement revision when changing an existing assignment or previewing that change.
The requested inclusive UTC start. A current assignment begins at the actual transition time.
A nonempty operation identifier of at most 128 characters, required for writes. Reuse it only to retry the same write.
The exclusive UTC end, later than both the start and the write’s transition time.
Optional turn selection returned by the assignment preview.
object
The inclusive UTC start of the original turn, including any part already served.
fullTurn or remainingTurn, as returned by the preview.
The exclusive UTC end of the original turn.
The Slack user identifier of a person in the cell’s lane.
Examplegenerated
{ "acknowledgedConflictIds": [ "example" ], "cellId": "example", "expectedRevision": 1, "from": "2026-04-15T12:00:00Z", "operationId": "example", "to": "2026-04-15T12:00:00Z", "turnSelection": { "from": "2026-04-15T12:00:00Z", "kind": "example", "to": "2026-04-15T12:00:00Z" }, "userId": "example"}Terms for a direct assignment or its preview.
object
Conflict identifiers explicitly acknowledged by the rotation editor.
The rotation cell receiving the assignment.
The current arrangement revision when changing an existing assignment or previewing that change.
The requested inclusive UTC start. A current assignment begins at the actual transition time.
A nonempty operation identifier of at most 128 characters, required for writes. Reuse it only to retry the same write.
The exclusive UTC end, later than both the start and the write’s transition time.
Optional turn selection returned by the assignment preview.
object
The inclusive UTC start of the original turn, including any part already served.
fullTurn or remainingTurn, as returned by the preview.
The exclusive UTC end of the original turn.
The Slack user identifier of a person in the cell’s lane.
Examplegenerated
{ "acknowledgedConflictIds": [ "example" ], "cellId": "example", "expectedRevision": 1, "from": "2026-04-15T12:00:00Z", "operationId": "example", "to": "2026-04-15T12:00:00Z", "turnSelection": { "from": "2026-04-15T12:00:00Z", "kind": "example", "to": "2026-04-15T12:00:00Z" }, "userId": "example"}Terms for a direct assignment or its preview.
object
Conflict identifiers explicitly acknowledged by the rotation editor.
The rotation cell receiving the assignment.
The current arrangement revision when changing an existing assignment or previewing that change.
The requested inclusive UTC start. A current assignment begins at the actual transition time.
A nonempty operation identifier of at most 128 characters, required for writes. Reuse it only to retry the same write.
The exclusive UTC end, later than both the start and the write’s transition time.
Optional turn selection returned by the assignment preview.
object
The inclusive UTC start of the original turn, including any part already served.
fullTurn or remainingTurn, as returned by the preview.
The exclusive UTC end of the original turn.
The Slack user identifier of a person in the cell’s lane.
Examplegenerated
{ "acknowledgedConflictIds": [ "example" ], "cellId": "example", "expectedRevision": 1, "from": "2026-04-15T12:00:00Z", "operationId": "example", "to": "2026-04-15T12:00:00Z", "turnSelection": { "from": "2026-04-15T12:00:00Z", "kind": "example", "to": "2026-04-15T12:00:00Z" }, "userId": "example"}Terms for a direct assignment or its preview.
object
Conflict identifiers explicitly acknowledged by the rotation editor.
The rotation cell receiving the assignment.
The current arrangement revision when changing an existing assignment or previewing that change.
The requested inclusive UTC start. A current assignment begins at the actual transition time.
A nonempty operation identifier of at most 128 characters, required for writes. Reuse it only to retry the same write.
The exclusive UTC end, later than both the start and the write’s transition time.
Optional turn selection returned by the assignment preview.
object
The inclusive UTC start of the original turn, including any part already served.
fullTurn or remainingTurn, as returned by the preview.
The exclusive UTC end of the original turn.
The Slack user identifier of a person in the cell’s lane.
Examplegenerated
{ "acknowledgedConflictIds": [ "example" ], "cellId": "example", "expectedRevision": 1, "from": "2026-04-15T12:00:00Z", "operationId": "example", "to": "2026-04-15T12:00:00Z", "turnSelection": { "from": "2026-04-15T12:00:00Z", "kind": "example", "to": "2026-04-15T12:00:00Z" }, "userId": "example"}Responses
Section titled “Responses”OK
The committed assignment result for an operation.
object
The arrangements changed by the operation, including cancelled records and any replacement.
An interval assignment. Its recorded terms remain distinct from actual served history.
object
The rotation cell identifier.
The next instant at which phase changes, or null once it has ended.
The inclusive UTC start.
The arrangement identifier.
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
Whether original duty is known throughout the interval. False includes assignments without an original record.
Distinct Slack user identifiers in the recorded portion of the arrangement interval.
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.
Whether every returned segment is resolved. An extension beyond the original recorded interval is unresolved.
The inclusive UTC start of the returned interval.
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.
Whether the holders or absence of duty are known for this interval.
The exclusive UTC end.
Slack user identifiers of the effective holders. An empty list means no assignee only when resolved is true.
The exclusive UTC end of the returned interval.
upcoming, running or ended, from from and to at the time the response is built.
The arrangement revision used when changing or ending it.
The rotation identifier.
active or cancelled. An active record can describe an interval that has already ended.
The exclusive UTC end.
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
The inclusive UTC start of the original turn, including any part already served.
fullTurn or remainingTurn.
The exclusive UTC end of the original turn.
The assigned person’s Slack user identifier.
pending or published for change-event publication. Neither value confirms that a Slack message has arrived.
The actual prospective transition start.
The submitted operation identifier.
The committed rotation version, also returned as an ETag.
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", "rotationVersion": 1}