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

# Get custom domain DNS records

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

Returns the DNS records to create at the domain's DNS provider so the domain points at the app.

Set `is_subdomain` to `true` for a subdomain such as `shop.example.com`, which takes one `CNAME`. A root domain such as `example.com` takes an `A` record for the domain itself and a `CNAME` for `www`.

This is for a domain you own elsewhere. A domain bought through Base44 is set up when it's bought, so asking for its records is rejected.

After the records are in place, link the domain with [Link custom domain](/api-reference/link-custom-domain). DNS changes can take a while to spread, so verification can pass a while after that.

Records come back in a fixed order, the `A` record first, with cursor-based pagination. To get the next page, send only the `cursor` from the previous response. It carries `is_subdomain` and `limit` with it.

Reading records is limited to 60 requests a minute per caller. Some workspaces have a different limit.



## OpenAPI

````yaml /developers/references/app-management/app-management-openapi.json get /api/apps/{app_id}/custom-domains/{domain_id}/dns-records
openapi: 3.1.0
info:
  title: Base44 App Management API
  version: 1.0.0
servers:
  - url: https://app.base44.com
security:
  - PersonalAccessTokenAuth: []
paths:
  /api/apps/{app_id}/custom-domains/{domain_id}/dns-records:
    get:
      summary: Get custom domain DNS records
      description: >-
        <Info>This API is in beta. Endpoints, fields, and behavior may still
        change, so avoid depending on it in production.</Info>


        Returns the DNS records to create at the domain's DNS provider so the
        domain points at the app.


        Set `is_subdomain` to `true` for a subdomain such as `shop.example.com`,
        which takes one `CNAME`. A root domain such as `example.com` takes an
        `A` record for the domain itself and a `CNAME` for `www`.


        This is for a domain you own elsewhere. A domain bought through Base44
        is set up when it's bought, so asking for its records is rejected.


        After the records are in place, link the domain with [Link custom
        domain](/api-reference/link-custom-domain). DNS changes can take a while
        to spread, so verification can pass a while after that.


        Records come back in a fixed order, the `A` record first, with
        cursor-based pagination. To get the next page, send only the `cursor`
        from the previous response. It carries `is_subdomain` and `limit` with
        it.


        Reading records is limited to 60 requests a minute per caller. Some
        workspaces have a different limit.
      operationId: >-
        get_domain_dns_records_api_apps__app_id__custom_domains__domain_id__dns_records_get
      parameters:
        - name: app_id
          in: path
          required: true
          schema:
            type: string
            description: ID of the app the domain belongs to.
            title: App Id
          description: ID of the app the domain belongs to.
          example: 6820f3a4e7b91d003c45a1f2
        - name: domain_id
          in: path
          required: true
          schema:
            type: string
            description: >-
              ID of the custom domain. Get this from [List custom
              domains](/api-reference/list-custom-domains).
            title: Domain Id
          description: >-
            ID of the custom domain. Get this from [List custom
            domains](/api-reference/list-custom-domains).
          example: 68b1c0d4e7b91d003c45a1f7
        - name: is_subdomain
          in: query
          required: false
          schema:
            type: boolean
            description: >-
              Whether the domain is a subdomain such as `shop.example.com`
              (`true`) or a root domain such as `example.com` (`false`).
            default: false
            title: Is Subdomain
          description: >-
            Whether the domain is a subdomain such as `shop.example.com`
            (`true`) or a root domain such as `example.com` (`false`).
          example: false
        - name: limit
          in: query
          required: false
          schema:
            type: integer
            maximum: 50
            minimum: 1
            description: Items per page. Max 50.
            default: 50
            title: Limit
          description: Items per page. Max 50.
          example: 50
        - name: cursor
          in: query
          required: false
          schema:
            anyOf:
              - type: string
              - type: 'null'
            description: Pagination cursor from previous response.
            title: Cursor
          description: Pagination cursor from previous response.
          example: gAAAAABn7vJ...
      responses:
        '200':
          description: Successful Response
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/DomainDnsRecords'
        '400':
          description: >-
            The `cursor` is invalid, expired, or from another request, or other
            parameters were sent beside it (`invalid_request`).
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/StandardErrorEnvelope'
        '401':
          description: Missing or invalid credentials (`unauthenticated`).
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/StandardErrorEnvelope'
        '402':
          description: >-
            This workspace's plan doesn't include custom domains
            (`custom_domains_not_in_plan`).
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/StandardErrorEnvelope'
        '403':
          description: >-
            You don't have access to this app, or you used a workspace API key
            (`forbidden`). This endpoint takes a personal API key.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/StandardErrorEnvelope'
        '404':
          description: >-
            The app has no custom domain with this ID, or the app doesn't exist
            (`not_found`).
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/StandardErrorEnvelope'
        '409':
          description: >-
            The domain was bought through Base44, so its DNS is already set up
            (`domain_purchased`).
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/StandardErrorEnvelope'
        '422':
          description: >-
            A parameter is the wrong type or out of range (`invalid_request`).
            `error.details.errors` lists each problem.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/StandardErrorEnvelope'
        '429':
          description: Rate limit reached (`rate_limited`). Retry later.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/StandardErrorEnvelope'
