---
topic: alerts
api: "GET https://ship.embarko.ai/api/apps/{app-name}/incidents"
needs_human: "Adding or removing where alerts go is done by the person in the app's Settings, under Alerts."
requires: [status]
---

[← Guide home](https://embarko.ai/docs)

# Crash alerts

**On this page:** Over HTTP, Examples, Limits, What to tell the person

> Plain words unless the person is a developer. Never invent a link, name or code. [Rules](https://embarko.ai/docs/prerequisites) Needs first: [status](https://embarko.ai/docs/status).

Embarko emails the person who created the app when it goes down or keeps crashing, and again when it works again. Nothing to set up. They can add more emails, a Slack or Discord channel, a webhook, or a phone that rings (M91) in the app's settings.

**Done when:** You know whether the app is having an outage, and the person knows where their alerts go.

**Over HTTP**

1. GET https://ship.embarko.ai/api/apps/{app-name}/incidents with the deploy token: the last 20 outages, newest first.
2. An incident with status "open" is happening now. kind is "down" (stopped and not being restarted) or "crash_loop" (crashing and being restarted). reason says how it exited.
3. cause "app" means the app's own code: read its logs (stream=stderr), fix it and redeploy. cause "platform" means Embarko's side: nothing to fix in the app; tell the person Embarko is on it.

**Example: Recent outages**

```bash
curl -sS -H 'Authorization: Bearer $DEPLOY_TOKEN' 'https://ship.embarko.ai/api/apps/my-app/incidents'
```

Reply 200:

```json
{"incidents":[{"id":"cm…","kind":"crash_loop","status":"resolved","cause":"app","reason":"Exited with code 1.","openedAt":"2026-10-28T11:19:25.000Z","resolvedAt":"2026-10-28T11:29:35.000Z","resolution":"recovered","crashCount":3,"ackedBy":null}]}
```

**Limits**

- One alert when a problem starts and one when it ends, never one per crash. A crash loop is 3 crashes within 10 minutes; "working again" is 5 minutes running without a crash.
- Stops Embarko makes (sleeping when idle, deploys, moves) are never outages. A new version failing its own deploy is reported in the deploy reply, not as an outage.
- When the cause is Embarko's, the person is told only if it is still down after 15 minutes.
- Webhook messages are JSON with event app.down, app.crash_loop, app.oom, app.wake_failed, app.recovered, app.platform_outage or app.platform_recovered. Each carries X-Embarko-Delivery (drop repeats with the same value) and X-Embarko-Signature: t=<unix seconds>,v1=<hex HMAC-SHA256 of "<t>.<raw body>" with the signing secret shown once when the webhook was added>. Slack and Discord addresses get a plain message instead.
- Temporary (unclaimed) apps have no owner, so nobody is alerted until the app is kept.

**What to tell the person**

- failed: "Your app went down. I can see why in its logs and I'm fixing it now."

**Next:** For an open incident with cause "app", read the logs, fix the cause and redeploy. Do not change where alerts go: that is the person's choice, in Settings.

**Related:** [logs](https://embarko.ai/docs/logs) · [status](https://embarko.ai/docs/status) · [rollback](https://embarko.ai/docs/rollback)

---

[Guide home](https://embarko.ai/docs) · JSON: add .json