On-Call Schedules API Create and manage on-call schedules, rotations, participants, and overrides.
On-call schedules define who is responsible for responding to incidents at any given time. See On-Call Schedules for conceptual documentation.
These are dashboard API endpoints — they require an OAuth session token ($ACCESS_TOKEN) and do not accept ionh_ API keys. On-call schedules currently have no API-key surface (neither the Integration API nor MCP exposes them); manage them from the dashboard. See which credential goes where .
Field Type Required Description workspaceIdnumber Yes Workspace this schedule belongs to namestring Yes Schedule name descriptionstring No Schedule description timezonestring No Timezone for handoff times (default: UTC) handoffNotificationMinutesnumber No Minutes before handoff to notify incoming person (default: 15, null to disable) enabledboolean No Whether the schedule is active (default: true) rotationsarray No Rotations to create with the schedule (see below)
Field Type Required Description namestring No Rotation name typestring Yes daily, weekly, or customlayerPositionnumber Yes Priority within the schedule (0 = highest) effectiveFromstring Yes ISO datetime when this rotation starts effectiveUntilstring No ISO datetime when this rotation ends (null = indefinite) handoffTimestring Yes Time of day for shift changes (e.g., 09:00) handoffDaynumber No Day of week for weekly rotations (1=Mon, 7=Sun, default: 1) customShiftHoursnumber No Shift length in hours for custom rotations participantsarray No Ordered list of participants (see below)
Field Type Required Description userIdnumber Yes User to include in the rotation positionnumber Yes Order in the rotation (0-indexed)
curl -X POST https://api.ionhour.com/api/on-call-schedules \
-H "Authorization: Bearer $ACCESS_TOKEN " \
-H "Content-Type: application/json" \
-d '{
"workspaceId": 1,
"name": "Primary On-Call",
"timezone": "America/New_York",
"handoffNotificationMinutes": 15,
"rotations": [
{
"name": "Weekly Rotation",
"type": "weekly",
"layerPosition": 0,
"effectiveFrom": "2025-01-06T09:00:00Z",
"handoffTime": "09:00",
"handoffDay": 1,
"participants": [
{ "userId": 1, "position": 0 },
{ "userId": 2, "position": 1 },
{ "userId": 3, "position": 2 }
]
}
]
}'
Parameter Type Required Description workspaceIdnumber Yes Filter by workspace
curl -H "Authorization: Bearer $ACCESS_TOKEN " \
"https://api.ionhour.com/api/on-call-schedules?workspaceId=1"
GET /on-call-schedules/:id
Returns a schedule with its rotations, participants, and overrides.
curl -H "Authorization: Bearer $ACCESS_TOKEN " \
https://api.ionhour.com/api/on-call-schedules/1
PUT /on-call-schedules/:id
curl -X PUT https://api.ionhour.com/api/on-call-schedules/1 \
-H "Authorization: Bearer $ACCESS_TOKEN " \
-H "Content-Type: application/json" \
-d '{"name": "Updated Schedule", "timezone": "Europe/London"}'
DELETE /on-call-schedules/:id
curl -X DELETE https://api.ionhour.com/api/on-call-schedules/1 \
-H "Authorization: Bearer $ACCESS_TOKEN "
Field Type Required Description scheduleIdnumber Yes Schedule to override overrideUserIdnumber Yes User who will cover startAtstring Yes ISO datetime when override begins endAtstring Yes ISO datetime when override ends replacedUserIdnumber No User being replaced (null = unconditional override) reasonstring No Reason for the override
curl -X POST https://api.ionhour.com/api/on-call-overrides \
-H "Authorization: Bearer $ACCESS_TOKEN " \
-H "Content-Type: application/json" \
-d '{
"scheduleId": 1,
"overrideUserId": 5,
"replacedUserId": 2,
"startAt": "2025-03-10T09:00:00Z",
"endAt": "2025-03-17T09:00:00Z",
"reason": "Alice on vacation"
}'
DELETE /on-call-overrides/:id
curl -X DELETE https://api.ionhour.com/api/on-call-overrides/3 \
-H "Authorization: Bearer $ACCESS_TOKEN "