Create app

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

Creates a new app. Pass initial_message.content to build it from a prompt, or send an empty body ({}) to create an empty app. Add initial_message.file_urls to build from a screenshot or a mockup alongside the prompt.

Building from a prompt runs in the background and consumes credits. Poll Get app and watch its status to see when the build finishes. By default the app is created in your default workspace. Set organization_id to create it in another workspace you belong to. This endpoint is limited to 5 requests per minute.

Set name, user_description, public_settings, custom_instructions, secrets, and prevent_iframe_embedding in the same request to configure the app before its first build turn runs. Without a name, the app starts as untitled, and once a build turn changes it Base44 names and describes it, replacing any user_description you sent.

<Warning>secrets are applied after the app is saved. A request that fails on a secrets entry still leaves the new app in your workspace, and it counts toward your plan's app limit. Delete it before you retry.</Warning>

<Warning>The response includes fields beyond the ones documented here. Don't rely on undocumented response fields, as they can change at any time. Send only the fields documented here. Other request fields are not supported and their behavior can change.</Warning>

post/api/apps

Request body

namestring

Display name of the app. Omit it to have Base44 name the app once a build turn changes it. The app's URL slug is built from the name.

user_descriptionstring

Description of the app. When you omit name, Base44 replaces it with a generated description once a build turn changes the app.

public_settings'public_without_login' | 'public_with_login' | 'workspace_with_login' | 'private_with_login'

Who can open the published app. public_without_login lets anyone in, unless the workspace enforces SSO for apps, in which case visitors must log in. public_with_login lets anyone in who logs in, workspace_with_login admits only logged-in members of the workspace, and private_with_login admits only users who were granted access. Omit it to use the workspace default. workspace_with_login and private_with_login need a paid plan, and a workspace policy can restrict which values you can choose. Like other publish settings, it takes effect on the live app once you deploy the app.

custom_instructionsstring

Instructions the builder follows on every turn, starting with the first build. Only the first 10,000 characters reach the builder.

secretsobject

Secrets to set on the app before its first build turn, keyed by secret name. Each entry sets the secret to value. The name must not be empty or contain =.

prevent_iframe_embeddingboolean

Whether the published app refuses to load inside an iframe on another site. Defaults to true. Set it to false to embed the app, although a workspace embedding policy can still restrict where. Preview URLs are not affected. It takes effect on the live app once you deploy it.

organization_idstring

ID of the workspace to create the app in. Omit to use your default workspace. You must have an editor-capable role (Editor or above) in the workspace. Viewers and guests cannot create apps. This is the same workspace ID that List apps accepts as workspace_id.

Example request

{
  "initial_message": {
    "content": "A CRM to track leads and deals",
    "file_urls": [
      "https://example.com/mockup.png"
    ]
  },
  "name": "My CRM",
  "user_description": "A CRM to track leads and deals",
  "public_settings": "public_with_login",
  "custom_instructions": "Use a dark theme and keep every page mobile friendly.",
  "secrets": {
    "STRIPE_API_KEY": {
      "type": "value",
      "value": "sk_test_example"
    }
  },
  "organization_id": "67e0b12c4d8a3f005b21c9e4"
}

Response

Successful Response

idstring nullable

ID of the app.

namestring nullable

Display name of the app.

slugstring 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_descriptionstring nullable

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.

created_bystring nullable

Email of the user who created the app.

created_datestring date-time nullable

Time the app was created, as a UTC timestamp in ISO 8601 format.

updated_datestring date-time nullable

Time the app document was last written, as a UTC timestamp in ISO 8601 format.

last_deployed_atstring 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_urlstring 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_urlstring nullable

URL of a preview screenshot taken before publishing, distinct from screenshot_url, or null if none has been captured.

main_branch_protectedboolean nullable

Whether the app's main branch is protected, so changes to main must go through a branch that's merged back. Change it with Set main branch protection.

Example response

{
  "id": "6820f3a4e7b91d003c45a1f2",
  "name": "My CRM",
  "slug": "my-crm-3c45a1f2",
  "user_description": "A CRM to track leads and deals",
  "created_by": "developer@example.com",
  "created_date": "2026-08-01T09:15:00",
  "updated_date": "2026-08-02T14:30:00",
  "status": {
    "state": "ready",
    "details": "Publishing app",
    "request_id": "a1b2c3d4e5f67890abcdef12",
    "last_updated_date": "2026-08-02T14:30:00Z",
    "error_source": "build",
    "paywall_context": {
      "billing_organization_id": "67e0b12c4d8a3f005b21c9e4",
      "user_id": "6706af53b9c1e2004a37d85f",
      "evaluated_at": "2026-08-02T14:30:00Z"
    }
  },
  "last_deployed_at": "2026-08-02T14:30:00",
  "screenshot_url": "https://storage.base44.com/screenshots/6820f3a4e7b91d003c45a1f2.png",
  "preview_screenshot_url": "https://storage.base44.com/previews/6820f3a4e7b91d003c45a1f2.png"
}

Changes

Changed in 3 of the 14 revisions of this API.13

    • ○

      added the new optional request property

      new-optional-request-property

    • ○

      added the new optional request property

      new-optional-request-property

    • ○

      added the new optional request property

      new-optional-request-property

    • ○

      added the new optional request property

      new-optional-request-property

    • ○

      added the new optional request property

      new-optional-request-property

    • ○

      added the new optional request property

      new-optional-request-property

    • ○

      added the optional property to the response with the status

      response-optional-property-added

    • ○

      added the new optional request property /

      new-optional-request-property

    • ○

      added the non-success response with the status

      response-non-success-status-added

    • ○

      added to the response property anyOf list for the response status

      response-property-any-of-added

    • ○

      removed from the response property anyOf list for the response status

      response-property-any-of-removed

    This revision also has 1 change that name no endpoint, such as unreferenced schemas being removed. See the revision's changelog

    • ○

      added the new optional request property

      new-optional-request-property

    • ○

      added the optional property to the response with the status

      response-optional-property-added