# One domain's full Deliverability Score

`GET /v1/deliverability/{domain}`

- Authentication: required (Bearer token)
- Required scope: `api.reports.view`

The domain's latest snapshot in full: `score`, `band`, `coverage`,
`pillars`, every check (`measured` beside `threshold`, `basis`,
`source`, provider `rule` with its provenance) and the ranked `tasks` —
each saying WHERE it is done (`sendops`, `dns` with the literal
`records` to publish, `aws` with a console `link`, or `third_party`) —
plus `latest_probe`, what SendOps's own receiver saw when it last
received a message from this domain's SES.

`unknown` checks are returned, with the task that would measure them,
and are **excluded from the score's denominator**. Any `blocking` task
forces the band to `failing`. `score` is never returned without
`coverage` and `checks`.

**202 `not_yet_assessed`** with `next_nightly_at` before the first
snapshot — no score, never zeros. `{domain}` is the domain name
(case-insensitive) or its id; a domain the org does not own is a 404.

## Path parameters

- `domain` (string, required) — The domain, by NAME (`acme.com`), matched case-insensitively; its id is also accepted. Scoped to the calling org — a domain belonging to another org is a 404, never a 403.

## Example request

```bash
curl 'https://api.sendops.dev/v1/deliverability/string' \
  -H "Authorization: Bearer $SENDOPS_API_KEY"
```

## Responses

### 200 — The domain's assessment

Content type: `application/json`

```json
{
  "status": "assessed",
  "domain_id": "00000000-0000-0000-0000-000000000000",
  "domain": "string",
  "taken_at": "2026-05-17T20:00:00Z",
  "score": 0,
  "band": "healthy",
  "band_label": "string",
  "low_confidence": true,
  "coverage": {
    "scored": 0,
    "total": 0,
    "unknown": 0,
    "not_applicable": 0
  },
  "pillars": [
    {
      "pillar": "authentication",
      "label": "string",
      "weight": 0,
      "score": 0,
      "not_applicable": true,
      "coverage": {
        "scored": 0,
        "total": 0,
        "unknown": 0,
        "not_applicable": 0
      },
      "summary": "string"
    }
  ],
  "checks": [
    {
      "key": "string",
      "pillar": "authentication",
      "status": "pass",
      "weight": 0,
      "measured": "string",
      "threshold": "string",
      "basis": "string",
      "source": {
        "name": "string",
        "read_at": "2026-05-17T20:00:00Z",
        "error": "string"
      },
      "rule": {
        "provider": "string",
        "key": "string",
        "threshold": "string",
        "consequence": "string",
        "source_url": "string",
        "effective_on": "2026-05-17",
        "verified_on": "2026-05-17",
        "volume_floor": 0
      },
      "task": {
        "key": "string",
        "check_key": "string",
        "title": "string",
        "body": "string",
        "where": "sendops",
        "where_label": "string",
        "then": "sendops",
        "records": [
          {
            "type": null,
            "name": null,
            "value": null
          }
        ],
        "link": "string",
        "verifies": true,
        "severity": "blocking",
        "opened_at": "2026-05-17T20:00:00Z",
        "acknowledged_until": "2026-05-17T20:00:00Z"
      },
      "covered_by": "string"
    }
  ],
  "tasks": [
    {
      "key": "string",
      "check_key": "string",
      "title": "string",
      "body": "string",
      "where": "sendops",
      "where_label": "string",
      "then": "sendops",
      "records": [
        {
          "type": "string",
          "name": "string",
          "value": "string"
        }
      ],
      "link": "string",
      "verifies": true,
      "severity": "blocking",
      "opened_at": "2026-05-17T20:00:00Z",
      "acknowledged_until": "2026-05-17T20:00:00Z"
    }
  ],
  "latest_probe": {
    "id": "string",
    "ran_at": "2026-05-17T20:00:00Z",
    "from_address": "string",
    "spf": "string",
    "dkim": "string",
    "dmarc": "string",
    "outcome": "signed_as_you",
    "signatures": [
      {
        "d": "string",
        "s": "string",
        "a": "string"
      }
    ]
  },
  "next_nightly_at": "2026-05-17T20:00:00Z"
}
```

### 202 — The domain has not been assessed yet

Content type: `application/json`

```json
{
  "status": "not_yet_assessed",
  "domain_id": "00000000-0000-0000-0000-000000000000",
  "domain": "string",
  "next_nightly_at": "2026-05-17T20:00:00Z"
}
```

### 401 — Missing, malformed, or unknown API key

Content type: `application/problem+json`

```json
{
  "type": "https://example.com",
  "title": "string",
  "status": 0,
  "detail": "string",
  "code": "invalid_key",
  "request_id": "string",
  "retry_after": 0,
  "retention_days": 0,
  "scope": "string",
  "resource": "string",
  "errors": [
    {
      "field": "string",
      "reason": "string"
    }
  ],
  "attribute_id": "00000000-0000-0000-0000-000000000000",
  "content_hash": "string",
  "differs": [
    "string"
  ]
}
```

### 403 — Key lacks the required scope or plan limit violated

Content type: `application/problem+json`

```json
{
  "type": "https://example.com",
  "title": "string",
  "status": 0,
  "detail": "string",
  "code": "invalid_key",
  "request_id": "string",
  "retry_after": 0,
  "retention_days": 0,
  "scope": "string",
  "resource": "string",
  "errors": [
    {
      "field": "string",
      "reason": "string"
    }
  ],
  "attribute_id": "00000000-0000-0000-0000-000000000000",
  "content_hash": "string",
  "differs": [
    "string"
  ]
}
```

### 404 — Resource not found

Content type: `application/problem+json`

```json
{
  "type": "https://example.com",
  "title": "string",
  "status": 0,
  "detail": "string",
  "code": "invalid_key",
  "request_id": "string",
  "retry_after": 0,
  "retention_days": 0,
  "scope": "string",
  "resource": "string",
  "errors": [
    {
      "field": "string",
      "reason": "string"
    }
  ],
  "attribute_id": "00000000-0000-0000-0000-000000000000",
  "content_hash": "string",
  "differs": [
    "string"
  ]
}
```

### 429 — Per-org rate limit exceeded

Content type: `application/problem+json`

```json
{
  "type": "https://example.com",
  "title": "string",
  "status": 0,
  "detail": "string",
  "code": "invalid_key",
  "request_id": "string",
  "retry_after": 0,
  "retention_days": 0,
  "scope": "string",
  "resource": "string",
  "errors": [
    {
      "field": "string",
      "reason": "string"
    }
  ],
  "attribute_id": "00000000-0000-0000-0000-000000000000",
  "content_hash": "string",
  "differs": [
    "string"
  ]
}
```

### 500 — Unexpected server-side failure. The `code` is `internal_error`. The
`request_id` field can be quoted to SendOps support to investigate.

Content type: `application/problem+json`

```json
{
  "type": "https://example.com",
  "title": "string",
  "status": 0,
  "detail": "string",
  "code": "invalid_key",
  "request_id": "string",
  "retry_after": 0,
  "retention_days": 0,
  "scope": "string",
  "resource": "string",
  "errors": [
    {
      "field": "string",
      "reason": "string"
    }
  ],
  "attribute_id": "00000000-0000-0000-0000-000000000000",
  "content_hash": "string",
  "differs": [
    "string"
  ]
}
```
