---
title: "Get the Cultivation Transaction History report"
method: GET
path: "/public/v1/reports/cultivation-transaction-history"
tags: ["CultivationTransactionHistory"]
---

# Get the Cultivation Transaction History report

`GET /public/v1/reports/cultivation-transaction-history`

## Request

- Base URL: `https://app.distru.com`
- URL: `https://app.distru.com/public/v1/reports/cultivation-transaction-history`
- Auth: HTTP bearer

Read-only report. Returns one row per cultivation transaction over the reported date range, covering the full plant lifecycle: plant batch creations, adjustments and splits, growth phase changes, plant moves, destructions, additive applications, teardowns, harvests, waste, and packaging. Each row carries the transaction's date, strain, batch name, plant tag(s), product name, package label(s), type, the related entity (teardown or harvest) and its status, the signed amount and unit, and the transaction's description. Rows reflect the same plant events tracked in the state traceability system (Metrc); this endpoint only reads them and changes nothing.

Rows are sorted most-recent-first by transaction date. When no date filter is provided, the report defaults to the last 30 days. The `datetime`, `transaction_type`, `strain`, `plant_batch_ids`, and `license_ids` filters combine with AND — each narrows the result — while multiple values within `plant_batch_ids` or `license_ids` are OR'd. With no `license_ids` filter the report spans every license on your company.

Every value is returned as it appears in the report's CSV export, with numeric cells (amount, total cost) returned as strings with the currency and comma formatting stripped, so amounts match the rest of the API. Two columns are not normalized the way the rest of the public API is: `type` is a human-readable display string (e.g. `Move Plant(s)`), not a SCREAMING_CASE enum token, and the `transaction_type` filter accepts those same human-readable names; `related_entity_status` is the underlying teardown/harvest workflow status passed straight through (`PREPARING`, `PENDING`, or `COMPLETED`) rather than remapped through the public API's enum layer. The `total_cost` column is present only for API keys whose user can view costs; for everyone else the key is omitted from every row and from `meta.columns`. Report-level information (the resolved date range and the column definitions actually present) is returned under `meta`.

Each row also carries `product_id` after `product_name`, so a row can be followed to the product endpoints without a lookup. The CSV export leaves this ID column out.

Required permission: `reports_permissions_cultivation_transaction_history` (and, for the `total_cost` column, permission to view costs).

## Query parameters

- `datetime` string
- `transaction_type` 'Plant Batch Creation' | 'Plant Batch Adjustment' | 'Split Plant Batch' | 'Destroy Plant' | 'Move Plant(s)' | 'Growth Phase Change' | 'Additive Application' | 'Package Plant Batch' | 'Plant Added to Teardown' | 'Harvest Created from Teardown' | 'Record Waste (Harvest)' | 'Create Package from Harvest'
- `strain` string
- `plant_batch_ids` string[]
- `license_ids` string[]

## Response `200`

The Cultivation Transaction History report

- CultivationTransactionHistoryReport: The Cultivation Transaction History report
  - `data` CultivationTransactionHistoryReportRow[], required: The report rows, one per cultivation transaction, sorted most-recent-first by transaction date. Empty when no transactions match the filters.
    - `amount` string: The signed transaction amount. Positive for gains, negative for downward adjustments (e.g. plants removed via a Plant Batch Adjustment or Split Plant Batch). Additive applications distribute the applied quantity across their sibling rows so the amounts sum to the total applied. Expressed in `unit`.
    - `batch_name` string: The plant batch (plant group) name, or null for rows not tied to a specific batch.
    - `date` string, required: The transaction date, formatted `MM/DD/YYYY` in the company's timezone (not an ISO8601 timestamp). Always present.
    - `description` string: The transaction's free-text description, or null when none was recorded.
    - `package_label_s` string: Comma-separated Metrc package compliance label(s) tied to the transaction, or null when no package is involved.
    - `plant_tag_s` string: Comma-separated Metrc plant tag(s) involved, ordered by tag. Null for Plant Batch Creation rows and for any row with no individual plant tags.
    - `product_id` string: The ID of the product `product_name` names — the `id` [GET /public/v1/products](#get-products) returns — or null when none applies or the row merges products that share that name.
    - `product_name` string: The product name associated with the transaction, or null when none applies.
    - `related_entity` string: The name of the teardown or harvest this transaction belongs to, or null for transaction types with no related entity. For harvest-created-from-teardown rows this is the harvest name, falling back to the teardown name.
    - `related_entity_status` string: The workflow status of the related teardown — one of `PREPARING`, `PENDING`, or `COMPLETED` — passed through as stored rather than remapped through the public API's enum layer. Populated only for teardown-backed rows (a teardown itself, or a Harvest Created from Teardown). Null when there is no related entity, and also null for harvest-only rows such as Create Package from Harvest, whose `related_entity` names the harvest but which carry no teardown status.
    - `strain` string: The strain name of the plant batch, or null for rows not tied to a strain (e.g. some harvest- or teardown-level rows).
    - `total_cost` string: The transaction's total cost, in the company's currency. Present only for API keys whose user can view costs (the key is omitted for everyone else — check `meta.columns`). May be null when no cost is associated with the transaction.
    - `type` string, required: The transaction's display type, e.g. `Move Plant(s)`, `Destroy Plant`, `Package Plant Batch`, or `Record Waste (Harvest)`. Growth phase changes append the transition, e.g. `Growth Phase Change (Immature → Vegetative)`. Human-readable names (not SCREAMING_CASE tokens); the same values the `transaction_type` filter accepts. Always present.
    - `unit` string: The unit the `amount` is expressed in (e.g. `Unit` for whole-plant counts, or a product/harvest unit-type name such as `Grams`). May be null when no unit type applies.
  - `meta` CultivationTransactionHistoryReportMeta, required: Report-level metadata
    - `columns` CultivationTransactionHistoryReportColumn[], required: The ordered column definitions present in this response. Each entry's `key` matches a property name in every `data` row; the set reflects the caller's permissions — the `total_cost` column appears only when the user can view costs.
      - `key` string, required: The machine key for this column; identical to the corresponding property name in each `data` row (e.g. `batch_name`, `total_cost`).
      - `label` string, required: The human-readable column header (e.g. `Batch Name`, `Total Cost`).
    - `date_range` string, required: The human-readable date range the report covers, derived from the `datetime` filter (or the default last-30-days window when it was omitted). Mirrors the range applied to the rows. Always present — a range is always resolved, even when `datetime` is omitted.
    - `report` string, required: The report identifier, always `cultivation_transaction_history`.

## Other responses

- `400`: Invalid parameters
- `401`: Missing or invalid API token
- `403`: The API token lacks the required permission, or team restrictions hide the record

## Changes

- **2026-10-07** `e8639f7dafed`: 1 info
  - added the optional property `data/items/product_id` to the response with the `200` status

[Operation history](https://skmtc.dev/distru/apis/distru-api/changes/public/v1/reports/cultivation-transaction-history/get.md)

---

[API](https://skmtc.dev/distru/apis/distru-api.md) - [All operations](https://skmtc.dev/distru/apis/distru-api/llms.txt) - [OpenAPI document](https://skmtc.dev/distru/apis/distru-api/revisions/9d851a88e82f?raw)
