Appearance
Catalog, search and products
11.1 POST /api/v1/mobile/tags-catalog (customer) · POST /api/v1/mobile/open/tags-catalog (guest)
Handler: getTagCatalogue (catalogue_controller.js) — one handler, two mounts.
Body payload ✅ (object required, all keys optional):
| field | type | notes |
|---|---|---|
tags | string[] | |
category | string[] | required when subCategory is present |
subCategory | string[] | |
brandName | string[] | |
deals | string[] | |
strains | string[] |
Query: search, limit, offset, sortItem + sortType (ASC/DESC, only applied when both sent), hubId, roomId (token values win), unified_res (boolean, default false — returns the intersection across tag buckets as one flat list instead of a keyed object).
11.2 POST /api/v1/mobile/related-catalog (customer) · POST /api/v1/mobile/open/related-catalog (guest)
Handler: getRelatedCatalogue
Body payload ✅ is an array; each item: { type ✅ (string), value (array), productId (number) } and must have value or productId. Query: hubId, roomId, search, sortItem + sortType, onlyInStock (boolean, default false).
11.3 POST /api/v1/mobile/filter-catalog
Auth: Brand · Handler: filterCatalogue Body payload ✅ is an array of { filterColumn ✅ (string), filterValue ✅ (array) }. Query: hubId, roomId, search, sortItem + sortType.
11.4 POST /api/v1/brand/mobile/search — Typesense product search
Auth: Brand · Handler: queryTypesense (typesense_controller.ts)
Query: query ✅ (string, the search term — it is a query param, not part of the body).
Body payload: { filters, options }, both optional.
filters accepts either the legacy shape or the newer facet_* shape (they are normalised to the same thing server-side; prefer facet_* for new work):
| legacy key | facet key | type |
|---|---|---|
category | facet_categories | string[] (required if the sub-category key is present) |
subCategory | facet_sub_categories | string[] |
brandName | facet_brand_names | string[] |
tags | facet_tags | string[] |
strain_name | facet_strain_names | string[] |
loyalty_tier_ids | facet_loyalty_tier_ids | string[] |
| — | facet_discount_texts | string[] |
attributes_view | facet_attributes_view | see below |
attributes_value | attributes_value | see below |
attributes_value / attributes_view items are either a plain string, or { value ✅, match_all (bool, default false) }.
Also on filters: price_range (string), in_stock (boolean), with_inventory (boolean, default true), and negate_filters — an object with the same keys, used to exclude. Default when filters is omitted: { with_inventory: true }.
with_inventory: trueplus ahubId+roomIdon the token routes the search to the hub-product collection (live stock); otherwise it hits the global product collection.
options (each with a default): per_page 20, page 1, max_facet_values 100, sort_by "_text_match:desc", num_typos 2, as_marketplace false.
11.5 POST /api/v1/brand/mobile/search/strains
Auth: Brand · Handler: querystrain · Query query ✅. Body payload: filters = { brandName, tags, facet_lc_tags, attributes_value, attributes_view } (all optional string arrays / attribute items as above); options same as 11.4.
11.6 GET /api/v1/mobile/getproduct/:slug
Auth: Brand · Handler: getProductBySlug (product_controller.js) Path: slug ✅. Query: hubId (>0), roomId (>0), productId — all optional.
11.7 GET /api/v1/brand/mobile/strain/:strainId
Auth: Brand · Handler: getStrainById · Path: strainId (number) ✅.
11.8 GET /api/v1/mobile/master-data
Auth: Brand · Handler: getMasterDataByBrandId (batchMasterData_controller.js) Query: category, subCategory, name — all optional exact-match filters. (brandId falls back to ?brandId= if the token somehow lacks it.)
11.9 GET /api/v1/mobile/master-data/brand/category-brandname
Auth: Brand · Handler: getCategoriesAndBrandNameForBrand · No params. Returns the facet values (categories + brand names) available for the token's brand — use it to build filter UIs.