Senders

Verify a single email address as a sender when you cannot verify the whole domain

A sender is a single verified email address. Use it when you need to send from one address on a domain whose DNS you do not control, such as you@gmail.com or alerts@corp-it-owns-this.com. Verification is done by clicking a link in an email that SES sends to the address.

If you control the domain's DNS, verify the domain instead; it covers every address at that domain and gives you DKIM alignment, which materially helps deliverability.

How verification works

  1. You call POST /v1/send/senders/verify with the address.
  2. SES emails a verification link to that address. The link is valid for 24 hours.
  3. The mailbox owner clicks the link.
  4. You poll GET /v1/send/senders/{id}/status (or check the dashboard) until status is verified.

Mail sent from a verified single address is signed with SES's own DKIM key, not one aligned to your domain. Inbox placement is typically fine for low-volume transactional mail but is not as strong as a verified domain.

Statuses

statusMeaning
pendingVerification email sent; link not yet clicked.
verifiedLink clicked. The address can send.
expired24 hours passed without a click. Request a new email with the verify endpoint.
failedSES rejected the identity. Rare; contact support.
approvalStatusMeaning
approvedSending is allowed. Set automatically when the verification link is clicked; there is no manual review.
pending_approvalOnly seen when the address tripped an automated abuse check (for example a local part that impersonates a well-known brand) and is held for a person to look at. You receive an email when it is decided.
rejectedSending from this address is blocked.

Sending limits for new accounts

A new account can send as soon as its first sender is verified, but starts in a 72-hour probation: 50 emails per hour, 200 per day, and at most 25 distinct recipient domains per hour (20 / 100 / 10 for 7 days when the signup looks higher-risk). Exceeding a cap returns 429 probation_limit_reached with resetsAt; early bounces or a complaint pause sending automatically. The caps lift on their own after a clean probation window. See Rate limits for the full table and Domains for how to read your account's trustStage.

Endpoints

List senders

GET/v1/send/senders

List every single-address sender on the account.

Requires:send:read

Query parameters

statusstring
Filter by verification status
pendingverifiedexpiredfailed
{
"emailIdentities": [
  {
    "id": "snd_9q4wzk17c2m8x",
    "email": "alerts@example.com",
    "status": "verified",
    "approvalStatus": "approved",
    "isActive": true,
    "verificationSentAt": 1756900000000,
    "verifiedAt": 1756900420000,
    "createdAt": 1756900000000
  }
],
"count": 1
}

Verify an address

POST/v1/send/senders/verify

Send a verification email to the address. Calling it again for a pending address re-sends the email (at most once every five minutes).

Requires:send:write

Body parameters

emailstringrequired
The address to verify. Lowercased and trimmed.
Start verification
curl -X POST https://api.do.dev/v1/send/senders/verify \
-H "Authorization: Bearer $SEND_API_KEY" \
-H "Content-Type: application/json" \
-d '{"email": "alerts@example.com"}'
Response202
{
"id": "snd_9q4wzk17c2m8x",
"email": "alerts@example.com",
"status": "pending",
"message": "Verification email sent. Please check your inbox and click the verification link.",
"expiresIn": "24 hours"
}

If the address was already verified with SES (for example, on another account you control), the response is 200 with status: "verified" and no email is sent.

Check status

GET/v1/send/senders/{id}/status

Return the current status, checking SES if the address is still pending.

Requires:send:read
{
"id": "snd_9q4wzk17c2m8x",
"email": "alerts@example.com",
"status": "verified",
"approvalStatus": "approved",
"isActive": true,
"verifiedAt": 1756900420000
}

Delete a sender

DELETE/v1/send/senders/{id}

Remove the sender. Sends from this address fail immediately with sender_not_verified.

Requires:send:write
{
"id": "snd_9q4wzk17c2m8x",
"email": "alerts@example.com",
"deleted": true
}

Display names and impersonation

Whether you send from a verified domain or a verified address, the from.name you set on each email is checked against a list of well-known brands. A From like "PayPal" <alerts@example.com> is rejected with 403 sender_not_verified even though the address is verified. Use a name that matches who you are.