EvoHub Docs Sign in

On-Call API › Schedule layers

Add a layer

Use with AI
View as MarkdownThis page as plain text, for pasting into an AI tool Open in ClaudeAsk Claude questions about this page Open in ChatGPTAsk ChatGPT questions about this page
Connect to Cursor / VS Code / ClaudeSearch and read these docs from your AI tool (MCP server)

MCP server URL

https://docs-dev.evohub.io/mcp

Claude Code

claude mcp add --transport http evohub-docs-docs https://docs-dev.evohub.io/mcp

Claude (claude.ai and Claude Desktop): Settings → Connectors → Add custom connector, and paste the URL above.

Claude Desktop — claude_desktop_config.json

{
  "mcpServers": {
    "evohub-docs-docs": {
      "command": "npx",
      "args": [
        "-y",
        "mcp-remote",
        "https://docs-dev.evohub.io/mcp"
      ]
    }
  }
}

Cursor — ~/.cursor/mcp.json

{
  "mcpServers": {
    "evohub-docs-docs": {
      "url": "https://docs-dev.evohub.io/mcp"
    }
  }
}

VS Code — .vscode/mcp.json

{
  "servers": {
    "evohub-docs-docs": {
      "type": "http",
      "url": "https://docs-dev.evohub.io/mcp"
    }
  }
}
POST/api/v1/schedules/{id}/layers

Adds a rotation layer. A layer runs its people in turn, handing over every day or week from rotation_start (default: now; an unreadable value is ignored). Restrict it to a shift — certain weekdays and a time window in the schedule's timezone — with the three restrict_* fields; a window may cross midnight. Leave them out for a layer that covers all day, every day.

A schedule that belongs to a team is visible only to callers in that team (and to administrators acting in person); others get 404, as if it did not exist.

Permission (API-key scope): oncall:schedule:write.

Authorization

Any one of:

Parameters

Path parameters

  • id string required
    The schedule's id.
    Example: 5b1c7d2e-8f3a-4b9c-a0d1-e2f3a4b5c6d7

Request body required

Content type: application/json

Type: ScheduleLayerWrite

On create name and rotation_type are required.

  • name string
  • priority integer
  • rotation_type RotationType
    One of: daily weekly custom
  • rotation_start string (date-time)
    Defaults to now on create.
  • handoff_day integer
    Minimum: 0 · Maximum: 6
  • handoff_time string
    HH:MM
    Example: 09:00
  • restrict_to_weekdays array of integer
    0 is Sunday.
  • restrict_start_time string
    HH:MM; give the end too. Empty clears the window.
  • restrict_end_time string
    HH:MM; may be earlier than the start for a shift across midnight.

Responses

201

The layer.

Content type: application/json

Type: object

  • data ScheduleLayer required
    Show ScheduleLayer properties
    • id string
    • schedule_id string
    • name string
    • priority integer
      Layers with a higher priority win over lower ones.
    • rotation_type RotationType
      One of: daily weekly custom
    • rotation_start string (date-time)
      When the rota's first turn started.
    • handoff_day integer
      Weekday of the handover for weekly rotas, 0 (Sunday) to 6.
    • handoff_time string
      HH:MM of the handover.
    • restrict_to_weekdays array of integer
    • restrict_start_time string
      HH:MM
    • restrict_end_time string
      HH:MM
    • rotations array of ScheduleRotation
      Show ScheduleRotation properties
      • id string
      • layer_id string
      • user_id string
      • position integer
        0-based place in the rota.
      • created_at string (date-time)
    • created_at string (date-time)
    • updated_at string (date-time)
  • success boolean required
    Value: true

400

The body is not JSON (INVALID_BODY); name or rotation_type is missing, a weekday is outside 0–6, or the shift window is incomplete or malformed (VALIDATION_FAILED).

Content type: application/json

Type: ValidationError

  • error object required
    • code string required
      Value: VALIDATION_FAILED
    • message string required
    • details array of object required
      • field string
      • message string

401

No API key was sent, or it is unknown, revoked or expired (UNAUTHORIZED).

Content type: application/json

Type: Error

  • error object required
    • code string required
      Machine-readable code. Branch on this.
    • message string required
      Human-readable explanation.

403

The key lacks the scope this endpoint needs (FORBIDDEN).

Content type: application/json

Type: Error

  • error object required
    • code string required
      Machine-readable code. Branch on this.
    • message string required
      Human-readable explanation.

404

No schedule with this id in your organization (NOT_FOUND).

Content type: application/json

Type: Error

  • error object required
    • code string required
      Machine-readable code. Branch on this.
    • message string required
      Human-readable explanation.

429

Too many requests (RATE_LIMITED). Wait Retry-After seconds.

Headers

  • Retry-After integer
    Seconds to wait.

Content type: application/json

Type: Error

  • error object required
    • code string required
      Machine-readable code. Branch on this.
    • message string required
      Human-readable explanation.

500

Something went wrong on EvoHub's side (INTERNAL_ERROR). Retry later.

Content type: application/json

Type: Error

  • error object required
    • code string required
      Machine-readable code. Branch on this.
    • message string required
      Human-readable explanation.

Example request

curl -X POST 'https://evohub.io/api/v1/schedules/5b1c7d2e-8f3a-4b9c-a0d1-e2f3a4b5c6d7/layers' \
  -H 'Content-Type: application/json' \
  -H 'Authorization: Bearer <TOKEN>' \
  -d '{
  "name": "Business hours",
  "handoff_day": 1,
  "handoff_time": "09:00",
  "rotation_type": "weekly",
  "rotation_start": "2026-09-01T06:00:00Z",
  "restrict_end_time": "18:00",
  "restrict_start_time": "09:00",
  "restrict_to_weekdays": [
    1,
    2,
    3,
    4,
    5
  ]
}'

Last updated