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

# Create domain checkout link

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

Creates a one-time checkout link for buying a domain through Base44.

Not every workspace can buy domains through the API. For one that can't, the call is rejected and the domain has to be bought in the Base44 editor.

Pass `domain` to open checkout on that domain, and check it first with [Check domain availability](/api-reference/check-domain-availability). Leave it out to open checkout on a domain search.

The person who opens the link pays at checkout, and nothing is bought until they finish. The domain is then attached to the app once it's registered, and appears in [List custom domains](/api-reference/list-custom-domains).

Each call returns a new link and buys nothing, so retrying is safe, including after a timeout. The call fails while the checkout provider is unavailable.

Creating links is limited to 6 requests a minute and 20 an hour per caller. Some workspaces have a different limit.



## OpenAPI

````yaml /developers/references/app-management/app-management-openapi.json post /api/apps/{app_id}/custom-domains/purchase-url
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/purchase-url:
    post:
      summary: Create domain checkout link
      description: >-
        <Info>This API is in beta. Endpoints, fields, and behavior may still
        change, so avoid depending on it in production.</Info>


        Creates a one-time checkout link for buying a domain through Base44.


        Not every workspace can buy domains through the API. For one that can't,
        the call is rejected and the domain has to be bought in the Base44
        editor.


        Pass `domain` to open checkout on that domain, and check it first with
        [Check domain availability](/api-reference/check-domain-availability).
        Leave it out to open checkout on a domain search.


        The person who opens the link pays at checkout, and nothing is bought
        until they finish. The domain is then attached to the app once it's
        registered, and appears in [List custom
        domains](/api-reference/list-custom-domains).


        Each call returns a new link and buys nothing, so retrying is safe,
        including after a timeout. The call fails while the checkout provider is
        unavailable.


        Creating links is limited to 6 requests a minute and 20 an hour per
        caller. Some workspaces have a different limit.
      operationId: >-
        create_domain_purchase_url_api_apps__app_id__custom_domains_purchase_url_post
      parameters:
        - description: ID of the app you're finding a domain for.
          example: 6820f3a4e7b91d003c45a1f2
          in: path
          name: app_id
          required: true
          schema:
            description: ID of the app you're finding a domain for.
            title: App Id
            type: string
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/DomainPurchaseUrlRequest'
        required: true
      responses:
        '200':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/DomainPurchaseUrl'
          description: Successful Response
        '400':
          description: >-
            `domain` isn't a valid domain name, or you have reached the limit of
            350 custom domains.
        '401':
          description: Missing or invalid credentials.
        '402':
          description: This workspace's plan doesn't include custom domains.
        '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.
        '409':
          description: >-
            This workspace can't buy domains through the API, so the purchase
            has to happen in the Base44 editor.
        '422':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/HTTPValidationError'
          description: Validation Error
        '429':
          description: Rate limit reached. Retry later.
components:
  schemas:
    DomainPurchaseUrlRequest:
      properties:
        domain:
          anyOf:
            - type: string
            - type: 'null'
          description: >-
            Domain to open checkout on, such as `example.com`. Leave it out to
            open checkout on a domain search.
          example: nordwind-furniture.com
          title: Domain
        offer_business_email:
          default: false
          description: >-
            Whether checkout also offers a business email address on the domain
            after the purchase (`true`) or not (`false`).
          example: false
          title: Offer Business Email
          type: boolean
      title: DomainPurchaseUrlRequest
      type: object
    DomainPurchaseUrl:
      description: A checkout link for buying a domain.
      properties:
        url:
          description: >-
            Checkout link to open in the browser of the person who'll pay. Treat
            it as opaque. It works once, so create a new one for each checkout.
          example: >-
            https://checkout.example.com/session/7c1e9f2a4b8d4e6f9a3c5b7d1e2f4a6c
          title: Url
          type: string
      required:
        - url
      title: DomainPurchaseUrl
      type: object
    HTTPValidationError:
      properties:
        detail:
          items:
            $ref: '#/components/schemas/ValidationError'
          title: Detail
          type: array
      title: HTTPValidationError
      type: object
    ValidationError:
      properties:
        loc:
          items:
            anyOf:
              - type: string
              - type: integer
          title: Location
          type: array
        msg:
          title: Message
          type: string
        type:
          title: Error Type
          type: string
      required:
        - loc
        - msg
        - type
      title: ValidationError
      type: object
  securitySchemes:
    PersonalAccessTokenAuth:
      description: 'Personal access token, sent as `Authorization: Bearer <token>`.'
      scheme: bearer
      type: http

````