Distru API
Stay Up To Date
To stay up to date with the latest breaking changes to the Distru public API, please sign up for our email list.
Overview
Distru's public API allows you to easily access and manipulate your data in our system automatically.
- Integrate your supply chain with the rest of your business Build your own custom connectors that support your most important workflows.
- Extend your reports Take data from Distru and pipe it into other systems for a unified view of your business.
- Maximize your efficiency Automate tasks based on changes in your distribution, manufacturing, and sales.
Base URL
All API requests should be made to the base URL: https://app.distru.com
Getting Started
To integrate with Distru, you'll need to contact a representative that will can enable your account's API access. From there, have a look at the following information on how to authenticate with Distru.
Authentication
An admin user can generate API keys in the Distru app by following these steps.
Steps:
- Log in to Distru with your admin account.
- Navigate to the Settings page from the left menu.
- Click on Distru API under the Integrations section.
- Use the Create API Key option to generate your API token.
Using your API token
Example authenticated request
GET /public/v1/orders?page[number]=1
content-type: application/json
accept: application/json
authorization: Bearer YOUR_API_TOKEN
Every request must include your token in the Authorization header using the
Bearer scheme, along with JSON content-type and accept headers:
| Header | Value |
|---|---|
Authorization |
Bearer YOUR_API_TOKEN |
Content-Type |
application/json |
Accept |
application/json |
Treat your token like a password: it carries the same permissions as the admin who created it. Keep it server-side and never expose it in client-side code.
Webhooks
Distru can push changes to your systems in real time via webhooks. A webhook fires whenever a record is created, edited, or deleted. We support webhooks for:
- Sales Orders
- Purchase Orders
- Assemblies
- Invoices
- Companies
- Returns
- Products
To set up webhooks, reach out to Customer Support to find out more.
Webhook payload shape
Every webhook is a JSON POST with three top-level fields:
| Field | Description |
|---|---|
type |
The entity type, e.g. ORDER, PURCHASE, INVOICE, PRODUCT. |
id |
The public id of the entity the webhook is about (the same value as object.id). |
object |
The full entity, in the same structure the GET /public/v1/<type>/<id> endpoint returns. |
object is the current version of the entity, fetched fresh when the
webhook is sent — not a snapshot from when the change was committed. If other
changes were committed in between, they are reflected. On a hard-delete event
the entity no longer exists, so object is null; use type and id.
To keep integrations simple, object matches the corresponding GET endpoint
exactly, so you can parse it with the same code you already use for that
endpoint.
Webhook nested entities
A change to a nested record triggers a webhook at its parent level —
never as its own webhook — and object is always the full parent entity.
The nested records that trigger each parent are:
| Parent | Nested records |
|---|---|
| Sales Orders | items, charges |
| Purchase Orders | items, charges |
| Invoices | items, charges, payments |
| Assemblies | inputs, outputs, costs |
| Returns | items |
| Companies | the related company, its locations, its licenses, and its contacts (each with its profile) |
| Products | bills of materials (and each bill of materials' inputs and costs) |
For example, adding an order item to a sales order does not send an "order
item" webhook — it sends a Sales Order webhook whose object is the full
order, including the new item.
Note: inventory changes (adding or removing quantity) do not currently trigger Product webhooks.
Webhook signing & verification
When Customer Support sets up your webhook, they provide a signing secret. Distru signs every request so you can confirm it came from us and was not tampered with.
Each request includes an x-distru-signature header:
x-distru-signature: sha256=<hex digest>
The digest is an HMAC-SHA256 of the raw request body using your signing
secret. To verify a request:
- Read the raw request body exactly as received — do not re-serialize the JSON, since key order must match.
- Compute
HMAC-SHA256(raw_body, your_secret)and hex-encode it. - Compare
sha256=<your digest>to thex-distru-signatureheader using a constant-time comparison.
Node.js example
const crypto = require('crypto');
function isValid(rawBody, signatureHeader, secret) {
const expected =
'sha256=' +
crypto.createHmac('sha256', secret).update(rawBody).digest('hex');
return crypto.timingSafeEqual(
Buffer.from(signatureHeader),
Buffer.from(expected)
);
}
Webhook retries & ordering
If your endpoint is unreachable or returns a non-2xx status, Distru retries
delivery with an increasing delay between attempts (up to ~10 attempts over
roughly 4 hours) before giving up.
Webhooks are delivered in the order the underlying changes were committed.
Webhook payload examples
A sales order is created or edited (
objectis the full order, same asGET /public/v1/orders/:id)
{
"type": "ORDER",
"id": "8f3c9d2e-1a4b-4c7d-9e0f-2b6a1c3d4e5f",
"object": {
"id": "8f3c9d2e-1a4b-4c7d-9e0f-2b6a1c3d4e5f",
"order_number": "SO-0001",
"status": "PENDING",
"total": "60.00",
"order_datetime": "2025-05-04T04:40:21.817570Z",
"company": {"id": "b7e2…", "name": "Acme Dispensary"},
"items": [
{
"id": "a1b2c3d4-5e6f-7a8b-9c0d-1e2f3a4b5c6d",
"product_id": "0c9e7f11-2a33-4b55-8c77-9d0e1f2a3b4c",
"quantity": 5.0,
"price": 10.0
}
],
"charges": []
}
}
The same shape is sent when a nested record changes: adding an order item sends
an ORDER webhook whose object is the full order (with the new item under
items).
A sales order is hard-deleted (
objectis null)
{
"type": "ORDER",
"id": "8f3c9d2e-1a4b-4c7d-9e0f-2b6a1c3d4e5f",
"object": null
}
Objects above are trimmed for readability; a real object includes the full set
of fields returned by the matching GET endpoint.
Pagination
Use the page[number]= query parameter to request a specific page. When another
page is available, the response body includes a next_page URL you can follow.
Page size limits for each endpoint are listed in the API documentation.
Endpoint query with page number example
https://app.distru.com/public/v1/products?page[number]=1
cURL example
curl --location --globoff 'https://app.distru.com/public/v1/products?page[number]=1' \
--header 'Authorization: Bearer ********* API KEY HERE *********'
Next page URL in the response body (if a next page exists)
"next_page": "https://app.distru.com/public/v1/products?page[number]=2"
Filtering by datetime parameters
Datetimes use the format YYYY-MM-DDTHH:MM:SS.MSZ.
The comma position controls the direction of the filter. All bounds are inclusive: a record matching the exact datetime in the query is returned.
- Comma after the datetime = records on or after that datetime.
- Comma before the datetime = records on or before that datetime.
- Datetimes on both sides of the comma = records between the two datetimes, inclusive of both ends.
Examples
products?updated_datetime=2025-05-04T04:40:21.817570Z,
Returns any record on or after May 4th, 2025.
products?updated_datetime=,2025-05-04T04:40:21.817570Z
Returns any record on or before May 4th, 2025.
products?updated_datetime=2025-05-04T04:40:21.817570Z,2025-09-18T16:27:44.946871Z
Returns records between May 4th, 2025 and Sept 18th, 2025, inclusive.
Endpoints
Assembly
Get an assembly
GET /public/v1/assemblies/:id returns a single assembly
GET /public/v1/assemblies/03c1193e-4dc9-40ba-a5ed-cc2638b4b79e
content-type: application/json
accept: application/json
authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJhdWQiOiJEaXN0cnUiLCJleHAiOjE4MTgxNTYwNTgsImlhdCI6MTc4NjcwNjQ1OCwiaXNzIjoiRGlzdHJ1IiwianRpIjoiYzg5YzZkMmUtNGZlNi00MWJjLTlmYjUtY2ViZmM0NzRhMGNlIiwibW9iaWxlIjpmYWxzZSwibmJmIjoxNzg2NzA2NDU3LCJwbGF0Zm9ybSI6IkFQSSIsInN1YiI6IlVzZXI6MTA1MyIsInR5cCI6ImFjY2VzcyJ9.IzfobqGDNRLJSRAcahzFH72LejxoY4YyazZlDsRhqpY
Response
200
content-type: application/json; charset=utf-8
cache-control: max-age=0, private, must-revalidate
b3: 4f386cc9ae42ce31820953aabfcc9c0e-2722a027b8cf6012-0
{
"data": {
"assembly_number": "ASM001",
"completion_datetime": null,
"compliance_type": "NONE",
"creation_source": "MANUALLY_CREATED",
"custom_data": [],
"description": "A little more than kin, and less than kind.",
"estimated_start_date": null,
"estimated_work_hours": null,
"estimated_work_minutes": null,
"fulfilled": true,
"id": "03c1193e-4dc9-40ba-a5ed-cc2638b4b79e",
"is_metrc_processing_job": false,
"license": null,
"outputs": [],
"owner_id": "00000000-0000-0000-0000-000000000421",
"status": "PENDING"
}
}
Get a single assembly given the ID.
Required permission: assemblies_permissions_view.
Request
GET /public/v1/assemblies/{id}
Parameters
| Parameter | Description | In | Type | Required | Default | Example |
|---|---|---|---|---|---|---|
| id | Assembly ID | path | string | true |
Responses
| Status | Description | Schema |
|---|---|---|
| 200 | A single assembly | Assembly |
| 404 | Not Found |
Get assemblies
GET /public/v1/assemblies returns proper data for non-compliance assembly
GET /public/v1/assemblies?creation_source=MANUALLY_CREATED&page[number]=1
content-type: application/json
accept: application/json
authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJhdWQiOiJEaXN0cnUiLCJleHAiOjE4MTgxNTYwNTksImlhdCI6MTc4NjcwNjQ1OSwiaXNzIjoiRGlzdHJ1IiwianRpIjoiZGMyYzQ5NDktMjc2Ny00NTNhLWJiMzUtMDM1YjVmNjJiNzgyIiwibW9iaWxlIjpmYWxzZSwibmJmIjoxNzg2NzA2NDU4LCJwbGF0Zm9ybSI6IkFQSSIsInN1YiI6IlVzZXI6MTI2MCIsInR5cCI6ImFjY2VzcyJ9.wBBbSj4gPSI0Hff9Z6Zdu0fhujacxXbOeKWTq_wwCNo
Response
200
content-type: application/json; charset=utf-8
cache-control: max-age=0, private, must-revalidate
b3: 5d764dcd2b18d55b498341073f460719-295a7fdb2cc42224-0
{
"data": [
{
"assembly_number": "AS-0000001",
"completion_datetime": "2026-08-14T11:20:59.572880Z",
"compliance_type": "NONE",
"creation_source": "MANUALLY_CREATED",
"custom_data": [
{
"id": 46,
"name": "Custom Field 23",
"value": "Custom Field Value"
}
],
"description": null,
"estimated_start_date": "2024-01-02T03:04:05.000000Z",
"estimated_work_hours": 1,
"estimated_work_minutes": 5,
"fulfilled": true,
"id": "7bfa077e-6117-4007-a9c1-ee2d5dd8f788",
"is_metrc_processing_job": false,
"license": null,
"outputs": [
{
"additional_costs": [
{
"cost_per_unit": "-1",
"description": null,
"name": "CostType 15",
"quantity": "1",
"total_cost_actual": "-1",
"total_cost_default": "0",
"unit_type": {
"id": "00000000-0000-0000-0000-00000000311c",
"name": "Unit Type 19"
}
}
],
"batch": {
"batch_number": null,
"id": "00000000-0000-0000-0000-0000000000ed",
"name": "B799"
},
"compliance_label": null,
"compliance_quantity": null,
"cost_per_unit": "-0.3",
"cost_per_unit_default": "0.5",
"expiration_datetime": null,
"ingredients": [
{
"batch": {
"batch_number": null,
"id": "00000000-0000-0000-0000-0000000000ed",
"name": "B799"
},
"compliance_quantity": null,
"cost_per_unit": "0.2",
"cost_per_unit_default": "1",
"location": {
"address": "123 Fake Street, Beverly Hills, CA 90210, US",
"company_id": "00000000-0000-0000-0000-0000000003d3",
"id": "00000000-0000-0000-0000-000000000141",
"license_id": null,
"name": "Place 320"
},
"package": null,
"product": {
"id": "19cf0f71-233c-4a27-b219-92d500b38799",
"name": "Product 791",
"sku": "sku 792",
"updated_datetime": "2026-08-14T11:20:59.489314Z"
},
"quantity": "2",
"total_cost_actual": "0.4",
"total_cost_default": "2"
}
],
"is_finished_good": false,
"is_production_batch": false,
"location": {
"address": "123 Fake Street, Beverly Hills, CA 90210, US",
"company_id": "00000000-0000-0000-0000-0000000003d3",
"id": "00000000-0000-0000-0000-000000000141",
"license_id": null,
"name": "Place 320"
},
"package": null,
"package_datetime": null,
"package_unit_type": null,
"product": {
"id": "19cf0f71-233c-4a27-b219-92d500b38799",
"name": "Product 791",
"sku": "sku 792",
"updated_datetime": "2026-08-14T11:20:59.489314Z"
},
"quantity": "2",
"total_cost_actual": "-0.6",
"total_cost_default": "1"
}
],
"owner_id": "00000000-0000-0000-0000-0000000004ec",
"status": "COMPLETED"
}
],
"next_page": null
}
GET /public/v1/assemblies returns proper data for pending metrc assembly
GET /public/v1/assemblies?creation_source=MANUALLY_CREATED&license_number=CDPH-00000080&page[number]=1
content-type: application/json
accept: application/json
authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJhdWQiOiJEaXN0cnUiLCJleHAiOjE4MTgxNTYwNjAsImlhdCI6MTc4NjcwNjQ2MCwiaXNzIjoiRGlzdHJ1IiwianRpIjoiZTEwZjU3OTMtMGM1NC00MDQzLThiMTQtNTQ0YjY2MGZkNzU5IiwibW9iaWxlIjpmYWxzZSwibmJmIjoxNzg2NzA2NDU5LCJwbGF0Zm9ybSI6IkFQSSIsInN1YiI6IlVzZXI6MTczMSIsInR5cCI6ImFjY2VzcyJ9.lPs-hNVoYPm0jkjjYVf_5NdmSbXv6zPZiC6iz_CzsXE
Response
200
content-type: application/json; charset=utf-8
cache-control: max-age=0, private, must-revalidate
b3: dbfd74b41bd02738653c6ab20efa0b0c-77841c6d95a77248-0
{
"data": [
{
"assembly_number": "AS-0000001",
"completion_datetime": null,
"compliance_type": "METRC",
"creation_source": "MANUALLY_CREATED",
"custom_data": [
{
"id": 59,
"name": "Custom Field 34",
"value": null
}
],
"description": null,
"estimated_start_date": null,
"estimated_work_hours": null,
"estimated_work_minutes": null,
"fulfilled": true,
"id": "d469c735-846a-427e-b5e5-3682779fc5f1",
"is_metrc_processing_job": false,
"license": {
"id": "00000000-0000-0000-0000-00000000004f",
"license_number": "CDPH-00000080"
},
"outputs": [
{
"additional_costs": [],
"batch": {
"batch_number": null,
"id": "00000000-0000-0000-0000-00000000018a",
"name": "B1207"
},
"compliance_label": "1A4010200001234000000003",
"compliance_quantity": "2",
"cost_per_unit": null,
"cost_per_unit_default": null,
"expiration_datetime": null,
"ingredients": [
{
"batch": {
"batch_number": null,
"id": "00000000-0000-0000-0000-00000000018a",
"name": "B1207"
},
"compliance_quantity": "0.0353",
"cost_per_unit": null,
"cost_per_unit_default": null,
"location": {
"address": "123 Fake Street, Beverly Hills, CA 90210, US",
"company_id": "00000000-0000-0000-0000-00000000050d",
"id": "00000000-0000-0000-0000-000000000182",
"license_id": "00000000-0000-0000-0000-00000000004f",
"name": "Place 385"
},
"package": {
"batch_number": "1234567890",
"compliance_label": "ABCDEF012345670000000122",
"id": "00000000-0000-0000-0000-000000000043",
"metrc_label": "ABCDEF012345670000000122",
"status": "active"
},
"product": {
"id": "f816e75b-3e77-4907-b459-6f8f36f93a10",
"name": "Product 1202",
"sku": "sku 1203",
"updated_datetime": "2026-08-14T11:21:00.757438Z"
},
"quantity": "1",
"total_cost_actual": null,
"total_cost_default": null
}
],
"is_finished_good": false,
"is_production_batch": false,
"location": {
"address": "123 Fake Street, Beverly Hills, CA 90210, US",
"company_id": "00000000-0000-0000-0000-00000000050d",
"id": "00000000-0000-0000-0000-000000000182",
"license_id": "00000000-0000-0000-0000-00000000004f",
"name": "Place 385"
},
"package": null,
"package_datetime": "2026-08-14",
"package_unit_type": {
"id": "00000000-0000-0000-0000-000000003f4a",
"name": "Gram"
},
"product": {
"id": "f816e75b-3e77-4907-b459-6f8f36f93a10",
"name": "Product 1202",
"sku": "sku 1203",
"updated_datetime": "2026-08-14T11:21:00.757438Z"
},
"quantity": "2",
"total_cost_actual": null,
"total_cost_default": null
}
],
"owner_id": "00000000-0000-0000-0000-0000000006c3",
"status": "PENDING"
}
],
"next_page": null
}
GET /public/v1/assemblies returns proper data for completed metrc assembly
GET /public/v1/assemblies?completion_datetime=2026-08-14+10%3A20%3A58.669573Z%2C2026-08-14+12%3A20%3A58.669573Z&creation_source=MANUALLY_CREATED&license_number=CDPH-00000037&page[number]=1
content-type: application/json
accept: application/json
authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJhdWQiOiJEaXN0cnUiLCJleHAiOjE4MTgxNTYwNTgsImlhdCI6MTc4NjcwNjQ1OCwiaXNzIjoiRGlzdHJ1IiwianRpIjoiMzcyMzljNjQtNWVhNi00MmMwLTlkYjctYjVmNjU0MzEyZTA4IiwibW9iaWxlIjpmYWxzZSwibmJmIjoxNzg2NzA2NDU3LCJwbGF0Zm9ybSI6IkFQSSIsInN1YiI6IlVzZXI6ODc3IiwidHlwIjoiYWNjZXNzIn0.VAkJJjVApdC1FY4qwrdxLSWrx0IrKjtwQI1vKnZ5W3c
Response
200
content-type: application/json; charset=utf-8
cache-control: max-age=0, private, must-revalidate
b3: 25c0409fe996977b7defe60bedc6c227-9e95b16e4910ad6b-0
{
"data": [
{
"assembly_number": "AS-0000001",
"completion_datetime": "2026-08-14T11:20:58.669573Z",
"compliance_type": "METRC",
"creation_source": "MANUALLY_CREATED",
"custom_data": [],
"description": null,
"estimated_start_date": null,
"estimated_work_hours": null,
"estimated_work_minutes": null,
"fulfilled": true,
"id": "6a2d39ca-b683-409a-ad7b-4e26250b1ac7",
"is_metrc_processing_job": false,
"license": {
"id": "00000000-0000-0000-0000-000000000024",
"license_number": "CDPH-00000037"
},
"outputs": [
{
"additional_costs": [],
"batch": {
"batch_number": null,
"id": "00000000-0000-0000-0000-000000000089",
"name": "B469"
},
"compliance_label": "1A4010200001234000000002",
"compliance_quantity": "2",
"cost_per_unit": null,
"cost_per_unit_default": null,
"expiration_datetime": null,
"ingredients": [
{
"batch": {
"batch_number": null,
"id": "00000000-0000-0000-0000-000000000089",
"name": "B469"
},
"compliance_quantity": "0.0353",
"cost_per_unit": null,
"cost_per_unit_default": null,
"location": {
"address": "123 Fake Street, Beverly Hills, CA 90210, US",
"company_id": "00000000-0000-0000-0000-0000000002a1",
"id": "00000000-0000-0000-0000-000000000100",
"license_id": "00000000-0000-0000-0000-000000000024",
"name": "Place 255"
},
"package": {
"batch_number": "1234567890",
"compliance_label": "ABCDEF012345670000000052",
"id": "00000000-0000-0000-0000-00000000001c",
"metrc_label": "ABCDEF012345670000000052",
"status": "active"
},
"product": {
"id": "972f9c15-b523-45d4-9b73-34d166037a2d",
"name": "Product 459",
"sku": "sku 460",
"updated_datetime": "2026-08-14T11:20:58.448730Z"
},
"quantity": "1",
"total_cost_actual": null,
"total_cost_default": null
}
],
"is_finished_good": false,
"is_production_batch": false,
"location": {
"address": "123 Fake Street, Beverly Hills, CA 90210, US",
"company_id": "00000000-0000-0000-0000-0000000002a1",
"id": "00000000-0000-0000-0000-000000000100",
"license_id": "00000000-0000-0000-0000-000000000024",
"name": "Place 255"
},
"package": {
"batch_number": null,
"compliance_label": "1A4010200001234000000002",
"id": "00000000-0000-0000-0000-00000000001f",
"metrc_label": "1A4010200001234000000002",
"status": "active"
},
"package_datetime": "2026-08-14",
"package_unit_type": {
"id": "00000000-0000-0000-0000-0000000020cd",
"name": "Gram"
},
"product": {
"id": "972f9c15-b523-45d4-9b73-34d166037a2d",
"name": "Product 459",
"sku": "sku 460",
"updated_datetime": "2026-08-14T11:20:58.448730Z"
},
"quantity": "2",
"total_cost_actual": null,
"total_cost_default": null
}
],
"owner_id": "00000000-0000-0000-0000-00000000036d",
"status": "COMPLETED"
}
],
"next_page": null
}
GET /public/v1/assemblies returns proper data for biotrack assembly
GET /public/v1/assemblies?completion_datetime=2026-08-14+10%3A21%3A00.456852Z%2C2026-08-14+12%3A21%3A00.456852Z&creation_source=MANUALLY_CREATED&license_number=CDPH-00000065&page[number]=1
content-type: application/json
accept: application/json
authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJhdWQiOiJEaXN0cnUiLCJleHAiOjE4MTgxNTYwNjAsImlhdCI6MTc4NjcwNjQ2MCwiaXNzIjoiRGlzdHJ1IiwianRpIjoiNjlkNGE0NjctMDZmYi00YjcxLTkxMWItYzkxYWRlODYyZjNmIiwibW9iaWxlIjpmYWxzZSwibmJmIjoxNzg2NzA2NDU5LCJwbGF0Zm9ybSI6IkFQSSIsInN1YiI6IlVzZXI6MTUxNyIsInR5cCI6ImFjY2VzcyJ9.j_3QJIcdctNuSGCimGDRVyu403GLNIVfdWCdjkjoasU
Response
200
content-type: application/json; charset=utf-8
cache-control: max-age=0, private, must-revalidate
b3: 89c9ae3707b8a9c41abf009aa33cd465-d53c13d7aeec1cfe-0
{
"data": [
{
"assembly_number": "AS-0000001",
"completion_datetime": "2026-08-14T11:21:00.456852Z",
"compliance_type": "BIOTRACK",
"creation_source": "MANUALLY_CREATED",
"custom_data": [],
"description": null,
"estimated_start_date": null,
"estimated_work_hours": null,
"estimated_work_minutes": null,
"fulfilled": true,
"id": "b9b95da7-fe40-4e7f-8eb6-774a64a1f55a",
"is_metrc_processing_job": false,
"license": {
"id": "00000000-0000-0000-0000-000000000040",
"license_number": "CDPH-00000065"
},
"outputs": [
{
"additional_costs": [],
"batch": {
"batch_number": null,
"id": "00000000-0000-0000-0000-000000000156",
"name": "B1043"
},
"compliance_label": null,
"compliance_quantity": "1",
"cost_per_unit": null,
"cost_per_unit_default": null,
"expiration_datetime": null,
"ingredients": [
{
"batch": {
"batch_number": null,
"id": "00000000-0000-0000-0000-000000000156",
"name": "B1043"
},
"compliance_quantity": "1",
"cost_per_unit": null,
"cost_per_unit_default": null,
"location": {
"address": "123 Fake Street, Beverly Hills, CA 90210, US",
"company_id": "00000000-0000-0000-0000-000000000476",
"id": "00000000-0000-0000-0000-000000000162",
"license_id": "00000000-0000-0000-0000-000000000040",
"name": "Place 353"
},
"package": {
"batch_number": null,
"compliance_label": "0000000000000001",
"id": "00000000-0000-0000-0000-000000000037",
"metrc_label": "0000000000000001",
"status": "active"
},
"product": {
"id": "9b365ebf-ac7e-46f5-9e1f-d96a7dcdac86",
"name": "Product 1039",
"sku": "sku 1040",
"updated_datetime": "2026-08-14T11:21:00.118356Z"
},
"quantity": "1",
"total_cost_actual": null,
"total_cost_default": null
}
],
"is_finished_good": false,
"is_production_batch": false,
"location": {
"address": "123 Fake Street, Beverly Hills, CA 90210, US",
"company_id": "00000000-0000-0000-0000-000000000476",
"id": "00000000-0000-0000-0000-000000000162",
"license_id": "00000000-0000-0000-0000-000000000040",
"name": "Place 353"
},
"package": {
"batch_number": null,
"compliance_label": null,
"id": "00000000-0000-0000-0000-00000000003c",
"metrc_label": null,
"status": "active"
},
"package_datetime": null,
"package_unit_type": {
"id": "00000000-0000-0000-0000-0000000037b2",
"name": "Gram"
},
"product": {
"id": "9b365ebf-ac7e-46f5-9e1f-d96a7dcdac86",
"name": "Product 1039",
"sku": "sku 1040",
"updated_datetime": "2026-08-14T11:21:00.118356Z"
},
"quantity": "1",
"total_cost_actual": null,
"total_cost_default": null
}
],
"owner_id": "00000000-0000-0000-0000-0000000005ed",
"status": "COMPLETED"
}
],
"next_page": null
}
Get assemblies ordered from oldest to newest by their last modified date.
Note: The page size for this endpoint is 500 assemblies per page. This endpoint returns eventually consistent data, with changes taking up to 1 second to propagate in responses.
Required permission: assemblies_permissions_view. Results are filtered to
only include assemblies the authenticated user can access under their team
restrictions.
Request
GET /public/v1/assemblies
Parameters
| Parameter | Description | In | Type | Required | Default | Example |
|---|---|---|---|---|---|---|
| completion_datetime | Filter assemblies by their completion datetime | query | string | false | 2022-07-10T00:00:00Z, | |
| page | Pagination information | query | number | false | ?page[number]=1 | |
| creation_source | Filter assemblies by their creation source. Options include MANUALLY_CREATED, SPLIT_PACKAGE, SALES_ORDER and LAB_TESTING | query | string | false | ||
| license_number | Filter assemblies by their license number | query | string | false |
Responses
| Status | Description | Schema |
|---|---|---|
| 200 | A list of assemblies | Assemblies |
Batch
Create a batch
POST /public/v1/batches Errors from service messages are properly reflected in the response
POST /public/v1/batches
content-type: application/json
accept: application/json
authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJhdWQiOiJEaXN0cnUiLCJleHAiOjE4MTgxNTYwNTYsImlhdCI6MTc4NjcwNjQ1NiwiaXNzIjoiRGlzdHJ1IiwianRpIjoiYzRkYjllYmYtYTRlNy00ZjZjLWEwOGYtM2I4ODNmODY2MzM3IiwibW9iaWxlIjpmYWxzZSwibmJmIjoxNzg2NzA2NDU1LCJwbGF0Zm9ybSI6IkFQSSIsInN1YiI6IlVzZXI6MzU4IiwidHlwIjoiYWNjZXNzIn0.cmzkcrmZUlY2A2Gh5sqyBsvcd9IH27mqlldJSC7cMuI
{
"owner_id": "264069c8-bdf0-4b84-bfe1-14cc03300ba2",
"product_id": "e8961522-a6f8-4ce6-b6e0-52022e764cf6"
}
Response
400
cache-control: max-age=0, private, must-revalidate
content-type: application/json; charset=utf-8
b3: b6687c0295cc68aa7d70e2784687d4b2-9b8b5e5dddff263d-0
{
"errors": [
{
"context": {},
"message": "Owner not found",
"pointer": [
"owner_id"
],
"section": "body"
},
{
"context": {},
"message": "Product not found",
"pointer": [
"product_id"
],
"section": "body"
},
{
"context": {},
"message": "Unable to verify inventory tracking method",
"pointer": [
"product_id"
],
"section": "body"
}
]
}
POST /public/v1/batches Can create batch with all optional fields missing
POST /public/v1/batches
content-type: application/json
accept: application/json
authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJhdWQiOiJEaXN0cnUiLCJleHAiOjE4MTgxNTYwNTksImlhdCI6MTc4NjcwNjQ1OSwiaXNzIjoiRGlzdHJ1IiwianRpIjoiNWNkOTRmZjctZTkxYi00ODdjLWE3MDctNzZmMTk2ZmFjY2E5IiwibW9iaWxlIjpmYWxzZSwibmJmIjoxNzg2NzA2NDU4LCJwbGF0Zm9ybSI6IkFQSSIsInN1YiI6IlVzZXI6MTE5NiIsInR5cCI6ImFjY2VzcyJ9.wCwnEf2CfEtaWYKLFjlS1Os3-w3kkzDUj6Rrs1N3AcY
{
"product_id": "96dedd27-9613-4ac8-b815-46238fb8bb34"
}
Response
200
content-type: application/json; charset=utf-8
cache-control: max-age=0, private, must-revalidate
b3: 461270d2468a8900f122551091dd589b-9a9d1e7d8dd7248f-0
{
"data": {
"batch_number": null,
"custom_data": [],
"deleted_at": null,
"description": null,
"expiration_date": null,
"id": "00000000-0000-0000-0000-0000000000d4",
"manufactured_datetime": "2026-08-14T11:20:59.323126Z",
"name": "B1",
"owner_id": null,
"product_id": "96dedd27-9613-4ac8-b815-46238fb8bb34"
}
}
POST /public/v1/batches Can create batch with all optional fields provided
POST /public/v1/batches
content-type: application/json
accept: application/json
authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJhdWQiOiJEaXN0cnUiLCJleHAiOjE4MTgxNTYwNTcsImlhdCI6MTc4NjcwNjQ1NywiaXNzIjoiRGlzdHJ1IiwianRpIjoiNzNhYzgyM2EtYjllZC00ZDJlLTkxMWMtMWRhZGJkNTMzODNjIiwibW9iaWxlIjpmYWxzZSwibmJmIjoxNzg2NzA2NDU2LCJwbGF0Zm9ybSI6IkFQSSIsInN1YiI6IlVzZXI6NjM1IiwidHlwIjoiYWNjZXNzIn0.kIwPymfmf2KXDypwLt-J1ZGXz-s9n4qgfp5T0Cgm9c0
{
"batch_number": "B1",
"custom_data": {
"24": [
"A",
"B"
]
},
"description": "Test batch",
"expiration_date": "2025-01-01T00:00:00.000000Z",
"manufactured_datetime": "2025-01-02T03:04:05.000000Z",
"name": "Custom Batch Name",
"owner_id": "00000000-0000-0000-0000-000000000288",
"product_id": "0d994725-3d37-48d3-ae1c-fc98db8f0048"
}
Response
200
content-type: application/json; charset=utf-8
cache-control: max-age=0, private, must-revalidate
b3: 7ad76bfb52e6479921dd807b17a64adb-ada94002cf2e3443-0
{
"data": {
"batch_number": "B1",
"custom_data": [
{
"id": 24,
"name": "Custom Field 5",
"value": "A,B"
}
],
"deleted_at": null,
"description": "Test batch",
"expiration_date": "2025-01-01T00:00:00.000000Z",
"id": "00000000-0000-0000-0000-000000000047",
"manufactured_datetime": "2025-01-02T03:04:05.000000Z",
"name": "Custom Batch Name",
"owner_id": "00000000-0000-0000-0000-000000000288",
"product_id": "0d994725-3d37-48d3-ae1c-fc98db8f0048"
}
}
Create a single batch. Required permission: products_permissions_create.
Request
POST /public/v1/batches
Parameters
| Parameter | Description | In | Type | Required | Default | Example |
|---|---|---|---|---|---|---|
| product_id | The ID of the product that this batch belongs to. | query | string | false | ||
| name | The name of the batch. If omitted, a name is generated from the batch number. | query | string | false | ||
| batch_number | The batch number of the batch. | query | string | false | ||
| expiration_date | The expiration date of the batch. | query | string | false | ||
| manufactured_datetime | The manufactured datetime of the batch (ISO 8601 format). | query | string | false | ||
| owner_id | The ID of the user that is the designated owner of this batch. | query | string | false | ||
| description | The description of the batch. | query | string | false | ||
| custom_data | A map of custom field IDs to their values. Use GET /public/v1/custom-fields?model_name=batch to retrieve available custom fields and their IDs. | body | object | false | {"123":"Custom Value 1","456":"Custom Value 2"} |
Responses
| Status | Description | Schema |
|---|---|---|
| 200 | A single batch | Batch |
Get a batch
GET /public/v1/batches/:id returns a single batch
GET /public/v1/batches/00000000-0000-0000-0000-000000000044
content-type: application/json
accept: application/json
authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJhdWQiOiJEaXN0cnUiLCJleHAiOjE4MTgxNTYwNTcsImlhdCI6MTc4NjcwNjQ1NywiaXNzIjoiRGlzdHJ1IiwianRpIjoiNjUwNWI1MzQtOWNlZS00MTE0LWI1MmEtZjNkMTliYjFkMTUyIiwibW9iaWxlIjpmYWxzZSwibmJmIjoxNzg2NzA2NDU2LCJwbGF0Zm9ybSI6IkFQSSIsInN1YiI6IlVzZXI6NTg3IiwidHlwIjoiYWNjZXNzIn0.Hj_MMn8shaAI2B-Okah2qBn4gitSrlvTaaa-NLXZftI
Response
200
content-type: application/json; charset=utf-8
cache-control: max-age=0, private, must-revalidate
b3: 162d8d16bba2ea000009187de69f2580-7e4901ece02437a2-0
{
"data": {
"batch_number": "B001",
"custom_data": [],
"deleted_at": null,
"description": "Test batch",
"expiration_date": null,
"id": "00000000-0000-0000-0000-000000000044",
"manufactured_datetime": "2026-08-14T11:20:57.319620Z",
"name": "B237",
"owner_id": "00000000-0000-0000-0000-000000000254",
"primary_test_result": null,
"product_id": "738b5d7e-77d5-4676-a343-0d2bb7a8bb34"
}
}
Get a single batch given the ID.
Required permission: products_permissions_view.
Request
GET /public/v1/batches/{id}
Parameters
| Parameter | Description | In | Type | Required | Default | Example |
|---|---|---|---|---|---|---|
| id | Batch ID | path | string | true |
Responses
| Status | Description | Schema |
|---|---|---|
| 200 | A single batch | BatchFull |
| 404 | Not Found |
Get batches
GET /public/v1/batches returns batches related to the company
GET /public/v1/batches
content-type: application/json
accept: application/json
authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJhdWQiOiJEaXN0cnUiLCJleHAiOjE4MTgxNTYwNTksImlhdCI6MTc4NjcwNjQ1OSwiaXNzIjoiRGlzdHJ1IiwianRpIjoiOTA5MDU0OTEtOWEwMC00YjBkLWFiYTAtYzA3NTBkNjFkMGU2IiwibW9iaWxlIjpmYWxzZSwibmJmIjoxNzg2NzA2NDU4LCJwbGF0Zm9ybSI6IkFQSSIsInN1YiI6IlVzZXI6MTMyOSIsInR5cCI6ImFjY2VzcyJ9.NVL0v6TS8HfJyFTz1qnUSy8TkBOCppmm_vAX_qYLsGU
Response
200
content-type: application/json; charset=utf-8
cache-control: max-age=0, private, must-revalidate
b3: 6d61edbbde9398d7712f83559d6c97e5-2a9821fbe53e9301-0
{
"data": [
{
"batch_number": null,
"custom_data": [
{
"id": 49,
"name": "Custom Field 24",
"value": "Custom Data 1"
}
],
"deleted_at": null,
"description": null,
"expiration_date": "2024-01-01T00:00:00.000000Z",
"id": "00000000-0000-0000-0000-000000000110",
"manufactured_datetime": "2024-01-02T03:04:05.000000Z",
"name": "B868",
"owner_id": "00000000-0000-0000-0000-00000000053d",
"primary_test_result": null,
"product_id": "e35e6277-9213-4d47-b62c-95270a9d90ef"
},
{
"batch_number": null,
"custom_data": [
{
"id": 49,
"name": "Custom Field 24",
"value": null
}
],
"deleted_at": null,
"description": null,
"expiration_date": null,
"id": "00000000-0000-0000-0000-000000000117",
"manufactured_datetime": "2024-01-02T03:04:05.000000Z",
"name": "B885",
"owner_id": "00000000-0000-0000-0000-00000000054b",
"primary_test_result": {
"cbd_mg_per_unit": "1",
"cbd_mg_per_unit_total": "2",
"cbd_percentage": "3",
"cbd_percentage_total": "4",
"coa_url": null,
"mg_per_unit_type": "mg/mL",
"name": "File.pdf",
"thc_mg_per_unit": "5",
"thc_mg_per_unit_total": "6",
"thc_percentage": "7",
"thc_percentage_total": "8"
},
"product_id": "84245be6-e22a-4e96-8078-7183c694fbad"
}
],
"next_page": null
}
GET /public/v1/batches returns cost data when include_costs is true
GET /public/v1/batches?include_costs=true
content-type: application/json
accept: application/json
authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJhdWQiOiJEaXN0cnUiLCJleHAiOjE4MTgxNTYwNTcsImlhdCI6MTc4NjcwNjQ1NywiaXNzIjoiRGlzdHJ1IiwianRpIjoiMjk2MTY0ZDItOGM2NC00MTdjLTg2NGMtZmFjMzIyNTZkNzU2IiwibW9iaWxlIjpmYWxzZSwibmJmIjoxNzg2NzA2NDU2LCJwbGF0Zm9ybSI6IkFQSSIsInN1YiI6IlVzZXI6NzQ1IiwidHlwIjoiYWNjZXNzIn0.Cs9l0IfAbr8JCay87Ps62reO61Qg_ax95lh7wWoNJH8
Response
200
content-type: application/json; charset=utf-8
cache-control: max-age=0, private, must-revalidate
b3: 40b9b70a4abe714856d555b6a9ed4319-4d848a7d436883c3-0
{
"data": [
{
"batch_number": null,
"cost_per_unit_actual": "2.11",
"cost_per_unit_default": "5",
"custom_data": [],
"deleted_at": null,
"description": null,
"expiration_date": null,
"id": "00000000-0000-0000-0000-000000000057",
"manufactured_datetime": "2026-08-14T11:20:57.871151Z",
"name": "B307",
"owner_id": "00000000-0000-0000-0000-0000000002f7",
"primary_test_result": null,
"product_id": "7708fa66-551d-4496-a5a1-0c067e6bcfac",
"total_cost_actual": "21.1",
"total_cost_default": "50"
}
],
"next_page": null
}
GET /public/v1/batches filters by batch_ids
GET /public/v1/batches?batch_ids[]=00000000-0000-0000-0000-00000000009d&batch_ids[]=00000000-0000-0000-0000-0000000000a0
content-type: application/json
accept: application/json
authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJhdWQiOiJEaXN0cnUiLCJleHAiOjE4MTgxNTYwNTgsImlhdCI6MTc4NjcwNjQ1OCwiaXNzIjoiRGlzdHJ1IiwianRpIjoiM2E3YmZkZTAtYTI0ZC00YjhjLTkyN2QtZTkyM2I0ODIzODRjIiwibW9iaWxlIjpmYWxzZSwibmJmIjoxNzg2NzA2NDU3LCJwbGF0Zm9ybSI6IkFQSSIsInN1YiI6IlVzZXI6OTg3IiwidHlwIjoiYWNjZXNzIn0.BLtF84VwplLC97g837JPA5ra4EaeMc0RMEInJ8WUJOk
Response
200
content-type: application/json; charset=utf-8
cache-control: max-age=0, private, must-revalidate
b3: d4823628542722c2b72070493051d42f-9f942f078d429e21-0
{
"data": [
{
"batch_number": null,
"custom_data": [],
"deleted_at": null,
"description": null,
"expiration_date": null,
"id": "00000000-0000-0000-0000-00000000009d",
"manufactured_datetime": "2026-08-14T11:20:58.689080Z",
"name": "B538",
"owner_id": "00000000-0000-0000-0000-0000000003de",
"primary_test_result": null,
"product_id": "7a00c15b-f5f1-4afe-837c-203805f5dd22"
},
{
"batch_number": null,
"custom_data": [],
"deleted_at": null,
"description": null,
"expiration_date": null,
"id": "00000000-0000-0000-0000-0000000000a0",
"manufactured_datetime": "2026-08-14T11:20:58.689080Z",
"name": "B549",
"owner_id": "00000000-0000-0000-0000-0000000003e6",
"primary_test_result": null,
"product_id": "454471b9-6fc8-4a76-a945-f32584a9422e"
}
],
"next_page": null
}
Get batches sorted by their creation date and filtered by various attributes.
Note: The page size for this endpoint is 5000 batches per page. This endpoint returns eventually consistent data, with changes taking up to 1 second to propagate in responses.
Required permission: products_permissions_view. Results are filtered to
only include batches the authenticated user can access under their team
restrictions.
Request
GET /public/v1/batches
Parameters
| Parameter | Description | In | Type | Required | Default | Example |
|---|---|---|---|---|---|---|
| batch_ids | Filter batches by batch IDs | query | array | false | ?batch_ids[]=00000000-0000-0000-0000-000000000001&batch_ids[]=00000000-0000-0000-0000-000000000002 | |
| product_id | Filter batches by product ID | query | string | false | ||
| batch_number | Filter batches by batch number | query | string | false | ||
| inserted_datetime | Filter batches by their creation datetime | query | string | false | 2022-07-10T00:00:00Z, | |
| deleted | Filter deleted batches. no returns non-deleted, only returns deleted, include returns both. |
query | string | false | no | |
| page | Pagination information | query | number | false | ?page[number]=1 | |
| updated_datetime | Filter batches by the datetime they were most recently modified | query | string | false | ,2022-07-10T00:00:00Z |
Responses
| Status | Description | Schema |
|---|---|---|
| 200 | A list of batches | Batches |
Company
Get a company
GET /public/v1/companies/:id returns a single company
GET /public/v1/companies/00000000-0000-0000-0000-0000000001d2
content-type: application/json
accept: application/json
authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJhdWQiOiJEaXN0cnUiLCJleHAiOjE4MTgxNTYwNTksImlhdCI6MTc4NjcwNjQ1OSwiaXNzIjoiRGlzdHJ1IiwianRpIjoiOTNmODY3NDEtMDBhZi00Mjc5LTkxYWItOTJiODQ3NGJmZmQ3IiwibW9iaWxlIjpmYWxzZSwibmJmIjoxNzg2NzA2NDU4LCJwbGF0Zm9ybSI6IkFQSSIsInN1YiI6IlVzZXI6MTIyNCIsInR5cCI6ImFjY2VzcyJ9.M8tG2Vr_MHJKwrypBFhIFyuULkvyAkBpZRzvaQcQ67w
Response
200
content-type: application/json; charset=utf-8
cache-control: max-age=0, private, must-revalidate
b3: 10b9a47faa8217dd17ca87d0171cfd54-3dc07ee54745f3b4-0
{
"data": {
"category": "Retailer",
"custom_data": [
{
"id": 44,
"name": "Custom Field 21",
"value": "Custom Value"
}
],
"default_email": "co@example.com",
"default_payment_term": {
"days": 15,
"id": "00000000-0000-0000-0000-000000000006",
"locked": false,
"name": "Net 15",
"time_of_day": "17:00:00"
},
"default_purchase_order_notes": null,
"default_sales_order_notes": null,
"deleted_at": null,
"group": {
"id": "00000000-0000-0000-0000-00000000000e",
"name": "Comp Rel Group 12"
},
"id": "00000000-0000-0000-0000-0000000001d2",
"invoice_email": "inv@example.com",
"legal_business_name": "Legal Co",
"licenses": [
{
"id": "00000000-0000-0000-0000-000000000034",
"license_number": "CDPH-00000053"
}
],
"locations": [
{
"address": "123 Fake Street, Beverly Hills, CA 90210, US",
"company_id": "00000000-0000-0000-0000-0000000003cb",
"id": "00000000-0000-0000-0000-00000000013d",
"license_id": null,
"name": "Place 316"
}
],
"name": "Company 968",
"order_shipment_email": null,
"outstanding_balance": "0",
"outstanding_balance_threshold": null,
"owner": {
"banned": false,
"deleted_at": null,
"email": "owner-1248@example.com",
"full_name": "FirstName2512 LastName2513",
"id": "00000000-0000-0000-0000-0000000004e1",
"role": {
"id": "00000000-0000-0000-0000-000000000513",
"name": "Admin 1298"
}
},
"owner_id": "00000000-0000-0000-0000-0000000004e1",
"phone_number": null,
"purchase_order_email": null,
"relationship_type": {
"id": "00000000-0000-0000-0000-000000000001",
"name": "Supplier"
},
"sales_order_email": "order@example.com",
"updated_datetime": "2026-08-14T11:20:59.441814Z",
"website": null
}
}
Get a single company given the ID.
Required permission: companies_permissions_view.
Request
GET /public/v1/companies/{id}
Parameters
| Parameter | Description | In | Type | Required | Default | Example |
|---|---|---|---|---|---|---|
| id | Company ID | path | string | true |
Responses
| Status | Description | Schema |
|---|---|---|
| 200 | A single company | Company |
| 404 | Not Found |
Get companies
GET /public/companies returns companies related to the company
GET /public/v1/companies
content-type: application/json
accept: application/json
authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJhdWQiOiJEaXN0cnUiLCJleHAiOjE4MTgxNTYwNjAsImlhdCI6MTc4NjcwNjQ2MCwiaXNzIjoiRGlzdHJ1IiwianRpIjoiZmFhMDFhNmEtNDRkYS00MWIzLTk0MmItMWVhMGY3MjcwOWFiIiwibW9iaWxlIjpmYWxzZSwibmJmIjoxNzg2NzA2NDU5LCJwbGF0Zm9ybSI6IkFQSSIsInN1YiI6IlVzZXI6MTU4NCIsInR5cCI6ImFjY2VzcyJ9.kM_oYHu3WthOL6XAMD3YtJqmraOxlNAgBLR8af8Y_gM
Response
200
content-type: application/json; charset=utf-8
cache-control: max-age=0, private, must-revalidate
b3: fbc7fe6d897c88a9920c8c1a41527ac3-497208d19d215c43-0
{
"data": [
{
"category": "Retailer",
"custom_data": [
{
"id": 55,
"name": "Custom Field 30",
"value": "Custom Data 1"
}
],
"default_email": "company-1@example.com",
"default_payment_term": null,
"default_purchase_order_notes": "Default Purchase Order Notes 1",
"default_sales_order_notes": "Default Order External Notes 1",
"deleted_at": null,
"group": {
"id": "00000000-0000-0000-0000-00000000000f",
"name": "Comp Rel Group 13"
},
"id": "00000000-0000-0000-0000-00000000026f",
"invoice_email": "invoice email",
"legal_business_name": "Company Legal Name 1",
"licenses": [],
"locations": [
{
"address": "123 Fake Street, Beverly Hills, CA 90210, US",
"company_id": "00000000-0000-0000-0000-0000000004b2",
"id": "00000000-0000-0000-0000-00000000016e",
"license_id": null,
"name": "Place 365"
}
],
"name": "Company 1199",
"order_shipment_email": "order shipment email",
"outstanding_balance": "0",
"outstanding_balance_threshold": 1000,
"owner": {
"banned": false,
"deleted_at": null,
"email": "owner@example.com",
"full_name": "FirstName3212 LastName3213",
"id": "00000000-0000-0000-0000-000000000634",
"role": {
"id": "00000000-0000-0000-0000-00000000066f",
"name": "Admin 1646"
}
},
"owner_id": "00000000-0000-0000-0000-000000000634",
"phone_number": "1234567890",
"purchase_order_email": "purchase email",
"relationship_type": {
"id": "00000000-0000-0000-0000-000000000002",
"name": "Supplier"
},
"sales_order_email": "order email",
"updated_datetime": "2023-11-03T00:00:00.000000Z",
"website": "https://www.example.com"
},
{
"category": "Other",
"custom_data": [
{
"id": 55,
"name": "Custom Field 30",
"value": null
}
],
"default_email": "company-2804@example.com",
"default_payment_term": null,
"default_purchase_order_notes": null,
"default_sales_order_notes": null,
"deleted_at": null,
"group": null,
"id": "00000000-0000-0000-0000-000000000271",
"invoice_email": null,
"legal_business_name": "Company Legal Name 1204",
"licenses": [
{
"id": "00000000-0000-0000-0000-000000000047",
"license_number": "CDPH-00000072"
}
],
"locations": [],
"name": "Company 1204",
"order_shipment_email": null,
"outstanding_balance": "0",
"outstanding_balance_threshold": null,
"owner": null,
"owner_id": null,
"phone_number": null,
"purchase_order_email": null,
"relationship_type": null,
"sales_order_email": null,
"updated_datetime": "2023-12-02T00:00:00.000000Z",
"website": null
}
],
"next_page": null
}
Get companies sorted by their creation date and filtered by various attributes
Note: The page size for this endpoint is 5000 companies per page. This endpoint returns eventually consistent data, with changes taking up to 1 second to propagate in responses.
Required permission: companies_permissions_view. Results are filtered to
only include companies the authenticated user can access under their team
restrictions.
Request
GET /public/v1/companies
Parameters
| Parameter | Description | In | Type | Required | Default | Example |
|---|---|---|---|---|---|---|
| inserted_datetime | Filter companies by their creation datetime | query | string | false | 2022-07-10T00:00:00Z, | |
| deleted | Filter deleted companies. no returns non-deleted, only returns deleted, include returns both. |
query | string | false | no | |
| page | Pagination information | query | number | false | ?page[number]=1 | |
| updated_datetime | Filter companies by the datetime they were most recently modified | query | string | false | ,2022-07-10T00:00:00Z |
Responses
| Status | Description | Schema |
|---|---|---|
| 200 | A list of companies | Companies |
Upsert a company
POST /public/v1/companies creates a new company relationship with minimal params and returns 201
POST /public/v1/companies
content-type: application/json
accept: application/json
authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJhdWQiOiJEaXN0cnUiLCJleHAiOjE4MTgxNTYwNTgsImlhdCI6MTc4NjcwNjQ1OCwiaXNzIjoiRGlzdHJ1IiwianRpIjoiNGI2Yjc3MzktY2M2OS00NGIyLWIzNDctZmY5ZjAzMDlhMTM1IiwibW9iaWxlIjpmYWxzZSwibmJmIjoxNzg2NzA2NDU3LCJwbGF0Zm9ybSI6IkFQSSIsInN1YiI6IlVzZXI6ODM4IiwidHlwIjoiYWNjZXNzIn0.qCv4vZximY6KZqWnqXwGprayUKZTnkKerrGASbv0ywQ
{
"name": "New Retailer"
}
Response
201
content-type: application/json; charset=utf-8
cache-control: max-age=0, private, must-revalidate
b3: f435331c0d79e1dc1da1f3761ce81287-778797f9d9d17e01-0
{
"data": {
"category": null,
"custom_data": [],
"default_email": null,
"default_payment_term": null,
"default_purchase_order_notes": null,
"default_sales_order_notes": null,
"deleted_at": null,
"group": null,
"id": "00000000-0000-0000-0000-000000000113",
"invoice_email": null,
"legal_business_name": "",
"licenses": [],
"locations": [],
"name": "New Retailer",
"order_shipment_email": null,
"outstanding_balance": null,
"outstanding_balance_threshold": null,
"owner": null,
"owner_id": null,
"phone_number": null,
"purchase_order_email": null,
"relationship_type": null,
"sales_order_email": null,
"updated_datetime": "2026-08-14T11:20:58.265241Z",
"website": null
}
}
POST /public/v1/companies creates a new company relationship with all optional fields and returns 201
POST /public/v1/companies
content-type: application/json
accept: application/json
authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJhdWQiOiJEaXN0cnUiLCJleHAiOjE4MTgxNTYwNjAsImlhdCI6MTc4NjcwNjQ2MCwiaXNzIjoiRGlzdHJ1IiwianRpIjoiODM3NWUxODctYmU4YS00OGFlLTk5NjMtYzA3NmM2Yzc2YmMzIiwibW9iaWxlIjpmYWxzZSwibmJmIjoxNzg2NzA2NDU5LCJwbGF0Zm9ybSI6IkFQSSIsInN1YiI6IlVzZXI6MTczMCIsInR5cCI6ImFjY2VzcyJ9.6kea1adbAmF1gT7uj8hIpohDkxYoIYo4nXA8w3YdPvk
{
"category": "Retail",
"custom_data": {
"58": [
"VIP",
"Wholesale"
]
},
"default_email": "info@fullretailer.com",
"default_payment_term_id": "00000000-0000-0000-0000-000000000007",
"default_purchase_order_notes": "Purchase notes",
"default_sales_order_notes": "Sales notes",
"group_id": "00000000-0000-0000-0000-000000000010",
"invoice_email": "invoice@fullretailer.com",
"legal_business_name": "Full Retailer LLC",
"name": "Full Retailer",
"order_shipment_email": "shipping@fullretailer.com",
"outstanding_balance_threshold": 5000,
"owner_id": "00000000-0000-0000-0000-0000000006c4",
"phone_number": "555-1234",
"purchase_order_email": "purchasing@fullretailer.com",
"relationship_type_id": "00000000-0000-0000-0000-000000000003",
"sales_order_email": "orders@fullretailer.com",
"website": "https://fullretailer.com"
}
Response
201
content-type: application/json; charset=utf-8
cache-control: max-age=0, private, must-revalidate
b3: 02b805cf745cee169907df07fd3b5a69-20170e80da275530-0
{
"data": {
"category": "Retail",
"custom_data": [
{
"id": 58,
"name": "Custom Field 33",
"value": "VIP,Wholesale"
}
],
"default_email": "info@fullretailer.com",
"default_payment_term": {
"days": 30,
"id": "00000000-0000-0000-0000-000000000007",
"locked": false,
"name": "Net 30",
"time_of_day": "17:00:00"
},
"default_purchase_order_notes": "Purchase notes",
"default_sales_order_notes": "Sales notes",
"deleted_at": null,
"group": {
"id": "00000000-0000-0000-0000-000000000010",
"name": "Comp Rel Group 14"
},
"id": "00000000-0000-0000-0000-0000000002ae",
"invoice_email": "invoice@fullretailer.com",
"legal_business_name": "Full Retailer LLC",
"licenses": [],
"locations": [],
"name": "Full Retailer",
"order_shipment_email": "shipping@fullretailer.com",
"outstanding_balance": null,
"outstanding_balance_threshold": 5000,
"owner": {
"banned": false,
"deleted_at": null,
"email": "owner-1725@example.com",
"full_name": "FirstName3502 LastName3503",
"id": "00000000-0000-0000-0000-0000000006c4",
"role": {
"id": "00000000-0000-0000-0000-000000000704",
"name": "Admin 1795"
}
},
"owner_id": "00000000-0000-0000-0000-0000000006c4",
"phone_number": "555-1234",
"purchase_order_email": "purchasing@fullretailer.com",
"relationship_type": {
"id": "00000000-0000-0000-0000-000000000003",
"name": "Supplier"
},
"sales_order_email": "orders@fullretailer.com",
"updated_datetime": "2026-08-14T11:21:00.718263Z",
"website": "https://fullretailer.com"
}
}
POST /public/v1/companies updates an existing company relationship and returns 200
POST /public/v1/companies
content-type: application/json
accept: application/json
authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJhdWQiOiJEaXN0cnUiLCJleHAiOjE4MTgxNTYwNTksImlhdCI6MTc4NjcwNjQ1OSwiaXNzIjoiRGlzdHJ1IiwianRpIjoiMTEwMTc2YzQtNWE0Ni00M2JhLWJkYmMtOGYyNWZkNWYzZjgwIiwibW9iaWxlIjpmYWxzZSwibmJmIjoxNzg2NzA2NDU4LCJwbGF0Zm9ybSI6IkFQSSIsInN1YiI6IlVzZXI6MTQ3OSIsInR5cCI6ImFjY2VzcyJ9.jDjFHuiBvd0cDXaBU1HQBWCv0q7Vd54m_JuL4k5BDJE
{
"id": "00000000-0000-0000-0000-000000000239",
"invoice_email": "newinvoice@example.com",
"name": "Updated Name"
}
Response
200
content-type: application/json; charset=utf-8
cache-control: max-age=0, private, must-revalidate
b3: 4a54f8ee7b67e6b2391d41688a02f25d-0ce818c0bf02f6b8-0
{
"data": {
"category": "Dispensary",
"custom_data": [],
"default_email": "company-2608@example.com",
"default_payment_term": null,
"default_purchase_order_notes": null,
"default_sales_order_notes": null,
"deleted_at": null,
"group": null,
"id": "00000000-0000-0000-0000-000000000239",
"invoice_email": "newinvoice@example.com",
"legal_business_name": "Company Legal Name 1123",
"licenses": [],
"locations": [],
"name": "Updated Name",
"order_shipment_email": null,
"outstanding_balance": "0",
"outstanding_balance_threshold": null,
"owner": {
"banned": false,
"deleted_at": null,
"email": "owner-1486@example.com",
"full_name": "FirstName3004 LastName3005",
"id": "00000000-0000-0000-0000-0000000005d1",
"role": {
"id": "00000000-0000-0000-0000-000000000609",
"name": "Admin 1544"
}
},
"owner_id": "00000000-0000-0000-0000-0000000005d1",
"phone_number": null,
"purchase_order_email": null,
"relationship_type": null,
"sales_order_email": null,
"updated_datetime": "2026-08-14T11:20:59.993519Z",
"website": null
}
}
Upsert a single company. To update an existing company, pass in an existing company ID in the id field. If you do not pass in an ID, a new company and its associated company will be created. Required permission: companies_permissions_create to create a new company, companies_permissions_edit (and access to the company under team restrictions) to update an existing company.
Request
POST /public/v1/companies
Parameters
| Parameter | Description | In | Type | Required | Default | Example |
|---|---|---|---|---|---|---|
| id | Unique ID for this company. If given, the matching record will be updated. If not given, a new company will be created. | query | string | false | ||
| name | Name of the related company | query | string | false | Acme Dispensary | |
| category | Category of the related company | query | string | false | Retailer | |
| legal_business_name | Legal business name of the related company | query | string | false | ||
| default_email | Default email address for the related company | query | string | false | ||
| phone_number | Phone number for the related company | query | string | false | ||
| website | Website URL for the related company | query | string | false | ||
| default_sales_order_notes | Default notes included on sales orders for this company | query | string | false | ||
| default_purchase_order_notes | Default notes included on purchase orders for this company | query | string | false | ||
| invoice_email | Email address for invoices sent to this company | query | string | false | ||
| sales_order_email | Email address for sales orders sent to this company | query | string | false | ||
| purchase_order_email | Email address for purchase orders sent to this company | query | string | false | ||
| order_shipment_email | Email address for order shipment notifications sent to this company | query | string | false | ||
| relationship_type_id | The ID of the relationship type to assign to this company relationship | query | string | false | ||
| group_id | The ID of the group to assign to this company relationship | query | string | false | ||
| owner_id | The ID of the user that owns this company relationship | query | string | false | ||
| default_payment_term_id | The ID of the payment term to apply by default to this company relationship. Use GET /public/v1/payment-terms to look up available payment term IDs. |
query | string | false | ||
| outstanding_balance_threshold | Threshold amount (in cents) above which an outstanding balance warning is triggered | query | integer | false | ||
| custom_data | Custom data for this company relationship | body | object | false |
Responses
| Status | Description | Schema |
|---|---|---|
| 200 | An updated company relationship | Company |
| 201 | A new company relationship | Company |
| 400 | Bad request | |
| 404 | Not found |
CompanyGroup
Delete a company group
DELETE /public/v1/company-groups/:id deletes a company group
DELETE /public/v1/company-groups/00000000-0000-0000-0000-000000000001
content-type: application/json
accept: application/json
authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJhdWQiOiJEaXN0cnUiLCJleHAiOjE4MTgxNTYwNTQsImlhdCI6MTc4NjcwNjQ1NCwiaXNzIjoiRGlzdHJ1IiwianRpIjoiZWVjZDQ2Y2MtODE0Mi00N2QzLWI5MGQtNWQ2ZTg5ZGJlNGVmIiwibW9iaWxlIjpmYWxzZSwibmJmIjoxNzg2NzA2NDUzLCJwbGF0Zm9ybSI6IkFQSSIsInN1YiI6IlVzZXI6MTAiLCJ0eXAiOiJhY2Nlc3MifQ.h0vOUEM07nglAuyuqOSOxIOcwAE18PmwB9qACyr_IbA
Response
204
cache-control: max-age=0, private, must-revalidate
b3: e0591abbada98ba3a0e91013a9568ba9-50657849fa56c588-0
Permanently deletes the company group. This is a hard delete: the record is removed from the database and cannot be recovered.
Required permission: settings_permissions_company_relationship_groups.
Request
DELETE /public/v1/company-groups/{id}
Parameters
| Parameter | Description | In | Type | Required | Default | Example |
|---|---|---|---|---|---|---|
| id | Company group ID | path | string | true |
Responses
| Status | Description | Schema |
|---|---|---|
| 204 | No Content | |
| 404 | Not Found |
Get a company group
GET /public/v1/company-groups/:id returns a single company group
GET /public/v1/company-groups/00000000-0000-0000-0000-000000000008
content-type: application/json
accept: application/json
authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJhdWQiOiJEaXN0cnUiLCJleHAiOjE4MTgxNTYwNTYsImlhdCI6MTc4NjcwNjQ1NiwiaXNzIjoiRGlzdHJ1IiwianRpIjoiZDQ2Mjk3N2UtZWVlYS00ZjQxLWE3ZDYtZmUyYTRkNTE3MDU2IiwibW9iaWxlIjpmYWxzZSwibmJmIjoxNzg2NzA2NDU1LCJwbGF0Zm9ybSI6IkFQSSIsInN1YiI6IlVzZXI6MzIyIiwidHlwIjoiYWNjZXNzIn0.VdAZ362Sgb1Q6U1kWBkC5_B4bpm_MXY-Nxjz5zRub68
Response
200
content-type: application/json; charset=utf-8
cache-control: max-age=0, private, must-revalidate
b3: 1b78d1e315555b01e28af05b672fadda-daaee8fab2d01d85-0
{
"data": {
"id": "00000000-0000-0000-0000-000000000008",
"inserted_datetime": "2026-08-14T11:20:56.464054Z",
"name": "Key Accounts",
"updated_datetime": "2026-08-14T11:20:56.464054Z"
}
}
Get a single company group given the ID.
Required permission: settings_permissions_company_relationship_groups.
Request
GET /public/v1/company-groups/{id}
Parameters
| Parameter | Description | In | Type | Required | Default | Example |
|---|---|---|---|---|---|---|
| id | Company group ID | path | string | true |
Responses
| Status | Description | Schema |
|---|---|---|
| 200 | A single company group | CompanyGroupFull |
| 404 | Not Found |
Get company groups
GET /public/v1/company-groups returns paginated company groups for the company with next_page
GET /public/v1/company-groups
content-type: application/json
accept: application/json
authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJhdWQiOiJEaXN0cnUiLCJleHAiOjE4MTgxNTYwNTYsImlhdCI6MTc4NjcwNjQ1NiwiaXNzIjoiRGlzdHJ1IiwianRpIjoiMTJjOGViODMtZTM2NS00NzFhLWI3ZjUtNjk3MzcyYjg0NjVkIiwibW9iaWxlIjpmYWxzZSwibmJmIjoxNzg2NzA2NDU1LCJwbGF0Zm9ybSI6IkFQSSIsInN1YiI6IlVzZXI6MzYxIiwidHlwIjoiYWNjZXNzIn0.Mag2Vo2O7mgY-pgUohAb0IuQNDB9T8VbN4vKqe-7jnc
Response
200
content-type: application/json; charset=utf-8
cache-control: max-age=0, private, must-revalidate
b3: 8d9360bf29b02a22f7032972f4667fee-474c05211df70573-0
{
"data": [
{
"id": "00000000-0000-0000-0000-000000000009",
"inserted_datetime": "2026-08-14T11:20:56.578723Z",
"name": "CG1",
"updated_datetime": "2026-08-14T11:20:56.578723Z"
},
{
"id": "00000000-0000-0000-0000-00000000000a",
"inserted_datetime": "2026-08-14T11:20:56.579575Z",
"name": "CG2",
"updated_datetime": "2026-08-14T11:20:56.579575Z"
},
{
"id": "00000000-0000-0000-0000-00000000000b",
"inserted_datetime": "2026-08-14T11:20:56.580007Z",
"name": "CG3",
"updated_datetime": "2026-08-14T11:20:56.580007Z"
}
],
"next_page": "https://www.example.com/public/v1/company-groups?page[number]=2"
}
List company groups for the authenticated company.
Required permission: settings_permissions_company_relationship_groups.
Request
GET /public/v1/company-groups
Parameters
| Parameter | Description | In | Type | Required | Default | Example |
|---|---|---|---|---|---|---|
| page | Pagination information | query | number | false | ?page[number]=1 |
Responses
| Status | Description | Schema |
|---|---|---|
| 200 | A list of company groups | CompanyGroups |
Upsert a company group
POST /public/v1/company-groups creates a company group
POST /public/v1/company-groups
content-type: application/json
accept: application/json
authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJhdWQiOiJEaXN0cnUiLCJleHAiOjE4MTgxNTYwNTYsImlhdCI6MTc4NjcwNjQ1NiwiaXNzIjoiRGlzdHJ1IiwianRpIjoiNmY3ZTNjN2EtMjAxZS00MWNhLWI0MjktMTg3YzU0Yzk4MmRiIiwibW9iaWxlIjpmYWxzZSwibmJmIjoxNzg2NzA2NDU1LCJwbGF0Zm9ybSI6IkFQSSIsInN1YiI6IlVzZXI6MjkwIiwidHlwIjoiYWNjZXNzIn0.aJfrjtNB2qCgzWxOkhUNCIolLw-CZceyo4iPKyaZSSw
{
"name": "Key Accounts"
}
Response
201
content-type: application/json; charset=utf-8
cache-control: max-age=0, private, must-revalidate
b3: 6f75ee4c7ffb84b47992561301802f3c-ff4b61bfc60d8b3f-0
{
"data": {
"id": "00000000-0000-0000-0000-000000000007",
"inserted_datetime": "2026-08-14T11:20:56.361514Z",
"name": "Key Accounts",
"updated_datetime": "2026-08-14T11:20:56.361514Z"
}
}
POST /public/v1/company-groups (update) updates a company group
POST /public/v1/company-groups
content-type: application/json
accept: application/json
authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJhdWQiOiJEaXN0cnUiLCJleHAiOjE4MTgxNTYwNTUsImlhdCI6MTc4NjcwNjQ1NSwiaXNzIjoiRGlzdHJ1IiwianRpIjoiYWU0MTM0OWItODFlZC00ZThjLTlmYTUtMTM1MzNiN2Y2MjBlIiwibW9iaWxlIjpmYWxzZSwibmJmIjoxNzg2NzA2NDU0LCJwbGF0Zm9ybSI6IkFQSSIsInN1YiI6IlVzZXI6MTQ3IiwidHlwIjoiYWNjZXNzIn0.DY1Aa2P_DuQnLzXZ5f0AlGzJ7Qdj62Dmz2nS5jYzDcI
{
"id": "00000000-0000-0000-0000-000000000003",
"name": "New"
}
Response
200
content-type: application/json; charset=utf-8
cache-control: max-age=0, private, must-revalidate
b3: d06dd09197530346e6ee6366382bcf4e-f10d7fe68b2996bb-0
{
"data": {
"id": "00000000-0000-0000-0000-000000000003",
"inserted_datetime": "2026-08-14T11:20:55.870050Z",
"name": "New",
"updated_datetime": "2026-08-14T11:20:55.879086Z"
}
}
Upsert a single company group. To update an existing company group, pass its ID in the id
field. If you do not pass an ID, a new company group is created.
Required permission: settings_permissions_company_relationship_groups.
Request
POST /public/v1/company-groups
Parameters
| Parameter | Description | In | Type | Required | Default | Example |
|---|---|---|---|---|---|---|
| id | Company group ID. If given, the matching company group is updated; otherwise a new one is created. | query | string | false | ||
| name | The name of the company group | query | string | true |
Responses
| Status | Description | Schema |
|---|---|---|
| 200 | The updated company group | CompanyGroupFull |
| 201 | The created company group | CompanyGroupFull |
| 400 | Invalid parameters | |
| 404 | Not Found |
Contact
Get a contact
GET /public/v1/contacts/:id returns a single contact
GET /public/v1/contacts/00000000-0000-0000-0000-000000000029
content-type: application/json
accept: application/json
authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJhdWQiOiJEaXN0cnUiLCJleHAiOjE4MTgxNTYwNjEsImlhdCI6MTc4NjcwNjQ2MSwiaXNzIjoiRGlzdHJ1IiwianRpIjoiYmIyY2M3ZjQtNWQ0My00NWQ1LWJlNzctZTYwODMwNmRlZjQ1IiwibW9iaWxlIjpmYWxzZSwibmJmIjoxNzg2NzA2NDYwLCJwbGF0Zm9ybSI6IkFQSSIsInN1YiI6IlVzZXI6MTg2MCIsInR5cCI6ImFjY2VzcyJ9.UN_1dAGXffE0tyuTOr6n92tgFvCJRjsja8YUr79NUVA
Response
200
content-type: application/json; charset=utf-8
cache-control: max-age=0, private, must-revalidate
b3: b7b810cd49c6d6e519aa47839448dff8-8f1ac72e6d2590b1-0
{
"data": {
"company": {
"id": "00000000-0000-0000-0000-0000000002e3"
},
"custom_data": [],
"deleted_at": null,
"description": null,
"driver_license_issuing_state": null,
"driver_license_number": null,
"email": null,
"first_name": "John",
"full_name": "John Doe",
"id": "00000000-0000-0000-0000-000000000029",
"last_name": "Doe",
"owner": {
"banned": false,
"deleted_at": null,
"email": "owner-1856@example.com",
"full_name": "FirstName3768 LastName3769",
"id": "00000000-0000-0000-0000-000000000747",
"role": {
"id": "00000000-0000-0000-0000-000000000786",
"name": "Admin 1925"
}
},
"phone_number": null,
"title": null,
"work_phone_number": null
}
}
Get a single contact given the ID.
Required permission: contacts_permissions_view.
Request
GET /public/v1/contacts/{id}
Parameters
| Parameter | Description | In | Type | Required | Default | Example |
|---|---|---|---|---|---|---|
| id | Contact ID | path | string | true |
Responses
| Status | Description | Schema |
|---|---|---|
| 200 | A single contact | Contact |
| 404 | Not Found |
Get contacts
GET /public/v1/contacts returns contacts related to the company
GET /public/v1/contacts
content-type: application/json
accept: application/json
authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJhdWQiOiJEaXN0cnUiLCJleHAiOjE4MTgxNTYwNjAsImlhdCI6MTc4NjcwNjQ2MCwiaXNzIjoiRGlzdHJ1IiwianRpIjoiODU1ZWJmNDktY2QxMC00MjQ3LWJmZTAtMmIyZmRjM2EyNjZmIiwibW9iaWxlIjpmYWxzZSwibmJmIjoxNzg2NzA2NDU5LCJwbGF0Zm9ybSI6IkFQSSIsInN1YiI6IlVzZXI6MTcwNyIsInR5cCI6ImFjY2VzcyJ9.BRGKOmUAl_M15TEXaGySCyJA7oPPkg0UBAnPIey4CPk
Response
200
content-type: application/json; charset=utf-8
cache-control: max-age=0, private, must-revalidate
b3: 57d1755bb50d6eeba1038987dac84dc2-eb8b1e5a352b7d13-0
{
"data": [
{
"company": {
"id": "00000000-0000-0000-0000-0000000002a4"
},
"custom_data": [
{
"id": 57,
"name": "Custom Field 32",
"value": "Custom Data 1"
}
],
"deleted_at": null,
"description": "Description 1",
"driver_license_issuing_state": "CA",
"driver_license_number": "1234567890",
"email": "email1",
"first_name": "first",
"full_name": "first name1",
"id": "00000000-0000-0000-0000-000000000021",
"last_name": "name1",
"owner": {
"banned": false,
"deleted_at": null,
"email": "contact-owner@example.com",
"full_name": "FirstName3464 LastName3465",
"id": "00000000-0000-0000-0000-0000000006b2",
"role": {
"id": "00000000-0000-0000-0000-0000000006f3",
"name": "Admin 1778"
}
},
"phone_number": "1234567890",
"title": null,
"work_phone_number": "1234567891"
},
{
"company": {
"id": "00000000-0000-0000-0000-0000000002a5"
},
"custom_data": [
{
"id": 57,
"name": "Custom Field 32",
"value": null
}
],
"deleted_at": null,
"description": "Description 2",
"driver_license_issuing_state": "NV",
"driver_license_number": "123456789",
"email": "email2",
"first_name": "first",
"full_name": "first name2",
"id": "00000000-0000-0000-0000-000000000022",
"last_name": "name2",
"owner": {
"banned": false,
"deleted_at": null,
"email": "contact-owner@example.com",
"full_name": "FirstName3464 LastName3465",
"id": "00000000-0000-0000-0000-0000000006b2",
"role": {
"id": "00000000-0000-0000-0000-0000000006f3",
"name": "Admin 1778"
}
},
"phone_number": "1234567890",
"title": null,
"work_phone_number": "1234567892"
}
],
"next_page": null
}
Get contacts sorted by their creation date and filtered by various attributes
Note: The page size for this endpoint is 1000 contacts per page. This endpoint returns eventually consistent data, with changes taking up to 1 second to propagate in responses.
Required permission: contacts_permissions_view. Results are filtered to
only include contacts the authenticated user can access under their team
restrictions.
Request
GET /public/v1/contacts
Parameters
| Parameter | Description | In | Type | Required | Default | Example |
|---|---|---|---|---|---|---|
| inserted_datetime | Filter contacts by their creation datetime | query | string | false | 2022-07-10T00:00:00Z, | |
| deleted | Filter deleted contacts. no returns non-deleted, only returns deleted, include returns both. |
query | string | false | no | |
| page | Pagination information | query | number | false | ?page[number]=1 | |
| updated_datetime | Filter contacts by the datetime they were most recently modified | query | string | false | ,2022-07-10T00:00:00Z |
Responses
| Status | Description | Schema |
|---|---|---|
| 200 | A list of contacts | Contacts |
Upsert a contact
POST /public/v1/contacts creating a contact with all optional fields succeeds with a 201 response containing the new contact
POST /public/v1/contacts
content-type: application/json
accept: application/json
authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJhdWQiOiJEaXN0cnUiLCJleHAiOjE4MTgxNTYwNjEsImlhdCI6MTc4NjcwNjQ2MSwiaXNzIjoiRGlzdHJ1IiwianRpIjoiZWZiZTYwZDEtM2EwMi00MGUzLWEyM2QtM2U3NDJiYzkzZmE0IiwibW9iaWxlIjpmYWxzZSwibmJmIjoxNzg2NzA2NDYwLCJwbGF0Zm9ybSI6IkFQSSIsInN1YiI6IlVzZXI6MTgyMCIsInR5cCI6ImFjY2VzcyJ9.30tiDu-vkA2zRpOUI4QVyRtl9L0BxDCc3dPcIkaFIWA
{
"company_id": "00000000-0000-0000-0000-0000000002d4",
"custom_data": {
"60": [
"VIP",
"Wholesale"
]
},
"description": "Notes",
"driver_license_issuing_state": "CA",
"driver_license_number": "D123",
"email": "jane@example.com",
"first_name": "Jane",
"last_name": "Doe",
"owner_id": "00000000-0000-0000-0000-00000000071f",
"phone_number": "555-1111",
"title": "Buyer",
"work_phone_number": "555-2222"
}
Response
201
content-type: application/json; charset=utf-8
cache-control: max-age=0, private, must-revalidate
b3: a802a2d8774df286a5d7ca182d8fd027-bcc9cbda445cbb2e-0
{
"data": {
"company": {
"id": "00000000-0000-0000-0000-0000000002d4"
},
"custom_data": [
{
"id": 60,
"name": "Custom Field 35",
"value": "VIP,Wholesale"
}
],
"deleted_at": null,
"description": "Notes",
"driver_license_issuing_state": "CA",
"driver_license_number": "D123",
"email": "jane@example.com",
"first_name": "Jane",
"full_name": "Jane Doe",
"id": "00000000-0000-0000-0000-000000000028",
"last_name": "Doe",
"owner": {
"banned": false,
"deleted_at": null,
"email": "owner-1816@example.com",
"full_name": "FirstName3688 LastName3689",
"id": "00000000-0000-0000-0000-00000000071f",
"role": {
"id": "00000000-0000-0000-0000-000000000761",
"name": "Admin 1888"
}
},
"phone_number": "555-1111",
"title": "Buyer",
"work_phone_number": "555-2222"
}
}
Upsert a single contact. To update an existing contact, pass in an existing contact ID in the id field as well as the other fields you want to update. If you do not pass in an ID, a new contact will be created. Required permission: contacts_permissions_create to create a new contact, contacts_permissions_edit (and access to the contact under team restrictions) to update an existing contact.
Request
POST /public/v1/contacts
Parameters
| Parameter | Description | In | Type | Required | Default | Example |
|---|---|---|---|---|---|---|
| id | Unique ID for this contact. If given, the contact matching the ID will be updated. If not given, a new contact will be created. | query | string | false | ||
| first_name | First name for the contact | query | string | true | ||
| last_name | Last name for the contact | query | string | false | ||
| title | Job title for the contact | query | string | false | ||
| Email address for the contact | query | string | false | |||
| phone_number | Phone number for the contact | query | string | false | ||
| work_phone_number | Work phone number for the contact | query | string | false | ||
| description | Description for the contact | query | string | false | ||
| company_id | The ID of the company relationship (company) this contact belongs to | query | string | false | ||
| driver_license_number | Driver license number for shipping manifests | query | string | false | ||
| driver_license_issuing_state | Driver license issuing state for shipping manifests | query | string | false | ||
| owner_id | The ID of the user that owns this contact | query | string | false | ||
| custom_data | The custom data for this contact | body | object | false |
Responses
| Status | Description | Schema |
|---|---|---|
| 200 | An updated contact | Contact |
| 201 | A new contact | Contact |
| 400 | Bad request | |
| 404 | Not found |
CostType
Delete a cost type
DELETE /public/v1/cost-types/:id soft-deletes a cost type
DELETE /public/v1/cost-types/00000000-0000-0000-0000-000000000001
content-type: application/json
accept: application/json
authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJhdWQiOiJEaXN0cnUiLCJleHAiOjE4MTgxNTYwNTQsImlhdCI6MTc4NjcwNjQ1NCwiaXNzIjoiRGlzdHJ1IiwianRpIjoiYzYyN2FiMDQtYjY5ZS00YWYyLTlmODItZDVjODA1ZTViZTA2IiwibW9iaWxlIjpmYWxzZSwibmJmIjoxNzg2NzA2NDUzLCJwbGF0Zm9ybSI6IkFQSSIsInN1YiI6IlVzZXI6MTQiLCJ0eXAiOiJhY2Nlc3MifQ.0yXEN0GDORsojv51JHGCM_s6RvuMPzM5ktADIZk4hLc
Response
204
cache-control: max-age=0, private, must-revalidate
b3: 585929f6292d32af592657aeda59cfca-497fed8abd11d35c-0
Deletes the cost type. This is a soft delete: the record's deleted_at is set and it is no
longer returned by the API, but it is retained in the database.
Required permission: costs_permissions_manage_cost_types.
Request
DELETE /public/v1/cost-types/{id}
Parameters
| Parameter | Description | In | Type | Required | Default | Example |
|---|---|---|---|---|---|---|
| id | Cost type ID | path | string | true |
Responses
| Status | Description | Schema |
|---|---|---|
| 204 | No Content | |
| 404 | Not Found |
Get a cost type
GET /public/v1/cost-types/:id returns a single cost type with a string cost_per_unit and embedded unit_type
GET /public/v1/cost-types/00000000-0000-0000-0000-000000000008
content-type: application/json
accept: application/json
authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJhdWQiOiJEaXN0cnUiLCJleHAiOjE4MTgxNTYwNTYsImlhdCI6MTc4NjcwNjQ1NiwiaXNzIjoiRGlzdHJ1IiwianRpIjoiYmI1MjcyNmItMzkwOC00ODA5LTgzODQtMzU0NjFiMjAyNGY5IiwibW9iaWxlIjpmYWxzZSwibmJmIjoxNzg2NzA2NDU1LCJwbGF0Zm9ybSI6IkFQSSIsInN1YiI6IlVzZXI6MzA0IiwidHlwIjoiYWNjZXNzIn0.5FZk7on6CFIL2Mx10I0w_GNrWQQHA6SR9WxHRrwxhow
Response
200
content-type: application/json; charset=utf-8
cache-control: max-age=0, private, must-revalidate
b3: 817f6b6db5c5975451f9cdb90a480634-961623faeb28a7e3-0
{
"data": {
"active": true,
"allow_inline_edits": true,
"cost_per_unit": "25.5",
"description": null,
"id": "00000000-0000-0000-0000-000000000008",
"inserted_datetime": "2026-08-14T11:20:56.401642Z",
"name": "Freight",
"unit_type": {
"id": "00000000-0000-0000-0000-000000000c9b",
"name": "Unit Type 10"
},
"updated_datetime": "2026-08-14T11:20:56.401642Z"
}
}
Get a single cost type given the ID.
Required permission: costs_permissions_manage_cost_types.
Request
GET /public/v1/cost-types/{id}
Parameters
| Parameter | Description | In | Type | Required | Default | Example |
|---|---|---|---|---|---|---|
| id | Cost type ID | path | string | true |
Responses
| Status | Description | Schema |
|---|---|---|
| 200 | A single cost type | CostType |
| 404 | Not Found |
Get cost types
GET /public/v1/cost-types returns paginated cost types for the company with next_page
GET /public/v1/cost-types
content-type: application/json
accept: application/json
authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJhdWQiOiJEaXN0cnUiLCJleHAiOjE4MTgxNTYwNTYsImlhdCI6MTc4NjcwNjQ1NiwiaXNzIjoiRGlzdHJ1IiwianRpIjoiNjQyNWMzNGYtNjViYS00ODQ4LWI4ZTktNGU3ZGQ1ZmQ0MTEzIiwibW9iaWxlIjpmYWxzZSwibmJmIjoxNzg2NzA2NDU1LCJwbGF0Zm9ybSI6IkFQSSIsInN1YiI6IlVzZXI6MzMzIiwidHlwIjoiYWNjZXNzIn0.1H_MUEQE8RQlsDvKtvYvxZu3Pj7ib7dzrdsIELLclDY
Response
200
content-type: application/json; charset=utf-8
cache-control: max-age=0, private, must-revalidate
b3: 86a3b3c49458ac3902153c961c6fb2f9-92701f1266c3bc74-0
{
"data": [
{
"active": true,
"allow_inline_edits": true,
"cost_per_unit": "1",
"description": null,
"id": "00000000-0000-0000-0000-000000000009",
"inserted_datetime": "2025-01-01T00:00:00.000000Z",
"name": "CT1",
"unit_type": {
"id": "00000000-0000-0000-0000-000000000d68",
"name": "Unit Type 11"
},
"updated_datetime": "2026-08-14T11:20:56.493119Z"
},
{
"active": true,
"allow_inline_edits": true,
"cost_per_unit": "1",
"description": null,
"id": "00000000-0000-0000-0000-00000000000a",
"inserted_datetime": "2025-01-02T00:00:00.000000Z",
"name": "CT2",
"unit_type": {
"id": "00000000-0000-0000-0000-000000000d75",
"name": "Unit Type 12"
},
"updated_datetime": "2026-08-14T11:20:56.495243Z"
},
{
"active": true,
"allow_inline_edits": true,
"cost_per_unit": "1",
"description": null,
"id": "00000000-0000-0000-0000-00000000000b",
"inserted_datetime": "2025-01-03T00:00:00.000000Z",
"name": "CT3",
"unit_type": {
"id": "00000000-0000-0000-0000-000000000d76",
"name": "Unit Type 13"
},
"updated_datetime": "2026-08-14T11:20:56.496597Z"
}
],
"next_page": "https://www.example.com/public/v1/cost-types?page[number]=2"
}
List cost types for the authenticated company.
Required permission: costs_permissions_manage_cost_types.
Request
GET /public/v1/cost-types
Parameters
| Parameter | Description | In | Type | Required | Default | Example |
|---|---|---|---|---|---|---|
| page | Pagination information | query | number | false | ?page[number]=1 |
Responses
| Status | Description | Schema |
|---|---|---|
| 200 | A list of cost types | CostTypes |
Upsert a cost type
POST /public/v1/cost-types creates a cost type
POST /public/v1/cost-types
content-type: application/json
accept: application/json
authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJhdWQiOiJEaXN0cnUiLCJleHAiOjE4MTgxNTYwNTYsImlhdCI6MTc4NjcwNjQ1NiwiaXNzIjoiRGlzdHJ1IiwianRpIjoiODc3MmFhYTEtOGI3OS00YmZhLWFmYTgtYjc3NzFkNDU5NDQ3IiwibW9iaWxlIjpmYWxzZSwibmJmIjoxNzg2NzA2NDU1LCJwbGF0Zm9ybSI6IkFQSSIsInN1YiI6IlVzZXI6MjY1IiwidHlwIjoiYWNjZXNzIn0.lv1vYS3Fo0AFWn-DDKalrj1peDwEc3tKG8htELQPMmQ
{
"active": true,
"allow_inline_edits": true,
"cost_per_unit": "25.5",
"description": "Inbound shipping",
"name": "Freight",
"unit_type_id": "00000000-0000-0000-0000-000000000b62"
}
Response
201
content-type: application/json; charset=utf-8
cache-control: max-age=0, private, must-revalidate
b3: ab848a76827fb4e2ee3388ab2c67cdf8-060e40c3f562fd0b-0
{
"data": {
"active": true,
"allow_inline_edits": true,
"cost_per_unit": "25.5",
"description": "Inbound shipping",
"id": "00000000-0000-0000-0000-000000000007",
"inserted_datetime": "2026-08-14T11:20:56.292624Z",
"name": "Freight",
"unit_type": {
"id": "00000000-0000-0000-0000-000000000b62",
"name": "Unit Type 9"
},
"updated_datetime": "2026-08-14T11:20:56.292624Z"
}
}
POST /public/v1/cost-types (update) updates a cost type
POST /public/v1/cost-types
content-type: application/json
accept: application/json
authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJhdWQiOiJEaXN0cnUiLCJleHAiOjE4MTgxNTYwNTUsImlhdCI6MTc4NjcwNjQ1NSwiaXNzIjoiRGlzdHJ1IiwianRpIjoiYWMzZmNjYjgtMTFhOS00MGIxLTg4ODAtN2M0YjExZGNkM2ExIiwibW9iaWxlIjpmYWxzZSwibmJmIjoxNzg2NzA2NDU0LCJwbGF0Zm9ybSI6IkFQSSIsInN1YiI6IlVzZXI6MTIzIiwidHlwIjoiYWNjZXNzIn0.r-p4oQOLHNKGQ7uHgaUk5Vbn-tuyLxzMxoRUDqS2Kko
{
"cost_per_unit": "30",
"id": "00000000-0000-0000-0000-000000000003",
"name": "New"
}
Response
200
content-type: application/json; charset=utf-8
cache-control: max-age=0, private, must-revalidate
b3: 04a3997176b2ac134d7ac6937dc11a05-b4e3b27b1b8252e7-0
{
"data": {
"active": true,
"allow_inline_edits": true,
"cost_per_unit": "30",
"description": null,
"id": "00000000-0000-0000-0000-000000000003",
"inserted_datetime": "2026-08-14T11:20:55.800518Z",
"name": "New",
"unit_type": {
"id": "00000000-0000-0000-0000-000000000580",
"name": "Unit Type 3"
},
"updated_datetime": "2026-08-14T11:20:55.812852Z"
}
}
Upsert a single cost type. To update an existing cost type, pass its ID in the id field. If
you do not pass an ID, a new cost type is created. When creating, name, cost_per_unit,
unit_type_id and allow_inline_edits are required. The unit type cannot be changed once set.
Required permission: costs_permissions_manage_cost_types.
Request
POST /public/v1/cost-types
Parameters
| Parameter | Description | In | Type | Required | Default | Example |
|---|---|---|---|---|---|---|
| id | Cost type ID. If given, the matching cost type is updated; otherwise a new one is created. | query | string | false | ||
| name | The name of the cost type | query | string | true | ||
| description | A description of the cost type | query | string | false | ||
| cost_per_unit | The cost per unit as a decimal string | query | string | true | ||
| unit_type_id | The ID of the unit type | query | string | true | ||
| active | Whether the cost type is active | query | boolean | false | ||
| allow_inline_edits | Whether inline edits are allowed | query | boolean | true |
Responses
| Status | Description | Schema |
|---|---|---|
| 200 | The updated cost type | CostType |
| 201 | The created cost type | CostType |
| 400 | Invalid parameters | |
| 404 | Not Found |
Credit
Cancel a credit
POST /public/v1/credits/:id/cancel cancels a credit, idempotently, and can delete its credit uses
POST /public/v1/credits/879af9a4-7aec-4c68-8f9d-eab3a2e07aef/cancel
content-type: application/json
accept: application/json
authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJhdWQiOiJEaXN0cnUiLCJleHAiOjE4MTgxNTYwNTgsImlhdCI6MTc4NjcwNjQ1OCwiaXNzIjoiRGlzdHJ1IiwianRpIjoiOThkYzFjMTctOGEyMS00NTM5LThhYzQtM2QzYjVmMGQ2ZTM2IiwibW9iaWxlIjpmYWxzZSwibmJmIjoxNzg2NzA2NDU3LCJwbGF0Zm9ybSI6IkFQSSIsInN1YiI6IlVzZXI6OTMyIiwidHlwIjoiYWNjZXNzIn0.JohfK6YZ_rgJMQXs0AGSJKY_ywUvLaqbb3JdU_uKJj4
Response
200
content-type: application/json; charset=utf-8
cache-control: max-age=0, private, must-revalidate
b3: 00924d32d421b1083d4663bb756581ad-2d2d6c2644231e25-0
{
"data": {
"amount": "100",
"canceled_datetime": "2026-08-14T11:20:58.646561Z",
"company": {
"id": "00000000-0000-0000-0000-00000000013c",
"name": "Company 731",
"updated_datetime": "2026-08-14T11:20:58.611053Z"
},
"credit_number": "CRT-00000023",
"credit_uses": [
{
"amount": "40",
"credit": {
"amount": "100",
"credit_number": "CRT-00000023",
"id": "879af9a4-7aec-4c68-8f9d-eab3a2e07aef",
"source": "USER"
},
"id": "383c4a65-7601-498f-9473-a57cddbc826e",
"payment": null
}
],
"deleted_in_qbo": false,
"external_note": "External note",
"id": "879af9a4-7aec-4c68-8f9d-eab3a2e07aef",
"inserted_datetime": "2026-08-14T11:20:58.620184Z",
"internal_note": "Internal note",
"original_amount": "100",
"owner": null,
"payment": null,
"qb_credit_memo_id": null,
"qb_payment_id": null,
"qb_sync_status": null,
"remaining_balance": "60",
"return": null,
"source": "USER",
"status": "CANCELED",
"updated_datetime": "2026-08-14T11:20:58.646570Z"
}
}
Cancel (void) a credit. A canceled credit keeps its record and history, but its remaining balance can no longer be applied to invoices.
By default the credit's existing applications to invoices are left in place. Set
should_delete_credit_uses to true to also remove those applications, returning the used
amounts to the affected invoices.
Overpayment credits (created from an invoice overpayment or a QuickBooks payment) cannot be canceled — void the associated payment instead. Canceling an already-canceled credit is a no-op that returns the credit unchanged.
Required permission: credits_permissions_edit.
Request
POST /public/v1/credits/{id}/cancel
Parameters
| Parameter | Description | In | Type | Required | Default | Example |
|---|---|---|---|---|---|---|
| id | Credit ID | path | string | true | ||
| cancel | Cancel options | body | CancelCredit | false |
Responses
| Status | Description | Schema |
|---|---|---|
| 200 | The canceled credit | Credit |
| 400 | Bad Request | |
| 403 | Forbidden | |
| 404 | Not Found |
Create or update a credit
POST /public/v1/credits creates a manually-created credit then updates it
POST /public/v1/credits
content-type: application/json
accept: application/json
authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJhdWQiOiJEaXN0cnUiLCJleHAiOjE4MTgxNTYwNTgsImlhdCI6MTc4NjcwNjQ1OCwiaXNzIjoiRGlzdHJ1IiwianRpIjoiNzk5YmY1MWMtYTdkYS00ODNhLTk4MmMtY2FiMTZjMTI0OTNmIiwibW9iaWxlIjpmYWxzZSwibmJmIjoxNzg2NzA2NDU3LCJwbGF0Zm9ybSI6IkFQSSIsInN1YiI6IlVzZXI6ODg0IiwidHlwIjoiYWNjZXNzIn0.0_qTLBd7qQbNQpoZmemNfM3w-9oO9e2dIlXY-CqbiAw
{
"amount": 150,
"company_id": "00000000-0000-0000-0000-000000000126",
"external_note": "ext",
"internal_note": "int"
}
Response
201
content-type: application/json; charset=utf-8
cache-control: max-age=0, private, must-revalidate
b3: 8e53b6fa13e5aba11d3eeaed060c1cea-0d66d8bd53513441-0
{
"data": {
"amount": "150",
"canceled_datetime": null,
"company": {
"id": "00000000-0000-0000-0000-000000000126",
"name": "Company 687",
"updated_datetime": "2026-08-14T11:20:58.410689Z"
},
"credit_number": "CRT-0000001",
"credit_uses": [],
"deleted_in_qbo": false,
"external_note": "ext",
"id": "4f6924d8-1a6a-4ef9-bad2-25e205505ac6",
"inserted_datetime": "2026-08-14T11:20:58.446708Z",
"internal_note": "int",
"original_amount": "150",
"owner": {
"banned": false,
"deleted_at": null,
"email": "owner-884@example.com",
"full_name": "FirstName1780 LastName1781",
"id": "00000000-0000-0000-0000-000000000374",
"role": {
"id": "00000000-0000-0000-0000-00000000038c",
"name": "Admin 907"
}
},
"payment": null,
"qb_credit_memo_id": null,
"qb_payment_id": null,
"qb_sync_status": null,
"remaining_balance": "150",
"return": null,
"source": "USER",
"status": "ACTIVE",
"updated_datetime": "2026-08-14T11:20:58.446708Z"
}
}
Create a new credit or update an existing one.
Omit id to create a new credit; include the id of an existing credit to update it. Only the
fields you send are changed; omitted fields keep their current value.
Credits created through the API are always manually-created (USER source) credits — the same
as a credit you would add by hand in the Distru UI. Only these manually-created credits can be
updated through the API. Credits generated automatically (from a return, an invoice overpayment,
or QuickBooks) cannot be created or modified here.
On update the customer (company_id) cannot be changed. amount must be greater than 0 and, on
update, cannot be set below the amount already used by the credit.
Required permission: credits_permissions_create to create, credits_permissions_edit to update.
Request
POST /public/v1/credits
Parameters
| Parameter | Description | In | Type | Required | Default | Example |
|---|---|---|---|---|---|---|
| credit | Credit data | body | UpsertCredit | true |
Responses
| Status | Description | Schema |
|---|---|---|
| 200 | The updated credit | Credit |
| 201 | The created credit | Credit |
| 400 | Bad Request | |
| 403 | Forbidden | |
| 404 | Not Found |
Delete a credit
DELETE /public/v1/credits/:id soft-deletes a credit
DELETE /public/v1/credits/6c283bcd-ca35-4aef-a4aa-ca9381fb0d27
content-type: application/json
accept: application/json
authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJhdWQiOiJEaXN0cnUiLCJleHAiOjE4MTgxNTYwNTksImlhdCI6MTc4NjcwNjQ1OSwiaXNzIjoiRGlzdHJ1IiwianRpIjoiNjAyNDdmYWEtMGFhZS00YTg1LWFhYzctMzcxMmZmODkxNGJkIiwibW9iaWxlIjpmYWxzZSwibmJmIjoxNzg2NzA2NDU4LCJwbGF0Zm9ybSI6IkFQSSIsInN1YiI6IlVzZXI6MTE3NyIsInR5cCI6ImFjY2VzcyJ9.nhbyktmcDslyJNNZnAt8N4NTSIinWuMi1_dUnK9J9FE
Response
204
cache-control: max-age=0, private, must-revalidate
b3: c26d707d3074149b881a99844f4903f1-deeaf7744a97fa77-0
Soft-delete a credit. The credit is marked as deleted and stops appearing in the API and the Distru UI, but the record is retained rather than being permanently removed.
A credit cannot be deleted once it has been used (applied to an invoice). Overpayment credits (created from an invoice overpayment or a QuickBooks payment) cannot be deleted unless they have already been canceled — void the associated payment instead.
Required permission: credits_permissions_delete.
Request
DELETE /public/v1/credits/{id}
Parameters
| Parameter | Description | In | Type | Required | Default | Example |
|---|---|---|---|---|---|---|
| id | Credit ID | path | string | true |
Responses
| Status | Description | Schema |
|---|---|---|
| 204 | No Content | |
| 400 | Bad Request | |
| 403 | Forbidden | |
| 404 | Not Found |
Get a credit
GET /public/v1/credits/:id returns a single credit with its active credit uses
GET /public/v1/credits/94f3eca5-4d6b-4db9-8e41-28178a32d406
content-type: application/json
accept: application/json
authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJhdWQiOiJEaXN0cnUiLCJleHAiOjE4MTgxNTYwNTcsImlhdCI6MTc4NjcwNjQ1NywiaXNzIjoiRGlzdHJ1IiwianRpIjoiMWY5NjNjYTUtMDZiMi00YWI4LWE1NzQtNWJhNmE4N2NmMGExIiwibW9iaWxlIjpmYWxzZSwibmJmIjoxNzg2NzA2NDU2LCJwbGF0Zm9ybSI6IkFQSSIsInN1YiI6IlVzZXI6NTYxIiwidHlwIjoiYWNjZXNzIn0.yffym_lc32Deo-abd01HOKuF3ciWOOmhNf8OVIJYUrM
Response
200
content-type: application/json; charset=utf-8
cache-control: max-age=0, private, must-revalidate
b3: e82904717432a893a2de4184ebcc72d7-dc81f56292f36555-0
{
"data": {
"amount": "100",
"canceled_datetime": null,
"company": {
"id": "00000000-0000-0000-0000-0000000000a3",
"name": "Company 456",
"updated_datetime": "2026-08-14T11:20:57.351205Z"
},
"credit_number": "CRT-00000009",
"credit_uses": [
{
"amount": "25",
"credit": {
"amount": "100",
"credit_number": "CRT-00000009",
"id": "94f3eca5-4d6b-4db9-8e41-28178a32d406",
"source": "USER"
},
"id": "2beafc6b-f46f-42d0-ad08-ba285851a093",
"payment": {
"amount": "10",
"company": {
"id": "00000000-0000-0000-0000-000000000099",
"name": "Company 445",
"updated_datetime": "2026-08-14T11:20:57.296437Z"
},
"credit_uses": [
{
"amount": "25",
"credit": {
"amount": "100",
"credit_number": "CRT-00000009",
"id": "94f3eca5-4d6b-4db9-8e41-28178a32d406",
"source": "USER"
},
"id": "2beafc6b-f46f-42d0-ad08-ba285851a093"
}
],
"description": null,
"fully_paid_with_credits": false,
"id": "00000000-0000-0000-0000-000000000012",
"inserted_datetime": "2026-08-14T11:20:57.319263Z",
"invoice": {
"id": "00000000-0000-0000-0000-000000000015",
"invoice_number": "Invoice #20",
"status": "NOT_PAID",
"total": "32.00"
},
"overpayment_credits": [],
"payment_date": "2026-08-14T11:20:57.317708Z",
"payment_method": {
"deleted_at": null,
"id": "00000000-0000-0000-0000-00000000001c",
"name": "Payment Method 27"
},
"payment_number": "Payment #17",
"payment_type": "INVOICE",
"purchase": null,
"quickbooks_deposit_account_id": null,
"status": "POSTED",
"updated_datetime": "2026-08-14T11:20:57.319263Z"
}
}
],
"deleted_in_qbo": false,
"external_note": "External note",
"id": "94f3eca5-4d6b-4db9-8e41-28178a32d406",
"inserted_datetime": "2026-08-14T11:20:57.358824Z",
"internal_note": "Internal note",
"original_amount": "150",
"owner": null,
"payment": null,
"qb_credit_memo_id": null,
"qb_payment_id": null,
"qb_sync_status": null,
"remaining_balance": "75",
"return": null,
"source": "USER",
"status": "ACTIVE",
"updated_datetime": "2026-08-14T11:20:57.360660Z"
}
}
Get a single credit given the ID.
Required permission: credits_permissions_view.
Request
GET /public/v1/credits/{id}
Parameters
| Parameter | Description | In | Type | Required | Default | Example |
|---|---|---|---|---|---|---|
| id | Credit ID | path | string | true |
Responses
| Status | Description | Schema |
|---|---|---|
| 200 | A single credit | Credit |
| 404 | Not Found |
Get credits
GET /public/v1/credits returns credits for the company with status and remaining balance
GET /public/v1/credits
content-type: application/json
accept: application/json
authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJhdWQiOiJEaXN0cnUiLCJleHAiOjE4MTgxNTYwNjAsImlhdCI6MTc4NjcwNjQ2MCwiaXNzIjoiRGlzdHJ1IiwianRpIjoiYTBlYjQyYWEtZGI4NC00OGZiLTkzMzktYWVlYmIyZDVkYmJmIiwibW9iaWxlIjpmYWxzZSwibmJmIjoxNzg2NzA2NDU5LCJwbGF0Zm9ybSI6IkFQSSIsInN1YiI6IlVzZXI6MTYzNiIsInR5cCI6ImFjY2VzcyJ9._IsqFHcbMjkATReoBjcDvwMHXxSKTycyphOo_grcL_8
Response
200
content-type: application/json; charset=utf-8
cache-control: max-age=0, private, must-revalidate
b3: ec50a41f5de98541f2832025f500f884-69301106add9f8fa-0
{
"data": [
{
"amount": "100",
"canceled_datetime": null,
"company": {
"id": "00000000-0000-0000-0000-000000000283",
"name": "Company 1236",
"updated_datetime": "2026-08-14T11:21:00.420076Z"
},
"credit_number": "CRT-A",
"credit_uses": [
{
"amount": "40",
"credit": {
"amount": "100",
"credit_number": "CRT-A",
"id": "e6ba0553-f4fb-4eb1-9915-3b17e4b0c93c",
"source": "USER"
},
"id": "9a8e8720-1ec9-4c5a-aca4-936986d3ddd6",
"payment": null
}
],
"deleted_in_qbo": false,
"external_note": "ext",
"id": "e6ba0553-f4fb-4eb1-9915-3b17e4b0c93c",
"inserted_datetime": "2026-08-14T11:21:00.434236Z",
"internal_note": "int",
"original_amount": "150",
"owner": null,
"payment": null,
"qb_credit_memo_id": null,
"qb_payment_id": null,
"qb_sync_status": null,
"remaining_balance": "60",
"return": null,
"source": "USER",
"status": "ACTIVE",
"updated_datetime": "2026-08-14T11:21:00.436729Z"
}
],
"next_page": null
}
Get credits sorted by their creation date and filtered by various attributes.
Note: The page size for this endpoint is 1000 credits per page. This endpoint returns eventually consistent data, with changes taking up to 1 second to propagate in responses.
Required permission: credits_permissions_view.
Request
GET /public/v1/credits
Parameters
| Parameter | Description | In | Type | Required | Default | Example |
|---|---|---|---|---|---|---|
| credit_number | Filter credits whose credit number contains this value | query | string | false | ||
| inserted_datetime | Filter credits by their creation datetime | query | string | false | 2022-07-10T00:00:00Z, | |
| page | Pagination information | query | number | false | ?page[number]=1 | |
| source | Filter credits by how they were created | query | string | false | ||
| status | Filter credits by their status | query | string | false | ||
| updated_datetime | Filter credits by the datetime they were most recently modified | query | string | false | ,2022-07-10T00:00:00Z |
Responses
| Status | Description | Schema |
|---|---|---|
| 200 | A list of credits | Credits |
CustomField
Create a custom field
POST /public/v1/custom-fields can create a custom field of type text
POST /public/v1/custom-fields
content-type: application/json
accept: application/json
authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJhdWQiOiJEaXN0cnUiLCJleHAiOjE4MTgxNTYwNTQsImlhdCI6MTc4NjcwNjQ1NCwiaXNzIjoiRGlzdHJ1IiwianRpIjoiN2RhNGJjM2QtYzUwMi00N2MyLWE3YjEtMGE4Yjg4ZjMzMDgyIiwibW9iaWxlIjpmYWxzZSwibmJmIjoxNzg2NzA2NDUzLCJwbGF0Zm9ybSI6IkFQSSIsInN1YiI6IlVzZXI6OCIsInR5cCI6ImFjY2VzcyJ9.ND50ZeLP18xikvdW5tQExtsdQVd1mnHfLArOqHXzTCM
{
"description": "Notes",
"field_type": "text",
"filterable": false,
"name": "Text Field",
"parent_object": "product"
}
Response
201
content-type: application/json; charset=utf-8
cache-control: max-age=0, private, must-revalidate
b3: f8f4f22a83cc601dfa71e1200f29b59c-c6ef33d09e29660b-0
{
"data": {
"description": "Notes",
"field_options": [],
"field_type": "text",
"filterable": false,
"id": 1,
"name": "Text Field",
"parent_object": "product",
"required": false
}
}
POST /public/v1/custom-fields can create a custom field of type date
POST /public/v1/custom-fields
content-type: application/json
accept: application/json
authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJhdWQiOiJEaXN0cnUiLCJleHAiOjE4MTgxNTYwNTYsImlhdCI6MTc4NjcwNjQ1NiwiaXNzIjoiRGlzdHJ1IiwianRpIjoiODJhYTM1NzgtYTMyYi00MTgyLTk1NTctMTQ4YzNmYWY2NzBhIiwibW9iaWxlIjpmYWxzZSwibmJmIjoxNzg2NzA2NDU1LCJwbGF0Zm9ybSI6IkFQSSIsInN1YiI6IlVzZXI6MjEzIiwidHlwIjoiYWNjZXNzIn0.ZOU_rk0Y7AcXIFK-efMh-C-4Hw1jjr-sb_QZIKi_xfw
{
"field_type": "date",
"name": "Date Field",
"parent_object": "product"
}
Response
201
content-type: application/json; charset=utf-8
cache-control: max-age=0, private, must-revalidate
b3: 6047da008f0cc6adb5411b81da6dce77-aec20087d96175ab-0
{
"data": {
"description": null,
"field_options": [],
"field_type": "date",
"filterable": false,
"id": 4,
"name": "Date Field",
"parent_object": "product",
"required": false
}
}
POST /public/v1/custom-fields can create a custom field of type dropdown
POST /public/v1/custom-fields
content-type: application/json
accept: application/json
authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJhdWQiOiJEaXN0cnUiLCJleHAiOjE4MTgxNTYwNTYsImlhdCI6MTc4NjcwNjQ1NiwiaXNzIjoiRGlzdHJ1IiwianRpIjoiZGFhZDAyYjgtMjIxNy00YmZkLTk5OGQtNTg2NjM1MDY0Y2NiIiwibW9iaWxlIjpmYWxzZSwibmJmIjoxNzg2NzA2NDU1LCJwbGF0Zm9ybSI6IkFQSSIsInN1YiI6IlVzZXI6MjM0IiwidHlwIjoiYWNjZXNzIn0.B225uzEj6K4YkaRv-7oFgKmqZJmcHLs8JqhIMDN96QQ
{
"field_options": [
"A",
"B"
],
"field_type": "dropdown",
"filterable": true,
"name": "Dropdown Field",
"parent_object": "product"
}
Response
201
content-type: application/json; charset=utf-8
cache-control: max-age=0, private, must-revalidate
b3: d097c9c7c5ca5088c7e5894da0d868ab-9e07e50eadc5ae4c-0
{
"data": {
"description": null,
"field_options": [
"A",
"B"
],
"field_type": "dropdown",
"filterable": true,
"id": 5,
"name": "Dropdown Field",
"parent_object": "product",
"required": false
}
}
POST /public/v1/custom-fields can create a custom field of type checkbox
POST /public/v1/custom-fields
content-type: application/json
accept: application/json
authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJhdWQiOiJEaXN0cnUiLCJleHAiOjE4MTgxNTYwNTgsImlhdCI6MTc4NjcwNjQ1OCwiaXNzIjoiRGlzdHJ1IiwianRpIjoiODM4NmQ3OTEtNTBhMi00ZmRkLTg1ZjgtYzhiM2JiNmQzZWI2IiwibW9iaWxlIjpmYWxzZSwibmJmIjoxNzg2NzA2NDU3LCJwbGF0Zm9ybSI6IkFQSSIsInN1YiI6IlVzZXI6MTAxNiIsInR5cCI6ImFjY2VzcyJ9._iK5-AwPqrvMXlsxewSsjvP8R4zqPofoSY80UzMBOlM
{
"field_options": [
"Option 1"
],
"field_type": "checkbox",
"filterable": true,
"name": "Checkbox Field",
"parent_object": "product"
}
Response
201
content-type: application/json; charset=utf-8
cache-control: max-age=0, private, must-revalidate
b3: ddad73f749e2df614efb90effc91ec3f-1404623bc35a6379-0
{
"data": {
"description": null,
"field_options": [
"Option 1"
],
"field_type": "checkbox",
"filterable": true,
"id": 36,
"name": "Checkbox Field",
"parent_object": "product",
"required": false
}
}
Create a custom field for the specified parent object. Updates are not supported for this endpoint.
Required permission: settings_permissions_custom_fields.
Request
POST /public/v1/custom-fields
Parameters
| Parameter | Description | In | Type | Required | Default | Example |
|---|---|---|---|---|---|---|
| name | Name of the custom field | query | string | true | ||
| description | Description of the custom field | query | string | false | ||
| parent_object | Parent object attached to the field | query | string | true | ||
| field_type | Field type | query | string | true | ||
| filterable | Whether the field is filterable | query | boolean | false | ||
| required | Whether a value for the field is required when saving a record | query | boolean | false | ||
| field_options | Field options | query | array | false |
Responses
| Status | Description | Schema |
|---|---|---|
| 201 | Custom field created | CustomFieldDefinition |
| 400 | Invalid parameters |
Get a custom field definition
GET /public/v1/custom-fields/:id returns a single custom field
GET /public/v1/custom-fields/32
content-type: application/json
accept: application/json
authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJhdWQiOiJEaXN0cnUiLCJleHAiOjE4MTgxNTYwNTgsImlhdCI6MTc4NjcwNjQ1OCwiaXNzIjoiRGlzdHJ1IiwianRpIjoiNDhhZjgyMmMtMzRmZC00NDIxLWFlMjctOWJjMGI1MjAwY2ZiIiwibW9iaWxlIjpmYWxzZSwibmJmIjoxNzg2NzA2NDU3LCJwbGF0Zm9ybSI6IkFQSSIsInN1YiI6IlVzZXI6OTE4IiwidHlwIjoiYWNjZXNzIn0.Q6IbHMuRf05DrE-ovspfbRt3_SQwmxtVTkXQfkTBPUM
Response
200
content-type: application/json; charset=utf-8
cache-control: max-age=0, private, must-revalidate
b3: f1133a1ae9128601363c4cd81ddea219-d7355ee83c503973-0
{
"data": {
"description": "A test field",
"field_options": [
"A",
"B",
"C"
],
"field_type": "dropdown",
"filterable": true,
"id": 32,
"name": "Test Field",
"parent_object": "product",
"required": false
}
}
Get a single custom field definition given the ID.
Required permission: settings_permissions_custom_fields.
Request
GET /public/v1/custom-fields/{id}
Parameters
| Parameter | Description | In | Type | Required | Default | Example |
|---|---|---|---|---|---|---|
| id | Custom field ID | path | integer | true |
Responses
| Status | Description | Schema |
|---|---|---|
| 200 | A single custom field definition | CustomFieldDefinition |
| 404 | Not Found |
List custom field definitions
GET /public/v1/custom-fields returns custom fields for the company
GET /public/v1/custom-fields
content-type: application/json
accept: application/json
authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJhdWQiOiJEaXN0cnUiLCJleHAiOjE4MTgxNTYwNTksImlhdCI6MTc4NjcwNjQ1OSwiaXNzIjoiRGlzdHJ1IiwianRpIjoiZTlhYjZhM2MtNGJlZi00YWM0LWIwZGUtMzBkNDM3NmIxZTU2IiwibW9iaWxlIjpmYWxzZSwibmJmIjoxNzg2NzA2NDU4LCJwbGF0Zm9ybSI6IkFQSSIsInN1YiI6IlVzZXI6MTA5OSIsInR5cCI6ImFjY2VzcyJ9.WB3QQosMkyALdW8xvq5y3eY2Sy0DQ-cKumsFVy5QEV0
Response
200
content-type: application/json; charset=utf-8
cache-control: max-age=0, private, must-revalidate
b3: 64f9d42d67b68d7229081cc1e04dc8a0-21f7af08c7347473-0
{
"data": [
{
"description": null,
"field_options": [],
"field_type": "text",
"filterable": false,
"id": 38,
"name": "Field 1",
"parent_object": "product",
"required": false
},
{
"description": null,
"field_options": [
"A",
"B"
],
"field_type": "dropdown",
"filterable": true,
"id": 39,
"name": "Field 2",
"parent_object": "product",
"required": false
}
]
}
List all custom field definitions for the authenticated company. Optionally filter by parent_object to get fields for a specific entity type.
Required permission: settings_permissions_custom_fields.
Request
GET /public/v1/custom-fields
Parameters
| Parameter | Description | In | Type | Required | Default | Example |
|---|---|---|---|---|---|---|
| parent_object | Filter by parent object type (e.g., order, invoice, product) | query | string | false |
Responses
| Status | Description | Schema |
|---|---|---|
| 200 | List of custom field definitions | CustomFieldDefinitions |
Update a custom field
POST /public/v1/custom-fields/:id can update a custom field name
POST /public/v1/custom-fields/35
content-type: application/json
accept: application/json
authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJhdWQiOiJEaXN0cnUiLCJleHAiOjE4MTgxNTYwNTgsImlhdCI6MTc4NjcwNjQ1OCwiaXNzIjoiRGlzdHJ1IiwianRpIjoiZDhkNzZmNDItN2JmYi00MGUyLThhMDEtOWM2OWM5ZTYxZGVhIiwibW9iaWxlIjpmYWxzZSwibmJmIjoxNzg2NzA2NDU3LCJwbGF0Zm9ybSI6IkFQSSIsInN1YiI6IlVzZXI6OTk1IiwidHlwIjoiYWNjZXNzIn0.vCQzZFlioNWd9m__gqSrTF4K0gr3N0W-Jnr_3B5Ij7A
{
"name": "Updated Name"
}
Response
200
content-type: application/json; charset=utf-8
cache-control: max-age=0, private, must-revalidate
b3: 4d62f6dcb332e7157a86725d1463e4d3-6eecf2bdcddb0822-0
{
"data": {
"description": null,
"field_options": [],
"field_type": "text",
"filterable": false,
"id": 35,
"name": "Updated Name",
"parent_object": "product",
"required": false
}
}
Update an existing custom field. Only name, description, required, and field_options can be updated. Field type and parent object cannot be changed after creation.
Required permission: settings_permissions_custom_fields.
Request
POST /public/v1/custom-fields/{id}
Parameters
| Parameter | Description | In | Type | Required | Default | Example |
|---|---|---|---|---|---|---|
| id | Custom field ID | path | integer | true | ||
| name | Name of the custom field | body | string | false | ||
| description | Description of the custom field | body | string | false | ||
| required | Whether a value for the field is required when saving a record | body | boolean | false | ||
| field_options | Field options (replaces existing options) | body | array | false |
Responses
| Status | Description | Schema |
|---|---|---|
| 200 | Custom field updated | CustomFieldDefinition |
| 400 | Invalid parameters | |
| 404 | Not Found |
Driver
Delete a driver
DELETE /public/v1/drivers/:id soft-deletes a driver
DELETE /public/v1/drivers/00000000-0000-0000-0000-00000000000e
content-type: application/json
accept: application/json
authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJhdWQiOiJEaXN0cnUiLCJleHAiOjE4MTgxNTYwNTcsImlhdCI6MTc4NjcwNjQ1NywiaXNzIjoiRGlzdHJ1IiwianRpIjoiZDBkYzAzMGUtYTYwOS00ZDM3LWJhZTYtN2JmMjFjMmM5MjE2IiwibW9iaWxlIjpmYWxzZSwibmJmIjoxNzg2NzA2NDU2LCJwbGF0Zm9ybSI6IkFQSSIsInN1YiI6IlVzZXI6NjgyIiwidHlwIjoiYWNjZXNzIn0.wP_afZ_wTr49sGMQwvL6BDEAbcxQunh0AV20dNagO7M
Response
204
cache-control: max-age=0, private, must-revalidate
b3: d6abf65add2f41fc3575fdc7e5ee61d0-b31e7fe6bfaeb8cc-0
Deletes the driver. This is a soft delete: the record's deleted_at is set and it is no longer
returned by the API, but it is retained in the database.
Required permission: settings_permissions_drivers.
Request
DELETE /public/v1/drivers/{id}
Parameters
| Parameter | Description | In | Type | Required | Default | Example |
|---|---|---|---|---|---|---|
| id | Driver ID | path | string | true |
Responses
| Status | Description | Schema |
|---|---|---|
| 204 | No Content | |
| 404 | Not Found |
Get a driver
GET /public/v1/drivers/:id returns a single driver
GET /public/v1/drivers/00000000-0000-0000-0000-000000000007
content-type: application/json
accept: application/json
authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJhdWQiOiJEaXN0cnUiLCJleHAiOjE4MTgxNTYwNTcsImlhdCI6MTc4NjcwNjQ1NywiaXNzIjoiRGlzdHJ1IiwianRpIjoiZjE1ZDc1NDYtMWM1My00MGM1LTg3NTEtMWE2ZmM3OTgxZmEyIiwibW9iaWxlIjpmYWxzZSwibmJmIjoxNzg2NzA2NDU2LCJwbGF0Zm9ybSI6IkFQSSIsInN1YiI6IlVzZXI6NTQwIiwidHlwIjoiYWNjZXNzIn0.B94OdC8iQJw7Nn1_FIncE7BTAuNareb1thiR-3uYvgU
Response
200
content-type: application/json; charset=utf-8
cache-control: max-age=0, private, must-revalidate
b3: 5039edb0d5fe5f2de1759c82972809ba-c169cfe25a2600df-0
{
"data": {
"birth_date": "1990-01-01",
"driver_license": "D1234567",
"email": "test@example.com",
"first_name": "Sam",
"hire_date": "2020-01-01",
"id": "00000000-0000-0000-0000-000000000007",
"inserted_datetime": "2026-08-14T11:20:57.240301Z",
"last_name": "Rivera",
"occupational_license_number": null,
"phone_number": null,
"updated_datetime": "2026-08-14T11:20:57.240301Z",
"us_state": "CA"
}
}
Get a single driver given the ID.
Required permission: settings_permissions_drivers.
Request
GET /public/v1/drivers/{id}
Parameters
| Parameter | Description | In | Type | Required | Default | Example |
|---|---|---|---|---|---|---|
| id | Driver ID | path | string | true |
Responses
| Status | Description | Schema |
|---|---|---|
| 200 | A single driver | Driver |
| 404 | Not Found |
Get drivers
GET /public/v1/drivers returns paginated drivers for the company with next_page
GET /public/v1/drivers
content-type: application/json
accept: application/json
authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJhdWQiOiJEaXN0cnUiLCJleHAiOjE4MTgxNTYwNTcsImlhdCI6MTc4NjcwNjQ1NywiaXNzIjoiRGlzdHJ1IiwianRpIjoiMjkxOTY2NzctMTQ5My00OTI0LTgwNTItNjY0MGI3MzJlZTkyIiwibW9iaWxlIjpmYWxzZSwibmJmIjoxNzg2NzA2NDU2LCJwbGF0Zm9ybSI6IkFQSSIsInN1YiI6IlVzZXI6NjExIiwidHlwIjoiYWNjZXNzIn0.5wXNDwQFOPh2mPTRuSjK63m2u_KAuye_7xJ9NLprdPc
Response
200
content-type: application/json; charset=utf-8
cache-control: max-age=0, private, must-revalidate
b3: 19c0fe1f719e56f703cdc25033b11dc1-b8f4d79dbee31db6-0
{
"data": [
{
"birth_date": "1990-01-01",
"driver_license": "D1234567",
"email": "d1@example.com",
"first_name": "Test",
"hire_date": "2020-01-01",
"id": "00000000-0000-0000-0000-000000000008",
"inserted_datetime": "2025-01-01T00:00:00.000000Z",
"last_name": "Driver",
"occupational_license_number": null,
"phone_number": null,
"updated_datetime": "2026-08-14T11:20:57.442655Z",
"us_state": "CA"
},
{
"birth_date": "1990-01-01",
"driver_license": "D1234567",
"email": "d2@example.com",
"first_name": "Test",
"hire_date": "2020-01-01",
"id": "00000000-0000-0000-0000-000000000009",
"inserted_datetime": "2025-01-02T00:00:00.000000Z",
"last_name": "Driver",
"occupational_license_number": null,
"phone_number": null,
"updated_datetime": "2026-08-14T11:20:57.449244Z",
"us_state": "CA"
},
{
"birth_date": "1990-01-01",
"driver_license": "D1234567",
"email": "d3@example.com",
"first_name": "Test",
"hire_date": "2020-01-01",
"id": "00000000-0000-0000-0000-00000000000a",
"inserted_datetime": "2025-01-03T00:00:00.000000Z",
"last_name": "Driver",
"occupational_license_number": null,
"phone_number": null,
"updated_datetime": "2026-08-14T11:20:57.456792Z",
"us_state": "CA"
}
],
"next_page": "https://www.example.com/public/v1/drivers?page[number]=2"
}
List drivers for the authenticated company.
Required permission: settings_permissions_drivers.
Request
GET /public/v1/drivers
Parameters
| Parameter | Description | In | Type | Required | Default | Example |
|---|---|---|---|---|---|---|
| page | Pagination information | query | number | false | ?page[number]=1 |
Responses
| Status | Description | Schema |
|---|---|---|
| 200 | A list of drivers | Drivers |
Upsert a driver
POST /public/v1/drivers creates a driver for a METRC company
POST /public/v1/drivers
content-type: application/json
accept: application/json
authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJhdWQiOiJEaXN0cnUiLCJleHAiOjE4MTgxNTYwNTcsImlhdCI6MTc4NjcwNjQ1NywiaXNzIjoiRGlzdHJ1IiwianRpIjoiMmZiYmZkZDEtYzRlYy00NDNkLWIxY2ItYzg3NjQ3ODQwMThiIiwibW9iaWxlIjpmYWxzZSwibmJmIjoxNzg2NzA2NDU2LCJwbGF0Zm9ybSI6IkFQSSIsInN1YiI6IlVzZXI6NTA3IiwidHlwIjoiYWNjZXNzIn0.n8YiGA7LzCBeLijCxfREpdtJ-Vrjwxzmw74Vk81U4ac
{
"driver_license": "D1234567",
"first_name": "Sam",
"last_name": "Rivera",
"occupational_license_number": "OCC-889",
"phone_number": "555-0100"
}
Response
201
content-type: application/json; charset=utf-8
cache-control: max-age=0, private, must-revalidate
b3: ec7c075a72201336fbd4269435221b16-6cea76824355d901-0
{
"data": {
"birth_date": null,
"driver_license": "D1234567",
"email": null,
"first_name": "Sam",
"hire_date": null,
"id": "00000000-0000-0000-0000-000000000006",
"inserted_datetime": "2026-08-14T11:20:57.079398Z",
"last_name": "Rivera",
"occupational_license_number": "OCC-889",
"phone_number": "555-0100",
"updated_datetime": "2026-08-14T11:20:57.079398Z",
"us_state": null
}
}
POST /public/v1/drivers (update) updates a driver, omitting a create-required field keeps its stored value
POST /public/v1/drivers
content-type: application/json
accept: application/json
authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJhdWQiOiJEaXN0cnUiLCJleHAiOjE4MTgxNTYwNTYsImlhdCI6MTc4NjcwNjQ1NiwiaXNzIjoiRGlzdHJ1IiwianRpIjoiNjRlMTVmYzgtOTI3ZC00NjMxLThjZWEtZWIyNjM1NDcyNjRhIiwibW9iaWxlIjpmYWxzZSwibmJmIjoxNzg2NzA2NDU1LCJwbGF0Zm9ybSI6IkFQSSIsInN1YiI6IlVzZXI6NDE2IiwidHlwIjoiYWNjZXNzIn0.sCw5rfvqsfZMbO6pcZxqlAgj5RCToKwaMMv3tPRxdkM
{
"first_name": "New",
"id": "00000000-0000-0000-0000-000000000005"
}
Response
200
content-type: application/json; charset=utf-8
cache-control: max-age=0, private, must-revalidate
b3: 3f70b5b4bb93c53a0d8973716d319b60-bbe6494626b332a4-0
{
"data": {
"birth_date": "1990-01-01",
"driver_license": "D1234567",
"email": "test@example.com",
"first_name": "New",
"hire_date": "2020-01-01",
"id": "00000000-0000-0000-0000-000000000005",
"inserted_datetime": "2026-08-14T11:20:56.766891Z",
"last_name": "Driver",
"occupational_license_number": "OCC-889",
"phone_number": "555-0100",
"updated_datetime": "2026-08-14T11:20:56.778577Z",
"us_state": "CA"
}
}
Upsert a single driver. To update an existing driver, pass its ID in the id field. If you do
not pass an ID, a new driver is created.
Driver management is only available for companies with a METRC or BIOTRACK compliance type. Requests from companies with any other compliance type are rejected.
Required fields depend on the company's compliance type and apply only when CREATING a driver.
On update (when an id is given) all fields are optional and only the fields you send
are changed; omitted fields keep their stored value.
- METRC: first_name, last_name, phone_number, driver_license,
occupational_license_number.
- BIOTRACK: first_name, last_name, birth_date, email, driver_license, us_state,
hire_date.
Required permission: settings_permissions_drivers.
Request
POST /public/v1/drivers
Parameters
| Parameter | Description | In | Type | Required | Default | Example |
|---|---|---|---|---|---|---|
| id | Driver ID. If given, the matching driver is updated; otherwise a new one is created. | query | string | false | ||
| first_name | The driver's first name (required when creating a driver) | query | string | false | ||
| last_name | The driver's last name (required when creating a driver) | query | string | false | ||
| The driver's email (required when creating a driver for BIOTRACK companies) | query | string | false | |||
| phone_number | The driver's phone number (required when creating a driver for METRC companies) | query | string | false | ||
| driver_license | The driver's license number (required when creating a driver) | query | string | false | ||
| us_state | The driver's US state (required when creating a driver for BIOTRACK companies) | query | string | false | ||
| birth_date | The driver's birth date, ISO-8601 (required when creating a driver for BIOTRACK companies) | query | string | false | ||
| hire_date | The driver's hire date, ISO-8601 (required when creating a driver for BIOTRACK companies) | query | string | false | ||
| occupational_license_number | The driver's occupational license number (required when creating a driver for METRC companies) | query | string | false |
Responses
| Status | Description | Schema |
|---|---|---|
| 200 | The updated driver | Driver |
| 201 | The created driver | Driver |
| 400 | Invalid parameters | |
| 404 | Not Found |
FileAttachment
Insert a file attachment
POST /public/v1/file-attachments uploads and creates a file attachment successfully with simplified reference
POST /public/v1/file-attachments
content-type: application/json
accept: application/json
authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJhdWQiOiJEaXN0cnUiLCJleHAiOjE4MTgxNTYwNTgsImlhdCI6MTc4NjcwNjQ1OCwiaXNzIjoiRGlzdHJ1IiwianRpIjoiODYyNjU0ZmMtMjdjNC00MjhhLTk2ODktNzQ1MzU4NmZiMDAwIiwibW9iaWxlIjpmYWxzZSwibmJmIjoxNzg2NzA2NDU3LCJwbGF0Zm9ybSI6IkFQSSIsInN1YiI6IlVzZXI6OTU0IiwidHlwIjoiYWNjZXNzIn0.wEcUEx40osA32Cyg1uRzARTXDqf8Kd5DzelGx-H6XmA
{
"file": {
"filename": "test-image.png",
"content_type": "image/png"
},
"name": "My Test Image",
"product_id": "4702ddeb-4f4e-431e-8443-ef08e0d99f9a"
}
Response
201
content-type: application/json; charset=utf-8
cache-control: max-age=0, private, must-revalidate
b3: 10bbfed4018996953c7b7f10fa04695d-25d786156c94795c-0
{
"data": {
"assembly_id": null,
"batch_id": null,
"company_relationship_id": null,
"contact_id": null,
"id": "00000000-0000-0000-0000-00000000001a",
"invoice_id": null,
"license_id": null,
"mime_type": "image/png",
"name": "My Test Image",
"order_id": null,
"order_shipment_id": null,
"product_id": "4702ddeb-4f4e-431e-8443-ef08e0d99f9a",
"purchase_id": null,
"request_id": null,
"return_id": null,
"size_in_bytes": 355974,
"stock_transfer_id": null,
"task_id": null,
"upload_datetime": "2026-08-14T11:20:58.664856Z",
"uploader": {
"id": "00000000-0000-0000-0000-0000000003ba",
"name": "FirstName1920 LastName1921"
},
"url": "/var/folders/2z/jg98hkm57rx18c_x3bnqbr8c0000gn/T/5cb1b3f7-c22e-4478-910a-70e4fd77cf3a/test-image.png"
}
}
Insert a new file attachment. The file will be uploaded to S3 and associated with the specified entity. Exactly one reference ID must be provided (product_id, order_id, purchase_id, etc.).
Required permission: products_permissions_edit.
Request
POST /public/v1/file-attachments
Parameters
| Parameter | Description | In | Type | Required | Default | Example |
|---|---|---|---|---|---|---|
| file | The file to upload | formData | file | true | ||
| name | Display name for the attachment (defaults to filename if not provided) | formData | string | false | ||
| product_id | Product ID to attach file to | formData | string | false | 550e8400-e29b-41d4-a716-446655440000 | |
| order_id | Order ID to attach file to | formData | string | false | 550e8400-e29b-41d4-a716-446655440000 | |
| purchase_id | Purchase ID to attach file to | formData | string | false | 550e8400-e29b-41d4-a716-446655440000 | |
| invoice_id | Invoice ID to attach file to | formData | string | false | 550e8400-e29b-41d4-a716-446655440000 | |
| batch_id | Batch ID to attach file to | formData | string | false | 550e8400-e29b-41d4-a716-446655440000 | |
| contact_id | Contact ID to attach file to | formData | string | false | 550e8400-e29b-41d4-a716-446655440000 | |
| company_relationship_id | Company relationship ID to attach file to | formData | string | false | 550e8400-e29b-41d4-a716-446655440000 | |
| request_id | Request ID to attach file to | formData | string | false | 550e8400-e29b-41d4-a716-446655440000 | |
| task_id | Task ID to attach file to | formData | string | false | 550e8400-e29b-41d4-a716-446655440000 | |
| stock_transfer_id | Stock transfer ID to attach file to | formData | string | false | 550e8400-e29b-41d4-a716-446655440000 | |
| assembly_id | Assembly ID to attach file to | formData | string | false | 550e8400-e29b-41d4-a716-446655440000 | |
| return_id | Return ID to attach file to | formData | string | false | 550e8400-e29b-41d4-a716-446655440000 | |
| order_shipment_id | Order shipment ID to attach file to | formData | string | false | 550e8400-e29b-41d4-a716-446655440000 | |
| license_id | License ID to attach file to | formData | string | false | 550e8400-e29b-41d4-a716-446655440000 |
Responses
| Status | Description | Schema |
|---|---|---|
| 201 | File attachment inserted successfully | FileAttachment |
| 400 | Invalid parameters | |
| 422 | Storage quota exceeded or other validation error |
Inventory
Get inventory levels
GET /public/v1/inventory returns stock quantities filtered by product IDs
GET /public/v1/inventory?grouping[]=PRODUCT&product_ids[]=719620e0-5a62-478b-b372-6161c6bc7758
content-type: application/json
accept: application/json
authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJhdWQiOiJEaXN0cnUiLCJleHAiOjE4MTgxNTYwNjUsImlhdCI6MTc4NjcwNjQ2NSwiaXNzIjoiRGlzdHJ1IiwianRpIjoiOTdhZTc2ZmItZTViZC00MjU3LThiOGItNTllZGJmYWY2NzhjIiwibW9iaWxlIjpmYWxzZSwibmJmIjoxNzg2NzA2NDY0LCJwbGF0Zm9ybSI6IkFQSSIsInN1YiI6IlVzZXI6Mjc1MSIsInR5cCI6ImFjY2VzcyJ9.IP0JLDKyD9Py8zN2UcSpNbyZ2FunSWix9Jl0fT_dhtA
Response
200
content-type: application/json; charset=utf-8
cache-control: max-age=0, private, must-revalidate
b3: 1d4e8648ce1a3ccce5f6fb35fa166f91-e1ecb4f799eacda1-0
{
"data": [
{
"active": "10.000000000",
"available": "10.000000000",
"cost_default_per_unit": null,
"cost_per_unit_actual": null,
"product_id": "719620e0-5a62-478b-b372-6161c6bc7758",
"reserved": "0.000000000",
"total_cost_actual": null,
"total_cost_default": null,
"updated_datetime": "2026-08-14T11:21:05.633188Z"
}
],
"next_page": null
}
GET /public/v1/inventory returns stock quantities and costs grouped by product
GET /public/v1/inventory?grouping[]=PRODUCT
content-type: application/json
accept: application/json
authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJhdWQiOiJEaXN0cnUiLCJleHAiOjE4MTgxNTYwNjIsImlhdCI6MTc4NjcwNjQ2MiwiaXNzIjoiRGlzdHJ1IiwianRpIjoiYTUyZDk5NDQtYjJjZC00MzZjLWE5NTktY2UwNjFhZWI0ZGRkIiwibW9iaWxlIjpmYWxzZSwibmJmIjoxNzg2NzA2NDYxLCJwbGF0Zm9ybSI6IkFQSSIsInN1YiI6IlVzZXI6MjI1MiIsInR5cCI6ImFjY2VzcyJ9.xuPqV3gZRRS0OzD3792NZNPTSnccX5KstgUgZSLpWoo
Response
200
content-type: application/json; charset=utf-8
cache-control: max-age=0, private, must-revalidate
b3: 12d39e776a22149e88f6b9cc034f3843-dfd007763c9924c0-0
{
"data": [
{
"active": "95.000000000",
"available": "80.000000000",
"cost_default_per_unit": null,
"cost_per_unit_actual": null,
"product_id": "5c02ca79-2abf-4abf-b2dc-68e66c2e795a",
"reserved": "15.000000000",
"total_cost_actual": null,
"total_cost_default": null,
"updated_datetime": "2026-08-14T11:21:03.352877Z"
},
{
"active": "50.000000000",
"available": "50.000000000",
"cost_default_per_unit": null,
"cost_per_unit_actual": null,
"product_id": "7aca68f4-a010-4ffb-96ce-ca137244fcbc",
"reserved": "0.000000000",
"total_cost_actual": null,
"total_cost_default": null,
"updated_datetime": "2026-08-14T11:21:03.273050Z"
},
{
"active": "100.000000000",
"available": "90.000000000",
"cost_default_per_unit": "2.06",
"cost_per_unit_actual": "0.03",
"product_id": "9a72281e-1df4-4f4e-b0af-b72e6036c32c",
"reserved": "10.000000000",
"total_cost_actual": "3",
"total_cost_default": "206",
"updated_datetime": "2026-08-14T11:21:03.352002Z"
}
],
"next_page": null
}
GET /public/v1/inventory returns stock quantities and costs grouped by product & location
GET /public/v1/inventory?grouping[]=PRODUCT&grouping[]=LOCATION
content-type: application/json
accept: application/json
authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJhdWQiOiJEaXN0cnUiLCJleHAiOjE4MTgxNTYwNjQsImlhdCI6MTc4NjcwNjQ2NCwiaXNzIjoiRGlzdHJ1IiwianRpIjoiY2JlNTE1N2QtNDA4ZS00ODkwLTg3NDktOGYwZjZiNWVlMTA4IiwibW9iaWxlIjpmYWxzZSwibmJmIjoxNzg2NzA2NDYzLCJwbGF0Zm9ybSI6IkFQSSIsInN1YiI6IlVzZXI6MjQ5MCIsInR5cCI6ImFjY2VzcyJ9.pxtqZ4-ac9WriXJt2GBxBJchSarECXLRPZZVEwtebWk
Response
200
content-type: application/json; charset=utf-8
cache-control: max-age=0, private, must-revalidate
b3: af30cce4be5849071186e6ef95fd7285-ea0ebc6603e9bf60-0
{
"data": [
{
"active": "0.000000000",
"available": "-15.000000000",
"cost_default_per_unit": null,
"cost_per_unit_actual": null,
"location_id": "00000000-0000-0000-0000-000000000234",
"product_id": "033ccf26-74bb-49d9-a89d-c73e4c0d0b1f",
"reserved": "15.000000000",
"total_cost_actual": null,
"total_cost_default": null,
"updated_datetime": "2026-08-14T11:21:04.769661Z"
},
{
"active": "0.000000000",
"available": "-8.000000000",
"cost_default_per_unit": null,
"cost_per_unit_actual": null,
"location_id": "00000000-0000-0000-0000-000000000235",
"product_id": "033ccf26-74bb-49d9-a89d-c73e4c0d0b1f",
"reserved": "8.000000000",
"total_cost_actual": null,
"total_cost_default": null,
"updated_datetime": "2026-08-14T11:21:04.770387Z"
},
{
"active": "190.000000000",
"available": "169.000000000",
"cost_default_per_unit": "1",
"cost_per_unit_actual": "0.5",
"location_id": "00000000-0000-0000-0000-00000000023e",
"product_id": "033ccf26-74bb-49d9-a89d-c73e4c0d0b1f",
"reserved": "21.000000000",
"total_cost_actual": "95",
"total_cost_default": "190",
"updated_datetime": "2026-08-14T11:21:04.771028Z"
},
{
"active": "80.000000000",
"available": "80.000000000",
"cost_default_per_unit": null,
"cost_per_unit_actual": null,
"location_id": "00000000-0000-0000-0000-00000000023f",
"product_id": "033ccf26-74bb-49d9-a89d-c73e4c0d0b1f",
"reserved": "0.000000000",
"total_cost_actual": null,
"total_cost_default": null,
"updated_datetime": "2026-08-14T11:21:04.713873Z"
},
{
"active": "0.000000000",
"available": "-1.000000000",
"cost_default_per_unit": null,
"cost_per_unit_actual": null,
"location_id": null,
"product_id": "033ccf26-74bb-49d9-a89d-c73e4c0d0b1f",
"reserved": "1.000000000",
"total_cost_actual": null,
"total_cost_default": null,
"updated_datetime": "2026-08-14T11:21:04.774675Z"
},
{
"active": "100.000000000",
"available": "90.000000000",
"cost_default_per_unit": null,
"cost_per_unit_actual": null,
"location_id": "00000000-0000-0000-0000-000000000234",
"product_id": "2d3467d1-6b53-4b47-8045-1164b894192c",
"reserved": "10.000000000",
"total_cost_actual": null,
"total_cost_default": null,
"updated_datetime": "2026-08-14T11:21:04.767778Z"
},
{
"active": "0.000000000",
"available": "-1.000000000",
"cost_default_per_unit": null,
"cost_per_unit_actual": null,
"location_id": "00000000-0000-0000-0000-000000000235",
"product_id": "2d3467d1-6b53-4b47-8045-1164b894192c",
"reserved": "1.000000000",
"total_cost_actual": null,
"total_cost_default": null,
"updated_datetime": "2026-08-14T11:21:04.768896Z"
},
{
"active": "100.000000000",
"available": "100.000000000",
"cost_default_per_unit": null,
"cost_per_unit_actual": null,
"location_id": "00000000-0000-0000-0000-000000000235",
"product_id": "9d147ba7-6525-4f18-9e54-e452b92dd890",
"reserved": "0.000000000",
"total_cost_actual": null,
"total_cost_default": null,
"updated_datetime": "2026-08-14T11:21:04.512726Z"
},
{
"active": "30.000000000",
"available": "26.000000000",
"cost_default_per_unit": null,
"cost_per_unit_actual": null,
"location_id": null,
"product_id": "9d147ba7-6525-4f18-9e54-e452b92dd890",
"reserved": "4.000000000",
"total_cost_actual": null,
"total_cost_default": null,
"updated_datetime": "2026-08-14T11:21:04.773571Z"
}
],
"next_page": null
}
GET /public/v1/inventory returns stock quantities and costs grouped by product & batch number
GET /public/v1/inventory?grouping[]=PRODUCT&grouping[]=BATCH_NUMBER
content-type: application/json
accept: application/json
authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJhdWQiOiJEaXN0cnUiLCJleHAiOjE4MTgxNTYwNTcsImlhdCI6MTc4NjcwNjQ1NywiaXNzIjoiRGlzdHJ1IiwianRpIjoiOWNmMWU0MjMtOWVhNC00NjVhLWEzZTItZDMzZDI5ODZiYzk2IiwibW9iaWxlIjpmYWxzZSwibmJmIjoxNzg2NzA2NDU2LCJwbGF0Zm9ybSI6IkFQSSIsInN1YiI6IlVzZXI6NjczIiwidHlwIjoiYWNjZXNzIn0.cIIaCDiC9eOhZMVVHBr3dEr9ExpwH7Na56CGnDgeNmU
Response
200
content-type: application/json; charset=utf-8
cache-control: max-age=0, private, must-revalidate
b3: 37f3c56ed856b7a7e673e2154e549408-2bf4a446022d186b-0
{
"data": [
{
"active": "8.000000000",
"available": "8.000000000",
"batch_number": "TEST-1",
"cost_default_per_unit": null,
"cost_per_unit_actual": null,
"product_id": "2bf117a6-c0e1-4026-acee-663f917bf457",
"reserved": "0.000000000",
"total_cost_actual": null,
"total_cost_default": null,
"updated_datetime": "2026-08-14T11:20:58.283069Z"
},
{
"active": "26.000000000",
"available": "26.000000000",
"batch_number": null,
"cost_default_per_unit": null,
"cost_per_unit_actual": null,
"product_id": "9df0dcc4-cc79-4554-9e2b-41b09f232f1c",
"reserved": "0.000000000",
"total_cost_actual": null,
"total_cost_default": null,
"updated_datetime": "2026-08-14T11:20:58.884291Z"
},
{
"active": "27.000000000",
"available": "27.000000000",
"batch_number": "1",
"cost_default_per_unit": null,
"cost_per_unit_actual": null,
"product_id": "9df0dcc4-cc79-4554-9e2b-41b09f232f1c",
"reserved": "0.000000000",
"total_cost_actual": null,
"total_cost_default": null,
"updated_datetime": "2026-08-14T11:20:58.978088Z"
},
{
"active": "19.000000000",
"available": "19.000000000",
"batch_number": null,
"cost_default_per_unit": "2",
"cost_per_unit_actual": "1",
"product_id": "b4e649da-bbf8-4ac4-90ac-00a891b42203",
"reserved": "0.000000000",
"total_cost_actual": "19",
"total_cost_default": "38",
"updated_datetime": "2026-08-14T11:20:58.071030Z"
},
{
"active": "13.000000000",
"available": "13.000000000",
"batch_number": "TEST-1",
"cost_default_per_unit": null,
"cost_per_unit_actual": null,
"product_id": "b4e649da-bbf8-4ac4-90ac-00a891b42203",
"reserved": "0.000000000",
"total_cost_actual": null,
"total_cost_default": null,
"updated_datetime": "2026-08-14T11:20:58.212656Z"
},
{
"active": "43.000000000",
"available": "43.000000000",
"batch_number": null,
"cost_default_per_unit": null,
"cost_per_unit_actual": null,
"product_id": "e86c47cc-e899-4f64-b950-7afe0a9c9b91",
"reserved": "0.000000000",
"total_cost_actual": null,
"total_cost_default": null,
"updated_datetime": "2026-08-14T11:20:58.501409Z"
},
{
"active": "47.000000000",
"available": "47.000000000",
"batch_number": "1",
"cost_default_per_unit": null,
"cost_per_unit_actual": null,
"product_id": "e86c47cc-e899-4f64-b950-7afe0a9c9b91",
"reserved": "0.000000000",
"total_cost_actual": null,
"total_cost_default": null,
"updated_datetime": "2026-08-14T11:20:58.655185Z"
},
{
"active": "25.000000000",
"available": "25.000000000",
"batch_number": "2",
"cost_default_per_unit": null,
"cost_per_unit_actual": null,
"product_id": "e86c47cc-e899-4f64-b950-7afe0a9c9b91",
"reserved": "0.000000000",
"total_cost_actual": null,
"total_cost_default": null,
"updated_datetime": "2026-08-14T11:20:58.736047Z"
}
],
"next_page": null
}
GET /public/v1/inventory returns stock quantities grouped by product & location & batch number
GET /public/v1/inventory?grouping[]=PRODUCT&grouping[]=LOCATION&grouping[]=BATCH_NUMBER
content-type: application/json
accept: application/json
authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJhdWQiOiJEaXN0cnUiLCJleHAiOjE4MTgxNTYwNjMsImlhdCI6MTc4NjcwNjQ2MywiaXNzIjoiRGlzdHJ1IiwianRpIjoiMTdlN2MzNTAtMjQ3OS00MjdhLWJiMmMtOGZkMTdiODlkMmUyIiwibW9iaWxlIjpmYWxzZSwibmJmIjoxNzg2NzA2NDYyLCJwbGF0Zm9ybSI6IkFQSSIsInN1YiI6IlVzZXI6MjM3NiIsInR5cCI6ImFjY2VzcyJ9.YSSUWoQI-MD09AacGwbsuS1Pa3KVcOwPf5-CYE_wPXk
Response
200
content-type: application/json; charset=utf-8
cache-control: max-age=0, private, must-revalidate
b3: 6584896e92f254fd96163e40c54ceef4-878e3f601ebe5697-0
{
"data": [
{
"active": "41.000000000",
"available": "41.000000000",
"batch_number": null,
"cost_default_per_unit": null,
"cost_per_unit_actual": null,
"location_id": "00000000-0000-0000-0000-000000000215",
"product_id": "3c8104f0-20db-4411-938a-411bb598676f",
"reserved": "0.000000000",
"total_cost_actual": null,
"total_cost_default": null,
"updated_datetime": "2026-08-14T11:21:04.139490Z"
},
{
"active": "49.000000000",
"available": "49.000000000",
"batch_number": "TEST-1",
"cost_default_per_unit": null,
"cost_per_unit_actual": null,
"location_id": "00000000-0000-0000-0000-000000000215",
"product_id": "3c8104f0-20db-4411-938a-411bb598676f",
"reserved": "0.000000000",
"total_cost_actual": null,
"total_cost_default": null,
"updated_datetime": "2026-08-14T11:21:04.301346Z"
},
{
"active": "45.000000000",
"available": "45.000000000",
"batch_number": null,
"cost_default_per_unit": null,
"cost_per_unit_actual": null,
"location_id": "00000000-0000-0000-0000-000000000216",
"product_id": "3c8104f0-20db-4411-938a-411bb598676f",
"reserved": "0.000000000",
"total_cost_actual": null,
"total_cost_default": null,
"updated_datetime": "2026-08-14T11:21:04.222879Z"
},
{
"active": "53.000000000",
"available": "53.000000000",
"batch_number": "TEST-1",
"cost_default_per_unit": null,
"cost_per_unit_actual": null,
"location_id": "00000000-0000-0000-0000-000000000216",
"product_id": "3c8104f0-20db-4411-938a-411bb598676f",
"reserved": "0.000000000",
"total_cost_actual": null,
"total_cost_default": null,
"updated_datetime": "2026-08-14T11:21:04.365595Z"
},
{
"active": "21.000000000",
"available": "21.000000000",
"batch_number": null,
"cost_default_per_unit": null,
"cost_per_unit_actual": null,
"location_id": "00000000-0000-0000-0000-000000000215",
"product_id": "5aaffe7a-aad7-45e0-bbee-340ba8c786ca",
"reserved": "0.000000000",
"total_cost_actual": null,
"total_cost_default": null,
"updated_datetime": "2026-08-14T11:21:03.941739Z"
},
{
"active": "29.000000000",
"available": "29.000000000",
"batch_number": "TEST-1",
"cost_default_per_unit": null,
"cost_per_unit_actual": null,
"location_id": "00000000-0000-0000-0000-000000000215",
"product_id": "5aaffe7a-aad7-45e0-bbee-340ba8c786ca",
"reserved": "0.000000000",
"total_cost_actual": null,
"total_cost_default": null,
"updated_datetime": "2026-08-14T11:21:04.012660Z"
},
{
"active": "25.000000000",
"available": "25.000000000",
"batch_number": null,
"cost_default_per_unit": null,
"cost_per_unit_actual": null,
"location_id": "00000000-0000-0000-0000-000000000216",
"product_id": "5aaffe7a-aad7-45e0-bbee-340ba8c786ca",
"reserved": "0.000000000",
"total_cost_actual": null,
"total_cost_default": null,
"updated_datetime": "2026-08-14T11:21:03.979334Z"
},
{
"active": "33.000000000",
"available": "33.000000000",
"batch_number": "TEST-1",
"cost_default_per_unit": null,
"cost_per_unit_actual": null,
"location_id": "00000000-0000-0000-0000-000000000216",
"product_id": "5aaffe7a-aad7-45e0-bbee-340ba8c786ca",
"reserved": "0.000000000",
"total_cost_actual": null,
"total_cost_default": null,
"updated_datetime": "2026-08-14T11:21:04.043082Z"
}
],
"next_page": null
}
Get active and available quantities grouped by a specified list of attributes. Groups with 0 active and 0 available quantity won't be returned. Groups are sorted by the IDs of the attributes they are grouped by. Note: The page size for this endpoint is 5000 groups per page. This endpoint returns eventually consistent data, with changes taking up to 1 second to propagate in responses.
Required permission: products_permissions_view.
Request
GET /public/v1/inventory
Parameters
| Parameter | Description | In | Type | Required | Default | Example |
|---|---|---|---|---|---|---|
| grouping | Attributes to group inventory by. PRODUCT is required to be in the list. Accepted values are "BATCH_NUMBER", "LOCATION" and "PRODUCT". | query | array | true | ["PRODUCT","LOCATION"] | |
| page | Pagination information | query | number | false | ?page[number]=1 | |
| product_ids | Filter inventory levels by product IDs | query | array | false | ["67ae9080-8dc2-4ab7-9704-19673f4d9f21","213c7080-8dc2-4ab7-9704-19673f4d9f22"] | |
| location_ids | Filter inventory levels by location IDs | query | array | false | ["00000000-0000-0000-0000-000000000001","00000000-0000-0000-0000-000000000002"] | |
| batch_ids | Filter inventory levels by batch IDs | query | array | false | ["00000000-0000-0000-0000-000000000101","00000000-0000-0000-0000-000000000102"] |
Responses
| Status | Description | Schema |
|---|---|---|
| 200 | A list of active and available quantity for each group | Inventories |
Invoice
Get an invoice
GET /invoices/:id returns the expected invoice
GET /public/v1/invoices/00000000-0000-0000-0000-000000000025
content-type: application/json
accept: application/json
authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJhdWQiOiJEaXN0cnUiLCJleHAiOjE4MTgxNTYwNjEsImlhdCI6MTc4NjcwNjQ2MSwiaXNzIjoiRGlzdHJ1IiwianRpIjoiM2QyNmQxZmUtNDg1Yi00ZDgyLWI3MTEtMmI1MjgzZWY1OTY5IiwibW9iaWxlIjpmYWxzZSwibmJmIjoxNzg2NzA2NDYwLCJwbGF0Zm9ybSI6IkFQSSIsInN1YiI6IlVzZXI6MTkyNCIsInR5cCI6ImFjY2VzcyJ9.NizKnFrl4_E7H-tY_Y7VoohKpnNGBHgA0P6NNK-bb8A
Response
200
content-type: application/json; charset=utf-8
cache-control: max-age=0, private, must-revalidate
b3: 070761954c02970b4853878c3dc78394-7b36970386a880a8-0
{
"data": {
"billing_location": {
"address": "123 Fake Street, Beverly Hills, CA 90210, US",
"company_id": "00000000-0000-0000-0000-000000000598",
"id": "00000000-0000-0000-0000-0000000001ad",
"license_id": "00000000-0000-0000-0000-000000000053",
"license_number": "CDPH-00000084",
"name": "Place 427"
},
"charges": [],
"company": {
"id": "00000000-0000-0000-0000-000000000303",
"name": "Company 1428",
"updated_datetime": "2026-08-14T11:21:01.494539Z"
},
"creator": {
"banned": false,
"deleted_at": null,
"email": "owner-1919@example.com",
"full_name": "FirstName3904 LastName3905",
"id": "00000000-0000-0000-0000-000000000787",
"role": {
"id": "00000000-0000-0000-0000-0000000007c8",
"name": "Admin 1991"
}
},
"custom_data": [
{
"id": 63,
"name": "Custom Field 38",
"value": "Custom Field Value 1"
}
],
"due_datetime": "2026-08-14T11:21:01.594849Z",
"external_notes": null,
"id": "00000000-0000-0000-0000-000000000025",
"inserted_datetime": "2026-08-14T11:21:01.595375Z",
"internal_notes": null,
"invoice_datetime": "2026-08-14T11:21:01.594849Z",
"invoice_number": "Invoice #35",
"items": [
{
"batch": {
"batch_number": null,
"id": "00000000-0000-0000-0000-0000000001ba",
"name": "B1357"
},
"cost_per_unit": null,
"cost_per_unit_default": null,
"id": "00000000-0000-0000-0000-000000000012",
"order_item_id": "58b0f719-88e1-4465-9ad1-7b52bf126739",
"package": null,
"price": "10.000000000",
"product": {
"id": "1b4323c2-b142-445b-950f-bb13ea936475",
"name": "Product 1355",
"sku": "sku 1356",
"updated_datetime": "2026-08-14T11:21:01.509300Z"
},
"quantity": "10.000000000",
"returned_quantity": "0",
"total_cost_actual": null,
"total_cost_default": null
},
{
"batch": {
"batch_number": null,
"id": "00000000-0000-0000-0000-0000000001bc",
"name": "B1363"
},
"cost_per_unit": null,
"cost_per_unit_default": null,
"id": "00000000-0000-0000-0000-000000000013",
"order_item_id": "de512cce-eba5-48cc-9d57-a0d4af32150b",
"package": null,
"price": "10.000000000",
"product": {
"id": "ef6f61aa-54ba-4949-9ad1-c86cea15c48c",
"name": "Product 1361",
"sku": "sku 1362",
"updated_datetime": "2026-08-14T11:21:01.525046Z"
},
"quantity": "10.000000000",
"returned_quantity": "0",
"total_cost_actual": null,
"total_cost_default": null
}
],
"order": {
"id": "ec7b90e9-0c01-4797-8189-17eea98ae652",
"order_number": "SO-74",
"status": "PENDING",
"total": "320.00"
},
"owner": {
"banned": false,
"deleted_at": null,
"email": "owner-1919@example.com",
"full_name": "FirstName3904 LastName3905",
"id": "00000000-0000-0000-0000-000000000787",
"role": {
"id": "00000000-0000-0000-0000-0000000007c8",
"name": "Admin 1991"
}
},
"paid_amount": "0.0",
"payments": [],
"remaining_amount": null,
"status": "NOT_PAID",
"total": "200.00",
"updated_datetime": "2026-08-14T11:21:01.595375Z"
}
}
Get a single invoice given the ID. Required permission: invoices_permissions_view. The authenticated user must also have access to the requested invoice under their team restrictions.
Request
GET /public/v1/invoices/{id}
Parameters
| Parameter | Description | In | Type | Required | Default | Example |
|---|---|---|---|---|---|---|
| id | Unique ID for an invoice | path | string | true |
Responses
| Status | Description | Schema |
|---|---|---|
| 200 | An invoice | Invoice |
Get invoices
GET /invoices/ returns invoices related to the access token's company
GET /public/v1/invoices
content-type: application/json
accept: application/json
authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJhdWQiOiJEaXN0cnUiLCJleHAiOjE4MTgxNTYwNjUsImlhdCI6MTc4NjcwNjQ2NSwiaXNzIjoiRGlzdHJ1IiwianRpIjoiZTc2NWVjZWEtOTk3YS00MWYyLWJiZjAtNGRhODE5ODQxOGQyIiwibW9iaWxlIjpmYWxzZSwibmJmIjoxNzg2NzA2NDY0LCJwbGF0Zm9ybSI6IkFQSSIsInN1YiI6IlVzZXI6Mjc2MiIsInR5cCI6ImFjY2VzcyJ9.fJzs3cM_ZSCt6W3dXpWUYr9lt5vCrEvWkEun6BvEII0
Response
200
content-type: application/json; charset=utf-8
cache-control: max-age=0, private, must-revalidate
b3: f4f92b9027661435a817e9b8fdb9659f-03130aef53184288-0
{
"data": [
{
"billing_location": {
"address": "123 Fake Street, Beverly Hills, CA 90210, US",
"company_id": "00000000-0000-0000-0000-00000000080a",
"id": "00000000-0000-0000-0000-000000000291",
"license_id": "00000000-0000-0000-0000-00000000008e",
"license_number": "CDPH-00000143",
"name": "Place 655"
},
"charges": [],
"company": {
"id": "00000000-0000-0000-0000-0000000004f4",
"name": "Company 2054",
"updated_datetime": "2026-08-14T11:21:05.808493Z"
},
"creator": {
"banned": false,
"deleted_at": null,
"email": "owner-2757@example.com",
"full_name": "FirstName5588 LastName5589",
"id": "00000000-0000-0000-0000-000000000ade",
"role": {
"id": "00000000-0000-0000-0000-000000000b12",
"name": "Admin 2833"
}
},
"custom_data": [
{
"id": 70,
"name": "Custom Field 45",
"value": null
}
],
"due_datetime": "2026-08-14T11:21:05.868976Z",
"external_notes": null,
"id": "00000000-0000-0000-0000-000000000045",
"inserted_datetime": "2026-08-14T11:21:05.869440Z",
"internal_notes": null,
"invoice_datetime": "2026-08-14T11:21:05.868976Z",
"invoice_number": "Invoice #64",
"items": [
{
"batch": {
"batch_number": null,
"id": "00000000-0000-0000-0000-000000000325",
"name": "B2480"
},
"cost_per_unit": null,
"cost_per_unit_default": null,
"id": "00000000-0000-0000-0000-00000000003c",
"order_item_id": "fb9a8d95-04da-4ec8-91df-1dc8dd44fcb8",
"package": null,
"price": "10.000000000",
"product": {
"id": "01d0c9e4-9015-45a6-b8bd-90cbf68e6af1",
"name": "Product 2478",
"sku": "sku 2479",
"updated_datetime": "2026-08-14T11:21:05.817704Z"
},
"quantity": "10.000000000",
"returned_quantity": "0",
"total_cost_actual": null,
"total_cost_default": null
},
{
"batch": {
"batch_number": null,
"id": "00000000-0000-0000-0000-000000000327",
"name": "B2488"
},
"cost_per_unit": null,
"cost_per_unit_default": null,
"id": "00000000-0000-0000-0000-00000000003d",
"order_item_id": "28337ded-59e7-427f-9f3b-a69a5a093571",
"package": null,
"price": "10.000000000",
"product": {
"id": "d2c74648-87ca-4b0c-b827-faf5ae43e466",
"name": "Product 2484",
"sku": "sku 2485",
"updated_datetime": "2026-08-14T11:21:05.828575Z"
},
"quantity": "10.000000000",
"returned_quantity": "0",
"total_cost_actual": null,
"total_cost_default": null
}
],
"order": {
"id": "47507d61-f9ef-49a4-b909-3774f3ec944e",
"order_number": "SO-121",
"status": "PENDING",
"total": "320.00"
},
"owner": {
"banned": false,
"deleted_at": null,
"email": "owner-2757@example.com",
"full_name": "FirstName5588 LastName5589",
"id": "00000000-0000-0000-0000-000000000ade",
"role": {
"id": "00000000-0000-0000-0000-000000000b12",
"name": "Admin 2833"
}
},
"paid_amount": "0.0",
"payments": [],
"remaining_amount": "200.00",
"status": "NOT_PAID",
"total": "200.00",
"updated_datetime": "2026-08-14T11:21:05.869440Z"
},
{
"billing_location": {
"address": "123 Fake Street, Beverly Hills, CA 90210, US",
"company_id": "00000000-0000-0000-0000-0000000007fa",
"id": "00000000-0000-0000-0000-00000000028d",
"license_id": "00000000-0000-0000-0000-00000000008d",
"license_number": "CDPH-00000142",
"name": "Place 651"
},
"charges": [
{
"id": "d4676a2a-a0c1-4e1b-91cb-d18292cbac85",
"name": "C1",
"percent": "10.0000",
"price": "1.00",
"tax": {
"id": "00000000-0000-0000-0000-00000000000d",
"name": "T1"
},
"type": "CHARGE",
"unit_type": "PERCENT"
}
],
"company": {
"id": "00000000-0000-0000-0000-0000000004e8",
"name": "Company 2038",
"updated_datetime": "2026-08-14T11:21:05.684580Z"
},
"creator": {
"banned": false,
"deleted_at": null,
"email": "user1@a.com",
"full_name": "John Foo",
"id": "00000000-0000-0000-0000-000000000ac6",
"role": {
"id": "00000000-0000-0000-0000-000000000afa",
"name": "Admin 2809"
}
},
"custom_data": [
{
"id": 70,
"name": "Custom Field 45",
"value": "Custom Field Value 1"
}
],
"due_datetime": "2020-01-01T00:00:01.000000Z",
"external_notes": "Visible to the customer",
"id": "00000000-0000-0000-0000-000000000044",
"inserted_datetime": "2026-08-14T11:21:05.705126Z",
"internal_notes": "Only visible internally",
"invoice_datetime": "2020-01-01T00:00:02.000000Z",
"invoice_number": "INV-123",
"items": [
{
"batch": {
"batch_number": "UID1",
"id": "00000000-0000-0000-0000-00000000031b",
"name": "B1"
},
"cost_per_unit": null,
"cost_per_unit_default": null,
"id": "00000000-0000-0000-0000-00000000003b",
"order_item_id": "1451e27f-4325-4f3a-8ae8-ce6d5e9f456b",
"package": {
"batch_number": "B1",
"compliance_label": "ABCDEF012345670000000177",
"id": "00000000-0000-0000-0000-00000000005c",
"metrc_label": "ABCDEF012345670000000177",
"status": "active"
},
"price": "10.000000000",
"product": {
"id": "39af8d47-8493-4afc-85d1-35eeaeaa4132",
"name": "P1",
"sku": "SKU1",
"updated_datetime": "2026-08-14T11:21:05.661460Z"
},
"quantity": "1.000000000",
"returned_quantity": "0",
"total_cost_actual": null,
"total_cost_default": null
}
],
"order": {
"id": "16583240-52f5-4b28-8977-c95420a2e778",
"order_number": "SO-123",
"status": "COMPLETED",
"total": "10.00"
},
"owner": {
"banned": false,
"deleted_at": null,
"email": "user2@a.com",
"full_name": "John Bar",
"id": "00000000-0000-0000-0000-000000000ac7",
"role": {
"id": "00000000-0000-0000-0000-000000000afb",
"name": "Admin 2810"
}
},
"paid_amount": "5.00",
"payments": [
{
"amount": "5",
"company": {
"id": "00000000-0000-0000-0000-0000000004e8",
"name": "Company 2038",
"updated_datetime": "2026-08-14T11:21:05.684580Z"
},
"credit_uses": [],
"description": null,
"fully_paid_with_credits": false,
"id": "00000000-0000-0000-0000-00000000001f",
"inserted_datetime": "2026-08-14T11:21:05.729078Z",
"invoice": {
"id": "00000000-0000-0000-0000-000000000044",
"invoice_number": "INV-123",
"status": "PARTIALLY_PAID",
"total": "8.00"
},
"overpayment_credits": [],
"payment_date": "2026-08-14T11:21:05.718021Z",
"payment_method": {
"deleted_at": null,
"id": "00000000-0000-0000-0000-00000000002b",
"name": "Payment Method 42"
},
"payment_number": "PYT-0000001",
"payment_type": "INVOICE",
"purchase": null,
"quickbooks_deposit_account_id": null,
"status": "POSTED",
"updated_datetime": "2026-08-14T11:21:05.729078Z"
}
],
"remaining_amount": "3.00",
"status": "PARTIALLY_PAID",
"total": "8.00",
"updated_datetime": "2026-08-14T11:21:05.731572Z"
}
],
"next_page": null
}
GET /invoices/ returns cost/returned_quantity data for invoice items
GET /public/v1/invoices
content-type: application/json
accept: application/json
authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJhdWQiOiJEaXN0cnUiLCJleHAiOjE4MTgxNTYwNjIsImlhdCI6MTc4NjcwNjQ2MiwiaXNzIjoiRGlzdHJ1IiwianRpIjoiMWI2ZTg3MjQtNTY5Yi00MTgyLTk5MTctYTRmZWJkNzhhYzU3IiwibW9iaWxlIjpmYWxzZSwibmJmIjoxNzg2NzA2NDYxLCJwbGF0Zm9ybSI6IkFQSSIsInN1YiI6IlVzZXI6MjI1MSIsInR5cCI6ImFjY2VzcyJ9.wVNv0yfjFO4ZzHbIU51qK4gyz5tAJlRpOag1KsOaoI0
Response
200
content-type: application/json; charset=utf-8
cache-control: max-age=0, private, must-revalidate
b3: 1735485e722ec39da4effc8c7d41fedb-c1cad489e9c68ed0-0
{
"data": [
{
"billing_location": {
"address": "123 Fake Street, Beverly Hills, CA 90210, US",
"company_id": "00000000-0000-0000-0000-000000000674",
"id": "00000000-0000-0000-0000-0000000001fa",
"license_id": "00000000-0000-0000-0000-000000000066",
"license_number": "CDPH-00000103",
"name": "Place 504"
},
"charges": [],
"company": {
"id": "00000000-0000-0000-0000-0000000003a7",
"name": "Company 1648",
"updated_datetime": "2026-08-14T11:21:03.065406Z"
},
"creator": {
"banned": false,
"deleted_at": null,
"email": "owner-2272@example.com",
"full_name": "FirstName4616 LastName4617",
"id": "00000000-0000-0000-0000-0000000008f1",
"role": {
"id": "00000000-0000-0000-0000-00000000092d",
"name": "Admin 2348"
}
},
"custom_data": [],
"due_datetime": "2026-08-14T11:21:03.217647Z",
"external_notes": null,
"id": "00000000-0000-0000-0000-00000000002d",
"inserted_datetime": "2026-08-14T11:21:03.217996Z",
"internal_notes": null,
"invoice_datetime": "2026-08-14T11:21:03.217647Z",
"invoice_number": "Invoice #42",
"items": [
{
"batch": {
"batch_number": null,
"id": "00000000-0000-0000-0000-00000000021e",
"name": "B1702"
},
"cost_per_unit": "10.026",
"cost_per_unit_default": "5",
"id": "00000000-0000-0000-0000-00000000001e",
"order_item_id": "69ae3a0a-2b9c-446e-bac9-cf22e1e1ce59",
"package": null,
"price": "826751.000000000",
"product": {
"id": "b4ae2315-4044-4f32-8fa3-44cfa5f017ce",
"name": "Product 1698",
"sku": "sku 1699",
"updated_datetime": "2026-08-14T11:21:02.998690Z"
},
"quantity": "2.000000000",
"returned_quantity": "2",
"total_cost_actual": "20.052",
"total_cost_default": "10"
}
],
"order": {
"id": "470fe753-fe57-4f9e-be11-cc4c98a4ea9d",
"order_number": "SO-0000001",
"status": "PROCESSING",
"total": "1653502.00"
},
"owner": {
"banned": false,
"deleted_at": null,
"email": "owner-2272@example.com",
"full_name": "FirstName4616 LastName4617",
"id": "00000000-0000-0000-0000-0000000008f1",
"role": {
"id": "00000000-0000-0000-0000-00000000092d",
"name": "Admin 2348"
}
},
"paid_amount": "0.0",
"payments": [],
"remaining_amount": "32.00",
"status": "NOT_PAID",
"total": "32.00",
"updated_datetime": "2026-08-14T11:21:03.217996Z"
}
],
"next_page": null
}
GET /invoices/ allows filtering by one or several statuses
GET /public/v1/invoices?status[]=FULLY_PAID&status[]=NOT_PAID
content-type: application/json
accept: application/json
authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJhdWQiOiJEaXN0cnUiLCJleHAiOjE4MTgxNTYwNjcsImlhdCI6MTc4NjcwNjQ2NywiaXNzIjoiRGlzdHJ1IiwianRpIjoiMWMyYmMxMzQtMDI5OC00OWY4LWJiNDItOWNlZGM0NzRjNmYyIiwibW9iaWxlIjpmYWxzZSwibmJmIjoxNzg2NzA2NDY2LCJwbGF0Zm9ybSI6IkFQSSIsInN1YiI6IlVzZXI6Mjg5MSIsInR5cCI6ImFjY2VzcyJ9.0Yrw4YGFuL4Bfc1qrC7IxkhRYei1THVVbD1wWrpL7xg
Response
200
content-type: application/json; charset=utf-8
cache-control: max-age=0, private, must-revalidate
b3: 05769c528174a657109874712ef5d34d-cbb76b0b069692e4-0
{
"data": [
{
"billing_location": {
"address": "123 Fake Street, Beverly Hills, CA 90210, US",
"company_id": "00000000-0000-0000-0000-000000000889",
"id": "00000000-0000-0000-0000-0000000002c0",
"license_id": "00000000-0000-0000-0000-00000000009b",
"license_number": "CDPH-00000156",
"name": "Place 702"
},
"charges": [],
"company": {
"id": "00000000-0000-0000-0000-00000000055b",
"name": "Company 2181",
"updated_datetime": "2026-08-14T11:21:07.366649Z"
},
"creator": {
"banned": false,
"deleted_at": null,
"email": "owner-2888@example.com",
"full_name": "FirstName5850 LastName5851",
"id": "00000000-0000-0000-0000-000000000b66",
"role": {
"id": "00000000-0000-0000-0000-000000000ba0",
"name": "Admin 2975"
}
},
"custom_data": [],
"due_datetime": "2026-08-14T11:21:07.416114Z",
"external_notes": null,
"id": "00000000-0000-0000-0000-000000000053",
"inserted_datetime": "2026-08-14T11:21:07.416522Z",
"internal_notes": null,
"invoice_datetime": "2020-01-01T12:30:00.000000Z",
"invoice_number": "Invoice #75",
"items": [
{
"batch": {
"batch_number": null,
"id": "00000000-0000-0000-0000-000000000373",
"name": "B2716"
},
"cost_per_unit": null,
"cost_per_unit_default": null,
"id": "00000000-0000-0000-0000-00000000004d",
"order_item_id": "6012e60a-7fc4-4bdd-8e80-ef33771e0cb2",
"package": null,
"price": "10.000000000",
"product": {
"id": "4f456047-05c6-44cd-8197-beac80c8355e",
"name": "Product 2714",
"sku": "sku 2715",
"updated_datetime": "2026-08-14T11:21:07.374255Z"
},
"quantity": "10.000000000",
"returned_quantity": "0",
"total_cost_actual": null,
"total_cost_default": null
},
{
"batch": {
"batch_number": null,
"id": "00000000-0000-0000-0000-000000000374",
"name": "B2719"
},
"cost_per_unit": null,
"cost_per_unit_default": null,
"id": "00000000-0000-0000-0000-00000000004e",
"order_item_id": "358c71a8-2c40-4a8d-8ca0-db3c1c23a797",
"package": null,
"price": "10.000000000",
"product": {
"id": "5c972b4d-9022-4013-ae24-95e29a47a702",
"name": "Product 2717",
"sku": "sku 2718",
"updated_datetime": "2026-08-14T11:21:07.381837Z"
},
"quantity": "10.000000000",
"returned_quantity": "0",
"total_cost_actual": null,
"total_cost_default": null
}
],
"order": {
"id": "fe99d23e-cd6f-47cd-9567-8880ad968fba",
"order_number": "SO-144",
"status": "PENDING",
"total": "320.00"
},
"owner": {
"banned": false,
"deleted_at": null,
"email": "owner-2888@example.com",
"full_name": "FirstName5850 LastName5851",
"id": "00000000-0000-0000-0000-000000000b66",
"role": {
"id": "00000000-0000-0000-0000-000000000ba0",
"name": "Admin 2975"
}
},
"paid_amount": "0.0",
"payments": [],
"remaining_amount": "200.00",
"status": "NOT_PAID",
"total": "200.00",
"updated_datetime": "2026-08-14T11:21:07.416522Z"
},
{
"billing_location": {
"address": "123 Fake Street, Beverly Hills, CA 90210, US",
"company_id": "00000000-0000-0000-0000-00000000087d",
"id": "00000000-0000-0000-0000-0000000002bd",
"license_id": "00000000-0000-0000-0000-00000000009a",
"license_number": "CDPH-00000155",
"name": "Place 699"
},
"charges": [],
"company": {
"id": "00000000-0000-0000-0000-00000000054f",
"name": "Company 2169",
"updated_datetime": "2026-08-14T11:21:07.297151Z"
},
"creator": {
"banned": false,
"deleted_at": null,
"email": "owner-2879@example.com",
"full_name": "FirstName5832 LastName5833",
"id": "00000000-0000-0000-0000-000000000b5d",
"role": {
"id": "00000000-0000-0000-0000-000000000b97",
"name": "Admin 2966"
}
},
"custom_data": [],
"due_datetime": "2026-08-14T11:21:07.345899Z",
"external_notes": null,
"id": "00000000-0000-0000-0000-000000000052",
"inserted_datetime": "2026-08-14T11:21:07.346345Z",
"internal_notes": null,
"invoice_datetime": "2020-01-01T12:20:00.000000Z",
"invoice_number": "Invoice #74",
"items": [
{
"batch": {
"batch_number": null,
"id": "00000000-0000-0000-0000-000000000368",
"name": "B2685"
},
"cost_per_unit": null,
"cost_per_unit_default": null,
"id": "00000000-0000-0000-0000-00000000004b",
"order_item_id": "0ab8ccd1-9d96-4ded-9933-f7f33f4736e8",
"package": null,
"price": "10.000000000",
"product": {
"id": "b47792b9-84de-43ff-ba82-d210c01fb4a9",
"name": "Product 2681",
"sku": "sku 2682",
"updated_datetime": "2026-08-14T11:21:07.305147Z"
},
"quantity": "10.000000000",
"returned_quantity": "0",
"total_cost_actual": null,
"total_cost_default": null
},
{
"batch": {
"batch_number": null,
"id": "00000000-0000-0000-0000-00000000036a",
"name": "B2689"
},
"cost_per_unit": null,
"cost_per_unit_default": null,
"id": "00000000-0000-0000-0000-00000000004c",
"order_item_id": "fabc836e-7359-45c9-9b44-a0eb0d187caa",
"package": null,
"price": "10.000000000",
"product": {
"id": "51b1dde3-0bbb-4add-afa7-8ffdef7c22b8",
"name": "Product 2687",
"sku": "sku 2688",
"updated_datetime": "2026-08-14T11:21:07.312119Z"
},
"quantity": "10.000000000",
"returned_quantity": "0",
"total_cost_actual": null,
"total_cost_default": null
}
],
"order": {
"id": "5b9b0a45-7d58-42f2-9e46-a61b1d4a3126",
"order_number": "SO-142",
"status": "PENDING",
"total": "320.00"
},
"owner": {
"banned": false,
"deleted_at": null,
"email": "owner-2879@example.com",
"full_name": "FirstName5832 LastName5833",
"id": "00000000-0000-0000-0000-000000000b5d",
"role": {
"id": "00000000-0000-0000-0000-000000000b97",
"name": "Admin 2966"
}
},
"paid_amount": "0.0",
"payments": [],
"remaining_amount": "200.00",
"status": "FULLY_PAID",
"total": "200.00",
"updated_datetime": "2026-08-14T11:21:07.346345Z"
},
{
"billing_location": {
"address": "123 Fake Street, Beverly Hills, CA 90210, US",
"company_id": "00000000-0000-0000-0000-00000000086b",
"id": "00000000-0000-0000-0000-0000000002b6",
"license_id": "00000000-0000-0000-0000-000000000098",
"license_number": "CDPH-00000153",
"name": "Place 692"
},
"charges": [],
"company": {
"id": "00000000-0000-0000-0000-00000000053e",
"name": "Company 2151",
"updated_datetime": "2026-08-14T11:21:07.138330Z"
},
"creator": {
"banned": false,
"deleted_at": null,
"email": "owner-2862@example.com",
"full_name": "FirstName5798 LastName5799",
"id": "00000000-0000-0000-0000-000000000b4c",
"role": {
"id": "00000000-0000-0000-0000-000000000b87",
"name": "Admin 2950"
}
},
"custom_data": [],
"due_datetime": "2026-08-14T11:21:07.192000Z",
"external_notes": null,
"id": "00000000-0000-0000-0000-000000000050",
"inserted_datetime": "2026-08-14T11:21:07.192485Z",
"internal_notes": null,
"invoice_datetime": "2020-01-01T12:00:00.000000Z",
"invoice_number": "Invoice #72",
"items": [
{
"batch": {
"batch_number": null,
"id": "00000000-0000-0000-0000-00000000035a",
"name": "B2641"
},
"cost_per_unit": null,
"cost_per_unit_default": null,
"id": "00000000-0000-0000-0000-000000000047",
"order_item_id": "d4b02a69-6c29-43af-b10d-907dfd99ec06",
"package": null,
"price": "10.000000000",
"product": {
"id": "2b9f43a8-f256-49d1-aeb8-413759fece0c",
"name": "Product 2639",
"sku": "sku 2640",
"updated_datetime": "2026-08-14T11:21:07.146641Z"
},
"quantity": "10.000000000",
"returned_quantity": "0",
"total_cost_actual": null,
"total_cost_default": null
},
{
"batch": {
"batch_number": null,
"id": "00000000-0000-0000-0000-00000000035b",
"name": "B2644"
},
"cost_per_unit": null,
"cost_per_unit_default": null,
"id": "00000000-0000-0000-0000-000000000048",
"order_item_id": "1cc5201b-bb8f-4413-bdc3-b89021825d82",
"package": null,
"price": "10.000000000",
"product": {
"id": "97cfb6c0-f4b2-4bc0-9583-508d4b577a53",
"name": "Product 2642",
"sku": "sku 2643",
"updated_datetime": "2026-08-14T11:21:07.155601Z"
},
"quantity": "10.000000000",
"returned_quantity": "0",
"total_cost_actual": null,
"total_cost_default": null
}
],
"order": {
"id": "ceb3b8e3-dec2-4d2f-868e-e4a9c9a65ee9",
"order_number": "SO-139",
"status": "PENDING",
"total": "320.00"
},
"owner": {
"banned": false,
"deleted_at": null,
"email": "owner-2862@example.com",
"full_name": "FirstName5798 LastName5799",
"id": "00000000-0000-0000-0000-000000000b4c",
"role": {
"id": "00000000-0000-0000-0000-000000000b87",
"name": "Admin 2950"
}
},
"paid_amount": "0.0",
"payments": [],
"remaining_amount": "200.00",
"status": "FULLY_PAID",
"total": "200.00",
"updated_datetime": "2026-08-14T11:21:07.192485Z"
}
],
"next_page": null
}
GET /invoices/:id returns cost/returned_quantity data for invoice items
GET /public/v1/invoices
content-type: application/json
accept: application/json
authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJhdWQiOiJEaXN0cnUiLCJleHAiOjE4MTgxNTYwNjAsImlhdCI6MTc4NjcwNjQ2MCwiaXNzIjoiRGlzdHJ1IiwianRpIjoiYzc4ZWNlMzgtNmYzZi00NzhjLTk2MzktOWU2MGVlNmM3MDZjIiwibW9iaWxlIjpmYWxzZSwibmJmIjoxNzg2NzA2NDU5LCJwbGF0Zm9ybSI6IkFQSSIsInN1YiI6IlVzZXI6MTc0MCIsInR5cCI6ImFjY2VzcyJ9.RHZlh8uCiD52z1Mp9gR08aJ0UwF5UFiKAI2XZlkb4CY
Response
200
content-type: application/json; charset=utf-8
cache-control: max-age=0, private, must-revalidate
b3: cbbf94f02681e80d901c0f14c0715969-a45280aada252317-0
{
"data": [
{
"billing_location": {
"address": "123 Fake Street, Beverly Hills, CA 90210, US",
"company_id": "00000000-0000-0000-0000-000000000533",
"id": "00000000-0000-0000-0000-000000000195",
"license_id": "00000000-0000-0000-0000-000000000050",
"license_number": "CDPH-00000081",
"name": "Place 403"
},
"charges": [],
"company": {
"id": "00000000-0000-0000-0000-0000000002c4",
"name": "Company 1327",
"updated_datetime": "2026-08-14T11:21:00.869830Z"
},
"creator": {
"banned": false,
"deleted_at": null,
"email": "owner-1843@example.com",
"full_name": "FirstName3742 LastName3743",
"id": "00000000-0000-0000-0000-00000000073a",
"role": {
"id": "00000000-0000-0000-0000-000000000779",
"name": "Admin 1912"
}
},
"custom_data": [],
"due_datetime": "2026-08-14T11:21:01.162326Z",
"external_notes": null,
"id": "00000000-0000-0000-0000-000000000023",
"inserted_datetime": "2026-08-14T11:21:01.162706Z",
"internal_notes": null,
"invoice_datetime": "2026-08-14T11:21:01.162325Z",
"invoice_number": "Invoice #34",
"items": [
{
"batch": {
"batch_number": null,
"id": "00000000-0000-0000-0000-00000000018d",
"name": "B1212"
},
"cost_per_unit": "10.026",
"cost_per_unit_default": "5",
"id": "00000000-0000-0000-0000-000000000010",
"order_item_id": "67986ab7-9bfe-478e-b6b4-9ffa635b75af",
"package": null,
"price": "8555.000000000",
"product": {
"id": "69f2d3be-ef5b-47be-bd87-a809264d7291",
"name": "Product 1209",
"sku": "sku 1210",
"updated_datetime": "2026-08-14T11:21:00.767335Z"
},
"quantity": "1.000000000",
"returned_quantity": "1",
"total_cost_actual": "10.026",
"total_cost_default": "5"
}
],
"order": {
"id": "bd12d31f-c9bf-4f53-a45c-653fbfd67e0c",
"order_number": "SO-0000001",
"status": "PROCESSING",
"total": "17110.00"
},
"owner": {
"banned": false,
"deleted_at": null,
"email": "owner-1843@example.com",
"full_name": "FirstName3742 LastName3743",
"id": "00000000-0000-0000-0000-00000000073a",
"role": {
"id": "00000000-0000-0000-0000-000000000779",
"name": "Admin 1912"
}
},
"paid_amount": "0.0",
"payments": [],
"remaining_amount": "32.00",
"status": "NOT_PAID",
"total": "32.00",
"updated_datetime": "2026-08-14T11:21:01.162706Z"
}
],
"next_page": null
}
Get invoices sorted by Invoice Date descendingly date and filtered by various attributes
Note: The page size for this endpoint is 500 invoices per page. This endpoint returns eventually consistent data, with changes taking up to 1 second to propagate in responses.
Required permission: invoices_permissions_view. Results are filtered to
only include invoices the authenticated user can access under their team
restrictions.
Request
GET /public/v1/invoices
Parameters
| Parameter | Description | In | Type | Required | Default | Example |
|---|---|---|---|---|---|---|
| due_datetime | Filter invoices by the due datetime | query | string | false | ,2022-07-10T00:00:00Z | |
| inserted_datetime | Filter invoices by their creation datetime | query | string | false | 2022-07-10T00:00:00Z,2022-07-11T00:00:00Z | |
| invoice_datetime | Filter invoices by the invoice datetime | query | string | false | 2022-07-10T00:00:00Z, | |
| invoice_number | Filter invoices by whether their invoice number contains the given string | query | string | false | 001 | |
| order_id | Filter invoices by order IDs | query | array | false | ["67ae9080-8dc2-4ab7-9704-19673f4d9f21","213c7080-8dc2-4ab7-9704-19673f4d9f22"] | |
| page | Pagination information | query | number | false | ?page[number]=1 | |
| status | Filter invoices by their status. Accepted values are "NOT_PAID", "OVER_PAID", "FULLY_PAID" and "PARTIALLY_PAID". | query | array | false | ["NOT_PAID","OVER_PAID"] | |
| updated_datetime | Filter invoices by the datetime they were most recently modified | query | string | false | ,2022-07-10T00:00:00Z |
Responses
| Status | Description | Schema |
|---|---|---|
| 200 | A list of invoices | Invoices |
Insert a payment for an invoice
POST /invoices/:id/payments can create a payment for an invoice with both quickbooks id and name
POST /public/v1/invoices/00000000-0000-0000-0000-00000000004a/payments
content-type: application/json
accept: application/json
authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJhdWQiOiJEaXN0cnUiLCJleHAiOjE4MTgxNTYwNjYsImlhdCI6MTc4NjcwNjQ2NiwiaXNzIjoiRGlzdHJ1IiwianRpIjoiZWQ3ZTc1YzItMzcyMS00YTczLTkyMDQtMGYwY2M3YjE1ZWQ0IiwibW9iaWxlIjpmYWxzZSwibmJmIjoxNzg2NzA2NDY1LCJwbGF0Zm9ybSI6IkFQSSIsInN1YiI6IlVzZXI6MjgxOSIsInR5cCI6ImFjY2VzcyJ9.6Bsor-BW0WOrPaf09eTVO_WR1IXRLbqmRrcwlR4PJt4
{
"amount": 100.01,
"description": "Payment for invoice",
"payment_datetime": "2020-01-01T00:00:00.000000Z",
"payment_method_id": "00000000-0000-0000-0000-00000000002c",
"quickbooks_deposit_account_id": "QBD-123"
}
Response
200
content-type: application/json; charset=utf-8
cache-control: max-age=0, private, must-revalidate
b3: aac7ec35baeaf519279267ef71d983f2-071a38df734c5410-0
{
"data": {
"amount": "100",
"company": {
"id": "00000000-0000-0000-0000-000000000515",
"name": "Company 2092",
"updated_datetime": "2026-08-14T11:21:06.292716Z"
},
"credit_uses": [],
"description": "Payment for invoice",
"fully_paid_with_credits": false,
"id": "00000000-0000-0000-0000-000000000020",
"inserted_datetime": "2026-08-14T11:21:06.328920Z",
"invoice": {
"id": "00000000-0000-0000-0000-00000000004a",
"invoice_number": "Invoice #67",
"status": "OVER_PAID",
"total": "100.00"
},
"overpayment_credits": [
{
"amount": "0.01",
"credit_number": "CRT-0000001",
"id": "0353dc0d-5e0f-4e15-9619-3b7bf28820ef",
"source": "INVOICE_PAYMENT"
}
],
"payment_date": "2020-01-01T00:00:00.000000Z",
"payment_method": {
"deleted_at": null,
"id": "00000000-0000-0000-0000-00000000002c",
"name": "Payment Method 0"
},
"payment_number": "PYT-0000001",
"payment_type": "INVOICE",
"purchase": null,
"quickbooks_deposit_account_id": "QBD-123",
"quickbooks_deposit_account_name": "QBD-NAME",
"quickbooks_sync_enqueued": true,
"status": "POSTED",
"updated_datetime": "2026-08-14T11:21:06.328920Z"
}
}
POST /invoices/:id/payments can create a payment for an invoice with both quickbooks id and name
POST /public/v1/invoices/00000000-0000-0000-0000-00000000004a/payments
content-type: application/json
accept: application/json
authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJhdWQiOiJEaXN0cnUiLCJleHAiOjE4MTgxNTYwNjYsImlhdCI6MTc4NjcwNjQ2NiwiaXNzIjoiRGlzdHJ1IiwianRpIjoiZWQ3ZTc1YzItMzcyMS00YTczLTkyMDQtMGYwY2M3YjE1ZWQ0IiwibW9iaWxlIjpmYWxzZSwibmJmIjoxNzg2NzA2NDY1LCJwbGF0Zm9ybSI6IkFQSSIsInN1YiI6IlVzZXI6MjgxOSIsInR5cCI6ImFjY2VzcyJ9.6Bsor-BW0WOrPaf09eTVO_WR1IXRLbqmRrcwlR4PJt4
{
"amount": 100.01,
"description": "Payment for invoice",
"payment_datetime": "2020-01-01T00:00:00.000000Z",
"payment_method_id": "00000000-0000-0000-0000-00000000002c",
"quickbooks_deposit_account_name": "QBD-NAME"
}
Response
200
content-type: application/json; charset=utf-8
cache-control: max-age=0, private, must-revalidate
b3: aac7ec35baeaf519279267ef71d983f2-4792856310c7680c-0
{
"data": {
"amount": "100",
"company": {
"id": "00000000-0000-0000-0000-000000000515",
"name": "Company 2092",
"updated_datetime": "2026-08-14T11:21:06.292716Z"
},
"credit_uses": [],
"description": "Payment for invoice",
"fully_paid_with_credits": false,
"id": "00000000-0000-0000-0000-000000000021",
"inserted_datetime": "2026-08-14T11:21:06.452542Z",
"invoice": {
"id": "00000000-0000-0000-0000-00000000004a",
"invoice_number": "Invoice #67",
"status": "OVER_PAID",
"total": "100.00"
},
"overpayment_credits": [
{
"amount": "0.01",
"credit_number": "CRT-0000002",
"id": "ff98ee41-2840-4899-bbef-9f8f347d8378",
"source": "INVOICE_PAYMENT"
}
],
"payment_date": "2020-01-01T00:00:00.000000Z",
"payment_method": {
"deleted_at": null,
"id": "00000000-0000-0000-0000-00000000002c",
"name": "Payment Method 0"
},
"payment_number": "PYT-0000002",
"payment_type": "INVOICE",
"purchase": null,
"quickbooks_deposit_account_id": "QBD-123",
"quickbooks_deposit_account_name": "QBD-NAME",
"quickbooks_sync_enqueued": true,
"status": "POSTED",
"updated_datetime": "2026-08-14T11:21:06.452542Z"
}
}
Required permission: invoices_permissions_receive_payment. The authenticated user must also be allowed to view invoices under their team restrictions.
Request
POST /public/v1/invoices/{id}/payments
Parameters
| Parameter | Description | In | Type | Required | Default | Example |
|---|---|---|---|---|---|---|
| payment_method_id | Payment method ID | query | string | true | ||
| amount | Amount of the payment. Will round to 2 decimal places | query | decimal | true | ||
| payment_datetime | Payment date | query | string | true | ||
| description | Description of the payment | query | string | true | ||
| quickbooks_deposit_account_id | Quickbooks deposit account ID. Cannot include both this and quickbooks_deposit_account_name. If user's company is integrated with Quickbooks, either this or quickbooks_deposit_account_name must be provided. Account type must be "Bank" or "Other Current Asset" | query | string | false | ||
| quickbooks_deposit_account_name | Quickbooks deposit account name. Cannot include both this and quickbooks_deposit_account_id. If user's company is integrated with Quickbooks, either this or quickbooks_deposit_account_id must be provided. Account type must be "Bank" or "Other Current Asset" | query | string | false |
Responses
| Status | Description | Schema |
|---|---|---|
| 200 | A single payment | Payment |
Upsert an invoice
POST /invoices creates an invoice
POST /public/v1/invoices
content-type: application/json
accept: application/json
authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJhdWQiOiJEaXN0cnUiLCJleHAiOjE4MTgxNTYwNjMsImlhdCI6MTc4NjcwNjQ2MywiaXNzIjoiRGlzdHJ1IiwianRpIjoiZjhmZTY5ZDMtNGVjMi00Njc1LWExNTctYjczZWU1Mzg0NmE3IiwibW9iaWxlIjpmYWxzZSwibmJmIjoxNzg2NzA2NDYyLCJwbGF0Zm9ybSI6IkFQSSIsInN1YiI6IlVzZXI6MjM0MiIsInR5cCI6ImFjY2VzcyJ9.9pNnER-1fK0-33b-GX7hLKD7s5zHdNz-3Cfd80zMqto
{
"billing_location_id": "00000000-0000-0000-0000-00000000020a",
"charges": [
{
"name": "C1",
"percent": "10.0000",
"type": "CHARGE",
"unit_type": "PERCENT"
},
{
"name": "C2",
"price": "-5.0000",
"type": "DISCOUNT",
"unit_type": "PRICE"
}
],
"custom_data": {
"67": [
"A",
"B"
]
},
"due_datetime": "2020-01-30T00:00:01.000000Z",
"external_notes": "Visible to the customer",
"internal_notes": "Only visible internally",
"invoice_datetime": "2020-01-01T00:00:00.000000Z",
"items": [
{
"order_item_id": "302575ae-9c76-4edc-a919-3582f8386e68",
"quantity": "1.000000000"
},
{
"order_item_id": "3e900dd8-5d5b-4d67-8b75-9a354a455a2b",
"quantity": "10.000000000"
}
],
"order_id": "1fe08da1-7ee2-401f-98b4-966b81ae96a8",
"owner_id": "00000000-0000-0000-0000-000000000926"
}
Response
200
content-type: application/json; charset=utf-8
cache-control: max-age=0, private, must-revalidate
b3: f07b8adefa983bb56e6444ce0f201171-e01fc6950d11bbdc-0
{
"data": {
"billing_location": {
"address": "123 Fake Street, Beverly Hills, CA 90210, US",
"company_id": "00000000-0000-0000-0000-0000000006b1",
"id": "00000000-0000-0000-0000-00000000020a",
"license_id": null,
"license_number": null,
"name": "Place 520"
},
"charges": [
{
"id": "33c953cb-e7f7-45e8-9e16-08ac3617072d",
"name": "C1",
"percent": "10.0000",
"price": "5.30",
"type": "CHARGE",
"unit_type": "PERCENT"
},
{
"id": "a389b9cf-70a7-49dd-852c-2a88eee1957a",
"name": "C2",
"percent": null,
"price": "-5.00",
"type": "DISCOUNT",
"unit_type": "PRICE"
}
],
"company": {
"id": "00000000-0000-0000-0000-0000000003d7",
"name": "Company 1709",
"updated_datetime": "2026-08-14T11:21:03.542642Z"
},
"creator": {
"banned": false,
"deleted_at": null,
"email": "user1@a.com",
"full_name": "John Foo",
"id": "00000000-0000-0000-0000-000000000926",
"role": {
"id": "00000000-0000-0000-0000-00000000095d",
"name": "Admin 2396"
}
},
"custom_data": [
{
"id": 67,
"name": "Custom Field 42",
"value": "A,B"
}
],
"due_datetime": "2020-01-30T00:00:01.000000Z",
"external_notes": "Visible to the customer",
"id": "00000000-0000-0000-0000-00000000002f",
"inserted_datetime": "2026-08-14T11:21:03.595303Z",
"internal_notes": "Only visible internally",
"invoice_datetime": "2020-01-01T00:00:00.000000Z",
"invoice_number": "INV-0000001",
"items": [
{
"batch": {
"batch_number": null,
"id": "00000000-0000-0000-0000-000000000249",
"name": "B1"
},
"cost_per_unit": null,
"cost_per_unit_default": null,
"id": "00000000-0000-0000-0000-000000000022",
"order_item_id": "302575ae-9c76-4edc-a919-3582f8386e68",
"package": null,
"price": "3.000000000",
"product": {
"id": "c6761809-10bd-4bb9-9419-bd0c91444217",
"name": "P1",
"sku": "SKU1",
"updated_datetime": "2026-08-14T11:21:03.553657Z"
},
"quantity": "1.000000000",
"returned_quantity": "0",
"total_cost_actual": null,
"total_cost_default": null
},
{
"batch": {
"batch_number": null,
"id": "00000000-0000-0000-0000-00000000024b",
"name": "B2"
},
"cost_per_unit": null,
"cost_per_unit_default": null,
"id": "00000000-0000-0000-0000-000000000023",
"order_item_id": "3e900dd8-5d5b-4d67-8b75-9a354a455a2b",
"package": null,
"price": "5.000000000",
"product": {
"id": "51a9e904-7e14-4e8a-bb5b-1bdb9c134880",
"name": "P2",
"sku": "SKU2",
"updated_datetime": "2026-08-14T11:21:03.561521Z"
},
"quantity": "10.000000000",
"returned_quantity": "0",
"total_cost_actual": null,
"total_cost_default": null
}
],
"order": {
"id": "1fe08da1-7ee2-401f-98b4-966b81ae96a8",
"order_number": "SO-84",
"status": "PROCESSING",
"total": "0.00"
},
"owner": {
"banned": false,
"deleted_at": null,
"email": "user1@a.com",
"full_name": "John Foo",
"id": "00000000-0000-0000-0000-000000000926",
"role": {
"id": "00000000-0000-0000-0000-00000000095d",
"name": "Admin 2396"
}
},
"paid_amount": "0.0",
"payments": [],
"remaining_amount": "53.30",
"status": "NOT_PAID",
"total": "53.30",
"updated_datetime": "2026-08-14T11:21:03.603203Z"
}
}
POST /invoices updates an invoice
POST /public/v1/invoices
content-type: application/json
accept: application/json
authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJhdWQiOiJEaXN0cnUiLCJleHAiOjE4MTgxNTYwNjMsImlhdCI6MTc4NjcwNjQ2MywiaXNzIjoiRGlzdHJ1IiwianRpIjoiZjQyZjNkZjItNjA1Mi00YTYzLTk5MTYtYWJjYTQ5NmEzYjM0IiwibW9iaWxlIjpmYWxzZSwibmJmIjoxNzg2NzA2NDYyLCJwbGF0Zm9ybSI6IkFQSSIsInN1YiI6IlVzZXI6MjMwMSIsInR5cCI6ImFjY2VzcyJ9.R0p5REEPOEzWyGzCp5WeFCKBcqQpGtpsocMzIFTvPek
{
"billing_location_id": "00000000-0000-0000-0000-0000000001fc",
"charges": [
{
"name": "C1",
"percent": "10.0000",
"type": "CHARGE",
"unit_type": "PERCENT"
},
{
"name": "C2",
"price": "-5.0000",
"type": "DISCOUNT",
"unit_type": "PRICE"
}
],
"due_datetime": "2020-01-30T00:00:01.000000Z",
"invoice_datetime": "2020-01-01T00:00:00.000000Z",
"items": [
{
"order_item_id": "1faad7cd-c2ab-4df1-b3fe-9846f7d63ef6",
"quantity": "1.000000000"
},
{
"order_item_id": "510ac1d7-4f6f-4f39-8fad-10841d7b2edd",
"quantity": "10.000000000"
}
],
"order_id": "59ad65d9-b1f6-4c89-ba6d-9a8c8a63f190"
}
Response
200
content-type: application/json; charset=utf-8
cache-control: max-age=0, private, must-revalidate
b3: 46d94df1125b6d21926552b73be0a6dc-29a20d027452bf11-0
{
"data": {
"billing_location": {
"address": "123 Fake Street, Beverly Hills, CA 90210, US",
"company_id": "00000000-0000-0000-0000-00000000068a",
"id": "00000000-0000-0000-0000-0000000001fc",
"license_id": null,
"license_number": null,
"name": "Place 506"
},
"charges": [
{
"id": "f0c4f1f9-d5d0-4f53-889f-fc657e0d4e33",
"name": "C1",
"percent": "10.0000",
"price": "5.30",
"type": "CHARGE",
"unit_type": "PERCENT"
},
{
"id": "8d545138-3bdf-444f-83fa-09a93453c10f",
"name": "C2",
"percent": null,
"price": "-5.00",
"type": "DISCOUNT",
"unit_type": "PRICE"
}
],
"company": {
"id": "00000000-0000-0000-0000-0000000003b9",
"name": "Company 1670",
"updated_datetime": "2026-08-14T11:21:03.270311Z"
},
"creator": {
"banned": false,
"deleted_at": null,
"email": "user1@a.com",
"full_name": "John Foo",
"id": "00000000-0000-0000-0000-0000000008fd",
"role": {
"id": "00000000-0000-0000-0000-000000000938",
"name": "Admin 2359"
}
},
"custom_data": [],
"due_datetime": "2020-01-30T00:00:01.000000Z",
"external_notes": null,
"id": "00000000-0000-0000-0000-00000000002e",
"inserted_datetime": "2026-08-14T11:21:03.441307Z",
"internal_notes": null,
"invoice_datetime": "2020-01-01T00:00:00.000000Z",
"invoice_number": "INV-0000001",
"items": [
{
"batch": {
"batch_number": null,
"id": "00000000-0000-0000-0000-00000000023c",
"name": "B1"
},
"cost_per_unit": null,
"cost_per_unit_default": null,
"id": "00000000-0000-0000-0000-00000000001f",
"order_item_id": "1faad7cd-c2ab-4df1-b3fe-9846f7d63ef6",
"package": null,
"price": "3.000000000",
"product": {
"id": "f844c3b4-214b-4853-9a22-48c48541f17d",
"name": "P1",
"sku": "SKU1",
"updated_datetime": "2026-08-14T11:21:03.402574Z"
},
"quantity": "1.000000000",
"returned_quantity": "0",
"total_cost_actual": null,
"total_cost_default": null
},
{
"batch": {
"batch_number": null,
"id": "00000000-0000-0000-0000-00000000023d",
"name": "B2"
},
"cost_per_unit": null,
"cost_per_unit_default": null,
"id": "00000000-0000-0000-0000-000000000020",
"order_item_id": "510ac1d7-4f6f-4f39-8fad-10841d7b2edd",
"package": null,
"price": "5.000000000",
"product": {
"id": "1b43927e-4aab-46b7-b091-524bfcfd8c68",
"name": "P2",
"sku": "SKU2",
"updated_datetime": "2026-08-14T11:21:03.411313Z"
},
"quantity": "10.000000000",
"returned_quantity": "0",
"total_cost_actual": null,
"total_cost_default": null
}
],
"order": {
"id": "59ad65d9-b1f6-4c89-ba6d-9a8c8a63f190",
"order_number": "SO-83",
"status": "PROCESSING",
"total": "0.00"
},
"owner": null,
"paid_amount": "0.0",
"payments": [],
"remaining_amount": "53.30",
"status": "NOT_PAID",
"total": "53.30",
"updated_datetime": "2026-08-14T11:21:03.448231Z"
}
}
POST /invoices updates an invoice
POST /public/v1/invoices
content-type: application/json
accept: application/json
authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJhdWQiOiJEaXN0cnUiLCJleHAiOjE4MTgxNTYwNjMsImlhdCI6MTc4NjcwNjQ2MywiaXNzIjoiRGlzdHJ1IiwianRpIjoiZjQyZjNkZjItNjA1Mi00YTYzLTk5MTYtYWJjYTQ5NmEzYjM0IiwibW9iaWxlIjpmYWxzZSwibmJmIjoxNzg2NzA2NDYyLCJwbGF0Zm9ybSI6IkFQSSIsInN1YiI6IlVzZXI6MjMwMSIsInR5cCI6ImFjY2VzcyJ9.R0p5REEPOEzWyGzCp5WeFCKBcqQpGtpsocMzIFTvPek
{
"billing_location_id": "00000000-0000-0000-0000-000000000206",
"charges": [
{
"id": "f0c4f1f9-d5d0-4f53-889f-fc657e0d4e33",
"name": "C1",
"percent": "10.0000",
"type": "CHARGE",
"unit_type": "PERCENT"
},
{
"name": "C3",
"price": "-5.0000",
"type": "DISCOUNT",
"unit_type": "PRICE"
}
],
"due_datetime": "2020-01-28T00:00:01.000000Z",
"id": "00000000-0000-0000-0000-00000000002e",
"invoice_datetime": "2020-01-02T00:00:00.000000Z",
"items": [
{
"id": "00000000-0000-0000-0000-00000000001f",
"order_item_id": "1faad7cd-c2ab-4df1-b3fe-9846f7d63ef6",
"quantity": "1.000000000"
},
{
"order_item_id": "510ac1d7-4f6f-4f39-8fad-10841d7b2edd",
"quantity": "8.000000000"
}
],
"order_id": "59ad65d9-b1f6-4c89-ba6d-9a8c8a63f190"
}
Response
200
content-type: application/json; charset=utf-8
cache-control: max-age=0, private, must-revalidate
b3: 46d94df1125b6d21926552b73be0a6dc-ed4ac19b54d01d73-0
{
"data": {
"billing_location": {
"address": "123 Fake Street, Beverly Hills, CA 90210, US",
"company_id": "00000000-0000-0000-0000-00000000068a",
"id": "00000000-0000-0000-0000-000000000206",
"license_id": null,
"license_number": null,
"name": "Place 516"
},
"charges": [
{
"id": "f0c4f1f9-d5d0-4f53-889f-fc657e0d4e33",
"name": "C1",
"percent": "10.0000",
"price": "4.30",
"type": "CHARGE",
"unit_type": "PERCENT"
},
{
"id": "30803a19-8b9f-488e-8c0e-6ff8173b4109",
"name": "C3",
"percent": null,
"price": "-5.00",
"type": "DISCOUNT",
"unit_type": "PRICE"
}
],
"company": {
"id": "00000000-0000-0000-0000-0000000003b9",
"name": "Company 1670",
"updated_datetime": "2026-08-14T11:21:03.270311Z"
},
"creator": {
"banned": false,
"deleted_at": null,
"email": "user1@a.com",
"full_name": "John Foo",
"id": "00000000-0000-0000-0000-0000000008fd",
"role": {
"id": "00000000-0000-0000-0000-000000000938",
"name": "Admin 2359"
}
},
"custom_data": [],
"due_datetime": "2020-01-28T00:00:01.000000Z",
"external_notes": null,
"id": "00000000-0000-0000-0000-00000000002e",
"inserted_datetime": "2026-08-14T11:21:03.441307Z",
"internal_notes": null,
"invoice_datetime": "2020-01-02T00:00:00.000000Z",
"invoice_number": "INV-0000001",
"items": [
{
"batch": {
"batch_number": null,
"id": "00000000-0000-0000-0000-00000000023c",
"name": "B1"
},
"cost_per_unit": null,
"cost_per_unit_default": null,
"id": "00000000-0000-0000-0000-00000000001f",
"order_item_id": "1faad7cd-c2ab-4df1-b3fe-9846f7d63ef6",
"package": null,
"price": "3.000000000",
"product": {
"id": "f844c3b4-214b-4853-9a22-48c48541f17d",
"name": "P1",
"sku": "SKU1",
"updated_datetime": "2026-08-14T11:21:03.402574Z"
},
"quantity": "1.000000000",
"returned_quantity": "0",
"total_cost_actual": null,
"total_cost_default": null
},
{
"batch": {
"batch_number": null,
"id": "00000000-0000-0000-0000-00000000023d",
"name": "B2"
},
"cost_per_unit": null,
"cost_per_unit_default": null,
"id": "00000000-0000-0000-0000-000000000021",
"order_item_id": "510ac1d7-4f6f-4f39-8fad-10841d7b2edd",
"package": null,
"price": "5.000000000",
"product": {
"id": "1b43927e-4aab-46b7-b091-524bfcfd8c68",
"name": "P2",
"sku": "SKU2",
"updated_datetime": "2026-08-14T11:21:03.411313Z"
},
"quantity": "8.000000000",
"returned_quantity": "0",
"total_cost_actual": null,
"total_cost_default": null
}
],
"order": {
"id": "59ad65d9-b1f6-4c89-ba6d-9a8c8a63f190",
"order_number": "SO-83",
"status": "PROCESSING",
"total": "0.00"
},
"owner": null,
"paid_amount": "0.0",
"payments": [],
"remaining_amount": "42.30",
"status": "NOT_PAID",
"total": "42.30",
"updated_datetime": "2026-08-14T11:21:03.502747Z"
}
}
POST /invoices reports various errors correctly on update
POST /public/v1/invoices
content-type: application/json
accept: application/json
authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJhdWQiOiJEaXN0cnUiLCJleHAiOjE4MTgxNTYwNjIsImlhdCI6MTc4NjcwNjQ2MiwiaXNzIjoiRGlzdHJ1IiwianRpIjoiNzAyYjRkOGItMzVlNC00NjBmLWI3NDMtZDdmZTEyYzcwNjBjIiwibW9iaWxlIjpmYWxzZSwibmJmIjoxNzg2NzA2NDYxLCJwbGF0Zm9ybSI6IkFQSSIsInN1YiI6IlVzZXI6MjIxNCIsInR5cCI6ImFjY2VzcyJ9.vD8RhxBuwv9L2Y-pFUseV8JqqnaxMYOTVFHJLf4mdXw
{
"billing_location_id": "00000000-0000-0000-0000-0000000001e3",
"charges": [
{
"name": "C1",
"percent": "-1000.0000",
"type": "CHARGE",
"unit_type": "PERCENT"
}
],
"due_datetime": "2020-01-30T00:00:01.000000Z",
"id": "00000000-0000-0000-0000-00000000002c",
"invoice_datetime": "2020-01-01T00:00:00.000000Z",
"items": [
{
"order_item_id": "00000000-0000-0000-0000-000000000000",
"quantity": "15.000"
},
{
"order_item_id": "e8f555e0-7e64-45c6-a7b8-8369edbd0fbd",
"quantity": "19.000"
}
],
"order_id": "b85c34f5-33bf-4845-828f-8e7c7b63baec"
}
Response
400
cache-control: max-age=0, private, must-revalidate
content-type: application/json; charset=utf-8
b3: 451b06c77c48ff292ec0aeeb7607de76-83ad5352b8d836e3-0
{
"errors": [
{
"context": {
"id": "3e44f1f5-ab12-4d2c-8d35-c8b0e4169131"
},
"message": "Must be less than or equal to 100",
"pointer": [
"charges",
0,
"percent"
],
"section": "body"
},
{
"context": {},
"message": "Order item not found",
"pointer": [
"items",
2,
"order_item_id"
],
"section": "body"
},
{
"context": {},
"message": "Only 10 left uninvoiced",
"pointer": [
"items",
3,
"quantity"
],
"section": "body"
}
]
}
Upsert a single invoice. To update an existing invoice, pass in an existing invoice ID in the id field. When updating an invoice, you must pass in all fields (no sparse update currently supported). Any existing invoice item or charge you do not pass in to items and charges respectively will be deleted. Required permission: invoices_permissions_create to create a new invoice, invoices_permissions_edit (and access to the invoice under team restrictions) to update an existing invoice.
Request
POST /public/v1/invoices
Parameters
| Parameter | Description | In | Type | Required | Default | Example |
|---|---|---|---|---|---|---|
| due_datetime | The datetime at which the invoice is due | query | string | false | ||
| id | Unique ID for this invoice. If it exists, an update will be performed; otherwise, it will be used as the ID of a new invoice record | query | string | false | ||
| invoice_datetime | The datetime on which the invoice was placed | query | string | false | ||
| charges | The additional lines of Charge, Discount, or Tax added to this invoice | body | InvoiceChargesRequest | false | ||
| items | The invoice items present on this order | body | InvoiceItemsRequest | false | ||
| billing_location_id | The billing location's ID | query | string | false | ||
| owner_id | The ID of the Distru user that owns this invoice | query | string | false | ||
| external_notes | Notes on this invoice that are visible to the customer | query | string | false | ||
| internal_notes | Notes on this invoice that are only visible internally | query | string | false | ||
| custom_data | A map of custom field IDs to their values. Use GET /public/v1/custom-fields?model_name=invoice to retrieve available custom fields and their IDs. | body | object | false | {"123":"Custom Value 1","456":"Custom Value 2"} |
Responses
| Status | Description | Schema |
|---|---|---|
| 200 | A single invoice | Invoice |
Location
Get a location
GET /public/v1/locations/:id returns the expected location
GET /public/v1/locations/00000000-0000-0000-0000-00000000007f
content-type: application/json
accept: application/json
authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJhdWQiOiJEaXN0cnUiLCJleHAiOjE4MTgxNTYwNTYsImlhdCI6MTc4NjcwNjQ1NiwiaXNzIjoiRGlzdHJ1IiwianRpIjoiOGNmZWQ2YTAtZGRiNi00ZTg1LTg5YWEtODU5YjI3YWZhOTBiIiwibW9iaWxlIjpmYWxzZSwibmJmIjoxNzg2NzA2NDU1LCJwbGF0Zm9ybSI6IkFQSSIsInN1YiI6IlVzZXI6MzMwIiwidHlwIjoiYWNjZXNzIn0.7f9d7y110Py4x0KZujDkE4jE1thSfIJ11pXJsD3-os8
Response
200
content-type: application/json; charset=utf-8
cache-control: max-age=0, private, must-revalidate
b3: a14e2b00578caa5e6ba214cf093e96ec-edbcbd63309710df-0
{
"data": {
"address": "123 Fake Street, Beverly Hills, CA 90210, US",
"company_id": "00000000-0000-0000-0000-00000000010f",
"deleted_at": null,
"id": "00000000-0000-0000-0000-00000000007f",
"license": {
"id": "00000000-0000-0000-0000-000000000010",
"license_number": "CDPH-00000015"
},
"license_id": "00000000-0000-0000-0000-000000000010",
"name": "Place 126"
}
}
Get a single location given the ID.
Required permission: companies_permissions_view.
Request
GET /public/v1/locations/{id}
Parameters
| Parameter | Description | In | Type | Required | Default | Example |
|---|---|---|---|---|---|---|
| id | Location ID | path | string | true |
Responses
| Status | Description | Schema |
|---|---|---|
| 200 | A single location | Location |
| 404 | Not Found |
Get locations
GET /public/v1/locations returns locations related to the company
GET /public/v1/locations
content-type: application/json
accept: application/json
authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJhdWQiOiJEaXN0cnUiLCJleHAiOjE4MTgxNTYwNTcsImlhdCI6MTc4NjcwNjQ1NywiaXNzIjoiRGlzdHJ1IiwianRpIjoiZWExMzdmODUtMTcxYy00ZjdlLThlNTMtOTBkNmI2ODY0OTQ2IiwibW9iaWxlIjpmYWxzZSwibmJmIjoxNzg2NzA2NDU2LCJwbGF0Zm9ybSI6IkFQSSIsInN1YiI6IlVzZXI6NTU2IiwidHlwIjoiYWNjZXNzIn0.4ye3HeUCETtzWgvESRYfxZFf6t5AXEVAyHBjwl05nrI
Response
200
content-type: application/json; charset=utf-8
cache-control: max-age=0, private, must-revalidate
b3: 8f7d19f54d21424cddeef9cbea7f9008-2e8ad6a8759105b5-0
{
"data": [
{
"address": "123 Fake Street, Beverly Hills, CA 90210, US",
"company_id": "00000000-0000-0000-0000-0000000001b1",
"deleted_at": null,
"id": "00000000-0000-0000-0000-0000000000b7",
"license": null,
"license_id": null,
"name": "Place 182"
},
{
"address": "123 Fake Street, Beverly Hills, CA 90210, US",
"company_id": "00000000-0000-0000-0000-0000000001b1",
"deleted_at": null,
"id": "00000000-0000-0000-0000-0000000000b8",
"license": {
"id": "00000000-0000-0000-0000-00000000001b",
"license_number": "CDPH-00000028"
},
"license_id": "00000000-0000-0000-0000-00000000001b",
"name": "Place 183"
}
],
"next_page": null
}
Get locations sorted by their creation date and filtered by various attributes
Note: The page size for this endpoint is 1000 locations per page. This endpoint returns eventually consistent data, with changes taking up to 1 second to propagate in responses.
Required permission: companies_permissions_view.
Request
GET /public/v1/locations
Parameters
| Parameter | Description | In | Type | Required | Default | Example |
|---|---|---|---|---|---|---|
| inserted_datetime | Filter locations by their creation datetime | query | string | false | 2022-07-10T00:00:00Z, | |
| deleted | Filter deleted locations. no returns non-deleted, only returns deleted, include returns both. |
query | string | false | no | |
| page | Pagination information | query | number | false | ?page[number]=1 | |
| updated_datetime | Filter locations by the datetime they were most recently modified | query | string | false | ,2022-07-10T00:00:00Z |
Responses
| Status | Description | Schema |
|---|---|---|
| 200 | A list of locations | Locations |
Menu
Get a menu
GET /public/v1/menus/:id returns the expected menu
GET /public/v1/menus/00000000-0000-0000-0000-000000000009
content-type: application/json
accept: application/json
authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJhdWQiOiJEaXN0cnUiLCJleHAiOjE4MTgxNTYwNTYsImlhdCI6MTc4NjcwNjQ1NiwiaXNzIjoiRGlzdHJ1IiwianRpIjoiODkyMTI5N2ItMWM5Yy00Njg4LWFlMDItMzgzYmVkMmRjNWQwIiwibW9iaWxlIjpmYWxzZSwibmJmIjoxNzg2NzA2NDU1LCJwbGF0Zm9ybSI6IkFQSSIsInN1YiI6IlVzZXI6NDYzIiwidHlwIjoiYWNjZXNzIn0.VS_pqcV3zNtMgI3VO3Oup0T9abNS9mPWGLgmvkwxjvI
Response
200
content-type: application/json; charset=utf-8
cache-control: max-age=0, private, must-revalidate
b3: 2294a53d440774bde1bb439025d94f8e-946bd42e2f0396ea-0
{
"data": {
"active": true,
"external_name": "External Test Menu",
"id": "00000000-0000-0000-0000-000000000009",
"inserted_datetime": "2026-08-14T11:20:56.937848Z",
"internal_name": "Test Menu",
"product_count": 1,
"updated_datetime": "2026-08-14T11:20:56.937848Z",
"visibility": "PUBLIC"
}
}
Get a single menu given the ID.
Required permission: products_permissions_view.
Request
GET /public/v1/menus/{id}
Parameters
| Parameter | Description | In | Type | Required | Default | Example |
|---|---|---|---|---|---|---|
| id | Menu ID | path | string | true |
Responses
| Status | Description | Schema |
|---|---|---|
| 200 | A single menu | Menu |
| 404 | Not Found |
Get menus
GET /public/v1/menus returns menus for the company with default pagination
GET /public/v1/menus
content-type: application/json
accept: application/json
authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJhdWQiOiJEaXN0cnUiLCJleHAiOjE4MTgxNTYwNTksImlhdCI6MTc4NjcwNjQ1OSwiaXNzIjoiRGlzdHJ1IiwianRpIjoiYzEyMzM3YzItZGM2My00YjBmLTkyZTUtOGFkOTEyNzIzZWMxIiwibW9iaWxlIjpmYWxzZSwibmJmIjoxNzg2NzA2NDU4LCJwbGF0Zm9ybSI6IkFQSSIsInN1YiI6IlVzZXI6MTA2NCIsInR5cCI6ImFjY2VzcyJ9.nYOrFWGqzbgz3xscsNoIAOQnLlN6v9ByEP8bVuoG-h0
Response
200
content-type: application/json; charset=utf-8
cache-control: max-age=0, private, must-revalidate
b3: 9697bce9dfbd8191b3c73c085c61e124-51696a2508cef763-0
{
"data": [
{
"active": true,
"external_name": "Ext A",
"id": "00000000-0000-0000-0000-000000000025",
"inserted_datetime": "2026-08-14T11:20:59.064303Z",
"internal_name": "Alpha",
"product_count": 0,
"updated_datetime": "2026-08-14T11:20:59.064303Z",
"visibility": "PUBLIC"
},
{
"active": true,
"external_name": "Ext B",
"id": "00000000-0000-0000-0000-000000000026",
"inserted_datetime": "2026-08-14T11:20:59.079274Z",
"internal_name": "Beta",
"product_count": 0,
"updated_datetime": "2026-08-14T11:20:59.079274Z",
"visibility": "PUBLIC"
}
],
"next_page": null
}
List menus for the authenticated company with visibility, active state, and active product counts.
Note: The page size for this endpoint is 500 menus per page.
Required permission: products_permissions_view.
Request
GET /public/v1/menus
Parameters
| Parameter | Description | In | Type | Required | Default | Example |
|---|---|---|---|---|---|---|
| active | Filter by menu active flag: true, false, or true,false (both). |
query | string | false | ||
| visibility | Comma-separated visibility: PUBLIC, PRIVATE, PASSCODE_PROTECTED. |
query | string | false | ||
| page | Pagination information | query | number | false | ?page[number]=1 |
Responses
| Status | Description | Schema |
|---|---|---|
| 200 | Menus index | Menus |
OfficialProductCategory
Get official product categories
GET /public/v1/official-product-categories returns the global official product categories with raw string ids
GET /public/v1/official-product-categories
content-type: application/json
accept: application/json
authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJhdWQiOiJEaXN0cnUiLCJleHAiOjE4MTgxNTYwNTUsImlhdCI6MTc4NjcwNjQ1NSwiaXNzIjoiRGlzdHJ1IiwianRpIjoiNTA0NzdhNmEtMzk2Yi00YTBkLWJhNmMtYmI0OGUwODk3YjBiIiwibW9iaWxlIjpmYWxzZSwibmJmIjoxNzg2NzA2NDU0LCJwbGF0Zm9ybSI6IkFQSSIsInN1YiI6IlVzZXI6NDkiLCJ0eXAiOiJhY2Nlc3MifQ.wli1jy21bGvlmCEOAce6c5ol9ipbYMrtsBUN_Xn7Wkw
Response
200
content-type: application/json; charset=utf-8
cache-control: max-age=0, private, must-revalidate
b3: d68d951cf31cfdb9159afa276582b72e-edbbedb51400565d-0
{
"data": [
{
"id": "CAPSULES",
"name": "Capsules"
},
{
"id": "CLONES",
"name": "Clones & Seeds"
},
{
"id": "CONCENTRATES",
"name": "Concentrates"
},
{
"id": "EDIBLES",
"name": "Edibles"
},
{
"id": "FLOWER",
"name": "Flower"
},
{
"id": "MERCH",
"name": "Merch"
},
{
"id": "OTHER",
"name": "Other"
},
{
"id": "PREROLLS",
"name": "Pre-Rolls"
},
{
"id": "TINCTURES",
"name": "Tinctures"
},
{
"id": "TOPICALS",
"name": "Topicals"
},
{
"id": "VAPES",
"name": "Vapes"
}
]
}
List the official product categories in Distru. These are global, system-defined reference records.
Request
GET /public/v1/official-product-categories
Responses
| Status | Description | Schema |
|---|---|---|
| 200 | A list of official product categories | OfficialProductCategories |
Order
Get an order
GET /orders/:id returns the expected order
GET /public/v1/orders/6ed2641e-db32-493f-98ff-695429ceeba4
content-type: application/json
accept: application/json
authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJhdWQiOiJEaXN0cnUiLCJleHAiOjE4MTgxNTYwNjYsImlhdCI6MTc4NjcwNjQ2NiwiaXNzIjoiRGlzdHJ1IiwianRpIjoiNTU1ODI3ZjctNjk2NC00NmQzLWIzM2ItNTkyNzUzNjMzMmU5IiwibW9iaWxlIjpmYWxzZSwibmJmIjoxNzg2NzA2NDY1LCJwbGF0Zm9ybSI6IkFQSSIsInN1YiI6IlVzZXI6MjgyOSIsInR5cCI6ImFjY2VzcyJ9._2Ijm0ZOgPmk6H-_P6d44EvSX8ChHWygKzND3AT1l8U
Response
200
content-type: application/json; charset=utf-8
cache-control: max-age=0, private, must-revalidate
b3: d62cd0ea4fcf51851830c8e3980cfdbb-89c1588b3d3ac68c-0
{
"data": {
"billing_location": null,
"biotrack_id": null,
"blaze_payment_type": null,
"charges": [],
"company": {
"id": "00000000-0000-0000-0000-00000000051c",
"name": "Company 2101",
"updated_datetime": "2026-08-14T11:21:06.409871Z"
},
"creator": {
"banned": false,
"deleted_at": null,
"email": "owner-2803@example.com",
"full_name": "FirstName5680 LastName5681",
"id": "00000000-0000-0000-0000-000000000b0e",
"role": {
"id": "00000000-0000-0000-0000-000000000b44",
"name": "Admin 2883"
}
},
"custom_data": [
{
"id": 71,
"name": "Custom Field 46",
"value": "Custom Field Value 1"
}
],
"delivery_datetime": null,
"due_datetime": "2026-08-14T11:21:06.427704Z",
"external_notes": null,
"id": "6ed2641e-db32-493f-98ff-695429ceeba4",
"inserted_datetime": "2026-08-14T11:21:06.428042Z",
"internal_notes": null,
"inventory_source": {
"address": "123 Fake Street, Beverly Hills, CA 90210, US",
"company_id": "00000000-0000-0000-0000-000000000838",
"id": "00000000-0000-0000-0000-00000000029f",
"license_id": null,
"license_number": null,
"name": "Place 669"
},
"items": [
{
"batch": {
"batch_number": null,
"id": "00000000-0000-0000-0000-000000000345",
"name": "B2576"
},
"compliance_quantity": null,
"cost_per_unit": null,
"cost_per_unit_default": null,
"id": "a551ccca-1c0f-44b2-994c-fe2aa4e3e347",
"is_sample": false,
"location": null,
"package": null,
"price": "10.000000000",
"price_base": "10",
"product": {
"id": "c604a720-b42f-4e3b-b5ea-ac48d4e43de3",
"name": "Product 2574",
"sku": "sku 2575",
"updated_datetime": "2026-08-14T11:21:06.436521Z"
},
"quantity": "15.000000000",
"returned_quantity": "0",
"total_cost_actual": null,
"total_cost_default": null
},
{
"batch": {
"batch_number": null,
"id": "00000000-0000-0000-0000-000000000346",
"name": "B2579"
},
"compliance_quantity": null,
"cost_per_unit": null,
"cost_per_unit_default": null,
"id": "8311734d-033b-477f-9b1d-9032489dff15",
"is_sample": false,
"location": null,
"package": null,
"price": "10.000000000",
"price_base": "10",
"product": {
"id": "32d0242c-2428-4acb-a0e4-e1922e633f63",
"name": "Product 2577",
"sku": "sku 2578",
"updated_datetime": "2026-08-14T11:21:06.447474Z"
},
"quantity": "10.000000000",
"returned_quantity": "0",
"total_cost_actual": null,
"total_cost_default": null
},
{
"batch": {
"batch_number": null,
"id": "00000000-0000-0000-0000-000000000347",
"name": "B2582"
},
"compliance_quantity": null,
"cost_per_unit": null,
"cost_per_unit_default": null,
"id": "3efb5e45-3393-4b8d-bea1-31c2cc9bf949",
"is_sample": false,
"location": null,
"package": null,
"price": "10.000000000",
"price_base": "10",
"product": {
"id": "4bcd400c-6fa0-4b0a-8b44-4ce9532bb789",
"name": "Product 2580",
"sku": "sku 2581",
"updated_datetime": "2026-08-14T11:21:06.457992Z"
},
"quantity": "5.000000000",
"returned_quantity": "0",
"total_cost_actual": null,
"total_cost_default": null
},
{
"batch": {
"batch_number": null,
"id": "00000000-0000-0000-0000-000000000348",
"name": "B2585"
},
"compliance_quantity": null,
"cost_per_unit": null,
"cost_per_unit_default": null,
"id": "a453bbd1-1c49-4249-aa9e-c9a47562e6c9",
"is_sample": false,
"location": null,
"package": null,
"price": "10.000000000",
"price_base": "10",
"product": {
"id": "1358fea8-d96a-463e-8b98-bac889fcef72",
"name": "Product 2583",
"sku": "sku 2584",
"updated_datetime": "2026-08-14T11:21:06.471259Z"
},
"quantity": "2.000000000",
"returned_quantity": "0",
"total_cost_actual": null,
"total_cost_default": null
}
],
"leaflink_order_number": null,
"metrc_transfer_id": null,
"order_datetime": "2026-08-14T11:21:06.427704Z",
"order_number": "SO-130",
"owner": {
"banned": false,
"deleted_at": null,
"email": "owner-2803@example.com",
"full_name": "FirstName5680 LastName5681",
"id": "00000000-0000-0000-0000-000000000b0e",
"role": {
"id": "00000000-0000-0000-0000-000000000b44",
"name": "Admin 2883"
}
},
"payment_term_name": null,
"shipping_location": null,
"status": "COMPLETED",
"total": "320.00",
"updated_datetime": "2026-08-14T11:21:06.487774Z"
}
}
GET /orders/:id returns cost data for order items
GET /public/v1/orders/85476077-4a55-46ae-a43c-2a1489e405ab
content-type: application/json
accept: application/json
authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJhdWQiOiJEaXN0cnUiLCJleHAiOjE4MTgxNTYwNzAsImlhdCI6MTc4NjcwNjQ3MCwiaXNzIjoiRGlzdHJ1IiwianRpIjoiMzA3ODMyZDMtN2UzYi00NmM5LWJiNDYtOTIxZWUzY2FjMTVhIiwibW9iaWxlIjpmYWxzZSwibmJmIjoxNzg2NzA2NDY5LCJwbGF0Zm9ybSI6IkFQSSIsInN1YiI6IlVzZXI6MzA3MiIsInR5cCI6ImFjY2VzcyJ9.bJgGmheNLyHtLJxvWjJdk41D5gGq1pQO2eJD3NRnhKU
Response
200
content-type: application/json; charset=utf-8
cache-control: max-age=0, private, must-revalidate
b3: 7bfe33351e7da45a7772f7eabb7c34a9-fd0eeb8bc8492fcc-0
{
"data": {
"billing_location": null,
"biotrack_id": null,
"blaze_payment_type": null,
"charges": [],
"company": {
"id": "00000000-0000-0000-0000-0000000005e8",
"name": "Company 2344",
"updated_datetime": "2026-08-14T11:21:10.826192Z"
},
"creator": {
"banned": false,
"deleted_at": null,
"email": "owner-3043@example.com",
"full_name": "FirstName6160 LastName6161",
"id": "00000000-0000-0000-0000-000000000c05",
"role": {
"id": "00000000-0000-0000-0000-000000000c42",
"name": "Admin 3137"
}
},
"custom_data": [],
"delivery_datetime": null,
"due_datetime": "2026-08-14T11:21:10.827405Z",
"external_notes": null,
"id": "85476077-4a55-46ae-a43c-2a1489e405ab",
"inserted_datetime": "2026-08-14T11:21:10.844859Z",
"internal_notes": null,
"inventory_source": null,
"items": [
{
"batch": {
"batch_number": null,
"id": "00000000-0000-0000-0000-0000000003d8",
"name": "B3019"
},
"compliance_quantity": null,
"cost_per_unit": "10.026",
"cost_per_unit_default": "5",
"id": "7b86ad37-931e-45a7-bb64-3e10909db843",
"is_sample": false,
"location": {
"address": "123 Fake Street, Beverly Hills, CA 90210, US",
"company_id": "00000000-0000-0000-0000-00000000092a",
"id": "00000000-0000-0000-0000-0000000002ed",
"license_id": null,
"name": "Place 747"
},
"package": null,
"price": "31828.000000000",
"price_base": "31828",
"product": {
"id": "62ce9fc8-b634-4898-a279-dcc7eed4a55b",
"name": "Product 3017",
"sku": "sku 3018",
"updated_datetime": "2026-08-14T11:21:10.763482Z"
},
"quantity": "2.000000000",
"returned_quantity": "0",
"total_cost_actual": "20.052",
"total_cost_default": "10"
}
],
"leaflink_order_number": null,
"metrc_transfer_id": null,
"order_datetime": "2026-08-14T11:21:10.827407Z",
"order_number": "SO-0000001",
"owner": null,
"payment_term_name": null,
"shipping_location": null,
"status": "PROCESSING",
"total": "63656.00",
"updated_datetime": "2026-08-14T11:21:10.844859Z"
}
}
Get a single order given the ID. Note: This endpoint returns eventually consistent data, with changes taking up to 1 second to propagate in responses.
Required permission: orders_permissions_view. The authenticated user must
also have access to the requested order under their team restrictions.
Request
GET /public/v1/orders/{id}
Parameters
| Parameter | Description | In | Type | Required | Default | Example |
|---|---|---|---|---|---|---|
| id | Order ID | path | string | true |
Responses
| Status | Description | Schema |
|---|---|---|
| 200 | A single order | Order |
Get orders
GET /public/v1/orders returns orders related to the company
GET /public/v1/orders
content-type: application/json
accept: application/json
authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJhdWQiOiJEaXN0cnUiLCJleHAiOjE4MTgxNTYwNzAsImlhdCI6MTc4NjcwNjQ3MCwiaXNzIjoiRGlzdHJ1IiwianRpIjoiZDBjZmY5ZTQtNWJlMy00MjkzLTg5YWQtYmIxZDFiMjcxMmJjIiwibW9iaWxlIjpmYWxzZSwibmJmIjoxNzg2NzA2NDY5LCJwbGF0Zm9ybSI6IkFQSSIsInN1YiI6IlVzZXI6MzA4MSIsInR5cCI6ImFjY2VzcyJ9.zhTuzPZ3n4NoAVJcT8EGshMwzXAtW3AFoe3xvsVTjUw
Response
200
content-type: application/json; charset=utf-8
cache-control: max-age=0, private, must-revalidate
b3: ef8af72543c9b762c9d5cb9dbd1462a4-75cad61a6f8bb1b5-0
{
"data": [
{
"billing_location": {
"address": "123 Fake Street, Beverly Hills, CA 90210, US",
"company_id": "00000000-0000-0000-0000-00000000092d",
"id": "00000000-0000-0000-0000-0000000002ee",
"license_id": null,
"license_number": null,
"name": "Place 748"
},
"biotrack_id": null,
"blaze_payment_type": "CASH",
"charges": [
{
"id": "0dc81647-babc-442e-a3ab-5ddc0abc8e19",
"name": "C1",
"percent": "10.0000",
"price": "1.00",
"tax": {
"id": "00000000-0000-0000-0000-00000000000e",
"name": "T1"
},
"type": "CHARGE",
"unit_type": "PERCENT"
}
],
"company": {
"id": "00000000-0000-0000-0000-0000000005ea",
"name": "Company 2347",
"updated_datetime": "2030-11-01T00:00:00.000000Z"
},
"creator": {
"banned": false,
"deleted_at": null,
"email": "user1@a.com",
"full_name": "John Foo",
"id": "00000000-0000-0000-0000-000000000c07",
"role": {
"id": "00000000-0000-0000-0000-000000000c44",
"name": "Admin 3139"
}
},
"custom_data": [
{
"id": 73,
"name": "Custom Field 48",
"value": "Custom Field Value 1"
}
],
"delivery_datetime": "2020-01-01T00:00:00.000000Z",
"due_datetime": "2020-01-01T00:00:01.000000Z",
"external_notes": null,
"id": "62d725ca-d524-480a-94cf-2ad3bf573f76",
"inserted_datetime": "2020-01-01T00:00:03.000000Z",
"internal_notes": "Internal notes for this order",
"inventory_source": {
"address": "123 Fake Street, Beverly Hills, CA 90210, US",
"company_id": "00000000-0000-0000-0000-00000000092d",
"id": "00000000-0000-0000-0000-0000000002ee",
"license_id": null,
"license_number": null,
"name": "Place 748"
},
"items": [
{
"batch": {
"batch_number": "UID1",
"id": "00000000-0000-0000-0000-0000000003d9",
"name": "B1"
},
"compliance_quantity": "10.0000",
"cost_per_unit": null,
"cost_per_unit_default": null,
"id": "1492ead7-e92b-4bba-bc9f-2e49e9c8d1d3",
"is_sample": true,
"location": {
"address": "123 Fake Street, Beverly Hills, CA 90210, US",
"company_id": "00000000-0000-0000-0000-00000000092d",
"id": "00000000-0000-0000-0000-0000000002ee",
"license_id": null,
"name": "Place 748"
},
"package": {
"batch_number": "B1",
"compliance_label": "ABCDEF012345670000000183",
"id": "00000000-0000-0000-0000-00000000005f",
"metrc_label": "ABCDEF012345670000000183",
"status": "active"
},
"price": "10.000000000",
"price_base": "10",
"product": {
"id": "3b52ac25-733f-432c-b1a0-759e138ab32c",
"name": "P1",
"sku": "SKU1",
"updated_datetime": "2023-11-02T00:00:00.000000Z"
},
"quantity": "1.000000000",
"returned_quantity": "0",
"total_cost_actual": null,
"total_cost_default": null
}
],
"leaflink_order_number": "3dde2959-ed02-47fb-b338-5b48f5646d49",
"metrc_transfer_id": 1,
"order_datetime": "2020-01-01T00:00:02.000000Z",
"order_number": "SO-123",
"owner": {
"banned": false,
"deleted_at": null,
"email": "user2@a.com",
"full_name": "John Bar",
"id": "00000000-0000-0000-0000-000000000c08",
"role": {
"id": "00000000-0000-0000-0000-000000000c45",
"name": "Admin 3140"
}
},
"payment_term_name": null,
"shipping_location": {
"address": "123 Fake Street, Beverly Hills, CA 90210, US",
"company_id": "00000000-0000-0000-0000-00000000092d",
"id": "00000000-0000-0000-0000-0000000002ee",
"license_id": null,
"license_number": null,
"name": "Place 748"
},
"status": "COMPLETED",
"total": "11.00",
"updated_datetime": "2020-01-01T00:00:04.000000Z"
}
],
"next_page": null
}
GET /public/v1/orders returns cost/returned_quantity data for order items
GET /public/v1/orders
content-type: application/json
accept: application/json
authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJhdWQiOiJEaXN0cnUiLCJleHAiOjE4MTgxNTYwNjcsImlhdCI6MTc4NjcwNjQ2NywiaXNzIjoiRGlzdHJ1IiwianRpIjoiOWY4YzczYjktMGEzYy00OTZlLWExNWMtOGJjNWRhODBlYWZmIiwibW9iaWxlIjpmYWxzZSwibmJmIjoxNzg2NzA2NDY2LCJwbGF0Zm9ybSI6IkFQSSIsInN1YiI6IlVzZXI6Mjg4MyIsInR5cCI6ImFjY2VzcyJ9.GPIq1srnPToWSQzOutq8pi6aod4eVGj5-IBlDQb9CuU
Response
200
content-type: application/json; charset=utf-8
cache-control: max-age=0, private, must-revalidate
b3: b80f0dffc9877eb57e6d9ab5a9756cca-75f774a6fbfa03dc-0
{
"data": [
{
"billing_location": null,
"biotrack_id": null,
"blaze_payment_type": null,
"charges": [],
"company": {
"id": "00000000-0000-0000-0000-00000000053c",
"name": "Company 2149",
"updated_datetime": "2026-08-14T11:21:07.123601Z"
},
"creator": {
"banned": false,
"deleted_at": null,
"email": "owner-2860@example.com",
"full_name": "FirstName5794 LastName5795",
"id": "00000000-0000-0000-0000-000000000b4a",
"role": {
"id": "00000000-0000-0000-0000-000000000b85",
"name": "Admin 2948"
}
},
"custom_data": [],
"delivery_datetime": null,
"due_datetime": "2026-08-14T11:21:07.124747Z",
"external_notes": null,
"id": "5185ce7b-b6d3-449c-92df-646961322759",
"inserted_datetime": "2026-08-14T11:21:07.136370Z",
"internal_notes": null,
"inventory_source": null,
"items": [
{
"batch": {
"batch_number": null,
"id": "00000000-0000-0000-0000-000000000358",
"name": "B2635"
},
"compliance_quantity": null,
"cost_per_unit": "10.026",
"cost_per_unit_default": "5",
"id": "1e95a3b4-d3ef-4034-9ccc-be3343c36405",
"is_sample": false,
"location": {
"address": "123 Fake Street, Beverly Hills, CA 90210, US",
"company_id": "00000000-0000-0000-0000-000000000866",
"id": "00000000-0000-0000-0000-0000000002b3",
"license_id": null,
"name": "Place 689"
},
"package": null,
"price": "132753.000000000",
"price_base": "132753",
"product": {
"id": "c5e19d6f-c4ac-494f-9ebf-8e656037dc29",
"name": "Product 2633",
"sku": "sku 2634",
"updated_datetime": "2026-08-14T11:21:07.067382Z"
},
"quantity": "2.000000000",
"returned_quantity": "2",
"total_cost_actual": "20.052",
"total_cost_default": "10"
}
],
"leaflink_order_number": null,
"metrc_transfer_id": null,
"order_datetime": "2026-08-14T11:21:07.124747Z",
"order_number": "SO-0000001",
"owner": null,
"payment_term_name": null,
"shipping_location": null,
"status": "PROCESSING",
"total": "265506.00",
"updated_datetime": "2026-08-14T11:21:07.136370Z"
}
],
"next_page": null
}
GET /public/v1/orders allows filtering by buyer company_id
GET /public/v1/orders?company_id=00000000-0000-0000-0000-0000000001c4
content-type: application/json
accept: application/json
authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJhdWQiOiJEaXN0cnUiLCJleHAiOjE4MTgxNTYwNTksImlhdCI6MTc4NjcwNjQ1OSwiaXNzIjoiRGlzdHJ1IiwianRpIjoiYjI0MjU1NWMtMjFhZi00ODQ2LWFmYzctOWE3ZmE5NmVlNGZkIiwibW9iaWxlIjpmYWxzZSwibmJmIjoxNzg2NzA2NDU4LCJwbGF0Zm9ybSI6IkFQSSIsInN1YiI6IlVzZXI6MTE5OSIsInR5cCI6ImFjY2VzcyJ9.qs0SCeSsQAj1vaF4o06GIyzmnM9M9arNi-GUbFMcR3c
Response
200
content-type: application/json; charset=utf-8
cache-control: max-age=0, private, must-revalidate
b3: 52bd6de7be855e3cf425b71445c1803d-2b069457eaae881f-0
{
"data": [
{
"billing_location": null,
"biotrack_id": null,
"blaze_payment_type": null,
"charges": [],
"company": {
"id": "00000000-0000-0000-0000-0000000001c4",
"name": "Company 952",
"updated_datetime": "2026-08-14T11:20:59.367761Z"
},
"creator": {
"banned": false,
"deleted_at": null,
"email": "owner-1215@example.com",
"full_name": "FirstName2443 LastName2445",
"id": "00000000-0000-0000-0000-0000000004c0",
"role": {
"id": "00000000-0000-0000-0000-0000000004f0",
"name": "Admin 1263"
}
},
"custom_data": [],
"delivery_datetime": null,
"due_datetime": "2026-08-14T11:20:59.428650Z",
"external_notes": null,
"id": "d2aec243-4492-41ed-854a-58c4c89ba189",
"inserted_datetime": "2026-08-14T11:20:59.429339Z",
"internal_notes": null,
"inventory_source": {
"address": "123 Fake Street, Beverly Hills, CA 90210, US",
"company_id": "00000000-0000-0000-0000-0000000003b0",
"id": "00000000-0000-0000-0000-00000000013b",
"license_id": null,
"license_number": null,
"name": "Place 314"
},
"items": [
{
"batch": {
"batch_number": null,
"id": "00000000-0000-0000-0000-0000000000e4",
"name": "B774"
},
"compliance_quantity": null,
"cost_per_unit": null,
"cost_per_unit_default": null,
"id": "771ecde8-4c44-4ba9-ba17-61de5d43b41a",
"is_sample": false,
"location": null,
"package": null,
"price": "10.000000000",
"price_base": "10",
"product": {
"id": "251062f8-d9e1-4385-8272-a82770a22c20",
"name": "Product 771",
"sku": "sku 772",
"updated_datetime": "2026-08-14T11:20:59.450258Z"
},
"quantity": "15.000000000",
"returned_quantity": "0",
"total_cost_actual": null,
"total_cost_default": null
},
{
"batch": {
"batch_number": null,
"id": "00000000-0000-0000-0000-0000000000e8",
"name": "B786"
},
"compliance_quantity": null,
"cost_per_unit": null,
"cost_per_unit_default": null,
"id": "c1de4665-33a5-4460-8a4d-19f24aba4a13",
"is_sample": false,
"location": null,
"package": null,
"price": "10.000000000",
"price_base": "10",
"product": {
"id": "6654ceb4-f2e8-47d0-8ab7-6bdee07dcc14",
"name": "Product 781",
"sku": "sku 782",
"updated_datetime": "2026-08-14T11:20:59.475587Z"
},
"quantity": "10.000000000",
"returned_quantity": "0",
"total_cost_actual": null,
"total_cost_default": null
},
{
"batch": {
"batch_number": null,
"id": "00000000-0000-0000-0000-0000000000ef",
"name": "B803"
},
"compliance_quantity": null,
"cost_per_unit": null,
"cost_per_unit_default": null,
"id": "a45274f4-645d-4f8c-b715-004bbe3689c4",
"is_sample": false,
"location": null,
"package": null,
"price": "10.000000000",
"price_base": "10",
"product": {
"id": "fe7e92a1-a9f1-4940-86fa-4153be294281",
"name": "Product 801",
"sku": "sku 802",
"updated_datetime": "2026-08-14T11:20:59.501764Z"
},
"quantity": "5.000000000",
"returned_quantity": "0",
"total_cost_actual": null,
"total_cost_default": null
},
{
"batch": {
"batch_number": null,
"id": "00000000-0000-0000-0000-0000000000f4",
"name": "B816"
},
"compliance_quantity": null,
"cost_per_unit": null,
"cost_per_unit_default": null,
"id": "d9287b8e-b9bb-4bd8-81bd-45f6d30259f6",
"is_sample": false,
"location": null,
"package": null,
"price": "10.000000000",
"price_base": "10",
"product": {
"id": "e44a9d07-be7e-4a37-8f5e-6a52dd2f2dcb",
"name": "Product 813",
"sku": "sku 814",
"updated_datetime": "2026-08-14T11:20:59.525398Z"
},
"quantity": "2.000000000",
"returned_quantity": "0",
"total_cost_actual": null,
"total_cost_default": null
}
],
"leaflink_order_number": null,
"metrc_transfer_id": null,
"order_datetime": "2020-01-01T12:00:00.000000Z",
"order_number": "SO-61",
"owner": {
"banned": false,
"deleted_at": null,
"email": "owner-1215@example.com",
"full_name": "FirstName2443 LastName2445",
"id": "00000000-0000-0000-0000-0000000004c0",
"role": {
"id": "00000000-0000-0000-0000-0000000004f0",
"name": "Admin 1263"
}
},
"payment_term_name": null,
"shipping_location": null,
"status": "COMPLETED",
"total": "320.00",
"updated_datetime": "2026-08-14T11:20:59.571642Z"
}
],
"next_page": null
}
GET /public/v1/orders allows filtering by several statuses
GET /public/v1/orders?status[]=COMPLETED&status[]=CANCELED
content-type: application/json
accept: application/json
authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJhdWQiOiJEaXN0cnUiLCJleHAiOjE4MTgxNTYwNjcsImlhdCI6MTc4NjcwNjQ2NywiaXNzIjoiRGlzdHJ1IiwianRpIjoiZTNkNmYzOWItOTE0My00ZTQyLWE4MDMtYjRlMjViOGI4ZjA5IiwibW9iaWxlIjpmYWxzZSwibmJmIjoxNzg2NzA2NDY2LCJwbGF0Zm9ybSI6IkFQSSIsInN1YiI6IlVzZXI6Mjk1MiIsInR5cCI6ImFjY2VzcyJ9.5HrJmmnRuFBS0Q_suvyc-Kecy5nAcUeVF_nvTRYqL-I
Response
200
content-type: application/json; charset=utf-8
cache-control: max-age=0, private, must-revalidate
b3: e55fa1953a5c29ea7cd90d7643d18c57-ec4eed5e4960bcd2-0
{
"data": [
{
"billing_location": null,
"biotrack_id": null,
"blaze_payment_type": null,
"charges": [],
"company": {
"id": "00000000-0000-0000-0000-000000000593",
"name": "Company 2242",
"updated_datetime": "2026-08-14T11:21:08.105773Z"
},
"creator": {
"banned": false,
"deleted_at": null,
"email": "owner-2935@example.com",
"full_name": "FirstName5944 LastName5945",
"id": "00000000-0000-0000-0000-000000000b95",
"role": {
"id": "00000000-0000-0000-0000-000000000bcf",
"name": "Admin 3022"
}
},
"custom_data": [],
"delivery_datetime": null,
"due_datetime": "2026-08-14T11:21:08.119557Z",
"external_notes": null,
"id": "3e7b94d4-5161-48ee-be87-d043d920f70d",
"inserted_datetime": "2026-08-14T11:21:08.119919Z",
"internal_notes": null,
"inventory_source": {
"address": "123 Fake Street, Beverly Hills, CA 90210, US",
"company_id": "00000000-0000-0000-0000-0000000008b3",
"id": "00000000-0000-0000-0000-0000000002ca",
"license_id": null,
"license_number": null,
"name": "Place 712"
},
"items": [
{
"batch": {
"batch_number": null,
"id": "00000000-0000-0000-0000-0000000003a2",
"name": "B2855"
},
"compliance_quantity": null,
"cost_per_unit": null,
"cost_per_unit_default": null,
"id": "175b6ad6-e9c1-40a8-b886-7a8139da2e6a",
"is_sample": false,
"location": null,
"package": null,
"price": "10.000000000",
"price_base": "10",
"product": {
"id": "f196b8cc-4277-497c-b87c-6cbeb3a4eba9",
"name": "Product 2853",
"sku": "sku 2854",
"updated_datetime": "2026-08-14T11:21:08.127460Z"
},
"quantity": "15.000000000",
"returned_quantity": "0",
"total_cost_actual": null,
"total_cost_default": null
},
{
"batch": {
"batch_number": null,
"id": "00000000-0000-0000-0000-0000000003a3",
"name": "B2858"
},
"compliance_quantity": null,
"cost_per_unit": null,
"cost_per_unit_default": null,
"id": "b5298906-c2a9-4f9b-94b4-1e669f62ce84",
"is_sample": false,
"location": null,
"package": null,
"price": "10.000000000",
"price_base": "10",
"product": {
"id": "21e21d1d-8c51-461e-8f48-79fd9fc19331",
"name": "Product 2856",
"sku": "sku 2857",
"updated_datetime": "2026-08-14T11:21:08.135130Z"
},
"quantity": "10.000000000",
"returned_quantity": "0",
"total_cost_actual": null,
"total_cost_default": null
},
{
"batch": {
"batch_number": null,
"id": "00000000-0000-0000-0000-0000000003a4",
"name": "B2861"
},
"compliance_quantity": null,
"cost_per_unit": null,
"cost_per_unit_default": null,
"id": "6e3bf156-f4c5-497a-a3d2-523cd3a95039",
"is_sample": false,
"location": null,
"package": null,
"price": "10.000000000",
"price_base": "10",
"product": {
"id": "f09d5334-d6be-4f2c-866a-f960355db49b",
"name": "Product 2859",
"sku": "sku 2860",
"updated_datetime": "2026-08-14T11:21:08.143226Z"
},
"quantity": "5.000000000",
"returned_quantity": "0",
"total_cost_actual": null,
"total_cost_default": null
},
{
"batch": {
"batch_number": null,
"id": "00000000-0000-0000-0000-0000000003a5",
"name": "B2864"
},
"compliance_quantity": null,
"cost_per_unit": null,
"cost_per_unit_default": null,
"id": "77b5b8b0-da5b-4257-aebb-321b8af30161",
"is_sample": false,
"location": null,
"package": null,
"price": "10.000000000",
"price_base": "10",
"product": {
"id": "1db506ab-762c-4ab3-abda-cf9ddc9ac438",
"name": "Product 2862",
"sku": "sku 2863",
"updated_datetime": "2026-08-14T11:21:08.151023Z"
},
"quantity": "2.000000000",
"returned_quantity": "0",
"total_cost_actual": null,
"total_cost_default": null
}
],
"leaflink_order_number": null,
"metrc_transfer_id": null,
"order_datetime": "2020-01-01T12:30:00.000000Z",
"order_number": "SO-153",
"owner": {
"banned": false,
"deleted_at": null,
"email": "owner-2935@example.com",
"full_name": "FirstName5944 LastName5945",
"id": "00000000-0000-0000-0000-000000000b95",
"role": {
"id": "00000000-0000-0000-0000-000000000bcf",
"name": "Admin 3022"
}
},
"payment_term_name": null,
"shipping_location": null,
"status": "CANCELED",
"total": "320.00",
"updated_datetime": "2026-08-14T11:21:08.165647Z"
},
{
"billing_location": null,
"biotrack_id": null,
"blaze_payment_type": null,
"charges": [],
"company": {
"id": "00000000-0000-0000-0000-00000000058d",
"name": "Company 2236",
"updated_datetime": "2026-08-14T11:21:08.035658Z"
},
"creator": {
"banned": false,
"deleted_at": null,
"email": "owner-2931@example.com",
"full_name": "FirstName5936 LastName5937",
"id": "00000000-0000-0000-0000-000000000b91",
"role": {
"id": "00000000-0000-0000-0000-000000000bcb",
"name": "Admin 3018"
}
},
"custom_data": [],
"delivery_datetime": null,
"due_datetime": "2026-08-14T11:21:08.048461Z",
"external_notes": null,
"id": "0eca1b1c-6f3f-4312-a247-76d08d170a04",
"inserted_datetime": "2026-08-14T11:21:08.048738Z",
"internal_notes": null,
"inventory_source": {
"address": "123 Fake Street, Beverly Hills, CA 90210, US",
"company_id": "00000000-0000-0000-0000-0000000008b3",
"id": "00000000-0000-0000-0000-0000000002c9",
"license_id": null,
"license_number": null,
"name": "Place 711"
},
"items": [
{
"batch": {
"batch_number": null,
"id": "00000000-0000-0000-0000-00000000039d",
"name": "B2840"
},
"compliance_quantity": null,
"cost_per_unit": null,
"cost_per_unit_default": null,
"id": "17fa82f6-61b7-4d14-b160-6355287c1ae0",
"is_sample": false,
"location": null,
"package": null,
"price": "10.000000000",
"price_base": "10",
"product": {
"id": "148b93d9-0785-4828-b390-4318a3c1e549",
"name": "Product 2838",
"sku": "sku 2839",
"updated_datetime": "2026-08-14T11:21:08.055366Z"
},
"quantity": "15.000000000",
"returned_quantity": "0",
"total_cost_actual": null,
"total_cost_default": null
},
{
"batch": {
"batch_number": null,
"id": "00000000-0000-0000-0000-00000000039e",
"name": "B2843"
},
"compliance_quantity": null,
"cost_per_unit": null,
"cost_per_unit_default": null,
"id": "71fba596-fcaf-42b0-a8ec-ff0225725c1a",
"is_sample": false,
"location": null,
"package": null,
"price": "10.000000000",
"price_base": "10",
"product": {
"id": "bdf2624a-1877-4dbb-b116-7ab844ecc67b",
"name": "Product 2841",
"sku": "sku 2842",
"updated_datetime": "2026-08-14T11:21:08.061747Z"
},
"quantity": "10.000000000",
"returned_quantity": "0",
"total_cost_actual": null,
"total_cost_default": null
},
{
"batch": {
"batch_number": null,
"id": "00000000-0000-0000-0000-00000000039f",
"name": "B2846"
},
"compliance_quantity": null,
"cost_per_unit": null,
"cost_per_unit_default": null,
"id": "11ac4612-1976-4ac7-9ce3-7eee1132121c",
"is_sample": false,
"location": null,
"package": null,
"price": "10.000000000",
"price_base": "10",
"product": {
"id": "154d20f1-a1ed-48b2-b97d-e1c01b215e6a",
"name": "Product 2844",
"sku": "sku 2845",
"updated_datetime": "2026-08-14T11:21:08.079735Z"
},
"quantity": "5.000000000",
"returned_quantity": "0",
"total_cost_actual": null,
"total_cost_default": null
},
{
"batch": {
"batch_number": null,
"id": "00000000-0000-0000-0000-0000000003a0",
"name": "B2849"
},
"compliance_quantity": null,
"cost_per_unit": null,
"cost_per_unit_default": null,
"id": "4947eb3a-21df-4a03-bd0a-f8323e576874",
"is_sample": false,
"location": null,
"package": null,
"price": "10.000000000",
"price_base": "10",
"product": {
"id": "f0d7e3a0-5fe5-45e8-a764-a4a7dddbcf0c",
"name": "Product 2847",
"sku": "sku 2848",
"updated_datetime": "2026-08-14T11:21:08.086700Z"
},
"quantity": "2.000000000",
"returned_quantity": "0",
"total_cost_actual": null,
"total_cost_default": null
}
],
"leaflink_order_number": null,
"metrc_transfer_id": null,
"order_datetime": "2020-01-01T12:20:00.000000Z",
"order_number": "SO-152",
"owner": {
"banned": false,
"deleted_at": null,
"email": "owner-2931@example.com",
"full_name": "FirstName5936 LastName5937",
"id": "00000000-0000-0000-0000-000000000b91",
"role": {
"id": "00000000-0000-0000-0000-000000000bcb",
"name": "Admin 3018"
}
},
"payment_term_name": null,
"shipping_location": null,
"status": "COMPLETED",
"total": "320.00",
"updated_datetime": "2026-08-14T11:21:08.098785Z"
},
{
"billing_location": null,
"biotrack_id": null,
"blaze_payment_type": null,
"charges": [],
"company": {
"id": "00000000-0000-0000-0000-000000000581",
"name": "Company 2224",
"updated_datetime": "2026-08-14T11:21:07.903721Z"
},
"creator": {
"banned": false,
"deleted_at": null,
"email": "owner-2923@example.com",
"full_name": "FirstName5920 LastName5921",
"id": "00000000-0000-0000-0000-000000000b89",
"role": {
"id": "00000000-0000-0000-0000-000000000bc3",
"name": "Admin 3010"
}
},
"custom_data": [],
"delivery_datetime": null,
"due_datetime": "2026-08-14T11:21:07.920097Z",
"external_notes": null,
"id": "f65a6638-467e-4b12-9e6a-c29a19f11a6a",
"inserted_datetime": "2026-08-14T11:21:07.920391Z",
"internal_notes": null,
"inventory_source": {
"address": "123 Fake Street, Beverly Hills, CA 90210, US",
"company_id": "00000000-0000-0000-0000-0000000008b3",
"id": "00000000-0000-0000-0000-0000000002c7",
"license_id": null,
"license_number": null,
"name": "Place 709"
},
"items": [
{
"batch": {
"batch_number": null,
"id": "00000000-0000-0000-0000-000000000393",
"name": "B2810"
},
"compliance_quantity": null,
"cost_per_unit": null,
"cost_per_unit_default": null,
"id": "6fd0a735-854c-4005-b830-16294f56a0b9",
"is_sample": false,
"location": null,
"package": null,
"price": "10.000000000",
"price_base": "10",
"product": {
"id": "f34d01c5-c89c-46e8-a5d1-d53464b5aa0c",
"name": "Product 2808",
"sku": "sku 2809",
"updated_datetime": "2026-08-14T11:21:07.927955Z"
},
"quantity": "15.000000000",
"returned_quantity": "0",
"total_cost_actual": null,
"total_cost_default": null
},
{
"batch": {
"batch_number": null,
"id": "00000000-0000-0000-0000-000000000394",
"name": "B2813"
},
"compliance_quantity": null,
"cost_per_unit": null,
"cost_per_unit_default": null,
"id": "ce54c663-0108-4f10-9d6d-4dc599c892ae",
"is_sample": false,
"location": null,
"package": null,
"price": "10.000000000",
"price_base": "10",
"product": {
"id": "f13f96b8-e837-4d28-ac05-ac26f59f3bd2",
"name": "Product 2811",
"sku": "sku 2812",
"updated_datetime": "2026-08-14T11:21:07.937478Z"
},
"quantity": "10.000000000",
"returned_quantity": "0",
"total_cost_actual": null,
"total_cost_default": null
},
{
"batch": {
"batch_number": null,
"id": "00000000-0000-0000-0000-000000000395",
"name": "B2816"
},
"compliance_quantity": null,
"cost_per_unit": null,
"cost_per_unit_default": null,
"id": "acc89867-6f84-4eab-a973-e3496c8b3823",
"is_sample": false,
"location": null,
"package": null,
"price": "10.000000000",
"price_base": "10",
"product": {
"id": "63af20a8-0289-4057-936a-d28a4516a9a5",
"name": "Product 2814",
"sku": "sku 2815",
"updated_datetime": "2026-08-14T11:21:07.945679Z"
},
"quantity": "5.000000000",
"returned_quantity": "0",
"total_cost_actual": null,
"total_cost_default": null
},
{
"batch": {
"batch_number": null,
"id": "00000000-0000-0000-0000-000000000396",
"name": "B2819"
},
"compliance_quantity": null,
"cost_per_unit": null,
"cost_per_unit_default": null,
"id": "aa6ea18d-6b70-41f4-9c4e-b3b6091814cd",
"is_sample": false,
"location": null,
"package": null,
"price": "10.000000000",
"price_base": "10",
"product": {
"id": "9b18ed14-c9d2-4220-80d1-944d0fd058c8",
"name": "Product 2817",
"sku": "sku 2818",
"updated_datetime": "2026-08-14T11:21:07.953223Z"
},
"quantity": "2.000000000",
"returned_quantity": "0",
"total_cost_actual": null,
"total_cost_default": null
}
],
"leaflink_order_number": null,
"metrc_transfer_id": null,
"order_datetime": "2020-01-01T12:00:00.000000Z",
"order_number": "SO-150",
"owner": {
"banned": false,
"deleted_at": null,
"email": "owner-2923@example.com",
"full_name": "FirstName5920 LastName5921",
"id": "00000000-0000-0000-0000-000000000b89",
"role": {
"id": "00000000-0000-0000-0000-000000000bc3",
"name": "Admin 3010"
}
},
"payment_term_name": null,
"shipping_location": null,
"status": "COMPLETED",
"total": "320.00",
"updated_datetime": "2026-08-14T11:21:07.966389Z"
}
],
"next_page": null
}
Get orders sorted by Order Date descendingly date and filtered by various attributes
Note: The page size for this endpoint is 500 orders per page.
Required permission: orders_permissions_view. Results are filtered to only
include orders the authenticated user can access under their team
restrictions.
Request
GET /public/v1/orders
Parameters
| Parameter | Description | In | Type | Required | Default | Example |
|---|---|---|---|---|---|---|
| delivery_datetime | Filter orders by the delivery datetime | query | string | false | 2022-07-10T00:00:00Z, | |
| due_datetime | Filter orders by the due datetime | query | string | false | ,2022-07-10T00:00:00Z | |
| inserted_datetime | Filter orders by their creation datetime | query | string | false | 2022-07-10T00:00:00Z, | |
| order_datetime | Filter orders by the order datetime | query | string | false | 2022-07-10T00:00:00Z,2022-07-11T00:00:00Z | |
| page | Pagination information | query | number | false | ?page[number]=1 | |
| status | Filter orders by their status. Accepted values are "PENDING", "PROCESSING", "READY_TO_SHIP", "DELIVERING", "DELIVERED", "COMPLETED" and "CANCELED". | query | array | false | ["PENDING","PROCESSING"] | |
| updated_datetime | Filter orders by the datetime they were most recently modified | query | string | false | ,2022-07-10T00:00:00Z | |
| company_id | Filter orders by buyer company (company relationship ID — same UUID as each order's company.id and GET /public/v1/companies). |
|||||
| query | string | false | 550e8400-e29b-41d4-a716-446655440000 |
Responses
| Status | Description | Schema |
|---|---|---|
| 200 | A list of orders | Orders |
| 404 | Not Found |
Upsert an order
POST /public/v1/orders creates an order (with product-tracked item)
POST /public/v1/orders
content-type: application/json
accept: application/json
authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJhdWQiOiJEaXN0cnUiLCJleHAiOjE4MTgxNTYwNjIsImlhdCI6MTc4NjcwNjQ2MiwiaXNzIjoiRGlzdHJ1IiwianRpIjoiNTYxNWM0MTQtMzAxOS00MGY4LTg1ZmYtYWM5NGE4MWVkMTQzIiwibW9iaWxlIjpmYWxzZSwibmJmIjoxNzg2NzA2NDYxLCJwbGF0Zm9ybSI6IkFQSSIsInN1YiI6IlVzZXI6MjIyMyIsInR5cCI6ImFjY2VzcyJ9.EDyFyrgIajovLfBHLrbuhcXCWPxkmUSl4RX9JdpyhHI
{
"billing_location_id": "00000000-0000-0000-0000-0000000001e6",
"charges": [
{
"name": "C1",
"percent": "10.0000",
"type": "CHARGE",
"unit_type": "PERCENT"
},
{
"name": "C2",
"price": "-5.0000",
"type": "DISCOUNT",
"unit_type": "PRICE"
}
],
"company_id": "00000000-0000-0000-0000-00000000038c",
"delivery_datetime": "2020-01-01T00:00:00.000000Z",
"due_datetime": "2020-01-01T00:00:01.000000Z",
"external_notes": "Thank you for ordering!",
"internal_notes": "Internal notes for this order",
"items": [
{
"location_id": "00000000-0000-0000-0000-0000000001e4",
"price_base": "10.000000000",
"product_id": "0abcb54c-faa6-4eb8-a979-0ae5066ba89e",
"quantity": "1.000000000"
}
],
"order_datetime": "2020-01-01T00:00:02.000000Z",
"owner_id": "00000000-0000-0000-0000-0000000008af",
"shipping_location_id": "00000000-0000-0000-0000-0000000001e6",
"status": "PROCESSING"
}
Response
200
content-type: application/json; charset=utf-8
cache-control: max-age=0, private, must-revalidate
b3: 24ae960713df16f4753a2c374d1d9502-16b3dfa01d7061ad-0
{
"data": {
"billing_location": {
"address": "123 Fake Street, Beverly Hills, CA 90210, US",
"company_id": "00000000-0000-0000-0000-000000000650",
"id": "00000000-0000-0000-0000-0000000001e6",
"license_id": null,
"license_number": null,
"name": "Place 484"
},
"biotrack_id": null,
"blaze_payment_type": null,
"charges": [
{
"id": "d6b54dab-ec04-4e4e-b520-1b74fa20d6d5",
"name": "C1",
"percent": "10.0000",
"price": "1.00",
"type": "CHARGE",
"unit_type": "PERCENT"
},
{
"id": "0829e1f9-b85b-4ad9-b6de-300f33f3e443",
"name": "C2",
"percent": null,
"price": "-5.00",
"type": "DISCOUNT",
"unit_type": "PRICE"
}
],
"company": {
"id": "00000000-0000-0000-0000-00000000038c",
"name": "Company 1612",
"updated_datetime": "2026-08-14T11:21:02.835403Z"
},
"creator": {
"banned": false,
"deleted_at": null,
"email": "user1@a.com",
"full_name": "John Foo",
"id": "00000000-0000-0000-0000-0000000008af",
"role": {
"id": "00000000-0000-0000-0000-0000000008ee",
"name": "Admin 2285"
}
},
"custom_data": [
{
"id": 66,
"name": "Custom Field 41",
"value": null
}
],
"delivery_datetime": "2020-01-01T00:00:00.000000Z",
"due_datetime": "2020-01-01T00:00:01.000000Z",
"external_notes": "Thank you for ordering!",
"id": "27ab9928-1c41-48b1-8313-b61c848a0d66",
"inserted_datetime": "2026-08-14T11:21:03.012197Z",
"internal_notes": "Internal notes for this order",
"inventory_source": null,
"items": [
{
"batch": {
"batch_number": null,
"id": "00000000-0000-0000-0000-00000000021c",
"name": "B1"
},
"compliance_quantity": null,
"cost_per_unit": null,
"cost_per_unit_default": null,
"id": "5542b508-6769-4252-9d4e-0173eb471376",
"is_sample": false,
"location": {
"address": "123 Fake Street, Beverly Hills, CA 90210, US",
"company_id": "00000000-0000-0000-0000-00000000064b",
"id": "00000000-0000-0000-0000-0000000001e4",
"license_id": "00000000-0000-0000-0000-000000000062",
"name": "Place 482"
},
"package": null,
"price": "10.000000000",
"price_base": "10.000000000",
"product": {
"id": "0abcb54c-faa6-4eb8-a979-0ae5066ba89e",
"name": "P1",
"sku": "SKU1",
"updated_datetime": "2026-08-14T11:21:02.973916Z"
},
"quantity": "1.000000000",
"returned_quantity": "0",
"total_cost_actual": null,
"total_cost_default": null
}
],
"leaflink_order_number": null,
"metrc_transfer_id": null,
"order_datetime": "2020-01-01T00:00:02.000000Z",
"order_number": "SO-0000001",
"owner": {
"banned": false,
"deleted_at": null,
"email": "user1@a.com",
"full_name": "John Foo",
"id": "00000000-0000-0000-0000-0000000008af",
"role": {
"id": "00000000-0000-0000-0000-0000000008ee",
"name": "Admin 2285"
}
},
"payment_term_name": null,
"shipping_location": {
"address": "123 Fake Street, Beverly Hills, CA 90210, US",
"company_id": "00000000-0000-0000-0000-000000000650",
"id": "00000000-0000-0000-0000-0000000001e6",
"license_id": null,
"license_number": null,
"name": "Place 484"
},
"status": "PROCESSING",
"total": "6.00",
"updated_datetime": "2026-08-14T11:21:03.048451Z"
}
}
POST /public/v1/orders creates an order (with product-tracked item) for a Blaze retailer, fails if payment type not specified
POST /public/v1/orders
content-type: application/json
accept: application/json
authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJhdWQiOiJEaXN0cnUiLCJleHAiOjE4MTgxNTYwNjYsImlhdCI6MTc4NjcwNjQ2NiwiaXNzIjoiRGlzdHJ1IiwianRpIjoiNjE4ZTlhYTMtNTE1Ny00OTM3LTgxZTYtMTE0NzhhZmMyODNhIiwibW9iaWxlIjpmYWxzZSwibmJmIjoxNzg2NzA2NDY1LCJwbGF0Zm9ybSI6IkFQSSIsInN1YiI6IlVzZXI6Mjg0MyIsInR5cCI6ImFjY2VzcyJ9.ANCA9ak5s_RchGo_MJxocukpNCR3hsni4lyrCigLsGE
{
"billing_location_id": "00000000-0000-0000-0000-0000000002a3",
"charges": [],
"company_id": "00000000-0000-0000-0000-000000000522",
"delivery_datetime": "2020-01-01T00:00:00.000000Z",
"due_datetime": "2020-01-01T00:00:01.000000Z",
"items": [
{
"location_id": "00000000-0000-0000-0000-0000000002a0",
"price_base": "10.000000000",
"product_id": "709ca693-deeb-43c6-bb00-1c3b81381a2b",
"quantity": "1.000000000"
}
],
"order_datetime": "2020-01-01T00:00:02.000000Z",
"shipping_location_id": "00000000-0000-0000-0000-0000000002a3",
"status": "PROCESSING"
}
Response
400
cache-control: max-age=0, private, must-revalidate
content-type: application/json; charset=utf-8
b3: bdda9ef1f9ca4e6028ee840606d7bffe-f87fe9bcd84c824a-0
{
"errors": [
{
"context": {
"id": "54eecb85-ed68-4b10-9278-6a507b53c243"
},
"message": "can't be blank",
"pointer": [
"blaze_payment_type"
],
"section": "body"
}
]
}
POST /public/v1/orders creates an order (with product-tracked item) for a Blaze retailer, fails if payment type not specified
POST /public/v1/orders
content-type: application/json
accept: application/json
authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJhdWQiOiJEaXN0cnUiLCJleHAiOjE4MTgxNTYwNjYsImlhdCI6MTc4NjcwNjQ2NiwiaXNzIjoiRGlzdHJ1IiwianRpIjoiNjE4ZTlhYTMtNTE1Ny00OTM3LTgxZTYtMTE0NzhhZmMyODNhIiwibW9iaWxlIjpmYWxzZSwibmJmIjoxNzg2NzA2NDY1LCJwbGF0Zm9ybSI6IkFQSSIsInN1YiI6IlVzZXI6Mjg0MyIsInR5cCI6ImFjY2VzcyJ9.ANCA9ak5s_RchGo_MJxocukpNCR3hsni4lyrCigLsGE
{
"billing_location_id": "00000000-0000-0000-0000-0000000002a3",
"blaze_payment_type": "CASH",
"charges": [],
"company_id": "00000000-0000-0000-0000-000000000522",
"delivery_datetime": "2020-01-01T00:00:00.000000Z",
"due_datetime": "2020-01-01T00:00:01.000000Z",
"items": [
{
"location_id": "00000000-0000-0000-0000-0000000002a0",
"price_base": "10.000000000",
"product_id": "709ca693-deeb-43c6-bb00-1c3b81381a2b",
"quantity": "1.000000000"
}
],
"order_datetime": "2020-01-01T00:00:02.000000Z",
"shipping_location_id": "00000000-0000-0000-0000-0000000002a3",
"status": "PROCESSING"
}
Response
200
content-type: application/json; charset=utf-8
cache-control: max-age=0, private, must-revalidate
b3: bdda9ef1f9ca4e6028ee840606d7bffe-8928f853ce032d41-0
{
"data": {
"billing_location": {
"address": "123 Fake Street, Beverly Hills, CA 90210, US",
"company_id": "00000000-0000-0000-0000-000000000842",
"id": "00000000-0000-0000-0000-0000000002a3",
"license_id": null,
"license_number": null,
"name": "Place 673"
},
"biotrack_id": null,
"blaze_payment_type": "CASH",
"charges": [],
"company": {
"id": "00000000-0000-0000-0000-000000000522",
"name": "Company 2110",
"updated_datetime": "2026-08-14T11:21:06.546812Z"
},
"creator": {
"banned": false,
"deleted_at": null,
"email": "owner-2816@example.com",
"full_name": "FirstName5706 LastName5707",
"id": "00000000-0000-0000-0000-000000000b1b",
"role": {
"id": "00000000-0000-0000-0000-000000000b52",
"name": "Admin 2897"
}
},
"custom_data": [],
"delivery_datetime": "2020-01-01T00:00:00.000000Z",
"due_datetime": "2020-01-01T00:00:01.000000Z",
"external_notes": null,
"id": "7c63976c-661d-43ab-9305-ae58267fee69",
"inserted_datetime": "2026-08-14T11:21:06.633375Z",
"internal_notes": null,
"inventory_source": null,
"items": [
{
"batch": {
"batch_number": null,
"id": "00000000-0000-0000-0000-00000000034a",
"name": "B1"
},
"compliance_quantity": null,
"cost_per_unit": null,
"cost_per_unit_default": null,
"id": "f107e781-d499-4277-bfaa-d9a04166c68f",
"is_sample": false,
"location": {
"address": "123 Fake Street, Beverly Hills, CA 90210, US",
"company_id": "00000000-0000-0000-0000-000000000840",
"id": "00000000-0000-0000-0000-0000000002a0",
"license_id": "00000000-0000-0000-0000-000000000092",
"name": "Place 670"
},
"package": null,
"price": "10.000000000",
"price_base": "10.000000000",
"product": {
"id": "709ca693-deeb-43c6-bb00-1c3b81381a2b",
"name": "P1",
"sku": "SKU1",
"updated_datetime": "2026-08-14T11:21:06.585100Z"
},
"quantity": "1.000000000",
"returned_quantity": "0",
"total_cost_actual": null,
"total_cost_default": null
}
],
"leaflink_order_number": null,
"metrc_transfer_id": null,
"order_datetime": "2020-01-01T00:00:02.000000Z",
"order_number": "SO-0000002",
"owner": null,
"payment_term_name": null,
"shipping_location": {
"address": "123 Fake Street, Beverly Hills, CA 90210, US",
"company_id": "00000000-0000-0000-0000-000000000842",
"id": "00000000-0000-0000-0000-0000000002a3",
"license_id": null,
"license_number": null,
"name": "Place 673"
},
"status": "PROCESSING",
"total": "10.00",
"updated_datetime": "2026-08-14T11:21:06.633375Z"
}
}
POST /public/v1/orders applies the best fit price tier items to order items
POST /public/v1/orders
content-type: application/json
accept: application/json
authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJhdWQiOiJEaXN0cnUiLCJleHAiOjE4MTgxNTYwNzMsImlhdCI6MTc4NjcwNjQ3MywiaXNzIjoiRGlzdHJ1IiwianRpIjoiYTMwNTIyMzQtYjlkMC00MTc2LWE2NjYtNzc3NmU2NjY1NTFmIiwibW9iaWxlIjpmYWxzZSwibmJmIjoxNzg2NzA2NDcyLCJwbGF0Zm9ybSI6IkFQSSIsInN1YiI6IlVzZXI6MzE3NiIsInR5cCI6ImFjY2VzcyJ9.uLQItqC5wYM-RFOwDeX6HjpDWAXNXPXdhVYGOPP2GOM
{
"billing_location_id": "00000000-0000-0000-0000-00000000030c",
"charges": [],
"company_id": "00000000-0000-0000-0000-00000000062e",
"delivery_datetime": "2020-01-01T00:00:00.000000Z",
"due_datetime": "2020-01-01T00:00:01.000000Z",
"items": [
{
"location_id": "00000000-0000-0000-0000-00000000030b",
"position": 1,
"price_base": "100.000000000",
"product_id": "d51ed719-945e-445f-aa37-0dcf228f4895",
"quantity": "80.000000000"
},
{
"location_id": "00000000-0000-0000-0000-00000000030b",
"position": 2,
"price_base": "200.000000000",
"product_id": "d51ed719-945e-445f-aa37-0dcf228f4895",
"quantity": "10.000000000"
},
{
"location_id": "00000000-0000-0000-0000-00000000030b",
"position": 3,
"price_base": "300.000000000",
"product_id": "7dfb4934-4575-4b23-b766-3884449271f2",
"quantity": "20.000000000"
}
],
"order_datetime": "2020-01-01T00:00:02.000000Z",
"shipping_location_id": "00000000-0000-0000-0000-00000000030c",
"status": "PROCESSING"
}
Response
200
content-type: application/json; charset=utf-8
cache-control: max-age=0, private, must-revalidate
b3: cabc42435f64ba065cd5e17322c65c67-1268df82876f809c-0
{
"data": {
"billing_location": {
"address": "123 Fake Street, Beverly Hills, CA 90210, US",
"company_id": "00000000-0000-0000-0000-000000000985",
"id": "00000000-0000-0000-0000-00000000030c",
"license_id": null,
"license_number": null,
"name": "Place 778"
},
"biotrack_id": null,
"blaze_payment_type": null,
"charges": [],
"company": {
"id": "00000000-0000-0000-0000-00000000062e",
"name": "Company 2433",
"updated_datetime": "2026-08-14T11:21:13.669225Z"
},
"creator": {
"banned": false,
"deleted_at": null,
"email": "owner-3138@example.com",
"full_name": "FirstName6350 LastName6351",
"id": "00000000-0000-0000-0000-000000000c68",
"role": {
"id": "00000000-0000-0000-0000-000000000ca9",
"name": "Admin 3240"
}
},
"custom_data": [],
"delivery_datetime": "2020-01-01T00:00:00.000000Z",
"due_datetime": "2020-01-01T00:00:01.000000Z",
"external_notes": null,
"id": "af8c7015-a176-4b43-add4-8ea939cbb745",
"inserted_datetime": "2026-08-14T11:21:13.763766Z",
"internal_notes": null,
"inventory_source": null,
"items": [
{
"batch": {
"batch_number": null,
"id": "00000000-0000-0000-0000-00000000040a",
"name": "B1"
},
"compliance_quantity": null,
"cost_per_unit": null,
"cost_per_unit_default": null,
"id": "c9c610e9-0dd0-41d3-90ca-de0cfe7a46df",
"is_sample": false,
"location": {
"address": "123 Fake Street, Beverly Hills, CA 90210, US",
"company_id": "00000000-0000-0000-0000-000000000984",
"id": "00000000-0000-0000-0000-00000000030b",
"license_id": "00000000-0000-0000-0000-0000000000b1",
"name": "Place 777"
},
"package": null,
"price": "80.000000000",
"price_base": "100.000000000",
"product": {
"id": "d51ed719-945e-445f-aa37-0dcf228f4895",
"name": "P1",
"sku": "SKU1",
"updated_datetime": "2026-08-14T11:21:13.692593Z"
},
"quantity": "80.000000000",
"returned_quantity": "0",
"total_cost_actual": null,
"total_cost_default": null
},
{
"batch": {
"batch_number": null,
"id": "00000000-0000-0000-0000-00000000040a",
"name": "B1"
},
"compliance_quantity": null,
"cost_per_unit": null,
"cost_per_unit_default": null,
"id": "6b486558-3ba6-4811-8ae0-2daa85a5d071",
"is_sample": false,
"location": {
"address": "123 Fake Street, Beverly Hills, CA 90210, US",
"company_id": "00000000-0000-0000-0000-000000000984",
"id": "00000000-0000-0000-0000-00000000030b",
"license_id": "00000000-0000-0000-0000-0000000000b1",
"name": "Place 777"
},
"package": null,
"price": "180.000000000",
"price_base": "200.000000000",
"product": {
"id": "d51ed719-945e-445f-aa37-0dcf228f4895",
"name": "P1",
"sku": "SKU1",
"updated_datetime": "2026-08-14T11:21:13.692593Z"
},
"quantity": "10.000000000",
"returned_quantity": "0",
"total_cost_actual": null,
"total_cost_default": null
},
{
"batch": {
"batch_number": null,
"id": "00000000-0000-0000-0000-00000000040b",
"name": "B2"
},
"compliance_quantity": null,
"cost_per_unit": null,
"cost_per_unit_default": null,
"id": "5b65c879-824a-4460-b88b-1a7486a81b51",
"is_sample": false,
"location": {
"address": "123 Fake Street, Beverly Hills, CA 90210, US",
"company_id": "00000000-0000-0000-0000-000000000984",
"id": "00000000-0000-0000-0000-00000000030b",
"license_id": "00000000-0000-0000-0000-0000000000b1",
"name": "Place 777"
},
"package": null,
"price": "270.000000000",
"price_base": "300.000000000",
"product": {
"id": "7dfb4934-4575-4b23-b766-3884449271f2",
"name": "P2",
"sku": "SKU2",
"updated_datetime": "2026-08-14T11:21:13.710852Z"
},
"quantity": "20.000000000",
"returned_quantity": "0",
"total_cost_actual": null,
"total_cost_default": null
}
],
"leaflink_order_number": null,
"metrc_transfer_id": null,
"order_datetime": "2020-01-01T00:00:02.000000Z",
"order_number": "SO-0000001",
"owner": null,
"payment_term_name": null,
"shipping_location": {
"address": "123 Fake Street, Beverly Hills, CA 90210, US",
"company_id": "00000000-0000-0000-0000-000000000985",
"id": "00000000-0000-0000-0000-00000000030c",
"license_id": null,
"license_number": null,
"name": "Place 778"
},
"status": "PROCESSING",
"total": "13600.00",
"updated_datetime": "2026-08-14T11:21:13.796934Z"
}
}
POST /public/v1/orders creates an order (with batch-tracked item)
POST /public/v1/orders
content-type: application/json
accept: application/json
authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJhdWQiOiJEaXN0cnUiLCJleHAiOjE4MTgxNTYwNjksImlhdCI6MTc4NjcwNjQ2OSwiaXNzIjoiRGlzdHJ1IiwianRpIjoiODM4NTQ3OTktM2UwYy00ZGQzLTljMTMtMTViZDVjZjI1NjBiIiwibW9iaWxlIjpmYWxzZSwibmJmIjoxNzg2NzA2NDY4LCJwbGF0Zm9ybSI6IkFQSSIsInN1YiI6IlVzZXI6MzA0NCIsInR5cCI6ImFjY2VzcyJ9.wvBM686Ltuksgs5EWSMaHXudTj7FqN3LfwWYIvf5Ers
{
"due_datetime": "2020-01-01T00:00:01.000000Z",
"items": [
{
"batch_id": "00000000-0000-0000-0000-0000000003d2",
"location_id": "00000000-0000-0000-0000-0000000002e5",
"price_base": "10.000000000",
"quantity": "1.000000000"
}
],
"order_datetime": "2020-01-01T00:00:02.000000Z",
"status": "PROCESSING"
}
Response
200
content-type: application/json; charset=utf-8
cache-control: max-age=0, private, must-revalidate
b3: b053c035f9527966b7181529d204a70c-0340ef23d86bba88-0
{
"data": {
"billing_location": null,
"biotrack_id": null,
"blaze_payment_type": null,
"charges": [],
"company": null,
"creator": {
"banned": false,
"deleted_at": null,
"email": "user1@a.com",
"full_name": "John Foo",
"id": "00000000-0000-0000-0000-000000000be4",
"role": {
"id": "00000000-0000-0000-0000-000000000c21",
"name": "Admin 3104"
}
},
"custom_data": [],
"delivery_datetime": null,
"due_datetime": "2020-01-01T00:00:01.000000Z",
"external_notes": null,
"id": "fff7ab67-0b34-4b71-bb61-7e254de76a7f",
"inserted_datetime": "2026-08-14T11:21:09.750233Z",
"internal_notes": null,
"inventory_source": null,
"items": [
{
"batch": {
"batch_number": null,
"id": "00000000-0000-0000-0000-0000000003d2",
"name": "B1"
},
"compliance_quantity": null,
"cost_per_unit": null,
"cost_per_unit_default": null,
"id": "cc1ba665-b1fa-4414-9785-202e2eaf736e",
"is_sample": false,
"location": {
"address": "123 Fake Street, Beverly Hills, CA 90210, US",
"company_id": "00000000-0000-0000-0000-00000000091a",
"id": "00000000-0000-0000-0000-0000000002e5",
"license_id": "00000000-0000-0000-0000-0000000000a1",
"name": "Place 739"
},
"package": null,
"price": "10.000000000",
"price_base": "10.000000000",
"product": {
"id": "a6dfd7a4-7ee0-480d-b3ea-a8ba165d2c97",
"name": "P1",
"sku": "SKU1",
"updated_datetime": "2026-08-14T11:21:09.730493Z"
},
"quantity": "1.000000000",
"returned_quantity": "0",
"total_cost_actual": null,
"total_cost_default": null
}
],
"leaflink_order_number": null,
"metrc_transfer_id": null,
"order_datetime": "2020-01-01T00:00:02.000000Z",
"order_number": "SO-0000001",
"owner": null,
"payment_term_name": null,
"shipping_location": null,
"status": "PROCESSING",
"total": "10.00",
"updated_datetime": "2026-08-14T11:21:09.750233Z"
}
}
POST /public/v1/orders creates an order (with batch-tracked item without batch set)
POST /public/v1/orders
content-type: application/json
accept: application/json
authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJhdWQiOiJEaXN0cnUiLCJleHAiOjE4MTgxNTYwNzEsImlhdCI6MTc4NjcwNjQ3MSwiaXNzIjoiRGlzdHJ1IiwianRpIjoiOGYxYjA4YzUtNjMwMy00ZGJhLWFkZGQtYzdmZTliNzEwY2JhIiwibW9iaWxlIjpmYWxzZSwibmJmIjoxNzg2NzA2NDcwLCJwbGF0Zm9ybSI6IkFQSSIsInN1YiI6IlVzZXI6MzEyNCIsInR5cCI6ImFjY2VzcyJ9.zBxhiB0GBoztKuoxYMRAm_6eOPGHLGlKCCsYZ9BMV6I
{
"due_datetime": "2020-01-01T00:00:01.000000Z",
"items": [
{
"location_id": "00000000-0000-0000-0000-0000000002fb",
"price_base": "10.000000000",
"product_id": "ee7e2208-a404-43d4-8e05-29ad14990c77",
"quantity": "1.000000000"
}
],
"order_datetime": "2020-01-01T00:00:02.000000Z",
"status": "PROCESSING"
}
Response
200
content-type: application/json; charset=utf-8
cache-control: max-age=0, private, must-revalidate
b3: 85824fa22d6e5ad9be0b3a694520c762-c7c46b518cd9d24c-0
{
"data": {
"billing_location": null,
"biotrack_id": null,
"blaze_payment_type": null,
"charges": [],
"company": null,
"creator": {
"banned": false,
"deleted_at": null,
"email": "user1@a.com",
"full_name": "John Foo",
"id": "00000000-0000-0000-0000-000000000c34",
"role": {
"id": "00000000-0000-0000-0000-000000000c74",
"name": "Admin 3187"
}
},
"custom_data": [],
"delivery_datetime": null,
"due_datetime": "2020-01-01T00:00:01.000000Z",
"external_notes": null,
"id": "7acba7fc-41ff-49d4-95f7-5396ada08572",
"inserted_datetime": "2026-08-14T11:21:11.883236Z",
"internal_notes": null,
"inventory_source": null,
"items": [
{
"batch": null,
"compliance_quantity": null,
"cost_per_unit": null,
"cost_per_unit_default": null,
"id": "ab6a4317-35db-4270-a2ec-49ea03f2c887",
"is_sample": false,
"location": {
"address": "123 Fake Street, Beverly Hills, CA 90210, US",
"company_id": "00000000-0000-0000-0000-000000000953",
"id": "00000000-0000-0000-0000-0000000002fb",
"license_id": "00000000-0000-0000-0000-0000000000ab",
"name": "Place 761"
},
"package": null,
"price": "10.000000000",
"price_base": "10.000000000",
"product": {
"id": "ee7e2208-a404-43d4-8e05-29ad14990c77",
"name": "P1",
"sku": "SKU1",
"updated_datetime": "2026-08-14T11:21:11.870503Z"
},
"quantity": "1.000000000",
"returned_quantity": "0",
"total_cost_actual": null,
"total_cost_default": null
}
],
"leaflink_order_number": null,
"metrc_transfer_id": null,
"order_datetime": "2020-01-01T00:00:02.000000Z",
"order_number": "SO-0000001",
"owner": null,
"payment_term_name": null,
"shipping_location": null,
"status": "PROCESSING",
"total": "10.00",
"updated_datetime": "2026-08-14T11:21:11.883236Z"
}
}
POST /public/v1/orders creates an order (with package-tracked item)
POST /public/v1/orders
content-type: application/json
accept: application/json
authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJhdWQiOiJEaXN0cnUiLCJleHAiOjE4MTgxNTYwNzEsImlhdCI6MTc4NjcwNjQ3MSwiaXNzIjoiRGlzdHJ1IiwianRpIjoiNmY2Mjg5MTEtNzc3YS00YmE0LThhYWEtM2U2OWI0NGIyZjA1IiwibW9iaWxlIjpmYWxzZSwibmJmIjoxNzg2NzA2NDcwLCJwbGF0Zm9ybSI6IkFQSSIsInN1YiI6IlVzZXI6MzEwNSIsInR5cCI6ImFjY2VzcyJ9.Q9OHWWizC7hOzAeOIAS0ix5tzYTIzhyh-44tlRfdJAQ
{
"due_datetime": "2020-01-01T00:00:01.000000Z",
"items": [
{
"compliance_quantity": "1.0000",
"is_sample": true,
"location_id": "00000000-0000-0000-0000-0000000002f4",
"package_id": "00000000-0000-0000-0000-000000000060",
"price_base": "10.000000000",
"quantity": "1.000000000"
}
],
"order_datetime": "2020-01-01T00:00:02.000000Z",
"status": "PROCESSING"
}
Response
200
content-type: application/json; charset=utf-8
cache-control: max-age=0, private, must-revalidate
b3: e9f3d114e6dac6498c78890715dc932f-560c481072f22e98-0
{
"data": {
"billing_location": null,
"biotrack_id": null,
"blaze_payment_type": null,
"charges": [],
"company": null,
"creator": {
"banned": false,
"deleted_at": null,
"email": "owner-3069@example.com",
"full_name": "FirstName6212 LastName6213",
"id": "00000000-0000-0000-0000-000000000c21",
"role": {
"id": "00000000-0000-0000-0000-000000000c60",
"name": "Admin 3167"
}
},
"custom_data": [],
"delivery_datetime": null,
"due_datetime": "2020-01-01T00:00:01.000000Z",
"external_notes": null,
"id": "f16cf24c-497d-41d9-8db8-a34143293580",
"inserted_datetime": "2026-08-14T11:21:11.469298Z",
"internal_notes": null,
"inventory_source": null,
"items": [
{
"batch": {
"batch_number": null,
"id": "00000000-0000-0000-0000-0000000003e9",
"name": "B1"
},
"compliance_quantity": "1.0000",
"cost_per_unit": null,
"cost_per_unit_default": null,
"id": "1f7216e9-ac02-4d76-9185-426b6ae5b49f",
"is_sample": true,
"location": {
"address": "123 Fake Street, Beverly Hills, CA 90210, US",
"company_id": "00000000-0000-0000-0000-000000000946",
"id": "00000000-0000-0000-0000-0000000002f4",
"license_id": "00000000-0000-0000-0000-0000000000a8",
"name": "Place 754"
},
"package": {
"batch_number": "B1",
"compliance_label": "ABCDEF012345670000000184",
"id": "00000000-0000-0000-0000-000000000060",
"metrc_label": "ABCDEF012345670000000184",
"status": "selling"
},
"price": "10.000000000",
"price_base": "10.000000000",
"product": {
"id": "0b886206-7b08-4e3b-9175-ed8b69764f2c",
"name": "P1",
"sku": "SKU1",
"updated_datetime": "2026-08-14T11:21:11.395615Z"
},
"quantity": "1.000000000",
"returned_quantity": "0",
"total_cost_actual": null,
"total_cost_default": null
}
],
"leaflink_order_number": null,
"metrc_transfer_id": null,
"order_datetime": "2020-01-01T00:00:02.000000Z",
"order_number": "SO-0000001",
"owner": null,
"payment_term_name": null,
"shipping_location": null,
"status": "PROCESSING",
"total": "10.00",
"updated_datetime": "2026-08-14T11:21:11.469298Z"
}
}
POST /public/v1/orders creates an order (with package-tracked item without package set)
POST /public/v1/orders
content-type: application/json
accept: application/json
authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJhdWQiOiJEaXN0cnUiLCJleHAiOjE4MTgxNTYwNjYsImlhdCI6MTc4NjcwNjQ2NiwiaXNzIjoiRGlzdHJ1IiwianRpIjoiZDU3OWRlNjEtNjA5MS00OWVjLWEyMjUtMWM5YjNlYzM3YzA0IiwibW9iaWxlIjpmYWxzZSwibmJmIjoxNzg2NzA2NDY1LCJwbGF0Zm9ybSI6IkFQSSIsInN1YiI6IlVzZXI6Mjg1MyIsInR5cCI6ImFjY2VzcyJ9.lkXsmNi5H_3bbPx5CpT8-jjvmalPJq4qmYAAJ0xQyno
{
"due_datetime": "2020-01-01T00:00:01.000000Z",
"items": [
{
"location_id": "00000000-0000-0000-0000-0000000002a8",
"price_base": "10.000000000",
"product_id": "3c496d1c-019e-43c0-9474-50b7188d9939",
"quantity": "1.000000000"
}
],
"order_datetime": "2020-01-01T00:00:02.000000Z",
"status": "PROCESSING"
}
Response
200
content-type: application/json; charset=utf-8
cache-control: max-age=0, private, must-revalidate
b3: 5487dd2781895503bb562cb4d4c6d23b-893a49651ec53b93-0
{
"data": {
"billing_location": null,
"biotrack_id": null,
"blaze_payment_type": null,
"charges": [],
"company": null,
"creator": {
"banned": false,
"deleted_at": null,
"email": "user1@a.com",
"full_name": "John Foo",
"id": "00000000-0000-0000-0000-000000000b25",
"role": {
"id": "00000000-0000-0000-0000-000000000b5c",
"name": "Admin 2907"
}
},
"custom_data": [],
"delivery_datetime": null,
"due_datetime": "2020-01-01T00:00:01.000000Z",
"external_notes": null,
"id": "99aa983a-32cc-4411-b11a-6db0f2bd0de3",
"inserted_datetime": "2026-08-14T11:21:06.778844Z",
"internal_notes": null,
"inventory_source": null,
"items": [
{
"batch": null,
"compliance_quantity": null,
"cost_per_unit": null,
"cost_per_unit_default": null,
"id": "025306ba-9806-4ce7-8ff2-5cf84e61f6e7",
"is_sample": false,
"location": {
"address": "123 Fake Street, Beverly Hills, CA 90210, US",
"company_id": "00000000-0000-0000-0000-00000000084b",
"id": "00000000-0000-0000-0000-0000000002a8",
"license_id": "00000000-0000-0000-0000-000000000094",
"name": "Place 678"
},
"package": null,
"price": "10.000000000",
"price_base": "10.000000000",
"product": {
"id": "3c496d1c-019e-43c0-9474-50b7188d9939",
"name": "P1",
"sku": "SKU1",
"updated_datetime": "2026-08-14T11:21:06.766167Z"
},
"quantity": "1.000000000",
"returned_quantity": "0",
"total_cost_actual": null,
"total_cost_default": null
}
],
"leaflink_order_number": null,
"metrc_transfer_id": null,
"order_datetime": "2020-01-01T00:00:02.000000Z",
"order_number": "SO-0000001",
"owner": null,
"payment_term_name": null,
"shipping_location": null,
"status": "PROCESSING",
"total": "10.00",
"updated_datetime": "2026-08-14T11:21:06.778844Z"
}
}
POST /public/v1/orders creates an order with metrc transfer template
POST /public/v1/orders
content-type: application/json
accept: application/json
authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJhdWQiOiJEaXN0cnUiLCJleHAiOjE4MTgxNTYwNjMsImlhdCI6MTc4NjcwNjQ2MywiaXNzIjoiRGlzdHJ1IiwianRpIjoiZDdmMjAzMjYtZTRmMS00NTg2LTg0YzMtZjhkZTliZTA5MmU1IiwibW9iaWxlIjpmYWxzZSwibmJmIjoxNzg2NzA2NDYyLCJwbGF0Zm9ybSI6IkFQSSIsInN1YiI6IlVzZXI6MjI3NiIsInR5cCI6ImFjY2VzcyJ9.CaGwZG9fpjlgKTjDJmj89zG7SizMlRBretcrmbUEIoc
{
"billing_location_id": "00000000-0000-0000-0000-0000000001f7",
"charges": [],
"company_id": "00000000-0000-0000-0000-0000000003ae",
"delivery_datetime": "2020-01-01T00:00:00.000000Z",
"due_datetime": "2020-01-01T00:00:01.000000Z",
"external_notes": null,
"items": [
{
"compliance_quantity": "1.0000",
"id": "b7e39aa2-d179-40a7-a769-13f06449c02b",
"location_id": "00000000-0000-0000-0000-0000000001f6",
"package_id": "00000000-0000-0000-0000-00000000004d",
"price_base": "10.000000000",
"quantity": "1.000000000"
}
],
"location_id": "00000000-0000-0000-0000-0000000001f6",
"metrc_transfer_template_directions": "Go to the store around the corner",
"metrc_transfer_template_recipient_license_number": "C12-0123458-LIC",
"metrc_transfer_template_status": "PENDING",
"metrc_transfer_template_transporter_info": [
{
"driver_license_number": "1234567890",
"driver_name": "John Doe",
"driver_occupational_license_number": "1234567890",
"driver_phone_number": "1234567890",
"estimated_arrival_datetime": "2020-01-01T10:30:00.000000Z",
"estimated_departure_datetime": "2020-01-01T08:00:00.000000Z",
"transporter_license_number": "C12-0123456-LIC",
"vehicle_license_plate_number": "1234567890",
"vehicle_make": "Toyota",
"vehicle_model": "Prius"
},
{
"driver_license_number": "1234567891",
"driver_name": "Jane Doe",
"driver_occupational_license_number": "1234567891",
"estimated_arrival_datetime": "2020-01-01T16:45:00.000000Z",
"estimated_departure_datetime": "2020-01-01T14:00:00.000000Z",
"transporter_license_number": "C12-0123457-LIC",
"vehicle_license_plate_number": "1234567891",
"vehicle_make": "Toyota",
"vehicle_model": "Corolla"
}
],
"metrc_transfer_template_type": "Transfer",
"order_datetime": "2020-01-01T00:00:02.000000Z",
"owner_id": "00000000-0000-0000-0000-0000000008e4",
"shipping_location_id": "00000000-0000-0000-0000-0000000001f7",
"status": "PROCESSING"
}
Response
200
content-type: application/json; charset=utf-8
cache-control: max-age=0, private, must-revalidate
b3: d9b08a3a12b805e247207d3846a353b7-f0aebb7b565b5ca7-0
{
"data": {
"billing_location": {
"address": "123 Fake Street, Beverly Hills, CA 90210, US",
"company_id": "00000000-0000-0000-0000-00000000067d",
"id": "00000000-0000-0000-0000-0000000001f7",
"license_id": null,
"license_number": null,
"name": "Place 501"
},
"biotrack_id": null,
"blaze_payment_type": null,
"charges": [],
"company": {
"id": "00000000-0000-0000-0000-0000000003ae",
"name": "Company 1657",
"updated_datetime": "2026-08-14T11:21:03.151661Z"
},
"creator": {
"banned": false,
"deleted_at": null,
"email": "user1@a.com",
"full_name": "John Foo",
"id": "00000000-0000-0000-0000-0000000008e4",
"role": {
"id": "00000000-0000-0000-0000-000000000921",
"name": "Admin 2336"
}
},
"custom_data": [],
"delivery_datetime": "2020-01-01T00:00:00.000000Z",
"due_datetime": "2020-01-01T00:00:01.000000Z",
"external_notes": null,
"id": "358efefa-04a4-4e04-bdff-8c51b665f5c9",
"inserted_datetime": "2026-08-14T11:21:03.258940Z",
"internal_notes": null,
"inventory_source": {
"address": "123 Fake Street, Beverly Hills, CA 90210, US",
"company_id": "00000000-0000-0000-0000-00000000067a",
"id": "00000000-0000-0000-0000-0000000001f6",
"license_id": "00000000-0000-0000-0000-000000000065",
"license_number": "CDPH-00000102",
"name": "Place 500"
},
"items": [
{
"batch": {
"batch_number": null,
"id": "00000000-0000-0000-0000-000000000225",
"name": "B2"
},
"compliance_quantity": "1.0000",
"cost_per_unit": null,
"cost_per_unit_default": null,
"id": "b7e39aa2-d179-40a7-a769-13f06449c02b",
"is_sample": false,
"location": {
"address": "123 Fake Street, Beverly Hills, CA 90210, US",
"company_id": "00000000-0000-0000-0000-00000000067a",
"id": "00000000-0000-0000-0000-0000000001f6",
"license_id": "00000000-0000-0000-0000-000000000065",
"name": "Place 500"
},
"package": {
"batch_number": "B1",
"compliance_label": "ABCDEF012345670000000144",
"id": "00000000-0000-0000-0000-00000000004d",
"metrc_label": "ABCDEF012345670000000144",
"status": "selling"
},
"price": "10.000000000",
"price_base": "10.000000000",
"product": {
"id": "df05bd62-879a-4d8f-b6d6-0f4326fdb59e",
"name": "P1",
"sku": "SKU1",
"updated_datetime": "2026-08-14T11:21:03.165953Z"
},
"quantity": "1.000000000",
"returned_quantity": "0",
"total_cost_actual": null,
"total_cost_default": null
}
],
"leaflink_order_number": null,
"metrc_transfer_id": null,
"order_datetime": "2020-01-01T00:00:02.000000Z",
"order_number": "SO-0000001",
"owner": {
"banned": false,
"deleted_at": null,
"email": "user1@a.com",
"full_name": "John Foo",
"id": "00000000-0000-0000-0000-0000000008e4",
"role": {
"id": "00000000-0000-0000-0000-000000000921",
"name": "Admin 2336"
}
},
"payment_term_name": null,
"shipping_location": {
"address": "123 Fake Street, Beverly Hills, CA 90210, US",
"company_id": "00000000-0000-0000-0000-00000000067d",
"id": "00000000-0000-0000-0000-0000000001f7",
"license_id": null,
"license_number": null,
"name": "Place 501"
},
"status": "PROCESSING",
"total": "10.00",
"updated_datetime": "2026-08-14T11:21:03.330977Z"
}
}
POST /public/v1/orders updates an order
POST /public/v1/orders
content-type: application/json
accept: application/json
authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJhdWQiOiJEaXN0cnUiLCJleHAiOjE4MTgxNTYwNjgsImlhdCI6MTc4NjcwNjQ2OCwiaXNzIjoiRGlzdHJ1IiwianRpIjoiNDI1YWZkZjYtMzk2ZC00ZWQ5LThiNjYtYWJmYWVjNTNlZGU3IiwibW9iaWxlIjpmYWxzZSwibmJmIjoxNzg2NzA2NDY3LCJwbGF0Zm9ybSI6IkFQSSIsInN1YiI6IlVzZXI6MzAwNiIsInR5cCI6ImFjY2VzcyJ9.KGUPqq5p7aM7K4HKtAr8bfsiHrnbpg8Bx9eF1tnj_ps
{
"billing_location_id": "00000000-0000-0000-0000-0000000002da",
"charges": [
{
"id": "5848565a-716d-44d5-8d96-a4374b17694b",
"name": "C1",
"percent": "10.0000",
"type": "CHARGE",
"unit_type": "PERCENT"
},
{
"id": "4753db69-f7ac-46d4-9aba-f9356c544a0e",
"name": "C2",
"price": "-5.00",
"type": "DISCOUNT",
"unit_type": "PRICE"
}
],
"company_id": "00000000-0000-0000-0000-0000000005bb",
"delivery_datetime": "2020-01-01T00:00:00.000000Z",
"due_datetime": "2020-01-01T00:00:01.000000Z",
"external_notes": "gonna make you sweat",
"id": "686943e5-239c-46fd-a980-8bb0fd44b649",
"items": [
{
"id": "b3e1e085-dc58-43cb-a952-f8dc13f190e4",
"is_sample": true,
"location_id": "00000000-0000-0000-0000-0000000002d9",
"price_base": "10.000000000",
"product_id": "38ce7e99-f607-4ef6-aba8-73f69b70cdbc",
"quantity": "2.000000000"
},
{
"id": "178e7733-50ed-4b6d-b0d7-c2875cb608e5",
"location_id": "00000000-0000-0000-0000-0000000002d9",
"price_base": "100.000000000",
"product_id": "38ce7e99-f607-4ef6-aba8-73f69b70cdbc",
"quantity": "3.000000000"
},
{
"compliance_quantity": "1.0000",
"id": "dbe47562-0b04-4566-ad2e-40a93b60832c",
"location_id": "00000000-0000-0000-0000-0000000002d9",
"package_id": "00000000-0000-0000-0000-00000000005e",
"price_base": "10.000000000",
"quantity": "1.000000000"
}
],
"location_id": "00000000-0000-0000-0000-0000000002d9",
"metrc_transfer_template_directions": "Go to the store around the corner",
"metrc_transfer_template_recipient_license_number": "C12-0123458-LIC",
"metrc_transfer_template_status": "PENDING",
"metrc_transfer_template_transporter_info": [
{
"driver_license_number": "1234567890",
"driver_name": "John Doe",
"driver_occupational_license_number": "1234567890",
"driver_phone_number": "1234567890",
"transporter_license_number": "C12-0123456-LIC",
"vehicle_license_plate_number": "1234567890",
"vehicle_make": "Toyota",
"vehicle_model": "Prius"
},
{
"driver_license_number": "1234567891",
"driver_name": "Jane Doe",
"driver_occupational_license_number": "1234567891",
"driver_phone_number": "1234567891",
"transporter_license_number": "C12-0123457-LIC",
"vehicle_license_plate_number": "1234567891",
"vehicle_make": "Toyota",
"vehicle_model": "Corolla"
}
],
"metrc_transfer_template_type": "Transfer",
"order_datetime": "2020-01-01T00:00:02.000000Z",
"owner_id": "00000000-0000-0000-0000-000000000bc5",
"shipping_location_id": "00000000-0000-0000-0000-0000000002da",
"status": "PROCESSING"
}
Response
200
content-type: application/json; charset=utf-8
cache-control: max-age=0, private, must-revalidate
b3: ffe45731bb76a81d7dcfbea6290de817-4d68b04e2610c4e5-0
{
"data": {
"billing_location": {
"address": "123 Fake Street, Beverly Hills, CA 90210, US",
"company_id": "00000000-0000-0000-0000-0000000008f4",
"id": "00000000-0000-0000-0000-0000000002da",
"license_id": null,
"license_number": null,
"name": "Place 728"
},
"biotrack_id": null,
"blaze_payment_type": null,
"charges": [
{
"id": "5848565a-716d-44d5-8d96-a4374b17694b",
"name": "C1",
"percent": "10.0000",
"price": "33.00",
"type": "CHARGE",
"unit_type": "PERCENT"
},
{
"id": "4753db69-f7ac-46d4-9aba-f9356c544a0e",
"name": "C2",
"percent": null,
"price": "-5.00",
"type": "DISCOUNT",
"unit_type": "PRICE"
}
],
"company": {
"id": "00000000-0000-0000-0000-0000000005bb",
"name": "Company 2288",
"updated_datetime": "2026-08-14T11:21:08.874533Z"
},
"creator": {
"banned": false,
"deleted_at": null,
"email": "user1@a.com",
"full_name": "John Foo",
"id": "00000000-0000-0000-0000-000000000bbd",
"role": {
"id": "00000000-0000-0000-0000-000000000bf8",
"name": "Admin 3063"
}
},
"custom_data": [],
"delivery_datetime": "2020-01-01T00:00:00.000000Z",
"due_datetime": "2020-01-01T00:00:01.000000Z",
"external_notes": "gonna make you sweat",
"id": "686943e5-239c-46fd-a980-8bb0fd44b649",
"inserted_datetime": "2026-08-14T11:21:08.907812Z",
"internal_notes": null,
"inventory_source": {
"address": "123 Fake Street, Beverly Hills, CA 90210, US",
"company_id": "00000000-0000-0000-0000-0000000008f3",
"id": "00000000-0000-0000-0000-0000000002d9",
"license_id": "00000000-0000-0000-0000-00000000009f",
"license_number": "CDPH-00000160",
"name": "Place 727"
},
"items": [
{
"batch": {
"batch_number": null,
"id": "00000000-0000-0000-0000-0000000003bb",
"name": "B1"
},
"compliance_quantity": null,
"cost_per_unit": null,
"cost_per_unit_default": null,
"id": "b3e1e085-dc58-43cb-a952-f8dc13f190e4",
"is_sample": true,
"location": {
"address": "123 Fake Street, Beverly Hills, CA 90210, US",
"company_id": "00000000-0000-0000-0000-0000000008f3",
"id": "00000000-0000-0000-0000-0000000002d9",
"license_id": "00000000-0000-0000-0000-00000000009f",
"name": "Place 727"
},
"package": null,
"price": "10.000000000",
"price_base": "10.000000000",
"product": {
"id": "38ce7e99-f607-4ef6-aba8-73f69b70cdbc",
"name": "P1",
"sku": "SKU1",
"updated_datetime": "2026-08-14T11:21:08.892945Z"
},
"quantity": "2.000000000",
"returned_quantity": "0",
"total_cost_actual": null,
"total_cost_default": null
},
{
"batch": {
"batch_number": null,
"id": "00000000-0000-0000-0000-0000000003bb",
"name": "B1"
},
"compliance_quantity": null,
"cost_per_unit": null,
"cost_per_unit_default": null,
"id": "178e7733-50ed-4b6d-b0d7-c2875cb608e5",
"is_sample": false,
"location": {
"address": "123 Fake Street, Beverly Hills, CA 90210, US",
"company_id": "00000000-0000-0000-0000-0000000008f3",
"id": "00000000-0000-0000-0000-0000000002d9",
"license_id": "00000000-0000-0000-0000-00000000009f",
"name": "Place 727"
},
"package": null,
"price": "100.000000000",
"price_base": "100.000000000",
"product": {
"id": "38ce7e99-f607-4ef6-aba8-73f69b70cdbc",
"name": "P1",
"sku": "SKU1",
"updated_datetime": "2026-08-14T11:21:08.892945Z"
},
"quantity": "3.000000000",
"returned_quantity": "0",
"total_cost_actual": null,
"total_cost_default": null
},
{
"batch": {
"batch_number": null,
"id": "00000000-0000-0000-0000-0000000003bc",
"name": "B2"
},
"compliance_quantity": "1.0000",
"cost_per_unit": null,
"cost_per_unit_default": null,
"id": "dbe47562-0b04-4566-ad2e-40a93b60832c",
"is_sample": false,
"location": {
"address": "123 Fake Street, Beverly Hills, CA 90210, US",
"company_id": "00000000-0000-0000-0000-0000000008f3",
"id": "00000000-0000-0000-0000-0000000002d9",
"license_id": "00000000-0000-0000-0000-00000000009f",
"name": "Place 727"
},
"package": {
"batch_number": "B2",
"compliance_label": "ABCDEF012345670000000180",
"id": "00000000-0000-0000-0000-00000000005e",
"metrc_label": "ABCDEF012345670000000180",
"status": "selling"
},
"price": "10.000000000",
"price_base": "10.000000000",
"product": {
"id": "f6c2cc72-9036-4ad2-a305-14d3f7377e2c",
"name": "P2",
"sku": "SKU2",
"updated_datetime": "2026-08-14T11:21:08.922570Z"
},
"quantity": "1.000000000",
"returned_quantity": "0",
"total_cost_actual": null,
"total_cost_default": null
}
],
"leaflink_order_number": null,
"metrc_transfer_id": null,
"order_datetime": "2020-01-01T00:00:02.000000Z",
"order_number": "SO-166",
"owner": {
"banned": false,
"deleted_at": null,
"email": "owner-2982@example.com",
"full_name": "FirstName6038 LastName6039",
"id": "00000000-0000-0000-0000-000000000bc5",
"role": {
"id": "00000000-0000-0000-0000-000000000c00",
"name": "Admin 3071"
}
},
"payment_term_name": null,
"shipping_location": {
"address": "123 Fake Street, Beverly Hills, CA 90210, US",
"company_id": "00000000-0000-0000-0000-0000000008f4",
"id": "00000000-0000-0000-0000-0000000002da",
"license_id": null,
"license_number": null,
"name": "Place 728"
},
"status": "PROCESSING",
"total": "358.00",
"updated_datetime": "2026-08-14T11:21:09.120592Z"
}
}
POST /public/v1/orders does not alter locked price tier items on update
POST /public/v1/orders
content-type: application/json
accept: application/json
authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJhdWQiOiJEaXN0cnUiLCJleHAiOjE4MTgxNTYwNjIsImlhdCI6MTc4NjcwNjQ2MiwiaXNzIjoiRGlzdHJ1IiwianRpIjoiMjNlNjViMzAtZmIzNC00ZTYwLTk3M2ItMWRlY2M4Yzc4MWIyIiwibW9iaWxlIjpmYWxzZSwibmJmIjoxNzg2NzA2NDYxLCJwbGF0Zm9ybSI6IkFQSSIsInN1YiI6IlVzZXI6MjA3MiIsInR5cCI6ImFjY2VzcyJ9.Bt_R2ei7QPPPPJvPfO3nI9poQMAu2NyiDXhPTjcauPQ
{
"billing_location_id": "00000000-0000-0000-0000-0000000001ba",
"charges": [],
"company_id": "00000000-0000-0000-0000-000000000346",
"delivery_datetime": "2020-01-01T00:00:00.000000Z",
"due_datetime": "2020-01-01T00:00:01.000000Z",
"items": [
{
"location_id": "00000000-0000-0000-0000-0000000001b9",
"position": 1,
"price_base": "100.000000000",
"product_id": "f5f0baae-9dcf-427f-9b1d-6375fec5a281",
"quantity": "10.000000000"
},
{
"location_id": "00000000-0000-0000-0000-0000000001b9",
"position": 2,
"price_base": "200.000000000",
"product_id": "2f7d7fbf-c90e-4635-ad8f-f33258a7cb1c",
"quantity": "10.000000000"
},
{
"location_id": "00000000-0000-0000-0000-0000000001b9",
"position": 3,
"price_base": "300.000000000",
"product_id": "254322e3-56b8-4ffa-b0eb-3decefcfc8ff",
"quantity": "10.000000000"
}
],
"order_datetime": "2020-01-01T00:00:02.000000Z",
"shipping_location_id": "00000000-0000-0000-0000-0000000001ba",
"status": "PROCESSING"
}
Response
200
content-type: application/json; charset=utf-8
cache-control: max-age=0, private, must-revalidate
b3: b062b24d95db89c8118bc64dfe2c00cc-31ede473edf11c89-0
{
"data": {
"billing_location": {
"address": "123 Fake Street, Beverly Hills, CA 90210, US",
"company_id": "00000000-0000-0000-0000-0000000005e9",
"id": "00000000-0000-0000-0000-0000000001ba",
"license_id": null,
"license_number": null,
"name": "Place 440"
},
"biotrack_id": null,
"blaze_payment_type": null,
"charges": [],
"company": {
"id": "00000000-0000-0000-0000-000000000346",
"name": "Company 1509",
"updated_datetime": "2026-08-14T11:21:02.078230Z"
},
"creator": {
"banned": false,
"deleted_at": null,
"email": "owner-2062@example.com",
"full_name": "FirstName4190 LastName4191",
"id": "00000000-0000-0000-0000-000000000818",
"role": {
"id": "00000000-0000-0000-0000-00000000085d",
"name": "Admin 2140"
}
},
"custom_data": [],
"delivery_datetime": "2020-01-01T00:00:00.000000Z",
"due_datetime": "2020-01-01T00:00:01.000000Z",
"external_notes": null,
"id": "834c0e89-5ae0-43b5-b874-63b7eceec31a",
"inserted_datetime": "2026-08-14T11:21:02.282198Z",
"internal_notes": null,
"inventory_source": null,
"items": [
{
"batch": {
"batch_number": null,
"id": "00000000-0000-0000-0000-0000000001e9",
"name": "B1"
},
"compliance_quantity": null,
"cost_per_unit": null,
"cost_per_unit_default": null,
"id": "4ba5115b-aaf3-425e-86b3-0efd7b0735a1",
"is_sample": false,
"location": {
"address": "123 Fake Street, Beverly Hills, CA 90210, US",
"company_id": "00000000-0000-0000-0000-0000000005e7",
"id": "00000000-0000-0000-0000-0000000001b9",
"license_id": "00000000-0000-0000-0000-000000000057",
"name": "Place 439"
},
"package": null,
"price": "90.000000000",
"price_base": "100.000000000",
"product": {
"id": "f5f0baae-9dcf-427f-9b1d-6375fec5a281",
"name": "P1",
"sku": "SKU1",
"updated_datetime": "2026-08-14T11:21:02.122894Z"
},
"quantity": "10.000000000",
"returned_quantity": "0",
"total_cost_actual": null,
"total_cost_default": null
},
{
"batch": {
"batch_number": null,
"id": "00000000-0000-0000-0000-0000000001ea",
"name": "B2"
},
"compliance_quantity": null,
"cost_per_unit": null,
"cost_per_unit_default": null,
"id": "8fee2393-a9ce-45c5-a023-3eca3c42f1d9",
"is_sample": false,
"location": {
"address": "123 Fake Street, Beverly Hills, CA 90210, US",
"company_id": "00000000-0000-0000-0000-0000000005e7",
"id": "00000000-0000-0000-0000-0000000001b9",
"license_id": "00000000-0000-0000-0000-000000000057",
"name": "Place 439"
},
"package": null,
"price": "200.000000000",
"price_base": "200.000000000",
"product": {
"id": "2f7d7fbf-c90e-4635-ad8f-f33258a7cb1c",
"name": "P2",
"sku": "SKU2",
"updated_datetime": "2026-08-14T11:21:02.160671Z"
},
"quantity": "10.000000000",
"returned_quantity": "0",
"total_cost_actual": null,
"total_cost_default": null
},
{
"batch": {
"batch_number": null,
"id": "00000000-0000-0000-0000-0000000001eb",
"name": "B3"
},
"compliance_quantity": null,
"cost_per_unit": null,
"cost_per_unit_default": null,
"id": "92afb803-9dcd-491a-83fc-07132dad4a7e",
"is_sample": false,
"location": {
"address": "123 Fake Street, Beverly Hills, CA 90210, US",
"company_id": "00000000-0000-0000-0000-0000000005e7",
"id": "00000000-0000-0000-0000-0000000001b9",
"license_id": "00000000-0000-0000-0000-000000000057",
"name": "Place 439"
},
"package": null,
"price": "290.000000000",
"price_base": "300.000000000",
"product": {
"id": "254322e3-56b8-4ffa-b0eb-3decefcfc8ff",
"name": "P3",
"sku": "SKU3",
"updated_datetime": "2026-08-14T11:21:02.178316Z"
},
"quantity": "10.000000000",
"returned_quantity": "0",
"total_cost_actual": null,
"total_cost_default": null
}
],
"leaflink_order_number": null,
"metrc_transfer_id": null,
"order_datetime": "2020-01-01T00:00:02.000000Z",
"order_number": "SO-0000001",
"owner": null,
"payment_term_name": null,
"shipping_location": {
"address": "123 Fake Street, Beverly Hills, CA 90210, US",
"company_id": "00000000-0000-0000-0000-0000000005e9",
"id": "00000000-0000-0000-0000-0000000001ba",
"license_id": null,
"license_number": null,
"name": "Place 440"
},
"status": "PROCESSING",
"total": "5800.00",
"updated_datetime": "2026-08-14T11:21:02.395482Z"
}
}
POST /public/v1/orders deleting order items & charges
POST /public/v1/orders
content-type: application/json
accept: application/json
authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJhdWQiOiJEaXN0cnUiLCJleHAiOjE4MTgxNTYwNjAsImlhdCI6MTc4NjcwNjQ2MCwiaXNzIjoiRGlzdHJ1IiwianRpIjoiYzllMzYwMTgtNWUwYy00NmY1LTk0ZjQtMWY2NGZmMzQ3NjM4IiwibW9iaWxlIjpmYWxzZSwibmJmIjoxNzg2NzA2NDU5LCJwbGF0Zm9ybSI6IkFQSSIsInN1YiI6IlVzZXI6MTU5MCIsInR5cCI6ImFjY2VzcyJ9.jWsYXOwDS0zaQfVcRLuBw5rSmCSxHbtbUd4t2tluY8o
{
"billing_location_id": "00000000-0000-0000-0000-00000000016d",
"charges": [],
"company_id": "00000000-0000-0000-0000-000000000262",
"delivery_datetime": "2020-01-01T00:00:00.000000Z",
"due_datetime": "2020-01-01T00:00:01.000000Z",
"id": "94a717e1-dd9e-41cf-b3e2-9d36e3e65a47",
"items": [
{
"id": "9cd10736-f99d-4aaf-b0c0-849f5edc3198",
"location_id": "00000000-0000-0000-0000-000000000169",
"price_base": "10.000000000",
"product_id": "6a7077b2-0d7d-424a-a01c-cdf36933fcfd",
"quantity": "1.000000000"
}
],
"order_datetime": "2020-01-01T00:00:02.000000Z",
"shipping_location_id": "00000000-0000-0000-0000-00000000016d",
"status": "PROCESSING"
}
Response
200
content-type: application/json; charset=utf-8
cache-control: max-age=0, private, must-revalidate
b3: 8b91c9448b64d0733eb0f7a64da10661-943d22d0a853c0b5-0
{
"data": {
"billing_location": {
"address": "123 Fake Street, Beverly Hills, CA 90210, US",
"company_id": "00000000-0000-0000-0000-0000000004a9",
"id": "00000000-0000-0000-0000-00000000016d",
"license_id": null,
"license_number": null,
"name": "Place 364"
},
"biotrack_id": null,
"blaze_payment_type": null,
"charges": [],
"company": {
"id": "00000000-0000-0000-0000-000000000262",
"name": "Company 1190",
"updated_datetime": "2026-08-14T11:21:00.245461Z"
},
"creator": {
"banned": false,
"deleted_at": null,
"email": "user1@a.com",
"full_name": "John Foo",
"id": "00000000-0000-0000-0000-000000000636",
"role": {
"id": "00000000-0000-0000-0000-000000000673",
"name": "Admin 1650"
}
},
"custom_data": [],
"delivery_datetime": "2020-01-01T00:00:00.000000Z",
"due_datetime": "2020-01-01T00:00:01.000000Z",
"external_notes": null,
"id": "94a717e1-dd9e-41cf-b3e2-9d36e3e65a47",
"inserted_datetime": "2026-08-14T11:21:00.324694Z",
"internal_notes": null,
"inventory_source": {
"address": "123 Fake Street, Beverly Hills, CA 90210, US",
"company_id": "00000000-0000-0000-0000-00000000049e",
"id": "00000000-0000-0000-0000-00000000016f",
"license_id": null,
"license_number": null,
"name": "Place 366"
},
"items": [
{
"batch": {
"batch_number": null,
"id": "00000000-0000-0000-0000-000000000161",
"name": "B1"
},
"compliance_quantity": null,
"cost_per_unit": null,
"cost_per_unit_default": null,
"id": "9cd10736-f99d-4aaf-b0c0-849f5edc3198",
"is_sample": false,
"location": {
"address": "123 Fake Street, Beverly Hills, CA 90210, US",
"company_id": "00000000-0000-0000-0000-00000000049e",
"id": "00000000-0000-0000-0000-000000000169",
"license_id": "00000000-0000-0000-0000-000000000046",
"name": "Place 360"
},
"package": null,
"price": "10.000000000",
"price_base": "10.000000000",
"product": {
"id": "6a7077b2-0d7d-424a-a01c-cdf36933fcfd",
"name": "P1",
"sku": "SKU1",
"updated_datetime": "2026-08-14T11:21:00.293025Z"
},
"quantity": "1.000000000",
"returned_quantity": "0",
"total_cost_actual": null,
"total_cost_default": null
}
],
"leaflink_order_number": null,
"metrc_transfer_id": null,
"order_datetime": "2020-01-01T00:00:02.000000Z",
"order_number": "SO-69",
"owner": null,
"payment_term_name": null,
"shipping_location": {
"address": "123 Fake Street, Beverly Hills, CA 90210, US",
"company_id": "00000000-0000-0000-0000-0000000004a9",
"id": "00000000-0000-0000-0000-00000000016d",
"license_id": null,
"license_number": null,
"name": "Place 364"
},
"status": "PROCESSING",
"total": "10.00",
"updated_datetime": "2026-08-14T11:21:00.547758Z"
}
}
Upsert a single order. To update an existing order, pass in an existing order ID in the id field. When updating an order, you must pass in all fields (no sparse update currently supported). Any existing order item or charge you do not pass in to items and charges respectively will be deleted. Required permission: orders_permissions_create to create a new order, orders_permissions_edit (and access to the order under team restrictions) to update an existing order.
Request
POST /public/v1/orders
Parameters
| Parameter | Description | In | Type | Required | Default | Example |
|---|---|---|---|---|---|---|
| biotrack_id | The Biotrack ID for this order | query | string | false | ||
| blaze_payment_type | The payment type for an order shipping to a Blaze-associated company. Required when the company being used is mapped to a Blaze retailer via the Distru integration. | query | string | false | CASH | |
| company_id | Company ID | query | string | false | ||
| delivery_datetime | The datetime on which the order was / will be delivered | query | string | false | ||
| due_datetime | The datetime by which the order should be completed for the customer. Optional: when omitted, it is derived from the customer's default payment term, then the company default order payment term, then falls back to the order date (COD). | query | string | false | ||
| external_notes | This is a message that will be shown to the customer on order slips. This is the "Message to Customer" field in the Distru order form. | query | string | false | ||
| upsert_invoice | When true, create an invoice for this order if it doesn't have one yet, or update the existing invoice with the order's latest changes. | query | boolean | false | ||
| email_invoice | When true, email the order's invoice. No email is sent unless the order has an invoice (see upsert_invoice) and a recipient can be resolved from email_invoice_addresses or the buyer company relationship's invoice email. |
query | boolean | false | ||
| email_invoice_addresses | Comma-separated list of email addresses to send the invoice to when email_invoice is true. Takes precedence over the company relationship's invoice email. Invalid addresses are rejected. |
query | string | false | amy@distru.com,john@distru.com | |
| id | Unique ID for this order. If it exists, an update will be performed; otherwise, it will be used as the ID of a new order record | query | string | false | ||
| order_datetime | The datetime on which the order was placed | query | string | false | ||
| charges | The additional lines of Charge, Discount, or Tax added to this order | body | OrderChargesRequest | false | ||
| items | The order items present on this order | body | OrderItemsRequest | false | ||
| internal_notes | Internal notes for this order | query | string | false | ||
| metrc_transfer_template_transporter_info | The Metrc transfer template transporter(s) information about this order | body | OrderTransferTemplateTransporterInfosRequest | false | ||
| metrc_transfer_template_directions | The Metrc transfer template directions | query | string | false | ||
| metrc_transfer_id | The Metrc transfer ID for this order | query | integer | false | ||
| metrc_transfer_template_recipient_license_number | The Metrc transfer template recipient license number | query | string | false | ||
| metrc_transfer_template_status | The Metrc transfer template status | query | string | false | ||
| metrc_transfer_template_type | The Metrc transfer template type | query | string | false | ||
| billing_location_id | The billing location's ID | query | string | false | ||
| shipping_location_id | The shipping location's ID | query | string | false | ||
| owner_id | The ID of the Distru user that owns this order | query | string | false | ||
| status | Filter orders by their status. Accepted values are "PENDING", "PROCESSING", "READY_TO_SHIP", "DELIVERING", "DELIVERED", "COMPLETED" and "CANCELED". | query | string | false | PENDING | |
| custom_data | A map of custom field IDs to their values. Use GET /public/v1/custom-fields?model_name=order to retrieve available custom fields and their IDs. | body | object | false | {"123":"Custom Value 1","456":"Custom Value 2"} |
Responses
| Status | Description | Schema |
|---|---|---|
| 200 | A single order | Order |
Package
Get packages
GET /public/v1/packages returns packages related to the company
GET /public/v1/packages
content-type: application/json
accept: application/json
authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJhdWQiOiJEaXN0cnUiLCJleHAiOjE4MTgxNTYwNTksImlhdCI6MTc4NjcwNjQ1OSwiaXNzIjoiRGlzdHJ1IiwianRpIjoiODY3YzdmZjctMTUwNy00ZWI4LTk0ZDMtYTQ0NjNhYTdkM2QzIiwibW9iaWxlIjpmYWxzZSwibmJmIjoxNzg2NzA2NDU4LCJwbGF0Zm9ybSI6IkFQSSIsInN1YiI6IlVzZXI6MTQ1MiIsInR5cCI6ImFjY2VzcyJ9.TPkEK8BUsIZ5R5bjwYY7Wp4ABg96zGyfPT3TMpn7y2Q
Response
200
content-type: application/json; charset=utf-8
cache-control: max-age=0, private, must-revalidate
b3: bf2279a35c9b2afbfb1f7e61bde8683e-67551537d90860f1-0
{
"data": [
{
"batch_number": null,
"compliance_label": "ABCDEF012345670000000098",
"custom_data": [
{
"id": 54,
"name": "Custom Field 29",
"value": "Custom Field Value 1"
}
],
"expiration_date": "2024-01-01T00:00:00.000000Z",
"harvest_date": "2024-06-15",
"id": "00000000-0000-0000-0000-000000000034",
"is_trade_sample": true,
"lab_testing_state": "NotSubmitted",
"license": {
"id": "00000000-0000-0000-0000-00000000003d",
"license_number": "CDPH-00000062"
},
"location": {
"id": "00000000-0000-0000-0000-000000000159",
"name": "Place 344"
},
"metrc_label": "ABCDEF012345670000000098",
"packaged_date": "2024-07-01",
"primary_test_result": null,
"product_id": "4ff1c47f-d420-4c11-a7b9-0794a0940d66",
"product_unit_quantity": "7.500000000",
"product_unit_type": {
"id": "00000000-0000-0000-0000-00000000362d",
"name": "3"
},
"quantity": "5.000000000",
"quantity_assembling": "0.000000000",
"quantity_available": "5.000000000",
"status": "active",
"unit_type": {
"id": "00000000-0000-0000-0000-00000000362e",
"name": "2"
}
},
{
"batch_number": null,
"compliance_label": "ABCDEF012345670000000102",
"custom_data": [
{
"id": 54,
"name": "Custom Field 29",
"value": null
}
],
"expiration_date": null,
"harvest_date": null,
"id": "00000000-0000-0000-0000-000000000036",
"is_trade_sample": false,
"lab_testing_state": "NotSubmitted",
"license": {
"id": "00000000-0000-0000-0000-00000000003d",
"license_number": "CDPH-00000062"
},
"location": {
"id": "00000000-0000-0000-0000-000000000163",
"name": "Place 355"
},
"metrc_label": "ABCDEF012345670000000102",
"packaged_date": null,
"primary_test_result": {
"cbd_mg_per_unit": "1",
"cbd_mg_per_unit_total": "2",
"cbd_percentage": "3",
"cbd_percentage_total": "4",
"coa_url": null,
"mg_per_unit_type": "mg/mL",
"name": "File.pdf",
"thc_mg_per_unit": "5",
"thc_mg_per_unit_total": "6",
"thc_percentage": "7",
"thc_percentage_total": "8"
},
"product_id": "4ff1c47f-d420-4c11-a7b9-0794a0940d66",
"product_unit_quantity": "15.000000000",
"product_unit_type": {
"id": "00000000-0000-0000-0000-00000000362d",
"name": "3"
},
"quantity": "20.000000000",
"quantity_assembling": "0.000000000",
"quantity_available": "20.000000000",
"status": "active",
"unit_type": {
"id": "00000000-0000-0000-0000-00000000362f",
"name": "4"
}
}
],
"next_page": null
}
GET /public/v1/packages returns cost data when include_costs is true
GET /public/v1/packages?include_costs=true
content-type: application/json
accept: application/json
authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJhdWQiOiJEaXN0cnUiLCJleHAiOjE4MTgxNTYwNTgsImlhdCI6MTc4NjcwNjQ1OCwiaXNzIjoiRGlzdHJ1IiwianRpIjoiMzY2NTRjMjYtZjVkMS00Yzk0LTgzNTgtN2I4Y2IzMzU5NTg5IiwibW9iaWxlIjpmYWxzZSwibmJmIjoxNzg2NzA2NDU3LCJwbGF0Zm9ybSI6IkFQSSIsInN1YiI6IlVzZXI6ODQ5IiwidHlwIjoiYWNjZXNzIn0.VkMiQqM76cNfwJc8rUuvyWyFhvVqKyeKF8OUK4c0E0E
Response
200
content-type: application/json; charset=utf-8
cache-control: max-age=0, private, must-revalidate
b3: 6d49776492c97fc93cb7e0c306fe19da-48333dea0a5aa5c6-0
{
"data": [
{
"batch_number": null,
"compliance_label": "ABCDEF012345670000000044",
"cost_per_unit_actual": "0.4",
"cost_per_unit_default": "0.2",
"custom_data": [],
"expiration_date": null,
"harvest_date": null,
"id": "00000000-0000-0000-0000-000000000019",
"is_trade_sample": false,
"lab_testing_state": "NotSubmitted",
"license": {
"id": "00000000-0000-0000-0000-000000000022",
"license_number": "CDPH-00000035"
},
"location": {
"id": "00000000-0000-0000-0000-0000000000fa",
"name": "Place 249"
},
"metrc_label": "ABCDEF012345670000000044",
"packaged_date": "2014-11-29",
"primary_test_result": null,
"product_id": "0f2326c6-ebd5-4827-8527-7a8ece255da8",
"product_unit_quantity": "141.747462720",
"product_unit_type": {
"id": "00000000-0000-0000-0000-000000001f95",
"name": "Gram"
},
"quantity": "5.000000000",
"quantity_assembling": "0.000000000",
"quantity_available": "5.000000000",
"status": "active",
"total_cost_actual": "2",
"total_cost_default": "1",
"unit_type": {
"id": "00000000-0000-0000-0000-000000001f97",
"name": "Ounce"
}
}
],
"next_page": null
}
GET /public/v1/packages allows filtering by product_ids
GET /public/v1/packages?product_ids[]=4ca09910-2509-4890-9351-2407ecc8e3ae&product_ids[]=29d49a38-d66b-42e6-8c90-8020efd3f53e
content-type: application/json
accept: application/json
authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJhdWQiOiJEaXN0cnUiLCJleHAiOjE4MTgxNTYwNjEsImlhdCI6MTc4NjcwNjQ2MSwiaXNzIjoiRGlzdHJ1IiwianRpIjoiNDI1MDIzYmMtY2JiMS00OWEyLWI2YmEtZWFmYTdkYzM3N2ZhIiwibW9iaWxlIjpmYWxzZSwibmJmIjoxNzg2NzA2NDYwLCJwbGF0Zm9ybSI6IkFQSSIsInN1YiI6IlVzZXI6MTk3NCIsInR5cCI6ImFjY2VzcyJ9.RPN1TA9mblobQMBPiPws_t1v_m7qL3eCHVIOQpayEps
Response
200
content-type: application/json; charset=utf-8
cache-control: max-age=0, private, must-revalidate
b3: f57b56526231bbcfd5f1fc3f9dfb181c-302178ed018321dd-0
{
"data": [
{
"batch_number": null,
"compliance_label": "ABCDEF012345670000000133",
"custom_data": [],
"expiration_date": null,
"harvest_date": null,
"id": "00000000-0000-0000-0000-000000000047",
"is_trade_sample": false,
"lab_testing_state": "NotSubmitted",
"license": {
"id": "00000000-0000-0000-0000-000000000054",
"license_number": "CDPH-00000085"
},
"location": {
"id": "00000000-0000-0000-0000-0000000001af",
"name": "Place 429"
},
"metrc_label": "ABCDEF012345670000000133",
"packaged_date": null,
"primary_test_result": null,
"product_id": "4ca09910-2509-4890-9351-2407ecc8e3ae",
"product_unit_quantity": "10.000000000",
"product_unit_type": {
"id": "00000000-0000-0000-0000-000000004714",
"name": "Gram"
},
"quantity": "10.000000000",
"quantity_assembling": "0.000000000",
"quantity_available": "10.000000000",
"status": "active",
"unit_type": {
"id": "00000000-0000-0000-0000-000000004714",
"name": "Gram"
}
},
{
"batch_number": null,
"compliance_label": "ABCDEF012345670000000135",
"custom_data": [],
"expiration_date": null,
"harvest_date": null,
"id": "00000000-0000-0000-0000-000000000048",
"is_trade_sample": false,
"lab_testing_state": "NotSubmitted",
"license": {
"id": "00000000-0000-0000-0000-000000000054",
"license_number": "CDPH-00000085"
},
"location": {
"id": "00000000-0000-0000-0000-0000000001b0",
"name": "Place 430"
},
"metrc_label": "ABCDEF012345670000000135",
"packaged_date": null,
"primary_test_result": null,
"product_id": "29d49a38-d66b-42e6-8c90-8020efd3f53e",
"product_unit_quantity": "10.000000000",
"product_unit_type": {
"id": "00000000-0000-0000-0000-000000004714",
"name": "Gram"
},
"quantity": "10.000000000",
"quantity_assembling": "0.000000000",
"quantity_available": "10.000000000",
"status": "active",
"unit_type": {
"id": "00000000-0000-0000-0000-000000004714",
"name": "Gram"
}
}
],
"next_page": null
}
GET /public/v1/packages allows filtering by ids
GET /public/v1/packages?ids[]=00000000-0000-0000-0000-000000000010
content-type: application/json
accept: application/json
authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJhdWQiOiJEaXN0cnUiLCJleHAiOjE4MTgxNTYwNTcsImlhdCI6MTc4NjcwNjQ1NywiaXNzIjoiRGlzdHJ1IiwianRpIjoiN2NkNjBjMTEtYjRkMi00ZTM1LTk0ZmYtZTAyZWRmNjM1YmQyIiwibW9iaWxlIjpmYWxzZSwibmJmIjoxNzg2NzA2NDU2LCJwbGF0Zm9ybSI6IkFQSSIsInN1YiI6IlVzZXI6NTQ2IiwidHlwIjoiYWNjZXNzIn0.ikT7izEg0hx9eCaQlzC7CWJBEs419SOoo7CtdLnGU_Y
Response
200
content-type: application/json; charset=utf-8
cache-control: max-age=0, private, must-revalidate
b3: 445ec68c19d16833f7d71d74bb2b64f8-d7cb17448f4c9020-0
{
"data": [
{
"batch_number": null,
"compliance_label": "ABCDEF012345670000000031",
"custom_data": [],
"expiration_date": null,
"harvest_date": null,
"id": "00000000-0000-0000-0000-000000000010",
"is_trade_sample": false,
"lab_testing_state": "NotSubmitted",
"license": {
"id": "00000000-0000-0000-0000-000000000019",
"license_number": "CDPH-00000026"
},
"location": {
"id": "00000000-0000-0000-0000-0000000000b3",
"name": "Place 178"
},
"metrc_label": "ABCDEF012345670000000031",
"packaged_date": null,
"primary_test_result": null,
"product_id": "deb040ba-b8aa-4529-a899-b51a1b15260a",
"product_unit_quantity": "10.000000000",
"product_unit_type": {
"id": "00000000-0000-0000-0000-00000000149c",
"name": "Gram"
},
"quantity": "10.000000000",
"quantity_assembling": "0.000000000",
"quantity_available": "10.000000000",
"status": "active",
"unit_type": {
"id": "00000000-0000-0000-0000-00000000149c",
"name": "Gram"
}
}
],
"next_page": null
}
GET /public/v1/packages allows filtering by location_ids
GET /public/v1/packages?location_ids[]=00000000-0000-0000-0000-00000000010e&location_ids[]=00000000-0000-0000-0000-00000000010f
content-type: application/json
accept: application/json
authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJhdWQiOiJEaXN0cnUiLCJleHAiOjE4MTgxNTYwNTgsImlhdCI6MTc4NjcwNjQ1OCwiaXNzIjoiRGlzdHJ1IiwianRpIjoiODY1NzRlNGQtOGQyNy00NWIzLTg1ZDMtMjA1MzM3NjYxZjAwIiwibW9iaWxlIjpmYWxzZSwibmJmIjoxNzg2NzA2NDU3LCJwbGF0Zm9ybSI6IkFQSSIsInN1YiI6IlVzZXI6OTY1IiwidHlwIjoiYWNjZXNzIn0.F3ToUBYrtdAIS-I4D7orIqD3mLZjgoZ1YsgOzBc9woQ
Response
200
content-type: application/json; charset=utf-8
cache-control: max-age=0, private, must-revalidate
b3: 22c747df4a36aadcd45a03080e0be6b9-a535a7731654ef1f-0
{
"data": [
{
"batch_number": null,
"compliance_label": "ABCDEF012345670000000061",
"custom_data": [],
"expiration_date": null,
"harvest_date": null,
"id": "00000000-0000-0000-0000-000000000020",
"is_trade_sample": false,
"lab_testing_state": "NotSubmitted",
"license": {
"id": "00000000-0000-0000-0000-000000000026",
"license_number": "CDPH-00000039"
},
"location": {
"id": "00000000-0000-0000-0000-00000000010e",
"name": "Place 269"
},
"metrc_label": "ABCDEF012345670000000061",
"packaged_date": null,
"primary_test_result": null,
"product_id": "2be5f43e-f872-4a4c-80a0-ff9c5d3748ba",
"product_unit_quantity": "10.000000000",
"product_unit_type": {
"id": "00000000-0000-0000-0000-000000002422",
"name": "Gram"
},
"quantity": "10.000000000",
"quantity_assembling": "0.000000000",
"quantity_available": "10.000000000",
"status": "active",
"unit_type": {
"id": "00000000-0000-0000-0000-000000002422",
"name": "Gram"
}
},
{
"batch_number": null,
"compliance_label": "ABCDEF012345670000000063",
"custom_data": [],
"expiration_date": null,
"harvest_date": null,
"id": "00000000-0000-0000-0000-000000000022",
"is_trade_sample": false,
"lab_testing_state": "NotSubmitted",
"license": {
"id": "00000000-0000-0000-0000-000000000026",
"license_number": "CDPH-00000039"
},
"location": {
"id": "00000000-0000-0000-0000-00000000010f",
"name": "Place 270"
},
"metrc_label": "ABCDEF012345670000000063",
"packaged_date": null,
"primary_test_result": null,
"product_id": "54b80d3d-520e-4fa3-8f58-5f5291a6d513",
"product_unit_quantity": "10.000000000",
"product_unit_type": {
"id": "00000000-0000-0000-0000-000000002422",
"name": "Gram"
},
"quantity": "10.000000000",
"quantity_assembling": "0.000000000",
"quantity_available": "10.000000000",
"status": "active",
"unit_type": {
"id": "00000000-0000-0000-0000-000000002422",
"name": "Gram"
}
}
],
"next_page": null
}
GET /public/v1/packages allows filtering by status
GET /public/v1/packages?statuses[]=active&statuses[]=finished
content-type: application/json
accept: application/json
authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJhdWQiOiJEaXN0cnUiLCJleHAiOjE4MTgxNTYwNjAsImlhdCI6MTc4NjcwNjQ2MCwiaXNzIjoiRGlzdHJ1IiwianRpIjoiZjhiYjE0ODktOTM1Zi00NzZiLTgyMTktMTkwYWJmMDFjOGEzIiwibW9iaWxlIjpmYWxzZSwibmJmIjoxNzg2NzA2NDU5LCJwbGF0Zm9ybSI6IkFQSSIsInN1YiI6IlVzZXI6MTcwMiIsInR5cCI6ImFjY2VzcyJ9.mtVk1DSCiaV-iUHDwtW6FYr7ESo2OjCnwhU3vPf-FJE
Response
200
content-type: application/json; charset=utf-8
cache-control: max-age=0, private, must-revalidate
b3: 39cb2f36ef6f9d119d90928bff037789-f8a7ea85a2ec0995-0
{
"data": [
{
"batch_number": null,
"compliance_label": "ABCDEF012345670000000116",
"custom_data": [],
"expiration_date": null,
"harvest_date": null,
"id": "00000000-0000-0000-0000-00000000003f",
"is_trade_sample": false,
"lab_testing_state": "NotSubmitted",
"license": {
"id": "00000000-0000-0000-0000-00000000004c",
"license_number": "CDPH-00000077"
},
"location": {
"id": "00000000-0000-0000-0000-00000000017d",
"name": "Place 380"
},
"metrc_label": "ABCDEF012345670000000116",
"packaged_date": "2014-11-29",
"primary_test_result": null,
"product_id": "0576cc0c-3333-45bc-b1d7-5d89119a766b",
"product_unit_quantity": "1.000000000",
"product_unit_type": {
"id": "00000000-0000-0000-0000-000000003e20",
"name": "Ounce"
},
"quantity": "1.000000000",
"quantity_assembling": "0.000000000",
"quantity_available": "1.000000000",
"status": "active",
"unit_type": {
"id": "00000000-0000-0000-0000-000000003e20",
"name": "Ounce"
}
},
{
"batch_number": null,
"compliance_label": "ABCDEF012345670000000120",
"custom_data": [],
"expiration_date": null,
"harvest_date": null,
"id": "00000000-0000-0000-0000-000000000042",
"is_trade_sample": false,
"lab_testing_state": "NotSubmitted",
"license": {
"id": "00000000-0000-0000-0000-00000000004c",
"license_number": "CDPH-00000077"
},
"location": {
"id": "00000000-0000-0000-0000-000000000185",
"name": "Place 388"
},
"metrc_label": "ABCDEF012345670000000120",
"packaged_date": "2014-11-29",
"primary_test_result": null,
"product_id": "13eb1940-cfc8-406f-b188-87ba7664e1c8",
"product_unit_quantity": "0.000000000",
"product_unit_type": {
"id": "00000000-0000-0000-0000-000000003e20",
"name": "Ounce"
},
"quantity": "0.000000000",
"quantity_assembling": "0.000000000",
"quantity_available": "0.000000000",
"status": "finished",
"unit_type": {
"id": "00000000-0000-0000-0000-000000003e20",
"name": "Ounce"
}
}
],
"next_page": null
}
Get packages sorted by their creation date and filtered by various attributes
Note: The page size for this endpoint is 5000 packages per page. This endpoint returns eventually consistent data, with changes taking up to 1 second to propagate in responses.
Required permission: products_permissions_view. Results are filtered to
only include packages the authenticated user can access under their team
restrictions.
Request
GET /public/v1/packages
Parameters
| Parameter | Description | In | Type | Required | Default | Example |
|---|---|---|---|---|---|---|
| inserted_datetime | Filter packages by their creation datetime | query | string | false | 2022-07-10T00:00:00Z, | |
| page | Pagination information | query | number | false | ?page[number]=1 | |
| location_ids | A list of location UUIDs to filter packages by. | query | array | false | ?location_ids[]=c40e87ce-0647-409b-89fa-620275d77fcc&location_ids[]=65ca530a-1ea2-439b-b4c2-598abb1fc6f3 | |
| license_number | Filter packages by license number | query | string | false | 1234567890 | |
| ids | Filter packages by package ID (same UUID string as each package's id in responses). Values that do not decode to an internal package id match no rows. | query | array | false | ?ids[]=00000000-0000-0000-0000-000000000001&ids[]=00000000-0000-0000-0000-000000000002 | |
| product_ids | Filter packages by product ID | query | array | false | ?product_ids[]=c40e87ce-0647-409b-89fa-620275d77fcc&product_ids[]=65ca530a-1ea2-439b-b4c2-598abb1fc6f3 | |
| statuses | Filter packages by their status | query | array | false | ?statuses[]=active&statuses[]=selling&statuses[]=sold | |
| updated_datetime | Filter packages by the datetime they were most recently modified | query | string | false | ,2022-07-10T00:00:00Z |
Responses
| Status | Description | Schema |
|---|---|---|
| 200 | A list of packages | Packages |
Payment
Get a payment
GET /public/v1/payments/:id returns a single payment
GET /public/v1/payments/00000000-0000-0000-0000-000000000001
content-type: application/json
accept: application/json
authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJhdWQiOiJEaXN0cnUiLCJleHAiOjE4MTgxNTYwNTUsImlhdCI6MTc4NjcwNjQ1NSwiaXNzIjoiRGlzdHJ1IiwianRpIjoiMzE2OTdjODctZmZjZi00NWNiLWE5ODItYjQwMDIxOTQ0NGE5IiwibW9iaWxlIjpmYWxzZSwibmJmIjoxNzg2NzA2NDU0LCJwbGF0Zm9ybSI6IkFQSSIsInN1YiI6IlVzZXI6NTUiLCJ0eXAiOiJhY2Nlc3MifQ.H6rvTH9XtyXjLSG5-ZFpfIKJcoNgHJXv7T_tZPUgmrs
Response
200
content-type: application/json; charset=utf-8
cache-control: max-age=0, private, must-revalidate
b3: 2bb3c6c80c86c51e203f691610dcfa43-e40ddc842dfa412f-0
{
"data": {
"amount": "10",
"company": {
"id": "00000000-0000-0000-0000-000000000018",
"name": "Company 54",
"updated_datetime": "2026-08-14T11:20:55.382818Z"
},
"credit_uses": [],
"description": null,
"fully_paid_with_credits": false,
"id": "00000000-0000-0000-0000-000000000001",
"inserted_datetime": "2026-08-14T11:20:55.446729Z",
"invoice": {
"id": "00000000-0000-0000-0000-000000000004",
"invoice_number": "Invoice #3",
"status": "NOT_PAID",
"total": "32.00"
},
"overpayment_credits": [],
"payment_date": "2026-08-14T11:20:55.446246Z",
"payment_method": {
"deleted_at": null,
"id": "00000000-0000-0000-0000-000000000001",
"name": "Payment Method 0"
},
"payment_number": "Payment #0",
"payment_type": "INVOICE",
"purchase": null,
"quickbooks_deposit_account_id": null,
"quickbooks_deposit_account_name": null,
"status": "POSTED",
"updated_datetime": "2026-08-14T11:20:55.446729Z"
}
}
Get a single payment given the ID.
Required permission: payments_permissions_view.
Request
GET /public/v1/payments/{id}
Parameters
| Parameter | Description | In | Type | Required | Default | Example |
|---|---|---|---|---|---|---|
| id | Payment ID | path | string | true |
Responses
| Status | Description | Schema |
|---|---|---|
| 200 | A single payment | Payment |
| 404 | Not Found |
Get payments
GET /public/v1/payments returns invoice and purchase payments related to the company
GET /public/v1/payments
content-type: application/json
accept: application/json
authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJhdWQiOiJEaXN0cnUiLCJleHAiOjE4MTgxNTYwNTcsImlhdCI6MTc4NjcwNjQ1NywiaXNzIjoiRGlzdHJ1IiwianRpIjoiMmNkM2U0M2YtYjk1MS00NDIyLTgwODMtYjE0N2NiNzMxZjI0IiwibW9iaWxlIjpmYWxzZSwibmJmIjoxNzg2NzA2NDU2LCJwbGF0Zm9ybSI6IkFQSSIsInN1YiI6IlVzZXI6NTQ5IiwidHlwIjoiYWNjZXNzIn0.B_uP-Y30KWPKKGPgA2pYudDYdh3JdPwQghQReV4qgJQ
Response
200
content-type: application/json; charset=utf-8
cache-control: max-age=0, private, must-revalidate
b3: af3304dcacefa21eac0ca166938db9fc-50891e6a50bedf91-0
{
"data": [
{
"amount": "75.25",
"company": {
"id": "00000000-0000-0000-0000-00000000009c",
"name": "Company 447",
"updated_datetime": "2026-08-14T11:20:57.313995Z"
},
"credit_uses": null,
"description": "pur payment",
"fully_paid_with_credits": false,
"id": "00000000-0000-0000-0000-000000000013",
"inserted_datetime": "2026-08-14T11:20:57.331367Z",
"invoice": null,
"overpayment_credits": null,
"payment_date": "2026-08-14T11:20:57.330847Z",
"payment_method": {
"deleted_at": null,
"id": "00000000-0000-0000-0000-00000000001d",
"name": "Payment Method 28"
},
"payment_number": "Payment #18",
"payment_type": "PURCHASE",
"purchase": {
"id": "00000000-0000-0000-0000-00000000000e",
"purchase_number": "Purchase #13",
"status": "PENDING",
"total": "32.00"
},
"quickbooks_deposit_account_id": null,
"status": "POSTED",
"updated_datetime": "2026-08-14T11:20:57.331367Z"
},
{
"amount": "150.5",
"company": {
"id": "00000000-0000-0000-0000-000000000095",
"name": "Company 437",
"updated_datetime": "2026-08-14T11:20:57.272346Z"
},
"credit_uses": [],
"description": "inv payment",
"fully_paid_with_credits": false,
"id": "00000000-0000-0000-0000-000000000011",
"inserted_datetime": "2026-08-14T11:20:57.293768Z",
"invoice": {
"id": "00000000-0000-0000-0000-000000000014",
"invoice_number": "Invoice #19",
"status": "NOT_PAID",
"total": "32.00"
},
"overpayment_credits": [],
"payment_date": "2026-08-14T11:20:57.292738Z",
"payment_method": {
"deleted_at": null,
"id": "00000000-0000-0000-0000-00000000001b",
"name": "Payment Method 26"
},
"payment_number": "Payment #16",
"payment_type": "INVOICE",
"purchase": null,
"quickbooks_deposit_account_id": null,
"status": "POSTED",
"updated_datetime": "2026-08-14T11:20:57.293768Z"
}
],
"next_page": null
}
Get payments sorted by their creation date and filtered by various attributes.
A payment is either an invoice payment (money received from a customer) or a purchase
payment (money paid to a vendor), distinguished by the payment_type field.
Note: The page size for this endpoint is 1000 payments per page. This endpoint returns eventually consistent data, with changes taking up to 1 second to propagate in responses.
Required permission: payments_permissions_view.
Request
GET /public/v1/payments
Parameters
| Parameter | Description | In | Type | Required | Default | Example |
|---|---|---|---|---|---|---|
| inserted_datetime | Filter payments by their creation datetime | query | string | false | 2022-07-10T00:00:00Z, | |
| page | Pagination information | query | number | false | ?page[number]=1 | |
| payment_date | Filter payments by their payment datetime | query | string | false | 2022-07-10T00:00:00Z, | |
| payment_number | Filter payments whose payment number contains this value | query | string | false | ||
| payment_status | Filter payments by their status. Defaults to returning both posted and voided payments. | query | string | false | ||
| payment_type | Filter payments by whether they belong to an invoice or a purchase | query | string | false | ||
| updated_datetime | Filter payments by the datetime they were most recently modified | query | string | false | ,2022-07-10T00:00:00Z |
Responses
| Status | Description | Schema |
|---|---|---|
| 200 | A list of payments | Payments |
PaymentMethod
Get a payment method
GET /public/v1/payment-methods/:id returns a single payment method
GET /public/v1/payment-methods/00000000-0000-0000-0000-000000000011
content-type: application/json
accept: application/json
authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJhdWQiOiJEaXN0cnUiLCJleHAiOjE4MTgxNTYwNTYsImlhdCI6MTc4NjcwNjQ1NiwiaXNzIjoiRGlzdHJ1IiwianRpIjoiZDZhYWFmZjYtNTRjMi00YzczLWE3MDQtOGZlYmI3NDJhNDM2IiwibW9iaWxlIjpmYWxzZSwibmJmIjoxNzg2NzA2NDU1LCJwbGF0Zm9ybSI6IkFQSSIsInN1YiI6IlVzZXI6Mzk2IiwidHlwIjoiYWNjZXNzIn0.YIK_iNDH4tobAHsJMzJvQvO-VSP8WZHM3ifMahjV66k
Response
200
content-type: application/json; charset=utf-8
cache-control: max-age=0, private, must-revalidate
b3: ba01188c0f25480e5a1e58bc0624541f-ef4b0945be5ae2b7-0
{
"data": {
"deleted_at": null,
"id": "00000000-0000-0000-0000-000000000011",
"name": "Cash"
}
}
Get a single payment method given the ID.
Required permission: settings_permissions_payment_methods.
Request
GET /public/v1/payment-methods/{id}
Parameters
| Parameter | Description | In | Type | Required | Default | Example |
|---|---|---|---|---|---|---|
| id | Payment Method ID | path | string | true |
Responses
| Status | Description | Schema |
|---|---|---|
| 200 | A single payment method | PaymentMethod |
| 404 | Not Found |
Get payment methods
GET /public/v1/payment-methods returns payment methods related to the user's company only
GET /public/v1/payment-methods
content-type: application/json
accept: application/json
authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJhdWQiOiJEaXN0cnUiLCJleHAiOjE4MTgxNTYwNTYsImlhdCI6MTc4NjcwNjQ1NiwiaXNzIjoiRGlzdHJ1IiwianRpIjoiZThiYzFiMzEtMWJhZC00OWQ3LWJkNmUtODgxMmM3OWE0MTgyIiwibW9iaWxlIjpmYWxzZSwibmJmIjoxNzg2NzA2NDU1LCJwbGF0Zm9ybSI6IkFQSSIsInN1YiI6IlVzZXI6NDY5IiwidHlwIjoiYWNjZXNzIn0._VOJyG2w-YmxSXYS_CNLejx2MEtexnscC9hetihcEvI
Response
200
content-type: application/json; charset=utf-8
cache-control: max-age=0, private, must-revalidate
b3: 95f87097292fe0ce208fc76b8f195803-9377c377f2304a29-0
{
"data": [
{
"deleted_at": null,
"id": "00000000-0000-0000-0000-000000000014",
"name": "Payment Method 19"
}
],
"next_page": null
}
Get payment methods. Note: This endpoint returns eventually consistent data, with changes taking up to 1 second to propagate in responses.
Required permission: settings_permissions_payment_methods.
Request
GET /public/v1/payment-methods
Parameters
| Parameter | Description | In | Type | Required | Default | Example |
|---|---|---|---|---|---|---|
| deleted | Filter deleted payment methods. no returns non-deleted, only returns deleted, include returns both. |
query | string | false | no |
Responses
| Status | Description | Schema |
|---|---|---|
| 200 | A list of payment methods | PaymentMethods |
PaymentTerm
Get payment terms
GET /public/v1/payment-terms returns payment terms related to the user's company only
GET /public/v1/payment-terms
content-type: application/json
accept: application/json
authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJhdWQiOiJEaXN0cnUiLCJleHAiOjE4MTgxNTYwNTUsImlhdCI6MTc4NjcwNjQ1NSwiaXNzIjoiRGlzdHJ1IiwianRpIjoiNDJjMDY0YTItZTAzNi00YjI4LWEzNTktNGU3Y2I1ZTU5YzU4IiwibW9iaWxlIjpmYWxzZSwibmJmIjoxNzg2NzA2NDU0LCJwbGF0Zm9ybSI6IkFQSSIsInN1YiI6IlVzZXI6MTA3IiwidHlwIjoiYWNjZXNzIn0.EksPNb2alwzddzzpASfzGNd0cBO4YFUTK13kIEDjpLg
Response
200
content-type: application/json; charset=utf-8
cache-control: max-age=0, private, must-revalidate
b3: c181acc82e7b08c5f2ca36c659542631-0e5effd1f898f11b-0
{
"data": [
{
"days": 30,
"id": "00000000-0000-0000-0000-000000000003",
"locked": false,
"name": "Net 30",
"time_of_day": "17:00:00"
}
],
"next_page": null
}
Get payment terms. Note: This endpoint returns eventually consistent data, with changes taking up to 1 second to propagate in responses.
Required permission: settings_permissions_payment_terms.
Request
GET /public/v1/payment-terms
Responses
| Status | Description | Schema |
|---|---|---|
| 200 | A list of payment terms | PaymentTerms |
Product
Get a product
GET /public/v1/products/:id returns a single product
GET /public/v1/products/c82e0033-f971-460d-bfd6-6b21b414f98f
content-type: application/json
accept: application/json
authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJhdWQiOiJEaXN0cnUiLCJleHAiOjE4MTgxNTYwNjIsImlhdCI6MTc4NjcwNjQ2MiwiaXNzIjoiRGlzdHJ1IiwianRpIjoiOWM2NWZjNmMtYTk4Yi00NDYwLTg0YWYtZGNmMmM0NzQ0ODM3IiwibW9iaWxlIjpmYWxzZSwibmJmIjoxNzg2NzA2NDYxLCJwbGF0Zm9ybSI6IkFQSSIsInN1YiI6IlVzZXI6MjE2OCIsInR5cCI6ImFjY2VzcyJ9.hCoo7PaAh19q_rBQtO_8UgIXnNuFiQAuimCRgTz7Uwk
Response
200
content-type: application/json; charset=utf-8
cache-control: max-age=0, private, must-revalidate
b3: 4330ae6a54be53354a2a641667e3f3c3-b0db421f6a2e1aeb-0
{
"data": {
"gross_weight": null,
"total_cannabinoid_unit": null,
"updated_datetime": "2026-08-14T11:21:02.612956Z",
"bill_of_materials": null,
"category": {
"id": "00000000-0000-0000-0000-000000000242",
"name": "Some category 576",
"official_product_category_id": "OTHER"
},
"unit_serving_size": null,
"msrp": null,
"total_cbd": null,
"product_group": {
"id": "00000000-0000-0000-0000-000000000230",
"name": "Product Group 558"
},
"description_markdown": null,
"gross_weight_unit_type": null,
"sku": "SKU001",
"deleted_at": null,
"menus": [],
"description": null,
"name": "Test Product",
"id": "c82e0033-f971-460d-bfd6-6b21b414f98f",
"total_thc": null,
"unit_cost": null,
"unit_type": {
"id": "00000000-0000-0000-0000-000000004cd9",
"name": "Gram"
},
"tags": [],
"quantity_available_threshold_min": null,
"images": [],
"is_featured": false,
"custom_data": [],
"owner": {
"banned": false,
"deleted_at": null,
"email": "owner-2158@example.com",
"full_name": "FirstName4386 LastName4387",
"id": "00000000-0000-0000-0000-00000000087b",
"role": {
"id": "00000000-0000-0000-0000-0000000008c1",
"name": "Admin 2240"
}
},
"brand": null,
"wholesale_unit_price": null,
"external_name": null,
"vendor": {
"id": "00000000-0000-0000-0000-00000000036c",
"name": "Company 1568",
"updated_datetime": "2026-08-14T11:21:02.611246Z"
},
"quantity_available_threshold_max": null,
"upc": null,
"unit_net_weight": null,
"strain": null,
"is_active": true,
"subcategory": {
"id": "00000000-0000-0000-0000-000000000232",
"name": "Some subcategory 560"
},
"unit_price": "1",
"units_per_case": null,
"unit_net_weight_serving_size_unit_type": null
}
}
Get a single product given the ID. The response always includes the product's
bill_of_materials (or null if it has none).
Required permission: products_permissions_view.
Request
GET /public/v1/products/{id}
Parameters
| Parameter | Description | In | Type | Required | Default | Example |
|---|---|---|---|---|---|---|
| id | Product ID | path | string | true |
Responses
| Status | Description | Schema |
|---|---|---|
| 200 | A single product | Product |
| 404 | Not Found |
Get products
GET /public/products returns products related to the company
GET /public/v1/products
content-type: application/json
accept: application/json
authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJhdWQiOiJEaXN0cnUiLCJleHAiOjE4MTgxNTYwNjIsImlhdCI6MTc4NjcwNjQ2MiwiaXNzIjoiRGlzdHJ1IiwianRpIjoiMjVhNjNkZGItMzdhNC00NTU1LWJkMTktZTkxNTRlMjE3NzY3IiwibW9iaWxlIjpmYWxzZSwibmJmIjoxNzg2NzA2NDYxLCJwbGF0Zm9ybSI6IkFQSSIsInN1YiI6IlVzZXI6MjA3NCIsInR5cCI6ImFjY2VzcyJ9.FuX0tWpxj-KXKgsoTDphY7NvobtEBVIv2X9VJ0k8YIE
Response
200
content-type: application/json; charset=utf-8
cache-control: max-age=0, private, must-revalidate
b3: cde7b62bc6ed7ee5b813cdf47820fdaa-11963c770e6f96e5-0
{
"data": [
{
"gross_weight": null,
"total_cannabinoid_unit": "PERCENT",
"updated_datetime": "2023-11-01T00:00:00.000000Z",
"category": {
"id": "00000000-0000-0000-0000-00000000022b",
"name": "Some category 553",
"official_product_category_id": "OTHER"
},
"unit_serving_size": "10",
"msrp": null,
"total_cbd": "3",
"product_group": {
"id": "00000000-0000-0000-0000-00000000021a",
"name": "Product Group 536"
},
"description_markdown": "# test",
"gross_weight_unit_type": null,
"sku": "sku 1527",
"deleted_at": null,
"menus": [],
"description": "test",
"name": "Product 1526",
"id": "3df938a2-fd0c-4f45-8851-b946ba80007c",
"total_thc": "12",
"unit_cost": null,
"unit_type": {
"id": "00000000-0000-0000-0000-000000004a21",
"name": "Gram"
},
"tags": [
{
"id": "00000000-0000-0000-0000-000000000011",
"name": "Tag 1"
}
],
"quantity_available_threshold_min": "5",
"images": [
{
"id": "00000000-0000-0000-0000-00000000000a",
"name": "Image Name 137",
"rank": 0,
"url": "https://google.com/original-5.jpg"
},
{
"id": "00000000-0000-0000-0000-00000000000b",
"name": "Image Name 140",
"rank": 1,
"url": "https://google.com/original-6.jpg"
}
],
"is_featured": true,
"custom_data": [
{
"id": 64,
"name": "Custom Field 39",
"value": "Custom Field Value 1"
}
],
"owner": {
"banned": false,
"deleted_at": null,
"email": "product-owner@example.com",
"full_name": "FirstName4220 LastName4221",
"id": "00000000-0000-0000-0000-000000000827",
"role": {
"id": "00000000-0000-0000-0000-00000000086c",
"name": "Admin 2155"
}
},
"brand": {
"id": "00000000-0000-0000-0000-000000000349",
"name": "Company 1513",
"updated_datetime": "2030-11-01T00:00:00.000000Z"
},
"wholesale_unit_price": 90.5,
"external_name": "External Name",
"vendor": {
"id": "00000000-0000-0000-0000-00000000034b",
"name": "Company 1515",
"updated_datetime": "2030-11-03T00:00:00.000000Z"
},
"quantity_available_threshold_max": "50",
"upc": "036000291452",
"unit_net_weight": "20",
"strain": {
"id": "00000000-0000-0000-0000-000000000026",
"name": "Strain 33",
"strain_type": "INDICA"
},
"is_active": true,
"subcategory": {
"id": "00000000-0000-0000-0000-00000000021c",
"name": "Some subcategory 538"
},
"unit_price": "1",
"units_per_case": null,
"unit_net_weight_serving_size_unit_type": {
"id": "00000000-0000-0000-0000-000000004a23",
"name": "Ounce"
}
},
{
"gross_weight": null,
"total_cannabinoid_unit": null,
"updated_datetime": "2023-11-02T00:00:00.000000Z",
"category": {
"id": "00000000-0000-0000-0000-00000000022d",
"name": "Some category 555",
"official_product_category_id": "OTHER"
},
"unit_serving_size": null,
"msrp": "100",
"total_cbd": null,
"product_group": {
"id": "00000000-0000-0000-0000-00000000021b",
"name": "Product Group 537"
},
"description_markdown": null,
"gross_weight_unit_type": null,
"sku": "sku 1530",
"deleted_at": null,
"menus": [],
"description": null,
"name": "Product 1529",
"id": "b31b6c7a-1a4a-411b-8372-792f99a1878f",
"total_thc": null,
"unit_cost": null,
"unit_type": {
"id": "00000000-0000-0000-0000-000000004a1f",
"name": "Pound"
},
"tags": [],
"quantity_available_threshold_min": null,
"images": [],
"is_featured": false,
"custom_data": [
{
"id": 64,
"name": "Custom Field 39",
"value": null
}
],
"owner": {
"banned": false,
"deleted_at": null,
"email": "product-owner@example.com",
"full_name": "FirstName4220 LastName4221",
"id": "00000000-0000-0000-0000-000000000827",
"role": {
"id": "00000000-0000-0000-0000-00000000086c",
"name": "Admin 2155"
}
},
"brand": {
"id": "00000000-0000-0000-0000-00000000034a",
"name": "Company 1514",
"updated_datetime": "2030-11-02T00:00:00.000000Z"
},
"wholesale_unit_price": null,
"external_name": null,
"vendor": {
"id": "00000000-0000-0000-0000-00000000034c",
"name": "Company 1517",
"updated_datetime": "2030-11-04T00:00:00.000000Z"
},
"quantity_available_threshold_max": null,
"upc": null,
"unit_net_weight": null,
"strain": null,
"is_active": false,
"subcategory": {
"id": "00000000-0000-0000-0000-00000000021d",
"name": "Some subcategory 539"
},
"unit_price": "1",
"units_per_case": null,
"unit_net_weight_serving_size_unit_type": null
}
],
"next_page": null
}
GET /public/products includes bill of materials when requested and gates cost_per_unit by permission
GET /public/v1/products?include_bill_of_materials=true
content-type: application/json
accept: application/json
authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJhdWQiOiJEaXN0cnUiLCJleHAiOjE4MTgxNTYwNjAsImlhdCI6MTc4NjcwNjQ2MCwiaXNzIjoiRGlzdHJ1IiwianRpIjoiMWUzZTZiYzEtMzdhOS00YWEyLTk4MjMtNDZkNWY5OTQzY2EyIiwibW9iaWxlIjpmYWxzZSwibmJmIjoxNzg2NzA2NDU5LCJwbGF0Zm9ybSI6IkFQSSIsInN1YiI6IlVzZXI6MTc3MCIsInR5cCI6ImFjY2VzcyJ9.BYn9nwicUZvhuZ2u9QD2h3P3SVdLjj6VjTvx50AGWUY
Response
200
content-type: application/json; charset=utf-8
cache-control: max-age=0, private, must-revalidate
b3: 81460fddbcaf27c8a288ca9e3daefe55-b269c628e96724c2-0
{
"data": [
{
"gross_weight": null,
"total_cannabinoid_unit": null,
"updated_datetime": "2026-08-14T11:21:00.836321Z",
"bill_of_materials": null,
"category": {
"id": "00000000-0000-0000-0000-0000000001bd",
"name": "Some category 443",
"official_product_category_id": "OTHER"
},
"unit_serving_size": null,
"msrp": null,
"total_cbd": null,
"product_group": {
"id": "00000000-0000-0000-0000-0000000001ae",
"name": "Product Group 428"
},
"description_markdown": null,
"gross_weight_unit_type": null,
"sku": "sku 1232",
"deleted_at": null,
"menus": [],
"description": null,
"name": "Product 1231",
"id": "930a5043-755c-48c2-914b-07dbed8c095f",
"total_thc": null,
"unit_cost": null,
"unit_type": {
"id": "00000000-0000-0000-0000-00000000408e",
"name": "Gram"
},
"tags": [],
"quantity_available_threshold_min": null,
"images": [],
"is_featured": false,
"custom_data": [],
"owner": {
"banned": false,
"deleted_at": null,
"email": "owner-1766@example.com",
"full_name": "FirstName3586 LastName3587",
"id": "00000000-0000-0000-0000-0000000006ed",
"role": {
"id": "00000000-0000-0000-0000-00000000072d",
"name": "Admin 1836"
}
},
"brand": null,
"wholesale_unit_price": null,
"external_name": null,
"vendor": {
"id": "00000000-0000-0000-0000-0000000002bd",
"name": "Company 1322",
"updated_datetime": "2026-08-14T11:21:00.832641Z"
},
"quantity_available_threshold_max": null,
"upc": null,
"unit_net_weight": null,
"strain": null,
"is_active": true,
"subcategory": {
"id": "00000000-0000-0000-0000-0000000001b0",
"name": "Some subcategory 430"
},
"unit_price": "1",
"units_per_case": null,
"unit_net_weight_serving_size_unit_type": null
},
{
"gross_weight": null,
"total_cannabinoid_unit": null,
"updated_datetime": "2026-08-14T11:21:00.854076Z",
"bill_of_materials": {
"costs": [
{
"cost_type": {
"cost_per_unit": "1",
"id": "00000000-0000-0000-0000-000000000012",
"name": "CostType 16",
"unit_type": {
"id": "00000000-0000-0000-0000-000000004171",
"name": "Unit Type 24"
}
},
"description": "Labor",
"id": "a6edb8c0-b988-4b1f-8745-fcaa5ea9ad5e",
"quantity": "1"
}
],
"description": "Recipe desc",
"id": "00000000-0000-0000-0000-000000000001",
"inputs": [
{
"filter": null,
"id": "00000000-0000-0000-0000-000000000001",
"product": {
"id": "1adacb87-2b42-4899-8f49-55cc5ee2397b",
"name": "Product 1241",
"sku": "sku 1242",
"updated_datetime": "2026-08-14T11:21:00.867528Z"
},
"quantity": "2",
"type": "product"
},
{
"filter": {
"criteria": [
{
"type": "category",
"values": [
{
"id": "00000000-0000-0000-0000-0000000001c2",
"name": "Some category 448"
}
]
},
{
"type": "subcategory",
"values": [
{
"id": "00000000-0000-0000-0000-0000000001b5",
"name": "Some subcategory 435"
}
]
},
{
"type": "group",
"values": [
{
"id": "00000000-0000-0000-0000-0000000001b3",
"name": "Product Group 433"
}
]
},
{
"type": "unit_type",
"values": [
{
"id": "00000000-0000-0000-0000-000000004170",
"name": "Unit Type 23"
}
]
},
{
"type": "strain",
"values": [
{
"id": "00000000-0000-0000-0000-000000000024",
"name": "Strain 31"
}
]
},
{
"type": "tags",
"values": [
{
"id": "00000000-0000-0000-0000-00000000000f",
"name": "Some tag 12"
}
]
}
],
"id": "00000000-0000-0000-0000-000000000001",
"name": "Dynamic"
},
"id": "00000000-0000-0000-0000-000000000002",
"product": null,
"quantity": "1",
"type": "filter"
}
],
"name": "Recipe"
},
"category": {
"id": "00000000-0000-0000-0000-0000000001bf",
"name": "Some category 445",
"official_product_category_id": "OTHER"
},
"unit_serving_size": null,
"msrp": null,
"total_cbd": null,
"product_group": {
"id": "00000000-0000-0000-0000-0000000001b0",
"name": "Product Group 430"
},
"description_markdown": null,
"gross_weight_unit_type": null,
"sku": "sku 1236",
"deleted_at": null,
"menus": [],
"description": null,
"name": "Product 1235",
"id": "0f640d8b-ff98-4045-a34f-6b83c439e517",
"total_thc": null,
"unit_cost": null,
"unit_type": {
"id": "00000000-0000-0000-0000-00000000408e",
"name": "Gram"
},
"tags": [],
"quantity_available_threshold_min": null,
"images": [],
"is_featured": false,
"custom_data": [],
"owner": {
"banned": false,
"deleted_at": null,
"email": "owner-1773@example.com",
"full_name": "FirstName3600 LastName3601",
"id": "00000000-0000-0000-0000-0000000006f5",
"role": {
"id": "00000000-0000-0000-0000-000000000735",
"name": "Admin 1844"
}
},
"brand": null,
"wholesale_unit_price": null,
"external_name": null,
"vendor": {
"id": "00000000-0000-0000-0000-0000000002c1",
"name": "Company 1326",
"updated_datetime": "2026-08-14T11:21:00.851771Z"
},
"quantity_available_threshold_max": null,
"upc": null,
"unit_net_weight": null,
"strain": null,
"is_active": true,
"subcategory": {
"id": "00000000-0000-0000-0000-0000000001b2",
"name": "Some subcategory 432"
},
"unit_price": "1",
"units_per_case": null,
"unit_net_weight_serving_size_unit_type": null
},
{
"gross_weight": null,
"total_cannabinoid_unit": null,
"updated_datetime": "2026-08-14T11:21:00.867528Z",
"bill_of_materials": null,
"category": {
"id": "00000000-0000-0000-0000-0000000001c1",
"name": "Some category 447",
"official_product_category_id": "OTHER"
},
"unit_serving_size": null,
"msrp": null,
"total_cbd": null,
"product_group": {
"id": "00000000-0000-0000-0000-0000000001b2",
"name": "Product Group 432"
},
"description_markdown": null,
"gross_weight_unit_type": null,
"sku": "sku 1242",
"deleted_at": null,
"menus": [],
"description": null,
"name": "Product 1241",
"id": "1adacb87-2b42-4899-8f49-55cc5ee2397b",
"total_thc": null,
"unit_cost": null,
"unit_type": {
"id": "00000000-0000-0000-0000-00000000408e",
"name": "Gram"
},
"tags": [],
"quantity_available_threshold_min": null,
"images": [],
"is_featured": false,
"custom_data": [],
"owner": {
"banned": false,
"deleted_at": null,
"email": "owner-1777@example.com",
"full_name": "FirstName3608 LastName3609",
"id": "00000000-0000-0000-0000-0000000006f9",
"role": {
"id": "00000000-0000-0000-0000-000000000739",
"name": "Admin 1848"
}
},
"brand": null,
"wholesale_unit_price": null,
"external_name": null,
"vendor": {
"id": "00000000-0000-0000-0000-0000000002c3",
"name": "Company 1330",
"updated_datetime": "2026-08-14T11:21:00.864440Z"
},
"quantity_available_threshold_max": null,
"upc": null,
"unit_net_weight": null,
"strain": null,
"is_active": true,
"subcategory": {
"id": "00000000-0000-0000-0000-0000000001b4",
"name": "Some subcategory 434"
},
"unit_price": "1",
"units_per_case": null,
"unit_net_weight_serving_size_unit_type": null
}
],
"next_page": null
}
Get products sorted by their creation date and filtered by various attributes.
Note: The page size for this endpoint is 5000 products per page. This endpoint returns eventually consistent data, with changes taking up to 1 second to propagate in responses.
Required permission: products_permissions_view. Results are filtered to
only include products the authenticated user can access under their team
restrictions.
Request
GET /public/v1/products
Parameters
| Parameter | Description | In | Type | Required | Default | Example |
|---|---|---|---|---|---|---|
| product_name | Filter products by name substring | query | string | false | ||
| menu_id | Comma-separated public menu IDs; products in any of these menus are returned. Invalid tokens are ignored; if none remain, data is empty. |
query | string | false | ||
| menu_name | Case-insensitive substring match on menu name. When combined with menu_id, both conditions apply (AND). | query | string | false | ||
| inserted_datetime | Filter products by their creation datetime | query | string | false | 2022-07-10T00:00:00Z, | |
| deleted | Filter deleted products. no returns non-deleted, only returns deleted, include returns both. |
query | string | false | no | |
| ids | Filter products by product ID (same UUID as each product's id in responses). | query | array | false | ?ids[]=550e8400-e29b-41d4-a716-446655440000&ids[]=6ba7b810-9dad-11d1-80b4-00c04fd430c8 | |
| page | Pagination information | query | number | false | ?page[number]=1 | |
| updated_datetime | Filter products by the datetime they were most recently modified | query | string | false | ,2022-07-10T00:00:00Z | |
| include_bill_of_materials | When true, each product includes its bill_of_materials (or null if it has none). Defaults to false. |
query | boolean | false | false |
Responses
| Status | Description | Schema |
|---|---|---|
| 200 | A list of products | Products |
Upsert a product
POST /public/v1/products Creates a product with all optional fields set
POST /public/v1/products
content-type: application/json
accept: application/json
authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJhdWQiOiJEaXN0cnUiLCJleHAiOjE4MTgxNTYwNjEsImlhdCI6MTc4NjcwNjQ2MSwiaXNzIjoiRGlzdHJ1IiwianRpIjoiZjA1YThmYzktODI3NS00Mzc4LWFlNmEtMzQ5MjI0MGIzMWNiIiwibW9iaWxlIjpmYWxzZSwibmJmIjoxNzg2NzA2NDYwLCJwbGF0Zm9ybSI6IkFQSSIsInN1YiI6IlVzZXI6MTkwMSIsInR5cCI6ImFjY2VzcyJ9.ZgRMMwX-I5bFW1LEyhsJM3SHnQMDhV3446Jf1RxrgQY
{
"vendor_id": "00000000-0000-0000-0000-0000000002f1",
"group_id": "00000000-0000-0000-0000-0000000001d2",
"gross_weight": "7.5",
"total_cannabinoid_unit": "PERCENT",
"strain_id": "00000000-0000-0000-0000-000000000025",
"inventory_tracking_method": "PACKAGE",
"unit_serving_size": "2.2",
"msrp": "100.5",
"menu_visibility": "INCLUDE_IN_ALL",
"total_cbd": "5.2",
"description_markdown": "# My Product Description Markdown",
"sku": "12345",
"menus": [
"00000000-0000-0000-0000-000000000034"
],
"gross_weight_unit_type_id": "00000000-0000-0000-0000-00000000448c",
"description": "My Product Description",
"name": "My Product",
"owner_id": "00000000-0000-0000-0000-00000000076b",
"total_thc": "10.4",
"brand_id": "00000000-0000-0000-0000-0000000002f6",
"unit_cost": "50.4",
"category_id": "00000000-0000-0000-0000-0000000001e1",
"tags": [
"00000000-0000-0000-0000-000000000010"
],
"quantity_available_threshold_min": "5.5",
"is_featured": true,
"custom_data": {
"62": [
"VIP",
"Wholesale"
]
},
"is_inactive": true,
"wholesale_unit_price": "90.50",
"quantity_available_threshold_max": "10.5",
"subcategory_id": "00000000-0000-0000-0000-0000000001d4",
"upc": "036000291452",
"unit_net_weight": "3.1",
"unit_type_id": "00000000-0000-0000-0000-000000004495",
"unit_price": "100",
"units_per_case": "0.2",
"unit_net_weight_and_serving_size_unit_type_id": "00000000-0000-0000-0000-00000000448e"
}
Response
200
content-type: application/json; charset=utf-8
cache-control: max-age=0, private, must-revalidate
b3: a0db622ca30081c38d1f51168c3c115c-0c40c1f7b8347f97-0
{
"data": {
"gross_weight": "7.5",
"total_cannabinoid_unit": "PERCENT",
"updated_datetime": "2026-08-14T11:21:01.409704Z",
"category": {
"id": "00000000-0000-0000-0000-0000000001e1",
"name": "Some category 479",
"official_product_category_id": "OTHER"
},
"unit_serving_size": "2.2",
"msrp": "100.5",
"total_cbd": "5.2",
"product_group": {
"id": "00000000-0000-0000-0000-0000000001d2",
"name": "Product Group 464"
},
"description_markdown": "# My Product Description Markdown",
"gross_weight_unit_type": {
"id": "00000000-0000-0000-0000-00000000448c",
"name": "Gram"
},
"sku": "12345",
"deleted_at": null,
"menus": [
{
"menu_id": "00000000-0000-0000-0000-000000000034",
"menu_name": "Menu 155"
}
],
"description": "My Product Description",
"name": "My Product",
"id": "a3030798-c3cd-4668-9bb5-c618567efce7",
"total_thc": "10.4",
"unit_cost": "50.4",
"unit_type": {
"id": "00000000-0000-0000-0000-000000004495",
"name": "Unit"
},
"tags": [
{
"id": "00000000-0000-0000-0000-000000000010",
"name": "Some tag 13"
}
],
"quantity_available_threshold_min": "5.5",
"images": [],
"is_featured": true,
"custom_data": [
{
"id": 62,
"name": "Custom Field 37",
"value": "VIP,Wholesale"
}
],
"owner": {
"banned": false,
"deleted_at": null,
"email": "user1@a.com",
"full_name": "FirstName3848 LastName3849",
"id": "00000000-0000-0000-0000-00000000076b",
"role": {
"id": "00000000-0000-0000-0000-0000000007ab",
"name": "Admin 1962"
}
},
"brand": {
"id": "00000000-0000-0000-0000-0000000002f6",
"name": "Company 1408",
"updated_datetime": "2026-08-14T11:21:01.351381Z"
},
"wholesale_unit_price": 90.5,
"external_name": null,
"vendor": {
"id": "00000000-0000-0000-0000-0000000002f1",
"name": "Company 1400",
"updated_datetime": "2026-08-14T11:21:01.330548Z"
},
"quantity_available_threshold_max": "10.5",
"upc": "036000291452",
"unit_net_weight": "3.1",
"strain": {
"id": "00000000-0000-0000-0000-000000000025",
"name": "Strain 32",
"strain_type": null
},
"is_active": false,
"subcategory": {
"id": "00000000-0000-0000-0000-0000000001d4",
"name": "Some subcategory 466"
},
"unit_price": "100",
"units_per_case": "0.2",
"unit_net_weight_serving_size_unit_type": {
"id": "00000000-0000-0000-0000-00000000448e",
"name": "Ounce"
}
}
}
POST /public/v1/products Updates a product with all optional fields set
POST /public/v1/products
content-type: application/json
accept: application/json
authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJhdWQiOiJEaXN0cnUiLCJleHAiOjE4MTgxNTYwNjIsImlhdCI6MTc4NjcwNjQ2MiwiaXNzIjoiRGlzdHJ1IiwianRpIjoiY2NhM2EwMjUtZGZiZS00MDEzLTg3MGYtYjNmY2VhYzVkMmVlIiwibW9iaWxlIjpmYWxzZSwibmJmIjoxNzg2NzA2NDYxLCJwbGF0Zm9ybSI6IkFQSSIsInN1YiI6IlVzZXI6MjExNCIsInR5cCI6ImFjY2VzcyJ9.u0wGe_1O8vuwTLXynNY3Hy6ZTQ-svDFWqgsWA-i6Np0
{
"category_id": "00000000-0000-0000-0000-000000000231",
"inventory_tracking_method": "PACKAGE",
"name": "My Product",
"sku": "12345",
"unit_price": "100",
"unit_type_id": "00000000-0000-0000-0000-000000004b11",
"upc": "036000291452",
"vendor_id": "00000000-0000-0000-0000-000000000355"
}
Response
200
content-type: application/json; charset=utf-8
cache-control: max-age=0, private, must-revalidate
b3: 904b96d85f4f711182a0954e8557f7e1-6d82f47000961cac-0
{
"data": {
"gross_weight": null,
"total_cannabinoid_unit": null,
"updated_datetime": "2026-08-14T11:21:02.317119Z",
"category": {
"id": "00000000-0000-0000-0000-000000000231",
"name": "Some category 559",
"official_product_category_id": "OTHER"
},
"unit_serving_size": null,
"msrp": null,
"total_cbd": null,
"product_group": null,
"description_markdown": null,
"gross_weight_unit_type": null,
"sku": "12345",
"deleted_at": null,
"menus": [],
"description": null,
"name": "My Product",
"id": "f3aa3ab5-a529-472e-9668-4fa8957ec322",
"total_thc": null,
"unit_cost": null,
"unit_type": {
"id": "00000000-0000-0000-0000-000000004b11",
"name": "Gram"
},
"tags": [],
"quantity_available_threshold_min": null,
"images": [],
"is_featured": false,
"custom_data": [],
"owner": null,
"brand": null,
"wholesale_unit_price": null,
"external_name": null,
"vendor": {
"id": "00000000-0000-0000-0000-000000000355",
"name": "Company 1534",
"updated_datetime": "2026-08-14T11:21:02.277104Z"
},
"quantity_available_threshold_max": null,
"upc": "036000291452",
"unit_net_weight": null,
"strain": null,
"is_active": true,
"subcategory": null,
"unit_price": "100",
"units_per_case": null,
"unit_net_weight_serving_size_unit_type": null
}
}
POST /public/v1/products Updates a product with all optional fields set
POST /public/v1/products
content-type: application/json
accept: application/json
authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJhdWQiOiJEaXN0cnUiLCJleHAiOjE4MTgxNTYwNjIsImlhdCI6MTc4NjcwNjQ2MiwiaXNzIjoiRGlzdHJ1IiwianRpIjoiY2NhM2EwMjUtZGZiZS00MDEzLTg3MGYtYjNmY2VhYzVkMmVlIiwibW9iaWxlIjpmYWxzZSwibmJmIjoxNzg2NzA2NDYxLCJwbGF0Zm9ybSI6IkFQSSIsInN1YiI6IlVzZXI6MjExNCIsInR5cCI6ImFjY2VzcyJ9.u0wGe_1O8vuwTLXynNY3Hy6ZTQ-svDFWqgsWA-i6Np0
{
"vendor_id": "00000000-0000-0000-0000-00000000035b",
"group_id": "00000000-0000-0000-0000-000000000224",
"gross_weight": "9.9",
"total_cannabinoid_unit": "PERCENT",
"strain_id": "00000000-0000-0000-0000-000000000027",
"inventory_tracking_method": "PACKAGE",
"unit_serving_size": "2.2",
"msrp": "100.5",
"menu_visibility": "INCLUDE_IN_ALL",
"total_cbd": "5.2",
"sku": "45678",
"menus": [
"00000000-0000-0000-0000-000000000037"
],
"gross_weight_unit_type_id": "00000000-0000-0000-0000-000000004b11",
"description": "My Product Description",
"name": "Updated Name",
"id": "f3aa3ab5-a529-472e-9668-4fa8957ec322",
"owner_id": "00000000-0000-0000-0000-00000000085c",
"total_thc": "10.4",
"brand_id": "00000000-0000-0000-0000-00000000035c",
"unit_cost": "50.4",
"category_id": "00000000-0000-0000-0000-000000000236",
"tags": [
"00000000-0000-0000-0000-000000000012"
],
"quantity_available_threshold_min": "5.5",
"is_featured": true,
"is_inactive": true,
"wholesale_unit_price": "90.50",
"external_name": "External Name",
"quantity_available_threshold_max": "10.5",
"subcategory_id": "00000000-0000-0000-0000-000000000226",
"upc": "036000291453",
"unit_net_weight": "3.1",
"unit_type_id": "00000000-0000-0000-0000-000000004b1a",
"unit_price": "200",
"units_per_case": "0.2",
"unit_net_weight_and_serving_size_unit_type_id": "00000000-0000-0000-0000-000000004b13"
}
Response
200
content-type: application/json; charset=utf-8
cache-control: max-age=0, private, must-revalidate
b3: 904b96d85f4f711182a0954e8557f7e1-139c25defd353ef4-0
{
"data": {
"gross_weight": "9.9",
"total_cannabinoid_unit": "PERCENT",
"updated_datetime": "2026-08-14T11:21:02.447867Z",
"category": {
"id": "00000000-0000-0000-0000-000000000236",
"name": "Some category 564",
"official_product_category_id": "OTHER"
},
"unit_serving_size": "2.2",
"msrp": "100.5",
"total_cbd": "5.2",
"product_group": {
"id": "00000000-0000-0000-0000-000000000224",
"name": "Product Group 546"
},
"description_markdown": "My Product Description",
"gross_weight_unit_type": {
"id": "00000000-0000-0000-0000-000000004b11",
"name": "Gram"
},
"sku": "45678",
"deleted_at": null,
"menus": [
{
"menu_id": "00000000-0000-0000-0000-000000000037",
"menu_name": "Menu 164"
}
],
"description": "My Product Description",
"name": "Updated Name",
"id": "f3aa3ab5-a529-472e-9668-4fa8957ec322",
"total_thc": "10.4",
"unit_cost": "50.4",
"unit_type": {
"id": "00000000-0000-0000-0000-000000004b1a",
"name": "Unit"
},
"tags": [
{
"id": "00000000-0000-0000-0000-000000000012",
"name": "Some tag 15"
}
],
"quantity_available_threshold_min": "5.5",
"images": [],
"is_featured": true,
"custom_data": [],
"owner": {
"banned": false,
"deleted_at": null,
"email": "user2@a.com",
"full_name": "FirstName4324 LastName4325",
"id": "00000000-0000-0000-0000-00000000085c",
"role": {
"id": "00000000-0000-0000-0000-0000000008a3",
"name": "Admin 2210"
}
},
"brand": {
"id": "00000000-0000-0000-0000-00000000035c",
"name": "Company 1544",
"updated_datetime": "2026-08-14T11:21:02.413856Z"
},
"wholesale_unit_price": 90.5,
"external_name": "External Name",
"vendor": {
"id": "00000000-0000-0000-0000-00000000035b",
"name": "Company 1541",
"updated_datetime": "2026-08-14T11:21:02.396472Z"
},
"quantity_available_threshold_max": "10.5",
"upc": "036000291453",
"unit_net_weight": "3.1",
"strain": {
"id": "00000000-0000-0000-0000-000000000027",
"name": "Strain 34",
"strain_type": null
},
"is_active": false,
"subcategory": {
"id": "00000000-0000-0000-0000-000000000226",
"name": "Some subcategory 548"
},
"unit_price": "200",
"units_per_case": "0.2",
"unit_net_weight_serving_size_unit_type": {
"id": "00000000-0000-0000-0000-000000004b13",
"name": "Ounce"
}
}
}
POST /public/v1/products Menus act as expected
POST /public/v1/products
content-type: application/json
accept: application/json
authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJhdWQiOiJEaXN0cnUiLCJleHAiOjE4MTgxNTYwNTgsImlhdCI6MTc4NjcwNjQ1OCwiaXNzIjoiRGlzdHJ1IiwianRpIjoiNGY4MzhlM2YtZGNlNy00YTQ4LWI0MWQtZWE0YTg1MjBiNjFmIiwibW9iaWxlIjpmYWxzZSwibmJmIjoxNzg2NzA2NDU3LCJwbGF0Zm9ybSI6IkFQSSIsInN1YiI6IlVzZXI6ODUwIiwidHlwIjoiYWNjZXNzIn0.scgs9ZY7Em8x7ULqoggmNv4ySqowLvJ6OjAYOYnKsgM
{
"category_id": "00000000-0000-0000-0000-0000000000b1",
"inventory_tracking_method": "PACKAGE",
"menu_visibility": "INCLUDE_IN_ALL",
"menus": [
"00000000-0000-0000-0000-000000000017"
],
"name": "My Product",
"sku": "12345",
"unit_price": "100",
"unit_type_id": "00000000-0000-0000-0000-000000001fc5",
"upc": "036000291452",
"vendor_id": "00000000-0000-0000-0000-000000000117"
}
Response
200
content-type: application/json; charset=utf-8
cache-control: max-age=0, private, must-revalidate
b3: 801b4249def9c2055a0fe2a91e4e36fe-43cf426368f078f6-0
{
"data": {
"gross_weight": null,
"total_cannabinoid_unit": null,
"updated_datetime": "2026-08-14T11:20:58.517070Z",
"category": {
"id": "00000000-0000-0000-0000-0000000000b1",
"name": "Some category 175",
"official_product_category_id": "OTHER"
},
"unit_serving_size": null,
"msrp": null,
"total_cbd": null,
"product_group": null,
"description_markdown": null,
"gross_weight_unit_type": null,
"sku": "12345",
"deleted_at": null,
"menus": [
{
"menu_id": "00000000-0000-0000-0000-000000000017",
"menu_name": "Menu 68"
},
{
"menu_id": "00000000-0000-0000-0000-000000000018",
"menu_name": "Menu 71"
},
{
"menu_id": "00000000-0000-0000-0000-000000000019",
"menu_name": "Menu 74"
}
],
"description": null,
"name": "My Product",
"id": "3dd96f16-2e10-48f6-a287-c9d72c489040",
"total_thc": null,
"unit_cost": null,
"unit_type": {
"id": "00000000-0000-0000-0000-000000001fc5",
"name": "Gram"
},
"tags": [],
"quantity_available_threshold_min": null,
"images": [],
"is_featured": false,
"custom_data": [],
"owner": null,
"brand": null,
"wholesale_unit_price": null,
"external_name": null,
"vendor": {
"id": "00000000-0000-0000-0000-000000000117",
"name": "Company 663",
"updated_datetime": "2026-08-14T11:20:58.282478Z"
},
"quantity_available_threshold_max": null,
"upc": "036000291452",
"unit_net_weight": null,
"strain": null,
"is_active": true,
"subcategory": null,
"unit_price": "100",
"units_per_case": null,
"unit_net_weight_serving_size_unit_type": null
}
}
POST /public/v1/products Menus act as expected
POST /public/v1/products
content-type: application/json
accept: application/json
authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJhdWQiOiJEaXN0cnUiLCJleHAiOjE4MTgxNTYwNTgsImlhdCI6MTc4NjcwNjQ1OCwiaXNzIjoiRGlzdHJ1IiwianRpIjoiNGY4MzhlM2YtZGNlNy00YTQ4LWI0MWQtZWE0YTg1MjBiNjFmIiwibW9iaWxlIjpmYWxzZSwibmJmIjoxNzg2NzA2NDU3LCJwbGF0Zm9ybSI6IkFQSSIsInN1YiI6IlVzZXI6ODUwIiwidHlwIjoiYWNjZXNzIn0.scgs9ZY7Em8x7ULqoggmNv4ySqowLvJ6OjAYOYnKsgM
{
"category_id": "00000000-0000-0000-0000-0000000000b1",
"id": "3dd96f16-2e10-48f6-a287-c9d72c489040",
"inventory_tracking_method": "PACKAGE",
"menu_visibility": "DO_NOT_INCLUDE",
"menus": [
"00000000-0000-0000-0000-000000000017",
"00000000-0000-0000-0000-000000000018"
],
"name": "My Product",
"sku": "12345",
"tags": [],
"unit_price": "100",
"unit_type_id": "00000000-0000-0000-0000-000000001fc5",
"upc": "036000291452",
"vendor_id": "00000000-0000-0000-0000-000000000117"
}
Response
200
content-type: application/json; charset=utf-8
cache-control: max-age=0, private, must-revalidate
b3: 801b4249def9c2055a0fe2a91e4e36fe-5d598cbb5de8d116-0
{
"data": {
"gross_weight": null,
"total_cannabinoid_unit": null,
"updated_datetime": "2026-08-14T11:20:58.683138Z",
"category": {
"id": "00000000-0000-0000-0000-0000000000b1",
"name": "Some category 175",
"official_product_category_id": "OTHER"
},
"unit_serving_size": null,
"msrp": null,
"total_cbd": null,
"product_group": null,
"description_markdown": null,
"gross_weight_unit_type": null,
"sku": "12345",
"deleted_at": null,
"menus": [],
"description": null,
"name": "My Product",
"id": "3dd96f16-2e10-48f6-a287-c9d72c489040",
"total_thc": null,
"unit_cost": null,
"unit_type": {
"id": "00000000-0000-0000-0000-000000001fc5",
"name": "Gram"
},
"tags": [],
"quantity_available_threshold_min": null,
"images": [],
"is_featured": false,
"custom_data": [],
"owner": null,
"brand": null,
"wholesale_unit_price": null,
"external_name": null,
"vendor": {
"id": "00000000-0000-0000-0000-000000000117",
"name": "Company 663",
"updated_datetime": "2026-08-14T11:20:58.282478Z"
},
"quantity_available_threshold_max": null,
"upc": "036000291452",
"unit_net_weight": null,
"strain": null,
"is_active": true,
"subcategory": null,
"unit_price": "100",
"units_per_case": null,
"unit_net_weight_serving_size_unit_type": null
}
}
POST /public/v1/products Menus act as expected
POST /public/v1/products
content-type: application/json
accept: application/json
authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJhdWQiOiJEaXN0cnUiLCJleHAiOjE4MTgxNTYwNTgsImlhdCI6MTc4NjcwNjQ1OCwiaXNzIjoiRGlzdHJ1IiwianRpIjoiNGY4MzhlM2YtZGNlNy00YTQ4LWI0MWQtZWE0YTg1MjBiNjFmIiwibW9iaWxlIjpmYWxzZSwibmJmIjoxNzg2NzA2NDU3LCJwbGF0Zm9ybSI6IkFQSSIsInN1YiI6IlVzZXI6ODUwIiwidHlwIjoiYWNjZXNzIn0.scgs9ZY7Em8x7ULqoggmNv4ySqowLvJ6OjAYOYnKsgM
{
"category_id": "00000000-0000-0000-0000-0000000000b1",
"id": "3dd96f16-2e10-48f6-a287-c9d72c489040",
"inventory_tracking_method": "PACKAGE",
"menu_visibility": "INCLUDE_IN_SELECT",
"menus": [
"00000000-0000-0000-0000-000000000017",
"00000000-0000-0000-0000-000000000018"
],
"name": "My Product",
"sku": "12345",
"tags": [],
"unit_price": "100",
"unit_type_id": "00000000-0000-0000-0000-000000001fc5",
"upc": "036000291452",
"vendor_id": "00000000-0000-0000-0000-000000000117"
}
Response
200
content-type: application/json; charset=utf-8
cache-control: max-age=0, private, must-revalidate
b3: 801b4249def9c2055a0fe2a91e4e36fe-52cbf389c84427ce-0
{
"data": {
"gross_weight": null,
"total_cannabinoid_unit": null,
"updated_datetime": "2026-08-14T11:20:58.786439Z",
"category": {
"id": "00000000-0000-0000-0000-0000000000b1",
"name": "Some category 175",
"official_product_category_id": "OTHER"
},
"unit_serving_size": null,
"msrp": null,
"total_cbd": null,
"product_group": null,
"description_markdown": null,
"gross_weight_unit_type": null,
"sku": "12345",
"deleted_at": null,
"menus": [
{
"menu_id": "00000000-0000-0000-0000-000000000017",
"menu_name": "Menu 68"
},
{
"menu_id": "00000000-0000-0000-0000-000000000018",
"menu_name": "Menu 71"
}
],
"description": null,
"name": "My Product",
"id": "3dd96f16-2e10-48f6-a287-c9d72c489040",
"total_thc": null,
"unit_cost": null,
"unit_type": {
"id": "00000000-0000-0000-0000-000000001fc5",
"name": "Gram"
},
"tags": [],
"quantity_available_threshold_min": null,
"images": [],
"is_featured": false,
"custom_data": [],
"owner": null,
"brand": null,
"wholesale_unit_price": null,
"external_name": null,
"vendor": {
"id": "00000000-0000-0000-0000-000000000117",
"name": "Company 663",
"updated_datetime": "2026-08-14T11:20:58.282478Z"
},
"quantity_available_threshold_max": null,
"upc": "036000291452",
"unit_net_weight": null,
"strain": null,
"is_active": true,
"subcategory": null,
"unit_price": "100",
"units_per_case": null,
"unit_net_weight_serving_size_unit_type": null
}
}
POST /public/v1/products Menus act as expected
POST /public/v1/products
content-type: application/json
accept: application/json
authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJhdWQiOiJEaXN0cnUiLCJleHAiOjE4MTgxNTYwNTgsImlhdCI6MTc4NjcwNjQ1OCwiaXNzIjoiRGlzdHJ1IiwianRpIjoiNGY4MzhlM2YtZGNlNy00YTQ4LWI0MWQtZWE0YTg1MjBiNjFmIiwibW9iaWxlIjpmYWxzZSwibmJmIjoxNzg2NzA2NDU3LCJwbGF0Zm9ybSI6IkFQSSIsInN1YiI6IlVzZXI6ODUwIiwidHlwIjoiYWNjZXNzIn0.scgs9ZY7Em8x7ULqoggmNv4ySqowLvJ6OjAYOYnKsgM
{
"category_id": "00000000-0000-0000-0000-0000000000b1",
"id": "3dd96f16-2e10-48f6-a287-c9d72c489040",
"inventory_tracking_method": "PACKAGE",
"menu_visibility": "INCLUDE_IN_SELECT",
"menus": [
"00000000-0000-0000-0000-000000000018"
],
"name": "My Product",
"sku": "12345",
"unit_price": "100",
"unit_type_id": "00000000-0000-0000-0000-000000001fc5",
"upc": "036000291452",
"vendor_id": "00000000-0000-0000-0000-000000000117"
}
Response
200
content-type: application/json; charset=utf-8
cache-control: max-age=0, private, must-revalidate
b3: 801b4249def9c2055a0fe2a91e4e36fe-a64ebc6bff187990-0
{
"data": {
"gross_weight": null,
"total_cannabinoid_unit": null,
"updated_datetime": "2026-08-14T11:20:58.900287Z",
"category": {
"id": "00000000-0000-0000-0000-0000000000b1",
"name": "Some category 175",
"official_product_category_id": "OTHER"
},
"unit_serving_size": null,
"msrp": null,
"total_cbd": null,
"product_group": null,
"description_markdown": null,
"gross_weight_unit_type": null,
"sku": "12345",
"deleted_at": null,
"menus": [
{
"menu_id": "00000000-0000-0000-0000-000000000018",
"menu_name": "Menu 71"
}
],
"description": null,
"name": "My Product",
"id": "3dd96f16-2e10-48f6-a287-c9d72c489040",
"total_thc": null,
"unit_cost": null,
"unit_type": {
"id": "00000000-0000-0000-0000-000000001fc5",
"name": "Gram"
},
"tags": [],
"quantity_available_threshold_min": null,
"images": [],
"is_featured": false,
"custom_data": [],
"owner": null,
"brand": null,
"wholesale_unit_price": null,
"external_name": null,
"vendor": {
"id": "00000000-0000-0000-0000-000000000117",
"name": "Company 663",
"updated_datetime": "2026-08-14T11:20:58.282478Z"
},
"quantity_available_threshold_max": null,
"upc": "036000291452",
"unit_net_weight": null,
"strain": null,
"is_active": true,
"subcategory": null,
"unit_price": "100",
"units_per_case": null,
"unit_net_weight_serving_size_unit_type": null
}
}
POST /public/v1/products Menus act as expected
POST /public/v1/products
content-type: application/json
accept: application/json
authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJhdWQiOiJEaXN0cnUiLCJleHAiOjE4MTgxNTYwNTgsImlhdCI6MTc4NjcwNjQ1OCwiaXNzIjoiRGlzdHJ1IiwianRpIjoiNGY4MzhlM2YtZGNlNy00YTQ4LWI0MWQtZWE0YTg1MjBiNjFmIiwibW9iaWxlIjpmYWxzZSwibmJmIjoxNzg2NzA2NDU3LCJwbGF0Zm9ybSI6IkFQSSIsInN1YiI6IlVzZXI6ODUwIiwidHlwIjoiYWNjZXNzIn0.scgs9ZY7Em8x7ULqoggmNv4ySqowLvJ6OjAYOYnKsgM
{
"category_id": "00000000-0000-0000-0000-0000000000b1",
"id": "3dd96f16-2e10-48f6-a287-c9d72c489040",
"inventory_tracking_method": "PACKAGE",
"menu_visibility": "INCLUDE_IN_SELECT",
"menus": [],
"name": "My Product",
"sku": "12345",
"unit_price": "100",
"unit_type_id": "00000000-0000-0000-0000-000000001fc5",
"upc": "036000291452",
"vendor_id": "00000000-0000-0000-0000-000000000117"
}
Response
200
content-type: application/json; charset=utf-8
cache-control: max-age=0, private, must-revalidate
b3: 801b4249def9c2055a0fe2a91e4e36fe-86f184de61cadc4c-0
{
"data": {
"gross_weight": null,
"total_cannabinoid_unit": null,
"updated_datetime": "2026-08-14T11:20:58.970200Z",
"category": {
"id": "00000000-0000-0000-0000-0000000000b1",
"name": "Some category 175",
"official_product_category_id": "OTHER"
},
"unit_serving_size": null,
"msrp": null,
"total_cbd": null,
"product_group": null,
"description_markdown": null,
"gross_weight_unit_type": null,
"sku": "12345",
"deleted_at": null,
"menus": [],
"description": null,
"name": "My Product",
"id": "3dd96f16-2e10-48f6-a287-c9d72c489040",
"total_thc": null,
"unit_cost": null,
"unit_type": {
"id": "00000000-0000-0000-0000-000000001fc5",
"name": "Gram"
},
"tags": [],
"quantity_available_threshold_min": null,
"images": [],
"is_featured": false,
"custom_data": [],
"owner": null,
"brand": null,
"wholesale_unit_price": null,
"external_name": null,
"vendor": {
"id": "00000000-0000-0000-0000-000000000117",
"name": "Company 663",
"updated_datetime": "2026-08-14T11:20:58.282478Z"
},
"quantity_available_threshold_max": null,
"upc": "036000291452",
"unit_net_weight": null,
"strain": null,
"is_active": true,
"subcategory": null,
"unit_price": "100",
"units_per_case": null,
"unit_net_weight_serving_size_unit_type": null
}
}
POST /public/v1/products Error pointers are properly transformed to reflect the field name that our api users expect
POST /public/v1/products
content-type: application/json
accept: application/json
authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJhdWQiOiJEaXN0cnUiLCJleHAiOjE4MTgxNTYwNjAsImlhdCI6MTc4NjcwNjQ2MCwiaXNzIjoiRGlzdHJ1IiwianRpIjoiOGU4MjA1N2YtMTIzOC00ZTk4LTk2NjgtMDI3YWZkNzAxMTRlIiwibW9iaWxlIjpmYWxzZSwibmJmIjoxNzg2NzA2NDU5LCJwbGF0Zm9ybSI6IkFQSSIsInN1YiI6IlVzZXI6MTc0MiIsInR5cCI6ImFjY2VzcyJ9.ch568p0UWLfUhB7krGGg9wAxQ5pEQUpMvqSlfu7tDLc
{
"id": "21955bdf-055a-446a-aebc-2d7cf4c759e4",
"menu_visibility": "INCLUDE_IN_ALL",
"quantity_available_threshold_max": "-4.5",
"quantity_available_threshold_min": "-5.5",
"unit_net_weight": "3.1",
"unit_serving_size": "5.2"
}
Response
400
cache-control: max-age=0, private, must-revalidate
content-type: application/json; charset=utf-8
b3: 1724116a7f5b3d7d674d1074bf393a4f-cb5cbee27942f88c-0
{
"errors": [
{
"context": {
"id": "21955bdf-055a-446a-aebc-2d7cf4c759e4"
},
"message": "A unit type needs to be selected when setting Unit Net Weight/Volume or Unit Serving Size",
"pointer": [
"unit_net_weight_and_serving_size_unit_type_id"
],
"section": "body"
},
{
"context": {
"id": "21955bdf-055a-446a-aebc-2d7cf4c759e4"
},
"message": "Unit Serving Size can't be greater than Unit Net Weight/Volume",
"pointer": [
"unit_serving_size"
],
"section": "body"
},
{
"context": {
"id": "21955bdf-055a-446a-aebc-2d7cf4c759e4"
},
"message": "Cannot be negative",
"pointer": [
"quantity_available_threshold_max"
],
"section": "body"
},
{
"context": {
"id": "21955bdf-055a-446a-aebc-2d7cf4c759e4"
},
"message": "Cannot be negative",
"pointer": [
"quantity_available_threshold_min"
],
"section": "body"
}
]
}
POST /public/v1/products Errors when threshold max is less than threshold min
POST /public/v1/products
content-type: application/json
accept: application/json
authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJhdWQiOiJEaXN0cnUiLCJleHAiOjE4MTgxNTYwNTksImlhdCI6MTc4NjcwNjQ1OSwiaXNzIjoiRGlzdHJ1IiwianRpIjoiMGM5YWE1Y2UtMTg5Ny00MzdlLWE0YmItMTQ3NjhjMmU1ZWYxIiwibW9iaWxlIjpmYWxzZSwibmJmIjoxNzg2NzA2NDU4LCJwbGF0Zm9ybSI6IkFQSSIsInN1YiI6IlVzZXI6MTA4MSIsInR5cCI6ImFjY2VzcyJ9.oqgu0HalV56h37ngm7aD2xX8mXykhZIHy16j_8ctP-k
{
"id": "d0f474a9-5c21-48ee-8581-55fe787cf003",
"quantity_available_threshold_max": "4.5",
"quantity_available_threshold_min": "5.5"
}
Response
400
cache-control: max-age=0, private, must-revalidate
content-type: application/json; charset=utf-8
b3: 054a803644684175e23f64c729765791-c1b6f2d331c14a95-0
{
"errors": [
{
"context": {
"id": "d0f474a9-5c21-48ee-8581-55fe787cf003"
},
"message": "Must be greater than threshold min",
"pointer": [
"quantity_available_threshold_max"
],
"section": "body"
},
{
"context": {
"id": "d0f474a9-5c21-48ee-8581-55fe787cf003"
},
"message": "Must be less than threshold max",
"pointer": [
"quantity_available_threshold_min"
],
"section": "body"
}
]
}
POST /public/v1/products Cannot use associations from another company
POST /public/v1/products
content-type: application/json
accept: application/json
authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJhdWQiOiJEaXN0cnUiLCJleHAiOjE4MTgxNTYwNjIsImlhdCI6MTc4NjcwNjQ2MiwiaXNzIjoiRGlzdHJ1IiwianRpIjoiOGZjY2ZiZjEtYzhjOC00NjkwLThjOGMtYzlkMjBhODBmZjE5IiwibW9iaWxlIjpmYWxzZSwibmJmIjoxNzg2NzA2NDYxLCJwbGF0Zm9ybSI6IkFQSSIsInN1YiI6IlVzZXI6MjIxMSIsInR5cCI6ImFjY2VzcyJ9.OBY6y5bL7E1vhllj2rvP9Wr7dR07cdELJw1bE7QfaAk
{
"brand_id": "00000000-0000-0000-0000-00000000038f",
"category_id": "00000000-0000-0000-0000-000000000256",
"cbd": "5.2",
"description": "My Product Description",
"description_markdown": "# My Product Description Markdown",
"group_id": "00000000-0000-0000-0000-000000000247",
"inventory_tracking_method": "PACKAGE",
"is_featured": true,
"is_inactive": true,
"menu_visibility": "INCLUDE_IN_ALL",
"menus": [
"00000000-0000-0000-0000-00000000003b",
"00000000-0000-0000-0000-00000000003c",
"00000000-0000-0000-0000-00000000003d"
],
"msrp": "100.5",
"name": "My Product",
"owner_id": "00000000-0000-0000-0000-0000000008a8",
"quantity_available_threshold_max": "10.5",
"quantity_available_threshold_min": "5.5555",
"sku": "12345",
"strain_id": "00000000-0000-0000-0000-000000000028",
"subcategory_id": "00000000-0000-0000-0000-000000000249",
"tags": [
"00000000-0000-0000-0000-000000000013",
"00000000-0000-0000-0000-000000000014",
"00000000-0000-0000-0000-000000000015"
],
"thc": "10.4",
"unit_cost": "50.4",
"unit_net_weight": "3.1",
"unit_net_weight_and_serving_size_unit_type_id": "00000000-0000-0000-0000-000000004f03",
"unit_price": "100",
"unit_serving_size": "2.2",
"unit_type_id": "00000000-0000-0000-0000-000000004f0a",
"units_per_case": "0.2",
"upc": "036000291452",
"vendor_id": "00000000-0000-0000-0000-00000000038b",
"wholesale_unit_price": "90.50"
}
Response
400
cache-control: max-age=0, private, must-revalidate
content-type: application/json; charset=utf-8
b3: c41a94210d72555ec368c50ef8e6bbc8-946b0a2956e17c58-0
{
"errors": [
{
"context": {
"id": "272060b0-ba25-49cc-b5e1-5ea6e1314132"
},
"message": "Brand does not exist",
"pointer": [
"brand_id"
],
"section": "body"
},
{
"context": {
"id": "272060b0-ba25-49cc-b5e1-5ea6e1314132"
},
"message": "Category does not exist",
"pointer": [
"category_id"
],
"section": "body"
},
{
"context": {
"id": "272060b0-ba25-49cc-b5e1-5ea6e1314132"
},
"message": "Vendor does not exist",
"pointer": [
"vendor_id"
],
"section": "body"
},
{
"context": {
"id": "272060b0-ba25-49cc-b5e1-5ea6e1314132"
},
"message": "Group does not exist",
"pointer": [
"group_id"
],
"section": "body"
},
{
"context": {
"id": "272060b0-ba25-49cc-b5e1-5ea6e1314132"
},
"message": "Serving unit type does not exist",
"pointer": [
"unit_net_weight_and_serving_size_unit_type_id"
],
"section": "body"
},
{
"context": {
"id": "272060b0-ba25-49cc-b5e1-5ea6e1314132"
},
"message": "Owner does not exist",
"pointer": [
"owner_id"
],
"section": "body"
},
{
"context": {
"id": "272060b0-ba25-49cc-b5e1-5ea6e1314132"
},
"message": "Strain does not exist",
"pointer": [
"strain_id"
],
"section": "body"
},
{
"context": {
"id": "272060b0-ba25-49cc-b5e1-5ea6e1314132"
},
"message": "Subcategory does not belong to the product category",
"pointer": [
"subcategory_id"
],
"section": "body"
},
{
"context": {
"id": "272060b0-ba25-49cc-b5e1-5ea6e1314132"
},
"message": "One or more of the provided tags do not exist",
"pointer": [
"tags"
],
"section": "body"
},
{
"context": {
"id": "272060b0-ba25-49cc-b5e1-5ea6e1314132"
},
"message": "Unit type does not exist",
"pointer": [
"unit_type_id"
],
"section": "body"
},
{
"context": {},
"message": "Menu does not exist",
"pointer": [
"menus",
0,
"00000000-0000-0000-0000-00000000003b"
],
"section": "body"
},
{
"context": {},
"message": "Menu does not exist",
"pointer": [
"menus",
1,
"00000000-0000-0000-0000-00000000003c"
],
"section": "body"
}
]
}
Upsert a single product. To update an existing product, pass in an existing product ID in the id field. When updating a product, you must pass in all fields (no sparse update currently supported).Any existing tag you do not pass in to tags will be deleted. If the menu_visibility field isset to INCLUDE_IN_SELECT, any existing menu that you do not pass into menus will be deleted. Required permission: products_permissions_create to create a new product, products_permissions_edit (and access to the product under team restrictions) to update an existing product.
Request
POST /public/v1/products
Parameters
| Parameter | Description | In | Type | Required | Default | Example |
|---|---|---|---|---|---|---|
| id | Unique ID for this product. If it exists, an update will be performed; otherwise, it will be used as the ID of a new product record | query | string | false | ||
| inventory_tracking_method | Once the tracking method is set for a product, it cannot be changed. The tracking method can be one of the following: PACKAGE: The inventory will be defined by packages. PRODUCT: Not grouped in any manner. The inventory simply exists on your product that you can add or remove as you transact. BATCH: Grouped by batches. Batches share common traits such as expiration dates and test results. | query | string | false | PACKAGE | |
| sku | Stock Keeping Unit (SKU) for this product | query | string | false | SKU123 | |
| name | Name of the product | query | string | false | King Size Pre-rolls | |
| vendor_id | The ID of the company_relationship association with the vendor (company) that supplies this product. | query | string | false | ||
| category_id | The ID of the product category of the product. | query | string | false | ||
| external_name | Customer-facing name for DistruCommerce menus and Order Tracker. Defaults to Product Name if left blank | query | string | false | ||
| unit_type_id | The ID of the unit type the product. | query | string | false | ||
| unit_price | The sale price of the product per unit. | query | number | false | ||
| description | Description of the product. If this field is provided and description_markdown is not, the description field will overwrite any existing description_markdown field. | query | string | false | A pack of 5 pre-rolls | |
| description_markdown | The description of the product in markdown format. If this field is provided, description must also be provided. The markdown display only supports italic, bold, strikethrough and links. Use any other markdown formatting at your own risk. | query | string | false | A pack of 5 pre-rolls | |
| upc | Universal Product Code (UPC) for this product | query | string | false | 123456789012 | |
| subcategory_id | The ID of the product subcategory of the product. The provided subcategory must be a child of the provided category. | query | string | false | ||
| group_id | The ID of the product's group. | query | string | false | ||
| brand_id | The ID of the company_relationship association with the brand (company) that is associated with this product. | query | query | false | ||
| quantity_available_threshold_min | The minimum quantity of the product you'd like to maintain. When the product inventory count dips below this number, it will automatically be included in scheduled Low Inventory Reports. | query | number | false | ||
| quantity_available_threshold_max | The maximum quantity of the product you'd like to maintain. When the product inventory count exceeds this number, it will automatically be included in scheduled Inventory Reports. | query | number | false | ||
| units_per_case | The number of units in a case of the product. | query | number | false | ||
| unit_cost | The cost of the product per unit. | query | number | false | ||
| msrp | The Manufacturer's Suggested Retail Price (MSRP) of the product per unit. If you have POS integrations enabled in Distru, this may be synced to your POS | query | number | false | ||
| wholesale_unit_price | The wholesale price of the product per unit. | query | number | false | ||
| is_featured | Whether the product is featured. Featured products will be displayed at the top of menus. | query | boolean | false | ||
| strain_id | The ID of the strain associated with the product. | query | string | false | ||
| owner_id | The ID of the user that is deemed to be the owner of the product. | query | string | false | ||
| is_inactive | Whether the product is inactive from use. Inactive products can be set to active at any time. | query | boolean | false | ||
| total_cannabinoid_unit | The unit of the THC/CBD content of the product (MG or PERCENT). | query | string | false | ||
| total_thc | The THC content of the product in the unit specified by total_cannabinoid_unit. Must also include total_cannabinoid_unit. | query | string | false | ||
| total_cbd | The CBD content of the product in the unit specified by total_cannabinoid_unit. Must also include total_cannabinoid_unit. | query | string | false | ||
| menu_visibility | This key is responsible for which menus (if any) the product will be displayed in. DO_NOT_INCLUDE: The product will not be displayed in any menus. INCLUDE_IN_ALL: The product will be displayed in all menus. INCLUDE_IN_SELECT: The product will be displayed in menus that have been explicitly selected (passed into the menus list). | query | string | false | ||
| unit_net_weight | The net weight of the product per unit. | query | number | false | ||
| unit_serving_size | The serving size of the product per unit. | query | number | false | ||
| unit_net_weight_and_serving_size_unit_type_id | The ID of the unit type that the net quantity per unit and serving size are measured in. This field should be null unless the product's unit type is count-based. If this field is set, the act of changing the category from 'Unit' will throw an error. | query | string | false | ||
| gross_weight | The gross weight of the product. Must be set together with gross_weight_unit_type_id. | query | number | false | ||
| gross_weight_unit_type_id | The ID of the weight unit type the gross weight is measured in. Must be a weight-based unit type supported by Metrc, and set together with gross_weight. | query | string | false | ||
| tags | A list of tags associated with the product. | query | array | false | ["0ef8347c-b714-4cd9-ba0e-872488bc9244", "daa0294c-833c-42bd-a133-b4c9e7f64017"] | |
| menus | A list of menus you would like this product to be included in. This field will only be used if the menu_visibility key is set to INCLUDE_IN_SELECT. | query | array | false | ["0ef8347c-b714-4cd9-ba0e-872488bc9244", "daa0294c-833c-42bd-a133-b4c9e7f64017"] | |
| custom_data | Custom data for this product | body | object | false |
Responses
| Status | Description | Schema |
|---|---|---|
| 200 | A single product | Product |
ProductCategory
Delete a product category
DELETE /public/v1/product-categories/:id soft-deletes a product category
DELETE /public/v1/product-categories/00000000-0000-0000-0000-00000000000e
content-type: application/json
accept: application/json
authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJhdWQiOiJEaXN0cnUiLCJleHAiOjE4MTgxNTYwNTUsImlhdCI6MTc4NjcwNjQ1NSwiaXNzIjoiRGlzdHJ1IiwianRpIjoiNzJhN2I5MzEtNTA2Zi00ZjQ2LWJhNzItMzRjN2NhZTgwMzllIiwibW9iaWxlIjpmYWxzZSwibmJmIjoxNzg2NzA2NDU0LCJwbGF0Zm9ybSI6IkFQSSIsInN1YiI6IlVzZXI6NzEiLCJ0eXAiOiJhY2Nlc3MifQ.uYhlZfv_6Ijhcjj3Svk24ESwM6-UE15irFI8pk8iY50
Response
204
cache-control: max-age=0, private, must-revalidate
b3: 421b543108622cf82e56ee4c985db902-c9e28db392bcf288-0
Deletes the product category. This is a soft delete: the record's deleted_at is set and it
is no longer returned by the API, but it is retained in the database.
Required permission: settings_permissions_product_categories.
Request
DELETE /public/v1/product-categories/{id}
Parameters
| Parameter | Description | In | Type | Required | Default | Example |
|---|---|---|---|---|---|---|
| id | Product category ID | path | string | true |
Responses
| Status | Description | Schema |
|---|---|---|
| 204 | No Content | |
| 404 | Not Found |
Get a product category
GET /public/v1/product-categories/:id returns a single product category with embedded subcategories
GET /public/v1/product-categories/00000000-0000-0000-0000-000000000042
content-type: application/json
accept: application/json
authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJhdWQiOiJEaXN0cnUiLCJleHAiOjE4MTgxNTYwNTYsImlhdCI6MTc4NjcwNjQ1NiwiaXNzIjoiRGlzdHJ1IiwianRpIjoiYTExN2ViYjgtNzAzYi00OWVkLWEzOGQtMjMzYjZlNWQ5OTNiIiwibW9iaWxlIjpmYWxzZSwibmJmIjoxNzg2NzA2NDU1LCJwbGF0Zm9ybSI6IkFQSSIsInN1YiI6IlVzZXI6MzQ0IiwidHlwIjoiYWNjZXNzIn0.R5xDkCbehioNq-rvgfZWjCft0TweiqmMXmOMvxn36k4
Response
200
content-type: application/json; charset=utf-8
cache-control: max-age=0, private, must-revalidate
b3: 36595df0a7db3154e6cdad3da8cdad12-b15fc10ec280339b-0
{
"data": {
"id": "00000000-0000-0000-0000-000000000042",
"inserted_datetime": "2026-08-14T11:20:56.536580Z",
"name": "Edibles",
"official_product_category_id": "OPC_5",
"subcategories": [
{
"id": "00000000-0000-0000-0000-00000000003b",
"name": "Gummies"
}
],
"updated_datetime": "2026-08-14T11:20:56.536580Z"
}
}
Get a single product category given the ID.
Required permission: settings_permissions_product_categories.
Request
GET /public/v1/product-categories/{id}
Parameters
| Parameter | Description | In | Type | Required | Default | Example |
|---|---|---|---|---|---|---|
| id | Product category ID | path | string | true |
Responses
| Status | Description | Schema |
|---|---|---|
| 200 | A single product category | ProductCategory |
| 404 | Not Found |
Get product categories
GET /public/v1/product-categories returns paginated product categories with embedded subcategories
GET /public/v1/product-categories
content-type: application/json
accept: application/json
authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJhdWQiOiJEaXN0cnUiLCJleHAiOjE4MTgxNTYwNTYsImlhdCI6MTc4NjcwNjQ1NiwiaXNzIjoiRGlzdHJ1IiwianRpIjoiZTA1ZGE2ZTctMDNhNi00MGIxLWE5Y2EtODA1YWY1YTg2MjBhIiwibW9iaWxlIjpmYWxzZSwibmJmIjoxNzg2NzA2NDU1LCJwbGF0Zm9ybSI6IkFQSSIsInN1YiI6IlVzZXI6Mzg2IiwidHlwIjoiYWNjZXNzIn0.yAvUOndhvND4W6-eZghkN9PSJjQN8cvHpQYS_OnnvxA
Response
200
content-type: application/json; charset=utf-8
cache-control: max-age=0, private, must-revalidate
b3: d64a85f7364e96331b5f3b33ef0cbe21-541e016d3c482722-0
{
"data": [
{
"id": "00000000-0000-0000-0000-00000000004a",
"inserted_datetime": "2025-01-01T00:00:00.000000Z",
"name": "PC1",
"official_product_category_id": "OPC_6",
"subcategories": [
{
"id": "00000000-0000-0000-0000-000000000046",
"name": "SC1"
}
],
"updated_datetime": "2026-08-14T11:20:56.672455Z"
},
{
"id": "00000000-0000-0000-0000-00000000004b",
"inserted_datetime": "2025-01-02T00:00:00.000000Z",
"name": "PC2",
"official_product_category_id": "OPC_6",
"subcategories": [],
"updated_datetime": "2026-08-14T11:20:56.674512Z"
},
{
"id": "00000000-0000-0000-0000-00000000004c",
"inserted_datetime": "2025-01-03T00:00:00.000000Z",
"name": "PC3",
"official_product_category_id": "OPC_6",
"subcategories": [],
"updated_datetime": "2026-08-14T11:20:56.676052Z"
}
],
"next_page": "https://www.example.com/public/v1/product-categories?page[number]=2"
}
List product categories for the authenticated company.
Required permission: settings_permissions_product_categories.
Request
GET /public/v1/product-categories
Parameters
| Parameter | Description | In | Type | Required | Default | Example |
|---|---|---|---|---|---|---|
| page | Pagination information | query | number | false | ?page[number]=1 |
Responses
| Status | Description | Schema |
|---|---|---|
| 200 | A list of product categories | ProductCategories |
Upsert a product category
POST /public/v1/product-categories creates a product category
POST /public/v1/product-categories
content-type: application/json
accept: application/json
authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJhdWQiOiJEaXN0cnUiLCJleHAiOjE4MTgxNTYwNTYsImlhdCI6MTc4NjcwNjQ1NiwiaXNzIjoiRGlzdHJ1IiwianRpIjoiMzJhMzUzOTItZjQ1Ni00MTQ1LWJkYWUtZjdhNjViYWM2ODliIiwibW9iaWxlIjpmYWxzZSwibmJmIjoxNzg2NzA2NDU1LCJwbGF0Zm9ybSI6IkFQSSIsInN1YiI6IlVzZXI6MzEzIiwidHlwIjoiYWNjZXNzIn0.BINuCTV-X51VK5PbjhKeFFhvtNs8nYHKZFr3Yl_ZAQE
{
"name": "Edibles",
"official_product_category_id": "OPC_3"
}
Response
201
content-type: application/json; charset=utf-8
cache-control: max-age=0, private, must-revalidate
b3: be32c4c3d8afb1003c8820db1a3a7324-b196e7c0f4c3fee6-0
{
"data": {
"id": "00000000-0000-0000-0000-00000000003c",
"inserted_datetime": "2026-08-14T11:20:56.448188Z",
"name": "Edibles",
"official_product_category_id": "OPC_3",
"subcategories": [],
"updated_datetime": "2026-08-14T11:20:56.448188Z"
}
}
POST /public/v1/product-categories (update) updates a product category
POST /public/v1/product-categories
content-type: application/json
accept: application/json
authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJhdWQiOiJEaXN0cnUiLCJleHAiOjE4MTgxNTYwNTUsImlhdCI6MTc4NjcwNjQ1NSwiaXNzIjoiRGlzdHJ1IiwianRpIjoiNzJlYjAxZjctNjQwMy00ODlmLTk2NGUtZjM1OWY3ZjBlMjdjIiwibW9iaWxlIjpmYWxzZSwibmJmIjoxNzg2NzA2NDU0LCJwbGF0Zm9ybSI6IkFQSSIsInN1YiI6IlVzZXI6MTcxIiwidHlwIjoiYWNjZXNzIn0.YYfDdiS1C-rgvH5cPpe_393dzjy1jhHlTNUuuijPdcg
{
"id": "00000000-0000-0000-0000-000000000020",
"name": "New"
}
Response
200
content-type: application/json; charset=utf-8
cache-control: max-age=0, private, must-revalidate
b3: b4e8e1e8d9f81bff56a816718f1a99b0-7ec56ae221acd391-0
{
"data": {
"id": "00000000-0000-0000-0000-000000000020",
"inserted_datetime": "2026-08-14T11:20:55.949338Z",
"name": "New",
"official_product_category_id": "OTHER",
"subcategories": [],
"updated_datetime": "2026-08-14T11:20:55.962318Z"
}
}
Upsert a single product category. To update an existing product category, pass its ID in the
id field. If you do not pass an ID, a new product category is created. When creating, name
and official_product_category_id are required. The official_product_category_id cannot be
changed once set.
Required permission: settings_permissions_product_categories.
Request
POST /public/v1/product-categories
Parameters
| Parameter | Description | In | Type | Required | Default | Example |
|---|---|---|---|---|---|---|
| id | Product category ID. If given, the matching product category is updated; otherwise a new one is created. | query | string | false | ||
| name | The name of the product category | query | string | true | ||
| official_product_category_id | The official product category ID this category maps to | query | string | true |
Responses
| Status | Description | Schema |
|---|---|---|
| 200 | The updated product category | ProductCategory |
| 201 | The created product category | ProductCategory |
| 400 | Invalid parameters | |
| 404 | Not Found |
ProductGroup
Delete a product group
DELETE /public/v1/product-groups/:id deletes a product group
DELETE /public/v1/product-groups/00000000-0000-0000-0000-000000000001
content-type: application/json
accept: application/json
authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJhdWQiOiJEaXN0cnUiLCJleHAiOjE4MTgxNTYwNTQsImlhdCI6MTc4NjcwNjQ1NCwiaXNzIjoiRGlzdHJ1IiwianRpIjoiZTJkMmYzOTUtMWU5My00OTJkLWE5NjktZjhkNTEwMjdkOWFlIiwibW9iaWxlIjpmYWxzZSwibmJmIjoxNzg2NzA2NDUzLCJwbGF0Zm9ybSI6IkFQSSIsInN1YiI6IlVzZXI6NyIsInR5cCI6ImFjY2VzcyJ9.r37ETmJqHZR0FG3qEL82gG_HALrkIzAPin5qXrPDV6U
Response
204
cache-control: max-age=0, private, must-revalidate
b3: 9f94b30ff9f8dac68aefdadec60aa885-4ea604ec48d417ff-0
Permanently deletes the product group. This is a hard delete: the record is removed from the database and cannot be recovered.
Required permission: settings_permissions_product_groups.
Request
DELETE /public/v1/product-groups/{id}
Parameters
| Parameter | Description | In | Type | Required | Default | Example |
|---|---|---|---|---|---|---|
| id | Product group ID | path | string | true |
Responses
| Status | Description | Schema |
|---|---|---|
| 204 | No Content | |
| 404 | Not Found |
Get a product group
GET /public/v1/product-groups/:id returns a single product group
GET /public/v1/product-groups/00000000-0000-0000-0000-000000000036
content-type: application/json
accept: application/json
authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJhdWQiOiJEaXN0cnUiLCJleHAiOjE4MTgxNTYwNTYsImlhdCI6MTc4NjcwNjQ1NiwiaXNzIjoiRGlzdHJ1IiwianRpIjoiZmMxOTk3NGYtZjk0Mi00N2VhLWJkN2QtZGIwNWE2YzNiMzAyIiwibW9iaWxlIjpmYWxzZSwibmJmIjoxNzg2NzA2NDU1LCJwbGF0Zm9ybSI6IkFQSSIsInN1YiI6IlVzZXI6MzI0IiwidHlwIjoiYWNjZXNzIn0.azGHVm_ezjKSAyrSa-dUBKr18UZDKtqgS2QVBfknvVE
Response
200
content-type: application/json; charset=utf-8
cache-control: max-age=0, private, must-revalidate
b3: 31d6eef243bcae772c8f1727a22a4520-3e34c73a0edd5e16-0
{
"data": {
"id": "00000000-0000-0000-0000-000000000036",
"inserted_datetime": "2026-08-14T11:20:56.472432Z",
"name": "Flower - Indoor",
"updated_datetime": "2026-08-14T11:20:56.472432Z"
}
}
Get a single product group given the ID.
Required permission: settings_permissions_product_groups.
Request
GET /public/v1/product-groups/{id}
Parameters
| Parameter | Description | In | Type | Required | Default | Example |
|---|---|---|---|---|---|---|
| id | Product group ID | path | string | true |
Responses
| Status | Description | Schema |
|---|---|---|
| 200 | A single product group | ProductGroup |
| 404 | Not Found |
Get product groups
GET /public/v1/product-groups returns paginated product groups for the company with next_page
GET /public/v1/product-groups
content-type: application/json
accept: application/json
authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJhdWQiOiJEaXN0cnUiLCJleHAiOjE4MTgxNTYwNTYsImlhdCI6MTc4NjcwNjQ1NiwiaXNzIjoiRGlzdHJ1IiwianRpIjoiMzVhODM4NTQtZWM3Mi00YmQ1LWE2MzEtNjQxOTc1ODUyZDdkIiwibW9iaWxlIjpmYWxzZSwibmJmIjoxNzg2NzA2NDU1LCJwbGF0Zm9ybSI6IkFQSSIsInN1YiI6IlVzZXI6MzY0IiwidHlwIjoiYWNjZXNzIn0.gGDfTkDaBLOn_G4Hfvd_T0PtRat4IgK7_1XK3mkQfWE
Response
200
content-type: application/json; charset=utf-8
cache-control: max-age=0, private, must-revalidate
b3: 6f63bb4857c19500b81f7cff0218acd2-1fb9d6fd5dde21c9-0
{
"data": [
{
"id": "00000000-0000-0000-0000-00000000003d",
"inserted_datetime": "2026-08-14T11:20:56.599229Z",
"name": "PG1",
"updated_datetime": "2026-08-14T11:20:56.599229Z"
},
{
"id": "00000000-0000-0000-0000-00000000003e",
"inserted_datetime": "2026-08-14T11:20:56.599690Z",
"name": "PG2",
"updated_datetime": "2026-08-14T11:20:56.599690Z"
},
{
"id": "00000000-0000-0000-0000-00000000003f",
"inserted_datetime": "2026-08-14T11:20:56.600046Z",
"name": "PG3",
"updated_datetime": "2026-08-14T11:20:56.600046Z"
}
],
"next_page": "https://www.example.com/public/v1/product-groups?page[number]=2"
}
List product groups for the authenticated company.
Required permission: settings_permissions_product_groups.
Request
GET /public/v1/product-groups
Parameters
| Parameter | Description | In | Type | Required | Default | Example |
|---|---|---|---|---|---|---|
| page | Pagination information | query | number | false | ?page[number]=1 |
Responses
| Status | Description | Schema |
|---|---|---|
| 200 | A list of product groups | ProductGroups |
Upsert a product group
POST /public/v1/product-groups creates a product group
POST /public/v1/product-groups
content-type: application/json
accept: application/json
authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJhdWQiOiJEaXN0cnUiLCJleHAiOjE4MTgxNTYwNTYsImlhdCI6MTc4NjcwNjQ1NiwiaXNzIjoiRGlzdHJ1IiwianRpIjoiN2RkYWU4YzMtZGYzMS00ZTY1LTk3OGUtMWRkNDc2ZWRjYjIzIiwibW9iaWxlIjpmYWxzZSwibmJmIjoxNzg2NzA2NDU1LCJwbGF0Zm9ybSI6IkFQSSIsInN1YiI6IlVzZXI6Mjg5IiwidHlwIjoiYWNjZXNzIn0.UKNrM8In7OB_EpGlEqay2B1ed9oT13W7XP3kssDCp_c
{
"name": "Flower - Indoor"
}
Response
201
content-type: application/json; charset=utf-8
cache-control: max-age=0, private, must-revalidate
b3: 9c23ec9fd6b4aecccb0c6de4ec882c1e-ca6ce693443bf6bb-0
{
"data": {
"id": "00000000-0000-0000-0000-000000000031",
"inserted_datetime": "2026-08-14T11:20:56.362998Z",
"name": "Flower - Indoor",
"updated_datetime": "2026-08-14T11:20:56.362998Z"
}
}
POST /public/v1/product-groups (update) updates a product group
POST /public/v1/product-groups
content-type: application/json
accept: application/json
authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJhdWQiOiJEaXN0cnUiLCJleHAiOjE4MTgxNTYwNTUsImlhdCI6MTc4NjcwNjQ1NSwiaXNzIjoiRGlzdHJ1IiwianRpIjoiODJiNDQ2MjUtYWFjZi00MzgxLTk3OTMtZjNkZDMwNDAzNGNmIiwibW9iaWxlIjpmYWxzZSwibmJmIjoxNzg2NzA2NDU0LCJwbGF0Zm9ybSI6IkFQSSIsInN1YiI6IlVzZXI6MTUwIiwidHlwIjoiYWNjZXNzIn0.Ilp-KTEd0Z-VMZ-06Ry9hL4_8PPO-lRouJWvXPILxqw
{
"id": "00000000-0000-0000-0000-000000000019",
"name": "New"
}
Response
200
content-type: application/json; charset=utf-8
cache-control: max-age=0, private, must-revalidate
b3: 22b8ca2db0e610e131dcb90018ea8849-6396111fb85ac73a-0
{
"data": {
"id": "00000000-0000-0000-0000-000000000019",
"inserted_datetime": "2026-08-14T11:20:55.877878Z",
"name": "New",
"updated_datetime": "2026-08-14T11:20:55.885588Z"
}
}
Upsert a single product group. To update an existing product group, pass its ID in the id
field. If you do not pass an ID, a new product group is created.
Required permission: settings_permissions_product_groups.
Request
POST /public/v1/product-groups
Parameters
| Parameter | Description | In | Type | Required | Default | Example |
|---|---|---|---|---|---|---|
| id | Product group ID. If given, the matching product group is updated; otherwise a new one is created. | query | string | false | ||
| name | The name of the product group | query | string | true |
Responses
| Status | Description | Schema |
|---|---|---|
| 200 | The updated product group | ProductGroup |
| 201 | The created product group | ProductGroup |
| 400 | Invalid parameters | |
| 404 | Not Found |
ProductPosMapping
Create or update a product POS mapping
POST /public/v1/product-pos-mappings (upsert) creates a new Blaze mapping
POST /public/v1/product-pos-mappings
content-type: application/json
accept: application/json
authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJhdWQiOiJEaXN0cnUiLCJleHAiOjE4MTgxNTYwNTksImlhdCI6MTc4NjcwNjQ1OSwiaXNzIjoiRGlzdHJ1IiwianRpIjoiYTE0MTk2ODktZjBkZi00MjYyLWIyY2EtMzk4NjY5NGRhYzk0IiwibW9iaWxlIjpmYWxzZSwibmJmIjoxNzg2NzA2NDU4LCJwbGF0Zm9ybSI6IkFQSSIsInN1YiI6IlVzZXI6MTI5OCIsInR5cCI6ImFjY2VzcyJ9.O6dDPdx_0DrL0XuCZXUmAFbHAUuD3wdCebtVM6uT1mM
{
"blaze_product_id": "blaze_123",
"blaze_retailer_id": "0c4e1aed-0215-4e3a-8d30-72db34ee94a2",
"product_id": "d6caae54-61a0-48d7-81a4-081f684d15dc"
}
Response
201
content-type: application/json; charset=utf-8
cache-control: max-age=0, private, must-revalidate
b3: d336c6028cfcbe964d40609cb0f0fcfd-496624f3d8b62683-0
{
"data": {
"blaze_asset_id": null,
"blaze_product_id": "blaze_123",
"blaze_retailer_id": "0c4e1aed-0215-4e3a-8d30-72db34ee94a2",
"id": "00000000-0000-0000-0000-000000000007",
"inserted_datetime": "2026-08-14T11:20:59.613486Z",
"pos_type": "BLAZE",
"product_id": "d6caae54-61a0-48d7-81a4-081f684d15dc",
"updated_datetime": "2026-08-14T11:20:59.613486Z"
}
}
POST /public/v1/product-pos-mappings (upsert) updates an existing mapping (upsert behavior)
POST /public/v1/product-pos-mappings
content-type: application/json
accept: application/json
authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJhdWQiOiJEaXN0cnUiLCJleHAiOjE4MTgxNTYwNTcsImlhdCI6MTc4NjcwNjQ1NywiaXNzIjoiRGlzdHJ1IiwianRpIjoiYjgxZGU0MDMtNWY2MS00ZmI5LWIyZTUtYzQzOTgyNzYwNDAwIiwibW9iaWxlIjpmYWxzZSwibmJmIjoxNzg2NzA2NDU2LCJwbGF0Zm9ybSI6IkFQSSIsInN1YiI6IlVzZXI6NjI5IiwidHlwIjoiYWNjZXNzIn0.tvD5tp0bqzWO3PglofopQvHRIJdDoFWmLFelvqwfl7I
{
"blaze_product_id": "blaze_456",
"blaze_retailer_id": "d18b92b5-9a00-4661-99c6-365c35adb464",
"product_id": "341f9777-dc50-46f3-bb6d-dbcb1ec693ce"
}
Response
200
content-type: application/json; charset=utf-8
cache-control: max-age=0, private, must-revalidate
b3: 8a9705357669b668728c8d05a9374f63-627f28a7152342f4-0
{
"data": {
"blaze_asset_id": null,
"blaze_product_id": "blaze_456",
"blaze_retailer_id": "d18b92b5-9a00-4661-99c6-365c35adb464",
"id": "00000000-0000-0000-0000-000000000001",
"inserted_datetime": "2026-08-14T11:20:57.615698Z",
"pos_type": "BLAZE",
"product_id": "341f9777-dc50-46f3-bb6d-dbcb1ec693ce",
"updated_datetime": "2026-08-14T11:20:57.654002Z"
}
}
Upserts a POS mapping - creates if new, updates if exists.
The system determines if a mapping already exists by checking for an existing mapping with the same product_id and retailer_id combination. If found, it updates the existing mapping. If not found, it creates a new mapping.
Returns 201 for new mappings, 200 for updates.
Required permission: products_permissions_edit.
Request
POST /public/v1/product-pos-mappings
Parameters
| Parameter | Description | In | Type | Required | Default | Example |
|---|---|---|---|---|---|---|
| mapping | POS mapping data | body | UpsertProductPosMapping | true |
Responses
| Status | Description | Schema |
|---|---|---|
| 200 | Updated existing mapping | ProductPosMappingResponse |
| 201 | Created new mapping | ProductPosMappingResponse |
| 400 | Bad Request | |
| 401 | Unauthorized |
Delete a product POS mapping
DELETE /public/v1/product-pos-mappings/:id deletes a POS mapping
DELETE /public/v1/product-pos-mappings/00000000-0000-0000-0000-000000000008
content-type: application/json
accept: application/json
authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJhdWQiOiJEaXN0cnUiLCJleHAiOjE4MTgxNTYwNTksImlhdCI6MTc4NjcwNjQ1OSwiaXNzIjoiRGlzdHJ1IiwianRpIjoiYTFkMGRiOWQtNjBkZC00MmE1LTg2NGUtZWU4Y2ZmNjJmYTk2IiwibW9iaWxlIjpmYWxzZSwibmJmIjoxNzg2NzA2NDU4LCJwbGF0Zm9ybSI6IkFQSSIsInN1YiI6IlVzZXI6MTM2OSIsInR5cCI6ImFjY2VzcyJ9.QRxeVfryGkFly9joI62f0LAj1OcL6hkVB2HDD8JcdL8
Response
204
cache-control: max-age=0, private, must-revalidate
b3: 3edbedb131e0c90b1967fc62bd31e163-80e4be93e3ca3a13-0
Required permission: products_permissions_edit.
Request
DELETE /public/v1/product-pos-mappings/{id}
Parameters
| Parameter | Description | In | Type | Required | Default | Example |
|---|---|---|---|---|---|---|
| id | Mapping ID | path | string | true |
Responses
| Status | Description | Schema |
|---|---|---|
| 204 | No Content | |
| 401 | Unauthorized | |
| 404 | Not Found |
Get a product POS mapping
GET /public/v1/product-pos-mappings/:id returns a single product POS mapping
GET /public/v1/product-pos-mappings/00000000-0000-0000-0000-000000000004
content-type: application/json
accept: application/json
authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJhdWQiOiJEaXN0cnUiLCJleHAiOjE4MTgxNTYwNTgsImlhdCI6MTc4NjcwNjQ1OCwiaXNzIjoiRGlzdHJ1IiwianRpIjoiNGZkYjJjMDAtMWY0MC00MjE3LWE3OGMtYWJmN2I4ZTNmYWZiIiwibW9iaWxlIjpmYWxzZSwibmJmIjoxNzg2NzA2NDU3LCJwbGF0Zm9ybSI6IkFQSSIsInN1YiI6IlVzZXI6MTAwOSIsInR5cCI6ImFjY2VzcyJ9.i6Kmdkc5x7_IszZsqFqaKtUhmdRRMnm9_Z3rImL58VA
Response
200
content-type: application/json; charset=utf-8
cache-control: max-age=0, private, must-revalidate
b3: b186d23237c58b5b988867f7b24f0972-02555ae9c2adc524-0
{
"data": {
"blaze_asset_id": null,
"blaze_product_id": "blaze_123",
"blaze_retailer_id": "4d95eeb9-cf36-458b-89c0-e6ac071b08c7",
"id": "00000000-0000-0000-0000-000000000004",
"inserted_datetime": "2026-08-14T11:20:58.871647Z",
"pos_type": "BLAZE",
"product_id": "31242c3a-7ec3-4bee-b692-796c3957f2ff",
"updated_datetime": "2026-08-14T11:20:58.871647Z"
}
}
Get a single product POS mapping given the ID.
Required permission: products_permissions_view.
Request
GET /public/v1/product-pos-mappings/{id}
Parameters
| Parameter | Description | In | Type | Required | Default | Example |
|---|---|---|---|---|---|---|
| id | Product POS Mapping ID | path | string | true |
Responses
| Status | Description | Schema |
|---|---|---|
| 200 | A single product POS mapping | ProductPosMappingResponse |
| 404 | Not Found |
List product POS mappings
GET /public/v1/product-pos-mappings returns all POS mappings for company products and supports filtering
GET /public/v1/product-pos-mappings
content-type: application/json
accept: application/json
authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJhdWQiOiJEaXN0cnUiLCJleHAiOjE4MTgxNTYwNTksImlhdCI6MTc4NjcwNjQ1OSwiaXNzIjoiRGlzdHJ1IiwianRpIjoiYWI0MjY5OTUtZTJjZC00ZDFhLTk0MWQtYWVjNzBlN2VmNjE4IiwibW9iaWxlIjpmYWxzZSwibmJmIjoxNzg2NzA2NDU4LCJwbGF0Zm9ybSI6IkFQSSIsInN1YiI6IlVzZXI6MTQzMSIsInR5cCI6ImFjY2VzcyJ9.t9cqo2fIN3Ys4sLFgOfcv4ui12Dv7OuhofpcoqbQuJ0
Response
200
content-type: application/json; charset=utf-8
cache-control: max-age=0, private, must-revalidate
b3: 561177ded505886febba4f10b3741833-c2c797f68bdf1d2f-0
{
"data": [
{
"blaze_asset_id": null,
"blaze_product_id": "blaze_123",
"blaze_retailer_id": "418de616-bda5-4c38-8759-291617aa9ba3",
"id": "00000000-0000-0000-0000-000000000009",
"inserted_datetime": "2026-08-14T11:20:59.905934Z",
"pos_type": "BLAZE",
"product_id": "47f3364b-3723-48da-b772-15de8d4f642b",
"updated_datetime": "2026-08-14T11:20:59.905934Z"
},
{
"dutchie_product_id": 456,
"dutchie_retailer_id": "a72c2cc8-0d5f-48ac-9342-ae52c69fc395",
"id": "00000000-0000-0000-0000-00000000000a",
"inserted_datetime": "2026-08-14T11:20:59.930786Z",
"pos_type": "DUTCHIE",
"product_id": "c95a6ec1-fd2e-4b67-940e-3f30df3d750e",
"updated_datetime": "2026-08-14T11:20:59.930786Z"
}
],
"next_page": "https://www.example.com/public/v1/product-pos-mappings?page[number]=2"
}
Get POS mappings with optional filtering by product_id or retailer_id. Required permission: products_permissions_view.
Request
GET /public/v1/product-pos-mappings
Parameters
| Parameter | Description | In | Type | Required | Default | Example |
|---|---|---|---|---|---|---|
| product_id | Filter by product ID | query | string | false | ||
| blaze_retailer_id | Filter by Blaze retailer ID | query | string | false | ||
| dutchie_retailer_id | Filter by Dutchie retailer ID | query | string | false | ||
| treez_retailer_id | Filter by Treez retailer ID | query | string | false |
Responses
| Status | Description | Schema |
|---|---|---|
| 200 | Success | ProductPosMappingsResponse |
| 400 | Bad Request | |
| 401 | Unauthorized |
ProductSubcategory
Delete a product subcategory
DELETE /public/v1/product-subcategories/:id deletes the subcategory while leaving its siblings intact
DELETE /public/v1/product-subcategories/00000000-0000-0000-0000-000000000024
content-type: application/json
accept: application/json
authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJhdWQiOiJEaXN0cnUiLCJleHAiOjE4MTgxNTYwNTYsImlhdCI6MTc4NjcwNjQ1NiwiaXNzIjoiRGlzdHJ1IiwianRpIjoiYmVhZmU3OTEtYmE0NC00ZDFlLWJhOTYtN2ZkNDU0ODk0ZWMyIiwibW9iaWxlIjpmYWxzZSwibmJmIjoxNzg2NzA2NDU1LCJwbGF0Zm9ybSI6IkFQSSIsInN1YiI6IlVzZXI6MjA1IiwidHlwIjoiYWNjZXNzIn0.Q0YXQvF9Q1wx71aYdoQYJAcmXjjFfJ2s1PcxXji7LvA
Response
204
cache-control: max-age=0, private, must-revalidate
b3: 00324f1cdd0774d5bce2f0b95f07ec48-d9a135dbabdb5498-0
Permanently deletes the product subcategory. Unlike product categories, subcategories are hard deleted: the record is removed from the database and cannot be recovered.
Required permission: settings_permissions_product_categories.
Request
DELETE /public/v1/product-subcategories/{id}
Parameters
| Parameter | Description | In | Type | Required | Default | Example |
|---|---|---|---|---|---|---|
| id | Product subcategory ID | path | string | true |
Responses
| Status | Description | Schema |
|---|---|---|
| 204 | No Content | |
| 404 | Not Found |
Get a product subcategory
GET /public/v1/product-subcategories/:id returns a single subcategory with embedded compact category
GET /public/v1/product-subcategories/00000000-0000-0000-0000-000000000035
content-type: application/json
accept: application/json
authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJhdWQiOiJEaXN0cnUiLCJleHAiOjE4MTgxNTYwNTYsImlhdCI6MTc4NjcwNjQ1NiwiaXNzIjoiRGlzdHJ1IiwianRpIjoiNzczNjY0ZGMtYzNlMC00ZjRjLTg1ODUtYTI1Y2E5ZjllYmIwIiwibW9iaWxlIjpmYWxzZSwibmJmIjoxNzg2NzA2NDU1LCJwbGF0Zm9ybSI6IkFQSSIsInN1YiI6IlVzZXI6Mjk2IiwidHlwIjoiYWNjZXNzIn0.qbyIBVIRGmY-K1j79rHqESm4-ouMVwdHTgciZfy98mA
Response
200
content-type: application/json; charset=utf-8
cache-control: max-age=0, private, must-revalidate
b3: f189752e1c9dbb8e4c628ff0156d6a8b-cf621f1b16c825eb-0
{
"data": {
"category": {
"id": "00000000-0000-0000-0000-00000000003a",
"name": "Edibles",
"official_product_category_id": "OPC_2"
},
"id": "00000000-0000-0000-0000-000000000035",
"inserted_datetime": "2026-08-14T11:20:56.411222Z",
"name": "Gummies",
"updated_datetime": "2026-08-14T11:20:56.411222Z"
}
}
Get a single product subcategory given the ID.
Required permission: settings_permissions_product_categories.
Request
GET /public/v1/product-subcategories/{id}
Parameters
| Parameter | Description | In | Type | Required | Default | Example |
|---|---|---|---|---|---|---|
| id | Product subcategory ID | path | string | true |
Responses
| Status | Description | Schema |
|---|---|---|
| 200 | A single product subcategory | ProductSubcategory |
| 404 | Not Found |
Get product subcategories
GET /public/v1/product-subcategories returns paginated subcategories for the company with next_page and category filter
GET /public/v1/product-subcategories
content-type: application/json
accept: application/json
authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJhdWQiOiJEaXN0cnUiLCJleHAiOjE4MTgxNTYwNTYsImlhdCI6MTc4NjcwNjQ1NiwiaXNzIjoiRGlzdHJ1IiwianRpIjoiYTM3YjBkZjYtYTQwOS00ZDkxLWJiZDYtNjI1MjM2MTg5YjIzIiwibW9iaWxlIjpmYWxzZSwibmJmIjoxNzg2NzA2NDU1LCJwbGF0Zm9ybSI6IkFQSSIsInN1YiI6IlVzZXI6MzQwIiwidHlwIjoiYWNjZXNzIn0.NMbfgfSaSufz9qANpyeQ96O_fKZG656wP8-7EhlWMps
Response
200
content-type: application/json; charset=utf-8
cache-control: max-age=0, private, must-revalidate
b3: 91cdac13fc4c3d9108c20424c3f44dff-95597a569b5f1829-0
{
"data": [
{
"category": {
"id": "00000000-0000-0000-0000-00000000003f",
"name": "C1",
"official_product_category_id": "OPC_4"
},
"id": "00000000-0000-0000-0000-000000000038",
"inserted_datetime": "2025-01-01T00:00:00.000000Z",
"name": "SC1",
"updated_datetime": "2026-08-14T11:20:56.534086Z"
},
{
"category": {
"id": "00000000-0000-0000-0000-00000000003f",
"name": "C1",
"official_product_category_id": "OPC_4"
},
"id": "00000000-0000-0000-0000-000000000039",
"inserted_datetime": "2025-01-02T00:00:00.000000Z",
"name": "SC2",
"updated_datetime": "2026-08-14T11:20:56.547243Z"
},
{
"category": {
"id": "00000000-0000-0000-0000-00000000003f",
"name": "C1",
"official_product_category_id": "OPC_4"
},
"id": "00000000-0000-0000-0000-00000000003c",
"inserted_datetime": "2025-01-03T00:00:00.000000Z",
"name": "SC3",
"updated_datetime": "2026-08-14T11:20:56.561076Z"
}
],
"next_page": "https://www.example.com/public/v1/product-subcategories?page[number]=2"
}
List product subcategories for the authenticated company.
Optionally filter by parent category with ?category_id=.
Required permission: settings_permissions_product_categories.
Request
GET /public/v1/product-subcategories
Parameters
| Parameter | Description | In | Type | Required | Default | Example |
|---|---|---|---|---|---|---|
| category_id | Only return subcategories belonging to this product category ID | query | string | false | ||
| page | Pagination information | query | number | false | ?page[number]=1 |
Responses
| Status | Description | Schema |
|---|---|---|
| 200 | A list of product subcategories | ProductSubcategories |
Upsert a product subcategory
POST /public/v1/product-subcategories creates a subcategory and returns the embedded compact category
POST /public/v1/product-subcategories
content-type: application/json
accept: application/json
authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJhdWQiOiJEaXN0cnUiLCJleHAiOjE4MTgxNTYwNTYsImlhdCI6MTc4NjcwNjQ1NiwiaXNzIjoiRGlzdHJ1IiwianRpIjoiYjNmMzRjNjctMWI0My00NzU0LTg4NzQtNjg5ODIyZjUwMzA4IiwibW9iaWxlIjpmYWxzZSwibmJmIjoxNzg2NzA2NDU1LCJwbGF0Zm9ybSI6IkFQSSIsInN1YiI6IlVzZXI6MjQ2IiwidHlwIjoiYWNjZXNzIn0.lHcNmJkC2WvCXnh3HuVampAqoCqaWrIcf-GcXgrqo7w
{
"name": "Gummies",
"product_category_id": "00000000-0000-0000-0000-000000000031"
}
Response
201
content-type: application/json; charset=utf-8
cache-control: max-age=0, private, must-revalidate
b3: f6ea5d43d40701b6eab0f4f38f31f660-318e9d2d06b7b7bc-0
{
"data": {
"category": {
"id": "00000000-0000-0000-0000-000000000031",
"name": "Edibles",
"official_product_category_id": "OPC_1"
},
"id": "00000000-0000-0000-0000-00000000002b",
"inserted_datetime": "2026-08-14T11:20:56.246534Z",
"name": "Gummies",
"updated_datetime": "2026-08-14T11:20:56.246534Z"
}
}
POST /public/v1/product-subcategories (update) updates a subcategory
POST /public/v1/product-subcategories
content-type: application/json
accept: application/json
authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJhdWQiOiJEaXN0cnUiLCJleHAiOjE4MTgxNTYwNTYsImlhdCI6MTc4NjcwNjQ1NiwiaXNzIjoiRGlzdHJ1IiwianRpIjoiOGNmMDY0OTMtZGFkMS00OTQyLWIzZGYtNjQ5NGIzMmZlYWYyIiwibW9iaWxlIjpmYWxzZSwibmJmIjoxNzg2NzA2NDU1LCJwbGF0Zm9ybSI6IkFQSSIsInN1YiI6IlVzZXI6NDQwIiwidHlwIjoiYWNjZXNzIn0.F5mwzPW7sDLgzMMxSqxrgvFxzrHaQUdk-zOaqjITO2U
{
"id": "00000000-0000-0000-0000-00000000004f",
"name": "New"
}
Response
200
content-type: application/json; charset=utf-8
cache-control: max-age=0, private, must-revalidate
b3: 90883021ef614211dbad722cc13bac6f-7d1af4651373244d-0
{
"data": {
"category": {
"id": "00000000-0000-0000-0000-000000000059",
"name": "Some category 87",
"official_product_category_id": "OTHER"
},
"id": "00000000-0000-0000-0000-00000000004f",
"inserted_datetime": "2026-08-14T11:20:56.841480Z",
"name": "New",
"updated_datetime": "2026-08-14T11:20:56.848245Z"
}
}
Upsert a single product subcategory. To update an existing product subcategory, pass its ID in
the id field. If you do not pass an ID, a new product subcategory is created. When creating,
name and product_category_id are required. The parent category cannot be changed once set.
Required permission: settings_permissions_product_categories.
Request
POST /public/v1/product-subcategories
Parameters
| Parameter | Description | In | Type | Required | Default | Example |
|---|---|---|---|---|---|---|
| id | Product subcategory ID. If given, the matching product subcategory is updated; otherwise a new one is created. | query | string | false | ||
| name | The name of the product subcategory | query | string | true | ||
| product_category_id | The ID of the product category this subcategory belongs to | query | string | true |
Responses
| Status | Description | Schema |
|---|---|---|
| 200 | The updated product subcategory | ProductSubcategory |
| 201 | The created product subcategory | ProductSubcategory |
| 400 | Invalid parameters | |
| 404 | Not Found |
Purchase
Get a purchase
GET /public/v1/purchases/:id returns a single purchase with its active payments
GET /public/v1/purchases/00000000-0000-0000-0000-000000000016
content-type: application/json
accept: application/json
authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJhdWQiOiJEaXN0cnUiLCJleHAiOjE4MTgxNTYwNTksImlhdCI6MTc4NjcwNjQ1OSwiaXNzIjoiRGlzdHJ1IiwianRpIjoiYmZhMGVhMGYtYmM3Ny00YWNkLWI5NGUtMGQzMmNmZDY1NmU3IiwibW9iaWxlIjpmYWxzZSwibmJmIjoxNzg2NzA2NDU4LCJwbGF0Zm9ybSI6IkFQSSIsInN1YiI6IlVzZXI6MTIxOCIsInR5cCI6ImFjY2VzcyJ9.R8dlcBWQGwEkuGbs_BjmWytXqH7OxgXKf025YNTAJB4
Response
200
content-type: application/json; charset=utf-8
cache-control: max-age=0, private, must-revalidate
b3: f28c8bb7397506309c5e804b46e82e5f-1aa4b2daecf40e74-0
{
"data": {
"billing_location": {
"address": "123 Fake Street, Beverly Hills, CA 90210, US",
"company_id": "00000000-0000-0000-0000-0000000003c0",
"id": "00000000-0000-0000-0000-000000000142",
"license_id": null,
"license_number": null,
"name": "Place 321"
},
"charges": [],
"company": {
"id": "00000000-0000-0000-0000-0000000001cb",
"name": "Company 963",
"updated_datetime": "2026-08-14T11:20:59.404125Z"
},
"custom_data": [],
"description": null,
"due_datetime": "2026-08-14T11:20:59.472683Z",
"id": "00000000-0000-0000-0000-000000000016",
"inserted_datetime": "2026-08-14T11:20:59.473617Z",
"items": [
{
"batch": {
"batch_number": null,
"id": "00000000-0000-0000-0000-0000000000f6",
"name": "B822"
},
"compliance_quantity": null,
"id": "2870c790-662f-4347-8a5f-c41fba971c32",
"is_sample": false,
"location": {
"address": "123 Fake Street, Beverly Hills, CA 90210, US",
"company_id": "00000000-0000-0000-0000-0000000003c0",
"id": "00000000-0000-0000-0000-00000000013f",
"license_id": null,
"name": "Place 317"
},
"package": null,
"price": "10.000000000",
"price_base": "10",
"product": {
"id": "a5a6b782-1bfa-4bed-86fa-360bc06eae97",
"name": "Product 789",
"sku": "sku 790",
"updated_datetime": "2026-08-14T11:20:59.487595Z"
},
"quantity": "15.000000000",
"received_quantity": "0.000000000"
},
{
"batch": {
"batch_number": null,
"id": "00000000-0000-0000-0000-0000000000f7",
"name": "B823"
},
"compliance_quantity": null,
"id": "9af7e161-b5d9-4ac0-b41a-241288ffa2ae",
"is_sample": false,
"location": {
"address": "123 Fake Street, Beverly Hills, CA 90210, US",
"company_id": "00000000-0000-0000-0000-0000000003c0",
"id": "00000000-0000-0000-0000-00000000013f",
"license_id": null,
"name": "Place 317"
},
"package": null,
"price": "10.000000000",
"price_base": "10",
"product": {
"id": "cfef764a-7b07-4623-8718-5179855e8600",
"name": "Product 804",
"sku": "sku 805",
"updated_datetime": "2026-08-14T11:20:59.504500Z"
},
"quantity": "10.000000000",
"received_quantity": "0.000000000"
},
{
"batch": {
"batch_number": null,
"id": "00000000-0000-0000-0000-0000000000f9",
"name": "B825"
},
"compliance_quantity": null,
"id": "0d668779-9c7e-4d8d-9adc-f0bc81a3e6ba",
"is_sample": false,
"location": {
"address": "123 Fake Street, Beverly Hills, CA 90210, US",
"company_id": "00000000-0000-0000-0000-0000000003c0",
"id": "00000000-0000-0000-0000-00000000013f",
"license_id": null,
"name": "Place 317"
},
"package": null,
"price": "10.000000000",
"price_base": "10",
"product": {
"id": "c259daf9-e125-4747-ab7a-bfbaecc21e26",
"name": "Product 810",
"sku": "sku 811",
"updated_datetime": "2026-08-14T11:20:59.521153Z"
},
"quantity": "5.000000000",
"received_quantity": "0.000000000"
},
{
"batch": {
"batch_number": null,
"id": "00000000-0000-0000-0000-0000000000fa",
"name": "B826"
},
"compliance_quantity": null,
"id": "2bfad70f-4d5b-4256-8ebd-b3e7aa6e28fd",
"is_sample": false,
"location": {
"address": "123 Fake Street, Beverly Hills, CA 90210, US",
"company_id": "00000000-0000-0000-0000-0000000003c0",
"id": "00000000-0000-0000-0000-00000000013f",
"license_id": null,
"name": "Place 317"
},
"package": null,
"price": "10.000000000",
"price_base": "10",
"product": {
"id": "c02dafb8-0a53-490a-a772-2cd9ac34c944",
"name": "Product 817",
"sku": "sku 818",
"updated_datetime": "2026-08-14T11:20:59.534448Z"
},
"quantity": "2.000000000",
"received_quantity": "0.000000000"
}
],
"location": {
"address": "123 Fake Street, Beverly Hills, CA 90210, US",
"company_id": "00000000-0000-0000-0000-0000000003c0",
"id": "00000000-0000-0000-0000-00000000013f",
"license_id": null,
"license_number": null,
"name": "Place 317"
},
"order_datetime": "2026-08-14T11:20:59.472682Z",
"owner": {
"banned": false,
"deleted_at": null,
"email": "owner-1263@example.com",
"full_name": "FirstName2542 LastName2543",
"id": "00000000-0000-0000-0000-0000000004f0",
"role": {
"id": "00000000-0000-0000-0000-0000000004f4",
"name": "Admin 1267"
}
},
"payments": [
{
"amount": "100.01",
"company": {
"id": "00000000-0000-0000-0000-0000000001cb",
"name": "Company 963",
"updated_datetime": "2026-08-14T11:20:59.404125Z"
},
"credit_uses": null,
"description": "Payment for purchase",
"fully_paid_with_credits": false,
"id": "00000000-0000-0000-0000-000000000015",
"inserted_datetime": "2026-08-14T11:20:59.574395Z",
"invoice": null,
"overpayment_credits": null,
"payment_date": "2020-01-01T00:00:00.000000Z",
"payment_method": {
"deleted_at": null,
"id": "00000000-0000-0000-0000-00000000001f",
"name": "Payment Method 30"
},
"payment_number": "PYT-1",
"payment_type": "PURCHASE",
"purchase": {
"id": "00000000-0000-0000-0000-000000000016",
"purchase_number": "Purchase #21",
"status": "PENDING",
"total": "32.00"
},
"quickbooks_deposit_account_id": null,
"status": "POSTED",
"updated_datetime": "2026-08-14T11:20:59.574395Z"
}
],
"purchase_number": "Purchase #21",
"status": "PENDING",
"total": "32.00",
"updated_datetime": "2026-08-14T11:20:59.473617Z"
}
}
Get a single purchase given the ID.
Required permission: purchases_permissions_view.
Request
GET /public/v1/purchases/{id}
Parameters
| Parameter | Description | In | Type | Required | Default | Example |
|---|---|---|---|---|---|---|
| id | Purchase ID | path | string | true |
Responses
| Status | Description | Schema |
|---|---|---|
| 200 | A single purchase | Purchase |
| 404 | Not Found |
Get purchases
GET /public/v1/purchases returns purchases related to the company
GET /public/v1/purchases
content-type: application/json
accept: application/json
authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJhdWQiOiJEaXN0cnUiLCJleHAiOjE4MTgxNTYwNjQsImlhdCI6MTc4NjcwNjQ2NCwiaXNzIjoiRGlzdHJ1IiwianRpIjoiMzU4MGIyNjEtNGFiZS00YjNhLWFjY2EtOThjMWNlZDU1MzRkIiwibW9iaWxlIjpmYWxzZSwibmJmIjoxNzg2NzA2NDYzLCJwbGF0Zm9ybSI6IkFQSSIsInN1YiI6IlVzZXI6MjUwMyIsInR5cCI6ImFjY2VzcyJ9.wsvjgRcLjapbk8Qiw_ducLLgadEfWvaersVZ0xHsFmo
Response
200
content-type: application/json; charset=utf-8
cache-control: max-age=0, private, must-revalidate
b3: 36ba742ee4458271eaa586681015c118-8d0e269f31babf2e-0
{
"data": [
{
"billing_location": {
"address": "123 Fake Street, Beverly Hills, CA 90210, US",
"company_id": "00000000-0000-0000-0000-000000000733",
"id": "00000000-0000-0000-0000-000000000243",
"license_id": null,
"license_number": null,
"name": "Place 577"
},
"charges": [],
"company": {
"id": "00000000-0000-0000-0000-00000000044f",
"name": "Company 1849",
"updated_datetime": "2026-08-14T11:21:04.586509Z"
},
"custom_data": [
{
"id": 68,
"name": "Custom Field 43",
"value": null
}
],
"description": null,
"due_datetime": "2026-08-14T11:21:04.608961Z",
"id": "00000000-0000-0000-0000-00000000004a",
"inserted_datetime": "2026-08-14T11:21:04.609391Z",
"items": [
{
"batch": {
"batch_number": null,
"id": "00000000-0000-0000-0000-0000000002b1",
"name": "B2134"
},
"compliance_quantity": null,
"id": "5693a517-5892-49c2-b514-524e6e98f31e",
"is_sample": false,
"location": {
"address": "123 Fake Street, Beverly Hills, CA 90210, US",
"company_id": "00000000-0000-0000-0000-000000000733",
"id": "00000000-0000-0000-0000-000000000241",
"license_id": null,
"name": "Place 575"
},
"package": null,
"price": "10.000000000",
"price_base": "10",
"product": {
"id": "66d6af26-498d-4f54-82be-eae92b71d643",
"name": "Product 2122",
"sku": "sku 2123",
"updated_datetime": "2026-08-14T11:21:04.615311Z"
},
"quantity": "15.000000000",
"received_quantity": "0.000000000"
},
{
"batch": {
"batch_number": null,
"id": "00000000-0000-0000-0000-0000000002b2",
"name": "B2135"
},
"compliance_quantity": null,
"id": "a3526925-96a9-4740-9d92-34d68ed6e4e4",
"is_sample": false,
"location": {
"address": "123 Fake Street, Beverly Hills, CA 90210, US",
"company_id": "00000000-0000-0000-0000-000000000733",
"id": "00000000-0000-0000-0000-000000000241",
"license_id": null,
"name": "Place 575"
},
"package": null,
"price": "10.000000000",
"price_base": "10",
"product": {
"id": "cab8d7b6-90b7-4597-81cd-f2957539220c",
"name": "Product 2125",
"sku": "sku 2126",
"updated_datetime": "2026-08-14T11:21:04.621034Z"
},
"quantity": "10.000000000",
"received_quantity": "0.000000000"
},
{
"batch": {
"batch_number": null,
"id": "00000000-0000-0000-0000-0000000002b3",
"name": "B2138"
},
"compliance_quantity": null,
"id": "5b8939d9-55cf-42b9-8bc8-5acc208a1ef8",
"is_sample": false,
"location": {
"address": "123 Fake Street, Beverly Hills, CA 90210, US",
"company_id": "00000000-0000-0000-0000-000000000733",
"id": "00000000-0000-0000-0000-000000000241",
"license_id": null,
"name": "Place 575"
},
"package": null,
"price": "10.000000000",
"price_base": "10",
"product": {
"id": "d8012bf7-3e02-4240-be14-013db7b0c5f1",
"name": "Product 2127",
"sku": "sku 2128",
"updated_datetime": "2026-08-14T11:21:04.626587Z"
},
"quantity": "5.000000000",
"received_quantity": "0.000000000"
},
{
"batch": {
"batch_number": null,
"id": "00000000-0000-0000-0000-0000000002b5",
"name": "B2140"
},
"compliance_quantity": null,
"id": "1971beff-4f44-4539-9eaf-8db9b544f319",
"is_sample": false,
"location": {
"address": "123 Fake Street, Beverly Hills, CA 90210, US",
"company_id": "00000000-0000-0000-0000-000000000733",
"id": "00000000-0000-0000-0000-000000000241",
"license_id": null,
"name": "Place 575"
},
"package": null,
"price": "10.000000000",
"price_base": "10",
"product": {
"id": "099ed216-000b-4590-b842-dbd680fee10d",
"name": "Product 2132",
"sku": "sku 2133",
"updated_datetime": "2026-08-14T11:21:04.632251Z"
},
"quantity": "2.000000000",
"received_quantity": "0.000000000"
}
],
"location": {
"address": "123 Fake Street, Beverly Hills, CA 90210, US",
"company_id": "00000000-0000-0000-0000-000000000733",
"id": "00000000-0000-0000-0000-000000000241",
"license_id": null,
"license_number": null,
"name": "Place 575"
},
"order_datetime": "2026-08-14T11:21:04.608961Z",
"owner": {
"banned": false,
"deleted_at": null,
"email": "owner-2512@example.com",
"full_name": "FirstName5098 LastName5099",
"id": "00000000-0000-0000-0000-0000000009e4",
"role": {
"id": "00000000-0000-0000-0000-0000000009fa",
"name": "Admin 2553"
}
},
"payments": [],
"purchase_number": "Purchase #69",
"status": "PENDING",
"total": "32.00",
"updated_datetime": "2026-08-14T11:21:04.609391Z"
},
{
"billing_location": {
"address": "123 Fake Street, Beverly Hills, CA 90210, US",
"company_id": "00000000-0000-0000-0000-000000000733",
"id": "00000000-0000-0000-0000-00000000023c",
"license_id": null,
"license_number": null,
"name": "Place 570"
},
"charges": [
{
"id": "daa838fc-ef73-4f00-bc59-5cc43db66891",
"name": "C1",
"percent": "10.0000",
"price": "1.00",
"tax": {
"id": "00000000-0000-0000-0000-00000000000c",
"name": "T1"
},
"type": "CHARGE",
"unit_type": "PERCENT"
}
],
"company": {
"id": "00000000-0000-0000-0000-00000000044d",
"name": "Company 1845",
"updated_datetime": "2030-11-01T00:00:00.000000Z"
},
"custom_data": [
{
"id": 68,
"name": "Custom Field 43",
"value": "Custom Field Value 1"
}
],
"description": "A description of this purchase",
"due_datetime": "2020-01-01T00:00:01.000000Z",
"id": "00000000-0000-0000-0000-000000000049",
"inserted_datetime": "2020-01-01T00:00:03.000000Z",
"items": [
{
"batch": {
"batch_number": "UID1",
"id": "00000000-0000-0000-0000-0000000002a8",
"name": "B1"
},
"compliance_quantity": "1.0000",
"id": "02940690-924b-452b-bbb6-437f2a8d7eae",
"is_sample": false,
"location": {
"address": "123 Fake Street, Beverly Hills, CA 90210, US",
"company_id": "00000000-0000-0000-0000-000000000733",
"id": "00000000-0000-0000-0000-000000000238",
"license_id": "00000000-0000-0000-0000-000000000075",
"name": "Place 566"
},
"package": {
"batch_number": "B1",
"compliance_label": "ABCDEF012345670000000169",
"id": "00000000-0000-0000-0000-000000000058",
"metrc_label": "ABCDEF012345670000000169",
"status": "active"
},
"price": "10.000000000",
"price_base": "10",
"product": {
"id": "08ac02d0-efc3-4797-a0e0-fd28d89e0735",
"name": "P1",
"sku": "SKU1",
"updated_datetime": "2023-11-02T00:00:00.000000Z"
},
"quantity": "1.000000000",
"received_quantity": "1.000000000"
}
],
"location": {
"address": "123 Fake Street, Beverly Hills, CA 90210, US",
"company_id": "00000000-0000-0000-0000-000000000733",
"id": "00000000-0000-0000-0000-00000000023b",
"license_id": null,
"license_number": null,
"name": "Place 569"
},
"order_datetime": "2020-01-01T00:00:02.000000Z",
"owner": {
"banned": false,
"deleted_at": null,
"email": "purchase-owner@example.com",
"full_name": "FirstName5042 LastName5043",
"id": "00000000-0000-0000-0000-0000000009c8",
"role": {
"id": "00000000-0000-0000-0000-0000000009fb",
"name": "Admin 2554"
}
},
"payments": [],
"purchase_number": "SO-123",
"status": "COMPLETED",
"total": "10.00",
"updated_datetime": "2020-01-01T00:00:04.000000Z"
}
],
"next_page": null
}
GET /public/v1/purchases allows filtering by several statuses
GET /public/v1/purchases?status[]=COMPLETED&status[]=PENDING
content-type: application/json
accept: application/json
authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJhdWQiOiJEaXN0cnUiLCJleHAiOjE4MTgxNTYwNjMsImlhdCI6MTc4NjcwNjQ2MywiaXNzIjoiRGlzdHJ1IiwianRpIjoiMTk2MTdiZGUtY2ZlYS00YmMyLWE3NjItMWQzZjg3ZDQwZjFlIiwibW9iaWxlIjpmYWxzZSwibmJmIjoxNzg2NzA2NDYyLCJwbGF0Zm9ybSI6IkFQSSIsInN1YiI6IlVzZXI6MjMzMiIsInR5cCI6ImFjY2VzcyJ9.Szv0ZOxbpQIl5Eet3X4efiW43tRD31yLrHwW0axlzbU
Response
200
content-type: application/json; charset=utf-8
cache-control: max-age=0, private, must-revalidate
b3: 50abe8558d675b3576d6a548bfe79c34-604e5d7124990a80-0
{
"data": [
{
"billing_location": {
"address": "123 Fake Street, Beverly Hills, CA 90210, US",
"company_id": "00000000-0000-0000-0000-0000000006a8",
"id": "00000000-0000-0000-0000-000000000214",
"license_id": null,
"license_number": null,
"name": "Place 530"
},
"charges": [],
"company": {
"id": "00000000-0000-0000-0000-0000000003eb",
"name": "Company 1731",
"updated_datetime": "2026-08-14T11:21:03.678817Z"
},
"custom_data": [],
"description": null,
"due_datetime": "2026-08-14T11:21:03.731234Z",
"id": "00000000-0000-0000-0000-000000000041",
"inserted_datetime": "2026-08-14T11:21:03.731629Z",
"items": [
{
"batch": {
"batch_number": null,
"id": "00000000-0000-0000-0000-00000000025b",
"name": "B1890"
},
"compliance_quantity": null,
"id": "b796e7c7-23a7-40fa-bb68-f0baa59f710c",
"is_sample": false,
"location": {
"address": "123 Fake Street, Beverly Hills, CA 90210, US",
"company_id": "00000000-0000-0000-0000-0000000006a8",
"id": "00000000-0000-0000-0000-000000000213",
"license_id": null,
"name": "Place 529"
},
"package": null,
"price": "10.000000000",
"price_base": "10",
"product": {
"id": "fd8c95a9-370c-42cb-8820-6bde21e696da",
"name": "Product 1877",
"sku": "sku 1878",
"updated_datetime": "2026-08-14T11:21:03.736783Z"
},
"quantity": "15.000000000",
"received_quantity": "0.000000000"
},
{
"batch": {
"batch_number": null,
"id": "00000000-0000-0000-0000-00000000025d",
"name": "B1892"
},
"compliance_quantity": null,
"id": "e499842d-f951-44e1-9f66-5aef3fb742a3",
"is_sample": false,
"location": {
"address": "123 Fake Street, Beverly Hills, CA 90210, US",
"company_id": "00000000-0000-0000-0000-0000000006a8",
"id": "00000000-0000-0000-0000-000000000213",
"license_id": null,
"name": "Place 529"
},
"package": null,
"price": "10.000000000",
"price_base": "10",
"product": {
"id": "a8a3fbc4-e7ad-460d-8303-e536b71221b3",
"name": "Product 1880",
"sku": "sku 1882",
"updated_datetime": "2026-08-14T11:21:03.742169Z"
},
"quantity": "10.000000000",
"received_quantity": "0.000000000"
},
{
"batch": {
"batch_number": null,
"id": "00000000-0000-0000-0000-00000000025e",
"name": "B1893"
},
"compliance_quantity": null,
"id": "b8f53ff7-c7b2-4b18-8bc6-dbffaa0efe78",
"is_sample": false,
"location": {
"address": "123 Fake Street, Beverly Hills, CA 90210, US",
"company_id": "00000000-0000-0000-0000-0000000006a8",
"id": "00000000-0000-0000-0000-000000000213",
"license_id": null,
"name": "Place 529"
},
"package": null,
"price": "10.000000000",
"price_base": "10",
"product": {
"id": "879512d1-7533-4312-a625-d87d0f7b35e2",
"name": "Product 1884",
"sku": "sku 1885",
"updated_datetime": "2026-08-14T11:21:03.748410Z"
},
"quantity": "5.000000000",
"received_quantity": "0.000000000"
},
{
"batch": {
"batch_number": null,
"id": "00000000-0000-0000-0000-00000000025f",
"name": "B1894"
},
"compliance_quantity": null,
"id": "819a62ac-a6e2-43d0-a3c6-870037c3c517",
"is_sample": false,
"location": {
"address": "123 Fake Street, Beverly Hills, CA 90210, US",
"company_id": "00000000-0000-0000-0000-0000000006a8",
"id": "00000000-0000-0000-0000-000000000213",
"license_id": null,
"name": "Place 529"
},
"package": null,
"price": "10.000000000",
"price_base": "10",
"product": {
"id": "29133d61-87ff-438b-9ba2-4c3c17d6ea13",
"name": "Product 1886",
"sku": "sku 1887",
"updated_datetime": "2026-08-14T11:21:03.754148Z"
},
"quantity": "2.000000000",
"received_quantity": "0.000000000"
}
],
"location": {
"address": "123 Fake Street, Beverly Hills, CA 90210, US",
"company_id": "00000000-0000-0000-0000-0000000006a8",
"id": "00000000-0000-0000-0000-000000000213",
"license_id": null,
"license_number": null,
"name": "Place 529"
},
"order_datetime": "2020-01-01T12:30:00.000000Z",
"owner": {
"banned": false,
"deleted_at": null,
"email": "owner-2355@example.com",
"full_name": "FirstName4782 LastName4783",
"id": "00000000-0000-0000-0000-000000000946",
"role": {
"id": "00000000-0000-0000-0000-000000000954",
"name": "Admin 2387"
}
},
"payments": [],
"purchase_number": "Purchase #61",
"status": "PENDING",
"total": "32.00",
"updated_datetime": "2026-08-14T11:21:03.731629Z"
},
{
"billing_location": {
"address": "123 Fake Street, Beverly Hills, CA 90210, US",
"company_id": "00000000-0000-0000-0000-0000000006a8",
"id": "00000000-0000-0000-0000-000000000211",
"license_id": null,
"license_number": null,
"name": "Place 527"
},
"charges": [],
"company": {
"id": "00000000-0000-0000-0000-0000000003e3",
"name": "Company 1722",
"updated_datetime": "2026-08-14T11:21:03.613445Z"
},
"custom_data": [],
"description": null,
"due_datetime": "2026-08-14T11:21:03.633341Z",
"id": "00000000-0000-0000-0000-000000000040",
"inserted_datetime": "2026-08-14T11:21:03.633753Z",
"items": [
{
"batch": {
"batch_number": null,
"id": "00000000-0000-0000-0000-000000000253",
"name": "B1864"
},
"compliance_quantity": null,
"id": "773459c4-cf58-423f-8a0a-0dfaf11345db",
"is_sample": false,
"location": {
"address": "123 Fake Street, Beverly Hills, CA 90210, US",
"company_id": "00000000-0000-0000-0000-0000000006a8",
"id": "00000000-0000-0000-0000-000000000210",
"license_id": null,
"name": "Place 526"
},
"package": null,
"price": "10.000000000",
"price_base": "10",
"product": {
"id": "c3ae6b33-2578-459f-ae45-20912218bab0",
"name": "Product 1856",
"sku": "sku 1857",
"updated_datetime": "2026-08-14T11:21:03.640462Z"
},
"quantity": "15.000000000",
"received_quantity": "15.000000000"
},
{
"batch": {
"batch_number": null,
"id": "00000000-0000-0000-0000-000000000254",
"name": "B1865"
},
"compliance_quantity": null,
"id": "cf08a045-72d7-4793-81e9-ba57e3c11d56",
"is_sample": false,
"location": {
"address": "123 Fake Street, Beverly Hills, CA 90210, US",
"company_id": "00000000-0000-0000-0000-0000000006a8",
"id": "00000000-0000-0000-0000-000000000210",
"license_id": null,
"name": "Place 526"
},
"package": null,
"price": "10.000000000",
"price_base": "10",
"product": {
"id": "75a5ac38-8283-43fd-8875-b6e7f261544a",
"name": "Product 1858",
"sku": "sku 1859",
"updated_datetime": "2026-08-14T11:21:03.646189Z"
},
"quantity": "10.000000000",
"received_quantity": "10.000000000"
},
{
"batch": {
"batch_number": null,
"id": "00000000-0000-0000-0000-000000000255",
"name": "B1866"
},
"compliance_quantity": null,
"id": "b8738fc0-5ff3-45a4-a5aa-1db4f141a64e",
"is_sample": false,
"location": {
"address": "123 Fake Street, Beverly Hills, CA 90210, US",
"company_id": "00000000-0000-0000-0000-0000000006a8",
"id": "00000000-0000-0000-0000-000000000210",
"license_id": null,
"name": "Place 526"
},
"package": null,
"price": "10.000000000",
"price_base": "10",
"product": {
"id": "fab5c0c6-5a9b-4804-9e23-0332b4933de0",
"name": "Product 1860",
"sku": "sku 1861",
"updated_datetime": "2026-08-14T11:21:03.652074Z"
},
"quantity": "5.000000000",
"received_quantity": "5.000000000"
},
{
"batch": {
"batch_number": null,
"id": "00000000-0000-0000-0000-000000000256",
"name": "B1867"
},
"compliance_quantity": null,
"id": "e7fb4d84-4c42-4b74-b9cc-8bb6950d3ad2",
"is_sample": false,
"location": {
"address": "123 Fake Street, Beverly Hills, CA 90210, US",
"company_id": "00000000-0000-0000-0000-0000000006a8",
"id": "00000000-0000-0000-0000-000000000210",
"license_id": null,
"name": "Place 526"
},
"package": null,
"price": "10.000000000",
"price_base": "10",
"product": {
"id": "a2854d4a-23e1-4917-a27e-18b691a08485",
"name": "Product 1862",
"sku": "sku 1863",
"updated_datetime": "2026-08-14T11:21:03.662725Z"
},
"quantity": "2.000000000",
"received_quantity": "2.000000000"
}
],
"location": {
"address": "123 Fake Street, Beverly Hills, CA 90210, US",
"company_id": "00000000-0000-0000-0000-0000000006a8",
"id": "00000000-0000-0000-0000-000000000210",
"license_id": null,
"license_number": null,
"name": "Place 526"
},
"order_datetime": "2020-01-01T12:20:00.000000Z",
"owner": {
"banned": false,
"deleted_at": null,
"email": "owner-2344@example.com",
"full_name": "FirstName4760 LastName4761",
"id": "00000000-0000-0000-0000-00000000093b",
"role": {
"id": "00000000-0000-0000-0000-000000000954",
"name": "Admin 2387"
}
},
"payments": [],
"purchase_number": "Purchase #60",
"status": "COMPLETED",
"total": "32.00",
"updated_datetime": "2026-08-14T11:21:03.633753Z"
},
{
"billing_location": {
"address": "123 Fake Street, Beverly Hills, CA 90210, US",
"company_id": "00000000-0000-0000-0000-0000000006a8",
"id": "00000000-0000-0000-0000-000000000209",
"license_id": null,
"license_number": null,
"name": "Place 519"
},
"charges": [],
"company": {
"id": "00000000-0000-0000-0000-0000000003d2",
"name": "Company 1701",
"updated_datetime": "2026-08-14T11:21:03.502384Z"
},
"custom_data": [],
"description": null,
"due_datetime": "2026-08-14T11:21:03.522983Z",
"id": "00000000-0000-0000-0000-00000000003e",
"inserted_datetime": "2026-08-14T11:21:03.523403Z",
"items": [
{
"batch": {
"batch_number": null,
"id": "00000000-0000-0000-0000-000000000244",
"name": "B1821"
},
"compliance_quantity": null,
"id": "9a16b337-bef9-413a-a6fd-2cedca52d8f3",
"is_sample": false,
"location": {
"address": "123 Fake Street, Beverly Hills, CA 90210, US",
"company_id": "00000000-0000-0000-0000-0000000006a8",
"id": "00000000-0000-0000-0000-000000000208",
"license_id": null,
"name": "Place 518"
},
"package": null,
"price": "10.000000000",
"price_base": "10",
"product": {
"id": "eb00675b-247c-4569-845b-06c7344cd765",
"name": "Product 1813",
"sku": "sku 1814",
"updated_datetime": "2026-08-14T11:21:03.529038Z"
},
"quantity": "15.000000000",
"received_quantity": "15.000000000"
},
{
"batch": {
"batch_number": null,
"id": "00000000-0000-0000-0000-000000000245",
"name": "B1822"
},
"compliance_quantity": null,
"id": "5d6e9923-8ee8-479c-b730-b1ff26109e92",
"is_sample": false,
"location": {
"address": "123 Fake Street, Beverly Hills, CA 90210, US",
"company_id": "00000000-0000-0000-0000-0000000006a8",
"id": "00000000-0000-0000-0000-000000000208",
"license_id": null,
"name": "Place 518"
},
"package": null,
"price": "10.000000000",
"price_base": "10",
"product": {
"id": "733efcbe-8e7a-42ae-916f-5e3c089f51a8",
"name": "Product 1815",
"sku": "sku 1816",
"updated_datetime": "2026-08-14T11:21:03.534595Z"
},
"quantity": "10.000000000",
"received_quantity": "10.000000000"
},
{
"batch": {
"batch_number": null,
"id": "00000000-0000-0000-0000-000000000246",
"name": "B1823"
},
"compliance_quantity": null,
"id": "0d500af9-0053-4cfe-8e38-2b9256404584",
"is_sample": false,
"location": {
"address": "123 Fake Street, Beverly Hills, CA 90210, US",
"company_id": "00000000-0000-0000-0000-0000000006a8",
"id": "00000000-0000-0000-0000-000000000208",
"license_id": null,
"name": "Place 518"
},
"package": null,
"price": "10.000000000",
"price_base": "10",
"product": {
"id": "d2a15fe1-61d7-44de-bf50-8494f973fabb",
"name": "Product 1817",
"sku": "sku 1818",
"updated_datetime": "2026-08-14T11:21:03.540051Z"
},
"quantity": "5.000000000",
"received_quantity": "5.000000000"
},
{
"batch": {
"batch_number": null,
"id": "00000000-0000-0000-0000-000000000247",
"name": "B1824"
},
"compliance_quantity": null,
"id": "78278d46-f33b-455c-b7b4-863a505aebd3",
"is_sample": false,
"location": {
"address": "123 Fake Street, Beverly Hills, CA 90210, US",
"company_id": "00000000-0000-0000-0000-0000000006a8",
"id": "00000000-0000-0000-0000-000000000208",
"license_id": null,
"name": "Place 518"
},
"package": null,
"price": "10.000000000",
"price_base": "10",
"product": {
"id": "bf9de6c0-a119-4478-b8e0-acfdf11c4038",
"name": "Product 1819",
"sku": "sku 1820",
"updated_datetime": "2026-08-14T11:21:03.545489Z"
},
"quantity": "2.000000000",
"received_quantity": "2.000000000"
}
],
"location": {
"address": "123 Fake Street, Beverly Hills, CA 90210, US",
"company_id": "00000000-0000-0000-0000-0000000006a8",
"id": "00000000-0000-0000-0000-000000000208",
"license_id": null,
"license_number": null,
"name": "Place 518"
},
"order_datetime": "2020-01-01T12:00:00.000000Z",
"owner": {
"banned": false,
"deleted_at": null,
"email": "owner-2321@example.com",
"full_name": "FirstName4714 LastName4715",
"id": "00000000-0000-0000-0000-000000000923",
"role": {
"id": "00000000-0000-0000-0000-000000000954",
"name": "Admin 2387"
}
},
"payments": [],
"purchase_number": "Purchase #58",
"status": "COMPLETED",
"total": "32.00",
"updated_datetime": "2026-08-14T11:21:03.523403Z"
}
],
"next_page": null
}
Get purchases sorted by Order Date descendingly date and filtered by various attributes.
Note: The page size for this endpoint is 500 purchase orders per page.
Required permission: purchases_permissions_view. Results are filtered to
only include purchases the authenticated user can access under their team
restrictions.
Request
GET /public/v1/purchases
Parameters
| Parameter | Description | In | Type | Required | Default | Example |
|---|---|---|---|---|---|---|
| due_datetime | Filter purchases by the due datetime | query | string | false | ,2022-07-10T00:00:00Z | |
| inserted_datetime | Filter purchases by their creation datetime | query | string | false | 2022-07-10T00:00:00Z, | |
| order_datetime | Filter purchases by the order datetime | query | string | false | 2022-07-10T00:00:00Z,2022-07-11T00:00:00Z | |
| page | Pagination information | query | number | false | ?page[number]=1 | |
| status | Filter purchases by their status. Accepted values are "COMPLETED", "DELIVERING", "PARTIALLY_RECEIVED", "PENDING", "PROCESSING". | query | array | false | ["PENDING","PROCESSING"] | |
| updated_datetime | Filter purchases by the datetime they were most recently modified | query | string | false | ,2022-07-10T00:00:00Z |
Responses
| Status | Description | Schema |
|---|---|---|
| 200 | A list of purchases | Purchases |
Insert a payment for a purchase
POST /purchases/:id/payments can create a payment for an purchase with both quickbooks id and name
POST /public/v1/purchases/00000000-0000-0000-0000-00000000002b/payments
content-type: application/json
accept: application/json
authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJhdWQiOiJEaXN0cnUiLCJleHAiOjE4MTgxNTYwNjEsImlhdCI6MTc4NjcwNjQ2MSwiaXNzIjoiRGlzdHJ1IiwianRpIjoiNWE2NDU4MmMtZWY0YS00ODc0LTlhYWMtNTI5NmViOTdmNDExIiwibW9iaWxlIjpmYWxzZSwibmJmIjoxNzg2NzA2NDYwLCJwbGF0Zm9ybSI6IkFQSSIsInN1YiI6IlVzZXI6MjA1MSIsInR5cCI6ImFjY2VzcyJ9.HIbwmPBKqk4JowCXJK5aJbx-3TTzpem-Aonk8u6AipQ
{
"amount": 100.01,
"description": "Payment for purchase",
"payment_datetime": "2020-01-01T00:00:00.000000Z",
"payment_method_id": "00000000-0000-0000-0000-000000000025",
"quickbooks_deposit_account_id": "QBD-123"
}
Response
200
content-type: application/json; charset=utf-8
cache-control: max-age=0, private, must-revalidate
b3: b06c8bc319a619269730d5c0fe8017d5-2f8664f99b76757f-0
{
"data": {
"amount": "100.01",
"company": {
"id": "00000000-0000-0000-0000-000000000343",
"name": "Company 1503",
"updated_datetime": "2026-08-14T11:21:01.981385Z"
},
"credit_uses": null,
"description": "Payment for purchase",
"fully_paid_with_credits": false,
"id": "00000000-0000-0000-0000-00000000001b",
"inserted_datetime": "2026-08-14T11:21:02.014746Z",
"invoice": null,
"overpayment_credits": null,
"payment_date": "2020-01-01T00:00:00.000000Z",
"payment_method": {
"deleted_at": null,
"id": "00000000-0000-0000-0000-000000000025",
"name": "Payment Method 0"
},
"payment_number": "PYT-0000001",
"payment_type": "PURCHASE",
"purchase": {
"id": "00000000-0000-0000-0000-00000000002b",
"purchase_number": "Purchase #40",
"status": "PENDING",
"total": "32.00"
},
"quickbooks_deposit_account_id": "QBD-123",
"quickbooks_deposit_account_name": "QBD-NAME",
"status": "POSTED",
"updated_datetime": "2026-08-14T11:21:02.014746Z"
}
}
POST /purchases/:id/payments can create a payment for an purchase with both quickbooks id and name
POST /public/v1/purchases/00000000-0000-0000-0000-00000000002b/payments
content-type: application/json
accept: application/json
authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJhdWQiOiJEaXN0cnUiLCJleHAiOjE4MTgxNTYwNjEsImlhdCI6MTc4NjcwNjQ2MSwiaXNzIjoiRGlzdHJ1IiwianRpIjoiNWE2NDU4MmMtZWY0YS00ODc0LTlhYWMtNTI5NmViOTdmNDExIiwibW9iaWxlIjpmYWxzZSwibmJmIjoxNzg2NzA2NDYwLCJwbGF0Zm9ybSI6IkFQSSIsInN1YiI6IlVzZXI6MjA1MSIsInR5cCI6ImFjY2VzcyJ9.HIbwmPBKqk4JowCXJK5aJbx-3TTzpem-Aonk8u6AipQ
{
"amount": 100.01,
"description": "Payment for purchase",
"payment_datetime": "2020-01-01T00:00:00.000000Z",
"payment_method_id": "00000000-0000-0000-0000-000000000025",
"quickbooks_deposit_account_name": "QBD-NAME"
}
Response
200
content-type: application/json; charset=utf-8
cache-control: max-age=0, private, must-revalidate
b3: b06c8bc319a619269730d5c0fe8017d5-b06c6246332d513b-0
{
"data": {
"amount": "100.01",
"company": {
"id": "00000000-0000-0000-0000-000000000343",
"name": "Company 1503",
"updated_datetime": "2026-08-14T11:21:01.981385Z"
},
"credit_uses": null,
"description": "Payment for purchase",
"fully_paid_with_credits": false,
"id": "00000000-0000-0000-0000-00000000001d",
"inserted_datetime": "2026-08-14T11:21:02.094221Z",
"invoice": null,
"overpayment_credits": null,
"payment_date": "2020-01-01T00:00:00.000000Z",
"payment_method": {
"deleted_at": null,
"id": "00000000-0000-0000-0000-000000000025",
"name": "Payment Method 0"
},
"payment_number": "PYT-0000002",
"payment_type": "PURCHASE",
"purchase": {
"id": "00000000-0000-0000-0000-00000000002b",
"purchase_number": "Purchase #40",
"status": "PENDING",
"total": "32.00"
},
"quickbooks_deposit_account_id": "QBD-123",
"quickbooks_deposit_account_name": "QBD-NAME",
"status": "POSTED",
"updated_datetime": "2026-08-14T11:21:02.094221Z"
}
}
Required permission: purchases_permissions_make_payments. The authenticated user must also be allowed to view purchases under their team restrictions.
Request
POST /public/v1/purchases/{id}/payments
Parameters
| Parameter | Description | In | Type | Required | Default | Example |
|---|---|---|---|---|---|---|
| payment_method_id | Payment method ID | query | string | true | ||
| amount | Amount of the payment. Will round to 2 decimal places | query | decimal | true | ||
| payment_datetime | Payment date | query | string | true | ||
| description | Description of the payment | query | string | true | ||
| quickbooks_deposit_account_id | Quickbooks deposit account ID. Cannot include both this and quickbooks_deposit_account_name. If user's company is integrated with Quickbooks, either this or quickbooks_deposit_account_name must be provided. Account type must be "Bank" or "Credit Card" | query | string | false | ||
| quickbooks_deposit_account_name | Quickbooks deposit account name. Cannot include both this and quickbooks_deposit_account_id. If user's company is integrated with Quickbooks, either this or quickbooks_deposit_account_id must be provided. Account type must be "Bank" or "Credit Card" | query | string | false |
Responses
| Status | Description | Schema |
|---|---|---|
| 200 | A single payment | Payment |
Upsert a purchase order
POST /public/v1/purchases creates a purchase (with product-tracked item)
POST /public/v1/purchases
content-type: application/json
accept: application/json
authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJhdWQiOiJEaXN0cnUiLCJleHAiOjE4MTgxNTYwNjIsImlhdCI6MTc4NjcwNjQ2MiwiaXNzIjoiRGlzdHJ1IiwianRpIjoiMGI2ODk4MDctYTAyZS00YTM2LTk3NmEtYjNhNjMwOTMxZDM5IiwibW9iaWxlIjpmYWxzZSwibmJmIjoxNzg2NzA2NDYxLCJwbGF0Zm9ybSI6IkFQSSIsInN1YiI6IlVzZXI6MjEyMSIsInR5cCI6ImFjY2VzcyJ9.rWrsLebFtcBfDziFdHrGmTP7G2qyM6_Ge_3rwJR0vlE
{
"billing_location_id": "00000000-0000-0000-0000-0000000001c1",
"charges": [
{
"name": "C1",
"percent": "10.0000",
"type": "CHARGE",
"unit_type": "PERCENT"
},
{
"name": "C2",
"price": "-5.0000",
"type": "DISCOUNT",
"unit_type": "PRICE"
}
],
"company_id": "00000000-0000-0000-0000-000000000356",
"custom_data": {
"65": [
"A",
"B"
]
},
"description": "A description of this purchase",
"due_datetime": "2020-01-30T00:00:00.000000Z",
"items": [
{
"location_id": "00000000-0000-0000-0000-0000000001c0",
"price": "10.000000000",
"product_id": "8bfa2f5c-9874-476f-8d7f-9869c40c69c4",
"quantity": "1.000000000"
}
],
"location_id": "00000000-0000-0000-0000-0000000001c0",
"order_datetime": "2020-01-01T00:00:00.000000Z",
"owner_id": "00000000-0000-0000-0000-000000000849"
}
Response
200
content-type: application/json; charset=utf-8
cache-control: max-age=0, private, must-revalidate
b3: ee6da63bf2e54db25269130357bb6066-e6796c8f569d5a0a-0
{
"data": {
"billing_location": {
"address": "123 Fake Street, Beverly Hills, CA 90210, US",
"company_id": "00000000-0000-0000-0000-0000000005fe",
"id": "00000000-0000-0000-0000-0000000001c1",
"license_id": null,
"license_number": null,
"name": "Place 447"
},
"charges": [
{
"id": "f225bc52-09e2-4517-b798-bcc2a9f4df3b",
"name": "C1",
"percent": "10.0000",
"price": "1.00",
"type": "CHARGE",
"unit_type": "PERCENT"
},
{
"id": "99f78397-3d0e-4f89-9dac-3155d7e52fee",
"name": "C2",
"percent": null,
"price": "-5.00",
"type": "DISCOUNT",
"unit_type": "PRICE"
}
],
"company": {
"id": "00000000-0000-0000-0000-000000000356",
"name": "Company 1533",
"updated_datetime": "2026-08-14T11:21:02.283204Z"
},
"custom_data": [
{
"id": 65,
"name": "Custom Field 40",
"value": "A,B"
}
],
"description": "A description of this purchase",
"due_datetime": "2020-01-30T00:00:00.000000Z",
"id": "00000000-0000-0000-0000-00000000002d",
"inserted_datetime": "2026-08-14T11:21:02.374665Z",
"items": [
{
"batch": {
"batch_number": null,
"id": "00000000-0000-0000-0000-0000000001f2",
"name": "B1"
},
"compliance_quantity": null,
"id": "9ada4a0a-08da-4630-a67a-cf0948e3fbbd",
"is_sample": false,
"location": {
"address": "123 Fake Street, Beverly Hills, CA 90210, US",
"company_id": "00000000-0000-0000-0000-0000000005fe",
"id": "00000000-0000-0000-0000-0000000001c0",
"license_id": "00000000-0000-0000-0000-000000000059",
"name": "Place 446"
},
"package": null,
"price": "10.000000000",
"price_base": "10.000000000",
"product": {
"id": "8bfa2f5c-9874-476f-8d7f-9869c40c69c4",
"name": "P1",
"sku": "SKU1",
"updated_datetime": "2026-08-14T11:21:02.335443Z"
},
"quantity": "1.000000000",
"received_quantity": "0.000000000"
}
],
"location": {
"address": "123 Fake Street, Beverly Hills, CA 90210, US",
"company_id": "00000000-0000-0000-0000-0000000005fe",
"id": "00000000-0000-0000-0000-0000000001c0",
"license_id": "00000000-0000-0000-0000-000000000059",
"license_number": "CDPH-00000090",
"name": "Place 446"
},
"order_datetime": "2020-01-01T00:00:00.000000Z",
"owner": {
"banned": false,
"deleted_at": null,
"email": "user1@a.com",
"full_name": "John Foo",
"id": "00000000-0000-0000-0000-000000000849",
"role": {
"id": "00000000-0000-0000-0000-00000000088f",
"name": "Admin 2190"
}
},
"payments": [],
"purchase_number": "PO-0000001",
"status": "PENDING",
"total": "6.00",
"updated_datetime": "2026-08-14T11:21:02.384232Z"
}
}
POST /public/v1/purchases creates a purchase (with batch-tracked item)
POST /public/v1/purchases
content-type: application/json
accept: application/json
authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJhdWQiOiJEaXN0cnUiLCJleHAiOjE4MTgxNTYwNjQsImlhdCI6MTc4NjcwNjQ2NCwiaXNzIjoiRGlzdHJ1IiwianRpIjoiOGZlYWUxY2QtZjUzNC00N2QwLTgyZTYtNDYzNzVkMzk0YmJhIiwibW9iaWxlIjpmYWxzZSwibmJmIjoxNzg2NzA2NDYzLCJwbGF0Zm9ybSI6IkFQSSIsInN1YiI6IlVzZXI6MjU3MiIsInR5cCI6ImFjY2VzcyJ9.ooXbeJIR9fxetQB6idkmZVzdLkkcMtH_4Q-U0G4IVtA
{
"billing_location_id": "00000000-0000-0000-0000-000000000255",
"charges": [
{
"name": "C1",
"percent": "10.0000",
"type": "CHARGE",
"unit_type": "PERCENT"
},
{
"name": "C2",
"price": "-5.0000",
"type": "DISCOUNT",
"unit_type": "PRICE"
}
],
"company_id": "00000000-0000-0000-0000-00000000046d",
"due_datetime": "2020-01-30T00:00:00.000000Z",
"items": [
{
"batch_id": "00000000-0000-0000-0000-0000000002c1",
"location_id": "00000000-0000-0000-0000-000000000255",
"price": "10.000000000",
"product_id": "673bd900-2ebf-4161-b5e7-9c51e685d0cb",
"quantity": "1.000000000"
}
],
"location_id": "00000000-0000-0000-0000-000000000255",
"order_datetime": "2020-01-01T00:00:00.000000Z"
}
Response
200
content-type: application/json; charset=utf-8
cache-control: max-age=0, private, must-revalidate
b3: 0c602058184ee1eae5e3af482c5a7930-26d44218469b39bf-0
{
"data": {
"billing_location": {
"address": "123 Fake Street, Beverly Hills, CA 90210, US",
"company_id": "00000000-0000-0000-0000-00000000075e",
"id": "00000000-0000-0000-0000-000000000255",
"license_id": "00000000-0000-0000-0000-000000000081",
"license_number": "CDPH-00000130",
"name": "Place 595"
},
"charges": [
{
"id": "446159a3-3e9f-4122-929f-c07aabe7b73e",
"name": "C1",
"percent": "10.0000",
"price": "1.00",
"type": "CHARGE",
"unit_type": "PERCENT"
},
{
"id": "6ab99cfb-2b78-4d28-814c-c9834f01bd6e",
"name": "C2",
"percent": null,
"price": "-5.00",
"type": "DISCOUNT",
"unit_type": "PRICE"
}
],
"company": {
"id": "00000000-0000-0000-0000-00000000046d",
"name": "Company 1884",
"updated_datetime": "2026-08-14T11:21:04.765199Z"
},
"custom_data": [],
"description": null,
"due_datetime": "2020-01-30T00:00:00.000000Z",
"id": "00000000-0000-0000-0000-00000000004c",
"inserted_datetime": "2026-08-14T11:21:04.854793Z",
"items": [
{
"batch": {
"batch_number": null,
"id": "00000000-0000-0000-0000-0000000002c1",
"name": "B1"
},
"compliance_quantity": null,
"id": "ddf029dd-43d8-4bb0-b6eb-7eb639126fe5",
"is_sample": false,
"location": {
"address": "123 Fake Street, Beverly Hills, CA 90210, US",
"company_id": "00000000-0000-0000-0000-00000000075e",
"id": "00000000-0000-0000-0000-000000000255",
"license_id": "00000000-0000-0000-0000-000000000081",
"name": "Place 595"
},
"package": null,
"price": "10.000000000",
"price_base": "10.000000000",
"product": {
"id": "673bd900-2ebf-4161-b5e7-9c51e685d0cb",
"name": "P1",
"sku": "SKU1",
"updated_datetime": "2026-08-14T11:21:04.838807Z"
},
"quantity": "1.000000000",
"received_quantity": "0.000000000"
}
],
"location": {
"address": "123 Fake Street, Beverly Hills, CA 90210, US",
"company_id": "00000000-0000-0000-0000-00000000075e",
"id": "00000000-0000-0000-0000-000000000255",
"license_id": "00000000-0000-0000-0000-000000000081",
"license_number": "CDPH-00000130",
"name": "Place 595"
},
"order_datetime": "2020-01-01T00:00:00.000000Z",
"owner": null,
"payments": [],
"purchase_number": "PO-0000001",
"status": "PENDING",
"total": "6.00",
"updated_datetime": "2026-08-14T11:21:04.861025Z"
}
}
POST /public/v1/purchases creates a purchase (with package-tracked item)
POST /public/v1/purchases
content-type: application/json
accept: application/json
authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJhdWQiOiJEaXN0cnUiLCJleHAiOjE4MTgxNTYwNjEsImlhdCI6MTc4NjcwNjQ2MSwiaXNzIjoiRGlzdHJ1IiwianRpIjoiMGNmNjU5YzAtZWY1Ny00Y2FlLWIzMWMtNmNmOTdlNmJmNmMyIiwibW9iaWxlIjpmYWxzZSwibmJmIjoxNzg2NzA2NDYwLCJwbGF0Zm9ybSI6IkFQSSIsInN1YiI6IlVzZXI6MTk0OSIsInR5cCI6ImFjY2VzcyJ9.SzPG0anBCQq2K5vyGID_dIqzayfgJuFEWKYbY3Uc76E
{
"billing_location_id": "00000000-0000-0000-0000-0000000001ac",
"charges": [
{
"name": "C1",
"percent": "10.0000",
"type": "CHARGE",
"unit_type": "PERCENT"
},
{
"name": "C2",
"price": "-5.0000",
"type": "DISCOUNT",
"unit_type": "PRICE"
}
],
"company_id": "00000000-0000-0000-0000-000000000307",
"due_datetime": "2020-01-30T00:00:00.000000Z",
"items": [
{
"location_id": "00000000-0000-0000-0000-0000000001ac",
"price": "10.000000000",
"product_id": "de9d4eeb-087a-4fdd-86ce-daf57fdaa4d7",
"quantity": "1.000000000"
}
],
"location_id": "00000000-0000-0000-0000-0000000001ac",
"order_datetime": "2020-01-01T00:00:00.000000Z"
}
Response
200
content-type: application/json; charset=utf-8
cache-control: max-age=0, private, must-revalidate
b3: 6143058e746dad5e35cf61209371c219-4c82bc754223bf76-0
{
"data": {
"billing_location": {
"address": "123 Fake Street, Beverly Hills, CA 90210, US",
"company_id": "00000000-0000-0000-0000-00000000059a",
"id": "00000000-0000-0000-0000-0000000001ac",
"license_id": "00000000-0000-0000-0000-000000000052",
"license_number": "CDPH-00000083",
"name": "Place 426"
},
"charges": [
{
"id": "c5bf7530-e39b-4724-802c-5378a2ecbb8c",
"name": "C1",
"percent": "10.0000",
"price": "1.00",
"type": "CHARGE",
"unit_type": "PERCENT"
},
{
"id": "8757ca95-4c10-414a-8937-d4ad72dc564f",
"name": "C2",
"percent": null,
"price": "-5.00",
"type": "DISCOUNT",
"unit_type": "PRICE"
}
],
"company": {
"id": "00000000-0000-0000-0000-000000000307",
"name": "Company 1434",
"updated_datetime": "2026-08-14T11:21:01.516692Z"
},
"custom_data": [],
"description": null,
"due_datetime": "2020-01-30T00:00:00.000000Z",
"id": "00000000-0000-0000-0000-000000000029",
"inserted_datetime": "2026-08-14T11:21:01.562375Z",
"items": [
{
"batch": {
"batch_number": null,
"id": "00000000-0000-0000-0000-0000000001c0",
"name": "B1"
},
"compliance_quantity": null,
"id": "11679a9c-7486-44fa-a804-22eaa93b20f6",
"is_sample": false,
"location": {
"address": "123 Fake Street, Beverly Hills, CA 90210, US",
"company_id": "00000000-0000-0000-0000-00000000059a",
"id": "00000000-0000-0000-0000-0000000001ac",
"license_id": "00000000-0000-0000-0000-000000000052",
"name": "Place 426"
},
"package": null,
"price": "10.000000000",
"price_base": "10.000000000",
"product": {
"id": "de9d4eeb-087a-4fdd-86ce-daf57fdaa4d7",
"name": "P1",
"sku": "SKU1",
"updated_datetime": "2026-08-14T11:21:01.545118Z"
},
"quantity": "1.000000000",
"received_quantity": "0.000000000"
}
],
"location": {
"address": "123 Fake Street, Beverly Hills, CA 90210, US",
"company_id": "00000000-0000-0000-0000-00000000059a",
"id": "00000000-0000-0000-0000-0000000001ac",
"license_id": "00000000-0000-0000-0000-000000000052",
"license_number": "CDPH-00000083",
"name": "Place 426"
},
"order_datetime": "2020-01-01T00:00:00.000000Z",
"owner": null,
"payments": [],
"purchase_number": "PO-0000001",
"status": "PENDING",
"total": "6.00",
"updated_datetime": "2026-08-14T11:21:01.585076Z"
}
}
POST /public/v1/purchases updates a purchase
POST /public/v1/purchases
content-type: application/json
accept: application/json
authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJhdWQiOiJEaXN0cnUiLCJleHAiOjE4MTgxNTYwNjEsImlhdCI6MTc4NjcwNjQ2MSwiaXNzIjoiRGlzdHJ1IiwianRpIjoiMGFhODczZjctZGU3OC00MDExLWFkYTgtYmE5MDk3ZGM5NWM4IiwibW9iaWxlIjpmYWxzZSwibmJmIjoxNzg2NzA2NDYwLCJwbGF0Zm9ybSI6IkFQSSIsInN1YiI6IlVzZXI6MjAwNyIsInR5cCI6ImFjY2VzcyJ9.xpLDlGMiHlLzprxnNp5dTG0KtMMWRQp7Yj5_eHeNrmE
{
"billing_location_id": "00000000-0000-0000-0000-0000000001b2",
"charges": [
{
"name": "C1",
"percent": "10.0000",
"type": "CHARGE",
"unit_type": "PERCENT"
}
],
"company_id": "00000000-0000-0000-0000-00000000032a",
"due_datetime": "2020-01-20T00:00:00.000000Z",
"items": [
{
"location_id": "00000000-0000-0000-0000-0000000001b2",
"price": "10.000000000",
"product_id": "c7ac03fe-2c98-429b-9e90-b53e13c24864",
"quantity": "1.000000000"
}
],
"location_id": "00000000-0000-0000-0000-0000000001b2",
"order_datetime": "2020-01-02T00:00:00.000000Z"
}
Response
200
content-type: application/json; charset=utf-8
cache-control: max-age=0, private, must-revalidate
b3: 2d681b1c49e36bd869871298a2ba06aa-e9263dda4472071f-0
{
"data": {
"billing_location": {
"address": "123 Fake Street, Beverly Hills, CA 90210, US",
"company_id": "00000000-0000-0000-0000-0000000005be",
"id": "00000000-0000-0000-0000-0000000001b2",
"license_id": "00000000-0000-0000-0000-000000000055",
"license_number": "CDPH-00000086",
"name": "Place 432"
},
"charges": [
{
"id": "3bc42c6d-773e-4056-a4bc-b7b0e72064e9",
"name": "C1",
"percent": "10.0000",
"price": "1.00",
"type": "CHARGE",
"unit_type": "PERCENT"
}
],
"company": {
"id": "00000000-0000-0000-0000-00000000032a",
"name": "Company 1471",
"updated_datetime": "2026-08-14T11:21:01.714040Z"
},
"custom_data": [],
"description": null,
"due_datetime": "2020-01-20T00:00:00.000000Z",
"id": "00000000-0000-0000-0000-00000000002a",
"inserted_datetime": "2026-08-14T11:21:01.803765Z",
"items": [
{
"batch": {
"batch_number": null,
"id": "00000000-0000-0000-0000-0000000001d8",
"name": "B1"
},
"compliance_quantity": null,
"id": "2a6cf2b4-da35-4a18-baad-cc2bfff4107d",
"is_sample": false,
"location": {
"address": "123 Fake Street, Beverly Hills, CA 90210, US",
"company_id": "00000000-0000-0000-0000-0000000005be",
"id": "00000000-0000-0000-0000-0000000001b2",
"license_id": "00000000-0000-0000-0000-000000000055",
"name": "Place 432"
},
"package": null,
"price": "10.000000000",
"price_base": "10.000000000",
"product": {
"id": "c7ac03fe-2c98-429b-9e90-b53e13c24864",
"name": "P1",
"sku": "SKU1",
"updated_datetime": "2026-08-14T11:21:01.766066Z"
},
"quantity": "1.000000000",
"received_quantity": "0.000000000"
}
],
"location": {
"address": "123 Fake Street, Beverly Hills, CA 90210, US",
"company_id": "00000000-0000-0000-0000-0000000005be",
"id": "00000000-0000-0000-0000-0000000001b2",
"license_id": "00000000-0000-0000-0000-000000000055",
"license_number": "CDPH-00000086",
"name": "Place 432"
},
"order_datetime": "2020-01-02T00:00:00.000000Z",
"owner": null,
"payments": [],
"purchase_number": "PO-0000001",
"status": "PENDING",
"total": "11.00",
"updated_datetime": "2026-08-14T11:21:01.813739Z"
}
}
POST /public/v1/purchases updates a purchase
POST /public/v1/purchases
content-type: application/json
accept: application/json
authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJhdWQiOiJEaXN0cnUiLCJleHAiOjE4MTgxNTYwNjEsImlhdCI6MTc4NjcwNjQ2MSwiaXNzIjoiRGlzdHJ1IiwianRpIjoiMGFhODczZjctZGU3OC00MDExLWFkYTgtYmE5MDk3ZGM5NWM4IiwibW9iaWxlIjpmYWxzZSwibmJmIjoxNzg2NzA2NDYwLCJwbGF0Zm9ybSI6IkFQSSIsInN1YiI6IlVzZXI6MjAwNyIsInR5cCI6ImFjY2VzcyJ9.xpLDlGMiHlLzprxnNp5dTG0KtMMWRQp7Yj5_eHeNrmE
{
"billing_location_id": "00000000-0000-0000-0000-0000000001b2",
"charges": [
{
"id": "3bc42c6d-773e-4056-a4bc-b7b0e72064e9",
"name": "C1",
"percent": "10.0000",
"type": "CHARGE",
"unit_type": "PERCENT"
},
{
"name": "C2",
"percent": null,
"price": "-5.00",
"type": "DISCOUNT",
"unit_type": "PRICE"
}
],
"company_id": "00000000-0000-0000-0000-00000000032a",
"due_datetime": "2020-01-30T00:00:00.000000Z",
"id": "00000000-0000-0000-0000-00000000002a",
"items": [
{
"id": "2a6cf2b4-da35-4a18-baad-cc2bfff4107d",
"location_id": "00000000-0000-0000-0000-0000000001b2",
"price": "10.000000000",
"product_id": "c7ac03fe-2c98-429b-9e90-b53e13c24864",
"quantity": "1.000000000"
},
{
"batch_id": "00000000-0000-0000-0000-0000000001da",
"location_id": "00000000-0000-0000-0000-0000000001b2",
"price": "5.000000000",
"product_id": "919c601e-d988-4412-b9a5-17b8f74e21b8",
"quantity": "2.000000000"
}
],
"location_id": "00000000-0000-0000-0000-0000000001b2",
"order_datetime": "2020-01-01T00:00:00.000000Z"
}
Response
200
content-type: application/json; charset=utf-8
cache-control: max-age=0, private, must-revalidate
b3: 2d681b1c49e36bd869871298a2ba06aa-f4610016fe04c8be-0
{
"data": {
"billing_location": {
"address": "123 Fake Street, Beverly Hills, CA 90210, US",
"company_id": "00000000-0000-0000-0000-0000000005be",
"id": "00000000-0000-0000-0000-0000000001b2",
"license_id": "00000000-0000-0000-0000-000000000055",
"license_number": "CDPH-00000086",
"name": "Place 432"
},
"charges": [
{
"id": "3bc42c6d-773e-4056-a4bc-b7b0e72064e9",
"name": "C1",
"percent": "10.0000",
"price": "2.00",
"type": "CHARGE",
"unit_type": "PERCENT"
},
{
"id": "dbff6e25-2087-4443-9273-a801408c78c1",
"name": "C2",
"percent": null,
"price": "-5.00",
"type": "DISCOUNT",
"unit_type": "PRICE"
}
],
"company": {
"id": "00000000-0000-0000-0000-00000000032a",
"name": "Company 1471",
"updated_datetime": "2026-08-14T11:21:01.714040Z"
},
"custom_data": [],
"description": null,
"due_datetime": "2020-01-30T00:00:00.000000Z",
"id": "00000000-0000-0000-0000-00000000002a",
"inserted_datetime": "2026-08-14T11:21:01.803765Z",
"items": [
{
"batch": {
"batch_number": null,
"id": "00000000-0000-0000-0000-0000000001d8",
"name": "B1"
},
"compliance_quantity": null,
"id": "2a6cf2b4-da35-4a18-baad-cc2bfff4107d",
"is_sample": false,
"location": {
"address": "123 Fake Street, Beverly Hills, CA 90210, US",
"company_id": "00000000-0000-0000-0000-0000000005be",
"id": "00000000-0000-0000-0000-0000000001b2",
"license_id": "00000000-0000-0000-0000-000000000055",
"name": "Place 432"
},
"package": null,
"price": "10.000000000",
"price_base": "10.000000000",
"product": {
"id": "c7ac03fe-2c98-429b-9e90-b53e13c24864",
"name": "P1",
"sku": "SKU1",
"updated_datetime": "2026-08-14T11:21:01.766066Z"
},
"quantity": "1.000000000",
"received_quantity": "0.000000000"
},
{
"batch": {
"batch_number": null,
"id": "00000000-0000-0000-0000-0000000001da",
"name": "B2"
},
"compliance_quantity": null,
"id": "434d8fbe-8b53-46f5-bfbf-7c471890a60c",
"is_sample": false,
"location": {
"address": "123 Fake Street, Beverly Hills, CA 90210, US",
"company_id": "00000000-0000-0000-0000-0000000005be",
"id": "00000000-0000-0000-0000-0000000001b2",
"license_id": "00000000-0000-0000-0000-000000000055",
"name": "Place 432"
},
"package": null,
"price": "5.000000000",
"price_base": "5.000000000",
"product": {
"id": "919c601e-d988-4412-b9a5-17b8f74e21b8",
"name": "P2",
"sku": "SKU2",
"updated_datetime": "2026-08-14T11:21:01.783777Z"
},
"quantity": "2.000000000",
"received_quantity": "0.000000000"
}
],
"location": {
"address": "123 Fake Street, Beverly Hills, CA 90210, US",
"company_id": "00000000-0000-0000-0000-0000000005be",
"id": "00000000-0000-0000-0000-0000000001b2",
"license_id": "00000000-0000-0000-0000-000000000055",
"license_number": "CDPH-00000086",
"name": "Place 432"
},
"order_datetime": "2020-01-01T00:00:00.000000Z",
"owner": null,
"payments": [],
"purchase_number": "PO-0000001",
"status": "PENDING",
"total": "17.00",
"updated_datetime": "2026-08-14T11:21:01.907458Z"
}
}
POST /public/v1/purchases updating a purchase removes line items that aren't included in the payload
POST /public/v1/purchases
content-type: application/json
accept: application/json
authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJhdWQiOiJEaXN0cnUiLCJleHAiOjE4MTgxNTYwNjQsImlhdCI6MTc4NjcwNjQ2NCwiaXNzIjoiRGlzdHJ1IiwianRpIjoiYjQ0Y2NmNzItYjMyMy00ZjEwLThjYTctZGJhMDMwODk3ZGYxIiwibW9iaWxlIjpmYWxzZSwibmJmIjoxNzg2NzA2NDYzLCJwbGF0Zm9ybSI6IkFQSSIsInN1YiI6IlVzZXI6MjQ2OCIsInR5cCI6ImFjY2VzcyJ9.xuRHFCRHNqmMNz9TCJodyDVi7pFhkJgE7R4rKzgZMYk
{
"billing_location_id": "00000000-0000-0000-0000-00000000022e",
"company_id": "00000000-0000-0000-0000-00000000042d",
"due_datetime": "2020-01-20T00:00:00.000000Z",
"items": [
{
"location_id": "00000000-0000-0000-0000-00000000022e",
"price": "10",
"product_id": "8534e221-0c23-4a5b-a2ee-7ba7b8e3a36f",
"quantity": "1"
}
],
"location_id": "00000000-0000-0000-0000-00000000022e",
"order_datetime": "2020-01-02T00:00:00.000000Z"
}
Response
200
content-type: application/json; charset=utf-8
cache-control: max-age=0, private, must-revalidate
b3: c7acb0aeebcf83e4aad113097f7d5962-d808d2fe208f2bbf-0
{
"data": {
"billing_location": {
"address": "123 Fake Street, Beverly Hills, CA 90210, US",
"company_id": "00000000-0000-0000-0000-000000000711",
"id": "00000000-0000-0000-0000-00000000022e",
"license_id": "00000000-0000-0000-0000-000000000072",
"license_number": "CDPH-00000115",
"name": "Place 556"
},
"charges": [],
"company": {
"id": "00000000-0000-0000-0000-00000000042d",
"name": "Company 1810",
"updated_datetime": "2026-08-14T11:21:04.330864Z"
},
"custom_data": [],
"description": null,
"due_datetime": "2020-01-20T00:00:00.000000Z",
"id": "00000000-0000-0000-0000-000000000048",
"inserted_datetime": "2026-08-14T11:21:04.383577Z",
"items": [
{
"batch": {
"batch_number": null,
"id": "00000000-0000-0000-0000-000000000293",
"name": "B2038"
},
"compliance_quantity": null,
"id": "a6edb926-ba31-477a-b391-f52530a5f7f9",
"is_sample": false,
"location": {
"address": "123 Fake Street, Beverly Hills, CA 90210, US",
"company_id": "00000000-0000-0000-0000-000000000711",
"id": "00000000-0000-0000-0000-00000000022e",
"license_id": "00000000-0000-0000-0000-000000000072",
"name": "Place 556"
},
"package": null,
"price": "10.000000000",
"price_base": "10.000000000",
"product": {
"id": "8534e221-0c23-4a5b-a2ee-7ba7b8e3a36f",
"name": "Product 2035",
"sku": "sku 2036",
"updated_datetime": "2026-08-14T11:21:04.362806Z"
},
"quantity": "1.000000000",
"received_quantity": "0.000000000"
}
],
"location": {
"address": "123 Fake Street, Beverly Hills, CA 90210, US",
"company_id": "00000000-0000-0000-0000-000000000711",
"id": "00000000-0000-0000-0000-00000000022e",
"license_id": "00000000-0000-0000-0000-000000000072",
"license_number": "CDPH-00000115",
"name": "Place 556"
},
"order_datetime": "2020-01-02T00:00:00.000000Z",
"owner": null,
"payments": [],
"purchase_number": "PO-0000001",
"status": "PENDING",
"total": "10.00",
"updated_datetime": "2026-08-14T11:21:04.383577Z"
}
}
POST /public/v1/purchases updating a purchase removes line items that aren't included in the payload
POST /public/v1/purchases
content-type: application/json
accept: application/json
authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJhdWQiOiJEaXN0cnUiLCJleHAiOjE4MTgxNTYwNjQsImlhdCI6MTc4NjcwNjQ2NCwiaXNzIjoiRGlzdHJ1IiwianRpIjoiYjQ0Y2NmNzItYjMyMy00ZjEwLThjYTctZGJhMDMwODk3ZGYxIiwibW9iaWxlIjpmYWxzZSwibmJmIjoxNzg2NzA2NDYzLCJwbGF0Zm9ybSI6IkFQSSIsInN1YiI6IlVzZXI6MjQ2OCIsInR5cCI6ImFjY2VzcyJ9.xuRHFCRHNqmMNz9TCJodyDVi7pFhkJgE7R4rKzgZMYk
{
"company_id": "00000000-0000-0000-0000-00000000042d",
"id": "00000000-0000-0000-0000-000000000048",
"items": [
{
"location_id": "00000000-0000-0000-0000-00000000022e",
"price": "2",
"product_id": "8534e221-0c23-4a5b-a2ee-7ba7b8e3a36f",
"quantity": "1"
}
]
}
Response
200
content-type: application/json; charset=utf-8
cache-control: max-age=0, private, must-revalidate
b3: c7acb0aeebcf83e4aad113097f7d5962-af6a5158309ae940-0
{
"data": {
"billing_location": {
"address": "123 Fake Street, Beverly Hills, CA 90210, US",
"company_id": "00000000-0000-0000-0000-000000000711",
"id": "00000000-0000-0000-0000-00000000022e",
"license_id": "00000000-0000-0000-0000-000000000072",
"license_number": "CDPH-00000115",
"name": "Place 556"
},
"charges": [],
"company": {
"id": "00000000-0000-0000-0000-00000000042d",
"name": "Company 1810",
"updated_datetime": "2026-08-14T11:21:04.330864Z"
},
"custom_data": [],
"description": null,
"due_datetime": "2020-01-20T00:00:00.000000Z",
"id": "00000000-0000-0000-0000-000000000048",
"inserted_datetime": "2026-08-14T11:21:04.383577Z",
"items": [
{
"batch": {
"batch_number": null,
"id": "00000000-0000-0000-0000-000000000293",
"name": "B2038"
},
"compliance_quantity": null,
"id": "07e3609a-f6b3-4bc6-9a0a-15166dcee6d7",
"is_sample": false,
"location": {
"address": "123 Fake Street, Beverly Hills, CA 90210, US",
"company_id": "00000000-0000-0000-0000-000000000711",
"id": "00000000-0000-0000-0000-00000000022e",
"license_id": "00000000-0000-0000-0000-000000000072",
"name": "Place 556"
},
"package": null,
"price": "2.000000000",
"price_base": "2.000000000",
"product": {
"id": "8534e221-0c23-4a5b-a2ee-7ba7b8e3a36f",
"name": "Product 2035",
"sku": "sku 2036",
"updated_datetime": "2026-08-14T11:21:04.362806Z"
},
"quantity": "1.000000000",
"received_quantity": "0.000000000"
}
],
"location": {
"address": "123 Fake Street, Beverly Hills, CA 90210, US",
"company_id": "00000000-0000-0000-0000-000000000711",
"id": "00000000-0000-0000-0000-00000000022e",
"license_id": "00000000-0000-0000-0000-000000000072",
"license_number": "CDPH-00000115",
"name": "Place 556"
},
"order_datetime": "2020-01-02T00:00:00.000000Z",
"owner": null,
"payments": [],
"purchase_number": "PO-0000001",
"status": "PENDING",
"total": "2.00",
"updated_datetime": "2026-08-14T11:21:04.474802Z"
}
}
POST /public/v1/purchases does not update a purchase that has moved beyond Pending status
POST /public/v1/purchases
content-type: application/json
accept: application/json
authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJhdWQiOiJEaXN0cnUiLCJleHAiOjE4MTgxNTYwNjMsImlhdCI6MTc4NjcwNjQ2MywiaXNzIjoiRGlzdHJ1IiwianRpIjoiOTNjMzYyNTMtZjc0Ny00OGE1LWIwZDgtZmVmN2ViMjQyODViIiwibW9iaWxlIjpmYWxzZSwibmJmIjoxNzg2NzA2NDYyLCJwbGF0Zm9ybSI6IkFQSSIsInN1YiI6IlVzZXI6MjI2OSIsInR5cCI6ImFjY2VzcyJ9.xL3zWLdztJFWvh66ZcgM-VsQJIErGbUNPLcSZG42R_c
{
"billing_location_id": "00000000-0000-0000-0000-0000000001f4",
"charges": [],
"company_id": "00000000-0000-0000-0000-0000000003a8",
"due_datetime": "2020-01-30T00:00:00.000000Z",
"id": "00000000-0000-0000-0000-000000000039",
"items": [
{
"batch_id": "00000000-0000-0000-0000-000000000220",
"id": "fa286ddc-4b78-496b-8d55-c5e8526460ea",
"location_id": "00000000-0000-0000-0000-0000000001f4",
"price": "10.000000000",
"product_id": "3da4fd8a-a924-4474-954f-0f049c4e5e17",
"quantity": "1.000000000"
}
],
"location_id": "00000000-0000-0000-0000-0000000001f4",
"order_datetime": "2020-01-01T00:00:00.000000Z"
}
Response
400
cache-control: max-age=0, private, must-revalidate
content-type: application/json; charset=utf-8
b3: de61fdf0291bcc7fc5385a6209b14dbf-9fe30afa66feb95c-0
{
"errors": [
{
"context": {},
"message": "Cannot change this PO through the Distru API because it's beyond Pending status",
"pointer": [
"status"
],
"section": "body"
}
]
}
POST /public/v1/purchases does not create a purchase with a company relationship that belongs to another company
POST /public/v1/purchases
content-type: application/json
accept: application/json
authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJhdWQiOiJEaXN0cnUiLCJleHAiOjE4MTgxNTYwNjMsImlhdCI6MTc4NjcwNjQ2MywiaXNzIjoiRGlzdHJ1IiwianRpIjoiYTY3N2M5ZDEtMmZhNC00OTdhLWE0YTEtOGE1ZWNlMGRlN2YzIiwibW9iaWxlIjpmYWxzZSwibmJmIjoxNzg2NzA2NDYyLCJwbGF0Zm9ybSI6IkFQSSIsInN1YiI6IlVzZXI6MjI2MSIsInR5cCI6ImFjY2VzcyJ9.E0JmZx6U9DB6WxqjsyoA02zj2QTHmqVPaOqjwJIl87M
{
"billing_location_id": "00000000-0000-0000-0000-0000000001f3",
"charges": [],
"company_id": "00000000-0000-0000-0000-0000000003a5",
"due_datetime": "2020-01-30T00:00:00.000000Z",
"items": [
{
"location_id": "00000000-0000-0000-0000-0000000001f3",
"price": "10.000000000",
"product_id": "6a6f50eb-704a-41d8-af0e-a64eaeac3f04",
"quantity": "1.000000000"
}
],
"location_id": "00000000-0000-0000-0000-0000000001f3",
"order_datetime": "2020-01-01T00:00:00.000000Z"
}
Response
400
cache-control: max-age=0, private, must-revalidate
content-type: application/json; charset=utf-8
b3: fce55c183957d56cf2493b6c0b1cdec8-43f8d871c049ad73-0
{
"errors": [
{
"context": {},
"message": "The provided supplier does not exist",
"pointer": [
"company_id"
],
"section": "body"
}
]
}
POST /public/v1/purchases does not create a purchase with a product that belongs to another company
POST /public/v1/purchases
content-type: application/json
accept: application/json
authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJhdWQiOiJEaXN0cnUiLCJleHAiOjE4MTgxNTYwNjQsImlhdCI6MTc4NjcwNjQ2NCwiaXNzIjoiRGlzdHJ1IiwianRpIjoiODBmYjY5MTAtYTQ5Ny00ZjUzLTllZTktMWJjMmEyZjMzMzJlIiwibW9iaWxlIjpmYWxzZSwibmJmIjoxNzg2NzA2NDYzLCJwbGF0Zm9ybSI6IkFQSSIsInN1YiI6IlVzZXI6MjU2MSIsInR5cCI6ImFjY2VzcyJ9.GDIj5wk7XIoL52OdcHN3rlpjSaGLBy2khr1O0gafkSo
{
"billing_location_id": "00000000-0000-0000-0000-000000000253",
"charges": [],
"company_id": "00000000-0000-0000-0000-000000000466",
"due_datetime": "2020-01-30T00:00:00.000000Z",
"items": [
{
"location_id": "00000000-0000-0000-0000-000000000253",
"price": "10.000000000",
"product_id": "10be6a39-921f-4d79-bbce-dfc442fb3302",
"quantity": "1.000000000"
}
],
"location_id": "00000000-0000-0000-0000-000000000253",
"order_datetime": "2020-01-01T00:00:00.000000Z"
}
Response
400
cache-control: max-age=0, private, must-revalidate
content-type: application/json; charset=utf-8
b3: 2196d485a8b369d2c219e390f7def639-56af8c3014a48d9c-0
{
"errors": [
{
"context": {
"id": "e3432cb2-cbe5-4b48-ad0d-703e63b296cd"
},
"message": "This record does not belong to your company.",
"pointer": [
"items",
0,
"product_id"
],
"section": "body"
}
]
}
POST /public/v1/purchases does not create a purchase with a batch that belongs to another company
POST /public/v1/purchases
content-type: application/json
accept: application/json
authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJhdWQiOiJEaXN0cnUiLCJleHAiOjE4MTgxNTYwNTgsImlhdCI6MTc4NjcwNjQ1OCwiaXNzIjoiRGlzdHJ1IiwianRpIjoiMjk2MmNlNmYtYjk3ZS00ZThkLTliMGYtNzMzNTIxN2E4Yjk2IiwibW9iaWxlIjpmYWxzZSwibmJmIjoxNzg2NzA2NDU3LCJwbGF0Zm9ybSI6IkFQSSIsInN1YiI6IlVzZXI6MTA0OSIsInR5cCI6ImFjY2VzcyJ9.ZpXte6buFAU-Q0wL4yeJcDnrZhW_cZq_Oyk6F-9e68I
{
"billing_location_id": "00000000-0000-0000-0000-000000000122",
"charges": [],
"company_id": "00000000-0000-0000-0000-00000000016c",
"due_datetime": "2020-01-30T00:00:00.000000Z",
"items": [
{
"batch_id": "00000000-0000-0000-0000-0000000000b4",
"location_id": "00000000-0000-0000-0000-000000000122",
"price": "10.000000000",
"quantity": "1.000000000"
}
],
"location_id": "00000000-0000-0000-0000-000000000122",
"order_datetime": "2020-01-01T00:00:00.000000Z"
}
Response
400
cache-control: max-age=0, private, must-revalidate
content-type: application/json; charset=utf-8
b3: c47ab66cd7a7b9885d8e1504b8527835-348b732ddbedbe10-0
{
"errors": [
{
"context": {
"id": "852b09e5-ef2f-4c07-94da-f832239e6ab9"
},
"message": "This record does not belong to your company.",
"pointer": [
"items",
0,
"product_id"
],
"section": "body"
}
]
}
POST /public/v1/purchases does not create a purchase with a location that belongs to another company
POST /public/v1/purchases
content-type: application/json
accept: application/json
authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJhdWQiOiJEaXN0cnUiLCJleHAiOjE4MTgxNTYwNjIsImlhdCI6MTc4NjcwNjQ2MiwiaXNzIjoiRGlzdHJ1IiwianRpIjoiNzU2OTBlMzktZTIxOC00NzgwLWE1YjYtOWIwNjZlNTg5ZjJjIiwibW9iaWxlIjpmYWxzZSwibmJmIjoxNzg2NzA2NDYxLCJwbGF0Zm9ybSI6IkFQSSIsInN1YiI6IlVzZXI6MjE1MCIsInR5cCI6ImFjY2VzcyJ9.uD5xWEwVMVr574Mk8xO4-rFXf9vgJxr2o7O5F0D71H0
{
"billing_location_id": "00000000-0000-0000-0000-0000000001c6",
"charges": [],
"company_id": "00000000-0000-0000-0000-000000000362",
"due_datetime": "2020-01-30T00:00:00.000000Z",
"items": [
{
"location_id": "00000000-0000-0000-0000-0000000001c7",
"price": "10.000000000",
"product_id": "b4a2c29d-7cc8-4963-a29e-6cd26079ecd9",
"quantity": "1.000000000"
}
],
"location_id": "00000000-0000-0000-0000-0000000001c7",
"order_datetime": "2020-01-01T00:00:00.000000Z"
}
Response
400
cache-control: max-age=0, private, must-revalidate
content-type: application/json; charset=utf-8
b3: 46fc2e13803013b10a87164a47aa5d2b-22fc564434db31f5-0
{
"errors": [
{
"context": {
"id": "e37bf9de-05d9-433b-a19b-6cf5b0efe2ba"
},
"message": "This record does not belong to your company.",
"pointer": [
"items",
0,
"location_id"
],
"section": "body"
}
]
}
POST /public/v1/purchases does not create a purchase with a location different from the order items
POST /public/v1/purchases
content-type: application/json
accept: application/json
authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJhdWQiOiJEaXN0cnUiLCJleHAiOjE4MTgxNTYwNjUsImlhdCI6MTc4NjcwNjQ2NSwiaXNzIjoiRGlzdHJ1IiwianRpIjoiNWUzYjNmYWMtNzc2NS00Y2Q3LTgzZTQtNjY3ODAzOWQyMWM5IiwibW9iaWxlIjpmYWxzZSwibmJmIjoxNzg2NzA2NDY0LCJwbGF0Zm9ybSI6IkFQSSIsInN1YiI6IlVzZXI6MjY0OCIsInR5cCI6ImFjY2VzcyJ9.8H21RPGwvI4lkRPmAdEgmd5iv-_k2LVj1C5NhIZZPHQ
{
"billing_location_id": "00000000-0000-0000-0000-000000000268",
"charges": [],
"company_id": "00000000-0000-0000-0000-00000000049a",
"due_datetime": "2020-01-30T00:00:00.000000Z",
"items": [
{
"location_id": "00000000-0000-0000-0000-000000000268",
"price": "10.000000000",
"product_id": "8a6612ed-9a17-4a02-b2a7-11215144a0f8",
"quantity": "1.000000000"
}
],
"location_id": "00000000-0000-0000-0000-000000000269",
"order_datetime": "2020-01-01T00:00:00.000000Z"
}
Response
400
cache-control: max-age=0, private, must-revalidate
content-type: application/json; charset=utf-8
b3: 82ff47590cdf46516c4bdf837e2eeb8f-27d0aadc3089378a-0
{
"errors": [
{
"context": {
"id": "29ab1287-96f8-46fa-bef8-38d2cc848531"
},
"message": "Purchase item delivery location must be the same as purchase delivery location.",
"pointer": [
"items",
0,
"location_id"
],
"section": "body"
}
]
}
POST /public/v1/purchases does not create a purchase with a billing location that belongs to another company
POST /public/v1/purchases
content-type: application/json
accept: application/json
authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJhdWQiOiJEaXN0cnUiLCJleHAiOjE4MTgxNTYwNTksImlhdCI6MTc4NjcwNjQ1OSwiaXNzIjoiRGlzdHJ1IiwianRpIjoiYmU4YmE3MDAtMWEyMy00OTljLTlmYTctMTZmM2I2MGU4M2YxIiwibW9iaWxlIjpmYWxzZSwibmJmIjoxNzg2NzA2NDU4LCJwbGF0Zm9ybSI6IkFQSSIsInN1YiI6IlVzZXI6MTE3MiIsInR5cCI6ImFjY2VzcyJ9.L4rtjYmf2Yk4iGOXr6iUmwUwHBnEF2DltFDsX-H7ZRs
{
"billing_location_id": "00000000-0000-0000-0000-000000000131",
"charges": [],
"company_id": "00000000-0000-0000-0000-0000000001a9",
"due_datetime": "2020-01-30T00:00:00.000000Z",
"items": [
{
"location_id": "00000000-0000-0000-0000-00000000012e",
"price": "10.000000000",
"product_id": "113c9c1f-3db3-45c8-a345-6825486d8908",
"quantity": "1.000000000"
}
],
"location_id": "00000000-0000-0000-0000-00000000012e",
"order_datetime": "2020-01-01T00:00:00.000000Z"
}
Response
400
cache-control: max-age=0, private, must-revalidate
content-type: application/json; charset=utf-8
b3: fe9283b11fc4043fe43bea7d633d92a4-c2e12b487977e78c-0
{
"errors": [
{
"context": {},
"message": "The provided billing address does not exist",
"pointer": [
"billing_location_id"
],
"section": "body"
}
]
}
Upsert a single purchase order. To update an existing purchase order, pass in an existing purchase order ID in the id field. When updating a purchase order, you must pass in all fields (no sparse update currently supported). Any existing order item or charge you do not pass in to items and charges respectively will be deleted. Required permission: purchases_permissions_create to create a new purchase order, purchases_permissions_edit (and access to the purchase under team restrictions) to update an existing purchase order.
Request
POST /public/v1/purchases
Parameters
| Parameter | Description | In | Type | Required | Default | Example |
|---|---|---|---|---|---|---|
| id | Unique ID for this purchase order. If it exists, an update will be performed; otherwise, it will be used as the ID of a new purchase order record | query | string | false | ||
| description | A description of the purchase order | query | string | false | ||
| location_id | The location into which the inventory in this purchase will be received | query | string | true | ||
| billing_location_id | The billing address for this purchase order | query | string | true | ||
| company_id | The company that is the supplier for this purchase order | query | string | true | ||
| order_datetime | The datetime on which the purchase order was placed | query | string | true | ||
| due_datetime | The datetime by which the purchase order should be paid | query | string | true | ||
| owner_id | The ID of the Distru user that owns this purchase order | query | string | false | ||
| charges | The additional lines of Charge, Discount, or Tax added to this purchase order | body | PurchaseChargesRequest | false | ||
| items | The items present on this purchase order | body | PurchaseItemsRequest | true | ||
| custom_data | A map of custom field IDs to their values. Use GET /public/v1/custom-fields?model_name=purchase to retrieve available custom fields and their IDs. | body | object | false | {"123":"Custom Value 1","456":"Custom Value 2"} |
Responses
| Status | Description | Schema |
|---|---|---|
| 200 | A single purchase orders | Purchase |
Reports
Get the Cost of Goods Sold report
GET /public/v1/reports/cogs returns one Final row per completed order line item as {data, meta}, narrowed by order date
GET /public/v1/reports/cogs?order_datetime=2026-06-01T00%3A00%3A00Z%2C2026-08-01T00%3A00%3A00Z
content-type: application/json
accept: application/json
authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJhdWQiOiJEaXN0cnUiLCJleHAiOjE4MTgxNTYwNTUsImlhdCI6MTc4NjcwNjQ1NSwiaXNzIjoiRGlzdHJ1IiwianRpIjoiYWU2NGUwY2ItYjQ2NS00N2VmLTg4YjctNjhiN2IwMDcyZjQzIiwibW9iaWxlIjpmYWxzZSwibmJmIjoxNzg2NzA2NDU0LCJwbGF0Zm9ybSI6IkFQSSIsInN1YiI6IlVzZXI6MTAwIiwidHlwIjoiYWNjZXNzIn0.r4C_x5K5sDlYT_TDI5zY9m0vkM-01OCOxkjJImmbPzc
Response
200
content-type: application/json; charset=utf-8
cache-control: max-age=0, private, must-revalidate
b3: a832442fe735ccda8986df3d0a2ef6b8-1fa94c554e2d73db-0
{
"data": [
{
"batch": "",
"cost_origin": "",
"final_input": "Final",
"margin_actual": "",
"margin_default": "",
"metrc_production_batch_number": "",
"order_number": "SO-1",
"package": "",
"product_brand": "",
"product_category": "Some category 19",
"product_name": "Alpha",
"profit_unit_actual": "",
"profit_unit_default": "",
"quantity": 4,
"sku": "SKU-A",
"total_cost_actual": "",
"total_cost_default": "",
"total_price": 40,
"total_profits_actual": "",
"total_profits_default": "",
"unit_cost_actual": "",
"unit_cost_default": "",
"unit_price": 10,
"unit_type": "Gram"
}
],
"meta": {
"columns": [
{
"key": "order_number",
"label": "Order Number"
},
{
"key": "final_input",
"label": "Final/Input"
},
{
"key": "cost_origin",
"label": "Cost Origin"
},
{
"key": "product_name",
"label": "Product Name"
},
{
"key": "sku",
"label": "SKU"
},
{
"key": "product_brand",
"label": "Product Brand"
},
{
"key": "product_category",
"label": "Product Category"
},
{
"key": "package",
"label": "Package"
},
{
"key": "metrc_production_batch_number",
"label": "Metrc Production Batch Number"
},
{
"key": "batch",
"label": "Batch"
},
{
"key": "quantity",
"label": "Quantity"
},
{
"key": "unit_type",
"label": "Unit Type"
},
{
"key": "unit_price",
"label": "Unit Price"
},
{
"key": "total_price",
"label": "Total Price"
},
{
"key": "unit_cost_actual",
"label": "Unit Cost (Actual)"
},
{
"key": "unit_cost_default",
"label": "Unit Cost (Default)"
},
{
"key": "total_cost_actual",
"label": "Total Cost (Actual)"
},
{
"key": "total_cost_default",
"label": "Total Cost (Default)"
},
{
"key": "total_profits_actual",
"label": "Total Profits (Actual)"
},
{
"key": "total_profits_default",
"label": "Total Profits (Default)"
},
{
"key": "profit_unit_actual",
"label": "Profit/Unit (Actual)"
},
{
"key": "profit_unit_default",
"label": "Profit/Unit (Default)"
},
{
"key": "margin_actual",
"label": "Margin (Actual)"
},
{
"key": "margin_default",
"label": "Margin (Default)"
}
],
"date_range": "Aug 14, 2026",
"report": "cogs"
}
}
Returns one row per completed sales order line item over the reported date range, with the product's descriptive attributes (name, SKU, brand, category), its package, batch, and Metrc production batch, plus the item's quantity, unit type, unit and total price, and both actual and default cost figures (unit cost, total cost, total profit, profit per unit, and margin). Only line items on Completed orders that have not been fully returned are included. When neither order_datetime nor delivery_datetime is provided, the report defaults to orders from the last 30 days (by order date) to avoid scanning your entire order history.
Every value is returned as it appears in the report's CSV export, with numeric cells parsed into numbers. Companies on the BioTrack compliance integration do not get the metrc_production_batch_number column. Report-level information (the resolved date and column definitions) is returned under meta.
Required permission: reports_permissions_cogs.
Request
GET /public/v1/reports/cogs
Parameters
| Parameter | Description | In | Type | Required | Default | Example |
|---|---|---|---|---|---|---|
| order_datetime | Filter by order date range (comma-separated ISO8601 range) | query | string | false | 2026-01-01T00:00:00Z,2026-02-01T00:00:00Z | |
| delivery_datetime | Filter by delivery date range (comma-separated ISO8601 range) | query | string | false | 2026-01-01T00:00:00Z,2026-02-01T00:00:00Z |
Responses
| Status | Description | Schema |
|---|---|---|
| 200 | The Cost of Goods Sold report | CogsReport |
Get the Cultivation Transaction History report
GET /public/v1/reports/cultivation-transaction-history returns one row per cultivation transaction as {data, meta}, filtered by strain and type
GET /public/v1/reports/cultivation-transaction-history?datetime=2000-01-01T00%3A00%3A00Z%2C2999-01-01T00%3A00%3A00Z
content-type: application/json
accept: application/json
authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJhdWQiOiJEaXN0cnUiLCJleHAiOjE4MTgxNTYwNTYsImlhdCI6MTc4NjcwNjQ1NiwiaXNzIjoiRGlzdHJ1IiwianRpIjoiZmRiODZjZDMtMTVkNC00Njg4LTkyNjUtMWE2YWYyMjA4N2Q4IiwibW9iaWxlIjpmYWxzZSwibmJmIjoxNzg2NzA2NDU1LCJwbGF0Zm9ybSI6IkFQSSIsInN1YiI6IlVzZXI6NDYxIiwidHlwIjoiYWNjZXNzIn0.dSjIbemKugnOMQyfqPygjIyhSDlRdue6PHkuoM1_v1U
Response
200
content-type: application/json; charset=utf-8
cache-control: max-age=0, private, must-revalidate
b3: 22abb35e318b46413f7bf3ad6663072b-24b6df903a0e750a-0
{
"data": [
{
"amount": 1,
"batch_name": "Plant Group 5571",
"date": "08/14/2026",
"description": null,
"package_label_s": null,
"plant_tag_s": null,
"product_name": null,
"related_entity": null,
"related_entity_status": null,
"strain": "Blue Dream",
"type": "Plant Batch Creation",
"unit": "Unit"
},
{
"amount": 1,
"batch_name": "Plant Group 4935",
"date": "08/14/2026",
"description": null,
"package_label_s": null,
"plant_tag_s": null,
"product_name": null,
"related_entity": null,
"related_entity_status": null,
"strain": "OG Kush",
"type": "Plant Batch Creation",
"unit": "Unit"
}
],
"meta": {
"columns": [
{
"key": "date",
"label": "Date"
},
{
"key": "strain",
"label": "Strain"
},
{
"key": "batch_name",
"label": "Batch Name"
},
{
"key": "plant_tag_s",
"label": "Plant Tag(s)"
},
{
"key": "product_name",
"label": "Product Name"
},
{
"key": "package_label_s",
"label": "Package Label(s)"
},
{
"key": "type",
"label": "Type"
},
{
"key": "related_entity",
"label": "Related Entity"
},
{
"key": "related_entity_status",
"label": "Related Entity Status"
},
{
"key": "amount",
"label": "Amount"
},
{
"key": "unit",
"label": "Unit"
},
{
"key": "description",
"label": "Description"
}
],
"date_range": "Dec 31, 1999 to Dec 31, 2998",
"report": "cultivation_transaction_history"
}
}
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. When no date filter is provided, the report defaults to the last 30 days.
Every value is returned as it appears in the report's CSV export, with numeric cells parsed into numbers. The total_cost column is omitted for users without permission to view costs. Report-level information (the resolved date range and column definitions) is returned under meta.
Required permission: reports_permissions_cultivation_transaction_history.
Request
GET /public/v1/reports/cultivation-transaction-history
Parameters
| Parameter | Description | In | Type | Required | Default | Example |
|---|---|---|---|---|---|---|
| datetime | Filter by transaction date range (comma-separated ISO8601 range) | query | string | false | 2026-01-01T00:00:00Z,2026-02-01T00:00:00Z | |
| transaction_type | Filter by a single transaction type | query | string | false | Move Plant(s) | |
| strain | Filter by an exact strain name | query | string | false | ||
| plant_batch_ids | Filter by plant batch (plant group) IDs | query | array | false | ||
| license_ids | Filter by license IDs | query | array | false |
Responses
| Status | Description | Schema |
|---|---|---|
| 200 | The Cultivation Transaction History report | CultivationTransactionHistoryReport |
Get the Harvest Outputs report
GET /public/v1/reports/harvest-outputs returns one row per assembly line item as {data, meta}, filtered by status
GET /public/v1/reports/harvest-outputs
content-type: application/json
accept: application/json
authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJhdWQiOiJEaXN0cnUiLCJleHAiOjE4MTgxNTYwNTUsImlhdCI6MTc4NjcwNjQ1NSwiaXNzIjoiRGlzdHJ1IiwianRpIjoiZTJlMGFjM2QtOTczZi00YTAyLTgxMzMtYzhkZTM4MzY4MTMxIiwibW9iaWxlIjpmYWxzZSwibmJmIjoxNzg2NzA2NDU0LCJwbGF0Zm9ybSI6IkFQSSIsInN1YiI6IlVzZXI6MTM0IiwidHlwIjoiYWNjZXNzIn0.bG5X3a0V29y2TpwANzw3zVRIHPTaCXjg3_tUCJknaak
Response
200
content-type: application/json; charset=utf-8
cache-control: max-age=0, private, must-revalidate
b3: 56a6e16cf9a8b0e9de7c73bad827a345-5fd4fb034802a805-0
{
"data": [
{
"cost_input_output": "Output",
"distru_product": "Product 206",
"harvest_assembly_date": "08/14/2026",
"harvest_assembly_number": "HAS-0000001",
"harvest_name": "Spring-Hill-Kush-#0-08/14/2026",
"line_item_id": "1299aeae-3143-41e9-81d0-f52137e59c1a",
"location": "Place 171",
"output_batch_number": null,
"output_package_number": "1A4010200001234000000000",
"output_reference_id": null,
"product_category": "Some category 98",
"quantity": 10,
"status": "PENDING",
"strain": "Spring Hill Kush #0",
"unit_type": "Gram"
},
{
"cost_input_output": "Input",
"distru_product": "Spring-Hill-Kush-#0-08/14/2026",
"harvest_assembly_date": "08/14/2026",
"harvest_assembly_number": "HAS-0000001",
"harvest_name": "Spring-Hill-Kush-#0-08/14/2026",
"line_item_id": "5ed1914f-d42f-4b84-9b0c-bfd4fcb4de73",
"location": "Place 118",
"output_batch_number": null,
"output_package_number": null,
"output_reference_id": null,
"product_category": null,
"quantity": 10,
"status": "PENDING",
"strain": "Spring Hill Kush #0",
"unit_type": "Gram"
}
],
"meta": {
"columns": [
{
"key": "harvest_assembly_date",
"label": "Harvest Assembly Date"
},
{
"key": "harvest_assembly_number",
"label": "Harvest Assembly Number"
},
{
"key": "status",
"label": "Status"
},
{
"key": "harvest_name",
"label": "Harvest Name"
},
{
"key": "output_batch_number",
"label": "Output Batch Number"
},
{
"key": "output_package_number",
"label": "Output Package Number"
},
{
"key": "strain",
"label": "Strain"
},
{
"key": "location",
"label": "Location"
},
{
"key": "cost_input_output",
"label": "Cost/Input/Output"
},
{
"key": "distru_product",
"label": "Distru Product"
},
{
"key": "product_category",
"label": "Product Category"
},
{
"key": "quantity",
"label": "Quantity"
},
{
"key": "unit_type",
"label": "Unit Type"
},
{
"key": "line_item_id",
"label": "Line Item ID"
},
{
"key": "output_reference_id",
"label": "Output Reference ID"
}
],
"date_range": "Aug 7, 2026 to Aug 14, 2026",
"report": "harvest_outputs"
}
}
Returns one row per line item of every harvest assembly over the reported date range. Each assembly expands into its inputs (the harvested material consumed), its outputs (the products produced, with their batch and package numbers), and its cost line items — the cost_input_output column identifies which. Every row carries the assembly's date, number, and status, plus the harvest name, strain, location, product, product category, quantity, and unit type. When no date filter is provided, the report defaults to the last 7 days.
Every value is returned as it appears in the report's CSV export, with numeric cells parsed into numbers. The cost columns (unit_cost_actual, unit_cost_default, total_cost_actual, total_cost_default, cost_type, cost_type_description) are omitted for users without permission to view costs. Report-level information (the resolved date range and column definitions) is returned under meta.
Required permission: reports_permissions_harvest_outputs.
Request
GET /public/v1/reports/harvest-outputs
Parameters
| Parameter | Description | In | Type | Required | Default | Example |
|---|---|---|---|---|---|---|
| datetime | Filter by harvest harvest assembly date range (comma-separated ISO8601 range) | query | string | false | 2026-01-01T00:00:00Z,2026-02-01T00:00:00Z | |
| status | Filter by harvest assembly status | query | string | false | COMPLETED | |
| harvest_name | Filter by harvest name (partial match) | query | string | false | ||
| strain | Filter by strain (partial match) | query | string | false | ||
| location_id | Filter by a single input location ID | query | string | false | ||
| output_product_name | Filter by output product name (partial match) | query | string | false | ||
| output_product_category_id | Filter by a single output product category ID | query | string | false |
Responses
| Status | Description | Schema |
|---|---|---|
| 200 | The Harvest Outputs report | HarvestOutputsReport |
Get the Inventory Assets report
GET /public/v1/reports/inventory-assets returns one row per on-hand asset as {data, meta}, filtered by location
GET /public/v1/reports/inventory-assets
content-type: application/json
accept: application/json
authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJhdWQiOiJEaXN0cnUiLCJleHAiOjE4MTgxNTYwNTYsImlhdCI6MTc4NjcwNjQ1NiwiaXNzIjoiRGlzdHJ1IiwianRpIjoiZjA2OTNmMWQtYWM1MC00NjIzLWFkNTgtZjAxYzgwNTEwYTQ4IiwibW9iaWxlIjpmYWxzZSwibmJmIjoxNzg2NzA2NDU1LCJwbGF0Zm9ybSI6IkFQSSIsInN1YiI6IlVzZXI6Mjg1IiwidHlwIjoiYWNjZXNzIn0.LGeu3FwgOtw6WrFmp4OQaQUMwVUVJYTJZDwFEcZtPQo
Response
200
content-type: application/json; charset=utf-8
cache-control: max-age=0, private, must-revalidate
b3: c67c1ed80d41689696d067b405d11c92-87b2f20f3ea12ea6-0
{
"data": [
{
"active_quantity": 100,
"assembling_quantity": 0,
"batch_number": "B1",
"category": "Some category 56",
"expiration_date": null,
"harvest_date": null,
"license": null,
"location": "L1",
"owner": "FirstName580 LastName581",
"package_number": null,
"product": "Widget",
"selling_quantity": 0,
"sku": "sku 123",
"subcategory": "Some subcategory 49",
"tracking_method": "BATCH",
"unit_price": 1.0,
"unit_type": "Gram",
"vendor": "Company 255"
},
{
"active_quantity": 50,
"assembling_quantity": 0,
"batch_number": "B1",
"category": "Some category 56",
"expiration_date": null,
"harvest_date": null,
"license": null,
"location": "L2",
"owner": "FirstName580 LastName581",
"package_number": null,
"product": "Widget",
"selling_quantity": 0,
"sku": "sku 123",
"subcategory": "Some subcategory 49",
"tracking_method": "BATCH",
"unit_price": 1.0,
"unit_type": "Gram",
"vendor": "Company 255"
}
],
"meta": {
"columns": [
{
"key": "product",
"label": "Product"
},
{
"key": "license",
"label": "License"
},
{
"key": "location",
"label": "Location"
},
{
"key": "package_number",
"label": "Package Number"
},
{
"key": "batch_number",
"label": "Batch Number"
},
{
"key": "sku",
"label": "SKU"
},
{
"key": "vendor",
"label": "Vendor"
},
{
"key": "owner",
"label": "Owner"
},
{
"key": "unit_type",
"label": "Unit Type"
},
{
"key": "active_quantity",
"label": "Active Quantity"
},
{
"key": "assembling_quantity",
"label": "Assembling Quantity"
},
{
"key": "selling_quantity",
"label": "Selling Quantity"
},
{
"key": "category",
"label": "Category"
},
{
"key": "subcategory",
"label": "Subcategory"
},
{
"key": "unit_price",
"label": "Unit Price"
},
{
"key": "expiration_date",
"label": "Expiration Date"
},
{
"key": "tracking_method",
"label": "Tracking Method"
},
{
"key": "harvest_date",
"label": "Harvest Date"
}
],
"date_range": "Aug 14, 2026 - 4:20AM",
"report": "inventory_assets"
}
}
Returns one row per on-hand inventory asset (a product at a location, batch, or package) with its descriptive attributes (product, SKU, vendor, owner, unit type, category, subcategory, license, location, package number, batch number), its active, assembling, and selling quantities, its unit price, and its actual and default unit and total costs. Quantities and costs are point-in-time: pass datetime to snapshot the position at a past moment (defaults to now).
Pass style=granular to expand each asset into its underlying cost inputs — this adds the final_input, cost_origin, and cost_quantity columns and requires permission to view cost details. Cost columns are omitted for users without permission to view costs.
Every value is returned as it appears in the report's CSV export, with numeric cells parsed into numbers. Report-level information (the resolved date and column definitions) is returned under meta.
Required permission: reports_permissions_inventory_assets.
Request
GET /public/v1/reports/inventory-assets
Parameters
| Parameter | Description | In | Type | Required | Default | Example |
|---|---|---|---|---|---|---|
| style | Row granularity (defaults to collapsed) |
query | string | false | granular | |
| location_id | Filter by a single location ID | query | string | false | ||
| datetime | Point-in-time snapshot as an ISO8601 datetime (defaults to now) | query | string | false | 2026-07-01T00:00:00Z |
Responses
| Status | Description | Schema |
|---|---|---|
| 200 | The Inventory Assets report | InventoryAssetsReport |
Get the Inventory Transaction History report
GET /public/v1/reports/inventory-transaction-history returns one row per inventory transaction as {data, meta}, honoring the date filter
GET /public/v1/reports/inventory-transaction-history
content-type: application/json
accept: application/json
authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJhdWQiOiJEaXN0cnUiLCJleHAiOjE4MTgxNTYwNTYsImlhdCI6MTc4NjcwNjQ1NiwiaXNzIjoiRGlzdHJ1IiwianRpIjoiYWFiNGEzN2MtOWE5ZS00ZWUzLTk0OGEtZmNiMDFiNzc3MGRiIiwibW9iaWxlIjpmYWxzZSwibmJmIjoxNzg2NzA2NDU1LCJwbGF0Zm9ybSI6IkFQSSIsInN1YiI6IlVzZXI6MjQxIiwidHlwIjoiYWNjZXNzIn0.YsiD2vbpot-lv5IDjgwSEr6Ib-GGU6-YFhuzhuJUPJE
Response
200
content-type: application/json; charset=utf-8
cache-control: max-age=0, private, must-revalidate
b3: 2b802610d54a1aa09cf80291919972fc-23113b5e4c0d5646-0
{
"data": [
{
"amount": 100,
"batch_id": "00000000-0000-0000-0000-00000000001c",
"batch_number": null,
"cbd": null,
"cbd_mg_g": null,
"cbd_mg_ml": null,
"company_relationship_id": null,
"date": "2026-08-14T11:20:56.355280Z",
"description": "FirstName514 LastName515 moved 100 g of Batch B1 of Widget from gain to active in Place 92 with reason 'revaluation'",
"metrc_production_batch_number": null,
"metrc_unit_name": null,
"package_batch_number_or_batch_name": "B1",
"package_label": null,
"product": "Widget",
"product_id": "a2160bb0-23db-41fe-b142-44971715ff5c",
"related_entity": "Stock Adjustment",
"related_entity_customer_vendor": null,
"related_entity_status": null,
"thc": null,
"thc_mg_g": null,
"thc_mg_ml": null,
"total_cbd": null,
"total_cbd_mg_g": null,
"total_cbd_mg_ml": null,
"total_cost": null,
"total_thc": null,
"total_thc_mg_g": null,
"total_thc_mg_ml": null,
"type": "adjustment",
"unit_type": "Gram"
}
],
"meta": {
"columns": [
{
"key": "date",
"label": "Date"
},
{
"key": "product",
"label": "Product"
},
{
"key": "package_batch_number_or_batch_name",
"label": "Package Batch Number or Batch Name"
},
{
"key": "batch_number",
"label": "Batch Number"
},
{
"key": "package_label",
"label": "Package Label"
},
{
"key": "metrc_production_batch_number",
"label": "Metrc Production Batch Number"
},
{
"key": "type",
"label": "Type"
},
{
"key": "related_entity",
"label": "Related Entity"
},
{
"key": "related_entity_status",
"label": "Related Entity Status"
},
{
"key": "related_entity_customer_vendor",
"label": "Related Entity Customer/Vendor"
},
{
"key": "amount",
"label": "Amount"
},
{
"key": "unit_type",
"label": "Unit Type"
},
{
"key": "metrc_unit_name",
"label": "Metrc Unit Name"
},
{
"key": "product_id",
"label": "Product Id"
},
{
"key": "batch_id",
"label": "Batch Id"
},
{
"key": "company_relationship_id",
"label": "Company Relationship Id"
},
{
"key": "description",
"label": "Description"
},
{
"key": "thc",
"label": "THC %"
},
{
"key": "total_thc",
"label": "Total THC %"
},
{
"key": "thc_mg_g",
"label": "THC mg/g"
},
{
"key": "thc_mg_ml",
"label": "THC mg/mL"
},
{
"key": "total_thc_mg_g",
"label": "Total THC mg/g"
},
{
"key": "total_thc_mg_ml",
"label": "Total THC mg/mL"
},
{
"key": "cbd",
"label": "CBD %"
},
{
"key": "total_cbd",
"label": "Total CBD %"
},
{
"key": "cbd_mg_g",
"label": "CBD mg/g"
},
{
"key": "cbd_mg_ml",
"label": "CBD mg/mL"
},
{
"key": "total_cbd_mg_g",
"label": "Total CBD mg/g"
},
{
"key": "total_cbd_mg_ml",
"label": "Total CBD mg/mL"
},
{
"key": "total_cost",
"label": "Total Cost"
}
],
"date_range": "Jul 15, 2026 to Aug 14, 2026",
"report": "inventory_transaction_history"
}
}
Returns one row per inventory transaction over the reported date range, with the transaction's date, product, package and batch identifiers, Metrc production batch number, type, related entity (order, return, assembly, stock adjustment, etc.) and its status and customer/vendor, the amount and unit type, package potency figures (THC/CBD), and the transaction's total cost. When no date filter is provided, the report defaults to the last 30 days.
Every value is returned as it appears in the report's CSV export, with numeric cells parsed into numbers. Companies on the BioTrack compliance integration do not get the metrc_unit_name and metrc_production_batch_number columns. Report-level information (the resolved date range and column definitions) is returned under meta.
Required permission: reports_permissions_inventory_transaction_history.
Request
GET /public/v1/reports/inventory-transaction-history
Parameters
| Parameter | Description | In | Type | Required | Default | Example |
|---|---|---|---|---|---|---|
| datetime | Filter by transaction date range (comma-separated ISO8601 range) | query | string | false | 2026-01-01T00:00:00Z,2026-02-01T00:00:00Z | |
| product_ids | Filter by product IDs | query | array | false | ||
| batch_ids | Filter by batch IDs | query | array | false | ||
| package_id | Filter by a single package ID | query | string | false |
Responses
| Status | Description | Schema |
|---|---|---|
| 200 | The Inventory Transaction History report | InventoryTransactionHistoryReport |
Get the Inventory Valuation report
GET /public/v1/reports/inventory-valuation returns one row per product as {data, meta}, valued and filtered per params
GET /public/v1/reports/inventory-valuation
content-type: application/json
accept: application/json
authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJhdWQiOiJEaXN0cnUiLCJleHAiOjE4MTgxNTYwNTUsImlhdCI6MTc4NjcwNjQ1NSwiaXNzIjoiRGlzdHJ1IiwianRpIjoiY2IyYjZlNDctYzkxZC00NzAyLWIzMTQtYzAxZDc0M2M5YTM0IiwibW9iaWxlIjpmYWxzZSwibmJmIjoxNzg2NzA2NDU0LCJwbGF0Zm9ybSI6IkFQSSIsInN1YiI6IlVzZXI6NTEiLCJ0eXAiOiJhY2Nlc3MifQ.0QldL76A0bALKV3lQG1quqMSGFliFqHkfTMEapjbZ4E
Response
200
content-type: application/json; charset=utf-8
cache-control: max-age=0, private, must-revalidate
b3: 116da4f8874cefd71ccda806f971e771-3bdea302cbbaa20d-0
{
"data": [
{
"active_quantity": 5.0,
"active_value_price": 50.0,
"assembling_quantity": 0.0,
"available_quantity": 5.0,
"brand": null,
"category": "Some category 6",
"group": "Product Group 6",
"image_url": null,
"incoming_quantity": 0.0,
"inventory_threshold_max": null,
"inventory_threshold_min": null,
"name": "Alpha",
"owner": "FirstName100 LastName101",
"pending_output_quantity": 0.0,
"reserved_quantity": 0.0,
"sku": "sku 15",
"subcategory": "Some subcategory 6",
"unit_cost": 4.0,
"unit_price": 10.0,
"unit_type": "Gram",
"vendor": "Company 44"
},
{
"active_quantity": 0.0,
"active_value_price": 0.0,
"assembling_quantity": 0.0,
"available_quantity": 0.0,
"brand": null,
"category": "Some category 8",
"group": "Product Group 7",
"image_url": null,
"incoming_quantity": 0.0,
"inventory_threshold_max": null,
"inventory_threshold_min": null,
"name": "Beta",
"owner": "FirstName100 LastName101",
"pending_output_quantity": 0.0,
"reserved_quantity": 0.0,
"sku": "sku 17",
"subcategory": "Some subcategory 7",
"unit_cost": 4.0,
"unit_price": 10.0,
"unit_type": "Gram",
"vendor": "Company 47"
}
],
"meta": {
"columns": [
{
"key": "name",
"label": "Name"
},
{
"key": "sku",
"label": "SKU"
},
{
"key": "vendor",
"label": "Vendor"
},
{
"key": "unit_type",
"label": "Unit Type"
},
{
"key": "category",
"label": "Category"
},
{
"key": "subcategory",
"label": "Subcategory"
},
{
"key": "group",
"label": "Group"
},
{
"key": "owner",
"label": "Owner"
},
{
"key": "active_quantity",
"label": "Active Quantity"
},
{
"key": "assembling_quantity",
"label": "Assembling Quantity"
},
{
"key": "reserved_quantity",
"label": "Reserved Quantity"
},
{
"key": "available_quantity",
"label": "Available Quantity"
},
{
"key": "incoming_quantity",
"label": "Incoming Quantity"
},
{
"key": "pending_output_quantity",
"label": "Pending Output Quantity"
},
{
"key": "unit_cost",
"label": "Unit Cost"
},
{
"key": "unit_price",
"label": "Unit Price"
},
{
"key": "inventory_threshold_max",
"label": "Inventory Threshold Max"
},
{
"key": "inventory_threshold_min",
"label": "Inventory Threshold Min"
},
{
"key": "active_value_price",
"label": "Active Value (Price)"
},
{
"key": "image_url",
"label": "Image URL"
},
{
"key": "brand",
"label": "Brand"
}
],
"date_range": "Aug 14, 2026",
"report": "inventory_valuation"
}
}
Returns one row per product with its current on-hand position — active, assembling, reserved, available, incoming, and pending-output quantities — alongside the product's descriptive attributes (SKU, vendor, brand, unit type, category, subcategory, group, owner), its unit cost and price, its inventory alert thresholds, and its active inventory value. The active value is priced by unit price by default; pass calculation_method=cost to value it by unit cost instead, which also renames the value column (active_value_price becomes active_value_cost).
Every value is returned as it appears in the report's CSV export, with numeric cells parsed into numbers. Any Product custom fields configured for the company are appended as extra columns. Report-level information (the resolved date and column definitions) is returned under meta.
Required permission: reports_permissions_inventory_valuation.
Request
GET /public/v1/reports/inventory-valuation
Parameters
| Parameter | Description | In | Type | Required | Default | Example |
|---|---|---|---|---|---|---|
| search | Search by product name or SKU | query | string | false | ||
| calculation_method | How to value active inventory (defaults to price) |
query | string | false | cost | |
| location_ids | Filter by location IDs | query | array | false | ||
| user_ids | Filter by user IDs | query | array | false | ||
| vendor_ids | Filter by vendor (company relationship) IDs | query | array | false | ||
| brand_ids | Filter by brand (company relationship) IDs | query | array | false |
Responses
| Status | Description | Schema |
|---|---|---|
| 200 | The Inventory Valuation report | InventoryValuationReport |
Get the Invoice History report
GET /public/v1/reports/invoice-history returns one row per invoice as {data, meta}, narrowed by the applied filters
GET /public/v1/reports/invoice-history?invoice_datetime=2026-06-01T00%3A00%3A00Z%2C2026-08-01T00%3A00%3A00Z
content-type: application/json
accept: application/json
authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJhdWQiOiJEaXN0cnUiLCJleHAiOjE4MTgxNTYwNTQsImlhdCI6MTc4NjcwNjQ1NCwiaXNzIjoiRGlzdHJ1IiwianRpIjoiZDI3YjVjN2ItOTVmNy00MWMwLWJhYWItMGE2OTRlODgyOTlhIiwibW9iaWxlIjpmYWxzZSwibmJmIjoxNzg2NzA2NDUzLCJwbGF0Zm9ybSI6IkFQSSIsInN1YiI6IlVzZXI6MTMiLCJ0eXAiOiJhY2Nlc3MifQ.Vhg4gey3PcQkMTndOjk6c31wKs31bzXjk48rDaG1z5s
Response
200
content-type: application/json; charset=utf-8
cache-control: max-age=0, private, must-revalidate
b3: 6ce65a30f042800057b057838abf8a9b-dffb65ab01cdbaef-0
{
"data": [
{
"charge_summary": null,
"customer": "Company 36",
"discount_summary": null,
"due_date": "2026-08-14",
"invoice_date": "2026-07-01",
"invoice_number": "INV-2",
"line_item_subtotal": 0.0,
"outstanding": 500.0,
"owner": "FirstName76 LastName77",
"paid": 0.0,
"sales_order": "SO-20",
"status": "NOT_PAID",
"tax_summary": null,
"total": "500.00",
"total_charges": 0.0,
"total_discounts": 0.0,
"total_taxes": 0.0
},
{
"charge_summary": null,
"customer": "Company 23",
"discount_summary": null,
"due_date": "2026-08-14",
"invoice_date": "2026-07-01",
"invoice_number": "INV-1",
"line_item_subtotal": 0.0,
"outstanding": 1.0e3,
"owner": "FirstName32 LastName33",
"paid": 0.0,
"sales_order": "SO-0",
"status": "FULLY_PAID",
"tax_summary": null,
"total": "1000.00",
"total_charges": 0.0,
"total_discounts": 0.0,
"total_taxes": 0.0
}
],
"meta": {
"columns": [
{
"key": "invoice_date",
"label": "Invoice Date"
},
{
"key": "invoice_number",
"label": "Invoice Number"
},
{
"key": "due_date",
"label": "Due Date"
},
{
"key": "sales_order",
"label": "Sales Order"
},
{
"key": "customer",
"label": "Customer"
},
{
"key": "status",
"label": "Status"
},
{
"key": "paid",
"label": "Paid"
},
{
"key": "outstanding",
"label": "Outstanding"
},
{
"key": "line_item_subtotal",
"label": "Line Item Subtotal"
},
{
"key": "total_taxes",
"label": "Total Taxes"
},
{
"key": "tax_summary",
"label": "Tax Summary"
},
{
"key": "total_charges",
"label": "Total Charges"
},
{
"key": "charge_summary",
"label": "Charge Summary"
},
{
"key": "total_discounts",
"label": "Total Discounts"
},
{
"key": "discount_summary",
"label": "Discount Summary"
},
{
"key": "total",
"label": "Total"
},
{
"key": "owner",
"label": "Owner"
}
],
"date_range": "May 31, 2026 to Jul 31, 2026",
"report": "invoice_history"
}
}
Returns one row per invoice with its dates, sales order, customer, status, and monetary totals (paid, outstanding, line item subtotal, taxes, charges, discounts, total) along with the tax, charge, and discount summaries. When no date filter is provided, the report defaults to the last 30 days.
Every value is returned as it appears in the report's CSV export, with numeric cells (monetary amounts) parsed into numbers. Companies on a compliance integration (Metrc or BioTrack) get additional manifest and shipped-from-license columns, and any Invoice custom fields configured for the company are appended as extra columns. Report-level information (the resolved date range and column definitions) is returned under meta.
Required permission: reports_permissions_invoice_history.
Request
GET /public/v1/reports/invoice-history
Parameters
| Parameter | Description | In | Type | Required | Default | Example |
|---|---|---|---|---|---|---|
| status | Filter by invoice payment status | query | array | false | ["FULLY_PAID"] | |
| order_status | Filter by the invoice's sales order status | query | array | false | ["COMPLETED"] | |
| invoice_datetime | Filter by invoice date range (comma-separated ISO8601 range) | query | string | false | 2026-01-01T00:00:00Z,2026-02-01T00:00:00Z | |
| due_datetime | Filter by due date range | query | string | false | ||
| total | Filter by invoice total range (comma-separated min,max) | query | string | false | 100,500 | |
| paid | Filter by paid amount range (comma-separated min,max) | query | string | false | ||
| search | Search by invoice number | query | string | false | ||
| company_relationship_ids | Filter by customer (company relationship) IDs | query | array | false | ||
| shipped_from_license_ids | Filter by the shipped-from license IDs | query | array | false | ||
| batch_ids | Filter by batch IDs | query | array | false | ||
| product_ids | Filter by product IDs | query | array | false |
Responses
| Status | Description | Schema |
|---|---|---|
| 200 | The Invoice History report | InvoiceHistoryReport |
Get the Order Fulfillment report
GET /public/v1/reports/order-fulfillment returns one row per product pivoted across orders as {data, meta}, narrowed by filters
GET /public/v1/reports/order-fulfillment?order_datetime=2026-06-01T00%3A00%3A00Z%2C2026-08-01T00%3A00%3A00Z
content-type: application/json
accept: application/json
authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJhdWQiOiJEaXN0cnUiLCJleHAiOjE4MTgxNTYwNTQsImlhdCI6MTc4NjcwNjQ1NCwiaXNzIjoiRGlzdHJ1IiwianRpIjoiYWQ1OWFhYjEtNmJiNC00NjMxLWE2YjUtMTQyY2I4NTQxNzhmIiwibW9iaWxlIjpmYWxzZSwibmJmIjoxNzg2NzA2NDUzLCJwbGF0Zm9ybSI6IkFQSSIsInN1YiI6IlVzZXI6MiIsInR5cCI6ImFjY2VzcyJ9.sBNy303gywQbiZZiIVkEvYSwRGkWv0QWTKZ9i9yI5tg
Response
200
content-type: application/json; charset=utf-8
cache-control: max-age=0, private, must-revalidate
b3: 36340f26bdb36ad6fd003243fa2d96d4-3467c555604e6e3b-0
{
"data": [
{
"category": "Some category 1",
"group": "Product Group 3",
"product": "A1",
"so_1": 3,
"so_2": "",
"subcategory": "Some subcategory 2",
"total_units": 3,
"total_value": 30.0,
"unit_price": 10.0
},
{
"category": "Some category 4",
"group": "Product Group 5",
"product": "B2",
"so_1": 1,
"so_2": 4,
"subcategory": "Some subcategory 5",
"total_units": 5,
"total_value": 100.0,
"unit_price": 20.0
}
],
"meta": {
"columns": [
{
"key": "product",
"label": "Product"
},
{
"key": "group",
"label": "Group"
},
{
"key": "category",
"label": "Category"
},
{
"key": "subcategory",
"label": "Subcategory"
},
{
"key": "so_1",
"label": "SO-1"
},
{
"key": "so_2",
"label": "SO-2"
},
{
"key": "total_units",
"label": "Total Units"
},
{
"key": "unit_price",
"label": "Unit Price"
},
{
"key": "total_value",
"label": "Total Value"
}
],
"date_range": "May 31, 2026 to Jul 31, 2026",
"report": "order_fulfillment"
}
}
Returns one row per product sold over the reported date range, pivoted across the matching sales orders: alongside the product's group, category, and subcategory, each row carries one dynamic column per order (keyed by the slugified order number, e.g. so_1042) holding the quantity of that product on that order, plus the product's total units, unit price, and total value. When no date filter is provided, the report defaults to the last 30 days. Canceled and merged orders are always excluded.
Every value is returned as it appears in the report's CSV export, with numeric cells parsed into numbers. Because the per-order columns are dynamic, the exact set of keys on each row and in meta.columns depends on which orders match the filters. Report-level information (the resolved date range and column definitions) is returned under meta.
Required permission: reports_permissions_order_fulfillment.
Request
GET /public/v1/reports/order-fulfillment
Parameters
| Parameter | Description | In | Type | Required | Default | Example |
|---|---|---|---|---|---|---|
| order_datetime | Filter by order date range (comma-separated ISO8601 range) | query | string | false | 2026-01-01T00:00:00Z,2026-02-01T00:00:00Z | |
| status | Filter by sales order status | query | array | false | ["COMPLETED","DELIVERED"] | |
| search | Search by order number, customer name, or LeafLink short ID | query | string | false | ||
| company_relationship_ids | Filter by customer (company relationship) IDs | query | array | false | ||
| product_ids | Filter by product IDs | query | array | false | ||
| location_ids | Filter by the order item location IDs | query | array | false | ||
| user_ids | Filter by the order item user IDs | query | array | false | ||
| owner_ids | Filter by order owner (sales rep) IDs | query | array | false |
Responses
| Status | Description | Schema |
|---|---|---|
| 200 | The Order Fulfillment report | OrderFulfillmentReport |
Get the Plant Lifecycle report
GET /public/v1/reports/plant-lifecycle returns one row per plant batch as {data, meta}, filtered by strain
GET /public/v1/reports/plant-lifecycle?datetime=2000-01-01T00%3A00%3A00Z%2C2999-01-01T00%3A00%3A00Z
content-type: application/json
accept: application/json
authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJhdWQiOiJEaXN0cnUiLCJleHAiOjE4MTgxNTYwNTYsImlhdCI6MTc4NjcwNjQ1NiwiaXNzIjoiRGlzdHJ1IiwianRpIjoiZDM4YWRmNzUtYjA5ZS00YWI4LWE5MGQtYTM5NWUwZGIxY2EwIiwibW9iaWxlIjpmYWxzZSwibmJmIjoxNzg2NzA2NDU1LCJwbGF0Zm9ybSI6IkFQSSIsInN1YiI6IlVzZXI6NDU2IiwidHlwIjoiYWNjZXNzIn0.NqEDUC0GqTSShmPwVtBomXvvss7Z-qIP908c6hhOsYc
Response
200
content-type: application/json; charset=utf-8
cache-control: max-age=0, private, must-revalidate
b3: ff4d03c3f85071a7b2013807f25a55f0-cfab5df1e22cbaf4-0
{
"data": [
{
"batch_creation_date": "08/14/2026",
"days_as_batch": 0,
"days_veg_to_last_harvest": null,
"first_harvest_date": null,
"harvest_name_s": null,
"last_harvest_date": null,
"plant_batch_name": "Plant Group 4996",
"plants_destroyed": 0,
"plants_harvested": 0,
"plants_promoted_to_veg": 0,
"plants_started": 3,
"promoted_to_veg_date": null,
"strain": "OG Kush",
"total_lifecycle_days": 0
},
{
"batch_creation_date": "08/14/2026",
"days_as_batch": 0,
"days_veg_to_last_harvest": null,
"first_harvest_date": null,
"harvest_name_s": null,
"last_harvest_date": null,
"plant_batch_name": "Plant Group 5637",
"plants_destroyed": 0,
"plants_harvested": 0,
"plants_promoted_to_veg": 0,
"plants_started": 2,
"promoted_to_veg_date": null,
"strain": "Blue Dream",
"total_lifecycle_days": 0
}
],
"meta": {
"columns": [
{
"key": "plant_batch_name",
"label": "Plant Batch Name"
},
{
"key": "batch_creation_date",
"label": "Batch Creation Date"
},
{
"key": "strain",
"label": "Strain"
},
{
"key": "plants_started",
"label": "Plants Started"
},
{
"key": "plants_promoted_to_veg",
"label": "Plants Promoted to Veg"
},
{
"key": "plants_destroyed",
"label": "Plants Destroyed"
},
{
"key": "plants_harvested",
"label": "Plants Harvested"
},
{
"key": "promoted_to_veg_date",
"label": "Promoted to Veg Date"
},
{
"key": "first_harvest_date",
"label": "First Harvest Date"
},
{
"key": "last_harvest_date",
"label": "Last Harvest Date"
},
{
"key": "days_as_batch",
"label": "Days as Batch"
},
{
"key": "days_veg_to_last_harvest",
"label": "Days Veg to Last Harvest"
},
{
"key": "total_lifecycle_days",
"label": "Total Lifecycle Days"
},
{
"key": "harvest_name_s",
"label": "Harvest Name(s)"
}
],
"date_range": "Dec 31, 1999 to Dec 31, 2998",
"report": "plant_lifecycle"
}
}
Returns one row per plant batch (plant group) whose creation date falls in the reported range, summarizing its lifecycle: the batch name, creation date, strain, and the counts of plants started, promoted to vegetative, destroyed, and harvested. Each row also carries the promotion-to-veg date, first and last harvest dates, the durations spent as a batch, from veg to last harvest, and over the total lifecycle (in days), and the names of the harvests the batch produced.
Only plant batches on active Metrc licenses that can track vegetative plants are included. When no date filter is provided, the report defaults to the last 30 days (by batch creation date). Every value is returned as it appears in the report's CSV export, with numeric cells parsed into numbers. The cost columns (total_cost_batch_stage, total_cost_veg_to_last_harvest, destroyed_plant_cost, total_lifecycle_cost) are omitted for users without permission to view costs. Report-level information (the resolved date range and column definitions) is returned under meta.
Required permission: reports_permissions_plant_lifecycle.
Request
GET /public/v1/reports/plant-lifecycle
Parameters
| Parameter | Description | In | Type | Required | Default | Example |
|---|---|---|---|---|---|---|
| datetime | Filter by plant batch creation date range (comma-separated ISO8601 range) | query | string | false | 2026-01-01T00:00:00Z,2026-02-01T00:00:00Z | |
| strain | Filter by strain (partial match) | query | string | false |
Responses
| Status | Description | Schema |
|---|---|---|
| 200 | The Plant Lifecycle report | PlantLifecycleReport |
Get the Purchase Order History report
GET /public/v1/reports/purchase-order-history returns one row per purchase as {data, meta}, narrowed by the applied filters
GET /public/v1/reports/purchase-order-history?order_datetime=2026-06-01T00%3A00%3A00Z%2C2026-08-01T00%3A00%3A00Z
content-type: application/json
accept: application/json
authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJhdWQiOiJEaXN0cnUiLCJleHAiOjE4MTgxNTYwNTUsImlhdCI6MTc4NjcwNjQ1NSwiaXNzIjoiRGlzdHJ1IiwianRpIjoiYjU1MWJmMjktOTM1MC00YmNlLWJjMDQtYzBjZjU3NWI2Y2NjIiwibW9iaWxlIjpmYWxzZSwibmJmIjoxNzg2NzA2NDU0LCJwbGF0Zm9ybSI6IkFQSSIsInN1YiI6IlVzZXI6MTE3IiwidHlwIjoiYWNjZXNzIn0.DHgSfukMpnnw-4BwW8yh4-GwhFA2jH2WsdifS4nZ-7s
Response
200
content-type: application/json; charset=utf-8
cache-control: max-age=0, private, must-revalidate
b3: 0eeabd522c1923fca9804b17aa50af83-99d52b29fd6167eb-0
{
"data": [
{
"amount": "500.00",
"due_date": "2026-08-14T04:20:55.861080",
"owner": "FirstName268 LastName269",
"paid": "0.0",
"purchase_date": "2026-07-01T05:00:00.000000",
"purchase_number": "PO-2",
"status": "PENDING",
"vendor": "Company 128"
},
{
"amount": "1000.00",
"due_date": "2026-08-14T04:20:55.825744",
"owner": "FirstName236 LastName239",
"paid": "0.0",
"purchase_date": "2026-07-01T05:00:00.000000",
"purchase_number": "PO-1",
"status": "COMPLETED",
"vendor": "Company 114"
}
],
"meta": {
"columns": [
{
"key": "purchase_date",
"label": "Purchase Date"
},
{
"key": "due_date",
"label": "Due Date"
},
{
"key": "purchase_number",
"label": "Purchase Number"
},
{
"key": "vendor",
"label": "Vendor"
},
{
"key": "status",
"label": "Status"
},
{
"key": "paid",
"label": "Paid"
},
{
"key": "amount",
"label": "Amount"
},
{
"key": "owner",
"label": "Owner"
}
],
"date_range": "May 31, 2026 to Jul 31, 2026",
"report": "purchase_order_history"
}
}
Returns one row per purchase with its dates, vendor, status, and monetary totals (paid, amount). When no date filter is provided, the report defaults to the last 30 days.
Every value is returned as it appears in the report's CSV export, with numeric cells (monetary amounts) parsed into numbers. Companies on a compliance integration (Metrc or BioTrack) get an additional manifest number column, and any Purchase custom fields configured for the company are appended as extra columns. Report-level information (the resolved date range and column definitions) is returned under meta.
Required permission: reports_permissions_purchase_order_history.
Request
GET /public/v1/reports/purchase-order-history
Parameters
| Parameter | Description | In | Type | Required | Default | Example |
|---|---|---|---|---|---|---|
| status | Filter by purchase status | query | array | false | ["COMPLETED","DELIVERING"] | |
| order_datetime | Filter by purchase date range (comma-separated ISO8601 range) | query | string | false | 2026-01-01T00:00:00Z,2026-02-01T00:00:00Z | |
| due_datetime | Filter by due date range | query | string | false | ||
| created_datetime | Filter by the datetime the purchase was created | query | string | false | ||
| updated_datetime | Filter by the datetime the purchase was last modified | query | string | false | ||
| total | Filter by purchase total range (comma-separated min,max) | query | string | false | 100,500 | |
| paid | Filter by paid amount range (comma-separated min,max) | query | string | false | ||
| search | Search by purchase number | query | string | false | ||
| company_relationship_ids | Filter by vendor (company relationship) IDs | query | array | false | ||
| location_ids | Filter by receiving warehouse (location) IDs | query | array | false | ||
| owner_ids | Filter by purchase owner (user) IDs | query | array | false | ||
| creator_ids | Filter by purchase creator (user) IDs | query | array | false | ||
| batch_ids | Filter by batch IDs | query | array | false | ||
| product_ids | Filter by product IDs | query | array | false |
Responses
| Status | Description | Schema |
|---|---|---|
| 200 | The Purchase Order History report | PurchaseOrderHistoryReport |
Get the Purchases By Company report
GET /public/v1/reports/purchases-by-company returns one row per vendor as {data, meta}, narrowed by the applied filters
GET /public/v1/reports/purchases-by-company?order_datetime=2026-06-01T00%3A00%3A00Z%2C2026-08-01T00%3A00%3A00Z
content-type: application/json
accept: application/json
authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJhdWQiOiJEaXN0cnUiLCJleHAiOjE4MTgxNTYwNTUsImlhdCI6MTc4NjcwNjQ1NSwiaXNzIjoiRGlzdHJ1IiwianRpIjoiNTEwZjZlNDQtNDBhYy00YzA2LWIyYzMtYjE3MDg4OWNmMWY2IiwibW9iaWxlIjpmYWxzZSwibmJmIjoxNzg2NzA2NDU0LCJwbGF0Zm9ybSI6IkFQSSIsInN1YiI6IlVzZXI6MTE2IiwidHlwIjoiYWNjZXNzIn0.hyrWwJAePqX8Wu6tGehMG9a0KetgLmMqCfwmhQEok0E
Response
200
content-type: application/json; charset=utf-8
cache-control: max-age=0, private, must-revalidate
b3: fb81c9f3f420b35e5c7db9bfb9128e99-26d4c07227580315-0
{
"data": [
{
"category": "Lab",
"last_purchase_date": "7/15/2026",
"name": "Alpha",
"product_owner": "FirstName271 LastName273",
"purchase_order_count": 2,
"relationship_type": null,
"total_purchases": 1.5e3
}
],
"meta": {
"columns": [
{
"key": "name",
"label": "Name"
},
{
"key": "last_purchase_date",
"label": "Last Purchase Date"
},
{
"key": "purchase_order_count",
"label": "Purchase Order Count"
},
{
"key": "total_purchases",
"label": "Total Purchases"
},
{
"key": "product_owner",
"label": "Product Owner"
},
{
"key": "category",
"label": "Category"
},
{
"key": "relationship_type",
"label": "Relationship Type"
}
],
"date_range": "May 31, 2026 to Jul 31, 2026",
"report": "purchases_by_company"
}
}
Returns one row per vendor (company relationship) with its last purchase date, purchase order count, and total purchases over the reported date range. When no date filter is provided, the report defaults to the last 30 days. Draft purchases are excluded.
Every value is returned as it appears in the report's CSV export, with numeric cells parsed into numbers. Any CompanyRelationship custom fields configured for the company are appended as extra columns. Report-level information (the resolved date range and column definitions) is returned under meta.
Required permission: reports_permissions_purchases_by_company.
Request
GET /public/v1/reports/purchases-by-company
Parameters
| Parameter | Description | In | Type | Required | Default | Example |
|---|---|---|---|---|---|---|
| order_datetime | Filter by purchase date range (comma-separated ISO8601 range) | query | string | false | 2026-01-01T00:00:00Z,2026-02-01T00:00:00Z | |
| search | Search by vendor (related company) name | query | string | false | ||
| company_relationship_group_ids | Filter by vendor group IDs | query | array | false | ||
| owner_ids | Filter by purchase owner (sales rep) IDs | query | array | false |
Responses
| Status | Description | Schema |
|---|---|---|
| 200 | The Purchases By Company report | PurchasesByCompanyReport |
Get the Purchases By Product report
GET /public/v1/reports/purchases-by-product returns one row per purchased product as {data, meta}, narrowed by the applied filters
GET /public/v1/reports/purchases-by-product?order_datetime=2026-06-01T00%3A00%3A00Z%2C2026-08-01T00%3A00%3A00Z
content-type: application/json
accept: application/json
authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJhdWQiOiJEaXN0cnUiLCJleHAiOjE4MTgxNTYwNTUsImlhdCI6MTc4NjcwNjQ1NSwiaXNzIjoiRGlzdHJ1IiwianRpIjoiZTgzNDM3YjktZWU3YS00YmE0LWIyZDAtODgwZmY4ZjE0NTU5IiwibW9iaWxlIjpmYWxzZSwibmJmIjoxNzg2NzA2NDU0LCJwbGF0Zm9ybSI6IkFQSSIsInN1YiI6IlVzZXI6MTc1IiwidHlwIjoiYWNjZXNzIn0.shRLsAt7g8Zyup0GLVs9X1SAgMqWVvnc3PvatkwhCpQ
Response
200
content-type: application/json; charset=utf-8
cache-control: max-age=0, private, must-revalidate
b3: 10f19883af26ffbab6fead3b8fa75904-c7447bdb5c704bf4-0
{
"data": [
{
"category": "Some category 33",
"group": "Product Group 29",
"name": "Alpha",
"owner": "FirstName352 LastName353",
"quantity_purchased": 4,
"sale_price": 1.0,
"sku": "sku 73",
"subcategory": "Some subcategory 29",
"total_purchased": 40.0,
"unit_cost": null,
"unit_type": "Gram",
"vendor": "Company 159",
"wholesale_price": null
}
],
"meta": {
"columns": [
{
"key": "name",
"label": "Name"
},
{
"key": "sku",
"label": "SKU"
},
{
"key": "quantity_purchased",
"label": "Quantity Purchased"
},
{
"key": "total_purchased",
"label": "Total Purchased"
},
{
"key": "unit_type",
"label": "Unit Type"
},
{
"key": "category",
"label": "Category"
},
{
"key": "subcategory",
"label": "Subcategory"
},
{
"key": "group",
"label": "Group"
},
{
"key": "vendor",
"label": "Vendor"
},
{
"key": "owner",
"label": "Owner"
},
{
"key": "unit_cost",
"label": "Unit Cost"
},
{
"key": "sale_price",
"label": "Sale Price"
},
{
"key": "wholesale_price",
"label": "Wholesale Price"
}
],
"date_range": "May 31, 2026 to Jul 31, 2026",
"report": "purchases_by_product"
}
}
Returns one row per purchased product with its quantity purchased and total purchased (purchase item quantities times price) over the reported date range, alongside the product's descriptive attributes (SKU, unit type, category, subcategory, group, vendor, owner, unit cost, sale price, and wholesale price). When no date filter is provided, the report defaults to the last 30 days. Draft purchases are excluded.
Every value is returned as it appears in the report's CSV export, with numeric cells parsed into numbers. Any Product custom fields configured for the company are appended as extra columns. Report-level information (the resolved date range and column definitions) is returned under meta.
Required permission: reports_permissions_purchases_by_product.
Request
GET /public/v1/reports/purchases-by-product
Parameters
| Parameter | Description | In | Type | Required | Default | Example |
|---|---|---|---|---|---|---|
| order_datetime | Filter by purchase date range (comma-separated ISO8601 range) | query | string | false | 2026-01-01T00:00:00Z,2026-02-01T00:00:00Z | |
| search | Search by product name or SKU | query | string | false | ||
| owner_ids | Filter by purchase owner (sales rep) IDs | query | array | false | ||
| location_ids | Filter by the purchase location IDs | query | array | false |
Responses
| Status | Description | Schema |
|---|---|---|
| 200 | The Purchases By Product report | PurchasesByProductReport |
Get the Sales By Company report
GET /public/v1/reports/sales-by-company returns one row per customer as {data, meta}, narrowed by the applied filters
GET /public/v1/reports/sales-by-company?order_datetime=2026-06-01T00%3A00%3A00Z%2C2026-08-01T00%3A00%3A00Z
content-type: application/json
accept: application/json
authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJhdWQiOiJEaXN0cnUiLCJleHAiOjE4MTgxNTYwNTQsImlhdCI6MTc4NjcwNjQ1NCwiaXNzIjoiRGlzdHJ1IiwianRpIjoiYjY5MzUyMTQtZjQ3Yy00ZTNjLWJlYjMtYjEzYzMxMWQ2MTIyIiwibW9iaWxlIjpmYWxzZSwibmJmIjoxNzg2NzA2NDUzLCJwbGF0Zm9ybSI6IkFQSSIsInN1YiI6IlVzZXI6MSIsInR5cCI6ImFjY2VzcyJ9.KnoE_JxLuK_4chrrHhDu2xRsTPU7UKhwKWili2WdR-M
Response
200
content-type: application/json; charset=utf-8
cache-control: max-age=0, private, must-revalidate
b3: 19a253be60c40aae3dfd49178d484d4d-9b980469b7287641-0
{
"data": [
{
"category": "Microbusiness",
"last_order_date": "7/15/2026",
"name": "Alpha",
"order_count": 3,
"owner": "FirstName44 LastName45",
"relationship_type": null,
"total_received": 0.0,
"total_sales": 1.8e3
}
],
"meta": {
"columns": [
{
"key": "name",
"label": "Name"
},
{
"key": "last_order_date",
"label": "Last Order Date"
},
{
"key": "order_count",
"label": "Order Count"
},
{
"key": "total_received",
"label": "Total Received"
},
{
"key": "total_sales",
"label": "Total Sales"
},
{
"key": "owner",
"label": "Owner"
},
{
"key": "category",
"label": "Category"
},
{
"key": "relationship_type",
"label": "Relationship Type"
}
],
"date_range": "May 31, 2026 to Jul 31, 2026",
"report": "sales_by_company"
}
}
Returns one row per customer (company relationship) with its last order date, order count, total received (payments), and total sales (order totals net of returns) over the reported date range. When no date filter is provided, the report defaults to the last 30 days. Canceled orders are excluded unless the status filter explicitly requests them.
Every value is returned as it appears in the report's CSV export, with numeric cells parsed into numbers. Any CompanyRelationship custom fields configured for the company are appended as extra columns. Report-level information (the resolved date range and column definitions) is returned under meta.
Required permission: reports_permissions_sales_by_company.
Request
GET /public/v1/reports/sales-by-company
Parameters
| Parameter | Description | In | Type | Required | Default | Example |
|---|---|---|---|---|---|---|
| status | Filter by sales order status | query | array | false | ["COMPLETED","DELIVERED"] | |
| order_datetime | Filter by order date range (comma-separated ISO8601 range) | query | string | false | 2026-01-01T00:00:00Z,2026-02-01T00:00:00Z | |
| search | Search by customer (related company) name | query | string | false | ||
| company_relationship_group_ids | Filter by customer group IDs | query | array | false | ||
| owner_ids | Filter by order owner (sales rep) IDs | query | array | false |
Responses
| Status | Description | Schema |
|---|---|---|
| 200 | The Sales By Company report | SalesByCompanyReport |
Get the Sales By Product report
GET /public/v1/reports/sales-by-product returns one row per product as {data, meta}, narrowed by the applied filters
GET /public/v1/reports/sales-by-product?order_datetime=2026-06-01T00%3A00%3A00Z%2C2026-08-01T00%3A00%3A00Z
content-type: application/json
accept: application/json
authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJhdWQiOiJEaXN0cnUiLCJleHAiOjE4MTgxNTYwNTQsImlhdCI6MTc4NjcwNjQ1NCwiaXNzIjoiRGlzdHJ1IiwianRpIjoiOGJmNTQxNjgtNjc2NS00N2ZjLWFjZmYtZTNhYTY2Mzk2OGRkIiwibW9iaWxlIjpmYWxzZSwibmJmIjoxNzg2NzA2NDUzLCJwbGF0Zm9ybSI6IkFQSSIsInN1YiI6IlVzZXI6MTEiLCJ0eXAiOiJhY2Nlc3MifQ.AEkwFP8OxxKsewLC_fXGeKbxxsozUgZP4Ol0_mzHQsw
Response
200
content-type: application/json; charset=utf-8
cache-control: max-age=0, private, must-revalidate
b3: 3952038c2bf6b4ec1275832500c95380-6a885b77af156586-0
{
"data": [
{
"category": "Some category 5",
"group": "Product Group 4",
"name": "Beta",
"product_owner": "FirstName72 LastName75",
"quantity_sold": 3,
"sale_price": 1.0,
"shipped_from_license": null,
"sku": "sku 7",
"subcategory": "Some subcategory 4",
"total_sales": 60.0,
"unit_cost": null,
"unit_type": "Gram",
"upc": null,
"vendor": "Company 35",
"wholesale_price": null
},
{
"category": "Some category 2",
"group": "Product Group 1",
"name": "Alpha",
"product_owner": "FirstName50 LastName51",
"quantity_sold": 4,
"sale_price": 1.0,
"shipped_from_license": null,
"sku": "sku 3",
"subcategory": "Some subcategory 0",
"total_sales": 40.0,
"unit_cost": null,
"unit_type": "Gram",
"upc": null,
"vendor": "Company 26",
"wholesale_price": null
}
],
"meta": {
"columns": [
{
"key": "name",
"label": "Name"
},
{
"key": "sku",
"label": "SKU"
},
{
"key": "quantity_sold",
"label": "Quantity Sold"
},
{
"key": "total_sales",
"label": "Total Sales"
},
{
"key": "unit_type",
"label": "Unit Type"
},
{
"key": "category",
"label": "Category"
},
{
"key": "subcategory",
"label": "Subcategory"
},
{
"key": "group",
"label": "Group"
},
{
"key": "vendor",
"label": "Vendor"
},
{
"key": "product_owner",
"label": "Product Owner"
},
{
"key": "unit_cost",
"label": "Unit Cost"
},
{
"key": "sale_price",
"label": "Sale Price"
},
{
"key": "wholesale_price",
"label": "Wholesale Price"
},
{
"key": "shipped_from_license",
"label": "Shipped From License"
},
{
"key": "upc",
"label": "UPC"
}
],
"date_range": "May 31, 2026 to Jul 31, 2026",
"report": "sales_by_product"
}
}
Returns one row per product with its quantity sold and total sales (order item quantities times price, net of returns) over the reported date range, alongside the product's descriptive attributes (SKU, unit type, category, subcategory, group, vendor, owner, unit cost, sale price, wholesale price, shipped-from license, and UPC). When no date filter is provided, the report defaults to the last 30 days. Canceled orders are excluded unless the status filter explicitly requests them.
Every value is returned as it appears in the report's CSV export, with numeric cells parsed into numbers. Any Product custom fields configured for the company are appended as extra columns. Report-level information (the resolved date range and column definitions) is returned under meta.
Required permission: reports_permissions_sales_by_product.
Request
GET /public/v1/reports/sales-by-product
Parameters
| Parameter | Description | In | Type | Required | Default | Example |
|---|---|---|---|---|---|---|
| status | Filter by sales order status | query | array | false | ["COMPLETED","DELIVERED"] | |
| order_datetime | Filter by order date range (comma-separated ISO8601 range) | query | string | false | 2026-01-01T00:00:00Z,2026-02-01T00:00:00Z | |
| search | Search by product name or SKU | query | string | false | ||
| customer_ids | Filter by customer (company relationship) IDs | query | array | false | ||
| exclude_customer_ids | Exclude sales to these customer (company relationship) IDs | query | array | false | ||
| owner_ids | Filter by order owner (sales rep) IDs | query | array | false | ||
| location_ids | Filter by the order item location IDs | query | array | false | ||
| user_ids | Filter by the order item user IDs | query | array | false | ||
| shipped_from_license_ids | Filter by the shipped-from license IDs | query | array | false |
Responses
| Status | Description | Schema |
|---|---|---|
| 200 | The Sales By Product report | SalesByProductReport |
Get the Sales By User report
GET /public/v1/reports/sales-by-user returns one row per user as {data, meta}, ranked by sales and narrowed by filters
GET /public/v1/reports/sales-by-user?order_datetime=2026-06-01T00%3A00%3A00Z%2C2026-08-01T00%3A00%3A00Z&user_ids[]=00000000-0000-0000-0000-000000000011&user_ids[]=00000000-0000-0000-0000-000000000016
content-type: application/json
accept: application/json
authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJhdWQiOiJEaXN0cnUiLCJleHAiOjE4MTgxNTYwNTQsImlhdCI6MTc4NjcwNjQ1NCwiaXNzIjoiRGlzdHJ1IiwianRpIjoiZDkyMjkyYmUtNDRhOC00ZmZiLWEzZTktYWRkMzkzYWM5ZGFhIiwibW9iaWxlIjpmYWxzZSwibmJmIjoxNzg2NzA2NDUzLCJwbGF0Zm9ybSI6IkFQSSIsInN1YiI6IlVzZXI6MTYiLCJ0eXAiOiJhY2Nlc3MifQ.T8s3JTDsfF-mkFc6MfnfiN-BaMyN42to4VK0MYevWsg
Response
200
content-type: application/json; charset=utf-8
cache-control: max-age=0, private, must-revalidate
b3: d685967b705d19b467827a2b7cf643bd-7bc47eb1377d75fc-0
{
"data": [
{
"leaderboard_rank": 1,
"order_count": 2,
"sales_pre_tax": 50.0,
"total_sales": 150.0,
"user": "Alice Rep"
},
{
"leaderboard_rank": 2,
"order_count": 1,
"sales_pre_tax": 30.0,
"total_sales": 30.0,
"user": "Bob Rep"
}
],
"meta": {
"columns": [
{
"key": "leaderboard_rank",
"label": "Leaderboard Rank"
},
{
"key": "user",
"label": "User"
},
{
"key": "order_count",
"label": "Order Count"
},
{
"key": "sales_pre_tax",
"label": "Sales (Pre-Tax)"
},
{
"key": "total_sales",
"label": "Total Sales"
}
],
"date_range": "May 31, 2026 to Jul 31, 2026",
"report": "sales_by_user"
}
}
Returns one row per user (sales rep) with its leaderboard rank, order count, pre-tax sales, and total sales (order totals net of returns) over the reported date range. Users are ranked by total sales, with the top seller at rank 1. When no date filter is provided, the report defaults to the last 30 days. Canceled orders are excluded unless the status filter explicitly requests them.
Every value is returned as it appears in the report's CSV export, with numeric cells parsed into numbers. Report-level information (the resolved date range and column definitions) is returned under meta.
Required permission: reports_permissions_sales_by_user.
Request
GET /public/v1/reports/sales-by-user
Parameters
| Parameter | Description | In | Type | Required | Default | Example |
|---|---|---|---|---|---|---|
| status | Filter by sales order status | query | array | false | ["COMPLETED","DELIVERED"] | |
| order_datetime | Filter by order date range (comma-separated ISO8601 range) | query | string | false | 2026-01-01T00:00:00Z,2026-02-01T00:00:00Z | |
| search | Search by order number or customer name | query | string | false | ||
| user_ids | Filter by user (sales rep) IDs | query | array | false |
Responses
| Status | Description | Schema |
|---|---|---|
| 200 | The Sales By User report | SalesByUserReport |
Get the Sales Order History report
GET /public/v1/reports/sales-order-history returns one row per order as {data, meta}, narrowed by the applied filters
GET /public/v1/reports/sales-order-history?order_datetime=2026-06-01T00%3A00%3A00Z%2C2026-08-01T00%3A00%3A00Z
content-type: application/json
accept: application/json
authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJhdWQiOiJEaXN0cnUiLCJleHAiOjE4MTgxNTYwNTQsImlhdCI6MTc4NjcwNjQ1NCwiaXNzIjoiRGlzdHJ1IiwianRpIjoiNDI0MThkZjAtYzg2Ni00N2U3LWE5YWUtMTU0Y2VhZDMwMjEwIiwibW9iaWxlIjpmYWxzZSwibmJmIjoxNzg2NzA2NDUzLCJwbGF0Zm9ybSI6IkFQSSIsInN1YiI6IlVzZXI6NiIsInR5cCI6ImFjY2VzcyJ9.1oqbwzAWmoubzvo6vprTJ7LUnvvjRqFPF3xCWWkUHqo
Response
200
content-type: application/json; charset=utf-8
cache-control: max-age=0, private, must-revalidate
b3: e2b651105a0af61b7a5231e8c92306df-e4a164f06139eab4-0
{
"data": [
{
"charges_taxes_not_included": 0.0,
"customer": "Company 24",
"delivery_date": null,
"delivery_date_utc": null,
"discounts_taxes_not_included": 0.0,
"due_date": "2026-08-14T04:20:54.969112",
"due_date_utc": "2026-08-14T11:20:54.969112Z",
"order_date": "2026-07-01T05:00:00.000000",
"order_date_utc": "2026-07-01T12:00:00.000000Z",
"order_number": "SO-1",
"outstanding": 1.0e3,
"owner": null,
"paid": 0.0,
"returns": 0.0,
"status": "COMPLETED",
"subtotal": 0.0,
"taxes": 0.0,
"total": 1.0e3
},
{
"charges_taxes_not_included": 0.0,
"customer": "Company 30",
"delivery_date": null,
"delivery_date_utc": null,
"discounts_taxes_not_included": 0.0,
"due_date": "2026-08-14T04:20:55.024042",
"due_date_utc": "2026-08-14T11:20:55.024042Z",
"order_date": "2026-07-01T05:00:00.000000",
"order_date_utc": "2026-07-01T12:00:00.000000Z",
"order_number": "SO-2",
"outstanding": 500.0,
"owner": null,
"paid": 0.0,
"returns": 0.0,
"status": "PENDING",
"subtotal": 0.0,
"taxes": 0.0,
"total": 500.0
}
],
"meta": {
"columns": [
{
"key": "order_date",
"label": "Order Date"
},
{
"key": "order_date_utc",
"label": "Order Date (UTC)"
},
{
"key": "delivery_date",
"label": "Delivery Date"
},
{
"key": "delivery_date_utc",
"label": "Delivery Date (UTC)"
},
{
"key": "due_date",
"label": "Due Date"
},
{
"key": "due_date_utc",
"label": "Due Date (UTC)"
},
{
"key": "order_number",
"label": "Order Number"
},
{
"key": "customer",
"label": "Customer"
},
{
"key": "status",
"label": "Status"
},
{
"key": "paid",
"label": "Paid"
},
{
"key": "outstanding",
"label": "Outstanding"
},
{
"key": "subtotal",
"label": "Subtotal"
},
{
"key": "taxes",
"label": "Taxes"
},
{
"key": "discounts_taxes_not_included",
"label": "Discounts (taxes not included)"
},
{
"key": "charges_taxes_not_included",
"label": "Charges (taxes not included)"
},
{
"key": "returns",
"label": "Returns"
},
{
"key": "total",
"label": "Total"
},
{
"key": "owner",
"label": "Owner"
}
],
"date_range": "May 31, 2026 to Jul 31, 2026",
"report": "sales_order_history"
}
}
Returns one row per sales order with its dates, customer, status, and monetary totals (paid, outstanding, subtotal, taxes, discounts, charges, returns, total). When no date filter is provided, the report defaults to the last 30 days.
Every value is returned as it appears in the report's CSV export, with numeric cells (monetary amounts) parsed into numbers. Companies on a compliance integration (Metrc or BioTrack) get additional manifest and shipped-from-license columns, and any Order custom fields configured for the company are appended as extra columns. Report-level information (the resolved date range and column definitions) is returned under meta.
Required permission: reports_permissions_sales_order_history.
Request
GET /public/v1/reports/sales-order-history
Parameters
| Parameter | Description | In | Type | Required | Default | Example |
|---|---|---|---|---|---|---|
| status | Filter by sales order status | query | array | false | ["COMPLETED","DELIVERED"] | |
| payment_status | Filter by payment status | query | array | false | ["FULLY_PAID"] | |
| order_source | Filter by the source that created the order | query | array | false | ||
| order_datetime | Filter by order date range (comma-separated ISO8601 range) | query | string | false | 2026-01-01T00:00:00Z,2026-02-01T00:00:00Z | |
| delivery_datetime | Filter by delivery date range | query | string | false | ||
| due_datetime | Filter by due date range | query | string | false | ||
| created_datetime | Filter by the datetime the order was created | query | string | false | ||
| updated_datetime | Filter by the datetime the order was last modified | query | string | false | ||
| total | Filter by order total range (comma-separated min,max) | query | string | false | 100,500 | |
| matched_with_compliance_transfer | Filter by whether the order is matched with a compliance transfer | query | boolean | false | ||
| search | Search by order number, customer name, or LeafLink short ID | query | string | false | ||
| company_relationship_ids | Filter by customer (company relationship) IDs | query | array | false | ||
| company_relationship_group_ids | Filter by customer group IDs | query | array | false | ||
| shipped_from_license_ids | Filter by the shipped-from license IDs | query | array | false | ||
| menu_ids | Filter by menu IDs | query | array | false | ||
| brand_ids | Filter by brand IDs | query | array | false | ||
| owner_ids | Filter by order owner (user) IDs | query | array | false | ||
| creator_ids | Filter by order creator (user) IDs | query | array | false | ||
| batch_ids | Filter by batch IDs | query | array | false | ||
| product_ids | Filter by product IDs | query | array | false |
Responses
| Status | Description | Schema |
|---|---|---|
| 200 | The Sales Order History report | SalesOrderHistoryReport |
Get the Sales Order Item History report
GET /public/v1/reports/sales-order-item-history returns one row per line item as {data, meta}, narrowed by the applied filters
GET /public/v1/reports/sales-order-item-history?order_datetime=2026-06-01T00%3A00%3A00Z%2C2026-08-01T00%3A00%3A00Z
content-type: application/json
accept: application/json
authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJhdWQiOiJEaXN0cnUiLCJleHAiOjE4MTgxNTYwNTYsImlhdCI6MTc4NjcwNjQ1NiwiaXNzIjoiRGlzdHJ1IiwianRpIjoiODFhNzNkZjMtNDEzOC00NGExLTk1ZTgtMzFiNWM1Yzg5MTBkIiwibW9iaWxlIjpmYWxzZSwibmJmIjoxNzg2NzA2NDU1LCJwbGF0Zm9ybSI6IkFQSSIsInN1YiI6IlVzZXI6MzgwIiwidHlwIjoiYWNjZXNzIn0.fP5M7W7ABlRuXkXzyQLJ7viU2O2wAEBnfOpCLAKgEZE
Response
200
content-type: application/json; charset=utf-8
cache-control: max-age=0, private, must-revalidate
b3: 99dfed97b88704373a9c030d028c61c9-7bb113d928a4073a-0
{
"data": [
{
"batch_number": null,
"brand": null,
"brand_id": null,
"category": "Some category 71",
"customer": "Company 341",
"customer_id": "00000000-0000-0000-0000-000000000156",
"default_unit_cost": null,
"default_unit_price": 1.0,
"default_wholesale_price": null,
"delivery_date": null,
"delivery_date_utc": null,
"due_date": "2026-08-14T04:20:56.756983",
"due_date_utc": "2026-08-14T11:20:56.756983Z",
"group": "Product Group 66",
"invoice_numbers": null,
"line_item_id": "aded43fc-9037-4d58-ba7e-9a36e842c407",
"order_date": "2026-07-01T05:00:00.000000",
"order_date_utc": "2026-07-01T12:00:00.000000Z",
"order_id": "ba81b4d2-69cd-4f4d-8f51-45f8723d6855",
"order_item_price": 10.0,
"order_number": "SO-2",
"product": "P1",
"product_id": "2b6ea7bb-6ee8-4490-bbc4-285c936d5ffd",
"product_sku": "sku 150",
"quantity": 2,
"returned_quantity": 0,
"sales_rep": null,
"status": "PENDING",
"subcategory": "Some subcategory 66",
"upc": null,
"vendor": "Acme Vendor",
"vendor_id": "00000000-0000-0000-0000-000000000069"
},
{
"batch_number": null,
"brand": null,
"brand_id": null,
"category": "Some category 76",
"customer": "Company 341",
"customer_id": "00000000-0000-0000-0000-000000000156",
"default_unit_cost": null,
"default_unit_price": 1.0,
"default_wholesale_price": null,
"delivery_date": null,
"delivery_date_utc": null,
"due_date": "2026-08-14T04:20:56.756983",
"due_date_utc": "2026-08-14T11:20:56.756983Z",
"group": "Product Group 67",
"invoice_numbers": null,
"line_item_id": "a38bf9f3-ef9d-4584-97ae-200752dbfc7d",
"order_date": "2026-07-01T05:00:00.000000",
"order_date_utc": "2026-07-01T12:00:00.000000Z",
"order_id": "ba81b4d2-69cd-4f4d-8f51-45f8723d6855",
"order_item_price": 10.0,
"order_number": "SO-2",
"product": "P2",
"product_id": "c552e621-20f8-48c2-ba24-9faaac735be2",
"product_sku": "sku 153",
"quantity": 1,
"returned_quantity": 0,
"sales_rep": null,
"status": "PENDING",
"subcategory": "Some subcategory 67",
"upc": null,
"vendor": "Acme Vendor",
"vendor_id": "00000000-0000-0000-0000-000000000069"
},
{
"batch_number": null,
"brand": null,
"brand_id": null,
"category": "Some category 71",
"customer": "Company 331",
"customer_id": "00000000-0000-0000-0000-00000000014c",
"default_unit_cost": null,
"default_unit_price": 1.0,
"default_wholesale_price": null,
"delivery_date": null,
"delivery_date_utc": null,
"due_date": "2026-08-14T04:20:56.729977",
"due_date_utc": "2026-08-14T11:20:56.729977Z",
"group": "Product Group 66",
"invoice_numbers": null,
"line_item_id": "8be7a863-fdd3-438b-aa39-940fa9ab16f4",
"order_date": "2026-07-01T05:00:00.000000",
"order_date_utc": "2026-07-01T12:00:00.000000Z",
"order_id": "78db6a8c-9dfb-4436-90b8-39c80582c006",
"order_item_price": 10.0,
"order_number": "SO-1",
"product": "P1",
"product_id": "2b6ea7bb-6ee8-4490-bbc4-285c936d5ffd",
"product_sku": "sku 150",
"quantity": 3,
"returned_quantity": 0,
"sales_rep": null,
"status": "COMPLETED",
"subcategory": "Some subcategory 66",
"upc": null,
"vendor": "Acme Vendor",
"vendor_id": "00000000-0000-0000-0000-000000000069"
},
{
"batch_number": null,
"brand": null,
"brand_id": null,
"category": "Some category 76",
"customer": "Company 331",
"customer_id": "00000000-0000-0000-0000-00000000014c",
"default_unit_cost": null,
"default_unit_price": 1.0,
"default_wholesale_price": null,
"delivery_date": null,
"delivery_date_utc": null,
"due_date": "2026-08-14T04:20:56.729977",
"due_date_utc": "2026-08-14T11:20:56.729977Z",
"group": "Product Group 67",
"invoice_numbers": null,
"line_item_id": "19fa7d26-2a22-4fcc-98a2-b861d8016bf4",
"order_date": "2026-07-01T05:00:00.000000",
"order_date_utc": "2026-07-01T12:00:00.000000Z",
"order_id": "78db6a8c-9dfb-4436-90b8-39c80582c006",
"order_item_price": 10.0,
"order_number": "SO-1",
"product": "P2",
"product_id": "c552e621-20f8-48c2-ba24-9faaac735be2",
"product_sku": "sku 153",
"quantity": 5,
"returned_quantity": 0,
"sales_rep": null,
"status": "COMPLETED",
"subcategory": "Some subcategory 67",
"upc": null,
"vendor": "Acme Vendor",
"vendor_id": "00000000-0000-0000-0000-000000000069"
}
],
"meta": {
"columns": [
{
"key": "line_item_id",
"label": "Line Item Id"
},
{
"key": "order_id",
"label": "Order Id"
},
{
"key": "order_date",
"label": "Order Date"
},
{
"key": "order_date_utc",
"label": "Order Date (UTC)"
},
{
"key": "delivery_date",
"label": "Delivery Date"
},
{
"key": "delivery_date_utc",
"label": "Delivery Date (UTC)"
},
{
"key": "due_date",
"label": "Due Date"
},
{
"key": "due_date_utc",
"label": "Due Date (UTC)"
},
{
"key": "order_number",
"label": "Order Number"
},
{
"key": "status",
"label": "Status"
},
{
"key": "product",
"label": "Product"
},
{
"key": "product_id",
"label": "Product Id"
},
{
"key": "product_sku",
"label": "Product SKU"
},
{
"key": "default_unit_cost",
"label": "Default Unit Cost"
},
{
"key": "default_unit_price",
"label": "Default Unit Price"
},
{
"key": "default_wholesale_price",
"label": "Default Wholesale Price"
},
{
"key": "brand",
"label": "Brand"
},
{
"key": "brand_id",
"label": "Brand Id"
},
{
"key": "vendor",
"label": "Vendor"
},
{
"key": "vendor_id",
"label": "Vendor Id"
},
{
"key": "order_item_price",
"label": "Order Item Price"
},
{
"key": "returned_quantity",
"label": "Returned Quantity"
},
{
"key": "quantity",
"label": "Quantity"
},
{
"key": "category",
"label": "Category"
},
{
"key": "subcategory",
"label": "Subcategory"
},
{
"key": "group",
"label": "Group"
},
{
"key": "customer",
"label": "Customer"
},
{
"key": "customer_id",
"label": "Customer Id"
},
{
"key": "sales_rep",
"label": "Sales Rep"
},
{
"key": "invoice_numbers",
"label": "Invoice Numbers"
},
{
"key": "upc",
"label": "UPC"
},
{
"key": "batch_number",
"label": "Batch Number"
}
],
"date_range": "May 31, 2026 to Jul 31, 2026",
"report": "sales_order_item_history"
}
}
Returns one row per sales order line item with its order dates, product, brand, vendor, customer, status, quantities, and prices. When no date filter is provided, the report defaults to the last 30 days.
Every value is returned as it appears in the report's CSV export, with numeric cells (quantities, prices) parsed into numbers. Companies on a compliance integration (Metrc or BioTrack) get additional package, potency, manifest, and shipped-from-license columns, and any Order custom fields configured for the company are appended as extra columns. Report-level information (the resolved date range and column definitions) is returned under meta.
Required permission: reports_permissions_sales_order_item_history.
Request
GET /public/v1/reports/sales-order-item-history
Parameters
| Parameter | Description | In | Type | Required | Default | Example |
|---|---|---|---|---|---|---|
| status | Filter by sales order status | query | array | false | ["COMPLETED","DELIVERED"] | |
| payment_status | Filter by payment status | query | array | false | ["FULLY_PAID"] | |
| order_source | Filter by the source that created the order | query | array | false | ||
| sample | Filter line items by whether they are samples | query | string | false | ||
| trade_sample_packages | Filter line items by whether their package is a trade sample | query | string | false | ||
| order_datetime | Filter by order date range (comma-separated ISO8601 range) | query | string | false | 2026-01-01T00:00:00Z,2026-02-01T00:00:00Z | |
| delivery_datetime | Filter by delivery date range | query | string | false | ||
| due_datetime | Filter by due date range | query | string | false | ||
| created_datetime | Filter by the datetime the order was created | query | string | false | ||
| updated_datetime | Filter by the datetime the order was last modified | query | string | false | ||
| total | Filter by order total range (comma-separated min,max) | query | string | false | 100,500 | |
| matched_with_compliance_transfer | Filter by whether the order is matched with a compliance transfer | query | boolean | false | ||
| search | Search by order number, customer name, or LeafLink short ID | query | string | false | ||
| company_relationship_ids | Filter by customer (company relationship) IDs | query | array | false | ||
| company_relationship_group_ids | Filter by customer group IDs | query | array | false | ||
| shipped_from_license_ids | Filter by the shipped-from license IDs | query | array | false | ||
| menu_ids | Filter by menu IDs | query | array | false | ||
| brand_ids | Filter by brand IDs | query | array | false | ||
| owner_ids | Filter by order owner (user) IDs | query | array | false | ||
| creator_ids | Filter by order creator (user) IDs | query | array | false | ||
| batch_ids | Filter by batch IDs | query | array | false | ||
| product_ids | Filter by product IDs | query | array | false | ||
| product_group_ids | Filter line items by product group IDs | query | array | false |
Responses
| Status | Description | Schema |
|---|---|---|
| 200 | The Sales Order Item History report | SalesOrderItemHistoryReport |
Get the Sales Order Tax report
GET /public/v1/reports/sales-order-tax returns tax totals as {data, meta}, narrowed by the applied filters
GET /public/v1/reports/sales-order-tax?order_datetime=2026-06-01T00%3A00%3A00Z%2C2026-08-01T00%3A00%3A00Z
content-type: application/json
accept: application/json
authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJhdWQiOiJEaXN0cnUiLCJleHAiOjE4MTgxNTYwNTQsImlhdCI6MTc4NjcwNjQ1NCwiaXNzIjoiRGlzdHJ1IiwianRpIjoiNDVkMDMxNzEtMGQ1YS00MDc1LTg2YTAtMjJjMmRmNjIwMDk4IiwibW9iaWxlIjpmYWxzZSwibmJmIjoxNzg2NzA2NDUzLCJwbGF0Zm9ybSI6IkFQSSIsInN1YiI6IlVzZXI6MTUiLCJ0eXAiOiJhY2Nlc3MifQ.YQOKwUFboILEh4iYYKbKHuO9ji9hNUQ7UnWdEpkF628
Response
200
content-type: application/json; charset=utf-8
cache-control: max-age=0, private, must-revalidate
b3: 4d606ce37587e7bec833e2d11deedb67-75552fb17df9e745-0
{
"data": [
{
"tax_rate": 5.0,
"tax_type": "City Tax",
"total_tax": 20.0
},
{
"tax_rate": 27.0,
"tax_type": "Excise Tax",
"total_tax": 1099.0
}
],
"meta": {
"columns": [
{
"key": "tax_type",
"label": "Tax Type"
},
{
"key": "tax_rate",
"label": "Tax Rate"
},
{
"key": "total_tax",
"label": "Total Tax"
}
],
"date_range": "May 31, 2026 to Jul 31, 2026",
"report": "sales_order_tax"
}
}
Returns total tax collected on sales orders, grouped by tax type and rate. When no date filter is provided, the report defaults to the last 30 days.
Every value is returned as it appears in the report's CSV export, with numeric cells (rates, amounts) parsed into numbers. Report-level information (the resolved date range and column definitions) is returned under meta.
Required permission: reports_permissions_sales_order_tax.
Request
GET /public/v1/reports/sales-order-tax
Parameters
| Parameter | Description | In | Type | Required | Default | Example |
|---|---|---|---|---|---|---|
| status | Filter by sales order status | query | array | false | ["COMPLETED","DELIVERED"] | |
| payment_status | Filter by payment status | query | array | false | ["FULLY_PAID"] | |
| order_source | Filter by the source that created the order | query | array | false | ||
| order_datetime | Filter by order date range (comma-separated ISO8601 range) | query | string | false | 2026-01-01T00:00:00Z,2026-02-01T00:00:00Z | |
| delivery_datetime | Filter by delivery date range | query | string | false | ||
| due_datetime | Filter by due date range | query | string | false | ||
| created_datetime | Filter by the datetime the order was created | query | string | false | ||
| updated_datetime | Filter by the datetime the order was last modified | query | string | false | ||
| total | Filter by order total range (comma-separated min,max) | query | string | false | 100,500 | |
| matched_with_compliance_transfer | Filter by whether the order is matched with a compliance transfer | query | boolean | false | ||
| search | Search by order number, customer name, or LeafLink short ID | query | string | false | ||
| company_relationship_ids | Filter by customer (company relationship) IDs | query | array | false | ||
| company_relationship_group_ids | Filter by customer group IDs | query | array | false | ||
| shipped_from_license_ids | Filter by the shipped-from license IDs | query | array | false | ||
| menu_ids | Filter by menu IDs | query | array | false | ||
| brand_ids | Filter by brand IDs | query | array | false | ||
| owner_ids | Filter by order owner (user) IDs | query | array | false | ||
| creator_ids | Filter by order creator (user) IDs | query | array | false | ||
| batch_ids | Filter by batch IDs | query | array | false | ||
| product_ids | Filter by product IDs | query | array | false | ||
| tax_ids | Filter by tax IDs | query | array | false |
Responses
| Status | Description | Schema |
|---|---|---|
| 200 | The Sales Order Tax report | SalesOrderTaxReport |
Returns
Get a return
GET /public/v1/returns/:id returns a single return
GET /public/v1/returns/00000000-0000-0000-0000-000000000012
content-type: application/json
accept: application/json
authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJhdWQiOiJEaXN0cnUiLCJleHAiOjE4MTgxNTYwNTYsImlhdCI6MTc4NjcwNjQ1NiwiaXNzIjoiRGlzdHJ1IiwianRpIjoiZmU4YmVkZmUtNmUzYi00NjZjLWFkYjUtZWVjMjVkZjI5NWQyIiwibW9iaWxlIjpmYWxzZSwibmJmIjoxNzg2NzA2NDU1LCJwbGF0Zm9ybSI6IkFQSSIsInN1YiI6IlVzZXI6NDcwIiwidHlwIjoiYWNjZXNzIn0.TZexXIVs33CfViBS-PB05GhKwiVgBD4UDh08ebQKKFY
Response
200
content-type: application/json; charset=utf-8
cache-control: max-age=0, private, must-revalidate
b3: 7524550ccd44ceab27882207397bed9f-cdbb8c4d38271b90-0
{
"data": {
"company": {
"id": "00000000-0000-0000-0000-000000000084",
"name": "Company 388",
"updated_datetime": "2026-08-14T11:20:56.983143Z"
},
"custom_data": {},
"description": null,
"id": "00000000-0000-0000-0000-000000000012",
"inserted_datetime": "2026-08-14T11:20:56.989981Z",
"invoice_numbers": [],
"items": [
{
"id": "00000000-0000-0000-0000-000000000013",
"price": 30.1,
"product": {
"id": "c022b4c0-736e-45e3-b392-d1c91baaf60a",
"name": "Product 188",
"sku": "sku 189",
"updated_datetime": "2026-08-14T11:20:56.974133Z"
},
"quantity": 5.0,
"waste": false
}
],
"location": {
"address": "123 Fake Street, Beverly Hills, CA 90210, US",
"company_id": "00000000-0000-0000-0000-00000000017c",
"id": "00000000-0000-0000-0000-0000000000a4",
"license_id": null,
"name": "Place 163"
},
"order_id": null,
"order_number": null,
"order_quantity": null,
"owner": {
"banned": false,
"deleted_at": null,
"email": "owner-473@example.com",
"full_name": "FirstName940 LastName941",
"id": "00000000-0000-0000-0000-0000000001d9",
"role": {
"id": "00000000-0000-0000-0000-0000000001e5",
"name": "Admin 484"
}
},
"return_datetime": "2026-08-14T11:20:56.989625Z",
"return_number": "RN-17",
"return_quantity": null,
"return_type": null,
"status": "PROCESSING",
"total": 32.0,
"updated_datetime": "2026-08-14T11:20:56.989981Z"
}
}
Get a single return given the ID.
Required permission: returns_permissions_view.
Request
GET /public/v1/returns/{id}
Parameters
| Parameter | Description | In | Type | Required | Default | Example |
|---|---|---|---|---|---|---|
| id | Return ID | path | string | true |
Responses
| Status | Description | Schema |
|---|---|---|
| 200 | A single return | Return |
| 404 | Not Found |
Get returns
GET /public/v1/returns returns returns related to the company
GET /public/v1/returns
content-type: application/json
accept: application/json
authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJhdWQiOiJEaXN0cnUiLCJleHAiOjE4MTgxNTYwNTcsImlhdCI6MTc4NjcwNjQ1NywiaXNzIjoiRGlzdHJ1IiwianRpIjoiODA4NDA4ZTktYWRlNS00NDQ5LTk0MzktNzhhOGY1MDdlMzRmIiwibW9iaWxlIjpmYWxzZSwibmJmIjoxNzg2NzA2NDU2LCJwbGF0Zm9ybSI6IkFQSSIsInN1YiI6IlVzZXI6NzEzIiwidHlwIjoiYWNjZXNzIn0.1NkGa1_usF0H-s84PH6vfMyq1GlE8wAqKF2PriNbrAo
Response
200
content-type: application/json; charset=utf-8
cache-control: max-age=0, private, must-revalidate
b3: fc8afd79f929956a3a10ed6348a0872a-555ef5c0ecb2ae15-0
{
"data": [
{
"company": {
"id": "00000000-0000-0000-0000-0000000000ce",
"name": "Company 562",
"updated_datetime": "2026-08-14T11:20:57.887604Z"
},
"custom_data": {
"28": "Custom Field Value"
},
"description": null,
"id": "00000000-0000-0000-0000-000000000018",
"inserted_datetime": "2026-08-14T11:20:57.895034Z",
"invoice_numbers": [],
"items": [
{
"id": "00000000-0000-0000-0000-000000000019",
"price": 30.1,
"product": {
"id": "83b2830b-3fcd-461c-b66b-7ce0d7e5ebe5",
"name": "Product 277",
"sku": "sku 278",
"updated_datetime": "2026-08-14T11:20:57.877411Z"
},
"quantity": 5.0,
"waste": false
}
],
"location": {
"address": "123 Fake Street, Beverly Hills, CA 90210, US",
"company_id": "00000000-0000-0000-0000-00000000021d",
"id": "00000000-0000-0000-0000-0000000000d6",
"license_id": null,
"name": "Place 213"
},
"order_id": null,
"order_number": null,
"order_quantity": null,
"owner": {
"banned": false,
"deleted_at": null,
"email": "owner-717@example.com",
"full_name": "FirstName1434 LastName1435",
"id": "00000000-0000-0000-0000-0000000002cd",
"role": {
"id": "00000000-0000-0000-0000-0000000002e6",
"name": "Admin 741"
}
},
"return_datetime": "2024-12-12T20:26:19.297537Z",
"return_number": "RN-23",
"return_quantity": null,
"return_type": null,
"status": "PROCESSING",
"total": 150.5,
"updated_datetime": "2026-08-14T11:20:57.895034Z"
}
],
"next_page": null
}
Get returns sorted by their creation date and filtered by various attributes
Note: The page size for this endpoint is 1000 returns per page. This endpoint returns eventually consistent data, with changes taking up to 1 second to propagate in responses.
Required permission: returns_permissions_view.
Request
GET /public/v1/returns
Parameters
| Parameter | Description | In | Type | Required | Default | Example |
|---|---|---|---|---|---|---|
| inserted_datetime | Filter returns by their creation datetime | query | string | false | 2022-07-10T00:00:00Z, | |
| page | Pagination information | query | number | false | ?page[number]=1 | |
| return_datetime | Filter returns by their return datetime | query | string | false | 2022-07-10T00:00:00Z, | |
| updated_datetime | Filter returns by the datetime they were most recently modified | query | string | false | ,2022-07-10T00:00:00Z |
Responses
| Status | Description | Schema |
|---|---|---|
| 200 | A list of returns | Returns |
StockAdjustment
Get a stock adjustment
GET /public/v1/adjustments/:id returns a single stock adjustment
GET /public/v1/adjustments/00000000-0000-0000-0000-000000000006
content-type: application/json
accept: application/json
authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJhdWQiOiJEaXN0cnUiLCJleHAiOjE4MTgxNTYwNTcsImlhdCI6MTc4NjcwNjQ1NywiaXNzIjoiRGlzdHJ1IiwianRpIjoiNTc1Y2Q4NTItYTc3NC00NTc2LWE3ZDEtNjFhOTU3ZGE0NjEyIiwibW9iaWxlIjpmYWxzZSwibmJmIjoxNzg2NzA2NDU2LCJwbGF0Zm9ybSI6IkFQSSIsInN1YiI6IlVzZXI6Njg4IiwidHlwIjoiYWNjZXNzIn0.ljCHc74734esVtzLMrO0vUMtODRiDBfvdx4Gb-q1-Sg
Response
200
content-type: application/json; charset=utf-8
cache-control: max-age=0, private, must-revalidate
b3: fcac7bc5984c2c79f508803619e4f32b-e9b74c318da31c21-0
{
"data": {
"batch_id": "00000000-0000-0000-0000-00000000004a",
"completion_datetime": "2026-08-14T11:20:57.786626Z",
"compliance_quantity": null,
"compliance_unit_type": null,
"description": null,
"id": "00000000-0000-0000-0000-000000000006",
"inserted_datetime": "2026-08-14T11:20:57.788760Z",
"license_id": null,
"location_id": "00000000-0000-0000-0000-0000000000d1",
"owner_id": null,
"package_id": null,
"product_id": "10615e1c-d0bd-4431-9680-b261d671a716",
"quantity": "10",
"reason": "revaluation",
"total_cost": null,
"unit_cost": null,
"unit_type": {
"id": "00000000-0000-0000-0000-000000001995",
"name": "Gram"
}
}
}
Get a single stock adjustment given the ID.
Required permission: products_permissions_view.
Request
GET /public/v1/adjustments/{id}
Parameters
| Parameter | Description | In | Type | Required | Default | Example |
|---|---|---|---|---|---|---|
| id | Stock Adjustment ID | path | string | true |
Responses
| Status | Description | Schema |
|---|---|---|
| 200 | A single stock adjustment | StockAdjustment |
| 404 | Not Found |
Get adjustments
GET /public/v1/adjustments returns proper data for stock adjustments of product/batch/package tracked
GET /public/v1/adjustments
content-type: application/json
accept: application/json
authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJhdWQiOiJEaXN0cnUiLCJleHAiOjE4MTgxNTYwNTksImlhdCI6MTc4NjcwNjQ1OSwiaXNzIjoiRGlzdHJ1IiwianRpIjoiODM5MGNkZTUtODljZS00YWM1LTk5YzgtNWNkZGRlYzMyZTcxIiwibW9iaWxlIjpmYWxzZSwibmJmIjoxNzg2NzA2NDU4LCJwbGF0Zm9ybSI6IkFQSSIsInN1YiI6IlVzZXI6MTE4NSIsInR5cCI6ImFjY2VzcyJ9.dLhvsdQOd_vvQDpXCRj7TtIb8QPa57NMxahT5meYSbo
Response
200
content-type: application/json; charset=utf-8
cache-control: max-age=0, private, must-revalidate
b3: 59bbe966d2fb6e364b9f2b8b67242600-12165063d7bbf4b8-0
{
"data": [
{
"batch_id": null,
"completion_datetime": "2026-08-14T11:20:59.425365Z",
"compliance_quantity": null,
"compliance_unit_type": null,
"description": null,
"id": "00000000-0000-0000-0000-000000000010",
"inserted_datetime": "2026-08-14T11:20:59.427111Z",
"license_id": null,
"location_id": null,
"owner_id": "00000000-0000-0000-0000-0000000004a1",
"package_id": null,
"product_id": "92101a96-85a6-41ea-85d7-ddeef6fd983d",
"quantity": "10",
"reason": "revaluation",
"total_cost": "10000",
"unit_cost": "1000",
"unit_type": {
"id": "00000000-0000-0000-0000-000000002d3a",
"name": "Gram"
}
},
{
"batch_id": null,
"completion_datetime": "2026-08-14T11:20:59.644554Z",
"compliance_quantity": "1",
"compliance_unit_type": {
"id": "00000000-0000-0000-0000-000000002d3c",
"name": "Ounce"
},
"description": "A default note describing this transaction",
"id": "00000000-0000-0000-0000-000000000011",
"inserted_datetime": "2026-08-14T11:20:59.650347Z",
"license_id": "00000000-0000-0000-0000-000000000032",
"location_id": "00000000-0000-0000-0000-000000000144",
"owner_id": null,
"package_id": "00000000-0000-0000-0000-00000000002e",
"product_id": "fe0554ce-f126-4116-afa5-baddfb1a33cf",
"quantity": "1",
"reason": "Voluntary Surrender",
"total_cost": "900",
"unit_cost": "900",
"unit_type": {
"id": "00000000-0000-0000-0000-000000002d3c",
"name": "Ounce"
}
},
{
"batch_id": "00000000-0000-0000-0000-00000000011e",
"completion_datetime": "2026-08-14T11:20:59.762223Z",
"compliance_quantity": null,
"compliance_unit_type": null,
"description": null,
"id": "00000000-0000-0000-0000-000000000012",
"inserted_datetime": "2026-08-14T11:20:59.763585Z",
"license_id": null,
"location_id": "00000000-0000-0000-0000-000000000135",
"owner_id": null,
"package_id": null,
"product_id": "acffae75-edb4-4bda-990a-632a07ceb058",
"quantity": "1",
"reason": "revaluation",
"total_cost": "-800",
"unit_cost": "-800",
"unit_type": {
"id": "00000000-0000-0000-0000-000000002d3a",
"name": "Gram"
}
}
],
"next_page": null
}
Get stock adjustments sorted by their creation date and filtered by various attributes
Note: The page size for this endpoint is 5000 stock adjustments per page. This endpoint returns eventually consistent data, with changes taking up to 1 second to propagate in responses.
Required permission: products_permissions_view.
Request
GET /public/v1/adjustments
Parameters
| Parameter | Description | In | Type | Required | Default | Example |
|---|---|---|---|---|---|---|
| inserted_datetime | Filter stock adjustments by their creation datetime | query | string | false | 2022-07-10T00:00:00Z, | |
| completion_datetime | Filter stock adjustments by their completion datetime (adjustment date) | query | string | false | 2022-07-10T00:00:00Z, | |
| page | Pagination information | query | number | false | ?page[number]=1 |
Responses
| Status | Description | Schema |
|---|---|---|
| 200 | A list of stock adjustments | StockAdjustments |
Insert a stock adjustment
POST /public/v1/adjustments creates an adjustment for a product tracked product
POST /public/v1/adjustments
content-type: application/json
accept: application/json
authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJhdWQiOiJEaXN0cnUiLCJleHAiOjE4MTgxNTYwNTgsImlhdCI6MTc4NjcwNjQ1OCwiaXNzIjoiRGlzdHJ1IiwianRpIjoiZWQzODViMGMtYjUxMS00NmIxLWExYzEtMzg2OTYzMWRlMTk1IiwibW9iaWxlIjpmYWxzZSwibmJmIjoxNzg2NzA2NDU3LCJwbGF0Zm9ybSI6IkFQSSIsInN1YiI6IlVzZXI6OTIyIiwidHlwIjoiYWNjZXNzIn0._ZW1rzreBfPnhALXKL6sF2LHRuF_iJbFmLWDZl22JKw
{
"completion_datetime": "2020-01-03T12:20:00.000000Z",
"description": "test",
"location_id": "00000000-0000-0000-0000-00000000010a",
"product_id": "7b87a4aa-e4f3-438d-ad8d-615ff2c8e897",
"quantity": 10,
"reason": "expired"
}
Response
200
content-type: application/json; charset=utf-8
cache-control: max-age=0, private, must-revalidate
b3: 084c86015930d3b469953ba7e93fecd6-03de9f7508061405-0
{
"data": {
"batch_id": null,
"completion_datetime": "2020-01-03T12:20:00.000000Z",
"compliance_quantity": null,
"compliance_unit_type": null,
"description": "test",
"id": "00000000-0000-0000-0000-00000000000e",
"inserted_datetime": "2026-08-14T11:20:58.629001Z",
"license_id": null,
"location_id": "00000000-0000-0000-0000-00000000010a",
"owner_id": null,
"package_id": null,
"product_id": "7b87a4aa-e4f3-438d-ad8d-615ff2c8e897",
"quantity": "10",
"reason": "expired",
"total_cost": null,
"unit_cost": null,
"unit_type": {
"id": "00000000-0000-0000-0000-0000000022d2",
"name": "Gram"
}
}
}
POST /public/v1/adjustments creates an adjustment for a batch tracked product
POST /public/v1/adjustments
content-type: application/json
accept: application/json
authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJhdWQiOiJEaXN0cnUiLCJleHAiOjE4MTgxNTYwNjAsImlhdCI6MTc4NjcwNjQ2MCwiaXNzIjoiRGlzdHJ1IiwianRpIjoiY2I2NWU1MTItMGUxYS00Y2ZkLTlhNjEtNGJmNWE3NmE4NmNhIiwibW9iaWxlIjpmYWxzZSwibmJmIjoxNzg2NzA2NDU5LCJwbGF0Zm9ybSI6IkFQSSIsInN1YiI6IlVzZXI6MTYzMyIsInR5cCI6ImFjY2VzcyJ9.bxxv9pbovmgWyS02fMHze4L8KBAFEW_D1TebbtNtPCA
{
"batch_id": "00000000-0000-0000-0000-00000000016c",
"completion_datetime": "2020-01-03T12:20:00.000000Z",
"description": "test",
"location_id": "00000000-0000-0000-0000-000000000174",
"quantity": 10,
"reason": "expired",
"unit_cost": 1000
}
Response
200
content-type: application/json; charset=utf-8
cache-control: max-age=0, private, must-revalidate
b3: 005369ec17c75d3290e6e21b0487b04d-4842d34b798148ee-0
{
"data": {
"batch_id": "00000000-0000-0000-0000-00000000016c",
"completion_datetime": "2020-01-03T12:20:00.000000Z",
"compliance_quantity": null,
"compliance_unit_type": null,
"description": "test",
"id": "00000000-0000-0000-0000-000000000023",
"inserted_datetime": "2026-08-14T11:21:00.456373Z",
"license_id": null,
"location_id": "00000000-0000-0000-0000-000000000174",
"owner_id": null,
"package_id": null,
"product_id": "c5c8e4f2-cda6-4a23-88e0-14bd64f21d56",
"quantity": "10",
"reason": "expired",
"total_cost": "10000",
"unit_cost": "1000",
"unit_type": {
"id": "00000000-0000-0000-0000-000000003c0e",
"name": "Gram"
}
}
}
POST /public/v1/adjustments creates an adjustment for a package tracked product
POST /public/v1/adjustments
content-type: application/json
accept: application/json
authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJhdWQiOiJEaXN0cnUiLCJleHAiOjE4MTgxNTYwNTYsImlhdCI6MTc4NjcwNjQ1NiwiaXNzIjoiRGlzdHJ1IiwianRpIjoiODQ2NDc0MjktODY5YS00ZDM0LTkwOWEtNGFlNWFhZGQ5NmY1IiwibW9iaWxlIjpmYWxzZSwibmJmIjoxNzg2NzA2NDU1LCJwbGF0Zm9ybSI6IkFQSSIsInN1YiI6IlVzZXI6Mjk0IiwidHlwIjoiYWNjZXNzIn0.EQ0kcIWsgS_400dPsnPqs2RFA9oqVd0TUv5HVLaBxuc
{
"completion_datetime": "2020-01-03T12:20:00.000000Z",
"compliance_quantity": 10,
"description": "test",
"package_id": "00000000-0000-0000-0000-00000000000d",
"reason": "Damage (BCC)",
"unit_cost": 1000
}
Response
200
content-type: application/json; charset=utf-8
cache-control: max-age=0, private, must-revalidate
b3: c36b627c27796c63e6748155ceae6961-205ec5a23fea4a20-0
{
"data": {
"batch_id": null,
"completion_datetime": "2020-01-03T12:20:00.000000Z",
"compliance_quantity": "10",
"compliance_unit_type": {
"id": "00000000-0000-0000-0000-000000000b7f",
"name": "Ounce"
},
"description": "test",
"id": "00000000-0000-0000-0000-000000000004",
"inserted_datetime": "2026-08-14T11:20:57.277802Z",
"license_id": "00000000-0000-0000-0000-00000000000e",
"location_id": "00000000-0000-0000-0000-000000000074",
"owner_id": null,
"package_id": "00000000-0000-0000-0000-00000000000d",
"product_id": "df15d15c-ab3a-48cc-bc84-0322125a89b8",
"quantity": "0.35274",
"reason": "Damage (BCC)",
"total_cost": "10000.000000005834",
"unit_cost": "1000.0000000005834",
"unit_type": {
"id": "00000000-0000-0000-0000-000000000b7d",
"name": "Gram"
}
}
}
POST /public/v1/adjustments pointer translation works as intended
POST /public/v1/adjustments
content-type: application/json
accept: application/json
authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJhdWQiOiJEaXN0cnUiLCJleHAiOjE4MTgxNTYwNTksImlhdCI6MTc4NjcwNjQ1OSwiaXNzIjoiRGlzdHJ1IiwianRpIjoiM2JlYTc0YWUtZjUxMS00N2IyLWFjMmQtZmZkZjY1YWJkZTUxIiwibW9iaWxlIjpmYWxzZSwibmJmIjoxNzg2NzA2NDU4LCJwbGF0Zm9ybSI6IkFQSSIsInN1YiI6IlVzZXI6MTQ5NyIsInR5cCI6ImFjY2VzcyJ9.lgnrfvcWqaEhJNmBNssN64KZBcxRtg4azTk-XjwMZfs
{
"description": "test",
"package_id": "00000000-0000-0000-0000-000000000035",
"quantity": 10,
"reason": "Damage (BCC)"
}
Response
400
cache-control: max-age=0, private, must-revalidate
content-type: application/json; charset=utf-8
b3: 8532eb7bcabb652fce03afbc964c3044-1a8a6611881a446d-0
{
"errors": [
{
"context": {},
"message": "can't be blank",
"pointer": [
"completion_datetime"
],
"section": "body"
},
{
"context": {},
"message": "Required for adjustments of package tracked products",
"pointer": [
"compliance_quantity"
],
"section": "body"
},
{
"context": {},
"message": "Cannot be set for adjustments of package tracked products",
"pointer": [
"quantity"
],
"section": "body"
}
]
}
POST /public/v1/adjustments pointer translation works for cost accounting as well
POST /public/v1/adjustments
content-type: application/json
accept: application/json
authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJhdWQiOiJEaXN0cnUiLCJleHAiOjE4MTgxNTYwNTgsImlhdCI6MTc4NjcwNjQ1OCwiaXNzIjoiRGlzdHJ1IiwianRpIjoiOWFkZDFhODUtMTA3MC00ZDY3LWI0ZDgtOGJmODczNWJmYWEzIiwibW9iaWxlIjpmYWxzZSwibmJmIjoxNzg2NzA2NDU3LCJwbGF0Zm9ybSI6IkFQSSIsInN1YiI6IlVzZXI6ODQxIiwidHlwIjoiYWNjZXNzIn0.GEVkvz7txsFOLCsdX2DrpVtkG6gpzIjLc0WgyOHIjiw
{
"completion_datetime": "2020-01-03T12:20:00.000000Z",
"description": "test",
"location_id": "00000000-0000-0000-0000-0000000000f4",
"product_id": "4ff75447-0a4e-4b61-bf80-6dc59cc5166d",
"quantity": 10,
"reason": "expired"
}
Response
400
cache-control: max-age=0, private, must-revalidate
content-type: application/json; charset=utf-8
b3: f7af40aada0f965e9272322bf37a4931-63b01b4da68a37be-0
{
"errors": [
{
"context": {},
"message": "Your company cost settings require a cost to be set when adding quantity",
"pointer": [
"unit_cost"
],
"section": "body"
}
]
}
POST /public/v1/adjustments validates quantity for non-compliance adjustments
POST /public/v1/adjustments
content-type: application/json
accept: application/json
authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJhdWQiOiJEaXN0cnUiLCJleHAiOjE4MTgxNTYwNjEsImlhdCI6MTc4NjcwNjQ2MSwiaXNzIjoiRGlzdHJ1IiwianRpIjoiN2IyMjYwNzYtMmNkZS00YzczLTkwZmEtY2EzNmJkYWZiZTkyIiwibW9iaWxlIjpmYWxzZSwibmJmIjoxNzg2NzA2NDYwLCJwbGF0Zm9ybSI6IkFQSSIsInN1YiI6IlVzZXI6MTkxOSIsInR5cCI6ImFjY2VzcyJ9.Nb3d6-sUzijJUpzIKox22qm7Bj0I__f65GQ2Dizmu6g
{
"completion_datetime": "2020-01-03T12:20:00.000000Z",
"compliance_quantity": 10,
"description": "test",
"location_id": "00000000-0000-0000-0000-0000000001a6",
"product_id": "ab24f6f1-eb72-49b7-9d9a-ca28f00ecc30",
"reason": "expired"
}
Response
400
cache-control: max-age=0, private, must-revalidate
content-type: application/json; charset=utf-8
b3: e7cda0bb77ad6fb66743bbc05df060e6-792169b8808e3c7d-0
{
"errors": [
{
"context": {},
"message": "Cannot be set for adjustments of non-package tracked products",
"pointer": [
"compliance_quantity"
],
"section": "body"
},
{
"context": {},
"message": "Required for adjustments of non-package tracked products",
"pointer": [
"quantity"
],
"section": "body"
}
]
}
validates only one id can be passed
POST /public/v1/adjustments
content-type: application/json
accept: application/json
authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJhdWQiOiJEaXN0cnUiLCJleHAiOjE4MTgxNTYwNjEsImlhdCI6MTc4NjcwNjQ2MSwiaXNzIjoiRGlzdHJ1IiwianRpIjoiYzY5NGEwMWQtOTViYy00YjYwLTljNzktYmViOTVhODllZjRlIiwibW9iaWxlIjpmYWxzZSwibmJmIjoxNzg2NzA2NDYwLCJwbGF0Zm9ybSI6IkFQSSIsInN1YiI6IlVzZXI6MTgyOCIsInR5cCI6ImFjY2VzcyJ9.0Q__ph5o8GMdElpTLJiLEwDbm7x-rd9xjVsVCBZ_fdQ
{
"batch_id": "339a3052-6cc3-47bf-957d-611c20fa4d76",
"completion_datetime": "2020-01-03T12:20:00.000000Z",
"description": "test",
"location_id": "a5e07ff5-77b2-4499-a343-dd3e5f16f107",
"package_id": "64f83bc0-5e4f-4ab9-bfe4-4efccd1d12a4",
"product_id": "f55c345a-0ecd-4adc-a93a-a27fb02abaf8",
"reason": "expired"
}
Response
400
cache-control: max-age=0, private, must-revalidate
content-type: application/json; charset=utf-8
b3: 979bac8aeab311eb80ad7014c8e294cc-2c69f63bb4e0af97-0
{
"errors": [
{
"context": {},
"message": "Only one of batch_id, package_id, or product_id can be set",
"pointer": [
"batch_id"
],
"section": "body"
},
{
"context": {},
"message": "Required for adjustments of package tracked products",
"pointer": [
"compliance_quantity"
],
"section": "body"
},
{
"context": {},
"message": "Cannot be set for adjustments of package tracked products because the source will automatically be set to the location of the package",
"pointer": [
"location_id"
],
"section": "body"
},
{
"context": {},
"message": "Only one of batch_id, package_id, or product_id can be set",
"pointer": [
"package_id"
],
"section": "body"
},
{
"context": {},
"message": "Only one of batch_id, package_id, or product_id can be set",
"pointer": [
"product_id"
],
"section": "body"
}
]
}
validates at least one id is passed
POST /public/v1/adjustments
content-type: application/json
accept: application/json
authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJhdWQiOiJEaXN0cnUiLCJleHAiOjE4MTgxNTYwNTksImlhdCI6MTc4NjcwNjQ1OSwiaXNzIjoiRGlzdHJ1IiwianRpIjoiNmY5YTFjYmYtMGI5OS00YmVjLTg2NTEtMDBlMzI5YTM3NmViIiwibW9iaWxlIjpmYWxzZSwibmJmIjoxNzg2NzA2NDU4LCJwbGF0Zm9ybSI6IkFQSSIsInN1YiI6IlVzZXI6MTEyMyIsInR5cCI6ImFjY2VzcyJ9.PrpDNcoErn7iOiJU2gNo3G-9raZBmrmIlEoCubbiidA
{
"completion_datetime": "2020-01-03T12:20:00.000000Z",
"description": "test",
"location_id": "102ec022-f542-4ee7-98dc-58838d8d3fa8",
"reason": "expired"
}
Response
400
cache-control: max-age=0, private, must-revalidate
content-type: application/json; charset=utf-8
b3: 4cfe4b12307f4f3d24e1d30c58e4dd58-820cac995f235231-0
{
"errors": [
{
"context": {},
"message": "At least one of batch_id, package_id, or product_id must be set",
"pointer": [
"batch_id"
],
"section": "body"
},
{
"context": {},
"message": "At least one of batch_id, package_id, or product_id must be set",
"pointer": [
"package_id"
],
"section": "body"
},
{
"context": {},
"message": "At least one of batch_id, package_id, or product_id must be set",
"pointer": [
"product_id"
],
"section": "body"
},
{
"context": {},
"message": "Required for adjustments of non-package tracked products",
"pointer": [
"quantity"
],
"section": "body"
}
]
}
validate waste must be negative
POST /public/v1/adjustments
content-type: application/json
accept: application/json
authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJhdWQiOiJEaXN0cnUiLCJleHAiOjE4MTgxNTYwNjEsImlhdCI6MTc4NjcwNjQ2MSwiaXNzIjoiRGlzdHJ1IiwianRpIjoiNDkxOTY5ZjAtZjE3Yy00MzJkLTk0NGMtNjkxMTJjNzVkOWM1IiwibW9iaWxlIjpmYWxzZSwibmJmIjoxNzg2NzA2NDYwLCJwbGF0Zm9ybSI6IkFQSSIsInN1YiI6IlVzZXI6MTkxNyIsInR5cCI6ImFjY2VzcyJ9.SaVDGo_v8mm8Fta-rkfHO4pnYsPN7OxRrPQdh7kLglo
{
"completion_datetime": "2020-01-03T12:20:00.000000Z",
"description": "test",
"location_id": "38b92430-f61f-4d2f-b480-5db392983290",
"product_id": "6ad1b255-92bf-45a5-82c2-dbaa98e8d61e",
"quantity": 10,
"reason": "waste"
}
Response
400
cache-control: max-age=0, private, must-revalidate
content-type: application/json; charset=utf-8
b3: 517fda80c8ea8e5dd79da83254a21181-50eaa9310a0a070c-0
{
"errors": [
{
"context": {},
"message": "Quantity must be negative for waste adjustments",
"pointer": [
"quantity"
],
"section": "body"
}
]
}
validate compliance adjustments must not include location_id
POST /public/v1/adjustments
content-type: application/json
accept: application/json
authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJhdWQiOiJEaXN0cnUiLCJleHAiOjE4MTgxNTYwNTgsImlhdCI6MTc4NjcwNjQ1OCwiaXNzIjoiRGlzdHJ1IiwianRpIjoiMzgzOWZmZTItODY4Yy00MjdmLTg1MDgtNjE0NTMzZDE1NWFhIiwibW9iaWxlIjpmYWxzZSwibmJmIjoxNzg2NzA2NDU3LCJwbGF0Zm9ybSI6IkFQSSIsInN1YiI6IlVzZXI6MTA1MCIsInR5cCI6ImFjY2VzcyJ9.IWEdhM0uoFbsJuk0NkiV6g_T2x3hKIG_rXBpQLK52-E
{
"completion_datetime": "2020-01-03T12:20:00.000000Z",
"compliance_quantity": 10,
"description": "test",
"location_id": "f2f9ecba-0940-4040-b175-3a845a6a981d",
"package_id": "4b8dce0c-081f-4bc4-b74e-55d5a4dd7235",
"reason": "compliance"
}
Response
400
cache-control: max-age=0, private, must-revalidate
content-type: application/json; charset=utf-8
b3: 4a49963bf052803adc29626dc5a6e39b-1db1a1ddda46f938-0
{
"errors": [
{
"context": {},
"message": "Cannot be set for adjustments of package tracked products because the source will automatically be set to the location of the package",
"pointer": [
"location_id"
],
"section": "body"
}
]
}
validate compliance adjustments must include location_id
POST /public/v1/adjustments
content-type: application/json
accept: application/json
authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJhdWQiOiJEaXN0cnUiLCJleHAiOjE4MTgxNTYwNTksImlhdCI6MTc4NjcwNjQ1OSwiaXNzIjoiRGlzdHJ1IiwianRpIjoiM2JjZTRlZjEtMjY3Yy00NGIxLTg1YzMtZTRlZjExYjg0OTMwIiwibW9iaWxlIjpmYWxzZSwibmJmIjoxNzg2NzA2NDU4LCJwbGF0Zm9ybSI6IkFQSSIsInN1YiI6IlVzZXI6MTA4NCIsInR5cCI6ImFjY2VzcyJ9.Ew4Ce7tiTeoNosePg3J67hAPtUN6JjALoD7xMsVB1ag
{
"completion_datetime": "2020-01-03T12:20:00.000000Z",
"description": "test",
"product_id": "18668bee-5f72-443d-b729-e68d2ece5853",
"quantity": 10,
"reason": "compliance"
}
Response
400
cache-control: max-age=0, private, must-revalidate
content-type: application/json; charset=utf-8
b3: a04bc85aeebc4d7f96815aa2a77632c7-eba435bde0dd7ae2-0
{
"errors": [
{
"context": {},
"message": "Source location is required for non-compliance adjustments",
"pointer": [
"location_id"
],
"section": "body"
}
]
}
validates product exists
POST /public/v1/adjustments
content-type: application/json
accept: application/json
authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJhdWQiOiJEaXN0cnUiLCJleHAiOjE4MTgxNTYwNjEsImlhdCI6MTc4NjcwNjQ2MSwiaXNzIjoiRGlzdHJ1IiwianRpIjoiODA5ZTAxYTAtMjNlYy00OGRkLTgxYWMtNmI1MWFlMDA0ZjhjIiwibW9iaWxlIjpmYWxzZSwibmJmIjoxNzg2NzA2NDYwLCJwbGF0Zm9ybSI6IkFQSSIsInN1YiI6IlVzZXI6MTgzMiIsInR5cCI6ImFjY2VzcyJ9.Hx-dWMkbBhs9U5wo8NKudpRc_Jmlbj3TWBWBMMmRgbo
{
"completion_datetime": "2020-01-03T12:20:00.000000Z",
"description": "test",
"location_id": "a3d02ebb-4e46-450c-810b-4589fcfaf93d",
"product_id": "eeaa2331-36db-4835-b024-89fba031ad57",
"quantity": 10,
"reason": "compliance"
}
Response
400
cache-control: max-age=0, private, must-revalidate
content-type: application/json; charset=utf-8
b3: 878e563bc69b40c2f2e89f82643a1183-91245fe5005cf778-0
{
"errors": [
{
"context": {},
"message": "Product not found",
"pointer": [
"product_id"
],
"section": "body"
}
]
}
validates batch exists
POST /public/v1/adjustments
content-type: application/json
accept: application/json
authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJhdWQiOiJEaXN0cnUiLCJleHAiOjE4MTgxNTYwNjAsImlhdCI6MTc4NjcwNjQ2MCwiaXNzIjoiRGlzdHJ1IiwianRpIjoiODViZDA5N2EtNjU4Yy00NTQ1LTg1ODQtM2Y5NTIzZDliN2NhIiwibW9iaWxlIjpmYWxzZSwibmJmIjoxNzg2NzA2NDU5LCJwbGF0Zm9ybSI6IkFQSSIsInN1YiI6IlVzZXI6MTYwNyIsInR5cCI6ImFjY2VzcyJ9.SVmIdTvY-SlNqFgajZ_k5u_yZKZBxCNDR2Lfl2p_L4w
{
"batch_id": "00000000-0000-0000-0000-000000000167",
"completion_datetime": "2020-01-03T12:20:00.000000Z",
"description": "test",
"location_id": "1c9932d5-a12f-4525-9414-d64555234337",
"quantity": 10,
"reason": "compliance"
}
Response
400
cache-control: max-age=0, private, must-revalidate
content-type: application/json; charset=utf-8
b3: 971a009014d953915afe61735c09ba84-4e3308f3b7af2c04-0
{
"errors": [
{
"context": {},
"message": "Batch not found",
"pointer": [
"batch_id"
],
"section": "body"
}
]
}
validates package exists
POST /public/v1/adjustments
content-type: application/json
accept: application/json
authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJhdWQiOiJEaXN0cnUiLCJleHAiOjE4MTgxNTYwNjAsImlhdCI6MTc4NjcwNjQ2MCwiaXNzIjoiRGlzdHJ1IiwianRpIjoiOGU0Y2ZjNTUtMzVlZi00ODgxLTk2MzMtOGQ1ZmNhYWVmMTcyIiwibW9iaWxlIjpmYWxzZSwibmJmIjoxNzg2NzA2NDU5LCJwbGF0Zm9ybSI6IkFQSSIsInN1YiI6IlVzZXI6MTU2MyIsInR5cCI6ImFjY2VzcyJ9.8AGFXr-I3lwzqxidiB-wu4cdE9p0EF14qyRfTpkismQ
{
"completion_datetime": "2020-01-03T12:20:00.000000Z",
"compliance_quantity": 10,
"description": "test",
"package_id": "00000000-0000-0000-0000-000000000038",
"reason": "compliance"
}
Response
400
cache-control: max-age=0, private, must-revalidate
content-type: application/json; charset=utf-8
b3: b7668f0348a773706594050fb2718004-6656e50d753c073c-0
{
"errors": [
{
"context": {},
"message": "Package not found",
"pointer": [
"package_id"
],
"section": "body"
}
]
}
validates location exists
POST /public/v1/adjustments
content-type: application/json
accept: application/json
authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJhdWQiOiJEaXN0cnUiLCJleHAiOjE4MTgxNTYwNjEsImlhdCI6MTc4NjcwNjQ2MSwiaXNzIjoiRGlzdHJ1IiwianRpIjoiNmI5ZGNiNDMtMjhmMi00NGI1LWI3N2UtOWRlM2Q4NGI3OTYxIiwibW9iaWxlIjpmYWxzZSwibmJmIjoxNzg2NzA2NDYwLCJwbGF0Zm9ybSI6IkFQSSIsInN1YiI6IlVzZXI6MTg5OCIsInR5cCI6ImFjY2VzcyJ9.oNkun4c1rvziGbtjkF0ersy9YHfIqn8hfqwLn13YcZM
{
"batch_id": "00000000-0000-0000-0000-0000000001af",
"completion_datetime": "2020-01-03T12:20:00.000000Z",
"description": "test",
"location_id": "00000000-0000-0000-0000-0000000001a0",
"quantity": 10,
"reason": "compliance"
}
Response
400
cache-control: max-age=0, private, must-revalidate
content-type: application/json; charset=utf-8
b3: 08586b8b25b2297c8fd2faf78d7b84b7-0c3001b0742262ed-0
{
"errors": [
{
"context": {},
"message": "Location not found",
"pointer": [
"location_id"
],
"section": "body"
}
]
}
Required permission: products_permissions_adjust_inventory.
Request
POST /public/v1/adjustments
Parameters
| Parameter | Description | In | Type | Required | Default | Example |
|---|---|---|---|---|---|---|
| product_id | The ID of the product to adjust. Must only be provided if the product is product-tracked. | query | string | false | ||
| batch_id | The ID of the batch to adjust. Must only be provided if the batch's associated product is batch-tracked. | query | string | false | ||
| package_id | The ID of the package to adjust. Must only be provided if the package's associated product is package-tracked. | query | string | false | ||
| quantity | The quantity to adjust the stock by. Must only be provided for non-compliance adjustments. Must be negative if the adjustment reason is 'waste'. | query | number | false | ||
| compliance_quantity | The quantity to adjust the stock by. Must only be provided for compliance adjustments. | query | number | false | ||
| description | The description of the stock adjustment. Required for compliance adjustmenst. Has a max length of 800 characters for non-compliance adjustments, and 250 characters for compliance adjustments. | query | string | false | ||
| unit_cost | The cost per unit of the stock adjustment. Can only be provided for companies with cost accounting enabled. Must be empty when the quantity is negative. Must be provided if the company setting 'Require Cost on Intake and Quantity Adjustments' is true. | query | number | false | ||
| completion_datetime | The datetime of the stock adjustment. Must only be provided for compliance adjustments. | query | string | false | ||
| reason | The reason for the stock adjustment. For non-compliance adjustments, must be one of the following: 'waste', 'stolen', 'damaged', 'fire', 'write-off', 'expired', 'lab-testing', 'revaluation', 'other.' For compliance adjustments, must be a reason that is accepted by the the compliance API | query | string | false | ||
| location_id | The ID of the source location of the stock adjustment. Must only be provided for non-compliance adjustments. | query | string | false |
Responses
| Status | Description | Schema |
|---|---|---|
| 200 | The stock adjustment was inserted successfully | StockAdjustment |
Strain
Create a strain
POST /public/v1/strains creates a strain
POST /public/v1/strains
content-type: application/json
accept: application/json
authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJhdWQiOiJEaXN0cnUiLCJleHAiOjE4MTgxNTYwNTcsImlhdCI6MTc4NjcwNjQ1NywiaXNzIjoiRGlzdHJ1IiwianRpIjoiOWIzZWIwYjItNmFkMS00Mjg1LTgyMmYtYzFkMDAxYTI0MWIwIiwibW9iaWxlIjpmYWxzZSwibmJmIjoxNzg2NzA2NDU2LCJwbGF0Zm9ybSI6IkFQSSIsInN1YiI6IlVzZXI6NjA4IiwidHlwIjoiYWNjZXNzIn0.MN5_-l_3QgjBQVwxbLIchDFLODOgA2yBLLpgwHOd3vI
{
"name": "Blue Dream",
"strain_type": "hybrid"
}
Response
201
content-type: application/json; charset=utf-8
cache-control: max-age=0, private, must-revalidate
b3: 7745d70d2423cffca7a697c64fde9aa1-9d31f5876baaa936-0
{
"data": {
"id": "00000000-0000-0000-0000-000000000012",
"name": "Blue Dream",
"strain_type": "HYBRID"
}
}
Create a new strain.
Required permission: settings_permissions_strains.
Request
POST /public/v1/strains
Parameters
| Parameter | Description | In | Type | Required | Default | Example |
|---|---|---|---|---|---|---|
| name | Name of the strain | query | string | true | ||
| strain_type | Type of strain (indica, indica_dominant, sativa, sativa_dominant, hybrid, high_cbd) | query | string | false |
Responses
| Status | Description | Schema |
|---|---|---|
| 201 | Strain created | Strain |
| 400 | Invalid parameters |
Get a strain
GET /public/v1/strains/:id returns a single strain
GET /public/v1/strains/00000000-0000-0000-0000-000000000018
content-type: application/json
accept: application/json
authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJhdWQiOiJEaXN0cnUiLCJleHAiOjE4MTgxNTYwNTcsImlhdCI6MTc4NjcwNjQ1NywiaXNzIjoiRGlzdHJ1IiwianRpIjoiMGFlOWYxZmItYjQzYS00OWZhLWI0MWUtMGIwNTEyOTRlOTVmIiwibW9iaWxlIjpmYWxzZSwibmJmIjoxNzg2NzA2NDU2LCJwbGF0Zm9ybSI6IkFQSSIsInN1YiI6IlVzZXI6NzE5IiwidHlwIjoiYWNjZXNzIn0.a9JNURj3Ry2JkDSJVDOgdYYWePoAcr55YiXFHk0Gr4Y
Response
200
content-type: application/json; charset=utf-8
cache-control: max-age=0, private, must-revalidate
b3: 7a91b79bfe1c450809fa148741d4da96-acd683c19f9e37ef-0
{
"data": {
"id": "00000000-0000-0000-0000-000000000018",
"name": "Blue Dream",
"strain_type": "HYBRID"
}
}
Get a single strain given the ID.
Required permission: settings_permissions_strains.
Request
GET /public/v1/strains/{id}
Parameters
| Parameter | Description | In | Type | Required | Default | Example |
|---|---|---|---|---|---|---|
| id | Strain ID | path | string | true |
Responses
| Status | Description | Schema |
|---|---|---|
| 200 | A single strain | Strain |
| 404 | Not Found |
Get strains
GET /public/v1/strains returns strains related to the company
GET /public/v1/strains
content-type: application/json
accept: application/json
authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJhdWQiOiJEaXN0cnUiLCJleHAiOjE4MTgxNTYwNTgsImlhdCI6MTc4NjcwNjQ1OCwiaXNzIjoiRGlzdHJ1IiwianRpIjoiYjgzMWQwMDctMGVhYS00OWVjLWJiMDAtZWViZGVkZjI2NjBiIiwibW9iaWxlIjpmYWxzZSwibmJmIjoxNzg2NzA2NDU3LCJwbGF0Zm9ybSI6IkFQSSIsInN1YiI6IlVzZXI6ODE2IiwidHlwIjoiYWNjZXNzIn0.ZzTf9DSaHalJE5yiqKwgokZ0_kj7NJISUQw6vlI7Vlk
Response
200
content-type: application/json; charset=utf-8
cache-control: max-age=0, private, must-revalidate
b3: a90256a4d64ac492b791de55573e587c-7408183113520777-0
{
"data": [
{
"id": "00000000-0000-0000-0000-00000000001a",
"name": "Strain 22",
"strain_type": "INDICA"
},
{
"id": "00000000-0000-0000-0000-00000000001b",
"name": "Strain 23",
"strain_type": null
}
],
"next_page": null
}
Get strains filtered by various attributes
Note: The page size for this endpoint is 50k strains per page.
Required permission: settings_permissions_strains.
Request
GET /public/v1/strains
Parameters
| Parameter | Description | In | Type | Required | Default | Example |
|---|---|---|---|---|---|---|
| inserted_datetime | Filter strains by their creation datetime | query | string | false | 2022-07-10T00:00:00Z, | |
| page | Pagination information | query | number | false | ?page[number]=1 | |
| updated_datetime | Filter strains by the datetime they were most recently modified | query | string | false | ,2022-07-10T00:00:00Z |
Responses
| Status | Description | Schema |
|---|---|---|
| 200 | A list of strains | Strains |
Update a strain
POST /public/v1/strains/:id updates a strain
POST /public/v1/strains/00000000-0000-0000-0000-000000000009
content-type: application/json
accept: application/json
authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJhdWQiOiJEaXN0cnUiLCJleHAiOjE4MTgxNTYwNTYsImlhdCI6MTc4NjcwNjQ1NiwiaXNzIjoiRGlzdHJ1IiwianRpIjoiM2Q1NDQ3ZWQtOTE3NS00NmY3LTg3NTYtMmI2MDcyMWExODA4IiwibW9iaWxlIjpmYWxzZSwibmJmIjoxNzg2NzA2NDU1LCJwbGF0Zm9ybSI6IkFQSSIsInN1YiI6IlVzZXI6MzE0IiwidHlwIjoiYWNjZXNzIn0.95_atE3XaWNOnk4vlcbix3ovzLYkO0FxWYapDipJOGc
{
"name": "New Name",
"strain_type": "sativa"
}
Response
200
content-type: application/json; charset=utf-8
cache-control: max-age=0, private, must-revalidate
b3: dd60484bad2ed05125060003d98e9bde-e86aad5d7e2ed59b-0
{
"data": {
"id": "00000000-0000-0000-0000-000000000009",
"name": "New Name",
"strain_type": "SATIVA"
}
}
Update an existing strain.
Required permission: settings_permissions_strains.
Request
POST /public/v1/strains/{id}
Parameters
| Parameter | Description | In | Type | Required | Default | Example |
|---|---|---|---|---|---|---|
| id | Strain ID | path | string | true | ||
| name | Name of the strain | query | string | false | ||
| strain_type | Type of strain (indica, indica_dominant, sativa, sativa_dominant, hybrid, high_cbd) | query | string | false |
Responses
| Status | Description | Schema |
|---|---|---|
| 200 | Strain updated | Strain |
| 400 | Invalid parameters | |
| 404 | Not Found |
Tag
Delete a tag
DELETE /public/v1/tags/:id deletes a tag
DELETE /public/v1/tags/00000000-0000-0000-0000-000000000007
content-type: application/json
accept: application/json
authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJhdWQiOiJEaXN0cnUiLCJleHAiOjE4MTgxNTYwNTcsImlhdCI6MTc4NjcwNjQ1NywiaXNzIjoiRGlzdHJ1IiwianRpIjoiZGMxZWI2YWUtYTdiNC00NjA5LWJiZjMtYTU3Yjc1MDNkMjUwIiwibW9iaWxlIjpmYWxzZSwibmJmIjoxNzg2NzA2NDU2LCJwbGF0Zm9ybSI6IkFQSSIsInN1YiI6IlVzZXI6Njk5IiwidHlwIjoiYWNjZXNzIn0.367SLET6_QXbVqrKw55oqg3Fv9LhcQK4h7jV1sKhqyo
Response
204
cache-control: max-age=0, private, must-revalidate
b3: 287483c1159815256cd21c078b80d92f-33b6fda1c9b407a8-0
Permanently deletes the tag. This is a hard delete: the record is removed from the database and cannot be recovered.
Any authenticated API key for the company may manage tags; no additional settings permission is required.
Request
DELETE /public/v1/tags/{id}
Parameters
| Parameter | Description | In | Type | Required | Default | Example |
|---|---|---|---|---|---|---|
| id | Tag ID | path | string | true |
Responses
| Status | Description | Schema |
|---|---|---|
| 204 | No Content | |
| 404 | Not Found |
Get a tag
GET /public/v1/tags/:id returns a single tag
GET /public/v1/tags/00000000-0000-0000-0000-000000000006
content-type: application/json
accept: application/json
authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJhdWQiOiJEaXN0cnUiLCJleHAiOjE4MTgxNTYwNTcsImlhdCI6MTc4NjcwNjQ1NywiaXNzIjoiRGlzdHJ1IiwianRpIjoiMGViMzZhNjAtOGVjOS00YzY3LWI0ZGQtY2NkMWEyNjI2ZTRmIiwibW9iaWxlIjpmYWxzZSwibmJmIjoxNzg2NzA2NDU2LCJwbGF0Zm9ybSI6IkFQSSIsInN1YiI6IlVzZXI6NjY2IiwidHlwIjoiYWNjZXNzIn0.vF0MEIWmbGcccapKl5Q92eRdqEilFjD6pB0_7INKoKw
Response
200
content-type: application/json; charset=utf-8
cache-control: max-age=0, private, must-revalidate
b3: cdcb6cfb6b11936e84eb94e1c9007a37-706e19f3b2aa7804-0
{
"data": {
"id": "00000000-0000-0000-0000-000000000006",
"inserted_datetime": "2026-08-14T11:20:57.669975Z",
"name": "Top Shelf",
"updated_datetime": "2026-08-14T11:20:57.669975Z"
}
}
Get a single tag given the ID.
Any authenticated API key for the company may manage tags; no additional settings permission is required.
Request
GET /public/v1/tags/{id}
Parameters
| Parameter | Description | In | Type | Required | Default | Example |
|---|---|---|---|---|---|---|
| id | Tag ID | path | string | true |
Responses
| Status | Description | Schema |
|---|---|---|
| 200 | A single tag | Tag |
| 404 | Not Found |
Get tags
GET /public/v1/tags returns paginated tags for the company with next_page
GET /public/v1/tags
content-type: application/json
accept: application/json
authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJhdWQiOiJEaXN0cnUiLCJleHAiOjE4MTgxNTYwNTgsImlhdCI6MTc4NjcwNjQ1OCwiaXNzIjoiRGlzdHJ1IiwianRpIjoiZjQ0NTYzMzItZTRmNi00ZDM2LTgzZTktMTU2MGU5M2M5ZjJmIiwibW9iaWxlIjpmYWxzZSwibmJmIjoxNzg2NzA2NDU3LCJwbGF0Zm9ybSI6IkFQSSIsInN1YiI6IlVzZXI6ODcxIiwidHlwIjoiYWNjZXNzIn0.aF4tyrtcpPjiRLUip1hu5tqhD8nSgQ91mP5UZEXOp7A
Response
200
content-type: application/json; charset=utf-8
cache-control: max-age=0, private, must-revalidate
b3: 6e6531c83540db0ff9dc6b41b8cc5bc9-dc98c0944b70fb16-0
{
"data": [
{
"id": "00000000-0000-0000-0000-000000000009",
"inserted_datetime": "2026-08-14T11:20:58.365216Z",
"name": "T1",
"updated_datetime": "2026-08-14T11:20:58.365216Z"
},
{
"id": "00000000-0000-0000-0000-00000000000a",
"inserted_datetime": "2026-08-14T11:20:58.366072Z",
"name": "T2",
"updated_datetime": "2026-08-14T11:20:58.366072Z"
},
{
"id": "00000000-0000-0000-0000-00000000000b",
"inserted_datetime": "2026-08-14T11:20:58.366306Z",
"name": "T3",
"updated_datetime": "2026-08-14T11:20:58.366306Z"
}
],
"next_page": "https://www.example.com/public/v1/tags?page[number]=2"
}
List tags for the authenticated company.
Any authenticated API key for the company may manage tags; no additional settings permission is required.
Request
GET /public/v1/tags
Parameters
| Parameter | Description | In | Type | Required | Default | Example |
|---|---|---|---|---|---|---|
| page | Pagination information | query | number | false | ?page[number]=1 |
Responses
| Status | Description | Schema |
|---|---|---|
| 200 | A list of tags | Tags |
Upsert a tag
POST /public/v1/tags creates a tag
POST /public/v1/tags
content-type: application/json
accept: application/json
authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJhdWQiOiJEaXN0cnUiLCJleHAiOjE4MTgxNTYwNTcsImlhdCI6MTc4NjcwNjQ1NywiaXNzIjoiRGlzdHJ1IiwianRpIjoiMDZjZmRlMTMtMWQ2MS00ZDYzLTkzYTEtYmJjZGY1NjUzMjNhIiwibW9iaWxlIjpmYWxzZSwibmJmIjoxNzg2NzA2NDU2LCJwbGF0Zm9ybSI6IkFQSSIsInN1YiI6IlVzZXI6NTk4IiwidHlwIjoiYWNjZXNzIn0.ryb8WA6Zw2dpx32zt9YcgBcTS0A_qWq2zAmNeNYvgik
{
"name": "Top Shelf"
}
Response
201
content-type: application/json; charset=utf-8
cache-control: max-age=0, private, must-revalidate
b3: e1e9f86dc6a8b202b8f8bdf83fab14a4-6fa931a1a6409055-0
{
"data": {
"id": "00000000-0000-0000-0000-000000000004",
"inserted_datetime": "2026-08-14T11:20:57.387189Z",
"name": "Top Shelf",
"updated_datetime": "2026-08-14T11:20:57.387189Z"
}
}
POST /public/v1/tags (update) updates a tag
POST /public/v1/tags
content-type: application/json
accept: application/json
authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJhdWQiOiJEaXN0cnUiLCJleHAiOjE4MTgxNTYwNTgsImlhdCI6MTc4NjcwNjQ1OCwiaXNzIjoiRGlzdHJ1IiwianRpIjoiNTU2MDNmMmQtYzI5NS00ZWM4LTgxYTctMTE3ZWIyZjQzZWFhIiwibW9iaWxlIjpmYWxzZSwibmJmIjoxNzg2NzA2NDU3LCJwbGF0Zm9ybSI6IkFQSSIsInN1YiI6IlVzZXI6OTE1IiwidHlwIjoiYWNjZXNzIn0.7xPsZ_garc2g1r3Z5UKBBO8VCV5lWowRnLdotrgoYXo
{
"id": "00000000-0000-0000-0000-00000000000e",
"name": "New"
}
Response
200
content-type: application/json; charset=utf-8
cache-control: max-age=0, private, must-revalidate
b3: 89c01df61a7c47be0019825cd6629abc-29b49ac76c1f211e-0
{
"data": {
"id": "00000000-0000-0000-0000-00000000000e",
"inserted_datetime": "2026-08-14T11:20:58.528439Z",
"name": "New",
"updated_datetime": "2026-08-14T11:20:58.535688Z"
}
}
Upsert a single tag. To update an existing tag, pass its ID in the id field. If you do not
pass an ID, a new tag is created.
Any authenticated API key for the company may manage tags; no additional settings permission is required.
Request
POST /public/v1/tags
Parameters
| Parameter | Description | In | Type | Required | Default | Example |
|---|---|---|---|---|---|---|
| id | Tag ID. If given, the matching tag is updated; otherwise a new one is created. | query | string | false | ||
| name | The name of the tag | query | string | true |
Responses
| Status | Description | Schema |
|---|---|---|
| 200 | The updated tag | Tag |
| 201 | The created tag | Tag |
| 400 | Invalid parameters | |
| 404 | Not Found |
Tax
Get a tax
GET /public/v1/taxes renders the full tax fields without michigan fields
GET /public/v1/taxes/00000000-0000-0000-0000-000000000004
content-type: application/json
accept: application/json
authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJhdWQiOiJEaXN0cnUiLCJleHAiOjE4MTgxNTYwNTUsImlhdCI6MTc4NjcwNjQ1NSwiaXNzIjoiRGlzdHJ1IiwianRpIjoiNWQ1YzQ3ZDItZWRjNS00MmRhLWIzZDItNGRkZWYxZWM2ZjZlIiwibW9iaWxlIjpmYWxzZSwibmJmIjoxNzg2NzA2NDU0LCJwbGF0Zm9ybSI6IkFQSSIsInN1YiI6IlVzZXI6NjEiLCJ0eXAiOiJhY2Nlc3MifQ.hpN4ktUypDLIUKkxXx3l8-8Pux09vv3JN9zZKV4CjZs
Response
200
content-type: application/json; charset=utf-8
cache-control: max-age=0, private, must-revalidate
b3: 6f74fde6c73118982db95b93db41a164-83d403bfb8c7ebf8-0
{
"data": {
"description": null,
"id": "00000000-0000-0000-0000-000000000004",
"inserted_datetime": "2026-08-14T11:20:55.379433Z",
"name": "CA Excise",
"qb_account_id": "84",
"qb_product_id": "12",
"tags": [],
"tax_applied_after_charges": true,
"tax_applied_after_price_tiers": true,
"tax_code": "EXCISE",
"tax_rate_percent": 15.0,
"updated_datetime": "2026-08-14T11:20:55.380525Z"
}
}
Get a single tax given the ID.
Required permission: settings_permissions_taxes.
Request
GET /public/v1/taxes/{id}
Parameters
| Parameter | Description | In | Type | Required | Default | Example |
|---|---|---|---|---|---|---|
| id | Tax ID | path | string | true |
Responses
| Status | Description | Schema |
|---|---|---|
| 200 | A single tax | Tax |
| 404 | Not Found |
Get taxes
GET /public/v1/taxes returns paginated taxes for the company with tags and next_page
GET /public/v1/taxes
content-type: application/json
accept: application/json
authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJhdWQiOiJEaXN0cnUiLCJleHAiOjE4MTgxNTYwNTUsImlhdCI6MTc4NjcwNjQ1NSwiaXNzIjoiRGlzdHJ1IiwianRpIjoiZDE4YjczM2UtOGIxYS00MGEwLWJmMDAtMTNkNjRkM2UzNTFkIiwibW9iaWxlIjpmYWxzZSwibmJmIjoxNzg2NzA2NDU0LCJwbGF0Zm9ybSI6IkFQSSIsInN1YiI6IlVzZXI6MTEwIiwidHlwIjoiYWNjZXNzIn0.WCjE691rQq9Afko8Afl8-2Z_EEs1-ljNCBUs67zpKEY
Response
200
content-type: application/json; charset=utf-8
cache-control: max-age=0, private, must-revalidate
b3: af5b9219da06279863291cb94287a266-a47fa64568e7af28-0
{
"data": [
{
"description": null,
"id": "00000000-0000-0000-0000-000000000006",
"inserted_datetime": "2026-08-14T11:20:55.768631Z",
"name": "T1",
"qb_account_id": null,
"qb_product_id": null,
"tags": [
{
"id": "00000000-0000-0000-0000-000000000001",
"name": "Cannabis"
}
],
"tax_applied_after_charges": false,
"tax_applied_after_price_tiers": true,
"tax_code": "Tax Code 11",
"tax_rate_percent": 15.0,
"updated_datetime": "2026-08-14T11:20:55.768631Z"
},
{
"description": null,
"id": "00000000-0000-0000-0000-000000000007",
"inserted_datetime": "2026-08-14T11:20:55.781017Z",
"name": "T2",
"qb_account_id": null,
"qb_product_id": null,
"tags": [],
"tax_applied_after_charges": false,
"tax_applied_after_price_tiers": true,
"tax_code": "Tax Code 13",
"tax_rate_percent": 15.0,
"updated_datetime": "2026-08-14T11:20:55.781017Z"
},
{
"description": null,
"id": "00000000-0000-0000-0000-000000000008",
"inserted_datetime": "2026-08-14T11:20:55.791220Z",
"name": "T3",
"qb_account_id": null,
"qb_product_id": null,
"tags": [],
"tax_applied_after_charges": false,
"tax_applied_after_price_tiers": true,
"tax_code": "Tax Code 15",
"tax_rate_percent": 15.0,
"updated_datetime": "2026-08-14T11:20:55.791220Z"
}
],
"next_page": "https://www.example.com/public/v1/taxes?page[number]=2"
}
List taxes for the authenticated company.
Required permission: settings_permissions_taxes.
Request
GET /public/v1/taxes
Parameters
| Parameter | Description | In | Type | Required | Default | Example |
|---|---|---|---|---|---|---|
| page | Pagination information | query | number | false | ?page[number]=1 |
Responses
| Status | Description | Schema |
|---|---|---|
| 200 | A list of taxes | Taxes |
TestResult
Get a test result
GET /public/v1/test-results/:id returns a single test result
GET /public/v1/test-results/00000000-0000-0000-0000-000000000005
content-type: application/json
accept: application/json
authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJhdWQiOiJEaXN0cnUiLCJleHAiOjE4MTgxNTYwNTksImlhdCI6MTc4NjcwNjQ1OSwiaXNzIjoiRGlzdHJ1IiwianRpIjoiZGIwNmM5OTAtNzFmNi00NzgyLWJkMjYtYTRkZGM1MTdjNTJmIiwibW9iaWxlIjpmYWxzZSwibmJmIjoxNzg2NzA2NDU4LCJwbGF0Zm9ybSI6IkFQSSIsInN1YiI6IlVzZXI6MTA2NSIsInR5cCI6ImFjY2VzcyJ9.jksOln2ZFt2rLifo_wdms3Qe10QT0pIxyDHqeJKiXYo
Response
200
content-type: application/json; charset=utf-8
cache-control: max-age=0, private, must-revalidate
b3: 3b232c20d76710868e0736c9875da1de-65c0510b1fc2a879-0
{
"data": {
"additional_test_results": {},
"batch_id": "00000000-0000-0000-0000-0000000000b7",
"cbd_mg_per_unit": null,
"cbd_percentage": null,
"coa_url": null,
"id": "00000000-0000-0000-0000-000000000005",
"is_primary": false,
"lab_license_number": null,
"lab_name": null,
"mg_per_unit_type": "mg/g",
"name": "TR001",
"package_id": null,
"release_date": null,
"thc_mg_per_unit": null,
"thc_percentage": null,
"total_cbd_mg_per_unit": null,
"total_cbd_percentage": null,
"total_thc_mg_per_unit": null,
"total_thc_percentage": null,
"updated_datetime": "2026-08-14T11:20:59.076934Z"
}
}
Get a single test result given the ID.
Required permission: products_permissions_view.
Request
GET /public/v1/test-results/{id}
Parameters
| Parameter | Description | In | Type | Required | Default | Example |
|---|---|---|---|---|---|---|
| id | Test Result ID | path | string | true |
Responses
| Status | Description | Schema |
|---|---|---|
| 200 | A single test result | TestResult |
| 404 | Not Found |
Get test results
GET /public/v1/test-results returns test results
GET /public/v1/test-results
content-type: application/json
accept: application/json
authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJhdWQiOiJEaXN0cnUiLCJleHAiOjE4MTgxNTYwNjAsImlhdCI6MTc4NjcwNjQ2MCwiaXNzIjoiRGlzdHJ1IiwianRpIjoiYWJkOTk0NTAtNjRiYS00NzU1LThiYWQtNDgyMTg5ZGIyZmZjIiwibW9iaWxlIjpmYWxzZSwibmJmIjoxNzg2NzA2NDU5LCJwbGF0Zm9ybSI6IkFQSSIsInN1YiI6IlVzZXI6MTY2OSIsInR5cCI6ImFjY2VzcyJ9.CCrfg7MhCVX3Gc0ZkuQb_kwI7HUQsLFpfaMs9t_IQ3E
Response
200
content-type: application/json; charset=utf-8
cache-control: max-age=0, private, must-revalidate
b3: 91a14a62fb81dc51a36fad2fa88182a1-606759bba9fbe1d9-0
{
"data": [
{
"additional_test_results": {
"thca_percentage": "12"
},
"batch_id": null,
"cbd_mg_per_unit": "1.12345",
"cbd_percentage": "60.1234",
"coa_url": null,
"id": "00000000-0000-0000-0000-00000000001b",
"is_primary": false,
"lab_license_number": "1234567890",
"lab_name": "Test Lab",
"mg_per_unit_type": "mg/g",
"name": "Test result 1",
"package_id": "00000000-0000-0000-0000-00000000003d",
"release_date": "2026-08-14",
"thc_mg_per_unit": "2.12345",
"thc_percentage": "20.1234",
"total_cbd_mg_per_unit": "3.12345",
"total_cbd_percentage": "80.1234",
"total_thc_mg_per_unit": "4.12345",
"total_thc_percentage": "40.1234",
"updated_datetime": "2026-08-14T11:21:00.629394Z"
},
{
"additional_test_results": {
"thca_percentage": "12"
},
"batch_id": "00000000-0000-0000-0000-000000000182",
"cbd_mg_per_unit": null,
"cbd_percentage": null,
"coa_url": null,
"id": "00000000-0000-0000-0000-00000000001c",
"is_primary": false,
"lab_license_number": null,
"lab_name": null,
"mg_per_unit_type": "mg/g",
"name": "File.pdf",
"package_id": null,
"release_date": null,
"thc_mg_per_unit": null,
"thc_percentage": null,
"total_cbd_mg_per_unit": null,
"total_cbd_percentage": null,
"total_thc_mg_per_unit": null,
"total_thc_percentage": null,
"updated_datetime": "2026-08-14T11:21:00.646001Z"
},
{
"additional_test_results": {},
"batch_id": null,
"cbd_mg_per_unit": null,
"cbd_percentage": null,
"coa_url": null,
"id": "00000000-0000-0000-0000-00000000001d",
"is_primary": false,
"lab_license_number": null,
"lab_name": null,
"mg_per_unit_type": "mg/g",
"name": "File.pdf",
"package_id": "00000000-0000-0000-0000-00000000003e",
"release_date": null,
"thc_mg_per_unit": null,
"thc_percentage": null,
"total_cbd_mg_per_unit": null,
"total_cbd_percentage": null,
"total_thc_mg_per_unit": null,
"total_thc_percentage": null,
"updated_datetime": "2026-08-14T11:21:00.734569Z"
}
],
"next_page": null
}
GET /public/v1/test-results returns only the additional test results that are present in the test result settings
GET /public/v1/test-results
content-type: application/json
accept: application/json
authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJhdWQiOiJEaXN0cnUiLCJleHAiOjE4MTgxNTYwNTksImlhdCI6MTc4NjcwNjQ1OSwiaXNzIjoiRGlzdHJ1IiwianRpIjoiZGQyZGVmZDctYWYyMi00ZWZhLTljODItMjFmMDc5M2U2NzcyIiwibW9iaWxlIjpmYWxzZSwibmJmIjoxNzg2NzA2NDU4LCJwbGF0Zm9ybSI6IkFQSSIsInN1YiI6IlVzZXI6MTE1OSIsInR5cCI6ImFjY2VzcyJ9.pwO4H6TSPkuM4YtyulFirn1w1U6eq5yeFexPWyvl2dM
Response
200
content-type: application/json; charset=utf-8
cache-control: max-age=0, private, must-revalidate
b3: 4b069ed55f78ee7ee27455054ea99db0-d542efa7a09d5ed8-0
{
"data": [
{
"additional_test_results": {
"spiroxamine_a_ug_per_g": "13",
"thiacloprid_ug_per_g": "14"
},
"batch_id": "00000000-0000-0000-0000-0000000000cf",
"cbd_mg_per_unit": null,
"cbd_percentage": null,
"coa_url": null,
"id": "00000000-0000-0000-0000-000000000007",
"is_primary": false,
"lab_license_number": null,
"lab_name": null,
"mg_per_unit_type": "mg/g",
"name": "File.pdf",
"package_id": null,
"release_date": null,
"thc_mg_per_unit": null,
"thc_percentage": null,
"total_cbd_mg_per_unit": null,
"total_cbd_percentage": null,
"total_thc_mg_per_unit": null,
"total_thc_percentage": null,
"updated_datetime": "2026-08-14T11:20:59.303601Z"
}
],
"next_page": null
}
Get test results filtered by various attributes.
Note: The page size for this endpoint is 5000 test results per page. This endpoint returns eventually consistent data, with changes taking up to 1 second to propagate in responses.
Required permission: products_permissions_view.
Request
GET /public/v1/test-results
Parameters
| Parameter | Description | In | Type | Required | Default | Example |
|---|---|---|---|---|---|---|
| updated_datetime | Filter test results by the datetime they were most recently modified | query | string | false | ,2022-07-10T00:00:00Z | |
| page | Pagination information | query | number | false | ?page[number]=1 |
Responses
| Status | Description | Schema |
|---|---|---|
| 200 | A list of test results | TestResults |
Upsert a test result
POST /public/v1/test-results creates a test result for a batch tracked product
POST /public/v1/test-results
content-type: application/json
accept: application/json
authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJhdWQiOiJEaXN0cnUiLCJleHAiOjE4MTgxNTYwNTksImlhdCI6MTc4NjcwNjQ1OSwiaXNzIjoiRGlzdHJ1IiwianRpIjoiNzU2ZDk5NGEtZjcyMC00N2E2LThkMDQtZDI2NzljNGM3YTA1IiwibW9iaWxlIjpmYWxzZSwibmJmIjoxNzg2NzA2NDU4LCJwbGF0Zm9ybSI6IkFQSSIsInN1YiI6IlVzZXI6MTM0NCIsInR5cCI6ImFjY2VzcyJ9.oyWOsYlKFxsh9qO8Lzvr-SCtd0iTtg5R445tPZ4ow3k
{
"additional_test_results": {
"delta_8_thc_mg_per_unit": "17.3333",
"delta_8_thc_percentage": "12.55",
"thcva_percentage": "100"
},
"batch_id": "00000000-0000-0000-0000-000000000113",
"cbd_mg_per_unit": "1.1",
"cbd_percentage": "2.2",
"is_primary": true,
"lab_license_number": "1234567890",
"lab_name": "Test Lab",
"mg_per_unit_type": "mg/g",
"name": "Name",
"release_date": "2025-05-22",
"thc_mg_per_unit": "3.3",
"thc_percentage": "4.4",
"total_cbd_mg_per_unit": "5.5",
"total_cbd_percentage": "6.6",
"total_thc_mg_per_unit": "7.7",
"total_thc_percentage": "8.8"
}
Response
200
content-type: application/json; charset=utf-8
cache-control: max-age=0, private, must-revalidate
b3: 10ad995f15e12844246e204021eb7b70-c3c4ac5468776fbf-0
{
"data": {
"additional_test_results": {
"delta_8_thc_mg_per_unit": "17.3333",
"delta_8_thc_percentage": "12.55",
"thcva_percentage": "100"
},
"batch_id": "00000000-0000-0000-0000-000000000113",
"cbd_mg_per_unit": "1.1",
"cbd_percentage": "2.2",
"coa_url": null,
"id": "00000000-0000-0000-0000-00000000000a",
"is_primary": true,
"lab_license_number": "1234567890",
"lab_name": "Test Lab",
"mg_per_unit_type": "mg/g",
"name": "Name",
"package_id": null,
"release_date": "2025-05-22",
"thc_mg_per_unit": "3.3",
"thc_percentage": "4.4",
"total_cbd_mg_per_unit": "5.5",
"total_cbd_percentage": "6.6",
"total_thc_mg_per_unit": "7.7",
"total_thc_percentage": "8.8",
"updated_datetime": "2026-08-14T11:20:59.696405Z"
}
}
POST /public/v1/test-results creates a test result for a package tracked product
POST /public/v1/test-results
content-type: application/json
accept: application/json
authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJhdWQiOiJEaXN0cnUiLCJleHAiOjE4MTgxNTYwNTcsImlhdCI6MTc4NjcwNjQ1NywiaXNzIjoiRGlzdHJ1IiwianRpIjoiYmExZjNjOTQtOTg3ZC00NDRkLThmYmQtYTE2ZDkyZjMwM2ZkIiwibW9iaWxlIjpmYWxzZSwibmJmIjoxNzg2NzA2NDU2LCJwbGF0Zm9ybSI6IkFQSSIsInN1YiI6IlVzZXI6NTU5IiwidHlwIjoiYWNjZXNzIn0.qXzXPFcGer9DnAE4q3f2FgILSBVaMs5nhyaq1Wn4reU
{
"additional_test_results": {},
"is_primary": false,
"lab_license_number": "1234567890",
"lab_name": "Test Lab",
"mg_per_unit_type": "mg/mL",
"name": "Name",
"package_id": "00000000-0000-0000-0000-000000000013"
}
Response
200
content-type: application/json; charset=utf-8
cache-control: max-age=0, private, must-revalidate
b3: 8043d62920b5abfb054cda8305b98c56-9dab25ebda50fb20-0
{
"data": {
"additional_test_results": {},
"batch_id": null,
"cbd_mg_per_unit": null,
"cbd_percentage": null,
"coa_url": null,
"id": "00000000-0000-0000-0000-000000000001",
"is_primary": true,
"lab_license_number": "1234567890",
"lab_name": "Test Lab",
"mg_per_unit_type": "mg/mL",
"name": "Name",
"package_id": "00000000-0000-0000-0000-000000000013",
"release_date": null,
"thc_mg_per_unit": null,
"thc_percentage": null,
"total_cbd_mg_per_unit": null,
"total_cbd_percentage": null,
"total_thc_mg_per_unit": null,
"total_thc_percentage": null,
"updated_datetime": "2026-08-14T11:20:57.451713Z"
}
}
POST /public/v1/test-results properly transforms pointer on error
POST /public/v1/test-results
content-type: application/json
accept: application/json
authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJhdWQiOiJEaXN0cnUiLCJleHAiOjE4MTgxNTYwNTksImlhdCI6MTc4NjcwNjQ1OSwiaXNzIjoiRGlzdHJ1IiwianRpIjoiOTI3ZmFiZWMtODQyZS00MDcxLWE1YmUtNDM5OGMwNTU4NzI5IiwibW9iaWxlIjpmYWxzZSwibmJmIjoxNzg2NzA2NDU4LCJwbGF0Zm9ybSI6IkFQSSIsInN1YiI6IlVzZXI6MTIwMCIsInR5cCI6ImFjY2VzcyJ9.KcHJE_hB5GKmLpu-L5GLM8X15fr2OWZ19nkfsAdNI80
{
"batch_id": "00000000-0000-0000-0000-0000000000d3",
"mg_per_unit_type": "mg/g",
"name": "Name"
}
Response
400
cache-control: max-age=0, private, must-revalidate
content-type: application/json; charset=utf-8
b3: 9a00b7638b003a16657894a50d427876-c683f4c18298285f-0
{
"errors": [
{
"context": {},
"message": "can't be blank",
"pointer": [
"additional_test_results"
],
"section": "body"
},
{
"context": {},
"message": "can't be blank",
"pointer": [
"is_primary"
],
"section": "body"
}
]
}
POST /public/v1/test-results properly transforms pointer on service function error
POST /public/v1/test-results
content-type: application/json
accept: application/json
authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJhdWQiOiJEaXN0cnUiLCJleHAiOjE4MTgxNTYwNTgsImlhdCI6MTc4NjcwNjQ1OCwiaXNzIjoiRGlzdHJ1IiwianRpIjoiNzdkNGUxNTAtYTZlNi00NDU3LTkwNDEtNGE3MmUxZGEzYjExIiwibW9iaWxlIjpmYWxzZSwibmJmIjoxNzg2NzA2NDU3LCJwbGF0Zm9ybSI6IkFQSSIsInN1YiI6IlVzZXI6ODcyIiwidHlwIjoiYWNjZXNzIn0.spmmOqyGlbTY41_o1cLwV4S_ZuDALhHcDgmZ0xYYBoY
{
"additional_test_results": {},
"batch_id": "00000000-0000-0000-0000-00000000007f",
"is_primary": false,
"mg_per_unit_type": "mg/g",
"name": "Name",
"total_cbd_mg_per_unit": "-3.3456",
"total_cbd_percentage": "2.234567",
"total_thc_mg_per_unit": "-4.4567",
"total_thc_percentage": "1.123456"
}
Response
400
cache-control: max-age=0, private, must-revalidate
content-type: application/json; charset=utf-8
b3: 2eaf83f50914e54f1312f05d43c88fb9-f903edcbd99deb4b-0
{
"errors": [
{
"context": {},
"message": "must be greater than or equal to 0",
"pointer": [
"total_cbd_mg_per_unit"
],
"section": "body"
},
{
"context": {},
"message": "Must have at most 4 decimal digits",
"pointer": [
"total_cbd_percentage"
],
"section": "body"
},
{
"context": {},
"message": "must be greater than or equal to 0",
"pointer": [
"total_thc_mg_per_unit"
],
"section": "body"
},
{
"context": {},
"message": "Must have at most 4 decimal digits",
"pointer": [
"total_thc_percentage"
],
"section": "body"
}
]
}
POST /public/v1/test-results properly updates a test result
POST /public/v1/test-results
content-type: application/json
accept: application/json
authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJhdWQiOiJEaXN0cnUiLCJleHAiOjE4MTgxNTYwNTgsImlhdCI6MTc4NjcwNjQ1OCwiaXNzIjoiRGlzdHJ1IiwianRpIjoiZWNiNWYyNDQtOWMyOS00MmYzLWI0YmEtNDgzZGQ1M2IyNDkwIiwibW9iaWxlIjpmYWxzZSwibmJmIjoxNzg2NzA2NDU3LCJwbGF0Zm9ybSI6IkFQSSIsInN1YiI6IlVzZXI6OTE0IiwidHlwIjoiYWNjZXNzIn0.RKj7Tu0xhLLCS8pR1tWz6X6gHdB4zr-PP9zxJfqhGnk
{
"additional_test_results": {
"thca_percentage": "15"
},
"id": "00000000-0000-0000-0000-000000000004",
"is_primary": true,
"lab_name": "after lab name",
"mg_per_unit_type": "mg/mL",
"name": "after name",
"release_date": "2025-05-23",
"total_thc_percentage": "14"
}
Response
200
content-type: application/json; charset=utf-8
cache-control: max-age=0, private, must-revalidate
b3: 3a3cbb8d299428ce98f00ece21a09cff-f3aebd492bf372cb-0
{
"data": {
"additional_test_results": {
"thca_percentage": "15"
},
"batch_id": "00000000-0000-0000-0000-00000000008d",
"cbd_mg_per_unit": null,
"cbd_percentage": null,
"coa_url": null,
"id": "00000000-0000-0000-0000-000000000004",
"is_primary": true,
"lab_license_number": null,
"lab_name": "after lab name",
"mg_per_unit_type": "mg/mL",
"name": "after name",
"package_id": null,
"release_date": "2025-05-23",
"thc_mg_per_unit": null,
"thc_percentage": null,
"total_cbd_mg_per_unit": null,
"total_cbd_percentage": null,
"total_thc_mg_per_unit": null,
"total_thc_percentage": "14",
"updated_datetime": "2026-08-14T11:20:58.577391Z"
}
}
Upsert a single test result. To update an existing test result, pass in an existing test result ID in the id field. When updating a test result, you must pass in all fields including all additional test results (no sparse update currently supported). Result percentage values can have no more than 4 decimal places. Required permission: products_permissions_edit.
Request
POST /public/v1/test-results
Parameters
| Parameter | Description | In | Type | Required | Default | Example |
|---|---|---|---|---|---|---|
| id | Unique ID for this test result. If it exists, an update will be performed, and will otherwise throw an error. Only non-compliance tracked test results can be updated. | query | string | false | ||
| package_id | The ID of the package this test result belongs to. Cannot be provided if either id or batch_id is provided. | query | string | false | 123e4567-e89b-12d3-a456-426614174000 | |
| batch_id | The ID of the batch this test result belongs to. Cannot be provided if either id or package_id is provided. | query | string | false | 123e4567-e89b-12d3-a456-426614174000 | |
| additional_test_results | The additional tests results for this test result. Check here for the valid options. | body | object | false | ||
| mg_per_unit_type | The unit type for the mg per unit fields | query | string | false | mg/g | |
| is_primary | Setting a test result to is_primary: true will propagate the test result to child packages if applicable. Cannot update a test_result from is_primary: true to is_primary: false. If you want to do this, you must set a different test result on the same package/batch to is_primary: true. Once done, this test_result will be set to is_primary: false automatically. | query | boolean | false | true | |
| release_date | The release date for this test result | query | string | false | 2022-07-10 | |
| lab_license_number | The license number of this test result's lab | query | string | false | 1234567890 | |
| lab_name | The name of this test result's lab | query | string | false | Lab Name | |
| name | The name of this test result | query | string | false | Test Result Name | |
| thc_percentage | The THC percentage for this test result. Max precision is 4 decimal places. | query | decimal | false | 1.5 | |
| total_thc_percentage | The total THC percentage for this test result. Max precision is 4 decimal places. | query | decimal | false | 1.5 | |
| thc_mg_per_unit | The THC mg per unit for this test result. | query | decimal | false | 1.5 | |
| total_thc_mg_per_unit | The total THC mg per unit for this test result. | query | decimal | false | 1.5 | |
| cbd_percentage | The CBD percentage for this test result. Max precision is 4 decimal places. | query | decimal | false | 1.5 | |
| total_cbd_percentage | The total CBD percentage for this test result. Max precision is 4 decimal places. | query | decimal | false | 1.5 | |
| cbd_mg_per_unit | The CBD mg per unit for this test result. | query | decimal | false | 1.5 | |
| total_cbd_mg_per_unit | The total CBD mg per unit for this test result. | query | decimal | false | 1.5 |
Responses
| Status | Description | Schema |
|---|---|---|
| 200 | A single test result | TestResult |
UnitType
Get a unit type
GET /public/v1/unit-types/:id returns the full unit type fields
GET /public/v1/unit-types/00000000-0000-0000-0000-0000000005b1
content-type: application/json
accept: application/json
authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJhdWQiOiJEaXN0cnUiLCJleHAiOjE4MTgxNTYwNTUsImlhdCI6MTc4NjcwNjQ1NSwiaXNzIjoiRGlzdHJ1IiwianRpIjoiY2M0ODNjYjEtODE2My00ZmIxLWI5ZmQtNzYzMzJlNDNjMWE2IiwibW9iaWxlIjpmYWxzZSwibmJmIjoxNzg2NzA2NDU0LCJwbGF0Zm9ybSI6IkFQSSIsInN1YiI6IlVzZXI6MTI4IiwidHlwIjoiYWNjZXNzIn0.glcKKU7JLOx0AK1Wo32v2OVAi61pht4anK1uGbEgfF0
Response
200
content-type: application/json; charset=utf-8
cache-control: max-age=0, private, must-revalidate
b3: 730e60a0c8d3f8b7cee4e8e05b647447-c2650e6f9a56d007-0
{
"data": {
"active": true,
"category": "WEIGHT",
"id": "00000000-0000-0000-0000-0000000005b1",
"inserted_datetime": "2026-08-14T11:20:55.815753Z",
"locked": true,
"name": "Big Bag",
"qty_per_si_unit": "453.592",
"updated_datetime": "2026-08-14T11:20:55.815753Z"
}
}
Get a single unit type given the ID.
Request
GET /public/v1/unit-types/{id}
Parameters
| Parameter | Description | In | Type | Required | Default | Example |
|---|---|---|---|---|---|---|
| id | Unit type ID | path | string | true |
Responses
| Status | Description | Schema |
|---|---|---|
| 200 | A single unit type | UnitTypeFull |
| 404 | Not Found |
Get unit types
GET /public/v1/unit-types returns paginated unit types with next_page
GET /public/v1/unit-types
content-type: application/json
accept: application/json
authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJhdWQiOiJEaXN0cnUiLCJleHAiOjE4MTgxNTYwNTYsImlhdCI6MTc4NjcwNjQ1NiwiaXNzIjoiRGlzdHJ1IiwianRpIjoiOTA1ODVhYTktZjdjOS00NzNmLTllNGMtNzM1NTU2ZTk1NzhjIiwibW9iaWxlIjpmYWxzZSwibmJmIjoxNzg2NzA2NDU1LCJwbGF0Zm9ybSI6IkFQSSIsInN1YiI6IlVzZXI6MjA3IiwidHlwIjoiYWNjZXNzIn0.-RxhgyExMEc-2Z3w6cpzGlw20kdAKjNKjTBATFQMP8g
Response
200
content-type: application/json; charset=utf-8
cache-control: max-age=0, private, must-revalidate
b3: 74f59480498f57db3c4aafa203cfeddf-a56735ba2b93f45c-0
{
"data": [
{
"active": false,
"category": "WEIGHT",
"id": "00000000-0000-0000-0000-00000000084a",
"inserted_datetime": "2026-08-14T11:20:56.024595Z",
"locked": true,
"name": "Kilogram",
"qty_per_si_unit": "1",
"updated_datetime": "2026-08-14T11:20:56.024595Z"
},
{
"active": true,
"category": "WEIGHT",
"id": "00000000-0000-0000-0000-00000000084b",
"inserted_datetime": "2026-08-14T11:20:56.024595Z",
"locked": true,
"name": "Gram",
"qty_per_si_unit": "1000",
"updated_datetime": "2026-08-14T11:20:56.024595Z"
},
{
"active": false,
"category": "WEIGHT",
"id": "00000000-0000-0000-0000-00000000084c",
"inserted_datetime": "2026-08-14T11:20:56.024595Z",
"locked": true,
"name": "Milligram",
"qty_per_si_unit": "1000000",
"updated_datetime": "2026-08-14T11:20:56.024595Z"
}
],
"next_page": "https://www.example.com/public/v1/unit-types?page[number]=2"
}
List unit types for the authenticated company.
Request
GET /public/v1/unit-types
Parameters
| Parameter | Description | In | Type | Required | Default | Example |
|---|---|---|---|---|---|---|
| page | Pagination information | query | number | false | ?page[number]=1 |
Responses
| Status | Description | Schema |
|---|---|---|
| 200 | A list of unit types | UnitTypes |
User
Get a user
GET /public/v1/users/:id returns a single user
GET /public/v1/users/00000000-0000-0000-0000-000000000195
content-type: application/json
accept: application/json
authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJhdWQiOiJEaXN0cnUiLCJleHAiOjE4MTgxNTYwNTYsImlhdCI6MTc4NjcwNjQ1NiwiaXNzIjoiRGlzdHJ1IiwianRpIjoiY2QyOWY5MjEtMzg3YS00ZTc3LTg1Y2YtYmMxNTYzZWNlYjViIiwibW9iaWxlIjpmYWxzZSwibmJmIjoxNzg2NzA2NDU1LCJwbGF0Zm9ybSI6IkFQSSIsInN1YiI6IlVzZXI6Mzk5IiwidHlwIjoiYWNjZXNzIn0.VrMPdBZSc3AEI346inxdGSDkzsK2J3SJuwyvPQyUMxo
Response
200
content-type: application/json; charset=utf-8
cache-control: max-age=0, private, must-revalidate
b3: 562db1f83372b1dd8d2d702951b3ea5d-cd70b32dcaf1adaa-0
{
"data": {
"banned": false,
"deleted_at": null,
"email": "owner-404@example.com",
"full_name": "FirstName802 LastName803",
"id": "00000000-0000-0000-0000-000000000195",
"role": {
"id": "00000000-0000-0000-0000-00000000019a",
"name": "Admin 409"
}
}
}
Get a single user given the ID.
Required permission: settings_permissions_manage_team.
Request
GET /public/v1/users/{id}
Parameters
| Parameter | Description | In | Type | Required | Default | Example |
|---|---|---|---|---|---|---|
| id | User ID | path | string | true |
Responses
| Status | Description | Schema |
|---|---|---|
| 200 | A single user | User |
| 404 | Not Found |
Get users
GET /public/v1/users returns users related to the company
GET /public/v1/users
content-type: application/json
accept: application/json
authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJhdWQiOiJEaXN0cnUiLCJleHAiOjE4MTgxNTYwNTcsImlhdCI6MTc4NjcwNjQ1NywiaXNzIjoiRGlzdHJ1IiwianRpIjoiYjhiYTBhMzctZjJkYy00YTc1LWIwOGEtYzJjMGEwZjI3NTNkIiwibW9iaWxlIjpmYWxzZSwibmJmIjoxNzg2NzA2NDU2LCJwbGF0Zm9ybSI6IkFQSSIsInN1YiI6IlVzZXI6NTUxIiwidHlwIjoiYWNjZXNzIn0.k_U7IGAJZzDWgl_FcHTYtbAgnPIVWTKU5NW7FdGVL2E
Response
200
content-type: application/json; charset=utf-8
cache-control: max-age=0, private, must-revalidate
b3: 56571247d5e7bcc078bb3639723322e8-5fbd0ab1c10cca9b-0
{
"data": [
{
"banned": false,
"deleted_at": null,
"email": "owner-551@example.com",
"full_name": "FirstName1096 LastName1097",
"id": "00000000-0000-0000-0000-000000000227",
"role": {
"id": "00000000-0000-0000-0000-00000000023c",
"name": "Admin 571"
}
},
{
"banned": false,
"deleted_at": null,
"email": "owner-557@example.com",
"full_name": "FirstName1108 LastName1109",
"id": "00000000-0000-0000-0000-00000000022d",
"role": {
"id": "00000000-0000-0000-0000-000000000242",
"name": "Admin 577"
}
}
],
"next_page": null
}
Get users sorted by their creation date and filtered by various attributes
Note: The page size for this endpoint is 1000 users per page. This endpoint returns eventually consistent data, with changes taking up to 1 second to propagate in responses.
Required permission: settings_permissions_manage_team.
Request
GET /public/v1/users
Parameters
| Parameter | Description | In | Type | Required | Default | Example |
|---|---|---|---|---|---|---|
| inserted_datetime | Filter users by their creation datetime | query | string | false | 2022-07-10T00:00:00Z, | |
| deleted | Filter deleted users. no returns non-deleted, only returns deleted, include returns both. |
query | string | false | no | |
| page | Pagination information | query | number | false | ?page[number]=1 | |
| updated_datetime | Filter users by the datetime they were most recently modified | query | string | false | ,2022-07-10T00:00:00Z |
Responses
| Status | Description | Schema |
|---|---|---|
| 200 | A list of users | Users |
Vehicle
Create a vehicle
POST /public/v1/vehicles creates a vehicle
POST /public/v1/vehicles
content-type: application/json
accept: application/json
authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJhdWQiOiJEaXN0cnUiLCJleHAiOjE4MTgxNTYwNTcsImlhdCI6MTc4NjcwNjQ1NywiaXNzIjoiRGlzdHJ1IiwianRpIjoiMDA3NTA5YzctMmM4Yi00NjljLWFiMmEtZGViZDhjZDc2Y2JmIiwibW9iaWxlIjpmYWxzZSwibmJmIjoxNzg2NzA2NDU2LCJwbGF0Zm9ybSI6IkFQSSIsInN1YiI6IlVzZXI6NjMyIiwidHlwIjoiYWNjZXNzIn0.Hq7PGG6v4aDlOaaiBysSVbsOnwIm6I_wa7BlEK6010w
{
"color": "Red",
"description": "Delivery truck",
"license_plate_number": "XYZ789",
"license_plate_state": "TX",
"make": "Ford",
"model": "F-150",
"vin": "ABCDEFGHIJ1234567",
"year": "2024"
}
Response
201
content-type: application/json; charset=utf-8
cache-control: max-age=0, private, must-revalidate
b3: ecd013a610451fa1abf31b4ff8344c95-3dc7eaf1ad723b36-0
{
"data": {
"color": "Red",
"description": "Delivery truck",
"id": "00000000-0000-0000-0000-000000000008",
"inserted_datetime": "2026-08-14T11:20:57.505587Z",
"license_plate_number": "XYZ789",
"license_plate_state": "TX",
"make": "Ford",
"model": "F-150",
"updated_datetime": "2026-08-14T11:20:57.505587Z",
"vin": "ABCDEFGHIJ1234567",
"year": "2024"
}
}
Create a new vehicle.
Required permission: settings_permissions_vehicles.
Request
POST /public/v1/vehicles
Parameters
| Parameter | Description | In | Type | Required | Default | Example |
|---|---|---|---|---|---|---|
| make | The make of the vehicle | query | string | true | ||
| model | The model of the vehicle | query | string | true | ||
| year | The year of the vehicle | query | string | false | ||
| color | The color of the vehicle | query | string | false | ||
| license_plate_number | The license plate number | query | string | true | ||
| license_plate_state | The license plate state | query | string | false | ||
| vin | The vehicle identification number (VIN) | query | string | false | ||
| description | A description or name for the vehicle | query | string | false |
Responses
| Status | Description | Schema |
|---|---|---|
| 201 | The created vehicle | Vehicle |
| 400 | Invalid parameters |
Get a vehicle
GET /public/v1/vehicles/:id returns a single vehicle
GET /public/v1/vehicles/00000000-0000-0000-0000-000000000009
content-type: application/json
accept: application/json
authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJhdWQiOiJEaXN0cnUiLCJleHAiOjE4MTgxNTYwNTcsImlhdCI6MTc4NjcwNjQ1NywiaXNzIjoiRGlzdHJ1IiwianRpIjoiMDRmZjRhMWEtM2QwZS00Nzg5LWJkZWEtNzQzNjg2YzcwNmYxIiwibW9iaWxlIjpmYWxzZSwibmJmIjoxNzg2NzA2NDU2LCJwbGF0Zm9ybSI6IkFQSSIsInN1YiI6IlVzZXI6NjY3IiwidHlwIjoiYWNjZXNzIn0.AcIQi9bGyPkTRN5SFPkoByBVHitmZb4zVRJ6xdkKb5s
Response
200
content-type: application/json; charset=utf-8
cache-control: max-age=0, private, must-revalidate
b3: 7d197be058aa866b19d02dcbb4560159-8ff995ec1a68e8ca-0
{
"data": {
"color": "Blue",
"description": "Company car",
"id": "00000000-0000-0000-0000-000000000009",
"inserted_datetime": "2026-08-14T11:20:57.678865Z",
"license_plate_number": "ABC123",
"license_plate_state": "CA",
"make": "Toyota",
"model": "Camry",
"updated_datetime": "2026-08-14T11:20:57.678865Z",
"vin": "1234567890",
"year": "2023"
}
}
Get a single vehicle given the ID.
Required permission: settings_permissions_vehicles.
Request
GET /public/v1/vehicles/{id}
Parameters
| Parameter | Description | In | Type | Required | Default | Example |
|---|---|---|---|---|---|---|
| id | Vehicle ID | path | string | true |
Responses
| Status | Description | Schema |
|---|---|---|
| 200 | A single vehicle | Vehicle |
| 404 | Not Found |
Get vehicles
GET /public/v1/vehicles returns vehicles related to the company
GET /public/v1/vehicles
content-type: application/json
accept: application/json
authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJhdWQiOiJEaXN0cnUiLCJleHAiOjE4MTgxNTYwNTgsImlhdCI6MTc4NjcwNjQ1OCwiaXNzIjoiRGlzdHJ1IiwianRpIjoiNzE3YjJmODYtYTRiMi00YjIyLThmY2ItNDA5OTFlZTBmNzJmIiwibW9iaWxlIjpmYWxzZSwibmJmIjoxNzg2NzA2NDU3LCJwbGF0Zm9ybSI6IkFQSSIsInN1YiI6IlVzZXI6ODEyIiwidHlwIjoiYWNjZXNzIn0.lkLMEIIOiNUPT0Ivs5sdIAvtE3_Js3e9unDmjw5_DjQ
Response
200
content-type: application/json; charset=utf-8
cache-control: max-age=0, private, must-revalidate
b3: 3ae9c4cee26a4b0ffba82da01e6056e0-e16d74263a56d79e-0
{
"data": [
{
"color": "Red",
"description": "Test Vehicle",
"id": "00000000-0000-0000-0000-00000000000c",
"inserted_datetime": "2026-08-14T11:20:58.155633Z",
"license_plate_number": "1234567890ABCDEFG",
"license_plate_state": "CA",
"make": "Toyota",
"model": "Camry",
"updated_datetime": "2026-08-14T11:20:58.155633Z",
"vin": "1234567890ABCDEFG",
"year": "2020"
},
{
"color": "Red",
"description": "Test Vehicle",
"id": "00000000-0000-0000-0000-00000000000d",
"inserted_datetime": "2026-08-14T11:20:58.164576Z",
"license_plate_number": "1234567890ABCDEFG",
"license_plate_state": "CA",
"make": "Honda",
"model": "Civic",
"updated_datetime": "2026-08-14T11:20:58.164576Z",
"vin": "1234567890ABCDEFG",
"year": "2020"
}
],
"next_page": null
}
List vehicles for the authenticated company.
Note: The page size for this endpoint is 500 vehicles per page.
Required permission: settings_permissions_vehicles.
Request
GET /public/v1/vehicles
Parameters
| Parameter | Description | In | Type | Required | Default | Example |
|---|---|---|---|---|---|---|
| page | Pagination information | query | number | false | ?page[number]=1 |
Responses
| Status | Description | Schema |
|---|---|---|
| 200 | A list of vehicles | Vehicles |
Update a vehicle
POST /public/v1/vehicles/:id updates a vehicle
POST /public/v1/vehicles/00000000-0000-0000-0000-00000000000f
content-type: application/json
accept: application/json
authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJhdWQiOiJEaXN0cnUiLCJleHAiOjE4MTgxNTYwNTgsImlhdCI6MTc4NjcwNjQ1OCwiaXNzIjoiRGlzdHJ1IiwianRpIjoiMThmZDE2ZmYtY2E0NC00ZjEzLTg2YTAtZDc2YmQ2ODAzMzZiIiwibW9iaWxlIjpmYWxzZSwibmJmIjoxNzg2NzA2NDU3LCJwbGF0Zm9ybSI6IkFQSSIsInN1YiI6IlVzZXI6ODgxIiwidHlwIjoiYWNjZXNzIn0.SxlAq-31sEmaJpOJ64IMWyMIxPH3ibErAn-SleIFApM
{
"color": "Red",
"make": "Honda",
"model": "Accord",
"year": "2023"
}
Response
200
content-type: application/json; charset=utf-8
cache-control: max-age=0, private, must-revalidate
b3: 56cc433b5dd2358d5bd3233c8690fdc3-1c2cf22ca90aadc4-0
{
"data": {
"color": "Red",
"description": "Test Vehicle",
"id": "00000000-0000-0000-0000-00000000000f",
"inserted_datetime": "2026-08-14T11:20:58.400849Z",
"license_plate_number": "1234567890ABCDEFG",
"license_plate_state": "CA",
"make": "Honda",
"model": "Accord",
"updated_datetime": "2026-08-14T11:20:58.409658Z",
"vin": "1234567890ABCDEFG",
"year": "2023"
}
}
Update an existing vehicle.
Required permission: settings_permissions_vehicles.
Request
POST /public/v1/vehicles/{id}
Parameters
| Parameter | Description | In | Type | Required | Default | Example |
|---|---|---|---|---|---|---|
| id | Vehicle ID | path | string | true | ||
| make | The make of the vehicle | query | string | false | ||
| model | The model of the vehicle | query | string | false | ||
| year | The year of the vehicle | query | string | false | ||
| color | The color of the vehicle | query | string | false | ||
| license_plate_number | The license plate number | query | string | false | ||
| license_plate_state | The license plate state | query | string | false | ||
| vin | The vehicle identification number (VIN) | query | string | false | ||
| description | A description or name for the vehicle | query | string | false |
Responses
| Status | Description | Schema |
|---|---|---|
| 200 | The updated vehicle | Vehicle |
| 400 | Invalid parameters | |
| 404 | Not Found |
Models
AdditionalCost
An additional cost for an assembly as shown in Distru
| Property | Description | Type | Required |
|---|---|---|---|
| cost_per_unit | The cost per unit of the additional cost | number | false |
| description | The description of the additional cost | string | false |
| name | The name of the additional cost | string | false |
| quantity | The quantity of the additional cost | number | false |
| total_cost_actual | The total actual cost of the additional cost | number | false |
| total_cost_default | The total default cost (from the configured cost type) of the additional cost | number | false |
| unit_type | A unit type as shown in Distru | UnitType | false |
AdditionalTestResult
An additional test result object for a test result as shown in Distru
| Property | Description | Type | Required |
|---|---|---|---|
| dimethoxyethane_ug_per_g | Solvent | string | false |
| delta_8_thc_percentage | Cannabinoid | string | false |
| aspergillus_cfu_per_g | Microbial | string | false |
| limonene_mg_per_unit | Terpene | string | false |
| etofenprox_ug_per_g | Pesticide | string | false |
| pyrethrins_pyrethrin_ii_ug_per_g | Pesticide | string | false |
| xylene_ug_per_g_total | Solvent | string | false |
| ethoprophos_ug_per_g | Pesticide | string | false |
| enterobacteriacaea_cfu_per_g | Microbial | string | false |
| chloroform_ug_per_g | Solvent | string | false |
| copper_ug_per_g | Heavy Metal | string | false |
| myclobutanil_ug_per_g | Pesticide | string | false |
| caryophyllene_oxide_mg_per_unit | Terpene | string | false |
| thiamethoxam_ug_per_g | Pesticide | string | false |
| delta_8_thc_mg_per_unit | Cannabinoid | string | false |
| cbda_percentage | Cannabinoid | string | false |
| n_methylpyrrolidone_ug_per_g | Solvent | string | false |
| propiconazole_trans_ug_per_g | Pesticide | string | false |
| pyrethrins_pyrethrin_i_ug_per_g | Pesticide | string | false |
| thcva_percentage | Cannabinoid | string | false |
| pyriproxyfen_ug_per_g | Pesticide | string | false |
| cbc_percentage | Cannabinoid | string | false |
| alpha_bisabolol_mg_per_unit | Terpene | string | false |
| spiroxamine_a_ug_per_g | Pesticide | string | false |
| alpha_bisabolol_percentage | Terpene | string | false |
| methyl_ethyl_ketone_ug_per_g | Solvent | string | false |
| tetralin_ug_per_g | Solvent | string | false |
| beta_cypermethrin_ug_per_g | Pesticide | string | false |
| phytol_mg_per_unit | Terpene | string | false |
| fenpyroximate_ug_per_g | Pesticide | string | false |
| alpha_cypermethrin_ug_per_g | Pesticide | string | false |
| cbg_mg_per_unit | Cannabinoid | string | false |
| fenchol_mg_per_unit | Terpene | string | false |
| zinc_ug_per_g | Heavy Metal | string | false |
| butanol_ug_per_g | Solvent | string | false |
| phytol_percentage | Terpene | string | false |
| fipronil_ug_per_g | Pesticide | string | false |
| cymene_mg_per_unit | Terpene | string | false |
| trifloxystrobin_ug_per_g | Pesticide | string | false |
| dimethylformamide_ug_per_g | Solvent | string | false |
| flonicamid_ug_per_g | Pesticide | string | false |
| alpha_myrcene_mg_per_unit | Terpene | string | false |
| thiabendazole_ug_per_g | Pesticide | string | false |
| aflatoxin_g1_ug_per_kg | Mycotoxin | string | false |
| formic_acid_ug_per_g | Other | string | false |
| cannabinoids_percentage_total | Cannabinoid | string | false |
| pyridine_ug_per_g | Solvent | string | false |
| pyrethrins_jasmolin_ii_ug_per_g | Pesticide | string | false |
| geraniol_percentage | Terpene | string | false |
| ethylene_glycol_percentage | Other | string | false |
| other_terpenes_percentage | Terpene | string | false |
| aspergillus_flavus_cfu_per_g | Microbial | string | false |
| carbaryl_ug_per_g | Pesticide | string | false |
| spinosad_d_ug_per_g | Pesticide | string | false |
| alpha_phellandrene_percentage | Terpene | string | false |
| alpha_terpinene_mg_per_unit | Terpene | string | false |
| dimethomorph_z_ug_per_g | Pesticide | string | false |
| dimethomorph_e_ug_per_g | Pesticide | string | false |
| formamide_ug_per_g | Pesticide | string | false |
| candida_albicans_cfu_per_g | Microbial | string | false |
| tebuconazole_ug_per_g | Pesticide | string | false |
| nerolidol_percentage | Terpene | string | false |
| aflatoxins_ug_per_kg | Mycotoxin | string | false |
| mevinphos_i_ug_per_g | Pesticide | string | false |
| pulegone_mg_per_unit | Terpene | string | false |
| gamma_terpinene_mg_per_unit | Terpene | string | false |
| mercury_ug_per_g | Heavy Metal | string | false |
| alpha_humulene_mg_per_unit | Terpene | string | false |
| farnesene_percentage | Terpene | string | false |
| l_monocytogenes_cfu_per_g | Microbial | string | false |
| propane_ug_per_g | Solvent | string | false |
| heptane_ug_per_g | Solvent | string | false |
| butyl_acetate_ug_per_g | Solvent | string | false |
| chlordane_cis_ug_per_g | Pesticide | string | false |
| camphene_mg_per_unit | Terpene | string | false |
| propanol_ug_per_g | Solvent | string | false |
| geraniol_mg_per_unit | Terpene | string | false |
| beta_myrcene_mg_per_unit | Terpene | string | false |
| aflatoxin_b1_ug_per_kg | Mycotoxin | string | false |
| fenhexamid_ug_per_g | Pesticide | string | false |
| sulfolane_ug_per_g | Solvent | string | false |
| spiroxamine_b_ug_per_g | Pesticide | string | false |
| aldicarb_ug_per_g | Pesticide | string | false |
| spiromesifen_ug_per_g | Pesticide | string | false |
| m_and_p_xylene_ug_per_g | Solvent | string | false |
| captan_ug_per_g | Pesticide | string | false |
| bifenthrin_ug_per_g | Pesticide | string | false |
| terpenes_percentage_total | Terpene | string | false |
| other_heavy_metals_ug_per_g | Heavy Metal | string | false |
| aflatoxin_b2_ug_per_kg | Mycotoxin | string | false |
| pyridaben_ug_per_g | Pesticide | string | false |
| thca_percentage | Cannabinoid | string | false |
| acetone_ug_per_g | Solvent | string | false |
| spinetoram_ug_per_g | Pesticide | string | false |
| ethylene_glycol_ug_per_g | Other | string | false |
| valencene_mg_per_unit | Terpene | string | false |
| diuron_ug_per_g | Pesticide | string | false |
| permethrin_cis_ug_per_g | Pesticide | string | false |
| cymene_percentage | Terpene | string | false |
| cbl_mg_per_unit | Cannabinoid | string | false |
| methanol_ug_per_g | Solvent | string | false |
| cbca_mg_per_unit | Cannabinoid | string | false |
| thiacloprid_ug_per_g | Pesticide | string | false |
| methyl_butyl_ketone_ug_per_g | Solvent | string | false |
| vitamin_e_acetate_ug_per_g | Other | string | false |
| thca_mg_per_unit | Cannabinoid | string | false |
| spiroxamine_ug_per_g | Pesticide | string | false |
| camphor_percentage | Terpene | string | false |
| clofentezine_ug_per_g | Pesticide | string | false |
| hexythiazox_ug_per_g | Pesticide | string | false |
| ethoxyethanol_ug_per_g | Solvent | string | false |
| imidacloprid_ug_per_g | Pesticide | string | false |
| chlorpyrifos_ug_per_g | Pesticide | string | false |
| prallethrin_ug_per_g | Pesticide | string | false |
| mgk_264_ug_per_g | Pesticide | string | false |
| isopulegol_percentage | Terpene | string | false |
| vitamin_e_acetate_percentage | Other | string | false |
| prallethrin_trans_ug_per_g | Pesticide | string | false |
| phosmet_ug_per_g | Pesticide | string | false |
| alpha_terpinene_percentage | Terpene | string | false |
| acetamiprid_ug_per_g | Pesticide | string | false |
| thcv_mg_per_unit | Cannabinoid | string | false |
| cypermethrin_ug_per_g | Pesticide | string | false |
| aflatoxin_g2_ug_per_kg | Mycotoxin | string | false |
| camphor_mg_per_unit | Terpene | string | false |
| acetic_acid_ug_per_g | Other | string | false |
| aspergillus_terreus_cfu_per_g | Microbial | string | false |
| cbca_percentage | Cannabinoid | string | false |
| sabinene_mg_per_unit | Terpene | string | false |
| methoxyethanol_ug_per_g | Solvent | string | false |
| tert_butyl_methyl_ether_ug_per_g | Solvent | string | false |
| cbn_mg_per_unit | Cannabinoid | string | false |
| oxamyl_ug_per_g | Pesticide | string | false |
| chlorobenzene_ug_per_g | Solvent | string | false |
| acetic_acid_percentage | Other | string | false |
| beta_humulene_mg_per_unit | Terpene | string | false |
| alpha_pinene_percentage | Terpene | string | false |
| beta_pinene_percentage | Terpene | string | false |
| chlorantraniliprole_ug_per_g | Pesticide | string | false |
| e_coli_cfu_per_g | Microbial | string | false |
| daminozide_ug_per_g | Pesticide | string | false |
| alpha_humulene_percentage | Terpene | string | false |
| cannabinoids_mg_per_unit_total | Cannabinoid | string | false |
| propoxur_ug_per_g | Pesticide | string | false |
| benzene_ug_per_g | Solvent | string | false |
| methomyl_ug_per_g | Pesticide | string | false |
| etoxazole_ug_per_g | Pesticide | string | false |
| lead_ug_per_g | Heavy Metal | string | false |
| dichlorvos_ug_per_g | Pesticide | string | false |
| filth_and_foreign_material_percentage | Other | string | false |
| beta_humulene_percentage | Terpene | string | false |
| acephate_ug_per_g | Pesticide | string | false |
| fludioxonil_ug_per_g | Pesticide | string | false |
| pentanol_ug_per_g | Solvent | string | false |
| dimethyl_sulfoxide_ug_per_g | Solvent | string | false |
| acetonitrile_ug_per_g | Solvent | string | false |
| pyrethrins_cinerin_ii_ug_per_g | Pesticide | string | false |
| isopropyl_acetate_ug_per_g | Solvent | string | false |
| methiocarb_ug_per_g | Pesticide | string | false |
| boscalid_ug_per_g | Pesticide | string | false |
| dichloroethane_ug_per_g | Solvent | string | false |
| bifenazate_ug_per_g | Pesticide | string | false |
| azoxystrobin_ug_per_g | Pesticide | string | false |
| camphene_percentage | Terpene | string | false |
| spirotetramat_ug_per_g | Pesticide | string | false |
| borneol_percentage | Terpene | string | false |
| propyl_acetate_ug_per_g | Solvent | string | false |
| other_solvents_ug_per_g | Solvent | string | false |
| beta_caryophyllene_percentage | Terpene | string | false |
| cbda_mg_per_unit | Cannabinoid | string | false |
| isopulegol_mg_per_unit | Terpene | string | false |
| fenchol_percentage | Terpene | string | false |
| pentachloronitrobenzene_ug_per_g | Pesticide | string | false |
| valencene_percentage | Terpene | string | false |
| water_activity_aw | Water Activity | string | false |
| dimethoate_ug_per_g | Pesticide | string | false |
| ethyl_formate_percentage | Other | string | false |
| cbg_percentage | Cannabinoid | string | false |
| mevinphos_ug_per_g | Pesticide | string | false |
| flurprimidol_ug_per_g | Pesticide | string | false |
| cbga_percentage | Cannabinoid | string | false |
| metalaxyl_ug_per_g | Pesticide | string | false |
| terpenes_mg_per_unit_total | Terpene | string | false |
| lambda_cyhalothrin_ug_per_g | Pesticide | string | false |
| tetrahydrofuran_ug_per_g | Solvent | string | false |
| eucalyptol_mg_per_unit | Terpene | string | false |
| sand_and_soil_and_cinders_and_dirt_percentage | Other | string | false |
| mevinphos_ii_ug_per_g | Pesticide | string | false |
| eucalyptol_percentage | Terpene | string | false |
| spinosad_ug_per_g | Pesticide | string | false |
| dioxane_ug_per_g | Solvent | string | false |
| carbofuran_ug_per_g | Pesticide | string | false |
| delta_3_carene_percentage | Terpene | string | false |
| pulegone_percentage | Terpene | string | false |
| dimethomorph_ug_per_g | Pesticide | string | false |
| malathion_ug_per_g | Pesticide | string | false |
| cbt_percentage | Cannabinoid | string | false |
| clothianidin_ug_per_g | Pesticide | string | false |
| permethrin_ug_per_g | Pesticide | string | false |
| cadmium_ug_per_g | Heavy Metal | string | false |
| aspergillus_fumigatus_cfu_per_g | Microbial | string | false |
| nickel_ug_per_g | Heavy Metal | string | false |
| beta_myrcene_percentage | Terpene | string | false |
| other_pesticides_ug_per_g | Pesticide | string | false |
| terpinolene_percentage | Terpene | string | false |
| pentane_ug_per_g | Solvent | string | false |
| nitromethane_ug_per_g | Solvent | string | false |
| methyl_parathion_ug_per_g | Pesticide | string | false |
| ocimene_mg_per_unit | Terpene | string | false |
| isopropanol_ug_per_g | Solvent | string | false |
| cbga_mg_per_unit | Cannabinoid | string | false |
| other_mycotoxins_ug_per_kg | Mycotoxin | string | false |
| diazinon_ug_per_g | Pesticide | string | false |
| terpinolene_mg_per_unit | Terpene | string | false |
| methylcyclohexane_ug_per_g | Solvent | string | false |
| cyclohexane_ug_per_g | Solvent | string | false |
| dinotefuran_ug_per_g | Pesticide | string | false |
| sabinene_percentage | Terpene | string | false |
| methyl_butanol_ug_per_g | Solvent | string | false |
| delta_3_carene_mg_per_unit | Terpene | string | false |
| ethyl_formate_ug_per_g | Other | string | false |
| ethanol_ug_per_g | Solvent | string | false |
| propiconazole_cis_ug_per_g | Pesticide | string | false |
| beta_caryophyllene_mg_per_unit | Terpene | string | false |
| alpha_myrcene_percentage | Terpene | string | false |
| ancymidol_ug_per_g | Pesticide | string | false |
| cbdv_mg_per_unit | Cannabinoid | string | false |
| spinetoram_j_ug_per_g | Pesticide | string | false |
| beta_cyfluthrin_ug_per_g | Pesticide | string | false |
| hexane_ug_per_g | Solvent | string | false |
| fenoxycarb_ug_per_g | Pesticide | string | false |
| gamma_terpinene_percentage | Terpene | string | false |
| methyl_acetate_ug_per_g | Solvent | string | false |
| cbc_mg_per_unit | Cannabinoid | string | false |
| thcv_percentage | Cannabinoid | string | false |
| nerolidol_mg_per_unit | Terpene | string | false |
| naled_ug_per_g | Pesticide | string | false |
| pyrethrins_cinerin_i_ug_per_g | Pesticide | string | false |
| pyrethrins_ug_per_g | Pesticide | string | false |
| methylisobutyl_ketone_ug_per_g | Solvent | string | false |
| caryophyllene_oxide_percentage | Terpene | string | false |
| methoxybenzene_ug_per_g | Solvent | string | false |
| arsenic_ug_per_g | Heavy Metal | string | false |
| cbt_mg_per_unit | Cannabinoid | string | false |
| mold_cfu_per_g | Microbial | string | false |
| prallethrin_cis_ug_per_g | Pesticide | string | false |
| linalool_percentage | Terpene | string | false |
| antimony_ug_per_g | Heavy Metal | string | false |
| formic_acid_percentage | Other | string | false |
| ocimene_percentage | Terpene | string | false |
| spinetoram_l_ug_per_g | Pesticide | string | false |
| terpineol_percentage | Terpene | string | false |
| spinosad_a_ug_per_g | Pesticide | string | false |
| yeast_cfu_per_g | Microbial | string | false |
| chlordane_ug_per_g | Pesticide | string | false |
| ochratoxin_a_ug_per_kg | Mycotoxin | string | false |
| cbl_percentage | Cannabinoid | string | false |
| alpha_pinene_mg_per_unit | Terpene | string | false |
| ethylene_oxide_ug_per_g | Solvent | string | false |
| guaiol_mg_per_unit | Terpene | string | false |
| paclobutrazol_ug_per_g | Pesticide | string | false |
| methyl_propanol_ug_per_g | Solvent | string | false |
| other_microbials_cfu_per_g | Microbial | string | false |
| chlordane_trans_ug_per_g | Pesticide | string | false |
| chromium_ug_per_g | Heavy Metal | string | false |
| pyrethrins_jasmolin_i_ug_per_g | Pesticide | string | false |
| cyfluthrin_ug_per_g | Pesticide | string | false |
| terpineol_mg_per_unit | Terpene | string | false |
| isobutyl_acetate_ug_per_g | Solvent | string | false |
| other_terpenes_mg_per_unit | Terpene | string | false |
| salmonella_cfu_per_g | Microbial | string | false |
| moisture_percentage | Moisture | string | false |
| ethephon_ug_per_g | Pesticide | string | false |
| toluene_ug_per_g | Solvent | string | false |
| linalool_mg_per_unit | Terpene | string | false |
| coumaphos_ug_per_g | Pesticide | string | false |
| dichloromethane_ug_per_g | Solvent | string | false |
| aspergillus_niger_cfu_per_g | Microbial | string | false |
| thcva_mg_per_unit | Cannabinoid | string | false |
| cumene_ug_per_g | Solvent | string | false |
| cbdv_percentage | Cannabinoid | string | false |
| guaiol_percentage | Terpene | string | false |
| trichloroethylene_ug_per_g | Solvent | string | false |
| kresoxim_methyl_ug_per_g | Pesticide | string | false |
| beta_pinene_mg_per_unit | Terpene | string | false |
| chlormequat_chloride_ug_per_g | Other | string | false |
| farnesene_mg_per_unit | Terpene | string | false |
| cbn_percentage | Cannabinoid | string | false |
| alpha_phellandrene_mg_per_unit | Terpene | string | false |
| permethrin_trans_ug_per_g | Pesticide | string | false |
| ethyl_acetate_ug_per_g | Solvent | string | false |
| propiconazole_ug_per_g | Pesticide | string | false |
| alpha_cyfluthrin_ug_per_g | Pesticide | string | false |
| limonene_percentage | Terpene | string | false |
| butane_ug_per_g | Solvent | string | false |
| dimethylacetamide_ug_per_g | Solvent | string | false |
| chlormequat_chloride_percentage | Other | string | false |
| piperonylbutoxide_ug_per_g | Pesticide | string | false |
| borneol_mg_per_unit | Terpene | string | false |
| acequinocyl_ug_per_g | Pesticide | string | false |
| ethyl_ether_ug_per_g | Solvent | string | false |
| chlorfenapyr_ug_per_g | Pesticide | string | false |
| imazalil_ug_per_g | Pesticide | string | false |
Assemblies
A collection of Assemblies
| Property | Description | Type | Required |
|---|---|---|---|
| data | Assemblies | array(Assembly) | false |
| next_page | URL for the next page of results; null when there is no next page | string | false |
Assembly
An assembly as shown in Distru
| Property | Description | Type | Required |
|---|---|---|---|
| assembly_number | The assembly number for this assembly | string | false |
| completion_datetime | The datetime this assembly was completed at | string | false |
| compliance_type | The compliance type for this assembly. Options include METRC, BIOTRACK or NONE | string | false |
| creation_source | The creation source for this assembly | string | false |
| custom_data | The custom data for this assembly | array(CustomField) | false |
| description | The description for this assembly | string | false |
| estimated_start_date | The datetime this assembly is expected to start | string | false |
| estimated_work_hours | The estimated work hours for this assembly | integer | false |
| estimated_work_minutes | The estimated work minutes for this assembly | integer | false |
| fulfilled | True if all assembly inputs have been fulfilled with batches or packages, false otherwise. | boolean | false |
| id | Unique ID for this assembly | string | false |
| is_metrc_processing_job | True if this assembly is associated with a Metrc processing job, false otherwise | boolean | false |
| license | A license as shown in Distru | License | false |
| outputs | The outputs for this assembly | array(AssemblyOutput) | false |
| owner_id | The ID of the user that owns this assembly | string | false |
| status | The status of this assembly | string | false |
AssemblyInput
An input for an assembly as shown in Distru
| Property | Description | Type | Required |
|---|---|---|---|
| batch | A batch for a product as shown in Distru | Batch | false |
| compliance_quantity | The quantity of this input expressed in the package's unit type. Null if this input is not package-tracked. | string | false |
| cost_per_unit | The cost per unit of this input | string | false |
| cost_per_unit_default | The default cost per unit (from the configured product unit cost) of this input | string | false |
| location | A location as nested inside another entity in Distru | LocationCompact | false |
| package | A package as shown in Distru | Package | false |
| product | A product as shown in Distru | Product | false |
| quantity | The quantity of this input in its product's unit | string | false |
| total_cost_actual | The total actual cost of this input | string | false |
| total_cost_default | The total default cost (from the configured product unit cost) of this input | string | false |
AssemblyOutput
An output for an assembly as shown in Distru
| Property | Description | Type | Required |
|---|---|---|---|
| additional_costs | The additional costs for this assembly output | array(AdditionalCost) | false |
| batch | A batch for a product as shown in Distru | Batch | false |
| compliance_label | The compliance label for this assembly output | string | false |
| compliance_quantity | The quantity of this output expressed in the package's unit type. Null if this input is not package-tracked. | string | false |
| cost_per_unit | The cost per unit of this output | string | false |
| cost_per_unit_default | The default cost per unit (from the configured product unit cost) of this output | string | false |
| expiration_datetime | The expiration date for this assembly output | string | false |
| ingredients | The ingredients for this assembly output | array(AssemblyInput) | false |
| is_finished_good | Is this output a finished good? | boolean | false |
| is_production_batch | Is this output a production batch? | boolean | false |
| location | A location as nested inside another entity in Distru | LocationCompact | false |
| package | A package as shown in Distru | Package | false |
| package_datetime | The date that this package was created at | string | false |
| package_unit_type | A unit type as shown in Distru | UnitType | false |
| product | A product as shown in Distru | Product | false |
| quantity | The quantity of this output in its product's unit | string | false |
| total_cost_actual | The total actual cost of this output | string | false |
| total_cost_default | The total default cost (from the configured product unit cost) of this output | string | false |
Batch
A batch for a product as shown in Distru
| Property | Description | Type | Required |
|---|---|---|---|
| id | Unique ID for this batch | string | false |
| name | Human readable name for this batch | string | false |
BatchFull
Extended details about a batch for a product as shown in Distru
| Property | Description | Type | Required |
|---|---|---|---|
| batch_number | The batch number for this batch | string | false |
| cost_per_unit_actual | The cost per unit of this batch | string | false |
| cost_per_unit_default | The default cost per unit (from the configured product unit cost) of this batch | string | false |
| custom_data | The custom data for this batch | array(CustomField) | false |
| deleted_at | The date and time when this batch was deleted | string | false |
| description | The description for this batch | string | false |
| expiration_date | The expiration date for this batch | string | false |
| id | Unique ID for this batch | string | false |
| manufactured_datetime | The manufactured datetime for this batch (ISO 8601 format) | string | false |
| name | Human readable name for this batch | string | false |
| owner_id | The ID of the user that owns this batch | string | false |
| primary_test_result | The compact primary test result nested on a package or batch | PrimaryTestResult | false |
| product_id | The ID of the batch's product | string | false |
| total_cost_actual | The total actual cost of this batch | string | false |
| total_cost_default | The total default cost (from the configured product unit cost) of this batch | string | false |
Batches
A collection of Batches
| Property | Description | Type | Required |
|---|---|---|---|
| data | Batches | array(BatchFull) | false |
| next_page | URL for the next page of results; null when there is no next page | string | false |
BillOfMaterials
A product's bill of materials (recipe of inputs and additional costs)
| Property | Description | Type | Required |
|---|---|---|---|
| costs | The additional costs applied by this bill of materials | array(BillOfMaterialsCost) | false |
| description | The description of this bill of materials | string | false |
| id | Unique ID for this bill of materials | string | false |
| inputs | The inputs consumed by this bill of materials | array(BillOfMaterialsInput) | false |
| name | Human readable name for this bill of materials | string | false |
BillOfMaterialsCost
An additional cost applied by a bill of materials
| Property | Description | Type | Required |
|---|---|---|---|
| cost_type | The cost type applied by a bill-of-materials cost | BillOfMaterialsCostType | false |
| description | The description of this cost | string | false |
| id | Unique ID for this cost | string | false |
| quantity | The quantity of the cost type applied | string | false |
BillOfMaterialsCostType
The cost type applied by a bill-of-materials cost
| Property | Description | Type | Required |
|---|---|---|---|
| cost_per_unit | The cost per unit. Null unless the caller has the costs_permissions_view_cost_types_cost_per_unit permission. |
string | false |
| id | Unique ID for this cost type | string | false |
| name | Human readable name for this cost type | string | false |
| unit_type | A unit type as shown in Distru | UnitType | false |
BillOfMaterialsFilter
A dynamic filter that selects products as a bill-of-materials input
| Property | Description | Type | Required |
|---|---|---|---|
| criteria | The filter criteria, each a type (category, subcategory, group, strain, unit_type, tags) and its matched values (each an id and name) |
array(any) | false |
| id | Unique ID for this filter | string | false |
| name | Human readable name for this filter | string | false |
BillOfMaterialsInput
A single input of a bill of materials
| Property | Description | Type | Required |
|---|---|---|---|
| filter | A dynamic filter that selects products as a bill-of-materials input | BillOfMaterialsFilter | false |
| id | Unique ID for this input | string | false |
| product | A product as shown in Distru | Product | false |
| quantity | The quantity of this input required by the bill of materials | string | false |
| type | The kind of input: product or filter |
string | false |
CancelCredit
Options for canceling a credit
{
"should_delete_credit_uses": false
}
| Property | Description | Type | Required |
|---|---|---|---|
| should_delete_credit_uses | When true, also removes this credit's applications to invoices (its credit uses), returning the used amounts to those invoices. Defaults to false. | boolean | false |
Charge
A line representing a Tax, Discount, or Charge added to an order
| Property | Description | Type | Required |
|---|---|---|---|
| id | Unique ID for this charge | string | false |
| name | The name for this charge | string | false |
| percent | The percent to charge for this line if it is a percentage | string | false |
| price | The price of this line if it is a flat charge | string | false |
| type | What type of additional line is this. Tax lines are returned as CHARGE with a populated tax object. | array(any) | false |
| unit_type | Determines if this line is tracked as a percentage or a flat charge | array(any) | false |
| tax.id | Unique ID for this Tax | string | false |
| tax.name | The name of this tax | string | false |
CogsReport
The Cost of Goods Sold report
{
"data": [
{
"batch": "BD-BATCH-07 (B-0042)",
"cost_origin": "Purchase Order",
"final_input": "Final",
"margin_actual": 0.757,
"margin_default": 0.743,
"metrc_production_batch_number": "PB-2026-0042",
"order_number": "1042",
"package": "1A4000000000000000000123",
"product_brand": "Sunshine Extracts",
"product_category": "Vape",
"product_name": "Blue Dream 1g Cartridge",
"profit_unit_actual": 26.5,
"profit_unit_default": 26.0,
"quantity": 4.0,
"sku": "BD-1G-CART",
"total_cost_actual": 34.0,
"total_cost_default": 36.0,
"total_price": 140.0,
"total_profits_actual": 106.0,
"total_profits_default": 104.0,
"unit_cost_actual": 8.5,
"unit_cost_default": 9.0,
"unit_price": 35.0,
"unit_type": "Each"
}
],
"meta": {
"columns": [
{
"key": "order_number",
"label": "Order Number"
},
{
"key": "final_input",
"label": "Final/Input"
},
{
"key": "cost_origin",
"label": "Cost Origin"
},
{
"key": "product_name",
"label": "Product Name"
},
{
"key": "sku",
"label": "SKU"
},
{
"key": "product_brand",
"label": "Product Brand"
},
{
"key": "product_category",
"label": "Product Category"
},
{
"key": "package",
"label": "Package"
},
{
"key": "metrc_production_batch_number",
"label": "Metrc Production Batch Number"
},
{
"key": "batch",
"label": "Batch"
},
{
"key": "quantity",
"label": "Quantity"
},
{
"key": "unit_type",
"label": "Unit Type"
},
{
"key": "unit_price",
"label": "Unit Price"
},
{
"key": "total_price",
"label": "Total Price"
},
{
"key": "unit_cost_actual",
"label": "Unit Cost (Actual)"
},
{
"key": "unit_cost_default",
"label": "Unit Cost (Default)"
},
{
"key": "total_cost_actual",
"label": "Total Cost (Actual)"
},
{
"key": "total_cost_default",
"label": "Total Cost (Default)"
},
{
"key": "total_profits_actual",
"label": "Total Profits (Actual)"
},
{
"key": "total_profits_default",
"label": "Total Profits (Default)"
},
{
"key": "profit_unit_actual",
"label": "Profit/Unit (Actual)"
},
{
"key": "profit_unit_default",
"label": "Profit/Unit (Default)"
},
{
"key": "margin_actual",
"label": "Margin (Actual)"
},
{
"key": "margin_default",
"label": "Margin (Default)"
}
],
"date_range": "Jul 26th 2026",
"report": "cogs"
}
}
| Property | Description | Type | Required |
|---|---|---|---|
| data | The report rows | array(CogsReportRow) | true |
| meta | Report-level metadata | CogsReportMeta | true |
CogsReportColumn
| Property | Description | Type | Required |
|---|---|---|---|
| key | The key used for this column in each data row | string | true |
| label | The human-readable label of the column | string | true |
CogsReportMeta
Report-level metadata
| Property | Description | Type | Required |
|---|---|---|---|
| columns | The report's column definitions | array(CogsReportColumn) | false |
| date_range | The human-readable date the report was generated | string | false |
| report | The report identifier | string | true |
CogsReportRow
A single row of the Cost of Goods Sold report (one sales order line item). Companies on the BioTrack compliance integration do not get the metrc_production_batch_number key.
{
"batch": "BD-BATCH-07 (B-0042)",
"cost_origin": "Purchase Order",
"final_input": "Final",
"margin_actual": 0.757,
"margin_default": 0.743,
"metrc_production_batch_number": "PB-2026-0042",
"order_number": "1042",
"package": "1A4000000000000000000123",
"product_brand": "Sunshine Extracts",
"product_category": "Vape",
"product_name": "Blue Dream 1g Cartridge",
"profit_unit_actual": 26.5,
"profit_unit_default": 26.0,
"quantity": 4.0,
"sku": "BD-1G-CART",
"total_cost_actual": 34.0,
"total_cost_default": 36.0,
"total_price": 140.0,
"total_profits_actual": 106.0,
"total_profits_default": 104.0,
"unit_cost_actual": 8.5,
"unit_cost_default": 9.0,
"unit_price": 35.0,
"unit_type": "Each"
}
| Property | Description | Type | Required |
|---|---|---|---|
| batch | The Distru batch number | string | false |
| cost_origin | The origin of the cost | string | false |
| final_input | Whether the row is the sold item (Final) |
string | false |
| margin_actual | The actual margin | number | false |
| margin_default | The default margin | number | false |
| metrc_production_batch_number | The Metrc production batch number | string | false |
| order_number | The sales order number | string | false |
| package | The package compliance label | string | false |
| product_brand | The product's brand | string | false |
| product_category | The product's category | string | false |
| product_name | The product name | string | false |
| profit_unit_actual | The actual profit per unit | number | false |
| profit_unit_default | The default profit per unit | number | false |
| quantity | The quantity sold, net of returns | number | false |
| sku | The product SKU | string | false |
| total_cost_actual | The actual total cost | number | false |
| total_cost_default | The default total cost | number | false |
| total_price | The total price (unit price times quantity) | number | false |
| total_profits_actual | The actual total profit | number | false |
| total_profits_default | The default total profit | number | false |
| unit_cost_actual | The actual cost per unit | number | false |
| unit_cost_default | The default cost per unit | number | false |
| unit_price | The price per unit | number | false |
| unit_type | The item's unit type | string | false |
CompactCredit
A compact representation of a credit
| Property | Description | Type | Required |
|---|---|---|---|
| amount | The current amount of this credit | string | false |
| credit_number | The credit number as shown in the Distru UI | string | false |
| id | Unique ID for this credit | string | false |
| source | How this credit was created | string | false |
CompactReturn
A compact representation of a return
| Property | Description | Type | Required |
|---|---|---|---|
| company | A company as nested inside another entity in Distru | CompanyCompact | false |
| id | Unique ID for this return | string | false |
| return_datetime | The datetime of this return | string | false |
| return_number | The return number as shown in the Distru UI | string | false |
| status | The status of this return | string | false |
| total | The total value of this return | number | false |
Companies
A collection of companies
| Property | Description | Type | Required |
|---|---|---|---|
| data | Companies | array(Company) | false |
| next_page | URL for the next page of results; null when there is no next page | string | false |
Company
A company as shown in Distru
| Property | Description | Type | Required |
|---|---|---|---|
| category | The category of this company | string | false |
| custom_data | The custom data for this company | array(CustomField) | false |
| default_email | The default email for this company | string | false |
| default_payment_term | A payment term as shown in Distru | PaymentTerm | false |
| default_purchase_order_notes | The default notes that will be automatically added to purchase orders when this company is the supplier | string | false |
| default_sales_order_notes | The default external notes that will be automatically added to sales orders when this company is the customer | string | false |
| deleted_at | The datetime this company relationship was deleted at | string | false |
| group | A company group as shown in Distru | CompanyGroup | false |
| id | Unique ID for this company | string | false |
| invoice_email | The email address where sales order invoices are delivered | string | false |
| legal_business_name | The legal business name for this company | string | false |
| licenses | The license for the company | array(License) | false |
| locations | The location for the company | array(LocationCompact) | false |
| name | Human readable name for this company | string | false |
| order_shipment_email | The email address where sales order shipment packing slips are delivered | string | false |
| outstanding_balance | The current outstanding (unpaid) balance for this company, as a decimal string (e.g. "150.50"). "0" when nothing is outstanding. | string | false |
| outstanding_balance_threshold | Threshold that determines when a company is considered to have a too high an outstanding balance. When exceeded, Distru will show a warning banner in the company's page and when selling to this company. | integer | false |
| owner | Information about a user in Distru | User | false |
| owner_id | The ID of the user that owns this company | string | false |
| phone_number | The phone number for this company | string | false |
| purchase_order_email | The email address where purchase order slips are delivered | string | false |
| relationship_type | A relationship type as shown in Distru | RelationshipType | false |
| sales_order_email | The email address where sales order slips are delivered | string | false |
| updated_datetime | The datetime this company was last updated at | string | false |
| website | The website for this company | string | false |
CompanyCompact
A company as nested inside another entity in Distru
| Property | Description | Type | Required |
|---|---|---|---|
| id | Unique ID for this company | string | false |
| name | Human readable name for this company | string | false |
| updated_datetime | The datetime this company was last updated at | string | false |
CompanyGroup
A company group as shown in Distru
{
"id": "3f128a34-cc59-4b49-8883-23bf10e59c6c",
"name": "Group 123"
}
| Property | Description | Type | Required |
|---|---|---|---|
| id | Unique ID for this company group | string | false |
| name | Name of the company group | string | false |
CompanyGroupFull
A company group
| Property | Description | Type | Required |
|---|---|---|---|
| id | Unique ID for this company group | string | false |
| inserted_datetime | When the company group was created (UTC ISO-8601) | string | false |
| name | The name of the company group | string | false |
| updated_datetime | When the company group was last updated (UTC ISO-8601) | string | false |
CompanyGroups
A collection of company groups
| Property | Description | Type | Required |
|---|---|---|---|
| data | Company Groups | array(CompanyGroupFull) | false |
| next_page | URL for the next page of results; null when there is no next page | string | false |
Contact
Information about a contact in Distru's CRM
{
"company": {
"id": "3f128a34-cc59-4b49-8883-23bf10e59c6c"
},
"email": "contact@example.com",
"full_name": "John Doe",
"id": "12345",
"owner": {
"id": "02c88a3f-d759-4973-88f9-60049d682524"
}
}
| Property | Description | Type | Required |
|---|---|---|---|
| custom_data | The custom data for this contact | array(CustomField) | false |
| deleted_at | The datetime of deletion if the contact was deleted | string | false |
| description | The description of this contact | string | false |
| driver_license_issuing_state | Driver license issuing state for shipping manifests | string | false |
| driver_license_number | Driver license number for shipping manifests | string | false |
| The email address of this contact | string | false | |
| first_name | The first name of this contact | string | false |
| full_name | The full name of this contact | string | false |
| id | Unique ID for this contact | string | false |
| last_name | The last name of this contact | string | false |
| owner | Information about a user in Distru | User | false |
| phone_number | The phone number of this contact | string | false |
| title | The title of this contact | string | false |
| work_phone_number | The work phone number of this contact | string | false |
| company.id | Unique ID for this company | string | false |
Contacts
A collection of Contacts
| Property | Description | Type | Required |
|---|---|---|---|
| data | Contacts | array(Contact) | false |
| next_page | URL for the next page of results; null when there is no next page | string | false |
CostType
A cost type
| Property | Description | Type | Required |
|---|---|---|---|
| active | Whether the cost type is active | boolean | false |
| allow_inline_edits | Controls whether the per-unit cost amount can be overridden when a cost of this type is applied to a record (a plant cost, an assembly or breakdown output cost, or an order/invoice cost line). When true, the user may enter or override cost_per_unit at apply time; when false, the applied amount is locked to this cost type's configured cost_per_unit and cannot be changed. |
boolean | false |
| cost_per_unit | The cost per unit as a decimal string | string | false |
| description | A description of the cost type | string | false |
| id | Unique ID for this cost type | string | false |
| inserted_datetime | When the cost type was created (UTC ISO-8601) | string | false |
| name | The name of the cost type | string | false |
| unit_type | A unit type as shown in Distru | UnitType | false |
| updated_datetime | When the cost type was last updated (UTC ISO-8601) | string | false |
CostTypes
A collection of cost types
| Property | Description | Type | Required |
|---|---|---|---|
| data | Cost Types | array(CostType) | false |
| next_page | URL for the next page of results; null when there is no next page | string | false |
Credit
A credit as shown in Distru
{
"amount": "100",
"company": {
"id": "00000000-0000-0000-0000-00000000000a",
"name": "RAW"
},
"credit_number": "CRT-00000001",
"credit_uses": [
{
"amount": "50",
"credit": {
"amount": "100",
"credit_number": "CRT-00000001",
"id": "00000000-0000-0000-0000-000000000001",
"source": "USER"
},
"id": "00000000-0000-0000-0000-000000000002",
"payment": {
"amount": "50",
"company": {
"id": "00000000-0000-0000-0000-00000000000a",
"name": "RAW"
},
"credit_uses": [],
"description": "Payment for invoice INV-001",
"fully_paid_with_credits": false,
"id": "12345",
"inserted_datetime": "2024-12-12T20:26:19.297537Z",
"invoice": {
"id": "67890",
"invoice_number": "INV-001",
"status": "FULLY_PAID",
"total": "150.50"
},
"overpayment_credits": [],
"payment_date": "2024-12-12T20:26:19.297537Z",
"payment_method": {
"id": "12345",
"name": "Credit Card"
},
"payment_number": "PAY-001",
"payment_type": "INVOICE",
"status": "POSTED",
"updated_datetime": "2024-12-12T20:26:19.297537Z"
}
}
],
"deleted_in_qbo": false,
"external_note": "External note",
"id": "00000000-0000-0000-0000-000000000001",
"inserted_datetime": "2024-12-12T20:26:19.297537Z",
"internal_note": "Internal note",
"original_amount": "150",
"owner": {
"banned": false,
"email": "jeanb@zorgindustries.com",
"full_name": "Jean-Baptiste Emanuel Zorg",
"id": "12345"
},
"qb_sync_status": "SYNCED",
"remaining_balance": "100",
"source": "USER",
"status": "ACTIVE",
"updated_datetime": "2024-12-12T20:26:19.297537Z"
}
| Property | Description | Type | Required |
|---|---|---|---|
| amount | The current amount of this credit | string | false |
| canceled_datetime | The datetime at which the credit was canceled. Only set for CANCELED credits. | string | false |
| company | A company as nested inside another entity in Distru | CompanyCompact | false |
| credit_number | The credit number as shown in the Distru UI | string | false |
| credit_uses | This credit's applications to invoices. Each use has the applied amount, the compact credit, and the invoice payment it was applied to. | array(CreditUse) | false |
| deleted_in_qbo | Whether this credit was pushed to QuickBooks and later deleted there. | boolean | false |
| external_note | A note on this credit, visible to the customer | string | false |
| id | Unique ID for this credit | string | false |
| inserted_datetime | The datetime at which the credit was created in Distru | string | false |
| internal_note | An internal note on this credit | string | false |
| original_amount | The amount this credit was originally created with. Never changes. | string | false |
| owner | Information about a user in Distru | User | false |
| payment | A payment as shown in Distru | Payment | false |
| qb_credit_memo_id | The id of the QuickBooks credit memo this credit maps to, when synced. | string | false |
| qb_payment_id | The id of the QuickBooks payment this credit maps to, when synced. | string | false |
| qb_sync_status | The credit's QuickBooks sync status. Only meaningful when the QuickBooks integration is enabled; null otherwise. Values: PENDING (the latest sync covering this credit is still in flight), ERROR (the latest sync covering this credit failed), DELETED_IN_QBO (pushed to QuickBooks once, then deleted there), NOT_SYNCED (never pushed to QuickBooks), PARTIALLY_SYNCED (the credit is in QuickBooks but at least one of its applications has not been synced yet), SYNCED (fully synced). | string | false |
| remaining_balance | The unused balance still available on this credit | string | false |
| return | A compact representation of a return | CompactReturn | false |
| source | How this credit was created | string | false |
| status | The status of this credit. ACTIVE has a remaining balance, REDEEMED is fully used, CANCELED was voided. | string | false |
| updated_datetime | The datetime at which the credit was last updated in Distru | string | false |
CreditUse
An application of a credit to an invoice payment
| Property | Description | Type | Required |
|---|---|---|---|
| amount | The amount of the credit applied to the invoice payment | string | false |
| credit | A compact representation of a credit | CompactCredit | false |
| id | Unique ID for this credit use | string | false |
| payment | A payment as shown in Distru | Payment | false |
Credits
A collection of Credits
| Property | Description | Type | Required |
|---|---|---|---|
| data | Credits | array(Credit) | false |
| next_page | URL for the next page of results; null when there is no next page | string | false |
CultivationTransactionHistoryReport
The Cultivation Transaction History report
{
"data": [
{
"amount": 50,
"batch_name": "Blue Dream 2026-01",
"date": "01/15/2026",
"description": "Created from immature package",
"package_label_s": "1A4FF0100000022000000201",
"plant_tag_s": "1A4FF0100000022000000101, 1A4FF0100000022000000102",
"product_name": "Blue Dream Flower",
"related_entity": "Teardown #42",
"related_entity_status": "Completed",
"strain": "Blue Dream",
"total_cost": 1.2e3,
"type": "Plant Batch Creation",
"unit": "Unit"
}
],
"meta": {
"columns": [
{
"key": "date",
"label": "Date"
},
{
"key": "strain",
"label": "Strain"
},
{
"key": "batch_name",
"label": "Batch Name"
},
{
"key": "plant_tag_s",
"label": "Plant Tag(s)"
},
{
"key": "product_name",
"label": "Product Name"
},
{
"key": "package_label_s",
"label": "Package Label(s)"
},
{
"key": "type",
"label": "Type"
},
{
"key": "related_entity",
"label": "Related Entity"
},
{
"key": "related_entity_status",
"label": "Related Entity Status"
},
{
"key": "amount",
"label": "Amount"
},
{
"key": "unit",
"label": "Unit"
},
{
"key": "description",
"label": "Description"
},
{
"key": "total_cost",
"label": "Total Cost"
}
],
"date_range": "Jan 1st 2026 to Feb 1st 2026",
"report": "cultivation_transaction_history"
}
}
| Property | Description | Type | Required |
|---|---|---|---|
| data | The report rows | array(CultivationTransactionHistoryReportRow) | true |
| meta | Report-level metadata | CultivationTransactionHistoryReportMeta | true |
CultivationTransactionHistoryReportColumn
| Property | Description | Type | Required |
|---|---|---|---|
| key | The key used for this column in each data row | string | true |
| label | The human-readable label of the column | string | true |
CultivationTransactionHistoryReportMeta
Report-level metadata
| Property | Description | Type | Required |
|---|---|---|---|
| columns | The report's column definitions | array(CultivationTransactionHistoryReportColumn) | false |
| date_range | The human-readable date range the report covers | string | false |
| report | The report identifier | string | true |
CultivationTransactionHistoryReportRow
A single row of the Cultivation Transaction History report (one cultivation transaction). The total_cost key is omitted for users without permission to view costs.
{
"amount": 50,
"batch_name": "Blue Dream 2026-01",
"date": "01/15/2026",
"description": "Created from immature package",
"package_label_s": "1A4FF0100000022000000201",
"plant_tag_s": "1A4FF0100000022000000101, 1A4FF0100000022000000102",
"product_name": "Blue Dream Flower",
"related_entity": "Teardown #42",
"related_entity_status": "Completed",
"strain": "Blue Dream",
"total_cost": 1.2e3,
"type": "Plant Batch Creation",
"unit": "Unit"
}
| Property | Description | Type | Required |
|---|---|---|---|
| amount | The signed transaction amount | number | false |
| batch_name | The plant batch name | string | false |
| date | The transaction date, in the company's timezone | string | false |
| description | The transaction description | string | false |
| package_label_s | The package compliance label(s) | string | false |
| plant_tag_s | The plant tag(s) involved | string | false |
| product_name | The product name | string | false |
| related_entity | The related entity (teardown or harvest) | string | false |
| related_entity_status | The related entity's status | string | false |
| strain | The strain name | string | false |
| total_cost | The transaction's total cost | number | false |
| type | The transaction type | string | false |
| unit | The unit | string | false |
CustomField
A custom field as shown in Distru
{
"id": 98,
"name": "Custom Field 1",
"value": "Custom Field Value 1"
}
| Property | Description | Type | Required |
|---|---|---|---|
| id | Unique ID for this custom field | integer | false |
| name | The name of this custom field | string | false |
| value | The value of the custom field in the context of the object it's associated with | string | false |
CustomFieldDefinition
A custom field definition
| Property | Description | Type | Required |
|---|---|---|---|
| description | Description of the custom field | string | false |
| field_options | Field options | array(any) | false |
| field_type | Field type | string | false |
| filterable | Whether the field is filterable | boolean | false |
| id | Custom field ID | integer | false |
| name | Name of the custom field | string | false |
| parent_object | Parent object attached to the field | string | false |
| required | Whether a value for the field is required when saving a record | boolean | false |
CustomFieldDefinitions
A collection of custom field definitions
| Property | Description | Type | Required |
|---|---|---|---|
| data | The custom field definitions | array(CustomFieldDefinition) | false |
Driver
A driver
| Property | Description | Type | Required |
|---|---|---|---|
| birth_date | The driver's birth date (ISO-8601 date) | string | false |
| driver_license | The driver's license number | string | false |
| The driver's email | string | false | |
| first_name | The driver's first name | string | false |
| hire_date | The driver's hire date (ISO-8601 date) | string | false |
| id | Unique ID for this driver | string | false |
| inserted_datetime | When the driver was created (UTC ISO-8601) | string | false |
| last_name | The driver's last name | string | false |
| occupational_license_number | The driver's occupational license number | string | false |
| phone_number | The driver's phone number | string | false |
| updated_datetime | When the driver was last updated (UTC ISO-8601) | string | false |
| us_state | The driver's US state | string | false |
Drivers
A collection of drivers
| Property | Description | Type | Required |
|---|---|---|---|
| data | Drivers | array(Driver) | false |
| next_page | URL for the next page of results; null when there is no next page | string | false |
FileAttachment
A file attachment
| Property | Description | Type | Required |
|---|---|---|---|
| assembly_id | ID of the assembly this file is attached to, if any | string | false |
| batch_id | ID of the batch this file is attached to, if any | string | false |
| company_relationship_id | ID of the company relationship this file is attached to, if any | string | false |
| contact_id | ID of the contact this file is attached to, if any | string | false |
| id | Unique ID for this file attachment | string | false |
| invoice_id | ID of the invoice this file is attached to, if any | string | false |
| license_id | ID of the license this file is attached to, if any | string | false |
| mime_type | MIME type of the file; null when the file is missing | string | false |
| name | The file name | string | false |
| order_id | ID of the order this file is attached to, if any | string | false |
| order_shipment_id | ID of the order shipment this file is attached to, if any | string | false |
| product_id | ID of the product this file is attached to, if any | string | false |
| purchase_id | ID of the purchase this file is attached to, if any | string | false |
| request_id | ID of the request this file is attached to, if any | string | false |
| return_id | ID of the return this file is attached to, if any | string | false |
| size_in_bytes | Size of the file in bytes; null when the file is missing | integer | false |
| stock_transfer_id | ID of the stock transfer this file is attached to, if any | string | false |
| task_id | ID of the task this file is attached to, if any | string | false |
| upload_datetime | When the file was uploaded (UTC ISO-8601) | string | false |
| url | URL to download the file; null when the file is missing | string | false |
| uploader.id | string | false | |
| uploader.name | string | false |
HarvestOutputsReport
The Harvest Outputs report
{
"data": [
{
"cost_input_output": "Output",
"cost_type": "Labor",
"cost_type_description": "Trimming labor",
"distru_product": "Blue Dream Flower",
"harvest_assembly_date": "07/01/2026",
"harvest_assembly_number": "HA-0000001",
"harvest_name": "Blue Dream Fall 2026",
"line_item_id": "a1b2c3d4-e5f6-47a8-9b0c-1d2e3f4a5b6c",
"location": "Main Warehouse",
"output_batch_number": "BATCH-0001",
"output_package_number": "1A4FF0100000022000000123",
"output_reference_id": "b2c3d4e5-f6a7-48b9-8c0d-2e3f4a5b6c7d",
"product_category": "Flower",
"quantity": 1.2e3,
"status": "COMPLETED",
"strain": "Blue Dream",
"total_cost_actual": 3.4e3,
"total_cost_default": 3.6e3,
"unit_cost_actual": 2.83,
"unit_cost_default": 3.0,
"unit_type": "Grams"
}
],
"meta": {
"columns": [
{
"key": "harvest_assembly_date",
"label": "Harvest Assembly Date"
},
{
"key": "harvest_assembly_number",
"label": "Harvest Assembly Number"
},
{
"key": "status",
"label": "Status"
},
{
"key": "harvest_name",
"label": "Harvest Name"
},
{
"key": "output_batch_number",
"label": "Output Batch Number"
},
{
"key": "output_package_number",
"label": "Output Package Number"
},
{
"key": "strain",
"label": "Strain"
},
{
"key": "location",
"label": "Location"
},
{
"key": "cost_input_output",
"label": "Cost/Input/Output"
},
{
"key": "distru_product",
"label": "Distru Product"
},
{
"key": "product_category",
"label": "Product Category"
},
{
"key": "quantity",
"label": "Quantity"
},
{
"key": "unit_type",
"label": "Unit Type"
},
{
"key": "unit_cost_actual",
"label": "Unit Cost (Actual)"
},
{
"key": "unit_cost_default",
"label": "Unit Cost (Default)"
},
{
"key": "total_cost_actual",
"label": "Total Cost (Actual)"
},
{
"key": "total_cost_default",
"label": "Total Cost (Default)"
},
{
"key": "cost_type",
"label": "Cost Type"
},
{
"key": "cost_type_description",
"label": "Cost Type Description"
},
{
"key": "line_item_id",
"label": "Line Item ID"
},
{
"key": "output_reference_id",
"label": "Output Reference ID"
}
],
"date_range": "Jul 20th 2026 to Jul 27th 2026",
"report": "harvest_outputs"
}
}
| Property | Description | Type | Required |
|---|---|---|---|
| data | The report rows | array(HarvestOutputsReportRow) | true |
| meta | Report-level metadata | HarvestOutputsReportMeta | true |
HarvestOutputsReportColumn
| Property | Description | Type | Required |
|---|---|---|---|
| key | The key used for this column in each data row | string | true |
| label | The human-readable label of the column | string | true |
HarvestOutputsReportMeta
Report-level metadata
| Property | Description | Type | Required |
|---|---|---|---|
| columns | The report's column definitions | array(HarvestOutputsReportColumn) | false |
| date_range | The human-readable date range the report covers | string | false |
| report | The report identifier | string | true |
HarvestOutputsReportRow
A single row of the Harvest Outputs report (one input, output, or cost line item of a harvest assembly). The cost keys (unit_cost_actual, unit_cost_default, total_cost_actual, total_cost_default, cost_type, cost_type_description) are omitted for users without permission to view costs.
{
"cost_input_output": "Output",
"cost_type": "Labor",
"cost_type_description": "Trimming labor",
"distru_product": "Blue Dream Flower",
"harvest_assembly_date": "07/01/2026",
"harvest_assembly_number": "HA-0000001",
"harvest_name": "Blue Dream Fall 2026",
"line_item_id": "a1b2c3d4-e5f6-47a8-9b0c-1d2e3f4a5b6c",
"location": "Main Warehouse",
"output_batch_number": "BATCH-0001",
"output_package_number": "1A4FF0100000022000000123",
"output_reference_id": "b2c3d4e5-f6a7-48b9-8c0d-2e3f4a5b6c7d",
"product_category": "Flower",
"quantity": 1.2e3,
"status": "COMPLETED",
"strain": "Blue Dream",
"total_cost_actual": 3.4e3,
"total_cost_default": 3.6e3,
"unit_cost_actual": 2.83,
"unit_cost_default": 3.0,
"unit_type": "Grams"
}
| Property | Description | Type | Required |
|---|---|---|---|
| cost_input_output | The line item type (Input, Output, or Cost) |
string | false |
| cost_type | The cost type name | string | false |
| cost_type_description | The cost type description | string | false |
| distru_product | The Distru product name | string | false |
| harvest_assembly_date | The harvest assembly date | string | false |
| harvest_assembly_number | The harvest assembly number | string | false |
| harvest_name | The harvest name | string | false |
| line_item_id | The line item ID | string | false |
| location | The location name | string | false |
| output_batch_number | The output batch number | string | false |
| output_package_number | The output package compliance label | string | false |
| output_reference_id | The referenced output ID for cost line items | string | false |
| product_category | The product category | string | false |
| quantity | The line item quantity | number | false |
| status | The assembly status | string | false |
| strain | The strain name | string | false |
| total_cost_actual | The actual total cost | number | false |
| total_cost_default | The default total cost | number | false |
| unit_cost_actual | The actual cost per unit | number | false |
| unit_cost_default | The default cost per unit | number | false |
| unit_type | The unit type | string | false |
Image
An image as shown in Distru
{
"id": "12345",
"name": "image.jpg",
"rank": 0,
"url": "https://example.com/image.jpg"
}
| Property | Description | Type | Required |
|---|---|---|---|
| id | Unique ID for this image | string | false |
| name | Name of the file for this image | string | false |
| rank | The rank of this image in the list of images for the product | integer | false |
| url | URL to the image file | string | false |
Inventories
A list of active and available quantity for each group
| Property | Description | Type | Required |
|---|---|---|---|
| data | Inventories | array(Inventory) | false |
| next_page | URL for the next page of results; null when there is no next page | string | false |
Inventory
{
"active": "500.000000000",
"available": "400.000000000",
"batch_number": "1234",
"location_id": "1764da45-c1be-425c-9b31-b860cdb93e98",
"product_id": "67ae9080-8dc2-4ab7-9704-19673f4d9f21",
"reserved": "100.000000000"
}
| Property | Description | Type | Required |
|---|---|---|---|
| active | Active quantity | string | true |
| available | Available quantity (active - reserved) | string | true |
| batch_number | The batch number of the batch or the package | string | false |
| cost_default_per_unit | The cost per unit of the inventory. Note: This is calculated by dividing the total default cost by the active quantity. | string | false |
| cost_per_unit_actual | The cost per unit of the inventory. Note: This is calculated by dividing the total cost by the active quantity. | string | false |
| location_id | ID of the location | string | false |
| product_id | ID of the product | string | true |
| reserved | Reserved quantity | string | true |
| total_cost_actual | The aggregated total cost of the inventory's active quantity | string | false |
| total_cost_default | The aggregated total default cost of the inventory's active quantity | string | false |
| updated_datetime | The datetime at which the inventory was last updated | string | false |
InventoryAssetsReport
The Inventory Assets report
{
"data": [
{
"active_quantity": 120.0,
"assembling_quantity": 0.0,
"batch_number": "BD-2026-01",
"category": "Vape Cartridges",
"expiration_date": "2027-01-15",
"harvest_date": "2025-11-01",
"license": "C11-0000123-LIC",
"location": "Main Warehouse",
"owner": "Jane Doe",
"package_number": "1A4060300003B01000001234",
"product": "Blue Dream 1g Cartridge",
"selling_quantity": 0.0,
"sku": "BD-1G-CART",
"subcategory": "Distillate",
"total_cost_actual": 1020.0,
"total_cost_default": 960.0,
"tracking_method": "BATCH",
"unit_cost_actual": 8.5,
"unit_cost_default": 8.0,
"unit_price": 35.0,
"unit_type": "Each",
"vendor": "Sunshine Extracts"
}
],
"meta": {
"columns": [
{
"key": "product",
"label": "Product"
},
{
"key": "license",
"label": "License"
},
{
"key": "location",
"label": "Location"
},
{
"key": "package_number",
"label": "Package Number"
},
{
"key": "batch_number",
"label": "Batch Number"
},
{
"key": "sku",
"label": "SKU"
},
{
"key": "vendor",
"label": "Vendor"
},
{
"key": "owner",
"label": "Owner"
},
{
"key": "unit_type",
"label": "Unit Type"
},
{
"key": "active_quantity",
"label": "Active Quantity"
},
{
"key": "assembling_quantity",
"label": "Assembling Quantity"
},
{
"key": "selling_quantity",
"label": "Selling Quantity"
},
{
"key": "category",
"label": "Category"
},
{
"key": "subcategory",
"label": "Subcategory"
},
{
"key": "unit_price",
"label": "Unit Price"
},
{
"key": "unit_cost_actual",
"label": "Unit Cost (Actual)"
},
{
"key": "unit_cost_default",
"label": "Unit Cost (Default)"
},
{
"key": "total_cost_actual",
"label": "Total Cost (Actual)"
},
{
"key": "total_cost_default",
"label": "Total Cost (Default)"
},
{
"key": "expiration_date",
"label": "Expiration Date"
},
{
"key": "tracking_method",
"label": "Tracking Method"
},
{
"key": "harvest_date",
"label": "Harvest Date"
}
],
"date_range": "Jul 27th 2026",
"report": "inventory_assets"
}
}
| Property | Description | Type | Required |
|---|---|---|---|
| data | The report rows | array(InventoryAssetsReportRow) | true |
| meta | Report-level metadata | InventoryAssetsReportMeta | true |
InventoryAssetsReportColumn
| Property | Description | Type | Required |
|---|---|---|---|
| key | The key used for this column in each data row | string | true |
| label | The human-readable label of the column | string | true |
InventoryAssetsReportMeta
Report-level metadata
| Property | Description | Type | Required |
|---|---|---|---|
| columns | The report's column definitions | array(InventoryAssetsReportColumn) | false |
| date_range | The human-readable date the report was generated | string | false |
| report | The report identifier | string | true |
InventoryAssetsReportRow
A single row of the Inventory Assets report. The final_input, cost_origin, and cost_quantity keys are present only when style=granular. Cost keys (unit_cost_actual, unit_cost_default, total_cost_actual, total_cost_default) are omitted for users without permission to view costs.
{
"active_quantity": 120.0,
"assembling_quantity": 0.0,
"batch_number": "BD-2026-01",
"category": "Vape Cartridges",
"expiration_date": "2027-01-15",
"harvest_date": "2025-11-01",
"license": "C11-0000123-LIC",
"location": "Main Warehouse",
"owner": "Jane Doe",
"package_number": "1A4060300003B01000001234",
"product": "Blue Dream 1g Cartridge",
"selling_quantity": 0.0,
"sku": "BD-1G-CART",
"subcategory": "Distillate",
"total_cost_actual": 1020.0,
"total_cost_default": 960.0,
"tracking_method": "BATCH",
"unit_cost_actual": 8.5,
"unit_cost_default": 8.0,
"unit_price": 35.0,
"unit_type": "Each",
"vendor": "Sunshine Extracts"
}
| Property | Description | Type | Required |
|---|---|---|---|
| active_quantity | The active on-hand quantity | number | false |
| assembling_quantity | The quantity being assembled | number | false |
| batch_number | The batch number | string | false |
| category | The product's category | string | false |
| cost_origin | The origin of the cost input (granular) | string | false |
| cost_quantity | The quantity attributed to the cost input (granular) | number | false |
| expiration_date | The asset's expiration date | string | false |
| final_input | Whether the row is the final asset or a cost input (granular) | string | false |
| harvest_date | The package's harvest date | string | false |
| license | The location's license number | string | false |
| location | The location name | string | false |
| owner | The product owner's name | string | false |
| package_number | The package compliance label | string | false |
| product | The product name | string | false |
| selling_quantity | The quantity being sold | number | false |
| sku | The product SKU | string | false |
| subcategory | The product's subcategory | string | false |
| total_cost_actual | The actual total cost | number | false |
| total_cost_default | The default total cost | number | false |
| tracking_method | The product's inventory tracking method | string | false |
| unit_cost_actual | The actual cost per unit | number | false |
| unit_cost_default | The default cost per unit | number | false |
| unit_price | The product's unit price | number | false |
| unit_type | The unit type | string | false |
| vendor | The product's vendor | string | false |
InventoryTransactionHistoryReport
The Inventory Transaction History report
{
"data": [
{
"amount": -4.0,
"batch_id": "00000000-0000-0000-0000-000000000400",
"batch_number": "BD-2026-01",
"cbd": 0.5,
"cbd_mg_g": 5.0,
"cbd_mg_ml": 4.0,
"company_relationship_id": "00000000-0000-0000-0000-0000000015bf",
"date": "2026-07-01 09:30",
"description": "Manual stock adjustment",
"metrc_production_batch_number": "PB-2026-0042",
"metrc_unit_name": "Each",
"package_batch_number_or_batch_name": "BD-2026-01",
"package_label": "1A4060300003B01000001234",
"product": "Blue Dream 1g Cartridge",
"product_id": "e9323492-95cc-402a-b29d-22a84ff2b1ef",
"related_entity": "Stock Adjustment",
"related_entity_customer_vendor": "Green Leaf Dispensary",
"related_entity_status": "COMPLETED",
"thc": 21.5,
"thc_mg_g": 215.0,
"thc_mg_ml": 780.0,
"total_cbd": 0.6,
"total_cbd_mg_g": 6.0,
"total_cbd_mg_ml": 5.0,
"total_cost": 34.0,
"total_thc": 24.8,
"total_thc_mg_g": 248.0,
"total_thc_mg_ml": 800.0,
"type": "adjustment",
"unit_type": "Each"
}
],
"meta": {
"columns": [
{
"key": "date",
"label": "Date"
},
{
"key": "product",
"label": "Product"
},
{
"key": "package_batch_number_or_batch_name",
"label": "Package Batch Number or Batch Name"
},
{
"key": "batch_number",
"label": "Batch Number"
},
{
"key": "package_label",
"label": "Package Label"
},
{
"key": "metrc_production_batch_number",
"label": "Metrc Production Batch Number"
},
{
"key": "type",
"label": "Type"
},
{
"key": "related_entity",
"label": "Related Entity"
},
{
"key": "related_entity_status",
"label": "Related Entity Status"
},
{
"key": "related_entity_customer_vendor",
"label": "Related Entity Customer/Vendor"
},
{
"key": "amount",
"label": "Amount"
},
{
"key": "unit_type",
"label": "Unit Type"
},
{
"key": "metrc_unit_name",
"label": "Metrc Unit Name"
},
{
"key": "product_id",
"label": "Product Id"
},
{
"key": "batch_id",
"label": "Batch Id"
},
{
"key": "company_relationship_id",
"label": "Company Relationship Id"
},
{
"key": "description",
"label": "Description"
},
{
"key": "thc",
"label": "THC %"
},
{
"key": "total_thc",
"label": "Total THC %"
},
{
"key": "thc_mg_g",
"label": "THC mg/g"
},
{
"key": "thc_mg_ml",
"label": "THC mg/mL"
},
{
"key": "total_thc_mg_g",
"label": "Total THC mg/g"
},
{
"key": "total_thc_mg_ml",
"label": "Total THC mg/mL"
},
{
"key": "cbd",
"label": "CBD %"
},
{
"key": "total_cbd",
"label": "Total CBD %"
},
{
"key": "cbd_mg_g",
"label": "CBD mg/g"
},
{
"key": "cbd_mg_ml",
"label": "CBD mg/mL"
},
{
"key": "total_cbd_mg_g",
"label": "Total CBD mg/g"
},
{
"key": "total_cbd_mg_ml",
"label": "Total CBD mg/mL"
},
{
"key": "total_cost",
"label": "Total Cost"
}
],
"date_range": "Jun 27th 2026 to Jul 27th 2026",
"report": "inventory_transaction_history"
}
}
| Property | Description | Type | Required |
|---|---|---|---|
| data | The report rows | array(InventoryTransactionHistoryReportRow) | true |
| meta | Report-level metadata | InventoryTransactionHistoryReportMeta | true |
InventoryTransactionHistoryReportColumn
| Property | Description | Type | Required |
|---|---|---|---|
| key | The key used for this column in each data row | string | true |
| label | The human-readable label of the column | string | true |
InventoryTransactionHistoryReportMeta
Report-level metadata
| Property | Description | Type | Required |
|---|---|---|---|
| columns | The report's column definitions | array(InventoryTransactionHistoryReportColumn) | false |
| date_range | The human-readable date range the report covers | string | false |
| report | The report identifier | string | true |
InventoryTransactionHistoryReportRow
A single row of the Inventory Transaction History report (one inventory transaction). Companies on the BioTrack compliance integration do not get the metrc_unit_name and metrc_production_batch_number keys. Potency keys are only populated for package-based transactions.
{
"amount": -4.0,
"batch_id": "00000000-0000-0000-0000-000000000400",
"batch_number": "BD-2026-01",
"cbd": 0.5,
"cbd_mg_g": 5.0,
"cbd_mg_ml": 4.0,
"company_relationship_id": "00000000-0000-0000-0000-0000000015bf",
"date": "2026-07-01 09:30",
"description": "Manual stock adjustment",
"metrc_production_batch_number": "PB-2026-0042",
"metrc_unit_name": "Each",
"package_batch_number_or_batch_name": "BD-2026-01",
"package_label": "1A4060300003B01000001234",
"product": "Blue Dream 1g Cartridge",
"product_id": "e9323492-95cc-402a-b29d-22a84ff2b1ef",
"related_entity": "Stock Adjustment",
"related_entity_customer_vendor": "Green Leaf Dispensary",
"related_entity_status": "COMPLETED",
"thc": 21.5,
"thc_mg_g": 215.0,
"thc_mg_ml": 780.0,
"total_cbd": 0.6,
"total_cbd_mg_g": 6.0,
"total_cbd_mg_ml": 5.0,
"total_cost": 34.0,
"total_thc": 24.8,
"total_thc_mg_g": 248.0,
"total_thc_mg_ml": 800.0,
"type": "adjustment",
"unit_type": "Each"
}
| Property | Description | Type | Required |
|---|---|---|---|
| amount | The transaction amount (signed quantity) | number | false |
| batch_id | The batch ID | string | false |
| batch_number | The Distru batch number | string | false |
| cbd | The package CBD percentage | number | false |
| cbd_mg_g | The package CBD in mg/g | number | false |
| cbd_mg_ml | The package CBD in mg/mL | number | false |
| company_relationship_id | The related company relationship ID | string | false |
| date | The transaction date and time, in the company's timezone | string | false |
| description | The transaction description | string | false |
| metrc_production_batch_number | The Metrc production batch number | string | false |
| metrc_unit_name | The Metrc unit name | string | false |
| package_batch_number_or_batch_name | The package batch number or, for batch-tracked products, the batch name | string | false |
| package_label | The package compliance label | string | false |
| product | The product name | string | false |
| product_id | The product ID | string | false |
| related_entity | The related entity (order, return, assembly, adjustment...) | string | false |
| related_entity_customer_vendor | The related entity's customer or vendor name | string | false |
| related_entity_status | The related entity's status | string | false |
| thc | The package THC percentage | number | false |
| thc_mg_g | The package THC in mg/g | number | false |
| thc_mg_ml | The package THC in mg/mL | number | false |
| total_cbd | The package total CBD percentage | number | false |
| total_cbd_mg_g | The package total CBD in mg/g | number | false |
| total_cbd_mg_ml | The package total CBD in mg/mL | number | false |
| total_cost | The transaction's total cost | number | false |
| total_thc | The package total THC percentage | number | false |
| total_thc_mg_g | The package total THC in mg/g | number | false |
| total_thc_mg_ml | The package total THC in mg/mL | number | false |
| type | The transaction type | string | false |
| unit_type | The unit type | string | false |
InventoryValuationReport
The Inventory Valuation report
{
"data": [
{
"active_quantity": 120.0,
"active_value_price": 4.2e3,
"assembling_quantity": 0.0,
"available_quantity": 100.0,
"brand": "Blue Dream Co",
"category": "Vape Cartridges",
"group": "Cartridges",
"image_url": "https://cdn.distru.com/products/bd-1g-cart.jpg",
"incoming_quantity": 50.0,
"inventory_threshold_max": 500.0,
"inventory_threshold_min": 50.0,
"name": "Blue Dream 1g Cartridge",
"owner": "Jane Doe",
"pending_output_quantity": 0.0,
"reserved_quantity": 20.0,
"sku": "BD-1G-CART",
"subcategory": "Distillate",
"unit_cost": 8.5,
"unit_price": 35.0,
"unit_type": "Each",
"vendor": "Sunshine Extracts"
}
],
"meta": {
"columns": [
{
"key": "name",
"label": "Name"
},
{
"key": "sku",
"label": "SKU"
},
{
"key": "vendor",
"label": "Vendor"
},
{
"key": "unit_type",
"label": "Unit Type"
},
{
"key": "category",
"label": "Category"
},
{
"key": "subcategory",
"label": "Subcategory"
},
{
"key": "group",
"label": "Group"
},
{
"key": "owner",
"label": "Owner"
},
{
"key": "active_quantity",
"label": "Active Quantity"
},
{
"key": "assembling_quantity",
"label": "Assembling Quantity"
},
{
"key": "reserved_quantity",
"label": "Reserved Quantity"
},
{
"key": "available_quantity",
"label": "Available Quantity"
},
{
"key": "incoming_quantity",
"label": "Incoming Quantity"
},
{
"key": "pending_output_quantity",
"label": "Pending Output Quantity"
},
{
"key": "unit_cost",
"label": "Unit Cost"
},
{
"key": "unit_price",
"label": "Unit Price"
},
{
"key": "inventory_threshold_max",
"label": "Inventory Threshold Max"
},
{
"key": "inventory_threshold_min",
"label": "Inventory Threshold Min"
},
{
"key": "active_value_price",
"label": "Active Value (Price)"
},
{
"key": "image_url",
"label": "Image URL"
},
{
"key": "brand",
"label": "Brand"
}
],
"date_range": "Jul 27th 2026",
"report": "inventory_valuation"
}
}
| Property | Description | Type | Required |
|---|---|---|---|
| data | The report rows | array(InventoryValuationReportRow) | true |
| meta | Report-level metadata | InventoryValuationReportMeta | true |
InventoryValuationReportColumn
| Property | Description | Type | Required |
|---|---|---|---|
| key | The key used for this column in each data row | string | true |
| label | The human-readable label of the column | string | true |
InventoryValuationReportMeta
Report-level metadata
| Property | Description | Type | Required |
|---|---|---|---|
| columns | The report's column definitions | array(InventoryValuationReportColumn) | false |
| date_range | The human-readable date the report was generated | string | false |
| report | The report identifier | string | true |
InventoryValuationReportRow
A single row of the Inventory Valuation report (one product). Companies with Product custom fields will see additional keys. When calculation_method=cost, the active_value_price key is returned as active_value_cost instead.
{
"active_quantity": 120.0,
"active_value_price": 4.2e3,
"assembling_quantity": 0.0,
"available_quantity": 100.0,
"brand": "Blue Dream Co",
"category": "Vape Cartridges",
"group": "Cartridges",
"image_url": "https://cdn.distru.com/products/bd-1g-cart.jpg",
"incoming_quantity": 50.0,
"inventory_threshold_max": 500.0,
"inventory_threshold_min": 50.0,
"name": "Blue Dream 1g Cartridge",
"owner": "Jane Doe",
"pending_output_quantity": 0.0,
"reserved_quantity": 20.0,
"sku": "BD-1G-CART",
"subcategory": "Distillate",
"unit_cost": 8.5,
"unit_price": 35.0,
"unit_type": "Each",
"vendor": "Sunshine Extracts"
}
| Property | Description | Type | Required |
|---|---|---|---|
| active_quantity | The active on-hand quantity | number | false |
| active_value_price | The active inventory value (priced by unit price) | number | false |
| assembling_quantity | The quantity being assembled | number | false |
| available_quantity | The available quantity (active minus reserved) | number | false |
| brand | The product's brand | string | false |
| category | The product's category | string | false |
| group | The product's group | string | false |
| image_url | The product's thumbnail image URL | string | false |
| incoming_quantity | The incoming quantity from open purchases | number | false |
| inventory_threshold_max | The product's inventory alert maximum | number | false |
| inventory_threshold_min | The product's inventory alert minimum | number | false |
| name | The product name | string | false |
| owner | The product owner's name | string | false |
| pending_output_quantity | The quantity pending output from open assemblies | number | false |
| reserved_quantity | The reserved quantity | number | false |
| sku | The product SKU | string | false |
| subcategory | The product's subcategory | string | false |
| unit_cost | The product's unit cost | number | false |
| unit_price | The product's unit price | number | false |
| unit_type | The product's unit type | string | false |
| vendor | The product's vendor | string | false |
Invoice
An invoice as shown in Distru. Ordered by invoice date
{
"creator": {
"banned": false,
"email": "jeanb@zorgindustries.com",
"full_name": "Jean-Baptiste Emanuel Zorg",
"id": "12345"
},
"due_datetime": "2022‐07‐02T00:00:00Z",
"id": "193c12d2-bc68-46fa-a221-12f9ed958ef4",
"inserted_datetime": "2022‐07‐02T00:00:00Z",
"invoice_datetime": "2022‐07‐02T00:00:00Z",
"invoice_number": "INV-00012345",
"items": [
{
"id": "1",
"order_item_id": 456,
"price": "3.0",
"product": {
"id": "543",
"name": "Crawdad Crippler - 1g - PreRoll",
"sku": "WHODAT"
},
"quantity": "5"
}
],
"order": {
"id": "931c12d2-68bc-fa46-a221-12f9edcg5hd7",
"order_number": "SO-0000657",
"status": "DELIVERING",
"total": "999.99"
},
"payments": [
{
"amount": 500.0,
"company": {
"id": "00000000-0000-0000-0000-00000000000a",
"name": "RAW"
},
"credit_uses": [],
"description": "Payment for invoice INV-00012345",
"fully_paid_with_credits": false,
"id": "12345",
"inserted_datetime": "2022‐07‐02T00:00:00Z",
"invoice": {
"id": "193c12d2-bc68-46fa-a221-12f9ed958ef4",
"invoice_number": "INV-00012345",
"status": "NOT_PAID",
"total": "543.23"
},
"overpayment_credits": [],
"payment_date": "2022‐07‐02T00:00:00Z",
"payment_method": {
"id": "12345",
"name": "Credit Card"
},
"payment_number": "PAY-001",
"payment_type": "INVOICE",
"status": "POSTED",
"updated_datetime": "2022‐07‐02T00:00:00Z"
}
],
"remaining_amount": "43.23",
"status": "NOT_PAID",
"total": "543.23",
"updated_datetime": "2022‐07‐02T00:00:00Z"
}
| Property | Description | Type | Required |
|---|---|---|---|
| billing_location | A location with its license number inlined, as nested on orders/invoices/purchases | LocationWithLicense | false |
| charges | A collection of Charges | array(Charge) | false |
| company | A company as nested inside another entity in Distru | CompanyCompact | false |
| creator | Information about a user in Distru | User | false |
| custom_data | A collection of CustomData | array(CustomField) | false |
| due_datetime | The datetime by which the invoice should be paid by the customer | string | false |
| external_notes | Notes on this invoice that are visible to the customer | string | false |
| id | Unique ID for this invoice | string | false |
| inserted_datetime | The datetime at which the invoice was created in Distru | string | false |
| internal_notes | Notes on this invoice that are only visible internally | string | false |
| invoice_datetime | The datetime on which the invoice was placed | string | false |
| invoice_number | The invoice number as shown in the Distru UI | string | false |
| items | A collection of InvoiceItems | array(InvoiceItem) | false |
| owner | Information about a user in Distru | User | false |
| paid_amount | The payment amount recorded against this invoice so far. | string | false |
| payments | A collection of the invoice's payments | array(Payment) | false |
| remaining_amount | The remaining amount for this invoice | string | false |
| status | The status of this invoice | string | false |
| total | The total for this invoice including taxes, discounts, and all line items | string | false |
| updated_datetime | The datetime at which the invoice was last updated in Distru | string | false |
| order.id | Unique ID for this order | string | false |
| order.order_number | The order number for this sale as seen in the Distru UI | string | false |
| order.status | Status of the associated order | string | false |
| order.total | The total on the order | string | false |
InvoiceChargeRequest
Invoice charge params
| Property | Description | Type | Required |
|---|---|---|---|
| id | Unique ID for this invoice charge. If it exists, an update will be performed; otherwise, it will be used as the ID of a new invoice charge record | string | false |
| name | The name of this charge | string | false |
| percent | The percent (if it is percent-based) of this charge | number | false |
| price | The flat price (if it is price-based) of this charge | number | false |
| type | Determines if this is a charge or discount | string | true |
| unit_type | Determines if this line is tracked as a percentage or a flat charge | string | true |
InvoiceChargesRequest
A collection of Invoice charge params
| Property | Description | Type | Required |
|---|
InvoiceHistoryReport
The Invoice History report
{
"data": [
{
"charge_summary": "Delivery Fee - $10.00",
"customer": "Green Leaf Dispensary",
"discount_summary": "Volume Discount - $5.00",
"due_date": "2026-07-15",
"invoice_date": "2026-07-01",
"invoice_number": "INV-1042",
"line_item_subtotal": 1150.0,
"metrc_manifest_number": "0000123456",
"outstanding": 0.0,
"owner": "Jane Doe",
"paid": 1239.56,
"sales_order": "SO-1042",
"shipped_from_license": "C11-0000123-LIC",
"status": "FULLY_PAID",
"tax_summary": "Excise Tax - $84.56",
"total": 1239.56,
"total_charges": 10.0,
"total_discounts": 5.0,
"total_taxes": 84.56
}
],
"meta": {
"columns": [
{
"key": "invoice_date",
"label": "Invoice Date"
},
{
"key": "invoice_number",
"label": "Invoice Number"
},
{
"key": "due_date",
"label": "Due Date"
},
{
"key": "sales_order",
"label": "Sales Order"
},
{
"key": "customer",
"label": "Customer"
},
{
"key": "status",
"label": "Status"
},
{
"key": "paid",
"label": "Paid"
},
{
"key": "outstanding",
"label": "Outstanding"
},
{
"key": "line_item_subtotal",
"label": "Line Item Subtotal"
},
{
"key": "total_taxes",
"label": "Total Taxes"
},
{
"key": "tax_summary",
"label": "Tax Summary"
},
{
"key": "total_charges",
"label": "Total Charges"
},
{
"key": "charge_summary",
"label": "Charge Summary"
},
{
"key": "total_discounts",
"label": "Total Discounts"
},
{
"key": "discount_summary",
"label": "Discount Summary"
},
{
"key": "total",
"label": "Total"
},
{
"key": "owner",
"label": "Owner"
},
{
"key": "metrc_manifest_number",
"label": "Metrc Manifest Number"
},
{
"key": "shipped_from_license",
"label": "Shipped From License"
}
],
"date_range": "Jun 26th 2026 to Jul 26th 2026",
"report": "invoice_history"
}
}
| Property | Description | Type | Required |
|---|---|---|---|
| data | The report rows | array(InvoiceHistoryReportRow) | true |
| meta | Report-level metadata | InvoiceHistoryReportMeta | true |
InvoiceHistoryReportColumn
| Property | Description | Type | Required |
|---|---|---|---|
| key | The key used for this column in each data row | string | true |
| label | The human-readable label of the column | string | true |
InvoiceHistoryReportMeta
Report-level metadata
| Property | Description | Type | Required |
|---|---|---|---|
| columns | The report's column definitions | array(InvoiceHistoryReportColumn) | false |
| date_range | The human-readable date range the report covers | string | false |
| report | The report identifier | string | true |
InvoiceHistoryReportRow
A single row of the Invoice History report. Companies on a compliance integration and companies with Invoice custom fields will see additional keys.
{
"charge_summary": "Delivery Fee - $10.00",
"customer": "Green Leaf Dispensary",
"discount_summary": "Volume Discount - $5.00",
"due_date": "2026-07-15",
"invoice_date": "2026-07-01",
"invoice_number": "INV-1042",
"line_item_subtotal": 1150.0,
"metrc_manifest_number": "0000123456",
"outstanding": 0.0,
"owner": "Jane Doe",
"paid": 1239.56,
"sales_order": "SO-1042",
"shipped_from_license": "C11-0000123-LIC",
"status": "FULLY_PAID",
"tax_summary": "Excise Tax - $84.56",
"total": 1239.56,
"total_charges": 10.0,
"total_discounts": 5.0,
"total_taxes": 84.56
}
| Property | Description | Type | Required |
|---|---|---|---|
| charge_summary | A per-charge breakdown of the invoice charges | string | false |
| customer | The customer name | string | false |
| discount_summary | A per-discount breakdown of the invoice discounts | string | false |
| due_date | The due date, in the company's timezone | string | false |
| invoice_date | The invoice date, in the company's timezone | string | false |
| invoice_number | The invoice number | string | false |
| line_item_subtotal | The invoice line item subtotal | number | false |
| outstanding | The outstanding (unpaid) amount on the invoice | number | false |
| owner | The invoice owner's name | string | false |
| paid | The amount paid on the invoice | number | false |
| sales_order | The sales order number the invoice belongs to | string | false |
| status | The invoice payment status | string | false |
| tax_summary | A per-tax breakdown of the invoice taxes | string | false |
| total | The invoice total | number | false |
| total_charges | The total charges on the invoice | number | false |
| total_discounts | The total discounts on the invoice | number | false |
| total_taxes | The total taxes on the invoice | number | false |
InvoiceItem
A invoice line item as shown in Distru
| Property | Description | Type | Required |
|---|---|---|---|
| batch | A batch for a product as shown in Distru | Batch | false |
| cost_per_unit | The cost per unit of this invoice item. | string | false |
| cost_per_unit_default | The default cost per unit (from the configured product unit cost) of this invoice item. | string | false |
| id | Unique ID for this invoice item | string | false |
| order_item_id | The ID of the order item this invoice item is associated with | integer | false |
| package | A package as shown in Distru | Package | false |
| price | Price per unit of this invoice item | string | false |
| product | A product as shown in Distru | Product | false |
| quantity | Quantity used on this invoice item | string | false |
| returned_quantity | Quantity returned on this invoice item. This is the sum of all return items associated with this invoice item allocated proportionally based on the quantity |
of the invoice item relative to its associated order item. For example, if an invoice item with a quantity of 1 has an order item with a quantity of 2, and a return item with a quantity of 2, the returned_quantity would be 1, calculated as (1 ÷ 2) × 2. |string|false| |total_cost_actual|Total cost of the non-returned quantity in this order item, in other words, this is the total cost of order_item.quantity minus order_item.returned quantity. The cost is allocated proportionally based on the quantity of the invoice item relative to its associated order item. For example, if an invoice item with a quantity of 1 has an order item with a quantity of 2 and a total cost of $10, the total_cost_actual would be $5, calculated as (1 ÷ 2) × $10. |string|false| |total_cost_default|Default cost of the non-returned quantity in this order item, in other words, this is the default cost of order_item.quantity minus order_item.returned quantity. The cost is allocated proportionally based on the quantity of the invoice item relative to its associated order item. For example, if an invoice item with a quantity of 1 has an order item with a quantity of 2 and a total cost of $10, the total_cost_default would be $5, calculated as (1 ÷ 2) × $10. |string|false|
InvoiceItemRequest
Invoice item params
| Property | Description | Type | Required |
|---|---|---|---|
| id | Unique ID for this order item. If it exists, an update will be performed; otherwise, it will be used as the ID of a new invoice item record | string | false |
| order_item_id | The ID of order item with which this invoice item is associated | string | false |
| quantity | Quantity used on this order item | number | true |
InvoiceItemsRequest
A collection of invoice item params
| Property | Description | Type | Required |
|---|
InvoicePayment
An invoice payment as shown in Distru
{
"amount": 100.0,
"description": "Payment for invoice 12345",
"id": "12345",
"method_id": "12345",
"payment_date": "2024-12-12 20:26:19.297537",
"payment_number": "12345",
"quickbooks_deposit_account_id": "12345",
"quickbooks_deposit_account_name": "Checking",
"quickbooks_sync_enqueued": true
}
| Property | Description | Type | Required |
|---|---|---|---|
| amount | The amount of the payment | number | false |
| description | The description of this payment | string | false |
| id | Unique ID for this invoice payment | string | false |
| invoice_id | The ID of the invoice this payment is for | string | false |
| method_id | The ID of the payment method used for this payment | string | false |
| payment_date | The date of this payment | string | false |
| payment_number | The payment number for this payment | string | false |
| quickbooks_deposit_account_id | The id of the Quickbooks deposit account used for this payment | string | false |
| quickbooks_deposit_account_name | The name of the Quickbooks deposit account used for this payment | string | false |
| quickbooks_sync_enqueued | Whether a sync of this payment to QuickBooks was enqueued. False when the company isn't integrated with QuickBooks, or when the payment's invoice or credits aren't synced yet (those must be synced first). | boolean | false |
Invoices
A collection of Invoices
| Property | Description | Type | Required |
|---|---|---|---|
| data | Invoices | array(Invoice) | false |
| next_page | URL for the next page of results; null when there is no next page | string | false |
License
A license as shown in Distru
| Property | Description | Type | Required |
|---|---|---|---|
| id | Unique ID for this license | string | false |
| license_number | License number | string | false |
Location
A location as shown in Distru
| Property | Description | Type | Required |
|---|---|---|---|
| address | Human readable address for this location | string | false |
| company_id | ID of the company that owns this location | string | false |
| deleted_at | The datetime of deletion if the location was deleted | string | false |
| id | Unique ID for this location | string | false |
| license | A license as shown in Distru | License | false |
| license_id | ID of the license that this location is associated with, if null, then this location is not associated to a license | string | false |
| name | Human readable name for this location | string | false |
LocationCompact
A location as nested inside another entity in Distru
| Property | Description | Type | Required |
|---|---|---|---|
| address | Human readable address for this location | string | false |
| company_id | ID of the company that owns this location | string | false |
| id | Unique ID for this location | string | false |
| license_id | ID of the license this location is associated with, null if none | string | false |
| name | Human readable name for this location | string | false |
LocationWithLicense
A location with its license number inlined, as nested on orders/invoices/purchases
| Property | Description | Type | Required |
|---|---|---|---|
| address | Human readable address for this location | string | false |
| company_id | ID of the company that owns this location | string | false |
| id | Unique ID for this location | string | false |
| license_id | ID of the license this location is associated with, null if none | string | false |
| license_number | License number of the location's license, null if none | string | false |
| name | Human readable name for this location | string | false |
Locations
A collection of Locations
| Property | Description | Type | Required |
|---|---|---|---|
| data | Locations | array(Location) | false |
| next_page | URL for the next page of results; null when there is no next page | string | false |
Menu
| Property | Description | Type | Required |
|---|---|---|---|
| active | Whether the menu is active | boolean | false |
| external_name | External menu name | string | false |
| id | Unique ID for this menu | string | false |
| inserted_datetime | Created at (UTC ISO-8601) | string | false |
| internal_name | Internal menu name | string | false |
| product_count | Count of active products on the menu | integer | false |
| updated_datetime | Updated at (UTC ISO-8601) | string | false |
| visibility | One of: PUBLIC, PRIVATE, PASSCODE_PROTECTED | string | false |
Menus
A collection of menus
| Property | Description | Type | Required |
|---|---|---|---|
| data | Menus | array(Menu) | false |
| next_page | URL for the next page of results; null when there is no next page | string | false |
OfficialProductCategories
A collection of official product categories
| Property | Description | Type | Required |
|---|---|---|---|
| data | Official product categories | array(OfficialProductCategory) | false |
OfficialProductCategory
An official product category
| Property | Description | Type | Required |
|---|---|---|---|
| id | Unique ID for this official product category | string | false |
| name | The name of the official product category | string | false |
Order
A sales order as shown in Distru. Ordered by order date
{
"billing_location": {
"address": "123 Compton Street, CA, USA, 12345",
"id": "d06a5135-dccf-4d62-a922-804190213c10",
"name": "Warehouse 1"
},
"charges": [
{
"id": "8h7512d2-g4h6-jj89-92h7-12f9ed9ls8f5",
"name": "Friends and Family",
"percent": -10,
"type": "DISCOUNT",
"unit_type": "PERCENT"
},
{
"id": "duy67x9r-0d4k-mmk5-8u9u-l3k8ed9lj900",
"name": "Excise Tax",
"percent": 27,
"tax": {
"id": "00000000-0000-0000-0000-000000002694",
"name": "Excise Tax - CA 27%"
},
"type": "CHARGE",
"unit_type": "PERCENT"
},
{
"id": "ko38h9ju-ndn7-76h8-jio9-j98yhd93h6fh",
"name": "Membership Fee",
"price": 25.0,
"type": "CHARGE",
"unit_type": "PRICE"
}
],
"creator": {
"banned": false,
"email": "jeanb@zorgindustries.com",
"full_name": "Jean-Baptiste Emanuel Zorg",
"id": "3e98e590-85b6-4247-b2e9-96fc2f45802e"
},
"delivery_datetime": "2022‐07‐02T00:00:00Z",
"due_datetime": "2022‐07‐02T00:00:00Z",
"id": "193c12d2-bc68-46fa-a221-12f9ed958ef4",
"inserted_datetime": "2022‐07‐02T00:00:00Z",
"internal_notes": "Internal note example",
"items": [
{
"id": "3e98e590-85b6-4247-b2e9-96fc2f45802e",
"price": 0.006,
"price_base": 0.006,
"product": {
"id": "4ec0ac89-a382-409c-ae67-4478e7e681ac",
"name": "Crawdad Crippler - 1g - PreRoll",
"sku": "WHODAT"
},
"quantity": 786
}
],
"order_datetime": "2022‐07‐02T00:00:00Z",
"order_number": "SO-00012345",
"payment_term_name": "Net 30",
"shipping_location": {
"address": "123 Compton Street, CA, USA, 12345",
"id": "d06a5135-dccf-4d62-a922-804190213c10",
"name": "Warehouse 1"
},
"status": "PENDING",
"total": "150.23",
"updated_datetime": "2022‐07‐02T00:00:00Z"
}
| Property | Description | Type | Required |
|---|---|---|---|
| billing_location | A location with its license number inlined, as nested on orders/invoices/purchases | LocationWithLicense | false |
| biotrack_id | The ID of the BioTrack manifest associated with this order | string | false |
| blaze_payment_type | The payment type for an order shipping to a Blaze-associated company. | string | false |
| charges | A collection of Charges | array(Charge) | false |
| company | A company as nested inside another entity in Distru | CompanyCompact | false |
| creator | Information about a user in Distru | User | false |
| custom_data | A collection of CustomData | array(CustomField) | false |
| delivery_datetime | The datetime on which the order was / will be delivered | string | false |
| due_datetime | The datetime by which the order should be completed for the customer | string | false |
| external_notes | External notes for this order | string | false |
| id | Unique ID for this order | string | false |
| inserted_datetime | The datetime at which the order was created in Distru | string | false |
| internal_notes | Internal notes for this order | string | false |
| inventory_source | A location with its license number inlined, as nested on orders/invoices/purchases | LocationWithLicense | false |
| items | A collection of SalesOrderItems | array(SalesOrderItem) | false |
| leaflink_order_number | The LeafLink order number for this order | string | false |
| metrc_transfer_id | The ID of the Metrc transfer associated with this order | integer | false |
| order_datetime | The datetime on which the order was placed | string | false |
| order_number | The order number as shown in the Distru UI | string | false |
| owner | Information about a user in Distru | User | false |
| payment_term_name | The name of the payment term applied to this order | string | false |
| shipping_location | A location with its license number inlined, as nested on orders/invoices/purchases | LocationWithLicense | false |
| status | The status of this sales order | string | false |
| total | The total for this order including taxes, discounts, and all line items | string | false |
| updated_datetime | The datetime at which the order was last updated in Distru | string | false |
OrderChargeRequest
Order charge params
| Property | Description | Type | Required |
|---|---|---|---|
| id | Unique ID for this order charge. If it exists, an update will be performed; otherwise, it will be used as the ID of a new order charge record | string | false |
| name | The name of this charge (e.g. "Delivery Fee") | string | false |
| percent | The percentage applied for this charge. Used when type is PERCENT |
number | false |
| price | The flat amount for this charge. Used when type is PRICE |
number | false |
| type | What type of additional line is this | string | true |
| unit_type | Determines if this line is tracked as a percentage or a flat charge | string | true |
OrderChargesRequest
A collection of Order charge params
| Property | Description | Type | Required |
|---|
OrderFulfillmentReport
The Order Fulfillment report
{
"data": [
{
"category": "Vape",
"group": "Cartridges",
"product": "Blue Dream 1g Cartridge",
"so_1042": 3.0,
"subcategory": "Cartridge",
"total_units": 3.0,
"total_value": 105.0,
"unit_price": 35.0
}
],
"meta": {
"columns": [
{
"key": "product",
"label": "Product"
},
{
"key": "group",
"label": "Group"
},
{
"key": "category",
"label": "Category"
},
{
"key": "subcategory",
"label": "Subcategory"
},
{
"key": "so_1042",
"label": "SO-1042"
},
{
"key": "total_units",
"label": "Total Units"
},
{
"key": "unit_price",
"label": "Unit Price"
},
{
"key": "total_value",
"label": "Total Value"
}
],
"date_range": "Jun 26th 2026 to Jul 26th 2026",
"report": "order_fulfillment"
}
}
| Property | Description | Type | Required |
|---|---|---|---|
| data | The report rows | array(OrderFulfillmentReportRow) | true |
| meta | Report-level metadata | OrderFulfillmentReportMeta | true |
OrderFulfillmentReportColumn
| Property | Description | Type | Required |
|---|---|---|---|
| key | The key used for this column in each data row | string | true |
| label | The human-readable label of the column | string | true |
OrderFulfillmentReportMeta
Report-level metadata
| Property | Description | Type | Required |
|---|---|---|---|
| columns | The report's column definitions, including one column per matching order | array(OrderFulfillmentReportColumn) | false |
| date_range | The human-readable date range the report covers | string | false |
| report | The report identifier | string | true |
OrderFulfillmentReportRow
A single row of the Order Fulfillment report (one product). In addition to the keys below, each row carries one dynamic key per matching order, named after the slugified order number (e.g. so_1042), whose value is the quantity of this product on that order.
{
"category": "Vape",
"group": "Cartridges",
"product": "Blue Dream 1g Cartridge",
"so_1042": 3.0,
"so_1043": 2.0,
"subcategory": "Cartridge",
"total_units": 5.0,
"total_value": 175.0,
"unit_price": 35.0
}
| Property | Description | Type | Required |
|---|---|---|---|
| category | The product's category | string | false |
| group | The product's group | string | false |
| product | The product name | string | false |
| subcategory | The product's subcategory | string | false |
| total_units | The total units of this product across the matching orders | number | false |
| total_value | The total value of this product across the matching orders | number | false |
| unit_price | The product's unit price | number | false |
OrderItemRequest
Order item params
| Property | Description | Type | Required |
|---|---|---|---|
| batch_id | The ID of the batch (if the product is batch-tracked) | string | false |
| compliance_quantity | The Metrc (compliance) quantity for this item. For unit/each-based package-tracked products this must equal the package's full Metrc quantity, and quantity must equal it |
number | false |
| id | Unique ID for this order item. If it exists, an update will be performed; otherwise, it will be used as the ID of a new order item record | string | false |
| is_sample | True if this order is a sample | boolean | false |
| location_id | The ID of the location this order item is fulfilled from | string | false |
| package_id | The ID of the package (if the product is package-tracked) | string | false |
| price_base | Price per unit of this order item (prior to price tier items being applied) | number | true |
| product_id | The ID of the product (if the product is product-tracked) | string | false |
| quantity | Quantity used on this order item | number | true |
OrderItemsRequest
A collection of Order item params
| Property | Description | Type | Required |
|---|
OrderTransferTemplateTransporterInfoRequest
A Metrc-specific Order transfer template transporter info
| Property | Description | Type | Required |
|---|---|---|---|
| driver_license_number | The driver's license number | string | false |
| driver_name | The driver's name | string | false |
| driver_occupational_license_number | The driver's occupational license number | string | false |
| driver_phone_number | The driver's phone number | string | false |
| estimated_arrival_datetime | The estimated arrival datetime (ISO 8601 format) | string | false |
| estimated_departure_datetime | The estimated departure datetime (ISO 8601 format) | string | false |
| transporter_license_number | The transporter's license number | string | false |
| vehicle_license_plate_number | The vehicle's license plate number | string | false |
| vehicle_make | The vehicle's make | string | false |
| vehicle_model | The vehicle's model | string | false |
OrderTransferTemplateTransporterInfosRequest
A collection of Metrc-specific Order transfer template transporter info params
| Property | Description | Type | Required |
|---|
Orders
A collection of Orders
| Property | Description | Type | Required |
|---|---|---|---|
| data | Orders | array(Order) | false |
| next_page | URL for the next page of results; null when there is no next page | string | false |
Package
A package as shown in Distru
| Property | Description | Type | Required |
|---|---|---|---|
| batch_number | The non-compliance batch number for this package | string | false |
| compliance_label | The compliance (e.g. Metrc) label for this package | string | false |
| id | Unique ID for this package in Distru | string | false |
| status | The status of this package | array(any) | false |
PackageFull
A package with extended details as shown in Distru
| Property | Description | Type | Required |
|---|---|---|---|
| batch_number | The non-compliance batch number for this package | string | false |
| compliance_label | The compliance (e.g. Metrc) label for this package | string | false |
| cost_per_unit_actual | The cost per unit of this package | string | false |
| cost_per_unit_default | The default cost per unit (from the configured product unit cost) of this package | string | false |
| custom_data | The custom data for this package | array(CustomField) | false |
| expiration_date | The date and time this package expires (ISO 8601) | string | false |
| harvest_date | The harvest date for this package (ISO 8601) | string | false |
| id | Unique ID for this package in Distru | string | false |
| is_trade_sample | True if this package is a Metrc trade sample | boolean | false |
| lab_testing_state | Compliance lab testing state (e.g. Metrc); BioTrack uses analogous values | string | false |
| license | A license as shown in Distru | License | false |
| metrc_label | The Metrc label for this package, null if not Metrc-tracked | string | false |
| packaged_date | The compliance packaged date for this package (ISO 8601) | string | false |
| primary_test_result | The compact primary test result nested on a package or batch | PrimaryTestResult | false |
| product_id | The ID of this package's product | string | false |
| product_unit_quantity | The quantity of this package expressed in it's product's unit type | string | false |
| product_unit_type | A unit type as shown in Distru | UnitType | false |
| quantity | The last known accurate quantity of this package | string | false |
| quantity_assembling | This quantity of this package currently allocated towards a pending assembly | string | false |
| quantity_available | The quantity available for use of this package (i.e. inventory that is not held up on a sales order or assembly.) | string | false |
| status | The status of this package | array(any) | false |
| total_cost_actual | The total actual cost of this package | string | false |
| total_cost_default | The total default cost (from the configured product unit cost) of this package | string | false |
| unit_type | A unit type as shown in Distru | UnitType | false |
| location.id | Unique ID for this Location | string | false |
| location.name | The name of this Location | string | false |
Packages
A collection of Packages
| Property | Description | Type | Required |
|---|---|---|---|
| data | Packages | array(PackageFull) | false |
| next_page | URL for the next page of results; null when there is no next page | string | false |
Page
Pagination information for a request
{
"number": 1
}
| Property | Description | Type | Required |
|---|---|---|---|
| number | Page number | integer | true |
PageWithSize
Pagination information for a request
{
"number": 1,
"size": 100
}
| Property | Description | Type | Required |
|---|---|---|---|
| number | Page number | integer | true |
| size | Amount of records per page | integer | true |
Payment
A payment as shown in Distru
{
"amount": "150.50",
"company": {
"id": "00000000-0000-0000-0000-00000000000a",
"name": "RAW"
},
"credit_uses": [],
"description": "Payment for invoice INV-001",
"fully_paid_with_credits": false,
"id": "12345",
"inserted_datetime": "2024-12-12T20:26:19.297537Z",
"invoice": {
"id": "67890",
"invoice_number": "INV-001",
"status": "FULLY_PAID",
"total": "150.50"
},
"overpayment_credits": [],
"payment_date": "2024-12-12T20:26:19.297537Z",
"payment_method": {
"id": "12345",
"name": "Credit Card"
},
"payment_number": "PAY-001",
"payment_type": "INVOICE",
"status": "POSTED",
"updated_datetime": "2024-12-12T20:26:19.297537Z"
}
| Property | Description | Type | Required |
|---|---|---|---|
| amount | The amount of this payment | string | false |
| company | A company as nested inside another entity in Distru | CompanyCompact | false |
| credit_uses | Credits applied towards this invoice payment. Null for purchase payments. | array(PaymentCreditUse) | false |
| description | Description of this payment | string | false |
| fully_paid_with_credits | Whether this payment was fully paid using credits. When true, payment_method is null. |
boolean | false |
| id | Unique ID for this payment | string | false |
| inserted_datetime | The datetime at which the payment was created in Distru | string | false |
| invoice | A compact representation of the invoice a payment belongs to | PaymentInvoice | false |
| overpayment_credits | Credits created from overpaying this invoice payment. Null for purchase payments. | array(PaymentCredit) | false |
| payment_date | The datetime of this payment | string | false |
| payment_method | A payment method as shown in Distru | PaymentMethod | false |
| payment_number | The payment number as shown in the Distru UI | string | false |
| payment_type | Whether this payment belongs to an invoice (INVOICE) or a purchase (PURCHASE) | string | false |
| purchase | A compact representation of the purchase a payment belongs to | PaymentPurchase | false |
| quickbooks_deposit_account_id | The QuickBooks Online deposit account ID for this payment | string | false |
| quickbooks_deposit_account_name | The QuickBooks Online deposit account name for this payment. Only present on the single-payment response. | string | false |
| quickbooks_sync_enqueued | Whether a QuickBooks Online sync was enqueued for this payment. Only present on the payment creation response. | boolean | false |
| status | The status of this payment. Either POSTED or VOIDED. | string | false |
| updated_datetime | The datetime at which the payment was last updated in Distru | string | false |
PaymentCredit
A compact representation of a credit related to a payment
| Property | Description | Type | Required |
|---|---|---|---|
| amount | The current amount of this credit | string | false |
| credit_number | The credit number as shown in the Distru UI | string | false |
| id | Unique ID for this credit | string | false |
| source | How this credit was created | string | false |
PaymentCreditUse
A credit applied towards an invoice payment
| Property | Description | Type | Required |
|---|---|---|---|
| amount | The amount of credit applied towards the payment | string | false |
| credit | A compact representation of a credit related to a payment | PaymentCredit | false |
| id | Unique ID for this credit use | string | false |
PaymentInvoice
A compact representation of the invoice a payment belongs to
| Property | Description | Type | Required |
|---|---|---|---|
| id | Unique ID for this invoice | string | false |
| invoice_number | The invoice number as shown in the Distru UI | string | false |
| status | The payment status of this invoice | string | false |
| total | The total amount of this invoice | string | false |
PaymentMethod
A payment method as shown in Distru
{
"id": "12345",
"name": "Credit Card"
}
| Property | Description | Type | Required |
|---|---|---|---|
| deleted_at | The datetime of deletion if the payment method was deleted | string | false |
| id | Unique ID for this payment method | string | false |
| name | Name of the payment method | string | false |
PaymentMethods
A collection of Payment Methods
| Property | Description | Type | Required |
|---|---|---|---|
| data | Payment Methods | array(PaymentMethod) | false |
| next_page | URL for the next page of results; null when there is no next page | string | false |
PaymentPurchase
A compact representation of the purchase a payment belongs to
| Property | Description | Type | Required |
|---|---|---|---|
| id | Unique ID for this purchase | string | false |
| purchase_number | The purchase number as shown in the Distru UI | string | false |
| status | The status of this purchase | string | false |
| total | The total amount of this purchase | string | false |
PaymentTerm
A payment term as shown in Distru
{
"days": 30,
"id": "12345",
"locked": false,
"name": "Net 30",
"time_of_day": "17:00:00"
}
| Property | Description | Type | Required |
|---|---|---|---|
| days | Number of days until payment is due | integer | false |
| id | Unique ID for this payment term | string | false |
| locked | Whether this payment term is a locked Distru default that cannot be edited | boolean | false |
| name | Name of the payment term | string | false |
| time_of_day | Time of day the payment is due | string | false |
PaymentTerms
A collection of Payment Terms
| Property | Description | Type | Required |
|---|---|---|---|
| data | Payment Terms | array(PaymentTerm) | false |
| next_page | URL for the next page of results; null when there is no next page | string | false |
Payments
A collection of Payments
| Property | Description | Type | Required |
|---|---|---|---|
| data | Payments | array(Payment) | false |
| next_page | URL for the next page of results; null when there is no next page | string | false |
PdfDownloadUrl
The JSON envelope a PDF download endpoint returns when ?format=url is passed
| Property | Description | Type | Required |
|---|---|---|---|
| data.expires_datetime | ISO 8601 datetime when the signed URL expires | string | false |
| data.url | Temporary signed URL to download the PDF | string | false |
PlantLifecycleReport
The Plant Lifecycle report
{
"data": [
{
"batch_creation_date": "01/15/2026",
"days_as_batch": 17,
"days_veg_to_last_harvest": 78,
"destroyed_plant_cost": 1.2e3,
"first_harvest_date": "04/10/2026",
"harvest_name_s": "Blue Dream Spring 2026",
"last_harvest_date": "04/20/2026",
"plant_batch_name": "Blue Dream 2026-01",
"plants_destroyed": 2,
"plants_harvested": 46,
"plants_promoted_to_veg": 48,
"plants_started": 50,
"promoted_to_veg_date": "02/01/2026",
"strain": "Blue Dream",
"total_cost_batch_stage": 3.2e3,
"total_cost_veg_to_last_harvest": 8.0e3,
"total_lifecycle_cost": 1.24e4,
"total_lifecycle_days": 95
}
],
"meta": {
"columns": [
{
"key": "plant_batch_name",
"label": "Plant Batch Name"
},
{
"key": "batch_creation_date",
"label": "Batch Creation Date"
},
{
"key": "strain",
"label": "Strain"
},
{
"key": "plants_started",
"label": "Plants Started"
},
{
"key": "plants_promoted_to_veg",
"label": "Plants Promoted to Veg"
},
{
"key": "plants_destroyed",
"label": "Plants Destroyed"
},
{
"key": "plants_harvested",
"label": "Plants Harvested"
},
{
"key": "promoted_to_veg_date",
"label": "Promoted to Veg Date"
},
{
"key": "first_harvest_date",
"label": "First Harvest Date"
},
{
"key": "last_harvest_date",
"label": "Last Harvest Date"
},
{
"key": "days_as_batch",
"label": "Days as Batch"
},
{
"key": "days_veg_to_last_harvest",
"label": "Days Veg to Last Harvest"
},
{
"key": "total_lifecycle_days",
"label": "Total Lifecycle Days"
},
{
"key": "total_cost_batch_stage",
"label": "Total Cost — Batch Stage"
},
{
"key": "total_cost_veg_to_last_harvest",
"label": "Total Cost — Veg to Last Harvest"
},
{
"key": "destroyed_plant_cost",
"label": "Destroyed Plant Cost"
},
{
"key": "total_lifecycle_cost",
"label": "Total Lifecycle Cost"
},
{
"key": "harvest_name_s",
"label": "Harvest Name(s)"
}
],
"date_range": "Jan 1st 2026 to Feb 1st 2026",
"report": "plant_lifecycle"
}
}
| Property | Description | Type | Required |
|---|---|---|---|
| data | The report rows | array(PlantLifecycleReportRow) | true |
| meta | Report-level metadata | PlantLifecycleReportMeta | true |
PlantLifecycleReportColumn
| Property | Description | Type | Required |
|---|---|---|---|
| key | The key used for this column in each data row | string | true |
| label | The human-readable label of the column | string | true |
PlantLifecycleReportMeta
Report-level metadata
| Property | Description | Type | Required |
|---|---|---|---|
| columns | The report's column definitions | array(PlantLifecycleReportColumn) | false |
| date_range | The human-readable date range the report covers | string | false |
| report | The report identifier | string | true |
PlantLifecycleReportRow
A single row of the Plant Lifecycle report (one plant batch). The cost keys (total_cost_batch_stage, total_cost_veg_to_last_harvest, destroyed_plant_cost, total_lifecycle_cost) are omitted for users without permission to view costs.
{
"batch_creation_date": "01/15/2026",
"days_as_batch": 17,
"days_veg_to_last_harvest": 78,
"destroyed_plant_cost": 1.2e3,
"first_harvest_date": "04/10/2026",
"harvest_name_s": "Blue Dream Spring 2026",
"last_harvest_date": "04/20/2026",
"plant_batch_name": "Blue Dream 2026-01",
"plants_destroyed": 2,
"plants_harvested": 46,
"plants_promoted_to_veg": 48,
"plants_started": 50,
"promoted_to_veg_date": "02/01/2026",
"strain": "Blue Dream",
"total_cost_batch_stage": 3.2e3,
"total_cost_veg_to_last_harvest": 8.0e3,
"total_lifecycle_cost": 1.24e4,
"total_lifecycle_days": 95
}
| Property | Description | Type | Required |
|---|---|---|---|
| batch_creation_date | The plant batch creation date | string | false |
| days_as_batch | The number of days spent as a batch | number | false |
| days_veg_to_last_harvest | The number of days from veg to the last harvest | number | false |
| destroyed_plant_cost | The cost of destroyed plants | number | false |
| first_harvest_date | The date of the batch's first harvest | string | false |
| harvest_name_s | The names of the harvests the batch produced | string | false |
| last_harvest_date | The date of the batch's last harvest | string | false |
| plant_batch_name | The plant batch name | string | false |
| plants_destroyed | The number of plants destroyed | number | false |
| plants_harvested | The number of plants harvested | number | false |
| plants_promoted_to_veg | The number of plants promoted to vegetative | number | false |
| plants_started | The number of plants started | number | false |
| promoted_to_veg_date | The date the batch was promoted to vegetative | string | false |
| strain | The strain name | string | false |
| total_cost_batch_stage | The total cost during the batch stage | number | false |
| total_cost_veg_to_last_harvest | The total cost from veg to the last harvest | number | false |
| total_lifecycle_cost | The total lifecycle cost | number | false |
| total_lifecycle_days | The total number of lifecycle days | number | false |
PrimaryTestResult
The compact primary test result nested on a package or batch
| Property | Description | Type | Required |
|---|---|---|---|
| cbd_mg_per_unit | The CBD mg per unit for this test result | string | false |
| cbd_mg_per_unit_total | The total CBD mg per unit for this test result | string | false |
| cbd_percentage | The CBD percentage for this test result | string | false |
| cbd_percentage_total | The total CBD percentage for this test result | string | false |
| coa_url | Public URL to view/download this test result's Certificate of Analysis (COA), or null when no file is attached | string | false |
| mg_per_unit_type | The unit type for the mg per unit fields | string | false |
| name | The name of the test result | string | false |
| thc_mg_per_unit | The THC mg per unit for this test result | string | false |
| thc_mg_per_unit_total | The total THC mg per unit for this test result | string | false |
| thc_percentage | The THC percentage for this test result | string | false |
| thc_percentage_total | The total THC percentage for this test result | string | false |
Product
A product as shown in Distru
{
"brand": {
"id": "7a934b2c-1188-4c0a-9f2e-2b1f10e59a3d",
"name": "Brand 123",
"updated_datetime": "2024-12-12T20:26:19.297537Z"
},
"category": {
"id": "89c8323f-aaaa-45v3-88f9-64009d68h3n8",
"name": "Super Dank Buds"
},
"external_name": "Blue Dream Preroll",
"id": "02c88a3f-d759-4973-88f9-60049d682524",
"images": [
{
"id": "12345",
"name": "image.jpg",
"url": "https://example.com/image.jpg"
}
],
"is_active": true,
"msrp": "100.1",
"name": "Blue Dream Preroll 1G",
"product_group": {
"id": "9c1e2a3f-57d9-4473-88f9-40609d68bbh4",
"name": "Group 123"
},
"sku": "BDP-1G",
"unit_price": "1.50",
"unit_type": {
"name": "Gram"
},
"units_per_case": "6",
"vendor": {
"id": "3f128a34-cc59-4b49-8883-23bf10e59c6c",
"name": "Vendor 123",
"updated_datetime": "2024-12-12T20:26:19.297537Z"
}
}
| Property | Description | Type | Required |
|---|---|---|---|
| unit_net_weight_serving_size_unit_type | A unit type as shown in Distru | UnitType | false |
| units_per_case | The number of units of this product that come in one case, if any | string | false |
| unit_price | The price of one unit of this product | string | false |
| subcategory | A product subcategory as shown in Distru | ProductSubcategoryCompact | false |
| is_active | Is this product active? | boolean | false |
| strain | A strain as shown in Distru | Strain | false |
| unit_net_weight | The net weight of the product per unit | string | false |
| upc | The UPC of this product | string | false |
| quantity_available_threshold_max | The maximum available quantity before an over-stock alert is triggered | string | false |
| vendor | A company as nested inside another entity in Distru | CompanyCompact | false |
| external_name | Customer-facing name for DistruCommerce menus and Order Tracker | string | false |
| wholesale_unit_price | The wholesale unit price of this product | number | false |
| brand | A company as nested inside another entity in Distru | CompanyCompact | false |
| owner | Information about a user in Distru | User | false |
| custom_data | The custom data for this product | array(CustomField) | false |
| is_featured | Is this product featured? | boolean | false |
| images | The images associated with the product | array(Image) | false |
| quantity_available_threshold_min | The minimum available quantity before a low-stock alert is triggered | string | false |
| tags | The tags associated with this product | array(ProductTagRef) | false |
| unit_type | A unit type as shown in Distru | UnitType | false |
| unit_cost | The cost (or purchase price) of the product per unit. | string | false |
| total_thc | The total THC of this product | string | false |
| id | Unique ID for this product | string | false |
| name | Human readable name for this product | string | false |
| description | The description of this product | string | false |
| menus | Menus this product is associated with, ordered by menu creation time then id (includes inactive menus) | array(ProductMenuRef) | false |
| deleted_at | The datetime of deletion if the product was deleted | string | false |
| sku | The SKU configured for the product | string | false |
| gross_weight_unit_type | A unit type as shown in Distru | UnitType | false |
| description_markdown | The description of this product in markdown format | string | false |
| total_cbd | The total CBD of this product | string | false |
| msrp | The MSRP of the product | string | false |
| unit_serving_size | The serving size of the product per unit | string | false |
| category | A product category as shown in Distru | ProductCategoryCompact | false |
| bill_of_materials | A product's bill of materials (recipe of inputs and additional costs) | BillOfMaterials | false |
| updated_datetime | The datetime this product was last updated at | string | false |
| total_cannabinoid_unit | The unit that total THC and CBD are measured in | string | false |
| gross_weight | The gross weight of the product | string | false |
| product_group.id | Unique ID for this product group | string | false |
| product_group.name | The name of this product group | string | false |
ProductCategories
A collection of product categories
| Property | Description | Type | Required |
|---|---|---|---|
| data | Product Categories | array(ProductCategory) | false |
| next_page | URL for the next page of results; null when there is no next page | string | false |
ProductCategory
A product category
| Property | Description | Type | Required |
|---|---|---|---|
| id | Unique ID for this product category | string | false |
| inserted_datetime | When the product category was created (UTC ISO-8601) | string | false |
| name | The name of the product category | string | false |
| official_product_category_id | The official product category ID this category maps to | string | false |
| updated_datetime | When the product category was last updated (UTC ISO-8601) | string | false |
ProductCategoryCompact
A product category as shown in Distru
{
"id": "88c02a3f-57d9-9473-f8f9-40609d68bbh4",
"name": "Flower",
"official_product_category_id": "FLOWER"
}
| Property | Description | Type | Required |
|---|---|---|---|
| id | Unique ID for this category | string | false |
| name | Human readable name for this category | string | false |
| official_product_category_id | The official product category ID this category maps to | string | false |
ProductGroup
A product group
| Property | Description | Type | Required |
|---|---|---|---|
| id | Unique ID for this product group | string | false |
| inserted_datetime | When the product group was created (UTC ISO-8601) | string | false |
| name | The name of the product group | string | false |
| updated_datetime | When the product group was last updated (UTC ISO-8601) | string | false |
ProductGroups
A collection of product groups
| Property | Description | Type | Required |
|---|---|---|---|
| data | Product Groups | array(ProductGroup) | false |
| next_page | URL for the next page of results; null when there is no next page | string | false |
ProductMenuRef
A menu association for a product
| Property | Description | Type | Required |
|---|---|---|---|
| menu_id | Public ID of the menu | string | false |
| menu_name | Display name of the menu | string | false |
ProductPosMapping
A mapping between a Distru product and a POS product
| Property | Description | Type | Required |
|---|---|---|---|
| blaze_asset_id | Blaze asset ID | string | false |
| blaze_product_id | Blaze product ID | string | false |
| blaze_retailer_id | Blaze retailer ID | string | false |
| dutchie_product_id | Dutchie product ID | integer | false |
| dutchie_retailer_id | Dutchie retailer ID | string | false |
| id | Mapping ID | string | false |
| inserted_datetime | Creation timestamp | string | false |
| pos_type | POS type (BLAZE, DUTCHIE, or TREEZ) | string | false |
| product_id | Distru product ID | string | false |
| treez_photo_url | Treez photo URL | string | false |
| treez_product_id | Treez product ID | string | false |
| treez_retailer_id | Treez retailer ID | integer | false |
| updated_datetime | Last update timestamp | string | false |
ProductPosMappingResponse
| Property | Description | Type | Required |
|---|---|---|---|
| data | A mapping between a Distru product and a POS product | ProductPosMapping | false |
ProductPosMappingsResponse
| Property | Description | Type | Required |
|---|---|---|---|
| data | List of POS mappings | array(ProductPosMapping) | false |
ProductSubcategories
A collection of product subcategories
| Property | Description | Type | Required |
|---|---|---|---|
| data | Product Subcategories | array(ProductSubcategory) | false |
| next_page | URL for the next page of results; null when there is no next page | string | false |
ProductSubcategory
A product subcategory
| Property | Description | Type | Required |
|---|---|---|---|
| category | A product category as shown in Distru | ProductCategoryCompact | false |
| id | Unique ID for this product subcategory | string | false |
| inserted_datetime | When the product subcategory was created (UTC ISO-8601) | string | false |
| name | The name of the product subcategory | string | false |
| updated_datetime | When the product subcategory was last updated (UTC ISO-8601) | string | false |
ProductSubcategoryCompact
A product subcategory as shown in Distru
{
"id": "88c02a3f-57d9-9473-f8f9-40609d68bbh4",
"name": "High Grade Flower"
}
| Property | Description | Type | Required |
|---|---|---|---|
| id | Unique ID for this subcategory | string | false |
| name | Human readable name for this subcategory | string | false |
ProductTagRef
A tag associated with a product
| Property | Description | Type | Required |
|---|---|---|---|
| id | Unique ID for this tag | string | false |
| name | The name of this tag | string | false |
Products
A collection of Products
| Property | Description | Type | Required |
|---|---|---|---|
| data | Products | array(Product) | false |
| next_page | URL for the next page of results; null when there is no next page | string | false |
Purchase
A purchase order as shown in Distru. Ordered by order date
{
"charges": [
{
"id": "8h7512d2-g4h6-jj89-92h7-12f9ed9ls8f5",
"name": "Friends and Family",
"percent": -10,
"type": "DISCOUNT",
"unit_type": "PERCENT"
},
{
"id": "duy67x9r-0d4k-mmk5-8u9u-l3k8ed9lj900",
"name": "Excise Tax",
"percent": 27,
"tax": {
"id": "00000000-0000-0000-0000-000000002694",
"name": "Excise Tax - CA 27%"
},
"type": "CHARGE",
"unit_type": "PERCENT"
},
{
"id": "ko38h9ju-ndn7-76h8-jio9-j98yhd93h6fh",
"name": "Membership Fee",
"price": 25.0,
"type": "CHARGE",
"unit_type": "PRICE"
}
],
"due_datetime": "2022‐07‐02T00:00:00Z",
"id": "193c12d2-bc68-46fa-a221-12f9ed958ef4",
"inserted_datetime": "2022‐07‐02T00:00:00Z",
"items": [
{
"id": "3e98e590-85b6-4247-b2e9-96fc2f45802e",
"price": 0.006,
"product": {
"id": "4ec0ac89-a382-409c-ae67-4478e7e681ac",
"name": "Crawdad Crippler - 1g - PreRoll",
"sku": "WHODAT"
},
"quantity": 786,
"received_quantity": 786
}
],
"order_datetime": "2022‐07‐02T00:00:00Z",
"payments": [
{
"amount": 150.23,
"company": {
"id": "00000000-0000-0000-0000-00000000000a",
"name": "RAW"
},
"description": "Payment for purchase PO-00012345",
"fully_paid_with_credits": false,
"id": "12345",
"inserted_datetime": "2022‐07‐02T00:00:00Z",
"payment_date": "2022‐07‐02T00:00:00Z",
"payment_method": {
"id": "12345",
"name": "Credit Card"
},
"payment_number": "PYT-0000001",
"payment_type": "PURCHASE",
"purchase": {
"id": "193c12d2-bc68-46fa-a221-12f9ed958ef4",
"purchase_number": "PO-00012345",
"status": "PENDING",
"total": 150.23
},
"status": "POSTED",
"updated_datetime": "2022‐07‐02T00:00:00Z"
}
],
"purchase_number": "PO-00012345",
"status": "PENDING",
"total": "150.23",
"updated_datetime": "2022‐07‐02T00:00:00Z"
}
| Property | Description | Type | Required |
|---|---|---|---|
| billing_location | A location with its license number inlined, as nested on orders/invoices/purchases | LocationWithLicense | false |
| charges | A collection of Charges | array(Charge) | false |
| company | A company as nested inside another entity in Distru | CompanyCompact | false |
| custom_data | The custom data for this purchase order | array(CustomField) | false |
| description | A description of the purchase order | string | false |
| due_datetime | The datetime by which the order should be completed for the customer | string | false |
| id | Unique ID for this order | string | false |
| inserted_datetime | The datetime at which the order was created in Distru | string | false |
| items | A collection of PurchaseOrderItems | array(PurchaseOrderItem) | false |
| location | A location with its license number inlined, as nested on orders/invoices/purchases | LocationWithLicense | false |
| order_datetime | The datetime on which the order was placed | string | false |
| owner | Information about a user in Distru | User | false |
| payments | A collection of the purchase's payments | array(Payment) | false |
| purchase_number | The purchase order number as shown in the Distru UI | string | false |
| status | The status of this purchase order | string | false |
| total | The total for this order including taxes, discounts, and all line items | string | false |
| updated_datetime | The datetime at which the order was last updated in Distru | string | false |
PurchaseChargeRequest
Purchase charge params
| Property | Description | Type | Required |
|---|---|---|---|
| id | Unique ID for this purchase charge. If it exists, an update will be performed; otherwise, it will be used as the ID of a new purchase charge record | string | false |
| name | The name of this charge | string | true |
| percent | The percent value for this charge. Required if unit_type is PERCENT | number | false |
| price | The flat price for this charge. Required if unit_type is PRICE. Auto-calculated for percent-based charges | number | false |
| type | Type of this line item. Note: Tax charges should be sent as CHARGE with a tax_id | string | true |
| unit_type | Determines if this line is tracked as a percentage or a flat charge | string | true |
PurchaseChargesRequest
A collection of Purchase charge params
| Property | Description | Type | Required |
|---|
PurchaseItemRequest
Purchase item params. Must provide either batch_id or product_id. If batch_id is provided, product_id will be auto-filled. If product_id is provided for a product-tracked item, batch_id will be auto-filled.
| Property | Description | Type | Required |
|---|---|---|---|
| batch_id | The ID of the batch | string | false |
| id | Unique ID for this order item. If it exists, an update will be performed; otherwise, it will be used as the ID of a new purchase order item record | string | false |
| price | Price per unit of the inventory being received on this purchase item | number | true |
| product_id | The ID of the product | string | false |
| quantity | Quantity received in this purchase item | number | true |
PurchaseItemsRequest
A collection of purchase item params
| Property | Description | Type | Required |
|---|
PurchaseOrderHistoryReport
The Purchase Order History report
{
"data": [
{
"amount": 1234.56,
"due_date": "Jul 15th 2026",
"metrc_manifest_number": "0000123456",
"owner": "Jane Doe",
"paid": 1.0e3,
"purchase_date": "Jul 1st 2026",
"purchase_number": "PO-1042",
"status": "COMPLETED",
"vendor": "Emerald Farms"
}
],
"meta": {
"columns": [
{
"key": "purchase_date",
"label": "Purchase Date"
},
{
"key": "due_date",
"label": "Due Date"
},
{
"key": "purchase_number",
"label": "Purchase Number"
},
{
"key": "vendor",
"label": "Vendor"
},
{
"key": "status",
"label": "Status"
},
{
"key": "paid",
"label": "Paid"
},
{
"key": "amount",
"label": "Amount"
},
{
"key": "owner",
"label": "Owner"
},
{
"key": "metrc_manifest_number",
"label": "Metrc Manifest Number"
}
],
"date_range": "Jun 26th 2026 to Jul 26th 2026",
"report": "purchase_order_history"
}
}
| Property | Description | Type | Required |
|---|---|---|---|
| data | The report rows | array(PurchaseOrderHistoryReportRow) | true |
| meta | Report-level metadata | PurchaseOrderHistoryReportMeta | true |
PurchaseOrderHistoryReportColumn
| Property | Description | Type | Required |
|---|---|---|---|
| key | The key used for this column in each data row | string | true |
| label | The human-readable label of the column | string | true |
PurchaseOrderHistoryReportMeta
Report-level metadata
| Property | Description | Type | Required |
|---|---|---|---|
| columns | The report's column definitions | array(PurchaseOrderHistoryReportColumn) | false |
| date_range | The human-readable date range the report covers | string | false |
| report | The report identifier | string | true |
PurchaseOrderHistoryReportRow
A single row of the Purchase Order History report. Companies on a compliance integration and companies with Purchase custom fields will see additional keys.
{
"amount": 1234.56,
"due_date": "Jul 15th 2026",
"metrc_manifest_number": "0000123456",
"owner": "Jane Doe",
"paid": 1.0e3,
"purchase_date": "Jul 1st 2026",
"purchase_number": "PO-1042",
"status": "COMPLETED",
"vendor": "Emerald Farms"
}
| Property | Description | Type | Required |
|---|---|---|---|
| amount | The purchase total | number | false |
| due_date | The due date, in the company's timezone | string | false |
| owner | The purchase owner's name | string | false |
| paid | The amount paid on the purchase | number | false |
| purchase_date | The purchase date, in the company's timezone | string | false |
| purchase_number | The purchase number | string | false |
| status | The purchase status | string | false |
| vendor | The vendor name | string | false |
PurchaseOrderItem
An order line item as shown in Distru
| Property | Description | Type | Required |
|---|---|---|---|
| batch | A batch for a product as shown in Distru | Batch | false |
| compliance_quantity | The quantity of this order item expressed in its package's unit type. Null if not package-tracked. | string | false |
| id | Unique ID for this order item | string | false |
| is_sample | True if this order item is a sample | boolean | false |
| location | A location as nested inside another entity in Distru | LocationCompact | false |
| package | A package as shown in Distru | Package | false |
| price | Price per unit of this order item (with discounts applied) | string | false |
| price_base | Price per unit of this order item | string | false |
| product | A product as shown in Distru | Product | false |
| quantity | Quantity purchased on this order item | string | false |
| received_quantity | Quantity received on this order item. Less than or equal to the quantity field. Omitted when null. | string | false |
PurchasePayment
A purchase payment as shown in Distru
{
"amount": 100.0,
"description": "Payment for invoice 12345",
"id": "12345",
"method_id": "12345",
"payment_date": "2024-12-12 20:26:19.297537",
"payment_number": "12345",
"quickbooks_deposit_account_id": "12345",
"quickbooks_deposit_account_name": "Checking"
}
| Property | Description | Type | Required |
|---|---|---|---|
| amount | The amount of the payment | number | false |
| description | The description of this payment | string | false |
| id | Unique ID for this purchase payment | string | false |
| method_id | The ID of the payment method used for this payment | string | false |
| payment_date | The date of this payment | string | false |
| payment_number | The payment number for this payment | string | false |
| purchase_id | The ID of the purchase this payment is for | string | false |
| quickbooks_deposit_account_id | The id of the Quickbooks deposit account used for this payment | string | false |
| quickbooks_deposit_account_name | The name of the Quickbooks deposit account used for this payment | string | false |
Purchases
A collection of Purchases
| Property | Description | Type | Required |
|---|---|---|---|
| data | Purchases | array(Purchase) | false |
| next_page | URL for the next page of results; null when there is no next page | string | false |
PurchasesByCompanyReport
The Purchases By Company report
{
"data": [
{
"category": "Vendor",
"last_purchase_date": "07/03/2026",
"name": "Emerald Farms",
"product_owner": "Jane Doe",
"purchase_order_count": 4,
"relationship_type": "Supplier",
"total_purchases": 4234.56
}
],
"meta": {
"columns": [
{
"key": "name",
"label": "Name"
},
{
"key": "last_purchase_date",
"label": "Last Purchase Date"
},
{
"key": "purchase_order_count",
"label": "Purchase Order Count"
},
{
"key": "total_purchases",
"label": "Total Purchases"
},
{
"key": "product_owner",
"label": "Product Owner"
},
{
"key": "category",
"label": "Category"
},
{
"key": "relationship_type",
"label": "Relationship Type"
}
],
"date_range": "Jun 26th 2026 to Jul 26th 2026",
"report": "purchases_by_company"
}
}
| Property | Description | Type | Required |
|---|---|---|---|
| data | The report rows | array(PurchasesByCompanyReportRow) | true |
| meta | Report-level metadata | PurchasesByCompanyReportMeta | true |
PurchasesByCompanyReportColumn
| Property | Description | Type | Required |
|---|---|---|---|
| key | The key used for this column in each data row | string | true |
| label | The human-readable label of the column | string | true |
PurchasesByCompanyReportMeta
Report-level metadata
| Property | Description | Type | Required |
|---|---|---|---|
| columns | The report's column definitions | array(PurchasesByCompanyReportColumn) | false |
| date_range | The human-readable date range the report covers | string | false |
| report | The report identifier | string | true |
PurchasesByCompanyReportRow
A single row of the Purchases By Company report. Companies with CompanyRelationship custom fields will see additional keys.
{
"category": "Vendor",
"last_purchase_date": "07/03/2026",
"name": "Emerald Farms",
"product_owner": "Jane Doe",
"purchase_order_count": 4,
"relationship_type": "Supplier",
"total_purchases": 4234.56
}
| Property | Description | Type | Required |
|---|---|---|---|
| category | The vendor's category | string | false |
| last_purchase_date | The date of the vendor's most recent purchase | string | false |
| name | The vendor (related company) name | string | false |
| product_owner | The vendor's owner (sales rep) name | string | false |
| purchase_order_count | The number of purchases in the reported date range | number | false |
| relationship_type | The vendor's relationship type | string | false |
| total_purchases | The total cost of the vendor's purchases | number | false |
PurchasesByProductReport
The Purchases By Product report
{
"data": [
{
"category": "Vape",
"group": "Cartridges",
"name": "Blue Dream 1g Cartridge",
"owner": "Jane Doe",
"quantity_purchased": 120.0,
"sale_price": 35.0,
"sku": "BD-1G-CART",
"subcategory": "Cartridge",
"total_purchased": 4234.56,
"unit_cost": 8.5,
"unit_type": "Each",
"vendor": "Sunshine Extracts",
"wholesale_price": 25.0
}
],
"meta": {
"columns": [
{
"key": "name",
"label": "Name"
},
{
"key": "sku",
"label": "SKU"
},
{
"key": "quantity_purchased",
"label": "Quantity Purchased"
},
{
"key": "total_purchased",
"label": "Total Purchased"
},
{
"key": "unit_type",
"label": "Unit Type"
},
{
"key": "category",
"label": "Category"
},
{
"key": "subcategory",
"label": "Subcategory"
},
{
"key": "group",
"label": "Group"
},
{
"key": "vendor",
"label": "Vendor"
},
{
"key": "owner",
"label": "Owner"
},
{
"key": "unit_cost",
"label": "Unit Cost"
},
{
"key": "sale_price",
"label": "Sale Price"
},
{
"key": "wholesale_price",
"label": "Wholesale Price"
}
],
"date_range": "Jun 26th 2026 to Jul 26th 2026",
"report": "purchases_by_product"
}
}
| Property | Description | Type | Required |
|---|---|---|---|
| data | The report rows | array(PurchasesByProductReportRow) | true |
| meta | Report-level metadata | PurchasesByProductReportMeta | true |
PurchasesByProductReportColumn
| Property | Description | Type | Required |
|---|---|---|---|
| key | The key used for this column in each data row | string | true |
| label | The human-readable label of the column | string | true |
PurchasesByProductReportMeta
Report-level metadata
| Property | Description | Type | Required |
|---|---|---|---|
| columns | The report's column definitions | array(PurchasesByProductReportColumn) | false |
| date_range | The human-readable date range the report covers | string | false |
| report | The report identifier | string | true |
PurchasesByProductReportRow
A single row of the Purchases By Product report. Companies with Product custom fields will see additional keys.
{
"category": "Vape",
"group": "Cartridges",
"name": "Blue Dream 1g Cartridge",
"owner": "Jane Doe",
"quantity_purchased": 120.0,
"sale_price": 35.0,
"sku": "BD-1G-CART",
"subcategory": "Cartridge",
"total_purchased": 4234.56,
"unit_cost": 8.5,
"unit_type": "Each",
"vendor": "Sunshine Extracts",
"wholesale_price": 25.0
}
| Property | Description | Type | Required |
|---|---|---|---|
| category | The product's category | string | false |
| group | The product's group | string | false |
| name | The product name | string | false |
| owner | The product owner's name | string | false |
| quantity_purchased | The quantity purchased | number | false |
| sale_price | The product's sale price | number | false |
| sku | The product SKU | string | false |
| subcategory | The product's subcategory | string | false |
| total_purchased | The total cost of the purchased quantity | number | false |
| unit_cost | The product's unit cost | number | false |
| unit_type | The product's unit type | string | false |
| vendor | The product's vendor | string | false |
| wholesale_price | The product's wholesale price | number | false |
RelationshipType
A relationship type as shown in Distru
{
"id": "12345",
"name": "Supplier"
}
| Property | Description | Type | Required |
|---|---|---|---|
| id | Unique ID for this relationship type | string | false |
| name | Name of the relationship type | string | false |
Return
A return as shown in Distru
{
"company": {
"id": "00000000-0000-0000-0000-00000000000a",
"name": "RAW"
},
"custom_data": {},
"description": "Customer return for damaged goods",
"id": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
"inserted_datetime": "2024-12-12T20:26:19.297537Z",
"invoice_numbers": [
"INV-001",
"INV-002"
],
"items": [
{
"id": "e5f6a7b8-c9d0-1234-ef01-23456789abcd",
"price": 30.1,
"product": {
"id": "p1b2c3d4-e5f6-7890-abcd-ef1234567890",
"name": "Blue Dream Preroll 1G",
"sku": "BDP-1G",
"updated_datetime": "2024-12-12T20:26:19.297537Z"
},
"quantity": 5,
"waste": false
}
],
"location": {
"address": "420 smoke lane, Oakland, CA 94636, USA",
"company_id": "00000000-0000-0000-0000-000000000001",
"id": "00000000-0000-0000-0000-000000000001",
"name": "Warehouse 1"
},
"order_id": "67ae9080-8dc2-4ab7-9704-19673f4d9f21",
"order_number": "SO-12345",
"order_quantity": "100",
"owner": {
"banned": false,
"email": "admin@thcdistributioninc.com",
"full_name": "Greg Owner",
"id": "00000000-0000-0000-0000-000000000001",
"role": {
"id": "00000000-0000-0000-0000-000000000001",
"name": "Admin"
}
},
"return_datetime": "2024-12-12T20:26:19.297537Z",
"return_number": "RET-001",
"return_quantity": "50",
"return_type": "Partial Return",
"status": "SHIPPED",
"total": 150.5,
"updated_datetime": "2024-12-12T20:26:19.297537Z"
}
| Property | Description | Type | Required |
|---|---|---|---|
| company | A company as nested inside another entity in Distru | CompanyCompact | false |
| custom_data | Custom data associated with this return | map | false |
| description | Description of the return | string | false |
| id | Unique ID for this return | string | false |
| inserted_datetime | The datetime at which the return was created in Distru | string | false |
| invoice_numbers | Invoice numbers associated with the order | array(any) | false |
| items | The items on this return | array(ReturnItem) | false |
| location | A location as nested inside another entity in Distru | LocationCompact | false |
| order_id | The associated order ID (UUID) | string | false |
| order_number | The order number from the associated order | string | false |
| order_quantity | Total quantity of all items on the associated order | string | false |
| owner | Information about a user in Distru | User | false |
| return_datetime | The datetime of the return | string | false |
| return_number | The return number as shown in the Distru UI | string | false |
| return_quantity | Total quantity of all items on this return | string | false |
| return_type | Indicates if this is a Full Return or Partial Return. Full Return means ALL order items have been FULLY returned. Null if not associated with an order. | string | false |
| status | The status of this return | string | false |
| total | The total amount of this return | number | false |
| updated_datetime | The datetime at which the return was last updated in Distru | string | false |
ReturnItem
A return item as shown in Distru
{
"id": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
"price": 30.1,
"product": {
"id": "p1b2c3d4-e5f6-7890-abcd-ef1234567890",
"name": "Blue Dream Preroll 1G",
"sku": "BDP-1G",
"updated_datetime": "2024-12-12T20:26:19.297537Z"
},
"quantity": 5,
"waste": false
}
| Property | Description | Type | Required |
|---|---|---|---|
| id | Unique ID for this return item | string | false |
| price | Price per unit | number | false |
| product | A product as shown in Distru | Product | false |
| quantity | Quantity returned | number | false |
| waste | Whether this item was marked as waste | boolean | false |
Returns
A collection of Returns
| Property | Description | Type | Required |
|---|---|---|---|
| data | Returns | array(Return) | false |
| next_page | URL for the next page of results; null when there is no next page | string | false |
Role
A user role as shown in Distru
{
"id": "12345",
"name": "Admin"
}
| Property | Description | Type | Required |
|---|---|---|---|
| id | Unique ID for this role | string | false |
| name | Name of the role | string | false |
SalesByCompanyReport
The Sales By Company report
{
"data": [
{
"category": "Dispensary",
"last_order_date": "07/03/2026",
"name": "Green Leaf Dispensary",
"order_count": 4,
"owner": "Jane Doe",
"relationship_type": "Customer",
"total_received": 1.0e3,
"total_sales": 4234.56
}
],
"meta": {
"columns": [
{
"key": "name",
"label": "Name"
},
{
"key": "last_order_date",
"label": "Last Order Date"
},
{
"key": "order_count",
"label": "Order Count"
},
{
"key": "total_received",
"label": "Total Received"
},
{
"key": "total_sales",
"label": "Total Sales"
},
{
"key": "owner",
"label": "Owner"
},
{
"key": "category",
"label": "Category"
},
{
"key": "relationship_type",
"label": "Relationship Type"
}
],
"date_range": "Jun 26th 2026 to Jul 26th 2026",
"report": "sales_by_company"
}
}
| Property | Description | Type | Required |
|---|---|---|---|
| data | The report rows | array(SalesByCompanyReportRow) | true |
| meta | Report-level metadata | SalesByCompanyReportMeta | true |
SalesByCompanyReportColumn
| Property | Description | Type | Required |
|---|---|---|---|
| key | The key used for this column in each data row | string | true |
| label | The human-readable label of the column | string | true |
SalesByCompanyReportMeta
Report-level metadata
| Property | Description | Type | Required |
|---|---|---|---|
| columns | The report's column definitions | array(SalesByCompanyReportColumn) | false |
| date_range | The human-readable date range the report covers | string | false |
| report | The report identifier | string | true |
SalesByCompanyReportRow
A single row of the Sales By Company report. Companies with CompanyRelationship custom fields will see additional keys.
{
"category": "Dispensary",
"last_order_date": "07/03/2026",
"name": "Green Leaf Dispensary",
"order_count": 4,
"owner": "Jane Doe",
"relationship_type": "Customer",
"total_received": 1.0e3,
"total_sales": 4234.56
}
| Property | Description | Type | Required |
|---|---|---|---|
| category | The customer's category | string | false |
| last_order_date | The date of the customer's most recent order | string | false |
| name | The customer (related company) name | string | false |
| order_count | The number of orders in the reported date range | number | false |
| owner | The customer's owner (sales rep) name | string | false |
| relationship_type | The customer's relationship type | string | false |
| total_received | The total payments received on the customer's orders | number | false |
| total_sales | The total order sales, net of returns | number | false |
SalesByProductReport
The Sales By Product report
{
"data": [
{
"category": "Vape",
"group": "Cartridges",
"name": "Blue Dream 1g Cartridge",
"product_owner": "Jane Doe",
"quantity_sold": 120.0,
"sale_price": 35.0,
"shipped_from_license": "C11-0000001-LIC",
"sku": "BD-1G-CART",
"subcategory": "Cartridge",
"total_sales": 4234.56,
"unit_cost": 8.5,
"unit_type": "Each",
"upc": "850000000001",
"vendor": "Sunshine Extracts",
"wholesale_price": 25.0
}
],
"meta": {
"columns": [
{
"key": "name",
"label": "Name"
},
{
"key": "sku",
"label": "SKU"
},
{
"key": "quantity_sold",
"label": "Quantity Sold"
},
{
"key": "total_sales",
"label": "Total Sales"
},
{
"key": "unit_type",
"label": "Unit Type"
},
{
"key": "category",
"label": "Category"
},
{
"key": "subcategory",
"label": "Subcategory"
},
{
"key": "group",
"label": "Group"
},
{
"key": "vendor",
"label": "Vendor"
},
{
"key": "product_owner",
"label": "Product Owner"
},
{
"key": "unit_cost",
"label": "Unit Cost"
},
{
"key": "sale_price",
"label": "Sale Price"
},
{
"key": "wholesale_price",
"label": "Wholesale Price"
},
{
"key": "shipped_from_license",
"label": "Shipped From License"
},
{
"key": "upc",
"label": "UPC"
}
],
"date_range": "Jun 26th 2026 to Jul 26th 2026",
"report": "sales_by_product"
}
}
| Property | Description | Type | Required |
|---|---|---|---|
| data | The report rows | array(SalesByProductReportRow) | true |
| meta | Report-level metadata | SalesByProductReportMeta | true |
SalesByProductReportColumn
| Property | Description | Type | Required |
|---|---|---|---|
| key | The key used for this column in each data row | string | true |
| label | The human-readable label of the column | string | true |
SalesByProductReportMeta
Report-level metadata
| Property | Description | Type | Required |
|---|---|---|---|
| columns | The report's column definitions | array(SalesByProductReportColumn) | false |
| date_range | The human-readable date range the report covers | string | false |
| report | The report identifier | string | true |
SalesByProductReportRow
A single row of the Sales By Product report. Companies with Product custom fields will see additional keys.
{
"category": "Vape",
"group": "Cartridges",
"name": "Blue Dream 1g Cartridge",
"product_owner": "Jane Doe",
"quantity_sold": 120.0,
"sale_price": 35.0,
"shipped_from_license": "C11-0000001-LIC",
"sku": "BD-1G-CART",
"subcategory": "Cartridge",
"total_sales": 4234.56,
"unit_cost": 8.5,
"unit_type": "Each",
"upc": "850000000001",
"vendor": "Sunshine Extracts",
"wholesale_price": 25.0
}
| Property | Description | Type | Required |
|---|---|---|---|
| category | The product's category | string | false |
| group | The product's group | string | false |
| name | The product name | string | false |
| product_owner | The product owner's name | string | false |
| quantity_sold | The quantity sold, net of returns | number | false |
| sale_price | The product's sale price | number | false |
| shipped_from_license | The license the sold items shipped from | string | false |
| sku | The product SKU | string | false |
| subcategory | The product's subcategory | string | false |
| total_sales | The total sales, net of returns | number | false |
| unit_cost | The product's unit cost | number | false |
| unit_type | The product's unit type | string | false |
| upc | The product's UPC | string | false |
| vendor | The product's vendor | string | false |
| wholesale_price | The product's wholesale price | number | false |
SalesByUserReport
The Sales By User report
{
"data": [
{
"leaderboard_rank": 1,
"order_count": 4,
"sales_pre_tax": 3.8e3,
"total_sales": 4234.56,
"user": "Jane Doe"
}
],
"meta": {
"columns": [
{
"key": "leaderboard_rank",
"label": "Leaderboard Rank"
},
{
"key": "user",
"label": "User"
},
{
"key": "order_count",
"label": "Order Count"
},
{
"key": "sales_pre_tax",
"label": "Sales (Pre-Tax)"
},
{
"key": "total_sales",
"label": "Total Sales"
}
],
"date_range": "Jun 26th 2026 to Jul 26th 2026",
"report": "sales_by_user"
}
}
| Property | Description | Type | Required |
|---|---|---|---|
| data | The report rows | array(SalesByUserReportRow) | true |
| meta | Report-level metadata | SalesByUserReportMeta | true |
SalesByUserReportColumn
| Property | Description | Type | Required |
|---|---|---|---|
| key | The key used for this column in each data row | string | true |
| label | The human-readable label of the column | string | true |
SalesByUserReportMeta
Report-level metadata
| Property | Description | Type | Required |
|---|---|---|---|
| columns | The report's column definitions | array(SalesByUserReportColumn) | false |
| date_range | The human-readable date range the report covers | string | false |
| report | The report identifier | string | true |
SalesByUserReportRow
A single row of the Sales By User report.
{
"leaderboard_rank": 1,
"order_count": 4,
"sales_pre_tax": 3.8e3,
"total_sales": 4234.56,
"user": "Jane Doe"
}
| Property | Description | Type | Required |
|---|---|---|---|
| leaderboard_rank | The user's rank by total sales, with 1 as the top seller | number | false |
| order_count | The number of orders in the reported date range | number | false |
| sales_pre_tax | The pre-tax sales total, net of returns | number | false |
| total_sales | The total sales, net of returns | number | false |
| user | The user's (sales rep's) name | string | false |
SalesOrderHistoryReport
The Sales Order History report
{
"data": [
{
"charges_taxes_not_included": 0.0,
"customer": "Green Leaf Dispensary",
"delivery_date": "Jul 3rd 2026",
"delivery_date_utc": "Jul 3rd 2026",
"discounts_taxes_not_included": 0.0,
"due_date": "Jul 15th 2026",
"due_date_utc": "Jul 15th 2026",
"metrc_manifest_number": "0000012345",
"order_date": "Jul 1st 2026",
"order_date_utc": "Jul 1st 2026",
"order_number": "1042",
"outstanding": 234.56,
"owner": "Jane Doe",
"paid": 1.0e3,
"returns": 0.0,
"shipped_from_license": "C11-0000123-LIC",
"status": "COMPLETED",
"subtotal": 1150.0,
"taxes": 84.56,
"total": 1234.56
}
],
"meta": {
"columns": [
{
"key": "order_date",
"label": "Order Date"
},
{
"key": "order_date_utc",
"label": "Order Date (UTC)"
},
{
"key": "delivery_date",
"label": "Delivery Date"
},
{
"key": "delivery_date_utc",
"label": "Delivery Date (UTC)"
},
{
"key": "due_date",
"label": "Due Date"
},
{
"key": "due_date_utc",
"label": "Due Date (UTC)"
},
{
"key": "order_number",
"label": "Order Number"
},
{
"key": "customer",
"label": "Customer"
},
{
"key": "status",
"label": "Status"
},
{
"key": "paid",
"label": "Paid"
},
{
"key": "outstanding",
"label": "Outstanding"
},
{
"key": "subtotal",
"label": "Subtotal"
},
{
"key": "taxes",
"label": "Taxes"
},
{
"key": "discounts_taxes_not_included",
"label": "Discounts (taxes not included)"
},
{
"key": "charges_taxes_not_included",
"label": "Charges (taxes not included)"
},
{
"key": "returns",
"label": "Returns"
},
{
"key": "total",
"label": "Total"
},
{
"key": "owner",
"label": "Owner"
},
{
"key": "metrc_manifest_number",
"label": "Metrc Manifest Number"
},
{
"key": "shipped_from_license",
"label": "Shipped From License"
}
],
"date_range": "Jun 26th 2026 to Jul 26th 2026",
"report": "sales_order_history"
}
}
| Property | Description | Type | Required |
|---|---|---|---|
| data | The report rows | array(SalesOrderHistoryReportRow) | true |
| meta | Report-level metadata | SalesOrderHistoryReportMeta | true |
SalesOrderHistoryReportColumn
| Property | Description | Type | Required |
|---|---|---|---|
| key | The key used for this column in each data row | string | true |
| label | The human-readable label of the column | string | true |
SalesOrderHistoryReportMeta
Report-level metadata
| Property | Description | Type | Required |
|---|---|---|---|
| columns | The report's column definitions | array(SalesOrderHistoryReportColumn) | false |
| date_range | The human-readable date range the report covers | string | false |
| report | The report identifier | string | true |
SalesOrderHistoryReportRow
A single row of the Sales Order History report. Companies on a compliance integration and companies with Order custom fields will see additional keys.
{
"charges_taxes_not_included": 0.0,
"customer": "Green Leaf Dispensary",
"delivery_date": "Jul 3rd 2026",
"delivery_date_utc": "Jul 3rd 2026",
"discounts_taxes_not_included": 0.0,
"due_date": "Jul 15th 2026",
"due_date_utc": "Jul 15th 2026",
"metrc_manifest_number": "0000012345",
"order_date": "Jul 1st 2026",
"order_date_utc": "Jul 1st 2026",
"order_number": "1042",
"outstanding": 234.56,
"owner": "Jane Doe",
"paid": 1.0e3,
"returns": 0.0,
"shipped_from_license": "C11-0000123-LIC",
"status": "COMPLETED",
"subtotal": 1150.0,
"taxes": 84.56,
"total": 1234.56
}
| Property | Description | Type | Required |
|---|---|---|---|
| charges_taxes_not_included | The total charges on the order, taxes not included | number | false |
| customer | The customer name | string | false |
| delivery_date | The delivery date, in the company's timezone | string | false |
| delivery_date_utc | The delivery date, in UTC | string | false |
| discounts_taxes_not_included | The total discounts on the order, taxes not included | number | false |
| due_date | The due date, in the company's timezone | string | false |
| due_date_utc | The due date, in UTC | string | false |
| order_date | The order date, in the company's timezone | string | false |
| order_date_utc | The order date, in UTC | string | false |
| order_number | The order number | string | false |
| outstanding | The outstanding (unpaid) amount on the order | number | false |
| owner | The order owner's name | string | false |
| paid | The amount paid on the order | number | false |
| returns | The total value of returns on the order | number | false |
| status | The order status | string | false |
| subtotal | The order subtotal | number | false |
| taxes | The total taxes on the order | number | false |
| total | The order total | number | false |
SalesOrderItem
An order line item as shown in Distru
| Property | Description | Type | Required |
|---|---|---|---|
| batch | A batch for a product as shown in Distru | Batch | false |
| compliance_quantity | The quantity of this order item expressed in its package's unit type. Null if not package-tracked. | string | false |
| cost_per_unit | The cost per unit of this order item | string | false |
| cost_per_unit_default | The default cost per unit (from the configured product unit cost) of this order item | string | false |
| id | Unique ID for this order item | string | false |
| is_sample | True if this order item is a sample | boolean | false |
| location | A location as nested inside another entity in Distru | LocationCompact | false |
| package | A package as shown in Distru | Package | false |
| price | Price per unit of this order item | string | false |
| price_base | Price per unit before any discounts | string | false |
| product | A product as shown in Distru | Product | false |
| quantity | Quantity sold on this order item | string | false |
| received_quantity | Quantity received on this order item. Omitted when null. | string | false |
| returned_quantity | Quantity returned on this order item | string | false |
| total_cost_actual | Total cost of the non-returned quantity in this order item, in other words, this is the total cost of order_item.quantity minus order_item.returned quantity. | string | false |
| total_cost_default | Default cost of the non-returned quantity in this order item, in other words, this is the default cost of order_item.quantity minus order_item.returned quantity. | string | false |
SalesOrderItemHistoryReport
The Sales Order Item History report
{
"data": [
{
"vendor_id": "00000000-0000-0000-0000-000000000440",
"default_unit_cost": 12.5,
"cbd_mg_ml": 4.5,
"category": "Vape",
"order_number": "1042",
"product_sku": "BD-CART-1G",
"due_date_utc": "Jul 15th 2026",
"customer": "Green Leaf Dispensary",
"order_date": "Jul 1st 2026",
"customer_id": "00000000-0000-0000-0000-0000000015bf",
"order_id": "a0e8d1b3-5c2f-4e9a-8b7d-1f6c3a2e9d04",
"package_label": "1A4060300003B01000001234",
"total_cbd": 0.8,
"delivery_date": "Jul 3rd 2026",
"batch_number": "BATCH-2026-001",
"delivery_date_utc": "Jul 3rd 2026",
"order_date_utc": "Jul 1st 2026",
"returned_quantity": 0.0,
"default_unit_price": 25.0,
"package_harvest_date": "May 1st 2026",
"status": "COMPLETED",
"cbd_mg_g": 5.0,
"sales_rep": "Jane Doe",
"order_item_price": 25.0,
"due_date": "Jul 15th 2026",
"total_thc": 88.0,
"brand_id": "00000000-0000-0000-0000-000000000156",
"total_cbd_mg_ml": 7.0,
"total_cbd_mg_g": 8.0,
"package_expiration_date": "Dec 31st 2026",
"invoice_numbers": "INV-1042",
"quantity": 10.0,
"brand": "Green Labs",
"default_wholesale_price": 20.0,
"total_thc_mg_ml": 820.0,
"total_thc_mg_g": 880.0,
"shipped_from_license": "C11-0000123-LIC",
"vendor": "Green Labs Cultivation",
"group": "Cartridges",
"thc": 85.0,
"package_batch_number": "BATCH-2026-001",
"upc": "850000123456",
"cbd": 0.5,
"product_id": "c2d7e6f5-4b3a-4c1d-8e9f-0a1b2c3d4e5f",
"thc_mg_g": 850.0,
"thc_mg_ml": 800.0,
"subcategory": "Cartridge",
"metrc_manifest_number": "0000012345",
"product": "Blue Dream 1g Cartridge",
"line_item_id": "b1f9c0a2-6e4d-4a7b-9f3c-2d8e5a1c0f42"
}
],
"meta": {
"columns": [
{
"key": "line_item_id",
"label": "Line Item Id"
},
{
"key": "order_id",
"label": "Order Id"
},
{
"key": "order_date",
"label": "Order Date"
},
{
"key": "order_date_utc",
"label": "Order Date (UTC)"
},
{
"key": "delivery_date",
"label": "Delivery Date"
},
{
"key": "delivery_date_utc",
"label": "Delivery Date (UTC)"
},
{
"key": "due_date",
"label": "Due Date"
},
{
"key": "due_date_utc",
"label": "Due Date (UTC)"
},
{
"key": "order_number",
"label": "Order Number"
},
{
"key": "status",
"label": "Status"
},
{
"key": "product",
"label": "Product"
},
{
"key": "product_id",
"label": "Product Id"
},
{
"key": "product_sku",
"label": "Product SKU"
},
{
"key": "default_unit_cost",
"label": "Default Unit Cost"
},
{
"key": "default_unit_price",
"label": "Default Unit Price"
},
{
"key": "default_wholesale_price",
"label": "Default Wholesale Price"
},
{
"key": "brand",
"label": "Brand"
},
{
"key": "brand_id",
"label": "Brand Id"
},
{
"key": "vendor",
"label": "Vendor"
},
{
"key": "vendor_id",
"label": "Vendor Id"
},
{
"key": "package_label",
"label": "Package Label"
},
{
"key": "package_batch_number",
"label": "Package Batch Number"
},
{
"key": "order_item_price",
"label": "Order Item Price"
},
{
"key": "returned_quantity",
"label": "Returned Quantity"
},
{
"key": "quantity",
"label": "Quantity"
},
{
"key": "category",
"label": "Category"
},
{
"key": "subcategory",
"label": "Subcategory"
},
{
"key": "group",
"label": "Group"
},
{
"key": "customer",
"label": "Customer"
},
{
"key": "customer_id",
"label": "Customer Id"
},
{
"key": "sales_rep",
"label": "Sales Rep"
},
{
"key": "thc",
"label": "THC %"
},
{
"key": "thc_mg_g",
"label": "THC mg/g"
},
{
"key": "thc_mg_ml",
"label": "THC mg/mL"
},
{
"key": "total_thc",
"label": "Total THC %"
},
{
"key": "total_thc_mg_g",
"label": "Total THC mg/g"
},
{
"key": "total_thc_mg_ml",
"label": "Total THC mg/mL"
},
{
"key": "cbd",
"label": "CBD %"
},
{
"key": "cbd_mg_g",
"label": "CBD mg/g"
},
{
"key": "cbd_mg_ml",
"label": "CBD mg/mL"
},
{
"key": "total_cbd",
"label": "Total CBD %"
},
{
"key": "total_cbd_mg_g",
"label": "Total CBD mg/g"
},
{
"key": "total_cbd_mg_ml",
"label": "Total CBD mg/mL"
},
{
"key": "metrc_manifest_number",
"label": "Metrc Manifest Number"
},
{
"key": "invoice_numbers",
"label": "Invoice Numbers"
},
{
"key": "shipped_from_license",
"label": "Shipped From License"
},
{
"key": "package_expiration_date",
"label": "Package Expiration Date"
},
{
"key": "upc",
"label": "UPC"
},
{
"key": "package_harvest_date",
"label": "Package Harvest Date"
},
{
"key": "batch_number",
"label": "Batch Number"
}
],
"date_range": "Jun 26th 2026 to Jul 26th 2026",
"report": "sales_order_item_history"
}
}
| Property | Description | Type | Required |
|---|---|---|---|
| data | The report rows | array(SalesOrderItemHistoryReportRow) | true |
| meta | Report-level metadata | SalesOrderItemHistoryReportMeta | true |
SalesOrderItemHistoryReportColumn
| Property | Description | Type | Required |
|---|---|---|---|
| key | The key used for this column in each data row | string | true |
| label | The human-readable label of the column | string | true |
SalesOrderItemHistoryReportMeta
Report-level metadata
| Property | Description | Type | Required |
|---|---|---|---|
| columns | The report's column definitions | array(SalesOrderItemHistoryReportColumn) | false |
| date_range | The human-readable date range the report covers | string | false |
| report | The report identifier | string | true |
SalesOrderItemHistoryReportRow
A single row of the Sales Order Item History report (one sales order line item). Companies on a compliance integration and companies with Order custom fields will see additional keys (package, potency, manifest, and custom field columns).
{
"vendor_id": "00000000-0000-0000-0000-000000000440",
"default_unit_cost": 12.5,
"cbd_mg_ml": 4.5,
"category": "Vape",
"order_number": "1042",
"product_sku": "BD-CART-1G",
"due_date_utc": "Jul 15th 2026",
"customer": "Green Leaf Dispensary",
"order_date": "Jul 1st 2026",
"customer_id": "00000000-0000-0000-0000-0000000015bf",
"order_id": "a0e8d1b3-5c2f-4e9a-8b7d-1f6c3a2e9d04",
"package_label": "1A4060300003B01000001234",
"total_cbd": 0.8,
"delivery_date": "Jul 3rd 2026",
"batch_number": "BATCH-2026-001",
"delivery_date_utc": "Jul 3rd 2026",
"order_date_utc": "Jul 1st 2026",
"returned_quantity": 0.0,
"default_unit_price": 25.0,
"package_harvest_date": "May 1st 2026",
"status": "COMPLETED",
"cbd_mg_g": 5.0,
"sales_rep": "Jane Doe",
"order_item_price": 25.0,
"due_date": "Jul 15th 2026",
"total_thc": 88.0,
"brand_id": "00000000-0000-0000-0000-000000000156",
"total_cbd_mg_ml": 7.0,
"total_cbd_mg_g": 8.0,
"package_expiration_date": "Dec 31st 2026",
"invoice_numbers": "INV-1042",
"quantity": 10.0,
"brand": "Green Labs",
"default_wholesale_price": 20.0,
"total_thc_mg_ml": 820.0,
"total_thc_mg_g": 880.0,
"shipped_from_license": "C11-0000123-LIC",
"vendor": "Green Labs Cultivation",
"group": "Cartridges",
"thc": 85.0,
"package_batch_number": "BATCH-2026-001",
"upc": "850000123456",
"cbd": 0.5,
"product_id": "c2d7e6f5-4b3a-4c1d-8e9f-0a1b2c3d4e5f",
"thc_mg_g": 850.0,
"thc_mg_ml": 800.0,
"subcategory": "Cartridge",
"metrc_manifest_number": "0000012345",
"product": "Blue Dream 1g Cartridge",
"line_item_id": "b1f9c0a2-6e4d-4a7b-9f3c-2d8e5a1c0f42"
}
| Property | Description | Type | Required |
|---|---|---|---|
| batch_number | The batch number | string | false |
| brand | The brand name | string | false |
| brand_id | The brand ID | string | false |
| category | The product category | string | false |
| customer | The customer name | string | false |
| customer_id | The customer ID | string | false |
| default_unit_cost | The product's default unit cost | number | false |
| default_unit_price | The product's default unit price | number | false |
| default_wholesale_price | The product's default wholesale price | number | false |
| delivery_date | The delivery date, in the company's timezone | string | false |
| delivery_date_utc | The delivery date, in UTC | string | false |
| due_date | The due date, in the company's timezone | string | false |
| due_date_utc | The due date, in UTC | string | false |
| group | The product group | string | false |
| invoice_numbers | The invoice numbers associated with the line item | string | false |
| line_item_id | The line item ID | string | false |
| order_date | The order date, in the company's timezone | string | false |
| order_date_utc | The order date, in UTC | string | false |
| order_id | The order ID | string | false |
| order_item_price | The line item price | number | false |
| order_number | The order number | string | false |
| product | The product name | string | false |
| product_id | The product ID | string | false |
| product_sku | The product SKU | string | false |
| quantity | The line item quantity | number | false |
| returned_quantity | The returned quantity on the line item | number | false |
| sales_rep | The sales rep's name | string | false |
| status | The order status | string | false |
| subcategory | The product subcategory | string | false |
| upc | The product UPC | string | false |
| vendor | The vendor name | string | false |
| vendor_id | The vendor ID | string | false |
SalesOrderTaxReport
The Sales Order Tax report
{
"data": [
{
"tax_rate": 27.0,
"tax_type": "Excise Tax - CA 27%",
"total_tax": 1234.56
}
],
"meta": {
"columns": [
{
"key": "tax_type",
"label": "Tax Type"
},
{
"key": "tax_rate",
"label": "Tax Rate"
},
{
"key": "total_tax",
"label": "Total Tax"
}
],
"date_range": "Jun 26th 2026 to Jul 26th 2026",
"report": "sales_order_tax"
}
}
| Property | Description | Type | Required |
|---|---|---|---|
| data | The report rows | array(SalesOrderTaxReportRow) | true |
| meta | Report-level metadata | SalesOrderTaxReportMeta | true |
SalesOrderTaxReportColumn
| Property | Description | Type | Required |
|---|---|---|---|
| key | The key used for this column in each data row | string | true |
| label | The human-readable label of the column | string | true |
SalesOrderTaxReportMeta
Report-level metadata
| Property | Description | Type | Required |
|---|---|---|---|
| columns | The report's column definitions | array(SalesOrderTaxReportColumn) | false |
| date_range | The human-readable date range the report covers | string | false |
| report | The report identifier | string | true |
SalesOrderTaxReportRow
A single row of the Sales Order Tax report
{
"tax_rate": 27.0,
"tax_type": "Excise Tax - CA 27%",
"total_tax": 1234.56
}
| Property | Description | Type | Required |
|---|---|---|---|
| tax_rate | The tax rate percentage | number | false |
| tax_type | The name of the tax | string | false |
| total_tax | The total tax collected for this tax type and rate | number | false |
StockAdjustment
A stock adjustment as shown in Distru
{
"batch_id": "12345",
"completion_datetime": "2024-12-12 20:26:19.297537",
"compliance_quantity": "10",
"compliance_unit_type": {
"id": "123",
"name": "Gram"
},
"description": "The description for this adjustment",
"id": "12345",
"inserted_datetime": "2024-12-12 20:26:19.297537",
"license_id": "12345",
"location_id": "12345",
"owner_id": "12345",
"package_id": "12345",
"product_id": "12345",
"quantity": "10",
"reason": "Waste",
"total_cost": "100",
"unit_cost": "10",
"unit_type": {
"id": "123",
"name": "Gram"
}
}
| Property | Description | Type | Required |
|---|---|---|---|
| batch_id | The ID of this adjustment's batch. Null if this adjustment is not associated with a batch-tracked product | string | false |
| completion_datetime | The datetime this adjustment was completed at | string | false |
| compliance_quantity | The quantity of this adjustment expressed in it's package's unit type. Null if this adjustment is not associated with a package-tracked product. | string | false |
| compliance_unit_type | A unit type as shown in Distru | UnitType | false |
| description | The description for this adjustment | string | false |
| id | Unique ID for this stock adjustment | string | false |
| inserted_datetime | The datetime this adjustment was created at | string | false |
| license_id | ID of the license that this adjustment is associated with | string | false |
| location_id | ID of the location that this adjustment is associated with | string | false |
| owner_id | The ID of the user that owns this adjustment | string | false |
| package_id | The ID of this adjustment's package. Null if this adjustment is not associated with a package-tracked product | string | false |
| product_id | The ID of this adjustment's product. Populated regardless of the product's inventory tracking method. | string | false |
| quantity | The quantity of the adjustment | string | false |
| reason | The reason for this adjustment | string | false |
| total_cost | The total cost of this adjustment | string | false |
| unit_cost | The cost per unit of this adjustment | string | false |
| unit_type | A unit type as shown in Distru | UnitType | false |
StockAdjustments
A collection of Stock Adjustments
| Property | Description | Type | Required |
|---|---|---|---|
| data | Stock Adjustments | array(StockAdjustment) | false |
| next_page | URL for the next page of results; null when there is no next page | string | false |
Strain
A strain as shown in Distru
{
"id": "12345",
"name": "Strain 123",
"strain_type": "INDICA"
}
| Property | Description | Type | Required |
|---|---|---|---|
| id | Unique ID for this strain | string | false |
| name | Name of the strain | string | false |
| strain_type | The type of strain | string | false |
Strains
A collection of Strains. Note: This endpoint returns eventually consistent data, with changes taking up to 1 second to propagate in responses.
| Property | Description | Type | Required |
|---|---|---|---|
| data | Strains | array(Strain) | false |
| next_page | URL for the next page of results; null when there is no next page | string | false |
Tag
A tag
| Property | Description | Type | Required |
|---|---|---|---|
| id | Unique ID for this tag | string | false |
| name | The name of the tag | string | false |
Tags
A collection of tags
| Property | Description | Type | Required |
|---|---|---|---|
| data | Tags | array(Tag) | false |
| next_page | URL for the next page of results; null when there is no next page | string | false |
Tax
A tax
| Property | Description | Type | Required |
|---|---|---|---|
| description | The description of the tax | string | false |
| id | Unique ID for this tax | string | false |
| inserted_datetime | When the tax was created (UTC ISO-8601) | string | false |
| name | The name of the tax | string | false |
| qb_account_id | The associated QuickBooks Online account ID | string | false |
| qb_product_id | The associated QuickBooks Online product ID | string | false |
| tags | Tags associated with this tax | array(Tag) | false |
| tax_applied_after_charges | Whether the tax is applied after charges | boolean | false |
| tax_applied_after_price_tiers | Whether the tax is applied after price tiers | boolean | false |
| tax_code | The tax code | string | false |
| tax_rate_percent | The tax rate as a percentage | number | false |
| updated_datetime | When the tax was last updated (UTC ISO-8601) | string | false |
Taxes
A collection of taxes
| Property | Description | Type | Required |
|---|---|---|---|
| data | Taxes | array(Tax) | false |
| next_page | URL for the next page of results; null when there is no next page | string | false |
TestResult
A test result as shown in Distru
| Property | Description | Type | Required |
|---|---|---|---|
| additional_test_results | An additional test result object for a test result as shown in Distru | AdditionalTestResult | false |
| batch_id | The ID of the batch this test result belongs to, or null | string | false |
| cbd_mg_per_unit | The CBD mg per unit for this test result | string | false |
| cbd_percentage | The CBD percentage for this test result | string | false |
| coa_url | Public URL to view/download this test result's Certificate of Analysis (COA), or null when no file is attached | string | false |
| id | Unique ID for this test result | string | false |
| is_primary | True if this is the primary test result for the product | boolean | false |
| lab_license_number | The license number for the lab that performed this test | string | false |
| lab_name | The name of the lab that performed this test | string | false |
| mg_per_unit_type | The unit type for the mg per unit fields | string | false |
| name | The name of the test result | string | false |
| package_id | The ID of the package this test result belongs to, or null | string | false |
| release_date | The release date for this test result | string | false |
| thc_mg_per_unit | The THC mg per unit for this test result | string | false |
| thc_percentage | The THC percentage for this test result | string | false |
| total_cbd_mg_per_unit | The total CBD mg per unit for this test result | string | false |
| total_cbd_percentage | The total CBD percentage for this test result | string | false |
| total_thc_mg_per_unit | The total THC mg per unit for this test result | string | false |
| total_thc_percentage | The total THC percentage for this test result | string | false |
| updated_datetime | The datetime this test result was updated at | string | false |
TestResults
A collection of Test Results
| Property | Description | Type | Required |
|---|---|---|---|
| data | Test Results | array(TestResult) | false |
| next_page | URL for the next page of results; null when there is no next page | string | false |
UnitType
A unit type as shown in Distru
{
"name": "Gram"
}
| Property | Description | Type | Required |
|---|---|---|---|
| id | Unique ID for this unit type | string | false |
| name | Human readable name for this unit type | string | false |
UnitTypeFull
A unit type
| Property | Description | Type | Required |
|---|---|---|---|
| active | Whether the unit type is active | boolean | false |
| category | The category of the unit type | string | false |
| id | Unique ID for this unit type | string | false |
| inserted_datetime | When the unit type was created (UTC ISO-8601) | string | false |
| locked | Whether the unit type is locked | boolean | false |
| name | The name of the unit type | string | false |
| qty_per_si_unit | The number of this unit that make up one SI base unit of its category. For weight-based unit types the SI base unit is the kilogram (e.g. a Gram is 1000, a Pound is ~2.20462). For volume-based unit types the SI base unit is the liter (e.g. a Milliliter is 1000, a Gallon is ~0.264172). For count-based (discrete/each) unit types it is 1, since a count unit has no physical measure. | string | false |
| updated_datetime | When the unit type was last updated (UTC ISO-8601) | string | false |
UnitTypes
A collection of unit types
| Property | Description | Type | Required |
|---|---|---|---|
| data | Unit Types | array(UnitTypeFull) | false |
| next_page | URL for the next page of results; null when there is no next page | string | false |
UpsertCredit
Parameters for creating or updating a credit
{
"amount": 100.0,
"company_id": "00000000-0000-0000-0000-00000000000a",
"external_note": "External note",
"internal_note": "Internal note"
}
| Property | Description | Type | Required |
|---|---|---|---|
| amount | The credit amount. Must be greater than 0. Required when creating. | number | false |
| company_id | ID of the customer (company) this credit applies to. Required when creating; cannot be changed on update. | string | false |
| external_note | A note on this credit, visible to the customer | string | false |
| id | ID of the credit to update. Omit to create a new credit. | string | false |
| internal_note | An internal note on this credit | string | false |
| owner_id | ID of the user who owns this credit. Defaults to the API user when creating. | string | false |
| quickbooks_sales_item_id | Optional QuickBooks sales item this credit maps to, used only when QuickBooks credit sync is enabled. Omit or send null to use the default "Distru Sales" item. Never required. | string | false |
UpsertProductPosMapping
Parameters for creating or updating a POS mapping
{
"blaze_product_id": "blaze_123",
"blaze_retailer_id": "456e7890-e89b-12d3-a456-426614174000",
"product_id": "123e4567-e89b-12d3-a456-426614174000"
}
| Property | Description | Type | Required |
|---|---|---|---|
| blaze_product_id | Blaze product ID | string | false |
| blaze_retailer_id | Blaze retailer ID | string | false |
| dutchie_product_id | Dutchie product ID | integer | false |
| dutchie_retailer_id | Dutchie retailer ID | string | false |
| product_id | Distru product ID | string | true |
| treez_product_id | Treez product ID | string | false |
| treez_retailer_id | Treez retailer ID | string | false |
User
Information about a user in Distru
{
"banned": false,
"email": "jeanb@zorgindustries.com",
"full_name": "Jean-Baptiste Emanuel Zorg",
"id": "12345",
"role": {
"id": "3",
"name": "Admin"
}
}
| Property | Description | Type | Required |
|---|---|---|---|
| banned | Is this user banned by Distru? | boolean | false |
| deleted_at | The datetime of deletion if the user was deleted | string | false |
| The email address of this user | string | false | |
| full_name | The full name of this user | string | false |
| id | Unique ID for this user | string | false |
| role | A user role as shown in Distru | Role | false |
Users
A collection of Users
| Property | Description | Type | Required |
|---|---|---|---|
| data | Users | array(User) | false |
| next_page | URL for the next page of results; null when there is no next page | string | false |
Vehicle
A vehicle
| Property | Description | Type | Required |
|---|---|---|---|
| color | The color of the vehicle | string | false |
| description | A description or name for the vehicle | string | false |
| id | Unique ID for this vehicle | string | false |
| inserted_datetime | When the vehicle was created (UTC ISO-8601) | string | false |
| license_plate_number | The license plate number | string | false |
| license_plate_state | The license plate state | string | false |
| make | The make of the vehicle | string | false |
| model | The model of the vehicle | string | false |
| updated_datetime | When the vehicle was last updated (UTC ISO-8601) | string | false |
| vin | The vehicle identification number (VIN) | string | false |
| year | The year of the vehicle | string | false |
Vehicles
A collection of vehicles
| Property | Description | Type | Required |
|---|---|---|---|
| data | Vehicles | array(Vehicle) | false |
| next_page | URL for the next page of results; null when there is no next page | string | false |
Changelog
2026-08-13
- Added GET
/public/v1/taxesendpoint. - Added GET
/public/v1/unit-typesendpoint. - Added GET
/public/v1/official-product-categoriesendpoint. - Added GET/POST/DELETE
/public/v1/product-groupsendpoints. - Added GET/POST/DELETE
/public/v1/product-categoriesendpoints. - Added GET/POST/DELETE
/public/v1/product-subcategoriesendpoints. - Added GET/POST/DELETE
/public/v1/company-groupsendpoints. - Added GET/POST/DELETE
/public/v1/tagsendpoints. - Added GET/POST/DELETE
/public/v1/cost-typesendpoints. - Added GET/POST/DELETE
/public/v1/driversendpoints. - Added GET
/public/v1/creditsendpoint. - Added GET
/public/v1/credits/:idendpoint. - Added POST
/public/v1/creditsendpoint. - Added DELETE
/public/v1/credits/:idendpoint. - Added POST
/public/v1/credits/:id/cancelendpoint. - Added
credit_usesandoverpayment_creditsto the payment object returned by GET/public/v1/paymentsand GET/public/v1/payments/:id. - Added
paymentsto the response of GET/public/v1/purchases, GET/public/v1/purchases/:id, GET/public/v1/invoicesand GET/public/v1/invoices/:id. Each element is the full payment object also returned by GET/public/v1/payments. - On GET
/public/v1/creditsand GET/public/v1/credits/:id, a credit'spayment(the originating invoice payment for overpayment or QuickBooks-linked credits) and eachcredit_usesentry'spaymentare that same full payment object.
2026-08-12
- Added GET
/public/v1/payment-termsendpoint. - Added
default_payment_termto the response of GET/public/v1/companiesand GET/public/v1/companies/:id. - Added
default_payment_term_idto POST/public/v1/companiesfor setting a company relationship's default payment term. - Added
outstanding_balanceto the response of GET/public/v1/companiesand GET/public/v1/companies/:id. - Added 9 PDF download endpoints:
- GET
/public/v1/invoices/:id/pdf— invoice PDF. - GET
/public/v1/invoices/:id/test-results/pdf— combined COA PDF for the invoice. - GET
/public/v1/orders/:id/pdf— sales order slip PDF. - GET
/public/v1/orders/:id/test-results/pdf— combined COA PDF for the order. - GET
/public/v1/purchases/:id/pdf— purchase order PDF. - GET
/public/v1/assemblies/:id/pdf— work order PDF. - GET
/public/v1/test-results/:id/pdf— single test result COA PDF. - GET
/public/v1/batches/:id/primary-test-result/pdf— batch primary test result COA PDF. - GET
/public/v1/packages/:id/primary-test-result/pdf— package primary test result COA PDF.
- GET
- Added
coa_urlto test result objects: a public, non-expiring URL to view or download the test result's COA PDF, ornullwhen no file is attached. Included in GET/public/v1/test-resultsand GET/public/v1/test-results/:id, and in the nestedprimary_test_resultobject of GET/public/v1/batchesand GET/public/v1/packages.
2026-08-03
- Added GET
/public/v1/paymentsand GET/public/v1/payments/:idendpoints. - Renamed
inserted_at→inserted_datetimeandupdated_at→updated_datetime:- GET
/public/v1/returns. - GET
/public/v1/returns/:id. - GET
/public/v1/adjustments. - GET
/public/v1/adjustments/:id. - GET
/public/v1/product-pos-mappings. - GET
/public/v1/product-pos-mappings/:id.
- GET
2026-07-30
- Added
upsert_invoice,email_invoiceandemail_invoice_addressesto POST/public/v1/orders.
2026-07-29
Read/write parity pass across the API — every field that can be set can now be read back, and related resources (owner, locations, notes, custom data, tags) are exposed consistently.
- Added
owner(a full user object) to the response of the following endpoints:- GET
/public/v1/productsand/public/v1/products/:id - GET
/public/v1/purchasesand/public/v1/purchases/:id - GET
/public/v1/companiesand/public/v1/companies/:id - GET
/public/v1/contactsand/public/v1/contacts/:id(previously only the owner's id was returned)
- GET
- Added
billing_locationto the response of POST/public/v1/invoices, GET/public/v1/invoicesand GET/public/v1/invoices/:id. - Added
billing_locationandlocationto the response of POST/public/v1/purchases, GET/public/v1/purchasesand GET/public/v1/purchases/:id. - Added
external_notesandinternal_notesto the response of POST/public/v1/invoices, GET/public/v1/invoicesand GET/public/v1/invoices/:id. - Added
descriptionto the response of GET/public/v1/purchasesand GET/public/v1/purchases/:id. - Added
blaze_payment_typeto the response of GET/public/v1/ordersand GET/public/v1/orders/:id. - Added the following fields to the response of GET
/public/v1/productsand GET/public/v1/products/:id:upcis_featuredwholesale_unit_pricequantity_available_threshold_minquantity_available_threshold_maxtotal_thctotal_cbdtotal_cannabinoid_unittags
- Added
unit_costto the response of GET/public/v1/adjustmentsand GET/public/v1/adjustments/:id. - Added
quickbooks_deposit_account_nameto the response of POST/public/v1/invoices/:id/paymentsand POST/public/v1/purchases/:id/payments. - Added
owner_id,custom_data,external_notesandinternal_notesto POST/public/v1/invoices. - Added
owner_idandcustom_datato POST/public/v1/purchases. - Added
nameandcustom_datato POST/public/v1/batches. - Added
bill_of_materialsto the response of GET/public/v1/products/:id(always included) and GET/public/v1/products(included when theinclude_bill_of_materials=truequery param is set).cost_type.cost_per_unitis only returned to callers with thecosts_permissions_view_cost_types_cost_per_unitpermission. - POST
/public/v1/orders:due_datetimeis now optional. When omitted, the due date is derived from the customer's default payment term, then the company default order payment term, then falls back to the order date (COD).
2026-07-27
- Added GET
/public/v1/reports/sales-order-taxendpoint. - Added GET
/public/v1/reports/inventory-assetsendpoint. - Added GET
/public/v1/reports/sales-order-historyendpoint. - Added GET
/public/v1/reports/sales-order-item-historyendpoint. - Added GET
/public/v1/reports/sales-by-companyendpoint. - Added GET
/public/v1/reports/sales-by-productendpoint. - Added GET
/public/v1/reports/sales-by-userendpoint. - Added GET
/public/v1/reports/order-fulfillmentendpoint. - Added GET
/public/v1/reports/purchase-order-historyendpoint. - Added GET
/public/v1/reports/purchases-by-companyendpoint. - Added GET
/public/v1/reports/purchases-by-productendpoint. - Added GET
/public/v1/reports/invoice-historyendpoint. - Added GET
/public/v1/reports/cogsendpoint. - Added GET
/public/v1/reports/inventory-valuationendpoint. - Added GET
/public/v1/reports/inventory-transaction-historyendpoint. - Added GET
/public/v1/reports/harvest-outputsendpoint. - Added GET
/public/v1/reports/plant-lifecycleendpoint. - Added GET
/public/v1/reports/cultivation-transaction-historyendpoint.
2026-06-29
- Added
gross_weightandgross_weight_unit_typefields to GET and POST/public/v1/products.
2026-06-23
- Added
quickbooks_sync_enqueuedfield to the response of POST/public/v1/invoices/{id}/payments.
2026-06-08
- Added GET/POST
/public/v1/custom-fieldsendpoint - Added GET/POST
/public/v1/vehiclesendpoint - Added GET/POST
/public/v1/strains/:idendpoint - Added
license_numberandinventory_sourceto order responses - Added
custom_datato POST/public/v1/ordersendpoint
2026-05-28
- Added ability to fetch by /id on most endpoints
2026-05-25
- Added GET
/public/v1/returnsendpoint
2026-05-17
- Added
company_idfilter parameter to GET/public/v1/ordersendpoint - Added GET
/public/v1/menusendpoint
2026-05-11
- Added
lab_testing_statefield to GET/public/v1/packagesendpoint - Added support for non-admin users to use the API.
- Added permission checks to most controllers.
2026-05-06
- Added
menu_idandmenu_namefilter parameters to GET/public/v1/productsendpoint
2026-05-01
- Added
custom_datafield to POST/public/v1/productsendpoint
2026-03-27
- Removed
POST /public/v1/products/{id}/imagesendpoint
2026-03-10
- Added
POST /public/v1/products/{id}/imagesendpoint - Added
POST /public/v1/companiesendpoint
2026-02-13
- Added
batch_ids[]query parameter to GET/public/v1/batchesendpoint to filter batches by batch IDs.
2026-02-12
- Added the
completion_datetimeas a query parameter to GETpublic/v1/adjustments - Added the
inserted_atfield topublic/v1/adjustments
2026-02-10
- Added the
payment_terms_namefield to GETpublic/v1/orders
2026-01-23
- Added the
deleted_atfield and thedeletedfilter parameter to the following endpoints:- GET
public/v1/batches(breaking change: deleted batches are no longer returned by default) - GET
public/v1/companies - GET
public/v1/contacts - GET
public/v1/locations - GET
public/v1/payment_methods - GET
public/v1/products(breaking change: deleted products are no longer returned by default) - GET
public/v1/users
- GET
- Added
estimated_departure_datetimeandestimate_arrival_datetimetometrc_transfer_template_transporter_infofield in POSTpublic/v1/orders.- Added automatic estimated departure / arrival calculations for transporters such that, if left blank, the fields will be populated with the first departure estimate being the time that the template was sent to Metrc, the drive time for each transporter being 1 hour, and the departure of the next transporter being the arrival time of the previous transporter.
- Modified Destination estimated departure / arrival times to be the first departure and the last arrival of the specified transporters.
2026-01-21
- Added the
manufactured_datetimefield to GETpublic/v1/batchesand POSTpublic/v1/batches. - Added the
assembly_numberandestimated_start_datefields to GETpublic/v1/assemblies. - Added the
reservedfield to GETpublic/v1/inventory.
2026-01-19
Added the following endpoints:
- POST
public/v1/contacts - POST
public/v1/custom-fields
- POST
Added the following fields to
public/v1/adjustmentscompliance_unit_typeunit_type
Added the
batch_idsandlocation_idsfilter parameters to GETpublic/v1/inventory.Added the
product_idandbatch_numberfilter parameters to GETpublic/v1/batches.Added the
product_namefilter parameter to GETpublic/v1/products.Added the
product_idsfilter parameter to GETpublic/v1/packages.
2025-10-24
Added the following fields to
public/v1/productsunit_net_weight_serving_size_unit_typeunit_net_weightunit_serving_size
2025-10-19
- Added
unit_costto the endpoint GETpublic/v1/products
2025-10-15
Added the following fields to
public/v1/inventorytotal_cost_actualtotal_cost_defaultcost_per_unit_actualcost_per_unit_default
2025-09-10
Added
cost_per_unit_actualandcost_per_unit_defaultto the following endpoints:- GET
public/v1/assemblies - GET
public/v1/orders - GET
public/v1/orders/:id - GET
public/v1/invoices - GET
public/v1/invoices/:id - GET
public/v1/batches - GET
public/v1/packages
- GET
Added fields
total_cost_actual,total_cost_defaultand attributeinclude_coststo the following endpoints:- GET
public/v1/batches - GET
public/v1/packages
- GET
2025-08-21
- Added
groupto GET/public/v1/companies
2025-08-20
- Added GET
/public/v1/product-pos-mappingsendpoint - Added POST
/public/v1/product-pos-mappingsendpoint - Added DELETE
/public/v1/product-pos-mappings/:idendpoint
2025-08-19
- All GET endpoints now return eventually consistent data, with changes taking up to 1 second to propagate in responses
2025-07-01
- Added
description_markdownto GET/POST/public/v1/products
2025-06-12
- Added
metrc_transfer_idandbiotrack_idto GET/public/v1/orders
2025-06-12
- Changed
coston GET/public/v1/assembliestototal_cost_actualiningredients - Added
total_cost_defaultto GET/public/v1/assembliesiningredients - Added
total_cost_actualto GET/public/v1/assembliesinadditional_costs - Added
total_cost_defaultto GET/public/v1/assembliesinadditional_costs
2025-06-09
- Added POST
/public/v1/file-attachmentsendpoint for uploading files and attaching them to business entities (products, orders, purchases, etc.).
2025-05-27
- Added
biotrack_idandmetrc_transfer_idto POST/public/v1/orders
2025-05-22
- Added
external_nameto GET/POST/public/v1/products
2025-05-18
- Added
leaflink_order_numberto GET/public/v1/orders
2025-05-16
- Added GET
/public/v1/test-results - Added POST
/public/v1/test-results
2025-05-15
- Added POST
/public/v1/stock_adjustmentsendpoint.
2025-05-14
- Added
custom_datato the response of the following endpoints:- GET
/public/v1/assemblies - GET
/public/v1/batches - POST
/public/v1/batches - GET
/public/v1/companies - GET
/public/v1/contacts - GET
/public/v1/invoices - GET
/public/v1/invoices/:id - POST
/public/v1/invoices - GET
/public/v1/orders - GET
/public/v1/orders/:id - POST
/public/v1/orders - GET
/public/v1/packages - GET
/public/v1/products - POST
/public/v1/products - GET
/public/v1/purchases - POST
/public/v1/purchases
- GET
2025-05-13
- Added GET
/public/v1/adjustmentsendpoint.
2025-05-06
- Added
is_trade_sampleto GET/public/v1/packagesendpoint.
2025-04-09
- Added the following fields to GET
/public/v1/companiesendpoint:legal_business_namedefault_emailphone_numberinvoice_emailsales_order_emailpurchase_order_emailorder_shipment_emailwebsitedefault_sales_order_notesdefault_purchase_order_notesoutstanding_balance_thresholdowner_id
2025-03-18
- Modified
unit_net_weightandunit_serving_sizein GET/public/v1/productsendpoint: These fields can now be populated regardless of the product's unit type.
2025-03-11
- Added
total_cost_actual,total_cost_defaultandreturned_quantityto "items" in GET/public/v1/invoicesendpoint. - Added
total_cost_actual,total_cost_defaultandreturned_quantityto "items" in GET/public/v1/invoices/:idendpoint. - Added
total_cost_actual,total_cost_defaultandreturned_quantityto "items" in GET/public/v1/ordersendpoint. - Added
total_cost_actual,total_cost_defaultandreturned_quantityto "items" in GET/public/v1/orders/:idendpoint.
2025-03-05
- Added GET
/public/v1/assembliesendpoint.
2025-02-26
- Page size change from 50,000 to 5000 for the following endpoints:
- GET
/public/v1/batches - GET
/public/v1/companies - GET
/public/v1/contacts - GET
/public/v1/inventory - GET
/public/v1/packages - GET
/public/v1/products - GET
/public/v1/purchases
- GET
2025-01-31
- Added POST
/public/v1/batchesendpoint. - Added batch_number, product_id, owner_id and description to GET
/public/v1/batchesendpoint. - Added title and phone_number to GET
/public/v1/contactsendpoint.
2025-01-17
- Added
product_unit_quantityto GET/public/v1/packagesendpoint. - Added
product_unit_typeto GET/public/v1/packagesendpoint.
2025-01-15
- Added POST
/public/v1/purchases/:id/paymentsendpoint. - Added POST
/public/v1/invoices/:id/paymentsendpoint.
2025-01-08
- Added GET
/public/v1/payment-methodsendpoint.
2024-12-26
- Added msrp, is_active, category.type and images.rank to GET
/public/v1/products.
2024-12-24
- Added billing_location_id to POST
/public/v1/purchasesendpoint.
2024-11-06
- Field thc of type string in the Product object was replaced with total_thc field of type number.
- Field cbd of type string in the Product object was replaced with total_cbd field of type number.
- Added total_cannabinoid_unit field to Product object. Allowed values are either "MG" or "PERCENT".
2024-10-02
- Added GET
/public/v1/strainsendpoint. - In endpoint GET /public/v1/companies, added fields category and relationship to the response.