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

# Delete Items from a Proposal

> DELETE /public/proposals/{ProposalId}/items — Removes one or more items from a proposal.

Removes items from a proposal by id. Pass the ids in `ItemIds`, repeating the query parameter once per id.

Every id must belong to the proposal and appear only once — an unknown id or a repeated one returns `404`, and nothing is deleted. There is no partial delete.

`IncludeAttachments` decides what happens to the items nested under those being deleted. It defaults to `false`, which keeps them: they survive as top-level items in the same area option, taking the position their parent held. Pass `true` to delete them along with their parent.

<Note>
  Success is an empty `200` or `204`; treat both as deleted. Along with [refresh item costs](/api-reference/proposals/items/refresh-item-costs), this is one of two item endpoints with no response body, so re-fetch [get proposal](/api-reference/proposals/get-proposal) if you need the remaining items.
</Note>

To take an item off the client-facing total without removing it, set its quantity to `0` with [update quantity](/api-reference/proposals/items/update-item-quantity) instead.

<Snippet file="hmac-signing.mdx" />


## OpenAPI

````yaml DELETE /public/proposals/{ProposalId}/items
openapi: 3.1.1
info:
  title: Portal.io Public API
  version: '1.0'
servers:
  - url: https://sandbox.api.portal.io/
security:
  - mssApiAppId: []
    mssApiUserKey: []
    mssCustomDate: []
    mssSignature: []
paths:
  /public/proposals/{ProposalId}/items:
    delete:
      tags:
        - Proposals/Item
      summary: Delete Proposal Items
      description: >-
        Deletes one or more items from a proposal. Nothing is deleted unless
        every id passes validation. Succeeds with an empty 200 or 204, so
        re-fetch the proposal to read the remaining items.
      operationId: deletePublicProposalsByProposalIdItems
      parameters:
        - name: ProposalId
          in: path
          description: Unique ID of the proposal (not the proposal number).
          required: true
          schema:
            type: integer
            format: int32
            x-default: 11538
        - name: ItemIds
          in: query
          description: >-
            Ids of the proposal items to delete. Each id must belong to the
            proposal, and a repeated id returns 404 rather than being ignored.
          required: true
          schema:
            type: array
            items:
              type: integer
            x-default:
              - 22945
              - 928331
        - name: IncludeAttachments
          in: query
          description: >-
            (Optional) Also remove the items nested under each deleted item.
            Defaults to false - nested items are then kept and promoted to
            top-level items in the same area option.
          schema:
            type: boolean
            x-default: false
        - $ref: '#/components/parameters/Accept'
      responses:
        '200':
          description: Success (no body).
          content:
            application/json: {}
        '204':
          description: Success (no body).
          content:
            application/json: {}
        '400':
          description: Invalid item ids.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
              example:
                responseStatus:
                  errorCode: BadRequest
                  message: Invalid item ids.
        '401':
          description: >-
            Not Authorized. Ensure a valid session cookie or HMAC authentication
            headers are provided.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
              example:
                responseStatus:
                  errorCode: Unauthorized
                  message: >-
                    Not Authorized. Ensure a valid session cookie or HMAC
                    authentication headers are provided.
        '402':
          description: >-
            The dealer's subscription is inactive or expired. An active
            subscription is required to use this endpoint.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
              example:
                responseStatus:
                  errorCode: PaymentRequired
                  message: >-
                    The dealer's subscription is inactive or expired. An active
                    subscription is required to use this endpoint.
        '403':
          description: You do not have permission for this action.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
              example:
                responseStatus:
                  errorCode: Forbidden
                  message: You do not have permission for this action.
        '404':
          description: Proposal or item not found.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
              example:
                responseStatus:
                  errorCode: NotFound
                  message: Proposal or item not found.
        '409':
          description: Proposal state prevents editing
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
              example:
                responseStatus:
                  errorCode: Conflict
                  message: Proposal state prevents editing
components:
  parameters:
    Accept:
      name: Accept
      in: header
      description: Accept Header
      required: true
      schema:
        enum:
          - application/json
        type: string
  schemas:
    ErrorResponse:
      title: ErrorResponse
      type: object
      properties:
        responseStatus:
          $ref: '#/components/schemas/ResponseStatus'
      description: ErrorResponse
    ResponseStatus:
      title: ResponseStatus
      type: object
      properties:
        errorCode:
          type:
            - 'null'
            - string
        message:
          type:
            - 'null'
            - string
        stackTrace:
          type:
            - 'null'
            - string
        errors:
          type:
            - 'null'
            - array
          items:
            $ref: '#/components/schemas/ResponseError'
        meta:
          title: DictionaryOfStringAndString
          type:
            - 'null'
            - object
          additionalProperties:
            type:
              - 'null'
              - string
      description: ResponseStatus
    ResponseError:
      title: ResponseError
      type: object
      properties:
        errorCode:
          type:
            - 'null'
            - string
        fieldName:
          type:
            - 'null'
            - string
        message:
          type:
            - 'null'
            - string
        meta:
          title: DictionaryOfStringAndString
          type:
            - 'null'
            - object
          additionalProperties:
            type:
              - 'null'
              - string
      description: ResponseError
  securitySchemes:
    mssApiAppId:
      type: apiKey
      description: >-
        Portal application identifier used as part of HMAC-authenticated API
        requests.
      name: X-MSS-API-APPID
      in: header
    mssApiUserKey:
      type: apiKey
      description: Portal user API key used together with the HMAC signature headers.
      name: X-MSS-API-USERKEY
      in: header
    mssCustomDate:
      type: apiKey
      description: >-
        Timestamp header included in the signed request to prevent replay
        attacks.
      name: X-MSS-CUSTOM-DATE
      in: header
    mssSignature:
      type: apiKey
      description: >-
        HMAC-SHA256 signature for the request, calculated over the canonical
        string defined in the authentication docs.
      name: X-MSS-SIGNATURE
      in: header

````