---
title: "List email domains"
method: GET
path: "/api/apps/{app_id}/custom-email-domains"
---

# List email domains

`GET /api/apps/{app_id}/custom-email-domains`

<Info>This API is in beta. Endpoints, fields, and behavior may still change, so avoid depending on it in production.</Info>

Lists the app's email domains and where each one is in setup.

An app with no email set up returns an empty list rather than an error, so this is the safe endpoint to poll while a domain verifies.

You normally get one domain. During a replacement you get two, the old one still sending and the new one still verifying. Disabled and suspended domains aren't listed, so unlinking a custom domain drops its email domain from this list until you link the domain again.

Every entry repeats the same `id`, which identifies the app's email configuration rather than the individual domain. Tell entries apart by `domain`, and pass that value to the endpoints that take a `domain` parameter.

## Path parameters

- `app_id` string, required — ID of the app whose email domains you want to work with.

## Response `200`

The app's email domains. Empty when none are set up.

- ListEmailDomainsResponse — Response for listing email domains for an app.
  - `email_domains` EmailDomainInfo[], required — The app's email domains. Usually one, empty when none are set up, and two while a replacement is in flight.
    - `id` string, required — ID of this app's email configuration. Every domain in the list repeats it, so tell entries apart by `domain` rather than by this.
    - `domain` string, required — The domain mail is sent from.
    - `sender_name` string, required — Name recipients see in the From line.
    - `from_email` string, required — Address mail is sent from.
    - `configuration_status` string, required — Where setup stands. Only `active` sends mail. The `pending_` values mean setup is still in progress, and the `failed_` values mean it stopped and you can start it again with [Retry email domain setup](/api-reference/retry-email-domain-setup).
    - `enabled_at` string, date-time, nullable, required — When the domain finished verifying, as a UTC timestamp in ISO 8601 format, or `null` if it hasn't verified yet.
    - `suspended_reason` string, nullable — Why sending was suspended, when it was. The value is `null` on a domain in good standing.
    - `external` boolean — Whether you brought the domain yourself (`true`) or bought it through Base44 (`false`).
    - `dns_records` EmailDnsRecordResponse[] — Records this domain needs, with whether Base44 can see each one yet.
      - `type` string, required — Record type. Either `CNAME`, `TXT` or `MX`.
      - `name` string, required — Host the record goes on.
      - `value` string, required — Value to publish.
      - `ttl` integer — Time to live to publish the record with, in seconds.
      - `status` string, nullable — Whether Base44 can see the record yet. Either `pending`, `verified` or `failed`. The value is `null` before the first check.
    - `provider_id` string, nullable — Identifier for the registrar the domain sits with, when Base44 knows it.

## Other responses

- `401` — Missing or invalid credentials.
- `403` — You don't have access to this app, or you used a workspace API key. These endpoints take a personal API key.
- `404` — App not found.

## Changes

- **2026-09-01** `d8572ad3094a` — 1 info
  - added the non-success response with the status `404`
- **2026-08-30** `394136a6cdd4` — 1 info
  - removed the non-success response with the status `422`
- **2026-08-26** `f2727732ced1` — 1 info
  - endpoint added

[Change history](https://skmtc.dev/idealspot/apis/base44-app-management-api/changes/api/apps/:app_id/custom-email-domains/get.md)

---

[API](https://skmtc.dev/idealspot/apis/base44-app-management-api.md) · [All operations](https://skmtc.dev/idealspot/apis/base44-app-management-api/llms.txt) · [OpenAPI document](https://skmtc-service-production.skmtc.workers.dev/v1/apis/idealspot/base44-app-management-api/revisions/d8572ad3094a/schema)
