Treez Legacy SellTreez v2.0 Product API

Legacy v2.0 product surface - list products with rich filters, list products by last-updated, read a product by id, read product fields by category type, create and update products, and upload a product image. 7 operations. Superseded by the v3 dispensary and catalog surfaces but still published, still documented under the portal's "Legacy v2 Docs" version selector, and still named in the RFC 9727 API Catalog. Uses the older client-ID plus per-location API key Authorization API rather than the v3 self-signed JWT.

Operations 7

GET /{dispensary_name}/product/product_list GET/ List of Products #
GET /{dispensary_name}/product/product_list/lastUpdated/after/{date_time} GET/ List of Products by Last_Updated_At #
GET /{dispensary_name}/product/{product_id} GET/ Product by ID #
GET /{dispensary_name}/product/product_fields GET/ Product Fields by Category Type #
POST /{dispensary_name}/product/{product_id}/image/upload POST/ Upload an Image to a Product #
POST /{dispensary_name}/product/create POST/ Create Product #
PUT /{dispensary_name}/product/update/{product_id}' PUT/ Update Product #

Work with this as data

Every API here is available over the APIs.io API and to AI agents over MCP.

MCP server

One button, every client — Claude, Cursor, VS Code and the rest.

https://apis.io/mcp

Tools for apis

7 MCP tools reach this
  • find_apisBrowse and filter every API in the catalog.
  • get_api_artifactsOne API's artifacts, grouped by type.
  • get_openapiThe primary OpenAPI for this API.
  • find_similar_apisAPIs that look like this one.
  • apis_io_searchSTART HERE — APIs, providers and tags for one query, each with its total.
  • resolveTurn a domain, URL or GitHub org into the provider it belongs to.
  • find_cohortsEvery scored population of providers in the catalog.
All 92 tools →

Call it yourself

curl for this page
This API
curl "https://apis.io/api/v1/apis/treez-legacy-selltreez-v20-product-api"
All apis
curl "https://apis.io/api/v1/apis?limit=25"

Discovery needs no key. Ratings and market analysis are Pro.

Get an API key

Free tier, no email required.

A second provider on the same verified email joins the account you already have.

OpenAPI Specification

