---
name: dwellir-status
description: Check Dwellir RPC endpoint status (current state, incident history, uptime) and subscribe a human to outage and degradation notifications for specific chains, networks, or endpoints via Atom/RSS, Slack, Discord, or signed webhooks. Use when someone asks whether a Dwellir endpoint is down or lagging, wants status alerts, or wants to unsubscribe.
---

# Dwellir status

Dwellir publishes the health of every RPC endpoint at https://status.dwellir.com. All reads are public JSON without authentication.

Save this file as `~/.claude/skills/dwellir-status/SKILL.md` (or your agent's skills folder) to reuse it.

## Vocabulary

- **Endpoint:** one RPC host, identified by its FQDN, e.g. `api-ethereum-mainnet.n.dwellir.com`.
- **Network:** `<chain slug>/<network key>`, e.g. `ethereum/mainnet`, `base/sepolia-testnet`.
- **Chain:** chain slug, e.g. `ethereum`. A chain covers all its networks and endpoints.
- **Degraded:** over 5 minutes, more than 10% of requests fail (`cause: "errors"`), or at least half of the responses trail the chain head by 30 s or more (`cause: "lag"`).
- **Outage:** over 5 minutes, more than 50% of requests fail.

## 1. Find the components your human uses

```bash
curl -s https://status.dwellir.com/api/status/components
```

The response lists every chain with `networks[].ref` and `networks[].endpoints[].fqdn`.

- If the human gives Dwellir endpoint URLs (`https://api-base-mainnet.n.dwellir.com/<API key>`), use only the host as the endpoint filter. Never send or store the API key path.
- With the Dwellir CLI logged in, `dwellir endpoints list --json` shows the chains and networks they can use.
- Prefer the narrowest filter that matches intent. Follow a chain when they use all of its networks; follow single endpoints when they use one host.

## 2. Check status

`current`, `incidents`, and the feeds accept the filters `chain`, `network`, and `endpoint`. Repeat a parameter or join values with commas. No filter means everything; several filters combine as a union. Unknown or malformed values fail with HTTP 400 and name the bad values.

```bash
# Current state per endpoint, outages first
curl -s "https://status.dwellir.com/api/status/current?chain=base&endpoint=api-ethereum-mainnet.n.dwellir.com"

# Incident history (since: ISO 8601 or 24h, 7d, 30d; status: open, resolved, all; limit up to 200)
curl -s "https://status.dwellir.com/api/status/incidents?network=ethereum/mainnet&since=30d"

# Uptime buckets (range: 24h, 7d, 30d, 90d, 6m, 12m; chain filter only)
curl -s "https://status.dwellir.com/api/status/uptime?range=7d&chain=base"
```

`current` returns `status` (`operational`, `degraded`, `outage`), `cause` (`lag`, `errors`, or null), `since`, and 24-hour uptime per endpoint.

## 3. Subscribe

Confirm the components, the channel, and the minimum severity with your human before you create anything.

### Option A: feed (no signup, nothing to store)

```
https://status.dwellir.com/history.atom?chain=base&network=ethereum/mainnet&endpoint=api-polygon-mainnet.n.dwellir.com
https://status.dwellir.com/history.rss?chain=base
```

- Feed readers poll these URLs. Each entry is one status change (opened, updated, resolved).
- In Slack, the human runs `/feed subscribe <atom URL>` in a channel (needs the Slack RSS app).
- Feeds cover degradations and outages. Use a webhook for outages only.

### Option B: webhook (Slack, Discord, or your own HTTPS endpoint)

```bash
curl -s -X POST https://status.dwellir.com/api/subscriptions \
  -H 'Content-Type: application/json' \
  -d '{
    "url": "https://hooks.slack.com/services/T000/B000/XXXX",
    "chains": ["base"],
    "networks": ["ethereum/mainnet"],
    "endpoints": ["api-polygon-mainnet.n.dwellir.com"],
    "minSeverity": "degraded"
  }'
```

- `url`: a Slack incoming webhook, a Discord webhook, or any public HTTPS URL on port 443. Slack and Discord URLs get formatted messages.
- Omit `chains`, `networks`, and `endpoints` to follow everything.
- `minSeverity`: `degraded` (default) or `outage`.
- Unknown values and unknown fields fail with HTTP 400 and name them. Fix them from step 1.

The `201` response contains:

- `kind`: `webhook`, `slack`, or `discord`.
- `status`: `pending`. We send a `subscription.test` event first. The subscription turns active when that delivery returns 2xx.
- `signingSecret`: shown once. Store it where the receiving service can read it. Never paste it into chat logs or commits.
- `unsubscribeUrl`: shown once. Give it to your human and store it next to the secret.

Errors: 400 invalid input, 409 the URL already has a live subscription, 429 too many signups in the last hour, 503 unavailable.

### Receiving generic webhooks

Each POST has the headers `X-Dwellir-Event`, `X-Dwellir-Delivery`, and `X-Dwellir-Signature: t=<unix seconds>,v1=<hex>`. Verify `v1` = HMAC-SHA256(signingSecret, `<t>.<raw body>`) and reject timestamps older than 5 minutes. The JSON body has `type` (`incident.opened`, `incident.updated`, `incident.resolved`, `subscription.test`), `summary`, `incident`, `component`, and `metrics`. Use `id` to drop duplicate retries. Respond 2xx within 10 seconds. After 10 failed attempts (about 3 hours) the subscription is disabled.

Full payload and verification code: https://status.dwellir.com/webhooks.md

## 4. Unsubscribe

```bash
curl -s -X POST https://status.dwellir.com/api/subscriptions/unsubscribe \
  -H 'Content-Type: application/json' \
  -d '{"token": "<token query parameter from unsubscribeUrl>"}'
```

The response is `{"deleted": true}` on success. To change filters, unsubscribe and subscribe again.

## Dwellir CLI

The `dwellir` CLI v0.4.0 or later has the same flows and needs no login. Check with `dwellir --version`. Install or upgrade: https://github.com/dwellir-public/cli#install.

```bash
dwellir status --chain base --json
dwellir status components
dwellir status history --network ethereum/mainnet --since 30d
dwellir status feed --chain base --endpoint api-ethereum-mainnet.n.dwellir.com --slack
dwellir status subscribe --url https://hooks.slack.com/services/... --chain base --min-severity outage
```
