---
title: "Create app"
method: POST
path: "/api/apps"
---

# Create app

`POST /api/apps`

<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](/api-reference/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.

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

## Request body

- object
  - `initial_message` object — First prompt to build the app from. Omit to create an empty app.
    - `content` string — Prompt describing the app to build.
    - `file_urls` string[] — Publicly reachable URLs of files to build the app from, such as a screenshot or a mockup to copy the layout from. Base44 downloads each file, so a URL has to resolve without credentials. A URL Base44 cannot fetch does not fail this request. The app is still created, and the failure shows up afterwards as a `status.state` of `error`.
  - `organization_id` string — 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](/api-reference/list-apps) accepts as `workspace_id`.

## Response `200`

Successful Response

- AppSummary — An app in a workspace, limited to the properties the caller requested.
  - `id` string, nullable — ID of the app.
  - `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 request body is invalid.
- `401` — Missing or invalid credentials.
- `403` — You can't create apps in this workspace, because you are not a member or your role is not editor-capable.
- `422` — The request body is missing, or is not a JSON object.
- `429` — Rate limit exceeded (5 requests per minute).

## Changes

- **2026-08-30** `394136a6cdd4` — 1 breaking, 1 info
  - removed the media type `application/json` for the response with the status `422`
  - added the new optional request property `initial_message/file_urls`
- **2026-08-23** `25fbcaf1823e` — 1 info
  - endpoint added

[Change history](https://skmtc.dev/idealspot/apis/base44-app-management-api/changes/api/apps/post.md)

---

[API](https://skmtc.dev/idealspot/apis/base44-app-management-api.md) · [All operations](https://skmtc.dev/idealspot/apis/base44-app-management-api/llms.txt) · [OpenAPI document](https://skmtc-service-production.skmtc.workers.dev/v1/apis/idealspot/base44-app-management-api/revisions/394136a6cdd4/schema)