treez-product-api-openapi.json Raw ↑
{"openapi":"3.0.0","info":{"description":"# INTRODUCTION\nUsing the Product API you can easily create new products in the POS system. The Product API also allows you to update the details of an existing product, search for a specific product, and download a list of all existing products. \nProduct APIs are different from OnlineMenu API.\n\n# AUHTORIZATION\nIn order to access to the Product API, please use the provided partner_id and the access_token generated by the Authorization API.\n\n# USING WEBHOOKS\n\n**Webhooks can be configured in the POS portal by the dispensary manager itself**\n\n**Step 1:** Configurations > Config Page > Integration and scroll down to the ‘Webhook Integration’ section. \nIf you don’t see the ‘Webhook Integration’ section, contact customer support to have it enabled. \n\n**Step 2:** + Add Client and Fill out the following fields:\nName: Choose a unique name to identify this partner \nURL: Enter the URL provided by the partner (where they will see the updates come in)\nNotifications: Set as ‘PRODUCT’. Multiple options can be selected.\n\n**Step 3:** Click Test. If the ‘Test Passed’ pop up appears it means the URL you entered is valid. \nIf the ‘Test Fail’ pop-up appears, it means the URL you entered in invalid. \n\n**Step 4:** Once you pass testing, click Save. All the updates per selection will be notified to the specified URL.\n\n# LIMITATIONS\nYou can’t create an additional data field for the product.\nYou can’t set a field as required.\nYou can’t adjust the inventory for a product when you create or update a product. \nYou can’t add a product image when you create or update a product.\nRate limit is 10TPS per client_id\nAPI response limit is 50 per request call.\nEach product variant(s) are separate product and have their own unique id. This is well-matched with the product module in the POS portal.","version":"2.7.4","title":"Product_API","contact":{"name":"Treez","url":"https://www.treez.io/","email":"support@treez.io"}},"paths":{"/{dispensary_name}/product/product_list":{"get":{"tags":["Product_API"],"summary":"GET/ List of Products","description":"This endpoint provides a catalog of products that can be filtered by query parameters available with this endpoint. This endpoint should be used when looking up the the current units available of units for inventory.","operationId":"ProductListGet","parameters":[{"name":"dispensary_name","in":"path","description":"Enter the dispensary name ie. [Dispensaryname].treez.io.","required":true,"schema":{"type":"string","default":"partnersandbox2"}},{"name":"authorization","in":"header","description":"Enter the access token generated via Authorization API.","required":true,"schema":{"type":"string"}},{"name":"client_id","in":"header","description":"Enter the Client_ID provided by TREEZ.","required":true,"schema":{"type":"string"}},{"name":"page","in":"query","description":"Enter the page_number.","required":true,"schema":{"type":"integer","format":"int32","default":1}},{"name":"category_type","in":"query","description":"This field is the equivalent to product type in the Treez UI. The value of the field describes the product type the inventory was assigned to when it was recieved.","required":false,"schema":{"type":"string"}},{"name":"active","in":"query","description":"The active parameter filters for active products in the product catalog. If this parameter is set to 'FALSE' only deactivated products will be returned in the response. If set to 'TRUE', only active products will be returned. If this parameter is set to 'ALL', it will return both active and deactivated products. Whether a product is active or not does not have any relationship with a product having inventory or not.","required":false,"schema":{"type":"boolean","format":"int32"}},{"name":"id","in":"query","description":"Filter by unique ID associated with each product. The product_id value will not change once a product has been created. You can search up to 50 product IDs at time with this endpoint.","required":false,"schema":{"type":"string"}},{"name":"sellable_quantity_in_location","in":"query","description":"This allows partners to filter for products in a particular location in Treez.","required":false,"schema":{"type":"string"}},{"name":"sellable_quantity_in_type","in":"query","description":"This parameter allows the partner to filter based on the inventory type of the product. The filters for this filter are MEDICAL, ADULT, and ALL.","required":false,"schema":{"type":"string"}},{"name":"above_threshold","in":"query","description":"When the parameter is set to 'TRUE' the response will only contain products that are above the minimum_visible_inventory_level set up in the config page of Treez. If 'FALSE' the products listed in the response will be below the minimum_visible_inventory_level.","required":false,"schema":{"type":"boolean","format":"int32"}}],"responses":{"200":{"description":"SUCCESS. \n Returns the latest data successfully."},"400":{"description":"BAD REQUEST. \n The wrong URL request. \n Response limit is exceeded."},"401":{"description":"AUTHENTICATION OR AUTHORIZATION. \n The worng client_id is used. \n The expired or wrong access token is used.","headers":{}}},"deprecated":false}},"/{dispensary_name}/product/product_list/lastUpdated/after/{date_time}":{"get":{"tags":["Product_API"],"summary":"GET/ List of Products by Last_Updated_At","description":"This endpoint returns a list of products in which the last_update_at timestamp is after the timestamps defined in the endpoint. The last_updated_at timestamp only updates when the metadata for a product changes. If inventory is sold for a product the last_updated_at timestamp will not change. This endpoint should not be used to track inventory levels.","operationId":"UpdatedProductListGet","parameters":[{"name":"dispensary_name","in":"path","description":"Enter the dispensary name ie. [Dispensaryname].treez.io.","required":true,"schema":{"type":"string","default":"partnersandbox2"}},{"name":"date_time","in":"path","description":"Format: The last_updated_at is updated only when product metadata is changed in either the API or UI. The approved format for this field is yyyy-MM-ddThh:mm:ss.000-08:00.","required":true,"schema":{"type":"string","default":"2021-09-11T08:54:53.000-07:00"}},{"name":"authorization","in":"header","description":"Enter the bearer token obtained via Authorization API.","required":true,"schema":{"type":"string"}},{"name":"client_id","in":"header","description":"Enter the Client_ID provided by TREEZ.","required":true,"schema":{"type":"string"}},{"name":"page","in":"query","description":"Enter the page_number.","required":true,"schema":{"type":"integer","format":"int32","default":1}},{"name":"category_type","in":"query","description":"Is the equivalent to product type in the treez UI. The value of the field describes the product type the inventory was assigned to when it was received.","required":false,"schema":{"type":"string","default":"all"}},{"name":"active","in":"query","description":"The active parameter filters for active products in the product catalog. If this parameter is set to 'FALSE' only deactivated products will be returned in the response. If set to 'TRUE', only active products will be returned. If this parameter is set to 'ALL', it will return both active and deactivated products. Whether a product is active or not does not have any relationship with a product having inventory or not.","required":false,"schema":{"type":"boolean","format":"int32"}}],"responses":{"200":{"description":"SUCCESS. \n Returns the latest data successfully."},"400":{"description":"BAD REQUEST. \n The wrong URL request. \n Response limit is exceeded."},"401":{"description":"AUTHENTICATION OR AUTHORIZATION. \n The worng client_id is used. \n The expired or wrong access token is used.","headers":{}}},"deprecated":false}},"/{dispensary_name}/product/{product_id}":{"get":{"tags":["Product_API"],"summary":"GET/ Product by ID","description":"Provides product information based on the Product ID defined in the endpoint.","operationId":"ByProductIdGet","parameters":[{"name":"dispensary_name","in":"path","description":"Enter the dispensary name ie. [Dispensaryname].treez.io.","required":true,"schema":{"type":"string","default":"partnersandbox2"}},{"name":"product_id","in":"path","description":"Unique ID associated with each product. This value will not change once a product has been created.","required":true,"schema":{"type":"string","default":"1bbe7975-0372-4d82-945c-72e587826b5a"}},{"name":"authorization","in":"header","description":"Enter the bearer token obtained via Authorization API.","required":true,"schema":{"type":"string"}},{"name":"client_id","in":"header","description":"Enter the Client_ID provided by TREEZ.","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"SUCCESS. \n Returns the latest data successfully."},"400":{"description":"BAD REQUEST. \n The wrong URL request."},"401":{"description":"AUTHENTICATION OR AUTHORIZATION. \n The worng client_id is used. \n The expired or wrong access token is used.","headers":{}}},"deprecated":false}},"/{dispensary_name}/product/product_fields":{"get":{"tags":["Product_API"],"summary":"GET/ Product Fields by Category Type","description":"This endpoint returns information on available fields in the product API for each product category.","operationId":"ProductFieldsGet","parameters":[{"name":"dispensary_name","in":"path","description":"Enter the dispensary name ie. [Dispensaryname].treez.io","required":true,"schema":{"type":"string","default":"partnersandbox2"}},{"name":"authorization","in":"header","description":"Enter the bearer token obtained via Authorization API.","required":true,"schema":{"type":"string"}},{"name":"client_id","in":"header","description":"Enter the Client_ID provided by TREEZ.","required":true,"schema":{"type":"string"}},{"name":"category_type","in":"query","description":"Is the equivalent to product type in the Treez UI. The value of the field describes the product type the inventory was assigned to when it was received.","required":true,"schema":{"type":"string","default":"all"}}],"responses":{"200":{"description":"SUCCESS. \n Returns the latest data successfully."},"400":{"description":"BAD REQUEST. \n The wrong URL request."},"401":{"description":"AUTHENTICATION OR AUTHORIZATION. \n The worng client_id is used. \n The expired or wrong access token is used.","headers":{}}},"deprecated":false}},"/{dispensary_name}/product/{product_id}/image/upload":{"post":{"tags":["Product_API"],"summary":"POST/ Upload an Image to a Product","description":"This endpoint allows partners to upload images to existing products.","operationId":"UploadImage","parameters":[{"name":"dispensary_name","in":"path","description":"Enter the dispensary name ie. [Dispensaryname].treez.io","required":true,"schema":{"type":"string","default":"partnersandbox2"}},{"name":"product_id","in":"path","description":"Enter the product_id that you want to upload an image to. Unique ID associated with each product. This value will not change once a product has been created.","required":true,"schema":{"type":"string","default":"1ae6677a-909b-4bfd-b348-d5e587704655"}},{"name":"authorization","in":"header","description":"Enter the bearer token obtained via Authorization API.","required":true,"schema":{"type":"string"}},{"name":"client_id","in":"header","description":"Enter the Client_ID provided by TREEZ.","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"multipart/form-data":{"schema":{"type":"object","properties":{"image":{"description":"Product image that will be added to the product defined in the endpoint.","type":"string","format":"binary"}},"required":["image"]}}}},"responses":{"200":{"description":"SUCCESS. \n Returns the response data successfully."},"400":{"description":"BAD REQUEST. \n The wrong URL request. \n The wrong JSON structure. \n The validations/requirements are not met."},"401":{"description":"AUTHENTICATION OR AUTHORIZATION. \n The worng client_id is used. \n The expired or wrong access token is used.","headers":{}}},"deprecated":false}},"/{dispensary_name}/product/create":{"post":{"tags":["Product_API"],"summary":"POST/ Create Product","description":"This endpoint needs to be used in order to create a new product in the POS portal via API. It is not possible to add inventory to a product through this endpoint.","operationId":"CreateProduct","parameters":[{"name":"dispensary_name","in":"path","description":"Enter the dispensary name ie. [Dispensaryname].treez.io.","required":true,"schema":{"type":"string","default":"partnersandbox2"}},{"name":"authorization","in":"header","description":"Enter the bearer token obtained via Authorization API.","required":true,"schema":{"type":"string"}},{"name":"client_id","in":"header","description":"Enter the Client_ID provided by TREEZ.","required":true,"schema":{"type":"string"}}],"requestBody":{"$ref":"#/components/requestBodies/CreateNewProductRequest"},"responses":{"200":{"description":"SUCCESS. \n Returns the response data successfully."},"400":{"description":"BAD REQUEST. \n The wrong URL request. \n The wrong JSON structure. \n The validations/requirements are not met."},"401":{"description":"AUTHENTICATION OR AUTHORIZATION. \n The worng client_id is used. \n The expired or wrong access token is used.","headers":{}}},"deprecated":false}},"/{dispensary_name}/product/update/{product_id}'":{"put":{"tags":["Product_API"],"summary":"PUT/ Update Product","description":"This endpoint allows partners to update an existing product's metadata.","operationId":"UpdateProductById","parameters":[{"name":"dispensary_name","in":"path","description":"Enter the dispensary name ie. [Dispensaryname].treez.io","required":true,"schema":{"type":"string","default":"partnersandbox2"}},{"name":"product_id","in":"path","description":"The product ID associated to the product that will be edited. The Product ID is a unique ID and this value will not change once a product has been created.","required":true,"schema":{"type":"string","default":"1bbe7975-0372-4d82-945c-72e587826b5a"}},{"name":"authorization","in":"header","description":"Enter the bearer token obtained via Authorization API.","required":true,"schema":{"type":"string"}},{"name":"client_id","in":"header","description":"Enter the Client_ID provided by TREEZ.","required":true,"schema":{"type":"string"}}],"requestBody":{"$ref":"#/components/requestBodies/CreateNewProductRequest"},"responses":{"200":{"description":"SUCCESS. \n Returns the response data successfully."},"400":{"description":"BAD REQUEST. \n The wrong URL request. \n The wrong JSON structure. \n The validations/requirements are not met."},"401":{"description":"AUTHENTICATION OR AUTHORIZATION. \n The worng client_id is used. \n The expired or wrong access token is used.","headers":{}}},"deprecated":false}}},"servers":[{"url":"https://api.treez.io/v2.0/dispensary"}],"components":{"requestBodies":{"CreateNewProductRequest":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateNewProductRequest"}}},"required":true}},"schemas":{"CreateNewProductRequest":{"type":"object","required":["category_type","product_configurable_fields"],"properties":{"product_id":{"type":"string","example":"185ab868-da5c-4141-84b1-5725d64f7a18","description":"Unique ID associated with each product. This value will not change once a product has been created.","readOnly":true},"product_status":{"type":"string","example":"ACTIVE","description":"This tells the product's current status.","readOnly":true},"last_updated_at":{"type":"string","example":"2019-06-25T02:43:08.000-07:00","description":"It tells the time when the product was updated last","readOnly":true},"sellable_quantity":{"type":"integer","format":"int32","example":65,"description":"It reads in the total of available, reserved and packed & ready quantity of the product irrespective of location or bathes.","readOnly":true},"category_type":{"type":"string","example":"EDIBLE","description":"Is the equivalent to product type in the treez UI.","default":"EDIBLE"},"product_configurable_fields":{"$ref":"#/components/schemas/ProductConfigurableFields"},"pricing":{"$ref":"#/components/schemas/Pricing"},"attributes":{"$ref":"#/components/schemas/Attributes"},"product_barcodes":{"type":"array","example":["barcode1","barcode2"],"description":"This reads in the barcode specific to the product.","items":{"type":"string"}},"e_commerce":{"$ref":"#/components/schemas/ECommerce"}},"title":"Product_Data_Details"},"ProductConfigurableFields":{"type":"object","properties":{"amount":{"type":"string","example":"3.5","description":"Weight of an item associated to a product. This value impacts purchase limits for weight based products.","default":"3.5"},"brand":{"type":"string","example":"KIVA","description":"This field lists the brand that is associated to the product.","default":"KIVA"},"classification":{"type":"string","example":"SATIVA","description":"This field lists what type of classification a product has. Ie. Indica, Sativa, Hybrid, etc.","default":"SATIVA"},"doses":{"type":"string","example":"10","description":"This describes the total doses of the product.","default":"10"},"name":{"type":"string","example":"ESPRESSO BEANS SAMPLE","description":"Name of the product.","default":"ESPRESSO BEANS SAMPLE"},"size":{"type":"string","example":"CONE","description":"This is a descriptive field of a size of a product. Ie 5-pack, Cone.","default":"CONE"},"sub_type":{"type":"string","example":"COOKIE","description":"This field reads the subtype of a product. The available subtype change based on the category_type used.","default":"COOKIE"},"total_mg_thc":{"type":"string","example":"3","description":"This field lists the concentrated amount of MG THC available for a product. This field impacts the purchase limits for concentrate products.","default":"3"},"total_mg_cbd":{"type":"string","example":"2","description":"This field lists the concentrated levels of CBD in a product.","default":"2"},"uom":{"type":"string","example":"GRAMS","description":"Unit of measure used for purchase limits. This value impacts purchase limits for weight based products.","default":"GRAMS"}},"title":"ProductConfigurableFields","description":"This section contains all the configurable fields. It is advisable to request the fresh details form the other API with endpoint called GET/product_fields. this will help to get the latest information on the required fields and the accepted value of the product fields. This information varies per category. The fieldsin this section is sorted alphabetically."},"Pricing":{"type":"object","properties":{"price_type":{"type":"string","example":"FLAT","description":"Describes whether a product uses tier or flat pricing.","default":"FLAT"},"price_sell":{"type":"integer","format":"int32","example":"54.50","description":"The amount that the product will be sold for. This field is required if price_type is FLAT. \n Keep the value null if price_type is TIER."},"tier_name":{"type":"string","description":"Tier Name assigned to a product. Partners must use an existing tier to get a valid response."}},"title":"Pricing","description":"This section details out the pricing of the product."},"Attributes":{"type":"object","properties":{"general":{"type":"array","example":["Gen1","Gen2"],"description":"This field records the general attributes associated to a product.","items":{"type":"string"}},"flavors":{"type":"array","example":["Flav1","Flav2"],"description":"This field records the flavor of the product.","items":{"type":"string"}},"effects":{"type":"array","example":["SLEEPY","HAPPY"],"description":"This field records the effects of the product.","items":{"type":"string"}},"ingredients":{"type":"array","example":["BERRY","FRUITS"],"description":"This field records the ingredient of the product.","items":{"type":"string"}},"internal_tags":{"type":"array","example":["TAG 1","TAG 2"],"description":"This field records the internal tags/labels of the product that can be used to search the product. This product is not displayed to customers.","items":{"type":"string"}}},"title":"Attributes"},"ECommerce":{"type":"object","properties":{"all_images":{"type":"array","description":"It brings in the URL of all the associated images.","readOnly":true,"items":{"type":"string","example":""}},"primary_image":{"type":"string","example":"","description":"It brings in the URL of the primary image only.","readOnly":true},"menu_title":{"type":"string","example":"ESPRESSO PRODUCT","description":"When completed this field will be displayed as the primary name of the product over the product_name field.","default":"ESPRESSO PRODUCT"},"product_description":{"type":"string","example":"Some Product Description","description":"It reads in the product description for the menu purposes.","default":"Some Product Description"},"minimum_visible_inventory_level":{"type":"integer","format":"int32","example":2,"description":"Customer facing description that will be displayed in Treez eCommerce.","readOnly":true},"hide_from_menu":{"type":"boolean","example":true,"description":"When set to True this product will be hidden from the Treez eCommerce","default":true}},"title":"ECommerce"}}},"x-explorer-enabled":true,"x-proxy-enabled":true,"x-samples-enabled":true,"x-samples-languages":["curl","node","ruby","javascript","python"]}