> ## Documentation Index
> Fetch the complete documentation index at: https://docs.gumnut.ai/llms.txt
> Use this file to discover all available pages before exploring further.

# Remove assets from a stack

> Pulls one or more frames out of the stack. The assets themselves are untouched — they remain in the library (and in any albums) and simply appear as individual photos again. IDs that are not current members of the stack are silently ignored.

If a removed frame was the pinned cover, the pin is cleared with no automatic re-pick — clients choose their own display cover. A stack that survives the removal is marked user-owned (`origin = user`) so burst re-detection honors the edit; a removal that leaves fewer than 2 members dissolves the stack entirely, returning its remaining frames to loose display too. Trashed frames still count as members for that threshold (unlike `asset_count`, which excludes them), so a stack can survive with `asset_count` below 2.

Up to 200 ids per request; over-cap requests return 422.



## OpenAPI

````yaml https://api.gumnut.ai/openapi.json delete /api/stacks/{stack_id}/assets
openapi: 3.1.0
info:
  title: Gumnut API
  description: API for using Gumnut to manage photos and videos
  version: 0.1.0
servers: []
security: []
paths:
  /api/stacks/{stack_id}/assets:
    delete:
      tags:
        - stacks
      summary: Remove assets from a stack
      description: >-
        Pulls one or more frames out of the stack. The assets themselves are
        untouched — they remain in the library (and in any albums) and simply
        appear as individual photos again. IDs that are not current members of
        the stack are silently ignored.


        If a removed frame was the pinned cover, the pin is cleared with no
        automatic re-pick — clients choose their own display cover. A stack that
        survives the removal is marked user-owned (`origin = user`) so burst
        re-detection honors the edit; a removal that leaves fewer than 2 members
        dissolves the stack entirely, returning its remaining frames to loose
        display too. Trashed frames still count as members for that threshold
        (unlike `asset_count`, which excludes them), so a stack can survive with
        `asset_count` below 2.


        Up to 200 ids per request; over-cap requests return 422.
      operationId: remove_assets_from_stack
      parameters:
        - name: stack_id
          in: path
          required: true
          schema:
            type: string
            description: >-
              Stack ID (with `asset_stack_` prefix) of the stack to pull frames
              out of.
            title: Stack Id
          description: >-
            Stack ID (with `asset_stack_` prefix) of the stack to pull frames
            out of.
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/StackAssetRemoval'
      responses:
        '200':
          description: Successful Response
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/DeletionResponse'
        '404':
          description: Not found
        '422':
          description: Validation Error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/HTTPValidationError'
components:
  schemas:
    StackAssetRemoval:
      properties:
        asset_ids:
          items:
            type: string
          type: array
          maxItems: 200
          title: Asset Ids
          description: >-
            Asset IDs (with `asset_` prefix) to pull out of the stack. Get
            member IDs from `list_assets` with `stack_id`. Up to 200 ids per
            request.
      type: object
      required:
        - asset_ids
      title: StackAssetRemoval
    DeletionResponse:
      properties: {}
      type: object
      title: DeletionResponse
      description: >-
        Acknowledgment body returned by destructive endpoints (delete / trash /
        restore /

        permanently delete / remove-from-album / empty-trash).


        Carries no fields — the HTTP 200 + empty JSON object is itself the
        success

        signal. Exists so MCP tools generated from these endpoints have a real

        ``outputSchema`` (rather than the null schema FastMCP emits for 204

        responses), which ChatGPT's MCP submission tooling requires.
      x-stainless-empty-object: true
    HTTPValidationError:
      properties:
        detail:
          items:
            $ref: '#/components/schemas/ValidationError'
          type: array
          title: Detail
      type: object
      title: HTTPValidationError
    ValidationError:
      properties:
        loc:
          items:
            anyOf:
              - type: string
              - type: integer
          type: array
          title: Location
        msg:
          type: string
          title: Message
        type:
          type: string
          title: Error Type
        input:
          title: Input
        ctx:
          type: object
          title: Context
      type: object
      required:
        - loc
        - msg
        - type
      title: ValidationError

````