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

# Remove a line item from an order

> **Authorization:** requires `orders:write` API-key scope AND the per-user
`orders.edit` permission (SoD parity sweep 2026-05-16). System-actor calls
denied per AICPA SoC2 CC6.1.

Removes a line item from an order. Triggers `fullRecalculateOrder` to recompute totals.
Returns 409 if the item has been partially fulfilled or returned (quantity adjustments
must be made first). Returns 404 if the item does not belong to the specified order.
Requires `orders:write` scope.

Deleting a line off a CLOSED AR document is blocked the same way as add/update:
cancelled/voided, posted/fulfilled, or **paid/billed** (`suggested_action: revise_order`).
To revise a paid order, pass `override: true` with the `orders.revision_override`
permission; the delete proceeds and is audited (overpayment/refund routing is unchanged).




## OpenAPI

````yaml /openapi.yaml delete /orders/{id}/items/{item_id}
openapi: 3.1.0
info:
  title: Arcus ERP Public API
  version: 1.0.0
  description: >
    Arcus ERP public REST API. Designed for external integrations and data
    migration.


    **Authentication.** Bearer token (API key) via the `Authorization` header.

    Format: `Authorization: Bearer ark_live_ent_<code>_<random>` (or
    `ark_test_*` for sandbox).

    API keys are issued per-entity in **Settings > Developers > API Keys**.


    **Entity scoping.** The entity is encoded in the API key prefix; routes are
    flat

    (e.g. `/v1/accounts`, `/v1/orders`, `/v1/products`). A small set of platform
    endpoints

    (migration, reconciliation, events, webhook endpoints, API keys) use the

    `/v1/entities/{entity_id}/...` form -- those are noted in their tags.


    **Key capabilities.**
      - Related-resource hydration via `?expand[]=` (see `x-arcus-expand` on each resource).
      - Cursor-based pagination (`starting_after` / `ending_before` / `limit`).
      - Idempotency via the `Idempotency-Key` header.
      - Webhook events for asynchronous notification.
      - Conditional requests / ETag for cache validation.
servers:
  - url: https://api.arcuserp.com/v1
    description: Arcus ERP API (accepts both live `ark_live_*` and test `ark_test_*` keys)
  - url: https://dev-api.arcuserp.com/v1
    description: >-
      Dev sandbox API (test-only data, accepts `ark_test_*` keys against dev
      RDS)
security: []
paths:
  /orders/{id}/items/{item_id}:
    parameters:
      - name: id
        in: path
        required: true
        schema:
          type: string
          format: uuid
      - name: item_id
        in: path
        required: true
        schema:
          type: string
          format: uuid
    delete:
      tags:
        - Orders
      summary: Remove a line item from an order
      description: >
        **Authorization:** requires `orders:write` API-key scope AND the
        per-user

        `orders.edit` permission (SoD parity sweep 2026-05-16). System-actor
        calls

        denied per AICPA SoC2 CC6.1.


        Removes a line item from an order. Triggers `fullRecalculateOrder` to
        recompute totals.

        Returns 409 if the item has been partially fulfilled or returned
        (quantity adjustments

        must be made first). Returns 404 if the item does not belong to the
        specified order.

        Requires `orders:write` scope.


        Deleting a line off a CLOSED AR document is blocked the same way as
        add/update:

        cancelled/voided, posted/fulfilled, or **paid/billed**
        (`suggested_action: revise_order`).

        To revise a paid order, pass `override: true` with the
        `orders.revision_override`

        permission; the delete proceeds and is audited (overpayment/refund
        routing is unchanged).
      operationId: deleteOrderItem
      requestBody:
        required: false
        content:
          application/json:
            schema:
              type: object
              properties:
                override:
                  type: boolean
                  description: >-
                    Set true (with orders.revision_override) to delete a line
                    off a paid/billed order. Without it, a paid/billed order
                    returns 422 edit_not_allowed.
                override_reason:
                  type: string
      responses:
        '200':
          description: Item removed
          content:
            application/json:
              schema:
                type: object
                properties:
                  deleted:
                    type: boolean
                  id:
                    type: string
                    format: uuid
        '401':
          $ref: '#/components/responses/Error'
        '403':
          $ref: '#/components/responses/Error'
        '404':
          $ref: '#/components/responses/Error'
        '422':
          $ref: '#/components/responses/Error'
      security:
        - ApiKeyAuth: []
components:
  responses:
    Error:
      description: Error response (400/401/403/404/409/422/429/500)
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/ErrorEnvelope'
  schemas:
    ErrorEnvelope:
      type: object
      description: |
        Canonical error response envelope. All API errors use this shape.
      required:
        - error
        - code
      properties:
        error:
          type: string
          description: Machine-readable error key
          example: not_found
        code:
          type: string
          description: Machine-readable error code (often same as error)
          example: not_found
        type:
          type: string
          enum:
            - validation_error
            - permission_error
            - not_found
            - conflict
            - rate_limit
            - internal
            - expand_error
            - not_implemented
          example: not_found
        hint:
          type: string
          description: Human-readable one-sentence explanation (English)
          example: >-
            The requested order does not exist or does not belong to this
            entity.
        param:
          type: string
          description: The parameter that caused the error, if applicable
          example: expand[0]
        required:
          type: string
          description: The scope required (only on insufficient_scope errors)
          example: accounts:read
        request_id:
          type: string
          description: >-
            Unique request ID for support tracing (maps to CloudWatch log
            stream)
          example: req_abc123
  securitySchemes:
    ApiKeyAuth:
      type: http
      scheme: bearer
      description: |
        API key issued per entity via Settings > Developers > API Keys.
        Each key carries scopes (e.g. orders:read, products:write).
        Bearer token format: Authorization: Bearer ark_live_ent_<code>_<random>
        Test keys use ark_test_ent_<code>_<random>. Both are issued per entity
        via Settings > Developers > API Keys.

````