---
title: "Delete a product"
method: DELETE
path: "/public/v1/products/{id}"
tags: ["Product"]
---

# Delete a product

`DELETE /public/v1/products/{id}`

Deletes a product from your catalog. This is a soft delete: the product stops appearing in `GET /public/v1/products` by default (pass the `deleted` filter as `include` or `only` to still see it) and this endpoint returns 404 for it, but the record is retained — `GET /public/v1/products/{id}` keeps resolving it with a non-null `deleted_at`. The delete cannot be undone through the API; recreating the product via upsert produces a new product with a new `id`. Responds 204 with no body on success, or 404 if no non-deleted product with that `id` exists on your account (including one that was already deleted or belongs to another account).

A product can only be deleted while nothing depends on it. The delete is refused with a 400 when the product: holds any active inventory (every package, batch, or product-level quantity must be zero first), appears on any sales order or purchase, has any returns, appears on any inventory transfer, has any product requests, or is used as an input or output of any assembly. The product only becomes deletable once no such record references it. In practice this means a product that has been used can rarely be deleted — to retire it, set `is_inactive` to `true` via `POST /public/v1/products` instead. An inactive product is hidden from normal use but keeps its history, and can be reactivated at any time.

The delete cascades, all in one atomic call: the product's [batches](#model-batch) are soft-deleted, its own [bill of materials](#model-billofmaterials) is deleted, and the product is removed as an input from every other product's bill of materials (a bill left with no inputs is deleted too). The product is also removed from menus, and if it is linked to a LeafLink product that link is removed. No inventory is created, consumed, or released, and nothing is synced to Metrc or BioTrack. A successful delete records a `delete` entry in the product's activity log and notifies the relevant users.

Required permission: `products_permissions_delete` (plus access to the product under team restrictions).

## Path parameters

- `id` string, required

## Response `204`

No Content

## Other responses

- `400` — Invalid parameters
- `401` — Missing or invalid API token
- `403` — The API token lacks the required permission
- `404` — Not Found

---

[API](https://skmtc.dev/distru/apis/distru-api.md) · [All operations](https://skmtc.dev/distru/apis/distru-api/llms.txt) · [OpenAPI document](https://skmtc-service-production.skmtc.workers.dev/v1/apis/distru/distru-api/revisions/f8930b2c2924/schema)
