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

# Delete a backend function

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

Deletes one of the app's backend functions, along with the automations that run it.

The function is removed from the app's main line, but the published app keeps serving it until you deploy the app again with [Deploy an app](/api-reference/deploy-an-app). Its automations are deleted straight away, so they stop for the published app too. The function's file in the app's code is left alone. The delete is rejected while main is protected. It works on main only, so naming a branch in `branch_id` returns a 409.

An app runs one deploy at a time, and a delete counts as one. If another deploy for the app is still running after a short wait, the call is rejected and is safe to retry. On some apps the remaining functions are redeployed as part of the delete, and the request waits for that to finish.

This is limited to 60 requests per minute per app for each workspace's API keys, so every personal and workspace API key in a workspace shares one allowance. Some workspaces have a different limit.

<Note>This endpoint accepts a personal API key belonging to a user with editor access to the app, or a workspace API key with the `apps:deploy` scope. A read-only key is refused.</Note>



## OpenAPI

````yaml /developers/references/app-management/app-management-openapi.json delete /api/apps/{app_id}/backend-functions/{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}/backend-functions/{function_name}:
    delete:
      summary: Delete 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>


        Deletes one of the app's backend functions, along with the automations
        that run it.


        The function is removed from the app's main line, but the published app
        keeps serving it until you deploy the app again with [Deploy an
        app](/api-reference/deploy-an-app). Its automations are deleted straight
        away, so they stop for the published app too. The function's file in the
        app's code is left alone. The delete is rejected while main is
        protected. It works on main only, so naming a branch in `branch_id`
        returns a 409.


        An app runs one deploy at a time, and a delete counts as one. If another
        deploy for the app is still running after a short wait, the call is
        rejected and is safe to retry. On some apps the remaining functions are
        redeployed as part of the delete, and the request waits for that to
        finish.


        This is limited to 60 requests per minute per app for each workspace's
        API keys, so every personal and workspace API key in a workspace shares
        one allowance. Some workspaces have a different limit.


        <Note>This endpoint accepts a personal API key belonging to a user with
        editor access to the app, or a workspace API key with the `apps:deploy`
        scope. A read-only key is refused.</Note>
      operationId: >-
        delete_function_api_api_apps__app_id__backend_functions__function_name__delete
      parameters:
        - name: function_name
          in: path
          required: true
          schema:
            type: string
            description: >-
              Name of the backend function, as `name` in [List backend
              functions](/api-reference/list-backend-functions). Nested
              functions have slashes in their name, and you send those as they
              are.
            title: Function Name
          description: >-
            Name of the backend function, as `name` in [List backend
            functions](/api-reference/list-backend-functions). 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 the function belongs to.
            title: App Id
          description: ID of the app the function belongs to.
          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
      responses:
        '204':
          description: The function was deleted.
        '401':
          description: Missing or invalid credentials.
        '403':
          description: >-
            You don't have editor access to this app, the app is blocked, your
            API key is read-only, or your workspace API key lacks the
            `apps:deploy` scope or doesn't cover this app.
        '404':
          description: >-
            App not found, the app has no backend function with this name, or no
            branch you can see has this `branch_id`.
        '409':
          description: >-
            Another deploy for the app is running, the app's main line is
            protected, or `branch_id` names a branch (`extra_data.reason` is
            `operation_blocked_on_branch`). With a workspace API key, it also
            means the app left the key's workspace or the key was revoked during
            the request. In that case the function can already be gone, and a
            retry then answers that it isn't found.
        '422':
          description: >-
            `function_name` is blank, contains `.`, `$` or a control character,
            is `__router__` or `__prod__`, or names an actor under
            `base44/actors/`, which this endpoint doesn't delete.
        '429':
          description: Rate limit exceeded.
      security:
        - PersonalAccessTokenAuth:
            - full_access
        - WorkspaceApiKeyAuth:
            - apps:deploy
        - WorkspaceApiKeyBearerAuth:
            - apps:deploy
components:
  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`.
    WorkspaceApiKeyAuth:
      type: apiKey
      in: header
      name: api_key
      description: >-
        Workspace API key, sent as `api_key: <key>`. Each operation that accepts
        one lists the permission the key needs; a key without it gets 403
        `workspace_api_key_scope_required`.
    WorkspaceApiKeyBearerAuth:
      type: http
      scheme: bearer
      description: >-
        Workspace API key, sent as `Authorization: Bearer <key>`. Accepted
        wherever `api_key` is, with the same permission.

````

This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.