{"openapi":"3.1.0","info":{"title":"Vigilly API","version":"1.0.0","description":"REST API exposing the actions of the Vigilly product. Authenticate with a Kavaro API key as a bearer token."},"servers":[{"url":"https://kavaro.ai"}],"components":{"securitySchemes":{"ApiKeyAuth":{"type":"http","scheme":"bearer","description":"A Kavaro API key (user- or organization-scoped)."}}},"security":[{"ApiKeyAuth":[]}],"paths":{"/api/rest/actions/list_services":{"post":{"operationId":"list_services","summary":"List services","description":"List all monitored services for the organization, with their GitHub repo and enabled capabilities.","tags":["actions"],"security":[{"ApiKeyAuth":[]}],"x-required-permissions":["services:view"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{},"additionalProperties":false}}}},"responses":{"200":{"description":"Action result","content":{"application/json":{"schema":{"type":"object","properties":{"result":{}}}}}},"400":{"description":"Invalid input"},"401":{"description":"Missing or invalid API key"},"403":{"description":"The key may not invoke this action"},"404":{"description":"Unknown action"}}}},"/api/rest/actions/get_service":{"post":{"operationId":"get_service","summary":"Get service","description":"Get a single monitored service incl. enabled capabilities and ingestion keys/DSN.","tags":["actions"],"security":[{"ApiKeyAuth":[]}],"x-required-permissions":["services:view"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"serviceId":{"type":"string","description":"The service id"}},"required":["serviceId"],"additionalProperties":false}}}},"responses":{"200":{"description":"Action result","content":{"application/json":{"schema":{"type":"object","properties":{"result":{}}}}}},"400":{"description":"Invalid input"},"401":{"description":"Missing or invalid API key"},"403":{"description":"The key may not invoke this action"},"404":{"description":"Unknown action"}}}},"/api/rest/actions/create_service":{"post":{"operationId":"create_service","summary":"Create service","description":"Register a new monitored service, tied to a GitHub repository.","tags":["actions"],"security":[{"ApiKeyAuth":[]}],"x-required-permissions":["services:edit"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"name":{"type":"string","minLength":1,"description":"Service name"},"environment":{"description":"e.g. production, staging","type":"string"},"githubOwner":{"description":"GitHub repo owner/org","type":"string"},"githubRepo":{"description":"GitHub repo name","type":"string"}},"required":["name"],"additionalProperties":false}}}},"responses":{"200":{"description":"Action result","content":{"application/json":{"schema":{"type":"object","properties":{"result":{}}}}}},"400":{"description":"Invalid input"},"401":{"description":"Missing or invalid API key"},"403":{"description":"The key may not invoke this action"},"404":{"description":"Unknown action"}}}},"/api/rest/actions/update_service":{"post":{"operationId":"update_service","summary":"Update service","description":"Update a monitored service's name, environment or linked GitHub repository.","tags":["actions"],"security":[{"ApiKeyAuth":[]}],"x-required-permissions":["services:edit"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"serviceId":{"type":"string"},"name":{"type":"string","minLength":1},"environment":{"anyOf":[{"type":"string"},{"type":"null"}]},"githubOwner":{"anyOf":[{"type":"string"},{"type":"null"}]},"githubRepo":{"anyOf":[{"type":"string"},{"type":"null"}]}},"required":["serviceId"],"additionalProperties":false}}}},"responses":{"200":{"description":"Action result","content":{"application/json":{"schema":{"type":"object","properties":{"result":{}}}}}},"400":{"description":"Invalid input"},"401":{"description":"Missing or invalid API key"},"403":{"description":"The key may not invoke this action"},"404":{"description":"Unknown action"}}}},"/api/rest/actions/delete_service":{"post":{"operationId":"delete_service","summary":"Delete service","description":"Delete a monitored service and all its data.","tags":["actions"],"security":[{"ApiKeyAuth":[]}],"x-required-permissions":["services:delete"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"serviceId":{"type":"string"}},"required":["serviceId"],"additionalProperties":false}}}},"responses":{"200":{"description":"Action result","content":{"application/json":{"schema":{"type":"object","properties":{"result":{}}}}}},"400":{"description":"Invalid input"},"401":{"description":"Missing or invalid API key"},"403":{"description":"The key may not invoke this action"},"404":{"description":"Unknown action"}}}},"/api/rest/actions/enable_capability":{"post":{"operationId":"enable_capability","summary":"Enable capability","description":"Enable a paid capability (metrics, exceptions or on-call) for a service. This is billed at €1/month per service.","tags":["actions"],"security":[{"ApiKeyAuth":[]}],"x-required-permissions":["services:edit"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"serviceId":{"type":"string"},"capability":{"type":"string","enum":["metrics","exceptions","oncall"]}},"required":["serviceId","capability"],"additionalProperties":false}}}},"responses":{"200":{"description":"Action result","content":{"application/json":{"schema":{"type":"object","properties":{"result":{}}}}}},"400":{"description":"Invalid input"},"401":{"description":"Missing or invalid API key"},"403":{"description":"The key may not invoke this action"},"404":{"description":"Unknown action"}}}},"/api/rest/actions/disable_capability":{"post":{"operationId":"disable_capability","summary":"Disable capability","description":"Disable a paid capability for a service (stops billing it at the next renewal).","tags":["actions"],"security":[{"ApiKeyAuth":[]}],"x-required-permissions":["services:edit"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"serviceId":{"type":"string"},"capability":{"type":"string","enum":["metrics","exceptions","oncall"]}},"required":["serviceId","capability"],"additionalProperties":false}}}},"responses":{"200":{"description":"Action result","content":{"application/json":{"schema":{"type":"object","properties":{"result":{}}}}}},"400":{"description":"Invalid input"},"401":{"description":"Missing or invalid API key"},"403":{"description":"The key may not invoke this action"},"404":{"description":"Unknown action"}}}},"/api/rest/actions/set_retention":{"post":{"operationId":"set_retention","summary":"Set retention","description":"Set the retention window (days) for a capability on a service.","tags":["actions"],"security":[{"ApiKeyAuth":[]}],"x-required-permissions":["services:edit"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"serviceId":{"type":"string"},"capability":{"type":"string","enum":["metrics","exceptions","oncall"]},"retentionDays":{"type":"integer","minimum":1,"maximum":400}},"required":["serviceId","capability","retentionDays"],"additionalProperties":false}}}},"responses":{"200":{"description":"Action result","content":{"application/json":{"schema":{"type":"object","properties":{"result":{}}}}}},"400":{"description":"Invalid input"},"401":{"description":"Missing or invalid API key"},"403":{"description":"The key may not invoke this action"},"404":{"description":"Unknown action"}}}},"/api/rest/actions/rotate_ingest_key":{"post":{"operationId":"rotate_ingest_key","summary":"Rotate ingest key","description":"Generate a fresh ingestion API key + Sentry DSN for a service, revoking the previous one.","tags":["actions"],"security":[{"ApiKeyAuth":[]}],"x-required-permissions":["services:edit"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"serviceId":{"type":"string"}},"required":["serviceId"],"additionalProperties":false}}}},"responses":{"200":{"description":"Action result","content":{"application/json":{"schema":{"type":"object","properties":{"result":{}}}}}},"400":{"description":"Invalid input"},"401":{"description":"Missing or invalid API key"},"403":{"description":"The key may not invoke this action"},"404":{"description":"Unknown action"}}}},"/api/rest/actions/list_dashboards":{"post":{"operationId":"list_dashboards","summary":"List dashboards","description":"List all metric dashboards.","tags":["actions"],"security":[{"ApiKeyAuth":[]}],"x-required-permissions":["dashboards:view"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{},"additionalProperties":false}}}},"responses":{"200":{"description":"Action result","content":{"application/json":{"schema":{"type":"object","properties":{"result":{}}}}}},"400":{"description":"Invalid input"},"401":{"description":"Missing or invalid API key"},"403":{"description":"The key may not invoke this action"},"404":{"description":"Unknown action"}}}},"/api/rest/actions/get_dashboard":{"post":{"operationId":"get_dashboard","summary":"Get dashboard","description":"Get a dashboard and its widget layout.","tags":["actions"],"security":[{"ApiKeyAuth":[]}],"x-required-permissions":["dashboards:view"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"dashboardId":{"type":"string"}},"required":["dashboardId"],"additionalProperties":false}}}},"responses":{"200":{"description":"Action result","content":{"application/json":{"schema":{"type":"object","properties":{"result":{}}}}}},"400":{"description":"Invalid input"},"401":{"description":"Missing or invalid API key"},"403":{"description":"The key may not invoke this action"},"404":{"description":"Unknown action"}}}},"/api/rest/actions/create_dashboard":{"post":{"operationId":"create_dashboard","summary":"Create dashboard","description":"Create a dashboard. Widgets are an array of {type, title, query, options, grid:{x,y,w,h}}.","tags":["actions"],"security":[{"ApiKeyAuth":[]}],"x-required-permissions":["dashboards:edit"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"name":{"type":"string","minLength":1},"serviceId":{"description":"Scope the dashboard to a service, or omit for org-wide","type":"string"},"layout":{"description":"Widget layout array","type":"array","items":{}}},"required":["name"],"additionalProperties":false}}}},"responses":{"200":{"description":"Action result","content":{"application/json":{"schema":{"type":"object","properties":{"result":{}}}}}},"400":{"description":"Invalid input"},"401":{"description":"Missing or invalid API key"},"403":{"description":"The key may not invoke this action"},"404":{"description":"Unknown action"}}}},"/api/rest/actions/update_dashboard":{"post":{"operationId":"update_dashboard","summary":"Update dashboard","description":"Rename a dashboard or replace its widget layout.","tags":["actions"],"security":[{"ApiKeyAuth":[]}],"x-required-permissions":["dashboards:edit"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"dashboardId":{"type":"string"},"name":{"type":"string","minLength":1},"layout":{"type":"array","items":{}}},"required":["dashboardId"],"additionalProperties":false}}}},"responses":{"200":{"description":"Action result","content":{"application/json":{"schema":{"type":"object","properties":{"result":{}}}}}},"400":{"description":"Invalid input"},"401":{"description":"Missing or invalid API key"},"403":{"description":"The key may not invoke this action"},"404":{"description":"Unknown action"}}}},"/api/rest/actions/delete_dashboard":{"post":{"operationId":"delete_dashboard","summary":"Delete dashboard","description":"Delete a dashboard.","tags":["actions"],"security":[{"ApiKeyAuth":[]}],"x-required-permissions":["dashboards:edit"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"dashboardId":{"type":"string"}},"required":["dashboardId"],"additionalProperties":false}}}},"responses":{"200":{"description":"Action result","content":{"application/json":{"schema":{"type":"object","properties":{"result":{}}}}}},"400":{"description":"Invalid input"},"401":{"description":"Missing or invalid API key"},"403":{"description":"The key may not invoke this action"},"404":{"description":"Unknown action"}}}},"/api/rest/actions/query_metric":{"post":{"operationId":"query_metric","summary":"Query metric","description":"Query a metric's aggregated time series for a service over a window, for charts or analysis.","tags":["actions"],"security":[{"ApiKeyAuth":[]}],"x-required-permissions":["dashboards:view"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"serviceId":{"type":"string"},"metricName":{"type":"string"},"windowMinutes":{"description":"Lookback window; default 60","type":"integer","minimum":1,"maximum":10080},"aggregation":{"type":"string","enum":["avg","sum","min","max","last","count"]}},"required":["serviceId","metricName"],"additionalProperties":false}}}},"responses":{"200":{"description":"Action result","content":{"application/json":{"schema":{"type":"object","properties":{"result":{}}}}}},"400":{"description":"Invalid input"},"401":{"description":"Missing or invalid API key"},"403":{"description":"The key may not invoke this action"},"404":{"description":"Unknown action"}}}},"/api/rest/actions/list_metric_names":{"post":{"operationId":"list_metric_names","summary":"List metric names","description":"List the distinct metric names ingested for a service.","tags":["actions"],"security":[{"ApiKeyAuth":[]}],"x-required-permissions":["dashboards:view"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"serviceId":{"type":"string"}},"required":["serviceId"],"additionalProperties":false}}}},"responses":{"200":{"description":"Action result","content":{"application/json":{"schema":{"type":"object","properties":{"result":{}}}}}},"400":{"description":"Invalid input"},"401":{"description":"Missing or invalid API key"},"403":{"description":"The key may not invoke this action"},"404":{"description":"Unknown action"}}}},"/api/rest/actions/list_exception_groups":{"post":{"operationId":"list_exception_groups","summary":"List exceptions","description":"List deduplicated exception groups, optionally filtered by service and status.","tags":["actions"],"security":[{"ApiKeyAuth":[]}],"x-required-permissions":["exceptions:view"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"serviceId":{"type":"string"},"status":{"type":"string","enum":["unresolved","resolved","ignored"]}},"additionalProperties":false}}}},"responses":{"200":{"description":"Action result","content":{"application/json":{"schema":{"type":"object","properties":{"result":{}}}}}},"400":{"description":"Invalid input"},"401":{"description":"Missing or invalid API key"},"403":{"description":"The key may not invoke this action"},"404":{"description":"Unknown action"}}}},"/api/rest/actions/get_exception_group":{"post":{"operationId":"get_exception_group","summary":"Get exception","description":"Get a single exception group: AI pattern/name, triage, 7-day daily counts, recent events.","tags":["actions"],"security":[{"ApiKeyAuth":[]}],"x-required-permissions":["exceptions:view"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"groupId":{"type":"string"}},"required":["groupId"],"additionalProperties":false}}}},"responses":{"200":{"description":"Action result","content":{"application/json":{"schema":{"type":"object","properties":{"result":{}}}}}},"400":{"description":"Invalid input"},"401":{"description":"Missing or invalid API key"},"403":{"description":"The key may not invoke this action"},"404":{"description":"Unknown action"}}}},"/api/rest/actions/set_exception_status":{"post":{"operationId":"set_exception_status","summary":"Set exception status","description":"Mark an exception group as resolved, ignored, or back to unresolved.","tags":["actions"],"security":[{"ApiKeyAuth":[]}],"x-required-permissions":["exceptions:edit"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"groupId":{"type":"string"},"status":{"type":"string","enum":["unresolved","resolved","ignored"]}},"required":["groupId","status"],"additionalProperties":false}}}},"responses":{"200":{"description":"Action result","content":{"application/json":{"schema":{"type":"object","properties":{"result":{}}}}}},"400":{"description":"Invalid input"},"401":{"description":"Missing or invalid API key"},"403":{"description":"The key may not invoke this action"},"404":{"description":"Unknown action"}}}},"/api/rest/actions/list_teams":{"post":{"operationId":"list_teams","summary":"List teams","description":"List on-call teams with their members.","tags":["actions"],"security":[{"ApiKeyAuth":[]}],"x-required-permissions":["oncall:view"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{},"additionalProperties":false}}}},"responses":{"200":{"description":"Action result","content":{"application/json":{"schema":{"type":"object","properties":{"result":{}}}}}},"400":{"description":"Invalid input"},"401":{"description":"Missing or invalid API key"},"403":{"description":"The key may not invoke this action"},"404":{"description":"Unknown action"}}}},"/api/rest/actions/create_team":{"post":{"operationId":"create_team","summary":"Create team","description":"Create an on-call team.","tags":["actions"],"security":[{"ApiKeyAuth":[]}],"x-required-permissions":["oncall:edit"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"name":{"type":"string","minLength":1}},"required":["name"],"additionalProperties":false}}}},"responses":{"200":{"description":"Action result","content":{"application/json":{"schema":{"type":"object","properties":{"result":{}}}}}},"400":{"description":"Invalid input"},"401":{"description":"Missing or invalid API key"},"403":{"description":"The key may not invoke this action"},"404":{"description":"Unknown action"}}}},"/api/rest/actions/update_team":{"post":{"operationId":"update_team","summary":"Update team","description":"Rename an on-call team.","tags":["actions"],"security":[{"ApiKeyAuth":[]}],"x-required-permissions":["oncall:edit"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"teamId":{"type":"string"},"name":{"type":"string","minLength":1}},"required":["teamId","name"],"additionalProperties":false}}}},"responses":{"200":{"description":"Action result","content":{"application/json":{"schema":{"type":"object","properties":{"result":{}}}}}},"400":{"description":"Invalid input"},"401":{"description":"Missing or invalid API key"},"403":{"description":"The key may not invoke this action"},"404":{"description":"Unknown action"}}}},"/api/rest/actions/delete_team":{"post":{"operationId":"delete_team","summary":"Delete team","description":"Delete an on-call team and its schedules/policies.","tags":["actions"],"security":[{"ApiKeyAuth":[]}],"x-required-permissions":["oncall:edit"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"teamId":{"type":"string"}},"required":["teamId"],"additionalProperties":false}}}},"responses":{"200":{"description":"Action result","content":{"application/json":{"schema":{"type":"object","properties":{"result":{}}}}}},"400":{"description":"Invalid input"},"401":{"description":"Missing or invalid API key"},"403":{"description":"The key may not invoke this action"},"404":{"description":"Unknown action"}}}},"/api/rest/actions/add_team_member":{"post":{"operationId":"add_team_member","summary":"Add team member","description":"Add an organization user to an on-call team, with their contact channels.","tags":["actions"],"security":[{"ApiKeyAuth":[]}],"x-required-permissions":["oncall:edit"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"teamId":{"type":"string"},"userId":{"type":"string"},"phone":{"description":"E.164 phone for SMS/voice, e.g. +4512345678","type":"string"},"smsEnabled":{"type":"boolean"},"callEnabled":{"type":"boolean"},"pushEnabled":{"type":"boolean"},"emailEnabled":{"type":"boolean"}},"required":["teamId","userId"],"additionalProperties":false}}}},"responses":{"200":{"description":"Action result","content":{"application/json":{"schema":{"type":"object","properties":{"result":{}}}}}},"400":{"description":"Invalid input"},"401":{"description":"Missing or invalid API key"},"403":{"description":"The key may not invoke this action"},"404":{"description":"Unknown action"}}}},"/api/rest/actions/update_team_member":{"post":{"operationId":"update_team_member","summary":"Update team member","description":"Update a team member's phone or channel preferences.","tags":["actions"],"security":[{"ApiKeyAuth":[]}],"x-required-permissions":["oncall:edit"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"memberId":{"type":"string"},"phone":{"anyOf":[{"type":"string"},{"type":"null"}]},"smsEnabled":{"type":"boolean"},"callEnabled":{"type":"boolean"},"pushEnabled":{"type":"boolean"},"emailEnabled":{"type":"boolean"},"sortOrder":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991}},"required":["memberId"],"additionalProperties":false}}}},"responses":{"200":{"description":"Action result","content":{"application/json":{"schema":{"type":"object","properties":{"result":{}}}}}},"400":{"description":"Invalid input"},"401":{"description":"Missing or invalid API key"},"403":{"description":"The key may not invoke this action"},"404":{"description":"Unknown action"}}}},"/api/rest/actions/remove_team_member":{"post":{"operationId":"remove_team_member","summary":"Remove team member","description":"Remove a member from an on-call team.","tags":["actions"],"security":[{"ApiKeyAuth":[]}],"x-required-permissions":["oncall:edit"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"memberId":{"type":"string"}},"required":["memberId"],"additionalProperties":false}}}},"responses":{"200":{"description":"Action result","content":{"application/json":{"schema":{"type":"object","properties":{"result":{}}}}}},"400":{"description":"Invalid input"},"401":{"description":"Missing or invalid API key"},"403":{"description":"The key may not invoke this action"},"404":{"description":"Unknown action"}}}},"/api/rest/actions/create_schedule":{"post":{"operationId":"create_schedule","summary":"Create schedule","description":"Create an on-call schedule for a team. rotationConfig is {userIds:[], shiftHours?}.","tags":["actions"],"security":[{"ApiKeyAuth":[]}],"x-required-permissions":["oncall:edit"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"teamId":{"type":"string"},"name":{"type":"string","minLength":1},"timezone":{"type":"string"},"rotationType":{"type":"string","enum":["daily","weekly"]},"rotationConfig":{"type":"object","properties":{"userIds":{"type":"array","items":{"type":"string"}},"shiftHours":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991}},"required":["userIds"],"additionalProperties":false},"startAt":{}},"required":["teamId","name"],"additionalProperties":false}}}},"responses":{"200":{"description":"Action result","content":{"application/json":{"schema":{"type":"object","properties":{"result":{}}}}}},"400":{"description":"Invalid input"},"401":{"description":"Missing or invalid API key"},"403":{"description":"The key may not invoke this action"},"404":{"description":"Unknown action"}}}},"/api/rest/actions/update_schedule":{"post":{"operationId":"update_schedule","summary":"Update schedule","description":"Update an on-call schedule's name, timezone or rotation.","tags":["actions"],"security":[{"ApiKeyAuth":[]}],"x-required-permissions":["oncall:edit"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"scheduleId":{"type":"string"},"name":{"type":"string","minLength":1},"timezone":{"type":"string"},"rotationType":{"type":"string","enum":["daily","weekly"]},"rotationConfig":{"type":"object","properties":{"userIds":{"type":"array","items":{"type":"string"}},"shiftHours":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991}},"required":["userIds"],"additionalProperties":false}},"required":["scheduleId"],"additionalProperties":false}}}},"responses":{"200":{"description":"Action result","content":{"application/json":{"schema":{"type":"object","properties":{"result":{}}}}}},"400":{"description":"Invalid input"},"401":{"description":"Missing or invalid API key"},"403":{"description":"The key may not invoke this action"},"404":{"description":"Unknown action"}}}},"/api/rest/actions/delete_schedule":{"post":{"operationId":"delete_schedule","summary":"Delete schedule","description":"Delete an on-call schedule.","tags":["actions"],"security":[{"ApiKeyAuth":[]}],"x-required-permissions":["oncall:edit"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"scheduleId":{"type":"string"}},"required":["scheduleId"],"additionalProperties":false}}}},"responses":{"200":{"description":"Action result","content":{"application/json":{"schema":{"type":"object","properties":{"result":{}}}}}},"400":{"description":"Invalid input"},"401":{"description":"Missing or invalid API key"},"403":{"description":"The key may not invoke this action"},"404":{"description":"Unknown action"}}}},"/api/rest/actions/create_schedule_override":{"post":{"operationId":"create_schedule_override","summary":"Add schedule override","description":"Override who is on call for a window (swap/holiday cover).","tags":["actions"],"security":[{"ApiKeyAuth":[]}],"x-required-permissions":["oncall:edit"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"scheduleId":{"type":"string"},"userId":{"type":"string"},"startAt":{},"endAt":{}},"required":["scheduleId","userId","startAt","endAt"],"additionalProperties":false}}}},"responses":{"200":{"description":"Action result","content":{"application/json":{"schema":{"type":"object","properties":{"result":{}}}}}},"400":{"description":"Invalid input"},"401":{"description":"Missing or invalid API key"},"403":{"description":"The key may not invoke this action"},"404":{"description":"Unknown action"}}}},"/api/rest/actions/who_is_on_call":{"post":{"operationId":"who_is_on_call","summary":"Who is on call","description":"Resolve who is currently on call for a team (and per schedule).","tags":["actions"],"security":[{"ApiKeyAuth":[]}],"x-required-permissions":["oncall:view"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"teamId":{"type":"string"}},"required":["teamId"],"additionalProperties":false}}}},"responses":{"200":{"description":"Action result","content":{"application/json":{"schema":{"type":"object","properties":{"result":{}}}}}},"400":{"description":"Invalid input"},"401":{"description":"Missing or invalid API key"},"403":{"description":"The key may not invoke this action"},"404":{"description":"Unknown action"}}}},"/api/rest/actions/create_escalation_policy":{"post":{"operationId":"create_escalation_policy","summary":"Create escalation policy","description":"Create an escalation policy. steps is an ordered array of {afterMinutes, channels[], targetUserIds?[], useSchedule?}.","tags":["actions"],"security":[{"ApiKeyAuth":[]}],"x-required-permissions":["oncall:edit"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"teamId":{"type":"string"},"name":{"type":"string","minLength":1},"steps":{"minItems":1,"type":"array","items":{"type":"object","properties":{"afterMinutes":{"type":"integer","minimum":0,"maximum":9007199254740991},"channels":{"minItems":1,"type":"array","items":{"type":"string","enum":["sms","call","push","email"]}},"targetUserIds":{"type":"array","items":{"type":"string"}},"useSchedule":{"type":"boolean"}},"required":["afterMinutes","channels"],"additionalProperties":false}}},"required":["teamId","name","steps"],"additionalProperties":false}}}},"responses":{"200":{"description":"Action result","content":{"application/json":{"schema":{"type":"object","properties":{"result":{}}}}}},"400":{"description":"Invalid input"},"401":{"description":"Missing or invalid API key"},"403":{"description":"The key may not invoke this action"},"404":{"description":"Unknown action"}}}},"/api/rest/actions/update_escalation_policy":{"post":{"operationId":"update_escalation_policy","summary":"Update escalation policy","description":"Update an escalation policy's name or steps.","tags":["actions"],"security":[{"ApiKeyAuth":[]}],"x-required-permissions":["oncall:edit"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"policyId":{"type":"string"},"name":{"type":"string","minLength":1},"steps":{"type":"array","items":{"type":"object","properties":{"afterMinutes":{"type":"integer","minimum":0,"maximum":9007199254740991},"channels":{"minItems":1,"type":"array","items":{"type":"string","enum":["sms","call","push","email"]}},"targetUserIds":{"type":"array","items":{"type":"string"}},"useSchedule":{"type":"boolean"}},"required":["afterMinutes","channels"],"additionalProperties":false}}},"required":["policyId"],"additionalProperties":false}}}},"responses":{"200":{"description":"Action result","content":{"application/json":{"schema":{"type":"object","properties":{"result":{}}}}}},"400":{"description":"Invalid input"},"401":{"description":"Missing or invalid API key"},"403":{"description":"The key may not invoke this action"},"404":{"description":"Unknown action"}}}},"/api/rest/actions/delete_escalation_policy":{"post":{"operationId":"delete_escalation_policy","summary":"Delete escalation policy","description":"Delete an escalation policy.","tags":["actions"],"security":[{"ApiKeyAuth":[]}],"x-required-permissions":["oncall:edit"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"policyId":{"type":"string"}},"required":["policyId"],"additionalProperties":false}}}},"responses":{"200":{"description":"Action result","content":{"application/json":{"schema":{"type":"object","properties":{"result":{}}}}}},"400":{"description":"Invalid input"},"401":{"description":"Missing or invalid API key"},"403":{"description":"The key may not invoke this action"},"404":{"description":"Unknown action"}}}},"/api/rest/actions/create_alert_rule":{"post":{"operationId":"create_alert_rule","summary":"Create alert rule","description":"Create an alert rule that turns metric breaches or new exceptions into incidents. For metric_threshold, config is {metricName, comparator:'>'|'>='|'<'|'<=', threshold, windowMinutes, aggregation}. For exception, config is {minSeverity}.","tags":["actions"],"security":[{"ApiKeyAuth":[]}],"x-required-permissions":["oncall:edit"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"serviceId":{"type":"string"},"name":{"type":"string","minLength":1},"kind":{"type":"string","enum":["metric_threshold","exception"]},"config":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{}},"escalationPolicyId":{"type":"string"},"enabled":{"type":"boolean"}},"required":["serviceId","name","kind","config"],"additionalProperties":false}}}},"responses":{"200":{"description":"Action result","content":{"application/json":{"schema":{"type":"object","properties":{"result":{}}}}}},"400":{"description":"Invalid input"},"401":{"description":"Missing or invalid API key"},"403":{"description":"The key may not invoke this action"},"404":{"description":"Unknown action"}}}},"/api/rest/actions/update_alert_rule":{"post":{"operationId":"update_alert_rule","summary":"Update alert rule","description":"Update an alert rule.","tags":["actions"],"security":[{"ApiKeyAuth":[]}],"x-required-permissions":["oncall:edit"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"ruleId":{"type":"string"},"name":{"type":"string","minLength":1},"config":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{}},"escalationPolicyId":{"anyOf":[{"type":"string"},{"type":"null"}]},"enabled":{"type":"boolean"}},"required":["ruleId"],"additionalProperties":false}}}},"responses":{"200":{"description":"Action result","content":{"application/json":{"schema":{"type":"object","properties":{"result":{}}}}}},"400":{"description":"Invalid input"},"401":{"description":"Missing or invalid API key"},"403":{"description":"The key may not invoke this action"},"404":{"description":"Unknown action"}}}},"/api/rest/actions/delete_alert_rule":{"post":{"operationId":"delete_alert_rule","summary":"Delete alert rule","description":"Delete an alert rule.","tags":["actions"],"security":[{"ApiKeyAuth":[]}],"x-required-permissions":["oncall:edit"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"ruleId":{"type":"string"}},"required":["ruleId"],"additionalProperties":false}}}},"responses":{"200":{"description":"Action result","content":{"application/json":{"schema":{"type":"object","properties":{"result":{}}}}}},"400":{"description":"Invalid input"},"401":{"description":"Missing or invalid API key"},"403":{"description":"The key may not invoke this action"},"404":{"description":"Unknown action"}}}},"/api/rest/actions/list_incidents":{"post":{"operationId":"list_incidents","summary":"List incidents","description":"List incidents, optionally filtered by service and status.","tags":["actions"],"security":[{"ApiKeyAuth":[]}],"x-required-permissions":["oncall:view"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"serviceId":{"type":"string"},"status":{"type":"string","enum":["triggered","acknowledged","resolved"]}},"additionalProperties":false}}}},"responses":{"200":{"description":"Action result","content":{"application/json":{"schema":{"type":"object","properties":{"result":{}}}}}},"400":{"description":"Invalid input"},"401":{"description":"Missing or invalid API key"},"403":{"description":"The key may not invoke this action"},"404":{"description":"Unknown action"}}}},"/api/rest/actions/get_incident":{"post":{"operationId":"get_incident","summary":"Get incident","description":"Get a single incident with its notification log.","tags":["actions"],"security":[{"ApiKeyAuth":[]}],"x-required-permissions":["oncall:view"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"incidentId":{"type":"string"}},"required":["incidentId"],"additionalProperties":false}}}},"responses":{"200":{"description":"Action result","content":{"application/json":{"schema":{"type":"object","properties":{"result":{}}}}}},"400":{"description":"Invalid input"},"401":{"description":"Missing or invalid API key"},"403":{"description":"The key may not invoke this action"},"404":{"description":"Unknown action"}}}},"/api/rest/actions/acknowledge_incident":{"post":{"operationId":"acknowledge_incident","summary":"Acknowledge incident","description":"Acknowledge an incident, pausing escalation.","tags":["actions"],"security":[{"ApiKeyAuth":[]}],"x-required-permissions":["oncall:edit"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"incidentId":{"type":"string"}},"required":["incidentId"],"additionalProperties":false}}}},"responses":{"200":{"description":"Action result","content":{"application/json":{"schema":{"type":"object","properties":{"result":{}}}}}},"400":{"description":"Invalid input"},"401":{"description":"Missing or invalid API key"},"403":{"description":"The key may not invoke this action"},"404":{"description":"Unknown action"}}}},"/api/rest/actions/resolve_incident":{"post":{"operationId":"resolve_incident","summary":"Resolve incident","description":"Resolve an incident.","tags":["actions"],"security":[{"ApiKeyAuth":[]}],"x-required-permissions":["oncall:edit"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"incidentId":{"type":"string"}},"required":["incidentId"],"additionalProperties":false}}}},"responses":{"200":{"description":"Action result","content":{"application/json":{"schema":{"type":"object","properties":{"result":{}}}}}},"400":{"description":"Invalid input"},"401":{"description":"Missing or invalid API key"},"403":{"description":"The key may not invoke this action"},"404":{"description":"Unknown action"}}}}}}