1. Documentation
  2. HTTP API
  3. Admin endpoints
ReadmeGitHub
  • Introduction
  • Quickstart
  • CLI
  • Configuration
  • Identity
  • Branding
  • Themes
  • Monitors
  • Checks and scheduling
  • Metrics and badges
  • Incidents
  • Maintenance
  • Notifications
  • Subscribers
  • React Router
  • Next.js
  • Astro
  • SQLite
  • Cloudflare D1
  • PostgreSQL
  • Schema and migrations
  • Cloudflare
  • Vercel
  • Self-hosting
  • API overview
  • Status endpoints
  • Incident endpoints
  • Maintenance endpoints
  • Subscriber endpoints
  • Badges, feeds and metrics
  • Admin endpoints
  • The check run
  • Uptime and history
  • Automatic incidents
  • Notification delivery
  • Public subscriptions

Admin endpoints

Authentication, running checks on demand and reading the notification log.

The public page can be read without a token. To trigger checks or change incidents and maintenance through HTTP, configure adminToken and send it with requests under /admin/*. Without a token configured, those routes stay closed.

Authentication

http
Authorization: Bearer <admin-token>

The token comes only from adminToken in the configuration. There is no environment-variable fallback; omitting it keeps the management API closed.

SituationResponse
No token configured503 { "error": "The management API is disabled. Set adminToken in heyo-status.config.ts." }
Missing or wrong header401 { "error": "Unauthorized." }

Comparison is constant time, and the header is matched case-insensitively against Bearer <token>.

No token, no management API

Until you configure adminToken, management routes return 503. Keep the token out of source control when enabling them.

ts
heyoStatus({  // …  adminToken: "your-private-token", // do not commit production credentials});

Generate one with openssl rand -hex 32 and provide it to the config from a private secret source. Do not commit production credentials; there is no token list to maintain. In the shell examples below, $ADMIN_TOKEN means the same configured token; it is not an environment variable read by Heyo Status.

POST /admin/checks/run

Runs every configured monitor once, stores the results, reconciles automatic incidents and dispatches notifications. It is the same code path as the scheduler.

bash
curl -X POST https://status.acme.com/api/heyo-status/admin/checks/run \  -H "authorization: Bearer $ADMIN_TOKEN"
json
[  {    "name": "Website",    "type": "http",    "status": true,    "message": "HTTP 200",    "latencyMs": 96,    "checkedAt": "2026-01-01T12:00:00.000Z"  }]
ResponseWhen
200Results array.
501{ "error": "Manual checks require the status-page runtime." } — the app was built with createStatusApp() without a runChecks option.

Call it from an external scheduler if your platform has no cron, or run it after deployment to verify a monitor change. It runs checks, but not the summary or cleanup jobs.

Only checks have an HTTP trigger

Summarize and cleanup have no route. Run them with heyo-status, with scheduleStatusPage(), or through your platform's cron integration.

GET /admin/notifications/log

Every delivery attempt, newest first.

bash
curl -H "authorization: Bearer $ADMIN_TOKEN" \  "https://status.acme.com/api/heyo-status/admin/notifications/log?status=failed&limit=20"
QueryTypeNotes
channelIdstringexact match
eventTypeany event namecomma-separated
statussent, failedcomma-separated
limitnon-negative integer
offsetnon-negative integer
json
[  {    "id": "ntf_6ac204",    "channelId": "slack",    "channelType": "slack",    "eventType": "monitor.down",    "status": "failed",    "attempts": 1,    "error": "Slack delivery failed with HTTP 404: no_service",    "monitorName": "API",    "incidentId": null,    "maintenanceId": null,    "createdAt": "2026-01-01T10:02:00.000Z"  }]

The log stores no payload, no webhook URL, no credentials and no recipient. It exists to debug delivery, not to replay it.

Incident and maintenance management

Documented in full in the incident endpoints and maintenance endpoints:

MethodPath
POST/admin/incidents
POST/admin/incidents/:id/updates
PATCH/admin/incidents/:id
DELETE/admin/incidents/:id
POST/admin/maintenance
PATCH/admin/maintenance/:id
DELETE/admin/maintenance/:id

Scripting it

scripts/open-incident.ts
const base = "https://status.acme.com/api/heyo-status";const adminToken = "your-private-token"; // load from a private sourceconst headers = {  authorization: `Bearer ${adminToken}`,  "content-type": "application/json",};const incident = await fetch(`${base}/admin/incidents`, {  method: "POST",  headers,  body: JSON.stringify({    title: "Deploy rollback in progress",    severity: "major",    affectedMonitors: ["API"],    message: "Rolling back the 14:02 deploy.",  }),}).then((response) => response.json());await fetch(`${base}/admin/incidents/${incident.id}/updates`, {  method: "POST",  headers,  body: JSON.stringify({ status: "resolved", message: "Rollback complete." }),});

For a local or CI context, the CLI does the same without a token or a network round trip — it talks to the database directly:

bash
heyo-status incident create --title "…" --severity major --monitors API --message "…"

Related

  • Incident endpoints
  • Maintenance endpoints
  • Configuration
  • CLI commands
Badges, feeds and metrics< PreviousThe check runNext >

Powered by heyo

On this page

AuthenticationPOST /admin/checks/runGET /admin/notifications/logIncident and maintenance managementScripting it