> ## 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:
        - name: app_id
          in: path
          required: true
          schema:
            type: string
            description: ID of the app you're finding a domain for.
            title: App Id
          description: ID of the app you're finding a domain for.
          example: 6820f3a4e7b91d003c45a1f2
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/DomainPurchaseUrlRequest'
      responses:
        '200':
          description: Successful Response
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/DomainPurchaseUrl'
        '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':
          description: Validation Error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/HTTPValidationError'
        '429':
          description: Rate limit reached. Retry later.
      security:
        - PersonalAccessTokenAuth:
            - full_access
components:
  schemas:
    DomainPurchaseUrlRequest:
      properties:
        domain:
          anyOf:
            - type: string
            - type: 'null'
          title: Domain
          description: >-
            Domain to open checkout on, such as `example.com`. Leave it out to
            open checkout on a domain search.
          example: nordwind-furniture.com
        offer_business_email:
          type: boolean
          title: Offer Business Email
          description: >-
            Whether checkout also offers a business email address on the domain
            after the purchase (`true`) or not (`false`).
          default: false
          example: false
      type: object
      title: DomainPurchaseUrlRequest
    DomainPurchaseUrl:
      properties:
        url:
          type: string
          title: 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
      type: object
      required:
        - url
      title: DomainPurchaseUrl
      description: A checkout link for buying a domain.
    HTTPValidationError:
      properties:
        detail:
          items:
            $ref: '#/components/schemas/ValidationError'
          type: array
          title: Detail
      type: object
      title: HTTPValidationError
    ValidationError:
      properties:
        loc:
          items:
            anyOf:
              - type: string
              - type: integer
          type: array
          title: Location
        msg:
          type: string
          title: Message
        type:
          type: string
          title: Error Type
      type: object
      required:
        - loc
        - msg
        - type
      title: ValidationError
  securitySchemes:
    PersonalAccessTokenAuth:
      type: http
      scheme: bearer
      description: >-
        Personal access token, sent as `Authorization: Bearer <token>`. Each
        operation lists the permission it needs: `read_only` or `full_access`. A
        full-access token can call every operation. A read-only token can call
        only the operations that list `read_only`; anything else returns 403
        `read_only_credential_route_not_allowed`.

````

This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.