> ## Documentation Index
> Fetch the complete documentation index at: https://docs.base44.com/llms.txt
> Use this file to discover all available pages before exploring further.

# List 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.



## OpenAPI

````yaml /developers/references/app-management/app-management-openapi.json get /api/apps/{app_id}/custom-email-domains
openapi: 3.1.0
info:
  title: Base44 App Management API
  version: 1.0.0
servers:
  - url: https://app.base44.com
security:
  - ApiKeyAuth: []
paths:
  /api/apps/{app_id}/custom-email-domains:
    get:
      summary: List email domains
      description: >-
        <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.
      operationId: list_email_domains_api_apps__app_id__custom_email_domains_get
      parameters:
        - name: app_id
          in: path
          required: true
          schema:
            type: string
            description: ID of the app whose email domains you want to work with.
            title: App Id
          description: ID of the app whose email domains you want to work with.
          example: 6820f3a4e7b91d003c45a1f2
      responses:
        '200':
          description: The app's email domains. Empty when none are set up.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ListEmailDomainsResponse'
        '401':
          description: Missing or invalid credentials.
        '403':
          description: >-
            You don't have access to this app, or you used a workspace API key.
            These endpoints take a personal API key.
        '404':
          description: App not found.
components:
  schemas:
    ListEmailDomainsResponse:
      properties:
        email_domains:
          items:
            $ref: '#/components/schemas/EmailDomainInfo'
          type: array
          title: Email Domains
          description: >-
            The app's email domains. Usually one, empty when none are set up,
            and two while a replacement is in flight.
          example:
            - configuration_status: active
              dns_records: []
              domain: example.com
              enabled_at: '2026-08-20T16:31:00'
              external: true
              from_email: no-reply@example.com
              id: 68b1c0d4e7b91d003c45a1f2
              sender_name: Nordwind Furniture
      type: object
      required:
        - email_domains
      title: ListEmailDomainsResponse
      description: Response for listing email domains for an app.
    EmailDomainInfo:
      properties:
        id:
          type: string
          title: Id
          description: >-
            ID of this app's email configuration. Every domain in the list
            repeats it, so tell entries apart by `domain` rather than by this.
          example: 68b1c0d4e7b91d003c45a1f2
        domain:
          type: string
          title: Domain
          description: The domain mail is sent from.
          example: example.com
        sender_name:
          type: string
          title: Sender Name
          description: Name recipients see in the From line.
          example: Nordwind Furniture
        from_email:
          type: string
          title: From Email
          description: Address mail is sent from.
          example: no-reply@example.com
        configuration_status:
          type: string
          title: Configuration Status
          description: >-
            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).
          example: active
        enabled_at:
          anyOf:
            - type: string
              format: date-time
            - type: 'null'
          title: Enabled At
          description: >-
            When the domain finished verifying, as a UTC timestamp in ISO 8601
            format, or `null` if it hasn't verified yet.
          example: '2026-08-20T16:31:00'
        suspended_reason:
          anyOf:
            - type: string
            - type: 'null'
          title: Suspended Reason
          description: >-
            Why sending was suspended, when it was. The value is `null` on a
            domain in good standing.
          example: Repeated spam complaints
        external:
          type: boolean
          title: External
          description: >-
            Whether you brought the domain yourself (`true`) or bought it
            through Base44 (`false`).
          default: false
          example: true
        dns_records:
          items:
            $ref: '#/components/schemas/EmailDnsRecordResponse'
          type: array
          title: Dns Records
          description: Records this domain needs, with whether Base44 can see each one yet.
          default: []
          example:
            - name: em1234.example.com
              status: verified
              ttl: 300
              type: CNAME
              value: u1234567.wl123.sendgrid.net
        provider_id:
          anyOf:
            - type: string
            - type: 'null'
          title: Provider Id
          description: >-
            Identifier for the registrar the domain sits with, when Base44 knows
            it.
          example: godaddy
      type: object
      required:
        - id
        - domain
        - sender_name
        - from_email
        - configuration_status
        - enabled_at
      title: EmailDomainInfo
      description: Email domain info for get endpoint.
    EmailDnsRecordResponse:
      properties:
        type:
          type: string
          title: Type
          description: Record type. Either `CNAME`, `TXT` or `MX`.
          example: CNAME
        name:
          type: string
          title: Name
          description: Host the record goes on.
          example: em1234.example.com
        value:
          type: string
          title: Value
          description: Value to publish.
          example: u1234567.wl123.sendgrid.net
        ttl:
          type: integer
          title: Ttl
          description: Time to live to publish the record with, in seconds.
          default: 300
          example: 300
        status:
          anyOf:
            - type: string
            - type: 'null'
          title: Status
          description: >-
            Whether Base44 can see the record yet. Either `pending`, `verified`
            or `failed`. The value is `null` before the first check.
          example: pending
      type: object
      required:
        - type
        - name
        - value
      title: EmailDnsRecordResponse
      description: DNS record for email configuration.
  securitySchemes:
    ApiKeyAuth:
      type: apiKey
      in: header
      name: api_key
      description: Personal API key.

````