---
title: "Troubleshooting"
description: "Find the right page from the symptom you can see or the error type you received, across domains, delivery, sending, and API keys."
---

> **For AI agents:** the complete documentation index is at [llms.txt](/docs/llms.txt). Append `.md` to any page URL for its markdown version.

This section routes a specific failure to the page that fixes it, covering domain verification, DNS records, refused sends, and delivery problems. If you have an error `type` in hand, match it in the table below; that is the fastest route to the right page.

## By error type

| Status | `type` | Page |
|---|---|---|
| 403 | `unverified_domain_required` | [Live sending is refused](/troubleshooting/live-sending-refused) |
| 401 | `missing_api_key`, `invalid_api_key`, `invalid_session_token` | [Authentication](/concepts/authentication#401-vs-403) |
| 403 | `insufficient_scope` | [Scopes](/concepts/authentication#scopes) |
| 403 | `invalid_api_key` on a revoked key | [Rotation](/concepts/authentication#rotation) |
| 422 | `validation_error`, `param: "from"` | [Live sending is refused](/troubleshooting/live-sending-refused) |
| 403 | `account_suspended`, `account_rejected`, `forbidden` | [Live sending is refused](/troubleshooting/live-sending-refused) |
| 409 | `domain_parent_taken`, `conflict` | [Adding a domain was refused](/troubleshooting/domain-add-refused) |
| 403 | `domain_limit_reached` | [Adding a domain was refused](/troubleshooting/domain-add-refused) |
| 422 | `marketing_single_recipient`, `marketing_missing_postal_address`, `recipient_unsubscribed` | [Unsubscribe links](/guides/unsubscribe-links) |
| 429 | `account_under_review` | [Live sending is refused](/troubleshooting/live-sending-refused) |
| 429 | `rate_limit_exceeded`, `daily_quota_exceeded` | [Rate limits and quotas](/concepts/rate-limits) |
| 429 | `monthly_quota_exceeded`, `marketing_quota_exceeded`, `spend_cap_exceeded` | [Quotas and plan limits](/concepts/quotas-and-plan-limits) |

## By symptom

Without an error string, match the symptom instead.

| Symptom | Page |
|---|---|
| A domain's status stays `pending` past its verification window | [Domain will not verify](/troubleshooting/domain-not-verifying) |
| A required MX record looks like it would clash with corporate mail | [MX record conflicts](/troubleshooting/mx-record-conflicts) |
| A live send was refused with a 403 or 422 | [Live sending is refused](/troubleshooting/live-sending-refused) |
| Mail is delivered but lands in spam | [Why emails go to spam](/deliverability/why-emails-go-to-spam) |
| A message shows as delivered and never arrived | [Delivered but not received](/troubleshooting/delivered-but-not-received) |
| A `202` came back and nothing sent | [Delivered but not received](/troubleshooting/delivered-but-not-received) |
| A browser `fetch` fails | [Calling the API from a browser](/troubleshooting/browser-requests) |
| A key was committed to a repository | [A leaked API key](/troubleshooting/leaked-api-key) |
| Adding a domain was refused | [Adding a domain was refused](/troubleshooting/domain-add-refused) |
| A marketing send was refused over recipients, a postal address, or an opt-out | [Unsubscribe links](/guides/unsubscribe-links) |
| Sending stopped after hitting a monthly or daily allowance | [Quotas and plan limits](/concepts/quotas-and-plan-limits) |

## Still stuck

Before contacting support, collect: the message id, the timestamp, the recipient domain, the error `type` if you have one, and the event timeline from [`GET /v1/emails/:id/events`](/api-reference/emails/list-events).
