Changelog
Dated changes to the Distru public API, newest first.
2026-11-09
- The API docs moved to docs.distru.com, which also has the MCP docs. Old links redirect, including
openapi.json,llms.txt,llms-full.txtandSKILL.md. Replace saved copies ofSKILL.md, and update any URLs you hard-coded.
2026-11-05
- Locations now carry
company, the company they belong to as GET/public/v1/companiesreturns it (your own company for your own locations, null if your team can't see it), on GET/public/v1/locations, a company'slocations, an order'sshipping_locationandbilling_location, and a purchase'ssupplier_location. A location'scompany_id, which no endpoint takes, is deprecated: it is still returned but no longer documented. - An order's
buyer_companyand the GET/public/v1/ordersbuyer_company_idsfilter are deprecated: both still work but are no longer documented. - Fields named for a "company relationship" are renamed to "company". Report filters:
company_relationship_idsis nowcompany_ids(invoice history, order fulfillment, purchase order history, sales order history, sales order item history, sales order tax) andcompany_relationship_group_idsis nowcompany_group_ids(purchases by company, sales by company, sales order history, sales order item history, sales order tax). GET/public/v1/price-tiers: thecompany_relationship_idfilter is nowcompany_id. POST/public/v1/price-tiers: the conditionsone_of_company_relationship_group_idsandnot_one_of_company_relationship_group_idsare nowone_of_company_group_idsandnot_one_of_company_group_ids, and price tier responses return them asone_of_company_groupsandnot_one_of_company_groups. File attachments:company_relationship_idis nowcompany_idon upload and in the response. The inventory transaction history report adds acompany_idcolumn. The old names keep working.
2026-10-30
- New GET
/public/v1/reports/inventory-velocityreturns, for each product sold in the last 365 days, its sales over six windows, a daily demand rate and days of supply, and, givenlead_time_days, a reorder point, reorder date, reorder status and suggested order quantity. It needs thereports_permissions_inventory_velocitypermission, and returns 403 until the report is turned on for your company.
2026-10-28
- GET
/public/v1/packagesand GET/public/v1/assemblies:updated_datetimenow also moves when a package's actual cost changes (total_cost_actualandcost_per_unit_actualwithinclude_costs=true), or the actual cost of an assembly's inputs or outputs (total_cost_actualandcost_per_unit). For example, when the price of the purchase the inventory came from is edited, or a cost is added to it or to an input it was made from. Each such change also sends aPACKAGEorASSEMBLYupdate webhook. Default costs (total_cost_default,cost_per_unit_default), which follow cost type and product default costs, still change without moving it.
2026-10-22
- POST
/public/v1/purchases: the update that finishes a draft now adds the charge presets that auto-apply to its items and aren't on it yet, as a create does for the items sent with it. Leaving such a preset out of that update, even withcharges: [], doesn't remove it. That update may now also move the draft's line items to a newlocation_id, instead of needing an earlier update.
2026-10-21
- Purchases can now be drafts. POST
/public/v1/purchasesacceptsstatusDRAFT on create, with the supplier, locations, dates and items optional, and updating a draft to any other status finishes it. GET/public/v1/purchasesreturns drafts only whenstatusesincludes DRAFT; withoutstatusesit returns the same purchases as before. - Two changes reach existing integrations: GET
/public/v1/purchases/{id}now returns a draft instead of a 404, andPURCHASEwebhook events and workflow triggers for a draft now carry the draft instead of a nullobject(recordin workflows). Both show the newstatusvalue DRAFT, and a draft may have no supplier, locations, dates or line items.
2026-10-18
- POST
/public/v1/ordersnow rejects with a 400 an update that sends a tier-discounted line'spriceback as itsprice_basewhile keeping the line's tier lock. Saving it would apply the discount again on every round trip. Send back theprice_baseyou read, or omit it.
2026-10-16
- GET
/public/v1/deleted-recordsnow lists the deletions of every type with its own list or get-by-id endpoint (the Metrc lists, which mirror Metrc, aside), with a newrecord_typevalue for each, including deletions caused by deleting something else, such as an invoice's payments or a product's batches. A record restored after its deletion leaves the list and comes back on its list endpoint with a newupdated_datetime. Deletions from before this change are not listed. The list endpoints' filters are unchanged; a synced copy no longer needsdeleted=includeon any list that has it, payment methods included.
2026-10-15
- New GET
/public/v1/deleted-recordslists the orders, invoices, packages and assemblies deleted from your company in the last 90 days, onerecord_typeper request, oldest first, with adeleted_datetimefilter. Use it withupdated_datetimeon the list endpoints to keep a synced copy free of deleted records. updated_datetimeon orders, invoices, packages and assemblies now also moves when their nested data changes: line items and charges, the invoices and returns shown on an order, the order line details shown on an invoice, an invoice's payments and credits, a package's bins, primary test result and owner, an assembly's inputs, outputs, costs and bins. Each such change also sends an update webhook for the record.- Every paginated list endpoint with an
updated_datetimefilter is rate limited (full list): one budget of 3,000 calls per account across all of them, refilling at 5 per minute, withX-RateLimit-*headers on their responses. Calls with anupdated_datetimelower bound within the last 30 days are free. Incremental Sync sets out how to keep a copy of your data in sync.
2026-10-13
- GET
/public/v1/companiesand GET/public/v1/companies/{id}now returnpast_due_balance: the unpaid amount of invoices on delivered or completed orders whose due date has passed, minus unused credit, never below 0 or aboveoutstanding_balance. Likeoutstanding_balance, it changes without updatingupdated_datetime.outstanding_balance_thresholdwill apply to eitheroutstanding_balanceorpast_due_balance, depending on a new account setting the API doesn't expose. COMPANY_RELATIONSHIPwebhook subscribers now also get an event when a company'spast_due_balancechanges because an invoice passed its due date, with no user action (about 900 a day across all accounts).- GET
/public/v1/product-pos-mappingsnow returnsnext_page: null, since it returns every match in one response; the oldnext_pageURL returned a 400, or the same set again. It also now returns eventually consistent data: a write can take up to 1 second to show. - GET
/public/v1/adjustments, GET/public/v1/adjustments/{id}and POST/public/v1/adjustments: for a package adjustment whose product and package use different unit types,quantityis now the change in the product's unit type, as documented, rounded to 9 decimal places. It was converted in the wrong direction before. - Users now return
updated_datetime, also where nested (owner,creator, ...). Renaming or deleting a role now updates theupdated_datetimeof its users.
2026-10-12
- List endpoints that page with
next_pagecursors no longer acceptpage[number]past the first page: a request for page 2 or later by number returns a 400 pointing atpage[number]. Follow thenext_pageURL in each response instead. Integrations that were already paging by number have been contacted and keep working until 2026-11-12. - GET
/public/v1/custom-fieldsnow returns fields sorted byid, oldest first. The order was not fixed before.
2026-10-07
- POST
/public/v1/purchases/{id}/payments: when the company is connected to QuickBooks Online and the request sends neitherquickbooks_deposit_account_idnorquickbooks_deposit_account_name, the payment now uses the company's Purchase Deposit Account instead of being rejected.quickbooks_deposit_account_namenow accepts an account's full name (Parent:Child), skips inactive accounts and accounts of another type, and rejects a short name shared by several "Bank" or "Credit Card" accounts instead of picking the first. A purchase the API key's user cannot view under their team restrictions now returns 404. - POST
/public/v1/payments/{id}/void: a PURCHASE payment on a purchase the API key's user cannot view under their team restrictions now returns 404, and voiding a PURCHASE payment now updates itsupdated_datetime. - Credits now return a
brand(a company), for reconciling credits by brand. Credits created from a return or an invoice overpayment start with the brand their products share, and existing ones were filled in the same way. POST/public/v1/creditsacceptsbrand_idon any credit, including automatically-created ones, and GET/public/v1/creditsfilters bybrand_idsandinclude_no_brand. An update that changes onlyowner_idand/orbrand_idno longer syncs with QuickBooks Online. - GET
/public/v1/productsand GET/public/v1/products/{id}:imagesis now in display order (byrank, lowest first, then by id) instead of by id, so the first image is the product's primary image. - New POST
/public/v1/product-imagesuploads an image file (multipart) into a product's image slot, and DELETE/public/v1/product-images/{id}removes one. Both update the product'supdated_datetime. - Sales order items:
price_tier_version.is_liveis now false when the tier was deleted, not only when it was edited. - GET
/public/v1/reports/sales-order-item-historyrows now carry each line'sprice_baseand the price tier that priced it (price_tier_mode,price_tier_id,price_tier_name,price_tier_version_id,price_tier_version_is_live,price_tier_pricing_type,price_tier_price,price_tier_percent), deleted tiers included. The CSV export is unchanged. - POST
/public/v1/price-tiersnow rejects avalid_until_datetimethat isn't aftervalid_from_datetimewith a 400, since such a tier never applies.
2026-10-06
- New POST
/public/v1/products/{id}/bill-of-materialscreates or updates a product's bill of materials (sparse;product_inputs,dynamic_inputsandcostsreplace their list when sent, and an entry with a storedidpatches that row), and DELETE/public/v1/products/{id}/bill-of-materialsremoves it.
2026-10-05
- GET
/public/v1/inventorynow uses cursor pagination like the other list endpoints:next_pageURLs carry an opaquepage[after]cursor instead ofpage[number].page[number]is still accepted for backward compatibility. A cursor is only valid with thegroupingsit was issued for.
2026-09-30
- Report endpoints (
/public/v1/reports/*) now return the IDs of the records each row names, as new*_idfields. The reports' CSV exports are unchanged.
2026-09-28
- The COA PDF endpoints (invoice, order, batch, package and test result) now return the message
This <entity> has no lab results attachedinstead ofNot Foundwhen no lab results are attached, so the 404 can be told apart from an unknown ID. The status is still 404. - On every PDF endpoint, an invalid
formatoremail_addressesis now rejected with a 400 before the record is looked up, so such a request gets the 400 even when the ID is unknown (previously 404) or not permitted (previously 403). - On every PDF endpoint,
email_addressesentries are now cleaned up before sending: an entry may hold several comma-separated addresses, spaces, blank entries and repeats are dropped, andemailed_tolists the addresses actually emailed. The 200-address limit applies to that list. - The PDF endpoints now return 404 instead of 403 for an order, invoice, batch or package the API key's user cannot see under their team restrictions, and the batch COA endpoint returns 404 for a deleted batch.
- With
formatemail, the PDF endpoints now require the web app's permission to email that document (e.g.invoices_permissions_emailfor invoices,orders_permissions_email_order_slipfor order slips) instead of the download permission, and return 403 without it. Documents the web app cannot email (assembly work orders and the batch, package and test result COAs) keep the download permission. - GET
/public/v1/reports/inventory-assetswithstyle=granularnow returns a 400 when the report has more than 100,000 cost inputs, instead of trying to build it. Narrow it withlocation_id, or usestyle=collapsed. - GET
/public/v1/payments: voiding an INVOICE payment now updates itsupdated_datetime, so anupdated_datetimewindow picks up the void. Thepayment_numberfilter now matches%and_literally instead of as wildcards. - POST
/public/v1/invoices/{id}/payments: when the company is connected to QuickBooks Online and the request sends neitherquickbooks_deposit_account_idnorquickbooks_deposit_account_name, the payment now uses the company's Sales Deposit Account instead of being rejected.quickbooks_deposit_account_namenow accepts an account's full name (Parent:Child), and rejects a short name shared by several deposit accounts instead of picking one (a top-level account's name is its full name, so it is still accepted). GET/public/v1/payments/{id}returns an INVOICE payment'squickbooks_deposit_account_nameas that full name, so it can be sent back as is.
2026-09-26
- GET
/public/v1/metrc/transfersacceptssearch_license_number(shipper or recipient license number, case-insensitive substring) andimport_status(IMPORTED,IGNORED,UNIMPORTED). - Metrc transfers now return
import_statusandpackage_count. - Deliveries of incoming Metrc transfers sent by a third party now return their recipient and dates instead of nulls.
- POST
/public/v1/batchesno longer appliesname; Distru assigns batch names itself. Send your own batch identifier asbatch_number, where existing custom names have been moved.
2026-09-21
- Price tiers can now be scoped by product tag. POST
/public/v1/price-tiersacceptsconditions.one_of_product_tag_idsandconditions.not_one_of_product_tag_ids, and the tier response renders them asconditions.one_of_product_tags/conditions.not_one_of_product_tags. An item matches an include condition when its product carries at least one of the listed tags, and an exclude condition when it carries none (a product with no tags matches the exclude but never the include).
2026-09-16
- Page size reduced for the following endpoints:
- GET
/public/v1/adjustments - GET
/public/v1/assemblies - GET
/public/v1/batches - GET
/public/v1/companies - GET
/public/v1/credits - GET
/public/v1/invoices - GET
/public/v1/metrc/tags - GET
/public/v1/orders - GET
/public/v1/packages - GET
/public/v1/products - GET
/public/v1/returns - GET
/public/v1/strains - GET
/public/v1/test-results
- GET
- Page size is not client-controllable. Follow the
next_pageURL in each response rather than assuming a fixed number of rows per page. - Pagination is documented as one pattern: request a list endpoint with no page parameter,
then follow
next_pageuntil it is null. GET/public/v1/inventoryno longer documents a page selector; requests that still send one are unaffected.
2026-09-14
- The
statusfield is now required when creating a purchase via POST/public/v1/purchases; a create request without it is rejected with a 400. It previously defaulted to PENDING when omitted. Updates are unchanged: omitstatusto leave it as is. This change was announced with four weeks of notice.
2026-09-09
- Price tier
percent(request and response, including thePriceTierVersionsnapshot) is now a decimal string with up to 3 decimal places instead of an integer. Price tierpricenow supports up to 5 decimal places instead of 2.
2026-09-05
- Added POST
/public/v1/packages/importto import Metrc packages.
2026-09-04
- Added Package webhooks: a
PACKAGEwebhook fires when a package is created, edited, or deleted, and when its bins or lab test results change. - Product webhooks now fire when a product's company-wide active or reserved quantity changes, with the before/after totals in
changes(quantity_active,quantity_reserved,quantity_available). - The
GET /public/v1/metrc/...endpoints accept alicense_numberquery param as a convenience alternative tolicense_id. - Added GET
/public/v1/metrc/strainslisting the Metrc strains cached from your licenses. - Added GET
/public/v1/metrc/locationslisting the Metrc locations cached from your licenses. - Added GET
/public/v1/metrc/packagesand GET/public/v1/metrc/packages/{label}listing the Metrc packages cached from your licenses. - Added GET
/public/v1/metrc/transfersand GET/public/v1/metrc/transfers/{manifest_number}listing the Metrc transfers cached from your licenses.
2026-09-03
- Added POST
/public/v1/companies/{id}/locationsto create and update the locations of the companies in your CRM. - Added POST
/public/v1/locationsto create and update your own company's locations. - Added POST
/public/v1/assemblies/create_test_sampleto create and complete a test sample assembly from a Metrc package in one call. - Added GET
/public/v1/metrc/lab-test-batcheslisting a license's lab test batches grouped by Metrc item category, with the ones Metrc requires flagged.
2026-09-02
- Added GET
/public/v1/charge-presetsand GET/public/v1/charge-presets/{id}. - Added POST
/public/v1/charge-presetsto create and update charge presets. - Added DELETE
/public/v1/charge-presets/{id}. - Charges on orders, invoices, and purchases now carry a
charge_presetfield referencing the preset they were applied from. - Charges sent to POST
/public/v1/ordersand POST/public/v1/purchasesaccept acharge_preset_id: the charge's name, type, and amounts are filled from the preset (with inline edits when the preset allows them), and the link is fixed once the charge exists. See thechargesfield on each endpoint. - Creating an order or purchase now auto-applies charge presets whose auto-apply tags match the products, exactly like the Distru order forms.
- Added GET
/public/v1/licensesand GET/public/v1/licenses/{id}returning your company's licenses with their Metrc sync health. - Added POST
/public/v1/companies/{id}/licensesto create and update the licenses of the companies in your CRM. - Added GET
/public/v1/license-typeslisting the license type values valid for your company's US state.
2026-09-01
- Webhook payloads now carry three new top-level fields:
event(CREATE,UPDATE, orDELETE),changes(the edited top-level fields withbefore/aftervalues on updates; empty on creates, deletes, and nested-record-only updates), andoccurred_datetime(when the change was recorded). See the Webhooks section for details. - Webhooks about the same record are now always delivered in the order the changes happened.
2026-08-27
- PDF endpoints now accept
format=binaryto get the raw PDF in the response body, alongsideurlandemail.formatis now documented as required; omitting it still defaults tobinaryfor backward compatibility.
2026-08-26
- Added GET
/public/v1/tasksand GET/public/v1/tasks/{id}. - Added POST
/public/v1/tasksto create and update tasks. - Added DELETE
/public/v1/tasks/{id}. - Added a
tasksfield to the order, invoice, purchase, contact, product, batch, assembly, return, and company models listing the tasks linked to each. - All PDF download endpoints now accept
format=emailtogether with anemail_addresseslist to email the PDF to one or more recipients instead of downloading it.
2026-08-25
- Added DELETE
/public/v1/strains/{id}. - Added DELETE
/public/v1/vehicles/{id}. - Added DELETE
/public/v1/contacts/{id}. - Added DELETE
/public/v1/custom-fields/{id}. - Added DELETE
/public/v1/companies/{id}. - Added DELETE
/public/v1/products/{id}. - Added DELETE
/public/v1/batches/{id}. - Added DELETE
/public/v1/test-results/{id}. - Added DELETE
/public/v1/purchases/{id}. - Added DELETE
/public/v1/orders/{id}. - Added DELETE
/public/v1/invoices/{id}. - Added DELETE
/public/v1/assemblies/{id}. - POST
/public/v1/packages/{id}now acceptsis_inactiveto inactivate or reactivate a package. - Ability to get and set price tiers on sales order items.
2026-08-24
- Added a
statusfilter to GET/public/v1/assemblies.
New endpoints:
- Added POST
/public/v1/payments/{id}/void.
New response fields:
- compact
packageobject:metrc_id,quantity,quantity_active,location_id, andlicense_id - full
packageobject:product - full
productobject:quantity_active,quantity_active_by_location,quantity_reservedandquantity_available. - full
batchobject:product,quantity_activeandquantity_active_by_location.
New request fields:
- POST
/public/v1/orders:noteon line items;tax_idon charges. - POST
/public/v1/products:treez_wholesale_price,leaflink_product_id. - POST
/public/v1/purchases:supplier_location_id. - POST
/public/v1/custom-fieldsand/public/v1/custom-fields/{id}:disabled_field_options. - POST
/public/v1/companies:qb_customer_id,qb_vendor_id,leaflink_customer_id.
Behavior changes:
- All POST endpoints now support sparse updates.
- Added
include_packages_with_active_quantity_by_locationandinclude_batches_with_active_quantity_by_locationquery params to GET/public/v1/productsand GET/public/v1/products/{id}. When set, each product in the response includes fieldspackages_with_active_quantity_by_locationandbatches_with_active_quantity_by_location.
Cross-cutting filters:
- Added an
idsfilter to all GET list endpoints, restricting the result to specific records by ID. - Added a
custom_datafilter to all applicable GET list endpoints. - Added an
owner_idsfilter to all GET endpoints that were missing it. - Added
inserted_datetimeandupdated_datetime(range) filters to all GET endpoints that were missing them.
Per-endpoint filters:
- GET
/public/v1/assemblies:inserted_datetimelicense_idsowner_idsstatusupdated_datetimeinput_*/output_*variants ofproduct_ids,package_ids,batch_ids,package_compliance_labels,package_batch_numbers,batch_batch_numbers,product_category_ids,product_subcategory_ids,product_group_ids,product_brand_ids,product_vendor_ids,product_strain_ids,product_tag_ids,product_skus
- GET
/public/v1/batches:batch_numbershas_quantity_activeproduct_brand_idsproduct_category_idsproduct_group_idsproduct_idsproduct_skusproduct_strain_idsproduct_subcategory_idsproduct_tag_idsproduct_vendor_ids
- GET
/public/v1/packages:batch_numberbatch_numbersbin_idscompliance_labelcompliance_labelscompliance_product_namecompliance_product_namescontains_remediated_materialexpiration_datetimefinished_datetimeharvest_datehas_coa_attachedhas_quantity_activeinactivated_datetimeis_production_batchis_test_sampleis_trade_samplelab_testing_statelab_testing_stateslicense_idsowner_idspackaged_dateproduct_brand_idsproduct_category_idsproduct_group_idsproduct_skusproduct_strain_idsproduct_subcategory_idsproduct_tag_idsproduct_vendor_idsunit_type_ids
- GET
/public/v1/products:brand_idscategory_idshas_quantity_activeinventory_tracking_methodis_activeis_featuredleaflink_product_idsmenu_idsmenu_visibilitynamesowner_idsproduct_group_idsskuskusstrain_idsstrain_typessubcategory_idstag_idsunit_type_idsupcupcsvendor_ids
- GET
/public/v1/orders:batch_batch_numbersbatch_idsbilling_location_idsbiotrack_idsbuyer_company_idscompany_group_idscompany_idsdelivered_datetimeleaflink_idslocation_idsmenu_idsmetrc_transfer_idsorder_numberorder_numbersowner_idspackage_batch_numberspackage_compliance_labelspackage_idspayment_statusesproduct_brand_idsproduct_category_idsproduct_group_idsproduct_idsproduct_skusproduct_strain_idsproduct_subcategory_idsproduct_tag_idsproduct_vendor_idsshipping_location_idsstatusestotal
- GET
/public/v1/companies:categorycitycompany_group_idshas_outstanding_balanceleaflink_customer_idslegal_business_namelicense_numbernamenamesoutstanding_balanceowner_idsqb_customer_idsqb_vendor_idsrelationship_type_idsstates
- GET
/public/v1/purchases:batch_batch_numbersbatch_idsbiotrack_idscompany_group_idscompany_idslicense_numberlocation_idsmetrc_transfer_idsowner_idspackage_batch_numberspackage_compliance_labelspackage_idspayment_statusesproduct_brand_idsproduct_category_idsproduct_group_idsproduct_idsproduct_skusproduct_strain_idsproduct_subcategory_idsproduct_tag_idsproduct_vendor_idspurchase_numberpurchase_numbersstatusestotal
- GET
/public/v1/invoices:batch_batch_numbersbatch_idscompany_group_idscompany_idsinvoice_numbersis_voidedorder_idsorder_numbersorder_statusesowner_idspackage_batch_numberspackage_compliance_labelspackage_idsproduct_brand_idsproduct_category_idsproduct_group_idsproduct_idsproduct_skusproduct_strain_idsproduct_subcategory_idsproduct_tag_idsproduct_vendor_idsremaining_amountstatusestotalvoided_datetime
- GET
/public/v1/credits:amountcompany_idsinvoice_ids
- GET
/public/v1/payments:amountcompany_idsinvoice_idspayment_method_idspurchase_ids
- GET
/public/v1/returns:company_idsorder_idsstatuses
- GET
/public/v1/contacts:company_ids
- GET
/public/v1/adjustments:batch_idslocation_idsproduct_idsupdated_datetime
- GET
/public/v1/strains:nametypes
- GET
/public/v1/locations:license_numbername
- GET
/public/v1/price-tiers:product_ids
- GET
/public/v1/menus:inserted_datetimeupdated_datetimevisibilities
- GET
/public/v1/test-results:batch_idsinserted_datetimemetrc_idspackage_idsproduct_ids
- GET
/public/v1/inventory:product_brand_idsproduct_category_idsproduct_group_idsproduct_skusproduct_strain_idsproduct_subcategory_idsproduct_tag_idsproduct_vendor_ids
2026-08-21
- POST
/public/v1/creditsnow allows updatingowner_id,external_noteandinternal_noteon automatically-created credits (from a return, an invoice overpayment, or a QuickBooks Online payment), matching what the Distru UI allows on those fields. On a credit memo created in QuickBooks Online,owner_idis the only updatable field. Every other field still requires a manually-created (USERsource) credit.
2026-08-19
- Added POST
/public/v1/assembliesendpoint to create, update, and delete assemblies. - Added POST
/public/v1/assemblies/split_packageendpoint. - Added GET
/public/v1/metrc/tagsand GET/public/v1/metrc/tags/{id}endpoints. - Added GET
/public/v1/metrc/itemsendpoint. - Extended POST
/public/v1/purchasesto acceptstatusand to match a purchase to a compliance transfer - Added
batch_number,status,metrc_item_id,metrc_location_id,metrc_notes,metrc_production_batch_number,copy_custom_data_from_input,use_same_item,is_donation,is_test_sample, andis_trade_sampleto assembly outputs. - Added GET
/public/v1/price-tiers, GET/public/v1/price-tiers/{id}, POST/public/v1/price-tiers, and DELETE/public/v1/price-tiers/{id}endpoints.
2026-08-18
- Added POST
/public/v1/packages/finishendpoint. - Added POST
/public/v1/packages/moveendpoint. - Added
inserted_datetime(the record's creation datetime) to the product, package, user, license, charge, order item and invoice item objects returned across the API.
2026-08-17
- Added GET/POST/DELETE
/public/v1/binsendpoints. - Added
bin_idsto POST/public/v1/batchesand POST/public/v1/packages/:idto set a record's bins. - Added
binsto the response of GET/public/v1/batches, GET/public/v1/batches/:id, POST/public/v1/batches, GET/public/v1/packagesand POST/public/v1/packages/:id, present only when bin inventory tracking is enabled. - Added POST
/public/v1/products/add-costsendpoint. - Added POST
/public/v1/batches/add-costsendpoint. - Added POST
/public/v1/packages/add-costsendpoint.
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/products -
unit_net_weight_serving_size_unit_type -
unit_net_weight -
unit_serving_size
2025-10-19
- Added
unit_costto the endpoint GETpublic/v1/products
2025-10-15
-
Added the following fields to
public/v1/inventory -
total_cost_actual -
total_cost_default -
cost_per_unit_actual -
cost_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-07-01
- Added
description_markdownto GET/POST/public/v1/products
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 -
Added
metrc_transfer_idandbiotrack_idto GET/public/v1/orders
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-08-19
- All GET endpoints now return eventually consistent data, with changes taking up to 1 second to propagate in responses
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.