← FL Menu Intel

Data dictionary

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):

/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.

Identity

ColumnMeaningSourceUnits
listing_idThis row's own database id. Stable across re-checks of the same product at the same operator.databaseinteger
mmtcThe dispensary chain's name ("MMTC" is Florida's licence term, Medical Marijuana Treatment Center).operator registrytext
mmtc_slugThe same chain, as a URL-safe short name (trulieve, muv).operator registrytext
operator_slugThe same value as mmtc_slug. Both names exist in this export for now — pick either; a future version may drop one.operator registrytext
storeThe specific store location whose menu this row was last read from.store listtext
link_storeThe same value as store, computed a second way. Kept for compatibility; always equal to store today.store listtext
cityThe store's city.store listtext
store_idThe store's own database id.databaseinteger
brandThe product's brand, as the menu labels it.as reportedtext
dedupe_keyAn 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.derivedtext

What it is

ColumnMeaningSourceUnits
categoryOne of Flower, Pre-Rolls, Vapes, Concentrates, Edibles, Oral/Sublingual, Topical, Accessories.derived from the menu's own category and the product nametext
formatThe specific form within a category — "Whole Flower" vs "Small Buds", "Live Rosin" vs "Live Resin", "RSO / FECO", and so on.derivedtext
productThe cleaned product name — brand and size removed, so it reads the same everywhere it appears.derived from the menu's product nametext
strainThe strain name, where the menu states one.as reportedtext
strain_typeindica, sativa or hybrid, where the menu states one.as reportedtext

Size

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.

ColumnMeaningSourceUnits
size_rawThe size exactly as printed on the menu ("3.5g", "1/8 oz", "100mg").as reportedtext
size_gsize_raw converted to grams, for a weight-sold product. Every price-per-gram figure is computed from this, not from size_class.derivedgrams
size_mlVolume, for a tincture or topical whose size is a liquid measure.derivedmillilitres
unit_countPieces 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 totalinteger
unit_size_gThe weight of ONE piece in a pre-roll pack ("5 × 0.5 g" → 0.5).derivedgrams
size_classA 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.derivedtext (key)
size_labelThe size as a reader sees it — "Eighth (3.5 g)", "100 mg THC (10 × 10 mg per piece)".derivedtext
size_tierstandard (a common size, snapped to the nearest usual step), other (a real but uncommon size, kept exact), or unknown (no usable size was found).derivedtext (enum)
package_idThe 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 reportedtext

Price

ColumnMeaningSourceUnits
priceThe price actually charged right now (after any markdown).as reportedUSD
price_originalThe pre-discount "list" price, where the menu shows one crossed out. Blank when there is no markdown.as reportedUSD
discount_pctHow deep the current markdown is.derived: (price_original - price) / price_originalpercent
bundle_unit_priceThe effective per-unit price if buying the quantity a bundle deal requires (e.g. "2 for $30").as reportedUSD
bundle_qtyHow many units the bundle price requires.as reportedinteger
promo_namesThe 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 reportedtext
price_per_gPrice 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_gUSD/g
price_per_mg_thcPrice 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).derivedUSD/mg

Potency

A menu can publish THC three different ways, and they are not interchangeable:

ColumnMeaningSourceUnits
thc_pctTHC as the menu's own field, whatever it represents there (see above).as reportedpercent by weight
thca_pctTHCA as reported.as reportedpercent by weight
total_thc_pctThe decarboxylated total: thca_pct × 0.877 + thc_pct where both are published, otherwise whichever one is.derivedpercent by weight
thc_mgMilligrams 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 totalmilligrams
cbd_pctCBD as reported.as reportedpercent by weight
cbd_mgMilligrams of CBD in the package, for a dose-sold product.as reportedmilligrams
total_terpenes_pctTotal terpene content, where the operator publishes one figure for it.as reportedpercent by weight
terpenes_jsonThe 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 reportedJSON text

Provenance

ColumnMeaningSourceUnits
coa_urlLink 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 reportedURL
source_urlThe menu page this listing was actually captured from.capture metadataURL
product_urlThe 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 reportedURL
observed_atWhen this listing was seen on the menu (the date the price and potency in this row are as of).capture metadataISO date/time
last_seenThe most recent time this listing was captured at all, whether or not anything changed.databaseISO date/time
review_statusunverified (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 notetext (enum)
notesFree-text notes, where a human added one.operator notetext

scope=history — one row per product per check

Every 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:

ColumnMeaningSourceUnits
observed_atWhen this particular check happened — the row's own date, not "as of" anything. This is the column to plot a price against.capture metadataISO date/time

scope=batches — one row per product per lab batch

Identity and "What it is" columns are the same as the default export. What replaces Size, Price and Potency:

ColumnMeaningSourceUnits
package_idThe batch's METRC package number, where published — the same meaning as in the default export.as reportedtext
coa_urlThe certificate of analysis for this specific batch.as reportedURL
thc_pct, thca_pct, total_thc_pct, thc_mg, cbd_pct, cbd_mg, total_terpenes_pct, terpenes_jsonThis batch's own potency and terpene figures — same meanings as in the default export's Potency section.as reportedsee above
first_seenThe first check at which this batch's exact numbers were seen on this listing.derivedISO date/time
last_seenThe 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.derivedISO date/time
seen_countHow many checks in a row this exact batch's numbers held, between first_seen and last_seen.derivedinteger

---

Questions about a specific column, or a number that looks wrong: see the Corrections note on the About page.