End a maintenance window
Ends the window and keeps it as completed history: paging resumes, the uptime silences are cleared and the status-page maintenance is marked completed. Completing a completed window changes nothing.
The body is optional. ended_at records when the work actually finished,
for a window closed after the fact; it must be between the window's start
and now (else 400 INVALID_ENDED_AT). Without it the window ends now. The
status page dates its closing update at the same time.
Permission (API-key scope): oncall:maintenance:write.
Authorization
bearerAuth(oncall:maintenance:write)apiKeyHeader(oncall:maintenance:write)
Parameters
Path parameters
idstring requiredThe maintenance window's id.
Request body
ended_atstring (date-time)When the work finished. Between the window's start and now.
Responses
200
The window.
dataMaintenanceWindow requiredShow MaintenanceWindow properties
idstringorg_idstringtitlestringbodystringWhat the maintenance does.starts_atstring (date-time)ends_atstring (date-time)created_bystringcreated_atstring (date-time)ended_atstring (date-time)Set when the window was ended early.silence_oncallbooleanWhether paging is held back during the window.
successboolean required
401
No API key was sent, or it is unknown, revoked or expired (UNAUTHORIZED).
errorobject requiredcodestring requiredMachine-readable code. Branch on this.messagestring requiredHuman-readable explanation.request_idstringThe request'sX-Request-ID. Quote it to support.
403
The key lacks the scope this endpoint needs (FORBIDDEN).
errorobject requiredcodestring requiredMachine-readable code. Branch on this.messagestring requiredHuman-readable explanation.request_idstringThe request'sX-Request-ID. Quote it to support.
404
No maintenance window with this id in your organization (NOT_FOUND).
errorobject requiredcodestring requiredMachine-readable code. Branch on this.messagestring requiredHuman-readable explanation.request_idstringThe request'sX-Request-ID. Quote it to support.
429
Too many requests (RATE_LIMITED). Wait Retry-After seconds.
Retry-AfterintegerSeconds to wait.
errorobject requiredcodestring requiredMachine-readable code. Branch on this.messagestring requiredHuman-readable explanation.request_idstringThe request'sX-Request-ID. Quote it to support.
500
Something went wrong on EvoHub's side (INTERNAL_ERROR). Retry later.
errorobject requiredcodestring requiredMachine-readable code. Branch on this.messagestring requiredHuman-readable explanation.request_idstringThe request'sX-Request-ID. Quote it to support.
Example request
curl -X POST 'https://evohub.io/api/v1/maintenance-windows/c1d2e3f4-a5b6-4c7d-8e9f-0a1b2c3d4e5f/complete' \
-H 'Content-Type: application/json' \
-H 'Authorization: Bearer <TOKEN>' \
-d '{
"ended_at": "2026-10-13T00:00:00Z"
}'
