Brands
brand × marketDistribution, doors carried, coverage, category mix, and the SKUs a brand has on shelf.
Shelf Data API
Query who carries what, where, at what price, in stock or not — and what changed — across the cannabis retail market. A clean, read-only REST API over the same shelf intelligence that powers the CannaiQ dashboards. Build it into your own app, model, or warehouse.
Six resources, each at a defined grain. Filter, combine, and expand them into the exact slice you need.
Distribution, doors carried, coverage, category mix, and the SKUs a brand has on shelf.
Store directory, location, platform, and the brands and full menu each store carries right now.
Canonical product families deduped across stores — one identity per real product.
Variant-level catalog — weight, dose, strain, format — and every store carrying each SKU.
In-stock / out-of-stock and quantity from the most recent shelf read. Plus what just left the shelf.
New placements, lost placements, price moves, category trends, and movement direction over time.
No bare numbers. Each value ships with where it came from and when we last saw it — so you always know whether you're reading a measured fact or a modeled estimate.
Read directly from a shelf: presence, price, promotions, stock, door counts. A measured fact.
Computed from change between shelf reads: movement, velocity, trends. Always directional, always a lower bound — labeled as such.
Observed data upgraded by a brand's own catalog verification. The highest-confidence tier.
A deliberately lean REST surface — depth comes from query flexibility, not endpoint sprawl.
GET /data/v1/brandsGET /data/v1/brands/{id}GET /data/v1/brands/{id}/storesGET /data/v1/brands/{id}/skusGET /data/v1/brands/{id}/coverageGET /data/v1/brands/{id}/categoriesGET /data/v1/storesGET /data/v1/stores/{id}GET /data/v1/stores/{id}/brandsGET /data/v1/stores/{id}/menuGET /data/v1/stores/{id}/categoriesGET /data/v1/productsGET /data/v1/products/{id}GET /data/v1/skusGET /data/v1/skus/{id}GET /data/v1/skus/{id}/shelfGET /data/v1/inventory/stockGET /data/v1/inventory/oosGET /data/v1/inventory/delistedGET /data/v1/pricing/skusGET /data/v1/pricing/ladderGET /data/v1/pricing/marketGET /data/v1/signals/new-placementsGET /data/v1/signals/lost-placementsGET /data/v1/signals/price-changesGET /data/v1/signals/velocityGET /data/v1/signals/category-trends
Every response returns data, a meta block with provenance,
timestamp, grain, and coverage, and a page block for pagination.
Inventory is always the latest shelf read; trends are windowed and labeled.
{
"data": [
{
"sku_id": "…",
"name": "Green Apple Pocket Spritz 100mg",
"brand": "Boho Euphorics",
"format": "beverage",
"store_id": 2498,
"store_name": "Authorized Dealer (Willingboro)",
"city": "Willingboro",
"state": "NJ",
"in_stock": false,
"list_price": 24.00,
"last_seen_at": "2026-06-23T14:02:00Z"
}
],
"meta": {
"as_of": "2026-06-23T14:02:00Z",
"provenance": "observed",
"grain": "placement",
"window": "snapshot",
"coverage": { "states": ["NJ"], "confidence": "high" }
},
"page": { "limit": 100, "offset": 0, "total": 1 }
} Every list endpoint speaks one query grammar — so you compose the view you need without us pre-building it.
Combine market, brand, category, platform, price range, stock status, and "changed since" — e.g. ?state=NJ&category=flower&price[gte]=20&price[lte]=40&in_stock=true.
Return only the fields you want with ?fields= — smaller, faster, cheaper payloads.
Sort on any indexed field (?sort=-doors), page with limit/offset or cursors for large pulls.
Walk relationships inline — a SKU to every store carrying it, a brand to its full catalog — in one request with ?expand=.
Enterprise plans can export any resource as Parquet or JSONL, scoped to your markets, to load into your own warehouse.
Keys are scoped to your markets and resources, rate-limited, and metered per call — predictable and auditable.
Everything in the API is derived from observed dispensary shelves — not modeled point-of-sale figures, not foot-traffic estimates, not survey panels. We don't fabricate retail sales, basket data, or anything we can't actually observe. Where a value is an estimate, it says so, in the data. That honesty is the product.