Three exports. The first is live at /api/export (add ?format=csv for a spreadsheet, or leave it off for JSON); the other two are gzipped CSV files regenerated after each weekly pull and linked from the About tab (/api/export?scope=history and ?scope=batches redirect to the current file):
/api/export (no scope, the default) — current state, one row per product per operator. What the CSV columns below describe./exports/fl-menu-history.csv.gz — every check, one row per product per weekly check, so a price can be traced over time rather than seeing only the latest. Columns: HISTORY_COLUMNS below./exports/fl-menu-batches.csv.gz — every lab batch, one row per product per distinct set of lab numbers seen (the same product can carry several rows here — a new batch is a new set of numbers and its own certificate). Columns: BATCH_COLUMNS below./exports/manifest.json says when each file was generated and how many rows it holds. (fl-menu-export.csv.gz there is the same current-state export as /api/export, as a file.)
One row in the default export is one product at one dispensary chain (operator) — not one store; a chain sells the same product at the same price at every location, so one row per (product, operator) is the real shape of the data, and store / store_id / link_store say which location's menu the row was last read from. history and batches share most of the same column meanings; where a column below is only in one of the three, its row says so.
Where a value is "as reported", it is printed on the menu unchanged — nothing here is measured or inferred from a lab result. Where a value is "derived", it is computed from other columns in this same row, and the formula is given.
| Column | Meaning | Source | Units |
|---|---|---|---|
listing_id | This row's own database id. Stable across re-checks of the same product at the same operator. | database | integer |
mmtc | The dispensary chain's name ("MMTC" is Florida's licence term, Medical Marijuana Treatment Center). | operator registry | text |
mmtc_slug | The same chain, as a URL-safe short name (trulieve, muv). | operator registry | text |
operator_slug | The same value as mmtc_slug. Both names exist in this export for now — pick either; a future version may drop one. | operator registry | text |
store | The specific store location whose menu this row was last read from. | store list | text |
link_store | The same value as store, computed a second way. Kept for compatibility; always equal to store today. | store list | text |
city | The store's city. | store list | text |
store_id | The store's own database id. | database | integer |
brand | The product's brand, as the menu labels it. | as reported | text |
dedupe_key | An internal fingerprint (brand + name + size + form) used to recognize the same product across different stores and re-checks. Two rows with the same dedupe_key are the same product. | derived | text |
| Column | Meaning | Source | Units |
|---|---|---|---|
category | One of Flower, Pre-Rolls, Vapes, Concentrates, Edibles, Oral/Sublingual, Topical, Accessories. | derived from the menu's own category and the product name | text |
format | The specific form within a category — "Whole Flower" vs "Small Buds", "Live Rosin" vs "Live Resin", "RSO / FECO", and so on. | derived | text |
product | The cleaned product name — brand and size removed, so it reads the same everywhere it appears. | derived from the menu's product name | text |
strain | The strain name, where the menu states one. | as reported | text |
strain_type | indica, sativa or hybrid, where the menu states one. | as reported | text |
Flower, pre-rolls, vapes and concentrates are sold by weight (grams). Edibles, oral/sublingual products and topicals are sold by dose (milligrams of a cannabinoid). A product is one or the other, never both — the columns that do not apply to a given row are blank.
| Column | Meaning | Source | Units |
|---|---|---|---|
size_raw | The size exactly as printed on the menu ("3.5g", "1/8 oz", "100mg"). | as reported | text |
size_g | size_raw converted to grams, for a weight-sold product. Every price-per-gram figure is computed from this, not from size_class. | derived | grams |
size_ml | Volume, for a tincture or topical whose size is a liquid measure. | derived | millilitres |
unit_count | Pieces in a pack — 10 for a 10-pack of gummies, 5 for a 5-pack of pre-rolls. | as reported, or a documented rule where the menu states a count but not a total | integer |
unit_size_g | The weight of ONE piece in a pre-roll pack ("5 × 0.5 g" → 0.5). | derived | grams |
size_class | A standardized shelf-size key used for grouping — flower:3.5g, edible:100mg, oral:1500mg:cbd. Not shown to a reader; it is the thing "every eighth, cheapest first" groups on. | derived | text (key) |
size_label | The size as a reader sees it — "Eighth (3.5 g)", "100 mg THC (10 × 10 mg per piece)". | derived | text |
size_tier | standard (a common size, snapped to the nearest usual step), other (a real but uncommon size, kept exact), or unknown (no usable size was found). | derived | text (enum) |
package_id | The state's METRC package (batch) number for this specific product, where the operator's menu publishes one. This is the number a lab portal asks for to look up a certificate directly. | as reported | text |
| Column | Meaning | Source | Units |
|---|---|---|---|
price | The price actually charged right now (after any markdown). | as reported | USD |
price_original | The pre-discount "list" price, where the menu shows one crossed out. Blank when there is no markdown. | as reported | USD |
discount_pct | How deep the current markdown is. | derived: (price_original - price) / price_original | percent |
bundle_unit_price | The effective per-unit price if buying the quantity a bundle deal requires (e.g. "2 for $30"). | as reported | USD |
bundle_qty | How many units the bundle price requires. | as reported | integer |
promo_names | The name(s) of any promotion in effect, as the menu worded them. In a market where most of the shelf is discounted most of the time, this is often the real price story. | as reported | text |
price_per_g | Price per gram, for weight-sold categories — the number that lets a 3.5 g eighth be compared against a 7 g quarter. | derived: price / size_g | USD/g |
price_per_mg_thc | Price per milligram of THC — the number that lets a cartridge, an eighth and an edible be compared on one axis. For a dose-sold product it divides by thc_mg directly; for a weight-sold one, by the THC that weight and total_thc_pct imply (size_g × 1000 × total_thc_pct / 100). | derived | USD/mg |
A menu can publish THC three different ways, and they are not interchangeable:
thca_pct — THCA, the acidic (non-intoxicating) form the plant actually contains before it is heated.thc_pct — THC as the menu's own field labeled it. On most Florida menus this is either the decarboxylated total already, or the same figure total_thc_pct would compute — read the menu's own label, not this column alone, if the distinction matters to you.total_thc_pct — the decarboxylated total, which is what "% THC" means in ordinary use. Computed from THCA and THC together when the menu publishes both.| Column | Meaning | Source | Units |
|---|---|---|---|
thc_pct | THC as the menu's own field, whatever it represents there (see above). | as reported | percent by weight |
thca_pct | THCA as reported. | as reported | percent by weight |
total_thc_pct | The decarboxylated total: thca_pct × 0.877 + thc_pct where both are published, otherwise whichever one is. | derived | percent by weight |
thc_mg | Milligrams of THC in the package, for a dose-sold product (an edible, a tincture, a capsule). This is what price_per_mg_thc divides by for those categories. | as reported, or a documented rule where the menu states pieces and one piece's dose but not the package total | milligrams |
cbd_pct | CBD as reported. | as reported | percent by weight |
cbd_mg | Milligrams of CBD in the package, for a dose-sold product. | as reported | milligrams |
total_terpenes_pct | Total terpene content, where the operator publishes one figure for it. | as reported | percent by weight |
terpenes_json | The individual terpenes and their percentages, as a JSON array ([{"name":"myrcene","pct":0.42}, ...]), where the operator's menu or certificate breaks them out rather than giving one total. Blank when only a total is published. | as reported | JSON text |
| Column | Meaning | Source | Units |
|---|---|---|---|
coa_url | Link to the certificate of analysis (lab report) for this specific batch, where the dispensary's menu links one. A blank here means no link was found on the menu — it does not mean the batch was not tested; see the About page's "what it cannot tell you". | as reported | URL |
source_url | The menu page this listing was actually captured from. | capture metadata | URL |
product_url | The product's own page on the operator's site, where the operator publishes one (distinct from source_url, the category page it was captured alongside others on). | as reported | URL |
observed_at | When this listing was seen on the menu (the date the price and potency in this row are as of). | capture metadata | ISO date/time |
last_seen | The most recent time this listing was captured at all, whether or not anything changed. | database | ISO date/time |
review_status | unverified (the normal state on almost every row — recorded as printed, not hand-checked) or out_of_state (this listing was identified as a product not actually sold in Florida and is excluded from the site's public browse, though it remains in this export for transparency). suspect is a reserved value, for a figure that looks wrong but was still recorded faithfully because what the menu claims is itself the data point; nothing currently sets it. | derived / operator note | text (enum) |
notes | Free-text notes, where a human added one. | operator note | text |
scope=history — one row per product per checkEvery column above under Identity, What it is, Size and Price applies here too, minus the ones that only make sense for current state (listing_id, dedupe_key's size_tier and size_pack/size_profile, price_per_g/price_per_mg_thc, coa_url and the rest of Provenance, review_status, notes). What is added:
| Column | Meaning | Source | Units |
|---|---|---|---|
observed_at | When this particular check happened — the row's own date, not "as of" anything. This is the column to plot a price against. | capture metadata | ISO date/time |
scope=batches — one row per product per lab batchIdentity and "What it is" columns are the same as the default export. What replaces Size, Price and Potency:
| Column | Meaning | Source | Units |
|---|---|---|---|
package_id | The batch's METRC package number, where published — the same meaning as in the default export. | as reported | text |
coa_url | The certificate of analysis for this specific batch. | as reported | URL |
thc_pct, thca_pct, total_thc_pct, thc_mg, cbd_pct, cbd_mg, total_terpenes_pct, terpenes_json | This batch's own potency and terpene figures — same meanings as in the default export's Potency section. | as reported | see above |
first_seen | The first check at which this batch's exact numbers were seen on this listing. | derived | ISO date/time |
last_seen | The most recent check at which they were still the numbers shown — a different thing from the default export's last_seen, which is about the listing, not the batch. Once a batch's numbers stop matching (a new certificate posted), a NEW row starts here with its own first_seen. | derived | ISO date/time |
seen_count | How many checks in a row this exact batch's numbers held, between first_seen and last_seen. | derived | integer |
---
Questions about a specific column, or a number that looks wrong: see the Corrections note on the About page.