---
title: "Refresh a sending domain's verification state"
method: POST
path: "/api/v1/domains/{id}/verify"
tags: ["Domains"]
---

# Refresh a sending domain's verification state

`POST /api/v1/domains/{id}/verify`

## Request

- Base URL: `https://api.sendly.now`
- URL: `https://api.sendly.now/api/v1/domains/{id}/verify`
- Auth: one of:
  - HTTP bearer
  - API key in cookie `better-auth.session_token`
  - OAuth 2 (authorization code, authorization URL `https://app.sendly.now/api/auth/oauth2/authorize`, token URL `https://app.sendly.now/api/auth/oauth2/token`, scopes: `domains:write`)

Re-read this domain's state from SES and DNS and return the refreshed document.

This does NOT perform verification. Verification happens in the domain's own DNS, when its owner publishes the DKIM records SES minted at creation; Amazon decides when they resolve. What this call does is ask SES what it currently sees, re-check SPF and DMARC, and persist the answer — so a caller polling after a DNS change learns the outcome without waiting for the periodic sweep. Calling it on a domain whose records are not published yet is not an error and does not make it verify any sooner.

A POST rather than a GET because it writes: the refreshed state is persisted, and a verified/unverified transition notifies the project.

Requires the `domains:write` scope — Add and remove sending domains, and trigger verification.

## Path parameters

- `id` string, uuid, required: Resource id.

## Response `200`

The sending domain, as SES and DNS now report it

- DomainV1: A sending domain as exposed on the v1 API.
  - `created_at` string, date-time, required
  - `default_from_address` string, nullable, required
  - `default_from_name` string, nullable, required: The display name recipients see beside any address on this domain when a send names none. `null` falls back to the project name.
  - `dkim_verified` boolean, required
  - `domain` string, required
  - `id` string, uuid, required
  - `mail_from_domain` string, nullable, required
  - `mail_from_domain_status` string, nullable, required: SES's CustomMailFromStatus for `mail_from_domain` — the subdomain that carries the bounce path, NOT the status of any From address.
  - `region` string, nullable, required
  - `stream` 'TRANSACTIONAL' | 'MARKETING', nullable, required: Which traffic a sending identity carries. An identity with no stream serves both, which is how every domain added before per-stream identities behaves.
  - `stream_default` boolean, required
  - `updated_at` string, date-time, required
  - `verified` boolean, required

## Other responses

- `401`: `invalid_api_key` or `invalid_session` — missing or invalid credentials.
- `403`: `scope_missing`, `project_access_denied`, or `project_disabled`.
- `404`: `resource_not_found` — no sending domain with this id belongs to the authenticated project.
- `422`: `validation_error` — query, path, or body parameters did not match the schema.
- `429`: `rate_limited` — see `Retry-After` and the `RateLimit` headers.
- `500`: `internal_error`.

---

[API](https://skmtc.dev/sendly/apis/sendly-api.md) · [All operations](https://skmtc.dev/sendly/apis/sendly-api/llms.txt) · [OpenAPI document](https://skmtc.dev/sendly/apis/sendly-api/revisions/ce7cfb7f7c7e?raw)
