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

# Redeploy a backend function

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

Deploys the code you send as one of the app's backend functions and saves it as that function's source, the same way **Save & Redeploy** does in the app editor.

The function is deployed from the `code` in the request, not from the source already stored in the app. To redeploy a function unchanged, send its current source. The deploy runs even when the code is identical, which is how you recover a function whose deployment is missing or out of date. A name that no function has yet creates a new function.

The request waits for the deploy to finish, and fails with the compiler's diagnostics when the code doesn't build. An app runs one deploy at a time. If another deploy for the app is still running after a short wait, the call is rejected and is safe to retry.

Backend functions need a Builder plan or higher on the app's workspace. If the app has no backend functions yet, the first redeploy sets them up.

The deploy always lands on the app's main line, and is rejected while main is protected. Naming a branch in `branch_id` returns a 409. To deploy a function on a branch, use [Save an app file](/api-reference/save-an-app-file) with that `branch_id`.

The published app keeps running the previous version of the function until you publish the app again. Automations and workflows run the redeployed version right away.

This is limited to 50 requests a minute per caller for each app. Some workspaces have a different limit.

The response is the app document as it stands after the change, the same shape [Get app](/api-reference/get-app) returns.

<Note>This endpoint accepts a personal API key belonging to a user with editor access to the app. A read-only key is refused, and workspace API keys are not accepted.</Note>

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



## OpenAPI

````yaml /developers/references/app-management/app-management-openapi.json post /api/apps/{app_id}/coding/redeploy-function/{function_name}
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}/coding/redeploy-function/{function_name}:
    post:
      summary: Redeploy a backend function
      description: >-
        <Info>This API is in beta. Endpoints, fields, and behavior may still
        change, so avoid depending on it in production.</Info>


        Deploys the code you send as one of the app's backend functions and
        saves it as that function's source, the same way **Save & Redeploy**
        does in the app editor.


        The function is deployed from the `code` in the request, not from the
        source already stored in the app. To redeploy a function unchanged, send
        its current source. The deploy runs even when the code is identical,
        which is how you recover a function whose deployment is missing or out
        of date. A name that no function has yet creates a new function.


        The request waits for the deploy to finish, and fails with the
        compiler's diagnostics when the code doesn't build. An app runs one
        deploy at a time. If another deploy for the app is still running after a
        short wait, the call is rejected and is safe to retry.


        Backend functions need a Builder plan or higher on the app's workspace.
        If the app has no backend functions yet, the first redeploy sets them
        up.


        The deploy always lands on the app's main line, and is rejected while
        main is protected. Naming a branch in `branch_id` returns a 409. To
        deploy a function on a branch, use [Save an app
        file](/api-reference/save-an-app-file) with that `branch_id`.


        The published app keeps running the previous version of the function
        until you publish the app again. Automations and workflows run the
        redeployed version right away.


        This is limited to 50 requests a minute per caller for each app. Some
        workspaces have a different limit.


        The response is the app document as it stands after the change, the same
        shape [Get app](/api-reference/get-app) returns.


        <Note>This endpoint accepts a personal API key belonging to a user with
        editor access to the app. A read-only key is refused, and workspace API
        keys are not accepted.</Note>


        <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>
      operationId: >-
        redeploy_function_api_apps__app_id__coding_redeploy_function__function_name__post
      parameters:
        - name: function_name
          in: path
          required: true
          schema:
            type: string
            description: >-
              Name of the backend function, as a path under `functions/`. Send
              the bare name, the name with its file extension, or the name
              followed by `/entry.ts`. Nested functions have slashes in their
              name, and you send those as they are.
            title: Function Name
          description: >-
            Name of the backend function, as a path under `functions/`. Send the
            bare name, the name with its file extension, or the name followed by
            `/entry.ts`. Nested functions have slashes in their name, and you
            send those as they are.
          example: sendWelcomeEmail
        - name: app_id
          in: path
          required: true
          schema:
            type: string
            description: ID of the app whose code to change.
            title: App Id
          description: ID of the app whose code to change.
          example: 6820f3a4e7b91d003c45a1f2
        - name: branch_id
          in: query
          required: false
          schema:
            type: string
            description: >-
              ID of the branch to work on, as returned by [List
              branches](/api-reference/list-branches). Omit it to work on the
              app's main branch.
            title: Branch Id
          description: >-
            ID of the branch to work on, as returned by [List
            branches](/api-reference/list-branches). Omit it to work on the
            app's main branch.
          example: 68f1a2b3c4d5e6f708192a3b
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/RedeployFunctionPayload'
      responses:
        '200':
          description: The app after the deploy.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/UserApp'
        '400':
          description: >-
            `function_name` is empty, isn't a valid function name, or points at
            one of the app's frontend files instead of a backend function.
        '401':
          description: Missing or invalid credentials.
        '403':
          description: >-
            You don't have editor access to this app, your API key is read-only,
            or you used a workspace API key. Backend functions also need a
            Builder plan or higher on the app's workspace.
        '404':
          description: App not found, or no branch you can see has this `branch_id`.
        '409':
          description: >-
            The app's main line is protected, `branch_id` names a branch
            (`extra_data.reason` is `operation_blocked_on_branch`), the app
            moved to another workspace during the deploy, or another deploy for
            the app is still running.
        '422':
          description: >-
            The body has no `code`, or the code was rejected or failed to build.
            A build failure carries the compiler diagnostics in the detail.
        '429':
          description: Too many redeploys for this app from you in the last minute.
        '503':
          description: >-
            `deployment_temporarily_unavailable`: the app's backend functions
            are being upgraded to a new runtime and the upgrade didn't finish.
            Nothing was deployed. Retry after a few minutes.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/StandardErrorEnvelope'
      security:
        - PersonalAccessTokenAuth:
            - full_access
components:
  schemas:
    RedeployFunctionPayload:
      properties:
        code:
          type: string
          title: Code
          description: Full source of the function to deploy and save.
          example: |
            Deno.serve(async (req) => {
              return Response.json({ ok: true });
            });
      type: object
      required:
        - code
      title: RedeployFunctionPayload
      example:
        code: |
          Deno.serve(async (req) => {
            return Response.json({ ok: true });
          });
    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
    StandardErrorEnvelope:
      properties:
        error:
          $ref: '#/components/schemas/StandardError'
          description: What went wrong.
      type: object
      required:
        - error
      title: StandardErrorEnvelope
      description: The error body returned in the standard envelope.
    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.
    StandardError:
      properties:
        code:
          type: string
          title: Code
          description: >-
            Stable machine-readable cause of the failure. Match on this, not on
            `message`.
          example: not_found
        message:
          type: string
          title: Message
          description: Human-readable explanation. It isn't a stable contract.
          example: App not found
        details:
          additionalProperties: true
          type: object
          title: Details
          description: >-
            Structured context for the failure, or an empty object when there's
            none.
          example: {}
      type: object
      required:
        - code
        - message
      title: StandardError
    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.