---
title: "Change app slug"
method: PATCH
path: "/api/apps/{app_id}/metadata/slug"
---

# Change app slug

`PATCH /api/apps/{app_id}/metadata/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>

## Path parameters

- `app_id` string, required — ID of the app.

## Request body

- UpdateSlugPayload
  - `slug` string, nullable, required — 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.

## Response `200`

The app, with its new slug.

- AppSummary — An app in a workspace, limited to the properties the caller requested.
  - `id` string, nullable — ID of the app.
  - `first_prompt_model_comparison` FirstPromptModelComparisonPublicState
    - `id` string, required
    - `client_creation_id` string, required
    - `models` string[], required
    - `status` 'preparing' | 'running' | 'failed' | 'selected' | 'cancelled', required
  - `name` string, nullable — Display name of the app.
  - `slug` string, nullable — 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.
  - `user_description` string, nullable — Description of the app, or `null` if none was set. On a newly created app this holds the original prompt text.
  - `created_by` string, nullable — Email of the user who created the app.
  - `created_date` string, date-time, nullable — Time the app was created, as a UTC timestamp in ISO 8601 format.
  - `updated_date` string, date-time, nullable — Time the app document was last written, as a UTC timestamp in ISO 8601 format.
  - `status` AppStatusResponse — The app's current build status.
    - `state` 'ready' | 'processing' | 'error', required — 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.
    - `details` string, nullable — 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.
    - `request_id` string, nullable — ID of the request that last changed the status, or `null` if the status has never changed. Useful when reporting an issue.
    - `last_updated_date` string, date-time, nullable — Time the status was last updated, as a UTC timestamp in ISO 8601 format.
    - `error_source` string, nullable — 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.
    - `paywall_context` PaywallStatusContextResponse
      - `billing_organization_id` string, required — ID of the billing organization the paywall was evaluated against.
      - `user_id` string, required — ID of the user the paywall was evaluated for.
      - `evaluated_at` string, date-time, required — Time the paywall condition was evaluated, as a UTC timestamp in ISO 8601 format.
  - `last_deployed_at` string, date-time, nullable — Time the app was last published, as a UTC timestamp in ISO 8601 format, or `null` if it has never been published.
  - `screenshot_url` string, nullable — URL of a screenshot of the published app. Captured shortly after each publish, so it can briefly lag or be `null` right after publishing.
  - `preview_screenshot_url` string, nullable — URL of a preview screenshot taken before publishing, distinct from `screenshot_url`, or `null` if none has been captured.

## Other responses

- `400` — The slug is malformed, reserved, or already used by another app.
- `401` — Missing or invalid credentials.
- `403` — You don't have edit access to this app, or you used a workspace API key. This endpoint takes a personal API key.
- `404` — App not found.
- `409` — The app is listed on Launchpad and a voting round is live.
- `422` — Validation Error
- `429` — Rate limit reached. Retry later.

## Changes

- **2026-09-24** `eb89d67965ff` — 1 info
  - endpoint added

[Change history](https://skmtc.dev/base44/apis/base44-app-management-api/changes/api/apps/:app_id/metadata/slug/patch.md)

---

[API](https://skmtc.dev/base44/apis/base44-app-management-api.md) · [All operations](https://skmtc.dev/base44/apis/base44-app-management-api/llms.txt) · [OpenAPI document](https://skmtc.dev/base44/apis/base44-app-management-api/revisions/cf164639a9bf?raw)