components:
  schemas:
    DomainDnsRecords:
      properties:
        records:
          items:
            $ref: '#/components/schemas/DomainDnsRecord'
          type: array
          title: Records
          description: The records to create at the domain's DNS provider, on this page.
        pagination:
          $ref: '#/components/schemas/PublicPaginationInfo'
          description: Where this page sits in the full list of records.
      type: object
      required:
        - records
        - pagination
      title: DomainDnsRecords
      description: The DNS records that point a domain at the app.
    StandardErrorEnvelope:
      properties:
        error:
          $ref: '#/components/schemas/StandardError'
          description: What went wrong.
      type: object
      required:
        - error
      title: StandardErrorEnvelope
      description: The error body returned in the standard envelope.
    DomainDnsRecord:
      properties:
        type:
          type: string
          enum:
            - A
            - CNAME
          title: Type
          description: Record type. Either `A` or `CNAME`.
          example: CNAME
        name:
          type: string
          title: Name
          description: >-
            Full name of the record, such as `www.example.com`. If your DNS
            provider asks for a host rather than a full name, enter the part
            before your root domain, or `@` for the root domain itself.
          example: www.example.com
        value:
          type: string
          title: Value
          description: What the record points to. Enter it exactly as returned.
          example: base44.onrender.com
        ttl:
          type: integer
          title: Ttl
          description: Time to live, in seconds.
          example: 300
      type: object
      required:
        - type
        - name
        - value
        - ttl
      title: DomainDnsRecord
    PublicPaginationInfo:
      properties:
        total:
          type: integer
          title: Total
          description: Total number of matching items.
          example: 347
        next_cursor:
          anyOf:
            - type: string
            - type: 'null'
          title: Next Cursor
          description: >-
            Cursor for fetching the next page. The value is `null` if there are
            no more pages.
          example: gAAAAABn7vJ...
        has_more:
          type: boolean
          title: Has More
          description: Whether there are more items to fetch.
          example: true
      type: object
      required:
        - total
        - has_more
      title: PublicPaginationInfo
      description: Pagination metadata for a cursor-paginated page.
    StandardError:
      properties:
        code:
          type: string
          title: Code
          description: >-
            Stable machine-readable cause of the failure. Match on this, not on
            `message`.
          example: not_found
        message:
          type: string
          title: Message
          description: Human-readable explanation. It isn't a stable contract.
          example: App not found
        details:
          additionalProperties: true
          type: object
          title: Details
          description: >-
            Structured context for the failure, or an empty object when there's
            none.
          example: {}
      type: object
      required:
        - code
        - message
      title: StandardError
  securitySchemes:
    PersonalAccessTokenAuth:
      type: http
      scheme: bearer
      description: 'Personal access token, sent as `Authorization: Bearer <token>`.'

````