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

# Change app slug

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

Changes the app's slug, which sets its `<slug>.base44.app` address.

Send `null` to reset the slug to the one Base44 generates from the app's name and ID. Sending the current slug, in any capitalization, changes nothing.

<Warning>The old address stops working as soon as the slug changes, and nothing redirects it to the new one. Change the slug before you share the app's URL or point ads at it.</Warning>

An app listed on Launchpad can't change its slug while a voting round is live, because the slug is also the listing's public URL.

Changing the slug is limited to 30 requests an hour per caller. Some workspaces have a different limit.

<Note>This endpoint accepts a personal API key. Workspace API keys are not authorized for it.</Note>



## OpenAPI

````yaml /developers/references/app-management/app-management-openapi.json patch /api/apps/{app_id}/metadata/slug
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}/metadata/slug:
    patch:
      summary: Change app slug
      description: >-
        <Info>This API is in beta. Endpoints, fields, and behavior may still
        change, so avoid depending on it in production.</Info>


        Changes the app's slug, which sets its `<slug>.base44.app` address.


        Send `null` to reset the slug to the one Base44 generates from the app's
        name and ID. Sending the current slug, in any capitalization, changes
        nothing.


        <Warning>The old address stops working as soon as the slug changes, and
        nothing redirects it to the new one. Change the slug before you share
        the app's URL or point ads at it.</Warning>


        An app listed on Launchpad can't change its slug while a voting round is
        live, because the slug is also the listing's public URL.


        Changing the slug is limited to 30 requests an hour per caller. Some
        workspaces have a different limit.


        <Note>This endpoint accepts a personal API key. Workspace API keys are
        not authorized for it.</Note>
      operationId: update_slug_api_apps__app_id__metadata_slug_patch
      parameters:
        - description: ID of the app.
          example: 6820f3a4e7b91d003c45a1f2
          in: path
          name: app_id
          required: true
          schema:
            description: ID of the app.
            title: App Id
            type: string
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/UpdateSlugPayload'
        required: true
      responses:
        '200':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/AppSummary'
          description: The app, with its new slug.
        '400':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/SlugRejected'
          description: The slug is malformed, reserved, or already used by another app.
        '401':
          description: Missing or invalid credentials.
        '403':
          description: >-
            You don't have edit access to this app, or you used a workspace API
            key. This endpoint takes a personal API key.
        '404':
          description: App not found.
        '409':
          description: The app is listed on Launchpad and a voting round is live.
        '422':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/HTTPValidationError'
          description: Validation Error
        '429':
          description: Rate limit reached. Retry later.
