---
title: "Apply the waste-disposal charge"
method: POST
path: "/v1/quotes/{id}/waste-disposal"
tags: ["Quotes"]
---

# Apply the waste-disposal charge

`POST /v1/quotes/{id}/waste-disposal`

## Request

- Base URL: `https://api.officina.it`
- URL: `https://api.officina.it/v1/quotes/{id}/waste-disposal`
- Auth: HTTP bearer

Appends the charge line — quantity 1 at the previewed amount, unit
`lav`, the company's default VAT rate (its first enabled one), last
position — recomputes the totals and returns the updated document
(as the line-items batch does).

The rules are re-checked server-side and the line is written in one
transaction holding the document's row lock, so concurrent calls run
one after the other and add the line once. When the charge can't be
applied the response is `409 waste_disposal_not_applicable` with
`error.reason` (`disabled`, `already_applied`, `nothing_to_charge`, and
on worksheets `fully_paid`).

## Response `200`

Line added. Returns the updated document (with `line_items`).

- Quote: A customer-facing job estimate. Lifecycle: `waiting` → `accepted` / `rejected`. Totals are server-computed from the embedded line items and are read-only on the wire.
  - `object` 'quote', required
  - `id` string, required
  - `seq_number` integer, required
  - `status` 'waiting' | 'accepted' | 'rejected', required
  - `title` string, nullable
  - `comments` string, nullable
  - `internal_comments` string, nullable
  - `customer_id` string, required
  - `customer_name` string, required
  - `vehicle_id` string, nullable
  - `vehicle_name` string, nullable
  - `vehicle_license` string, nullable
  - `work_category_id` string, nullable
  - `work_category_name` string, nullable
  - `work_category_ids` string[], required: Every work category ("categoria") of the document, in the order chosen. `work_category_id` (kept for clients that handle a single category) always equals the first. `[]` when the document has none, never null. Available since revision 2026-10-03.
  - `work_categories` WorkCategory[], required: The same list as `work_category_ids` with each category's name, same order. `work_category_name` is the first one's name. Available since revision 2026-10-03.
    - `object` 'work_category', required
    - `id` string, uuid, required
    - `name` string, required
  - `km` number, double, nullable
  - `worksheet_id` string, nullable
  - `worksheet_seq_number` integer, nullable
  - `worksheet_created_at` string, date-time, nullable
  - `total_before_tax` number, double
  - `total_tax` number, double
  - `total_after_tax` number, double
  - `total_discount` number, double
  - `total_discount_before_tax` number, double
  - `total_after_discount` number, double
  - `total_work` number, double
  - `total_articles` number, double
  - `hide_discounts` boolean
  - `line_items` QuoteLineItem[], nullable: Embedded line items. Populated on detail / write responses; list responses set this to `null` to keep payloads small.
    - `object` 'quote_line_item', required
    - `id` string, required
    - `line_type` 'item' | 'note' | 'separator', required: `item` is a priced line. `note` is a description-only line and `separator` an empty spacer row: both print without quantity, price and VAT and carry zero amounts (ignore their numeric fields). Lines from documents without types report `item`.
    - `article_id` string, nullable
    - `description` string, required
    - `unit_type` string, required
    - `quantity` number, double, required
    - `unit_price` number, double, required
    - `unit_discount_rate` number, double
    - `tax_rate` number, double
    - `vat_code` string, nullable
    - `total_price` number, double
    - `unit_cost` number, nullable: Internal cost per unit, ex-VAT, never printed on documents. Fixed when the line was written (the article's purchase price at that moment, or the `unit_cost` sent); converting the quote carries it to the worksheet's line. `null` when unknown.
    - `total_before_tax` number, double
    - `total_tax` number, double
    - `total_after_tax` number, double
    - `position` integer, required
    - `created_at` string, date-time, required
  - `delivered_at` string, date-time, nullable
  - `created_at` string, date-time, required
  - `updated_at` string, date-time, required
  - `archived_at` string, date-time, nullable
  - `deleted_at` string, date-time, nullable

## Other responses

- `401`: Missing, malformed, expired, or wrong-audience bearer token.
- `402`: The company has no active subscription, or its plan does not include API access. API access is included in the Business and Illimitato plans.
- `403`: The authenticated user lacks the required permission.
- `404`: Resource does not exist OR belongs to a different company. The two cases are intentionally indistinguishable.
- `409`: `waste_disposal_not_applicable` (`error.reason` says why).
- `500`: Unhandled server error. Detail is logged, not exposed.

---

[API](https://skmtc.dev/officina/apis/officina-it-api.md) · [All operations](https://skmtc.dev/officina/apis/officina-it-api/llms.txt) · [OpenAPI document](https://skmtc.dev/officina/apis/officina-it-api/revisions/7da3fccfe551?raw)
