Webhooks
Each webhook endpoint has a secret URL. Point your monitoring tool at it and the component's state follows. Create endpoints in the dashboard, on the page's webhook section; the URL is shown once.
https://stage-status.starhold.app/in/YOUR_ENDPOINT_TOKEN
- Send
POSTwith a JSON body of up to 64 KB, at most 60 requests a minute per endpoint. - Success is
204. A wrong token is404. A body the endpoint does not understand is422with a message that names the shape it expects. Too many requests is429. - A webhook sets the component's state. It never writes a public incident: you stay in charge of the wording your clients read.
- The body is never stored or logged.
Uptime Kuma
- In the dashboard, add a webhook endpoint with source "Uptime Kuma" and pick the component.
- In Uptime Kuma, open Settings, Notifications, Setup Notification. Choose type "Webhook".
- Post URL: your endpoint URL above. Request body: "application/json" (the preset). Save, then attach the notification to your monitor.
Mapping: heartbeat status 1 (up) is operational, 0 (down) is major outage, 3 (maintenance) is maintenance. Status 2 (pending) is ignored.
Better Stack
- Add an endpoint with source "Better Stack" and pick the component.
- In Better Stack Uptime, open Integrations and add a Webhook. Use your endpoint URL and POST, and turn on incident started and incident resolved.
Mapping: incident started is major outage, resolved is operational, acknowledged is ignored.
Grafana
- Add an endpoint with source "Grafana", pick the component, and choose what a firing alert reports (major outage by default, or degraded).
- In Grafana, open Alerting, Contact points, add a contact point of type "Webhook". URL: your endpoint URL. HTTP method: POST. Route your alert rule to it.
Mapping: "status": "firing" becomes the state you chose, "status": "resolved" is operational.
Generic JSON
Anything that can send a POST works. Add an endpoint with source "Generic". On an endpoint bound to one component, send just the state:
curl -X POST https://stage-status.starhold.app/in/YOUR_ENDPOINT_TOKEN \
-H "Content-Type: application/json" \
-d '{"state": "degraded"}'
On an endpoint that is not bound, name the component by its id or its exact name:
{"component": "API", "state": "major_outage"}
State is one of operational, degraded, partial_outage, major_outage, maintenance.
Outbound webhooks
Add a URL in the dashboard, on the page's "Outbound webhooks" section, and every incident and maintenance update on that page is sent to it. The URL must be https on a public address; the signing secret is shown once.
POST your-url
Content-Type: application/json
X-Starhold-Event: incident.update
X-Starhold-Delivery: 42
X-Starhold-Timestamp: 1790000000
X-Starhold-Signature: sha256=HEX
{"body_md":"...","event":"incident.update","page":{"title":"...","url":"..."},"sent_at":"...","status":"investigating","title":"..."}
- Verify:
HMAC-SHA256(secret, timestamp + "." + raw_body)as hex must equal the signature. Reject old timestamps to stop replays. - Any 2xx counts as delivered. Anything else is retried after 1 minute, doubling to 1 hour, for up to 3 days. Redirects are not followed.
- Private pages send only the status and the page link, never the incident text.
- Plan limits: 1 webhook per page on Free, 3 on Private, 10 on MSP. Payloads are not encrypted to a key of yours.