components:
  schemas:
    UpdateSlugPayload:
      properties:
        slug:
          anyOf:
            - type: string
            - type: 'null'
          description: >-
            New slug, 3 to 50 characters of letters, numbers, and hyphens that
            starts and ends with a letter or number. It has to be unused by any
            other app and not a reserved name, and it's lowercased before it's
            saved. Send `null` to reset it to the slug Base44 generates from the
            app's name and ID.
          example: nordwind-furniture
          title: Slug
      required:
        - slug
      title: UpdateSlugPayload
      type: object
    AppSummary:
      description: An app in a workspace, limited to the properties the caller requested.
      properties:
        created_by:
          anyOf:
            - type: string
            - type: 'null'
          description: Email of the user who created the app.
          example: developer@example.com
          title: Created By
        created_date:
          anyOf:
            - format: date-time
              type: string
            - type: 'null'
          description: Time the app was created, as a UTC timestamp in ISO 8601 format.
          example: '2026-08-01T09:15:00'
          title: Created Date
        first_prompt_model_comparison:
          anyOf:
            - $ref: '#/components/schemas/FirstPromptModelComparisonPublicState'
            - type: 'null'
          description: >-
            Accepted first-prompt model comparison, including its durable
            comparison ID.
        id:
          anyOf:
            - type: string
            - type: 'null'
          description: ID of the app.
          example: 6820f3a4e7b91d003c45a1f2
          title: Id
        last_deployed_at:
          anyOf:
            - format: date-time
              type: string
            - type: 'null'
          description: >-
            Time the app was last published, as a UTC timestamp in ISO 8601
            format, or `null` if it has never been published.
          example: '2026-08-02T14:30:00'
          title: Last Deployed At
        name:
          anyOf:
            - type: string
            - type: 'null'
          description: Display name of the app.
          example: My CRM
          title: Name
        preview_screenshot_url:
          anyOf:
            - type: string
            - type: 'null'
          description: >-
            URL of a preview screenshot taken before publishing, distinct from
            `screenshot_url`, or `null` if none has been captured.
          example: https://storage.base44.com/previews/6820f3a4e7b91d003c45a1f2.png
          title: Preview Screenshot Url
        screenshot_url:
          anyOf:
            - type: string
            - type: 'null'
          description: >-
            URL of a screenshot of the published app. Captured shortly after
            each publish, so it can briefly lag or be `null` right after
            publishing.
          example: https://storage.base44.com/screenshots/6820f3a4e7b91d003c45a1f2.png
          title: Screenshot Url
        slug:
          anyOf:
            - type: string
            - type: 'null'
          description: >-
            URL slug for the app, auto generated from the name and app ID or set
            to a custom value, or `null` if the app has no slug yet. The
            published URL is built from it.
          example: my-crm-3c45a1f2
          title: Slug
        status:
          anyOf:
            - $ref: '#/components/schemas/AppStatusResponse'
            - type: 'null'
          description: >-
            The app's current build status. Poll while a build is in progress to
            watch it finish. This tracks building, not publishing.
        updated_date:
          anyOf:
            - format: date-time
              type: string
            - type: 'null'
          description: >-
            Time the app document was last written, as a UTC timestamp in ISO
            8601 format.
          example: '2026-08-02T14:30:00'
          title: Updated Date
        user_description:
          anyOf:
            - type: string
            - type: 'null'
          description: >-
            Description of the app, or `null` if none was set. On a newly
            created app this holds the original prompt text.
          example: A CRM to track leads and deals
          title: User Description
      title: AppSummary
      type: object
    SlugRejected:
      description: Why the slug was not accepted.
      properties:
        detail:
          description: What is wrong with the slug.
          example: URL slug 'nordwind' is already in use
          title: Detail
          type: string
        suggestions:
          description: >-
            Up to five unused slugs close to the one you sent, present only when
            that slug is taken. Empty when Base44 could not come up with any.
          example:
            - nordwind-furniture
            - nordwind-shop
          items:
            type: string
          title: Suggestions
          type: array
      required:
        - detail
      title: SlugRejected
      type: object
    HTTPValidationError:
      properties:
        detail:
          items:
            $ref: '#/components/schemas/ValidationError'
          title: Detail
          type: array
      title: HTTPValidationError
      type: object
    FirstPromptModelComparisonPublicState:
      properties:
        client_creation_id:
          title: Client Creation Id
          type: string
        id:
          title: Id
          type: string
        models:
          items:
            type: string
          title: Models
          type: array
        status:
          enum:
            - preparing
            - running
            - failed
            - selected
            - cancelled
          title: Status
          type: string
      required:
        - id
        - client_creation_id
        - models
        - status
      title: FirstPromptModelComparisonPublicState
      type: object
    AppStatusResponse:
      description: The app's current build status.
      properties:
        details:
          anyOf:
            - type: string
            - type: 'null'
          description: >-
            Human readable note about the current state, such as what is being
            processed or why it failed, or `null` when there is nothing to
            report.
          example: Publishing app
          title: Details
        error_source:
          anyOf:
            - type: string
            - type: 'null'
          description: >-
            Where the failure originated when `state` is `error`, or `null`
            otherwise. A value of `paywall` means the work was blocked because
            the app's workspace has no credits left.
          example: build
          title: Error Source
        last_updated_date:
          anyOf:
            - format: date-time
              type: string
            - type: 'null'
          description: >-
            Time the status was last updated, as a UTC timestamp in ISO 8601
            format.
          example: '2026-08-02T14:30:00Z'
          title: Last Updated Date
        paywall_context:
          anyOf:
            - $ref: '#/components/schemas/PaywallStatusContextResponse'
            - type: 'null'
          description: >-
            Present when the operation was blocked by a plan limit, describing
            what was evaluated, or `null` otherwise.
        request_id:
          anyOf:
            - type: string
            - type: 'null'
          description: >-
            ID of the request that last changed the status, or `null` if the
            status has never changed. Useful when reporting an issue.
          example: a1b2c3d4e5f67890abcdef12
          title: Request Id
        state:
          description: >-
            Where the app is in its build lifecycle. Ready means idle with no
            build in progress, processing means the app is being generated or
            modified, and error means the last build failed. This tracks
            building, not publishing.
          enum:
            - ready
            - processing
            - error
          example: ready
          title: State
          type: string
      required:
        - state
      title: AppStatusResponse
      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
    PaywallStatusContextResponse:
      properties:
        billing_organization_id:
          description: ID of the billing organization the paywall was evaluated against.
          example: 67e0b12c4d8a3f005b21c9e4
          title: Billing Organization Id
          type: string
        evaluated_at:
          description: >-
            Time the paywall condition was evaluated, as a UTC timestamp in ISO
            8601 format.
          example: '2026-08-02T14:30:00Z'
          format: date-time
          title: Evaluated At
          type: string
        user_id:
          description: ID of the user the paywall was evaluated for.
          example: 6706af53b9c1e2004a37d85f
          title: User Id
          type: string
      required:
        - billing_organization_id
        - user_id
        - evaluated_at
      title: PaywallStatusContextResponse
      type: object
  securitySchemes:
    PersonalAccessTokenAuth:
      description: 'Personal access token, sent as `Authorization: Bearer <token>`.'
      scheme: bearer
      type: http

````