---
title: "Get assemblies"
method: GET
path: "/public/v1/assemblies"
tags: ["Assembly"]
---

# Get assemblies

`GET /public/v1/assemblies`

Get a page of assemblies, each with its full outputs, inputs, and costs, ordered oldest to newest
by their last modified date. All filters below are ANDed together, and results are paginated.

Because the order is by last modified date, an assembly that is modified while you are paging moves
to the end of the order and can appear again on a later page — walking the pages is safe as long as
you treat a repeated ID as the same assembly. No assembly is ever skipped this way.

Nested `input_*` and `output_*` filters match against an assembly's inputs and outputs. When you
combine several filters for the same side, a single line must satisfy all of them: e.g.
`input_product_ids` + `input_batch_ids` keeps only assemblies that have one input matching both.
Input and output filters combine across sides too — an assembly must have a matching input AND a
matching output to be returned.

This endpoint returns eventually consistent data, with changes taking up to 1 second to propagate
in responses — an assembly you just created or updated (including via the upsert or split-package
endpoints) may not appear here for up to a second.

Required permission: `assemblies_permissions_view`. Results are scoped to your company and further
filtered to only the assemblies the authenticated user's team restrictions allow them to see, so a
restricted key may see fewer rows than exist.

## Query parameters

- `ids` string[]
- `completion_datetime` string
- `page` string
- `creation_source` 'MANUALLY_CREATED' | 'SALES_ORDER' | 'SPLIT_PACKAGE' | 'LAB_TESTING'
- `license_number` string
- `status` 'PENDING' | 'COMPLETED'
- `custom_data` object
- `inserted_datetime` string
- `updated_datetime` string
- `owner_ids` string[]
- `license_ids` string[]
- `input_product_ids` string[]
- `input_package_ids` string[]
- `input_batch_ids` string[]
- `input_package_compliance_labels` string[]
- `input_package_batch_numbers` string[]
- `input_batch_batch_numbers` string[]
- `input_product_category_ids` string[]
- `input_product_subcategory_ids` string[]
- `input_product_skus` string[]
- `input_product_group_ids` string[]
- `input_product_brand_ids` string[]
- `input_product_vendor_ids` string[]
- `input_product_tag_ids` string[]
- `input_product_strain_ids` string[]
- `output_product_ids` string[]
- `output_package_ids` string[]
- `output_batch_ids` string[]
- `output_package_compliance_labels` string[]
- `output_package_batch_numbers` string[]
- `output_batch_batch_numbers` string[]
- `output_product_category_ids` string[]
- `output_product_subcategory_ids` string[]
- `output_product_skus` string[]
- `output_product_group_ids` string[]
- `output_product_brand_ids` string[]
- `output_product_vendor_ids` string[]
- `output_product_tag_ids` string[]
- `output_product_strain_ids` string[]

## Response `200`

A list of assemblies

## Other responses

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

## Changes

- **2026-09-04** `f8930b2c2924` — 1 info
  - added the optional property `data/items/outputs/items/lab_test_batches` to the response with the `200` status

[Change history](https://skmtc.dev/distru/apis/distru-api/changes/public/v1/assemblies/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-service-production.skmtc.workers.dev/v1/apis/distru/distru-api/revisions/eb775b7b6ee0/schema)
