LIVE
Cloudline entered Cactus Co Phoenix +12 SKUs / Cedarline lost Red Rock Tempe −8 SKUs / Emberton entered Prairie Buds Calgary +9 doors / Northstar price drop Bell Road Phoenix $45→$38 / Maplecross entered Lakeshore Toronto +14 SKUs / Voltleaf lost Mesa Verde Mesa −4 SKUs / Wildcraft entered Northern Leaf Edmonton +7 SKUs / Ninebar BOGO activated Desert Bloom Promo live / Wildroot entered Washington market +22 doors / Nova Labs Engine Win — Saguaro Wellness PHX +18 doors / Cloudline entered Cactus Co Phoenix +12 SKUs / Cedarline lost Red Rock Tempe −8 SKUs / Emberton entered Prairie Buds Calgary +9 doors / Northstar price drop Bell Road Phoenix $45→$38 / Maplecross entered Lakeshore Toronto +14 SKUs / Voltleaf lost Mesa Verde Mesa −4 SKUs / Wildcraft entered Northern Leaf Edmonton +7 SKUs / Ninebar BOGO activated Desert Bloom Promo live / Wildroot entered Washington market +22 doors / Nova Labs Engine Win — Saguaro Wellness PHX +18 doors /

Shelf Data API

Every dispensary shelf, as structured data.

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. Two tiers of data, one predictable shape, priced per state.

10,000+dispensaries observed
56markets · US · CA · PR
18,000+brands tracked
7M+SKUs observed
< 1 hrrefresh on live stores

Two products, two meters

Menu Data is the shelf exactly as each store publishes it, priced per state and metered by request. Intelligence Data is our canonical layer — one id per real product across every store in a state — and is licensed for use in the products you build: the Embedded Data License meters rows served, so a full-state sync costs what you take, not how you paged it.

Menu Data

The shelf exactly as each store publishes it.

CoveragePriceIncluded
1 state $195 / month 15,000 requests / month
2–4 states $169 / state / month 15,000 requests / state / month
5–9 states $139 / state / month 20,000 requests / state / month
10+ states · nationwide $1,995 / month 250,000 requests / month
Meter
Metered by request. A page holds up to 2,000 listings.
Extra usage
Extra capacity: +25,000 requests per state per month for $150; +100,000 for $400.
Use
Internal benchmarking, auditing and evaluation. Rows are not redistributed or embedded in third-party products.
  • Every listing variant with the store’s own names, categories and ids
  • Recreational and medical list and sale prices, stock flag, published quantity
  • First-seen and last-seen timestamps per variant; stable listing ids for diffing
  • Store directory with location and menu link

Embedded Data License

Intelligence Data inside the products you sell.

CoveragePriceIncluded
1 state $1,999 / state / month 5,000,000 rows / state / month
10+ states · nationwide $14,900 / month 250,000,000 rows / month
Meter
Metered by rows served, not requests. Sync a whole state as often as you need; you pay for what you take.
Extra usage
Beyond the included rows the key pauses (429) until you buy more credits or upgrade — prepaid, never billed after the fact.
Use
Embed canonical ids and derived fields in your own products, with attribution. Observed rows stay internal. No sublicensing. Annual term.
  • Canonical brands, products and SKUs with pack variants and identity atoms
  • Offers per location: price, availability, quantity, promotion
  • Distribution, pricing, category, competitive, expansion and penetration rollups
  • Menu change events and price history keyed by canonical ids; movement and stock-out signals labelled as estimates
  • Row-based metering with X-Rows-* usage headers on every response
  • Product-embedding rights for canonical ids and derived fields
  • Change-event feed for incremental sync

Menu Data: 60 requests per minute per key. Embedded Data License: 20 requests per second per key. X-RateLimit-Limit, X-RateLimit-Remaining and X-RateLimit-Reset on every response; 429 when a request quota is exceeded. Keys are entitled per state and per product; a key cannot read a state or a product it is not licensed for. 15% off annual contracts. Observed rows are licensed for internal use on every product; embedding raw rows in a third-party product is an enterprise agreement, not a rung.

Every number carries its receipts

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, our determination, or a modeled estimate.

observed

Read directly from a menu: a price, a stock flag, a store's strain type. A measured fact.

canonical

Determined by CannaiQ's matching: brand, product, SKU, pack size, category. Stable ids across stores.

derived

Computed from observed facts: door counts, price ranges, days on shelf. Denominators travel with every ratio.

estimated

Modeled signals such as movement and stock-outs. Always labeled, never presented as sales.

What each product serves

A deliberately lean REST surface. The full endpoint inventory, schemas and interactive explorer come with your key.

Menu Data

Listings

listing variant × store

Every variant a store publishes, with the store’s own names, categories, ids, prices, stock flag and quantity.

Menu Data

Stores

store

The store directory as published: name, address, coordinates, menu link, first and last observed.

Intelligence Data

Catalog

brand · product · SKU

The canonical registry: one id per brand, product and pack in a state, with identity atoms and the classification vocabulary.

Intelligence Data

Market

canonical ids × location

Markets, dispensaries, locations, brands, products, SKUs, offers, promotions, pricing and menu change events.

Intelligence Data

Analytics

state rollups

Pricing, category, placement, movement, stock-out, competitive overlap, expansion and penetration by brand, category and location.

Intelligence Data

Search

bounded lookup

Resolve a name to a canonical brand, product or store inside your entitled states.

One predictable shape

Every response returns data, a provenance label, an as_of timestamp, and a pagination block with what was returned and, where we can count it honestly, the total. Unknown is null, never zero.

  • Stable ids for diffing — a listing id holds while the variant stays on the menu; canonical ids hold across stores.
  • Inventory is point-in-time — the most recent read, not a rolling average.
  • Change events are first-class — new listings, delistings, price moves and stock changes, keyed either way.
{
  "data": [
    {
      "listing_id": "…",
      "raw_product_name": "Afternoon Delight #4 | Popcorn | 7G",
      "raw_option_label": "7g",
      "raw_brand_name": "RYTHM",
      "raw_category": "Flower",
      "raw_subcategory": "smalls-popcorn",
      "rec_price": "45.00",
      "rec_sale_price": null,
      "effective_price": "45.00",
      "in_stock": true,
      "quantity": null,
      "observed_at": "2026-09-22T15:11:14Z",
      "first_seen_at": "2026-08-30T09:40:02Z",
      "last_seen_at": "2026-09-22T15:11:14Z"
    }
  ],
  "provenance": "observed",
  "as_of": "2026-09-22T15:11:14Z",
  "pagination": { "limit": 500, "offset": 0, "returned": 1, "total": 457 }
}

Slice it your way

Every list endpoint speaks one query grammar — so you compose the view you need without us pre-building it.

Filter

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.

Page

Limit and offset on every list. Observed listings page up to 2,000 rows; Intelligence lists up to 500.

Changed since

Pull only what moved — menu change events by store or by canonical id — so an incremental sync is a few requests, not a re-read.

Resolve

Name a store or brand the way you know it and get its canonical id back, inside your entitled states.

Scoped & metered

Keys are entitled per state and per product, rate-limited, and metered per request or per row served — predictable and auditable, with usage headers on every response.

We never sell a number we can't see.

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.

Build on the shelf.

Tell us your states and how the data will be used and we'll issue the right product. Already using CannaiQ for brands or retailers? The API is the same data, programmatic.