---
title: "Delete a cost input"
method: DELETE
path: "/pnl/costs/{cost_id}"
tags: ["P&L"]
---

# Delete a cost input

`DELETE /pnl/costs/{cost_id}`

## Request

- Base URL: `https://api.reacherapp.com/public/v1`
- URL: `https://api.reacherapp.com/public/v1/pnl/costs/{cost_id}`
- Auth: API key in header `x-api-key` and API key in header `x-shop-id`

Remove one stored cost by its ``id``. The units it covered become uncosted again and drop out of ``contribution_profit`` — they are not treated as free-of-charge silently, they are reported as uncosted. Scoped to this shop, so an id belonging to another shop returns 404. A row in force on a day the shop has closed returns 409 ``PNL_PERIOD_CLOSED``: deleting it would restate that day. Requires ``read_write`` scope and a single shop.

## Path parameters

- `cost_id` integer, required

## Response `200`

Successful Response

- PnlCostsResponse: The cost inputs stored for one shop.
  - `shop_id` integer, required
  - `costs` PnlCostItem[], required
    - `cost_id` integer, required: Cost row id (use in DELETE /pnl/costs/{cost_id}).
    - `id` integer, required: Deprecated alias of `cost_id`; use `cost_id`.
    - `product_id` string, required
    - `sku_id` string, nullable: Null means the product-level default.
    - `cost_type` string, required
    - `amount` number, nullable, required: Cost per unit, positive. Null on a row written when a cost was cleared after the shop closed its books: no cost at this level from `effective_from` on.
    - `currency` string, required
    - `effective_from` string, required
    - `notes` string, nullable
    - `source` string, nullable
    - `updated_at` string, nullable
    - `dated_by_caller` boolean: True when the writer passed `effective_from`. Rows without it are dated by the shop's period close, or start at 1970-01-01.

## Other responses

- `422`: Validation Error

## Changes

> 76 revisions in range; 1 not diffed.

- **2026-10-30** `ce5f0b234d94`: 1 breaking, 1 info
  - response property `costs/items/amount` list-of-types was widened by adding types `null` to media type `application/json` of response `200`
  - added the optional property `costs/items/dated_by_caller` to the response with the `200` status
- **2026-09-19** `291230805105`: 2 info
  - response property `costs/items/id` deprecated
  - added the required property `costs/items/cost_id` to the response with the `200` status

[Operation history](https://skmtc.dev/reacherapp/apis/reacher-data-api/changes/pnl/costs/:cost_id/delete.md)

---

[API](https://skmtc.dev/reacherapp/apis/reacher-data-api.md) - [All operations](https://skmtc.dev/reacherapp/apis/reacher-data-api/llms.txt) - [OpenAPI document](https://skmtc.dev/reacherapp/apis/reacher-data-api/revisions/63ce74b30b5a?raw)
