---
title: "Take expenses out of an expense report"
method: DELETE
path: "/api/v1/rest/spese/reports/{id}/expenses"
tags: ["Expenses"]
---

# Take expenses out of an expense report

`DELETE /api/v1/rest/spese/reports/{id}/expenses`

## Request

- Base URL: `https://api.custodo.ai`
- URL: `https://api.custodo.ai/api/v1/rest/spese/reports/{id}/expenses`
- Auth: HTTP bearer

Takes lines back out of a nota spese and restates its three totals. The report has to be open — `draft` or `rejected`; one that has left is refused, and an approver who wants a line out rejects the whole report instead. The lines themselves are untouched: they go back to their owner’s pool as they were and can go into another report. `reason` is for a refusal («non rimborsabile») and lands on each line for its owner to read; leave it out for a line that was put in by mistake. ⚠ ALL OR NOTHING: if one line is not in this report, none is taken out and the answer names it. A line already back in its owner’s pool is not an error — it comes back under `already_out` — so repeating a call changes nothing. spese_get_report with `detailed` lists the lines a report holds.

**Examples**

- Togli il taxi dalla nota di settembre, l’ho messo per sbaglio
  `DELETE /api/v1/rest/spese/reports/22222222-3333-4444-8555-666666666666/expenses?expense_ids=44444444-5555-4666-8777-888888888888`
- Il pranzo del 3 non è rimborsabile, levalo dalla nota
  `DELETE /api/v1/rest/spese/reports/22222222-3333-4444-8555-666666666666/expenses?expense_ids=11111111-2222-4333-8444-555555555555&reason=Non+rimborsabile%3A+pranzo+personale`

## Path parameters

- `id` string, uuid, required

## Query parameters

- `expense_ids` string[], required
- `reason` string

## Headers

- `X-Tenant-Id` string, uuid

## Response `200`

Done. `data` is the tool’s own answer.

- RestResult
  - `ok` true, required
  - `data` unknown, required

## Other responses

- `400`: The arguments did not validate: `error.message` names the field, what it expects and what arrived.
- `401`: No API key, or one that is malformed, unknown, revoked or expired.
- `403`: The call never ran: the module is off for this organisation, the credential lacks the permission or the module, the tier does not cover it, or the tool is destructive and the key was not minted for that.
- `404`: Nothing with that id in this organisation.
- `409`: The record is in a state that does not allow it — under legal hold, already sent, already closed. `error.code` says which.
- `422`: The tool ran and refused, in a sentence of its own (`TOOL_REFUSED`): the message says what to change. Retrying the same call will not help.
- `429`: The API key has spent its minute, or its day. Every request a key makes counts. See `Retry-After`.

---

[API](https://skmtc.dev/custodo/apis/custodo-integrazioni.md) · [All operations](https://skmtc.dev/custodo/apis/custodo-integrazioni/llms.txt) · [OpenAPI document](https://skmtc.dev/custodo/apis/custodo-integrazioni/revisions/16d336d3ec2a?raw)
