Skip to content

Get a rotation's activity

GET
/v1/rotations/{rotationId}/activity
curl --request GET \
--url 'https://api.roundrobinbot.eu/v1/rotations/example/activity?from=2026-04-15T12%3A00%3A00Z&to=2026-04-15T12%3A00%3A00Z' \
--header 'Authorization: Bearer <token>'

What was changed on this rotation inside a window you name, and who changed it: a person by their Slack user id, an API key by its key id, or the product itself when the cadence came round and nobody asked for anything. Each entry names the change as a code (coverage-changed, rotated-manually, owners-changed) and, for the settings that are audited as one entry, which parts of them moved. It does not carry before-and-after values: what a rotation records for those is a rendered string in a format meant for a screen. Read the rotation to see where it stands now. Refused calls are not here. A refusal is evidence about a credential rather than a change to your workspace, and nothing in this feed says what anybody authenticated with. from and to are both required, inclusive at both ends, and no more than 90 days apart. No ETag, as on every collection here.

rotationId
required
string
from
required
string format: date-time
to
required
string format: date-time
page
integer | string format: int32
/^-?(?:0|[1-9]\d*)$/
pageSize
integer | string format: int32
/^-?(?:0|[1-9]\d*)$/
sort
string

OK

Media typeapplication/json

The envelope every /v1 collection comes back in.

object
data
Array<object>

One change somebody made to a rotation: what changed, when, and who did it.

object
id

The entry’s own id, stable forever, so a client polling this can tell a repeat from a new one.

string
at

When it happened.

string format: date-time
verb

What was done, as a stable code: created, enabled, disabled, name-changed, owners-changed, members-reordered, list-added, coverage-changed, schedule-changed, timezone-changed, channels-changed, rotated-manually, duty-set-explicitly, duty-cleared, external-schedule-connected and others in the same shape.

string
parts

Which parts of a composite setting moved, for the verbs that audit several fields as one entry (the cadence, the covered week, the channel topic). Empty on every other verb.

Array<string>
rotationName

What the rotation was called at the time, which is the only name a deleted rotation has left.

null | string
actor

Who did it.

object
type

What kind of principal acted: user for a person, bot for the Slack app acting on somebody’s behalf, mcpClient for an AI client, apiKey for a team API key, or system when nothing with a caller behind it did: the cadence coming round, a scheduled job, a clean-up.

string
userId

The Slack user id of the person behind the change, where there is one. Absent on system, and on anything the product did without a person asking.

null | string
keyId

The id of the API key that made the change, set only when type is apiKey.

null | string
page
integer | string format: int32
/^-?(?:0|[1-9]\d*)$/
pageSize
integer | string format: int32
/^-?(?:0|[1-9]\d*)$/
totalItems
integer | string format: int64
/^-?(?:0|[1-9]\d*)$/
totalPages
integer | string format: int32
/^-?(?:0|[1-9]\d*)$/
Examplegenerated
{
"data": [
{
"id": "example",
"at": "2026-04-15T12:00:00Z",
"verb": "example",
"parts": [
"example"
],
"rotationName": "example",
"actor": {
"type": "example",
"userId": "example",
"keyId": "example"
}
}
],
"page": 1,
"pageSize": 1,
"totalItems": 1,
"totalPages": 1
}

Bad Request

Media typeapplication/json
object
type
null | string
title
null | string
status
null | integer | string format: int32
/^-?(?:0|[1-9]\d*)$/
detail
null | string
instance
null | string
Examplegenerated
{
"type": "example",
"title": "example",
"status": 1,
"detail": "example",
"instance": "example"
}

Unauthorized

Media typeapplication/json
object
type
null | string
title
null | string
status
null | integer | string format: int32
/^-?(?:0|[1-9]\d*)$/
detail
null | string
instance
null | string
Examplegenerated
{
"type": "example",
"title": "example",
"status": 1,
"detail": "example",
"instance": "example"
}

Forbidden

Media typeapplication/json
object
type
null | string
title
null | string
status
null | integer | string format: int32
/^-?(?:0|[1-9]\d*)$/
detail
null | string
instance
null | string
Examplegenerated
{
"type": "example",
"title": "example",
"status": 1,
"detail": "example",
"instance": "example"
}

Not Found

Media typeapplication/json
object
type
null | string
title
null | string
status
null | integer | string format: int32
/^-?(?:0|[1-9]\d*)$/
detail
null | string
instance
null | string
Examplegenerated
{
"type": "example",
"title": "example",
"status": 1,
"detail": "example",
"instance": "example"
}