---
title: "Finish packages"
method: POST
path: "/public/v1/packages/finish"
tags: ["Package"]
---

# Finish packages

`POST /public/v1/packages/finish`

Finish a list of packages. Sets each package's status to `FINISHED` and records the finish time. Finishing marks a fully depleted package as closed out for compliance; it removes the package from active inventory listings but does not itself deduct any quantity.

`package_ids` is a non-empty list of at most 300 package IDs. Optionally pass `finished_datetime` (ISO 8601) to set the finish time; it defaults to the current time.

Every package must be finishable, or the whole request fails. A package is rejected when it:
• still has active quantity — a package must already be at zero quantity before it can be finished
• is already finished
• is discontinued, on hold, inactive, or has been transferred out of its license
• is still syncing with Metrc from an earlier operation
• has an unresolved Metrc compliance discrepancy

This operation is atomic: if any package cannot be finished the entire request is rejected and no packages are changed. In that case the error message lists the offending packages by their compliance label; it is a single human-readable string, not a per-package structured error.

Metrc only — not supported for BioTrack packages, and a working Metrc connection is required. Metrc is updated asynchronously: a successful response means the packages were finished in Distru and a pending Metrc activity was created for each one. Distru syncs those activities to Metrc sequentially in the background, so the 200 response is not confirmation that the packages are finished in Metrc. Poll `GET /public/v1/packages` to observe the synced result. Requires a Metrc key configured with permission to finish packages in Metrc.

Required permission: `products_permissions_adjust_inventory`.

## Request body

- FinishPackagesRequest
  - `finished_datetime` string — Finish timestamp recorded on every package in the request, ISO 8601 (e.g. `2026-08-20T15:04:05Z`). Defaults to the current time when omitted.
  - `package_ids` string[], required — Non-empty list of 1 to 300 package IDs to finish, each the `id` string returned by `GET /public/v1/packages`. All must belong to your company. Every package must be finishable: already-finished packages, packages still syncing with Metrc, and packages with a Metrc compliance discrepancy are rejected, and because the operation is all-or-nothing a single bad id fails the whole request.

## Response `200`

The finished packages

## Other responses

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

---

[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/eb775b7b6ee0/schema)
