# List the account's domain monitors

`GET /api/v1/email/domain-monitors`

- Authentication: Secret API key as a bearer token
- Billing: Free.
- Group: Email

The saved domain lists this account re-checks on a schedule, newest first, 100 per page. Each monitor carries the summary of its last run: how many domains were ok, flagged (parked, mail hosts on a threat blocklist, a registration ending within 30 days, no SPF, no DMARC, or a provider, SPF, DMARC, DKIM or MTA-STS change since the previous run), dead (no usable mail servers) or invalid (not a hostname), how many changed, how many newly need attention, the credits the run spent, and `stopped_reason` when it did not finish cleanly: `insufficient_credits` or `key_spend_cap` where the run stopped part-way, `run_failed` where it died outright, and `run_failed_retrying` where it died and the schedule has been pulled in to check again — `retry_at` in the same block says when that becomes due, and the hourly sweep picks it up at or after that, so between 45 minutes and about an hour and three quarters later. A summary carrying a `stopped_reason` of either failure kind has NO counts in it at all: the run produced none, so read a missing count as unknown rather than as zero. The domains and their answers are on the single-monitor endpoint.

## Parameters

| Name | In | Type | Required | Description |
| --- | --- | --- | --- | --- |
| `page` | query | integer | no | The page to return. Default: 1. |

## Example request

```bash
curl https://spaw.co/api/v1/email/domain-monitors \
  -H "Authorization: Bearer sk_live_…"
```

## Responses

### 200 — One page of monitors.

```json
{
    "success": true,
    "data": {
        "monitors": [
            {
                "id": 4,
                "name": "Sending domains",
                "cadence": "daily",
                "domain_count": 2,
                "next_run_at": "2026-09-14T08:00:00+00:00",
                "last_run_at": "2026-09-13T08:00:03+00:00",
                "last_summary": {
                    "total": 2,
                    "ok": 1,
                    "flagged": 1,
                    "dead": 0,
                    "invalid": 0,
                    "changed": 1,
                    "newly_flagged": 1,
                    "credits_used": 0,
                    "stopped_reason": null
                },
                "webhook_url": null,
                "webhook_events": "changes",
                "webhook_status": null,
                "webhook_detail": null,
                "prunes_after_days": 365,
                "created_at": "2026-09-01T08:00:00+00:00"
            }
        ]
    },
    "meta": {
        "page": 1,
        "per_page": 100,
        "total": 1,
        "retention_days": 365
    }
}
```

### 401 — The key is missing, malformed, or revoked.

```json
{
    "success": false,
    "error": {
        "code": "UNAUTHENTICATED",
        "message": "Provide a valid API key as a bearer token.",
        "request_id": "req_01m1kgdm4xngzmbmff68g94w0c"
    }
}
```

### 429 — Over 5 requests per second for the key. Retry after the limit resets.

```json
{
    "success": false,
    "error": {
        "code": "RATE_LIMITED",
        "message": "Too many requests. Retry after the limit resets.",
        "request_id": "req_01m1kgdm4xngzmbmff68g94w0c"
    }
}
```

## Error codes

- `UNAUTHENTICATED` — https://spaw.co/docs/errors/UNAUTHENTICATED
- `RATE_LIMITED` — https://spaw.co/docs/errors/RATE_LIMITED

---

Canonical page: https://spaw.co/docs/api/list-domain-monitors · OpenAPI document: https://spaw.co/openapi.json · All endpoints: https://spaw.co/docs/api
