> ## 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:
        - name: app_id
          in: path
          required: true
          schema:
            type: string
            description: ID of the app.
            title: App Id
          description: ID of the app.
          example: 6820f3a4e7b91d003c45a1f2
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/UpdateSlugPayload'
      responses:
        '200':
          description: The app, with its new slug.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/UserApp'
        '400':
          description: The slug is malformed, reserved, or already used by another app.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/SlugRejected'
        '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':
          description: Validation Error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/HTTPValidationError'
        '429':
          description: Rate limit reached. Retry later.
      security:
        - PersonalAccessTokenAuth:
            - full_access
components:
  schemas:
    UpdateSlugPayload:
      properties:
        slug:
          anyOf:
            - type: string
            - type: 'null'
          title: Slug
          description: >-
            New slug, 3 to 50 characters of letters, numbers, and hyphens that
            starts and ends with a letter or number, without hyphens as both its
            3rd and 4th characters. 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
      type: object
      required:
        - slug
      title: UpdateSlugPayload
    UserApp:
      properties:
        id:
          type: string
          title: Id
          description: ID of the app.
          example: 6820f3a4e7b91d003c45a1f2
        created_date:
          type: string
          format: date-time
          title: Created Date
          description: Time the app was created, as a UTC timestamp in ISO 8601 format.
          example: '2026-08-01T09:15:00'
        updated_date:
          type: string
          format: date-time
          title: Updated Date
          description: >-
            Time the app document was last written, as a UTC timestamp in ISO
            8601 format.
          example: '2026-08-02T14:30:00'
        created_by:
          anyOf:
            - type: string
            - type: 'null'
          title: Created By
          description: Email of the user who created the app.
          example: developer@example.com
        organization_id:
          anyOf:
            - type: string
            - type: 'null'
          title: Organization Id
          description: ID of the workspace the app belongs to.
          example: 67e0b12c4d8a3f005b21c9e4
        app_type:
          type: string
          title: App Type
          description: >-
            Kind of app, set when it's created. One of `user_app` (a web app),
            `user_agent` (an AI agent), `mobile_app` (a native mobile app),
            `user_game` (a game), `slide` (a presentation), or `imported_app`
            (an app imported from an existing code repository). List apps
            returns it as stored, so an older agent app can report `agent`
            instead of `user_agent`, and some older apps don't include it. Get
            app always returns one of the values above.
          default: user_app
          example: user_app
        name:
          type: string
          title: Name
          description: Display name of the app.
          default: untitled
          example: My CRM
        user_description:
          anyOf:
            - type: string
            - type: 'null'
          title: User Description
          description: >-
            Description of the app, or `null` if none was set. An app created
            without a `name` gets a generated description once a build turn
            changes it.
          example: A CRM to track leads and deals
        logo_url:
          anyOf:
            - type: string
            - type: 'null'
          title: Logo Url
          description: >-
            URL of the app's logo, or `null` if it has none. Set it with [Set
            app logo](/api-reference/set-app-logo) or [Generate app
            logo](/api-reference/generate-app-logo).
          example: >-
            https://storage.base44.com/6820f3a4e7b91d003c45a1f2/3f2504e0_logo.png
        social_image_url:
          anyOf:
            - type: string
            - type: 'null'
          title: Social Image Url
          description: >-
            URL of the image shown when the app is shared on social platforms,
            or `null` if none was set, in which case the logo is shown instead.
            Set it with [Set social image](/api-reference/set-social-image).
          example: >-
            https://storage.base44.com/6820f3a4e7b91d003c45a1f2/7c9e6679_social.png
        public_settings:
          type: string
          enum:
            - private_with_login
            - public_with_login
            - public_without_login
            - workspace_with_login
          title: Public Settings
          description: >-
            Who can open the published app. Each value is described under
            [Update app](/api-reference/update-app), which also changes it.
          default: public_with_login
          example: public_with_login
        auth_config:
          $ref: '#/components/schemas/AuthConfiguration'
          description: >-
            Which login methods the app's login page offers. If the workspace
            enforces SSO for apps, the login page offers only SSO, whatever
            these are set to. Change them with [Update
            app](/api-reference/update-app).
        hide_entity_created_by:
          type: boolean
          title: Hide Entity Created By
          description: >-
            Whether the app's entity records leave out the email of the user who
            created each one (`created_by`). Newer apps always leave the email
            out, whatever this is set to.
          default: false
          example: true
        is_remixable:
          type: boolean
          title: Is Remixable
          description: >-
            Whether others can remix the app. While it's `true`, the published
            app also shows the Base44 badge if `public_settings` is
            `public_with_login` or `public_without_login`.
          default: false
          example: false
        main_branch_protected:
          type: boolean
          title: Main Branch Protected
          description: >-
            Whether the app's main branch is protected, so changes to main must
            go through a branch that's merged back. Always `true` for imported
            apps. Change it with [Set main branch
            protection](/api-reference/set-main-branch-protection).
          default: false
          example: false
        slug:
          anyOf:
            - type: string
            - type: 'null'
          title: Slug
          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
        is_unpublished:
          type: boolean
          title: Is Unpublished
          description: >-
            Whether the app was taken offline with [Unpublish
            app](/api-reference/unpublish-app) and hasn't been published again
            since. While it's `true`, the published URL is offline and
            `last_deployed_at` still shows the last publish.
          default: false
          example: false
        last_deployed_at:
          anyOf:
            - type: string
              format: date-time
            - type: 'null'
          title: Last Deployed At
          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'
        screenshot_url:
          anyOf:
            - type: string
            - type: 'null'
          title: Screenshot Url
          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
        preview_screenshot_url:
          anyOf:
            - type: string
            - type: 'null'
          title: Preview Screenshot Url
          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
        owner_id:
          anyOf:
            - type: string
            - type: 'null'
          title: Owner Id
          description: >-
            ID of the user who owns the app. It starts as the creator and
            changes when ownership is transferred.
          example: 6706af53b9c1e2004a37d85f
        status:
          $ref: '#/components/schemas/StatusObject'
          description: >-
            The app's current build status. Poll while a build is in progress to
            watch it finish. This tracks building, not publishing.
        dev_environment_enabled:
          type: boolean
          title: Dev Environment Enabled
          description: >-
            Whether test data is on, which gives the app a test database next to
            its live one.
          default: false
          example: false
      type: object
      title: UserApp
    SlugRejected:
      properties:
        detail:
          type: string
          title: Detail
          description: What is wrong with the slug.
          example: URL slug 'nordwind' is already in use
        suggestions:
          items:
            type: string
          type: array
          title: 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
      type: object
      required:
        - detail
      title: SlugRejected
      description: Why the slug was not accepted.
    HTTPValidationError:
      properties:
        detail:
          items:
            $ref: '#/components/schemas/ValidationError'
          type: array
          title: Detail
      type: object
      title: HTTPValidationError
    AuthConfiguration:
      properties:
        enable_username_password:
          type: boolean
          title: Enable Username Password
          description: Whether people can sign in to the app with an email and password.
          default: false
          example: true
        enable_google_login:
          type: boolean
          title: Enable Google Login
          description: Whether people can sign in to the app with a Google account.
          default: true
          example: true
        enable_microsoft_login:
          type: boolean
          title: Enable Microsoft Login
          description: Whether people can sign in to the app with a Microsoft account.
          default: false
          example: false
        enable_facebook_login:
          type: boolean
          title: Enable Facebook Login
          description: Whether people can sign in to the app with a Facebook account.
          default: false
          example: false
        enable_apple_login:
          type: boolean
          title: Enable Apple Login
          description: Whether people can sign in to the app with an Apple account.
          default: false
          example: false
      type: object
      title: AuthConfiguration
      description: Authentication configuration for user applications
    StatusObject:
      properties:
        state:
          type: string
          enum:
            - ready
            - processing
            - error
          title: 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.
          example: ready
        details:
          anyOf:
            - type: string
            - type: 'null'
          title: Details
          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
        request_id:
          anyOf:
            - type: string
            - type: 'null'
          title: Request Id
          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
        last_updated_date:
          anyOf:
            - type: string
              format: date-time
            - type: 'null'
          title: Last Updated Date
          description: >-
            Time the status was last updated, as a UTC timestamp in ISO 8601
            format.
          example: '2026-08-02T14:30:00Z'
        error_source:
          anyOf:
            - type: string
            - type: 'null'
          title: Error Source
          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
        paywall_context:
          anyOf:
            - $ref: '#/components/schemas/PaywallStatusContext'
            - type: 'null'
          description: >-
            Present when the operation was blocked by a plan limit, describing
            what was evaluated, or `null` otherwise.
      type: object
      required:
        - state
      title: StatusObject
      description: The app's current build status.
    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
    PaywallStatusContext:
      properties:
        billing_organization_id:
          type: string
          title: Billing Organization Id
          description: ID of the billing organization the paywall was evaluated against.
          example: 67e0b12c4d8a3f005b21c9e4
        user_id:
          type: string
          title: User Id
          description: ID of the user the paywall was evaluated for.
          example: 6706af53b9c1e2004a37d85f
        evaluated_at:
          type: string
          format: date-time
          title: Evaluated At
          description: >-
            Time the paywall condition was evaluated, as a UTC timestamp in ISO
            8601 format.
          example: '2026-08-02T14:30:00Z'
      type: object
      required:
        - billing_organization_id
        - user_id
        - evaluated_at
      title: PaywallStatusContext
  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.