cannabis-label-florida (v1)
The JobSchema for Florida MMTC dispensing labels — the label a Medical Marijuana Treatment Center affixes to every receptacle dispensed to a qualified patient. One job represents one dispensing transaction; the printer emits one label per unit of each line item (see Multiple line items).
This schema and its template implement the dispensing-label requirements of Fla. Stat. § 381.986(8)(e), principally § 381.986(8)(e)11.f, together with the Department of Health emergency rules 64ER20-31 (definitions) and 64ER20-32 (MMTC packaging and labeling). It is intended for a label-capable printer loaded with die-cut adhesive label stock, not a receipt printer.
The citations below describe how the schema and default template are designed to satisfy Florida regulation. They are provided for context and are not legal advice — the MMTC remains responsible for compliance, including confirming that the data it sends is accurate and complete.
Florida's emergency rules 64ER20-31 and 64ER20-32 are the current labeling rules. A permanent replacement, Rule 64-4.219, was proposed in May 2026 and is not yet adopted; this page describes the contract as it stands today.
Working in both states? See cannabis-label-maryland (v1) — the two labels carry deliberately different content, and the differences are noted below.
Metadata
| Field | Value |
|---|---|
name | cannabis-label-florida-v1 |
vertical | cannabis |
version | 1 |
source | apiV20 |
What this prints
Each job is a single dispensing transaction. Every printed label is self-contained: it repeats the shared transaction data (patient, physician, MMTC, dispense date) and carries the details of exactly one product, followed by the fixed statutory texts.
The label is plain by design — black sans-serif print on a white background, no product depictions and no decorative imagery. Florida requires smokable and edible receptacles to be plain, opaque and white (§ 381.986(8)(e)13. and 15.), and 64ER20-31 defines "plain" as black print lettering in a sans-serif font on white with no images other than the MMTC's department-approved logo and the marijuana universal symbol. A label affixed to such a receptacle cannot break that standard.
The universal symbol and your label stock
Element IX, the marijuana universal symbol, is red. It is expected to be pre-printed on the label stock — the printed content leaves the lower-left corner clear and never draws the symbol. The previews below show it in place, as it appears on stock that carries it. Stock for Florida must therefore carry the symbol; running this label on plain stock produces a label that is missing a required element. Confirm the symbol artwork and its position with your stock supplier before your first production run.
Multiple line items
As in Maryland, this does not print one combined ticket — it prints one label per product receptacle.
- Each entry in
line_items[]is one product. - An entry's
quantityis the number of units of that product, and one label prints per unit.quantity: 2produces two identical labels for that product. - The total number of labels printed is the sum of
quantityacross all line items. - Labels print in
line_itemsorder; within a line item, its N identical labels print consecutively. - The shared transaction block (patient, physician, MMTC, date) is identical on every label; only the product block and the conditional warning block change between products.
Why one label per unit
Florida requires the label to be firmly affixed to a receptacle (§ 381.986(8)(e)11.f) — the container in direct contact with the usable product (64ER20-31). Every dispensed container needs its own complete label; a single combined label covering several products is not compliant — hence one label per unit, per product.
Example
A job with three line items:
| Line item | product_name | quantity | Labels printed |
|---|---|---|---|
| 1 | Sunset Kush Whole Flower 3.5g | 1 | 1 |
| 2 | Calm Citrus Gel Chews 100mg | 2 | 2 |
| 3 | Balance Tincture 10mL | 1 | 1 |
| Total | 4 |
Four labels come off the printer, all carrying the same patient / physician / MMTC / date block. This is the example payload below.
Required content — the nine elements
Every label carries the nine elements required by Fla. Stat. § 381.986(8)(e)11.f(I)–(IX). Three of them are fixed content you do not send.
| # | Element | Field | Notes |
|---|---|---|---|
| I | Testing statement | — | Fixed text supplied by the template |
| II | MMTC name | mmtc.name | |
| III | Batch number, harvest number, date dispensed | line_items[].batch_number, line_items[].harvest_number, dispensed_date | Date printed as MM/DD/YYYY |
| IV | Certifying physician name | physician.name | |
| V | Patient name | patient.name | |
| VI | Product name, dosage form, THC and CBD concentration | line_items[].product_name, line_items[].dosage_form, line_items[].thc, line_items[].cbd | product_name is optional — send it when applicable |
| VII | Recommended dose | line_items[].recommended_dose | Wraps rather than truncating |
| VIII | Transfer-illegality warning | — | Fixed text supplied by the template |
| IX | Marijuana universal symbol | — | Pre-printed on the label stock — see above |
Route of administration — the field that gates the warnings
route_of_administration is a required enum on every line item. Its seven values are the Florida OMMU routes of administration from Rule 64ER22-8:
smoking · inhalation · edible · oral · sublingual · suppository · topical
Its value decides which conditional statutory block prints, so omitting it — or sending a value outside the list — is rejected with a 400 and nothing prints. That is deliberate: a missing route would otherwise produce a label that silently lacks a statutory warning, which is far worse than a failed request.
| Value | Additional content on the label | Additional required fields |
|---|---|---|
smoking | § 381.986(8)(e)13. warnings — see Smokable products | — |
edible | § 381.986(8)(e)15. block — see Edible products | ingredients, storage_instructions, expiration_date |
inhalation, oral, sublingual, suppository, topical | none | — |
dosage_form is printed, but it gates nothingSend both fields. dosage_form is a printed element (VI) — "whole flower", "pre-roll", "edible", "capsule", "tincture", "vaporizer cartridge", "topical" and so on. Its values are illustrative, not enumerated, and its spelling has no effect on which warnings print. Only route_of_administration does that.
Two routes are easy to get wrong: capsules are oral and tinctures are sublingual — not edible. Neither carries the edible block, and neither requires ingredients, storage_instructions or expiration_date.
Smokable products
When route_of_administration is smoking, the label carries the warnings required by § 381.986(8)(e)13. — a keep-away-from-children warning and a statement that marijuana smoke contains carcinogens and may negatively affect health. Both are fixed text; you do not send them.
inhalation deliberately does not carry the smoking warningsThis is not an oversight. § 381.986(1)(o) defines smoking as "burning or igniting a substance and inhaling the smoke," and a vaporizer cartridge does neither — so inhalation (vaporization) is its own route and the (8)(e)13. warnings do not attach to it.
Do not send smoking for a vaporizer cartridge to "be safe": it prints warnings the statute does not require for that product. A vaporizer product still carries the general § 381.986(8)(e)11. labeling requirements — which this label satisfies — and the § 381.986(8)(e)12. patient package insert, which is a separate document this label does not replace.
Edible products
When route_of_administration is edible, § 381.986(8)(e)15. requires additional content, and three fields become required: ingredients, storage_instructions and expiration_date. Sending route_of_administration: "edible" without them is a 400. The keep-away-from-children-and-pets warning and the federal-food-safety disclaimer are fixed text.
expiration_date is an ISO 8601 date and prints as MM/DD/YYYY.
How you compose ingredients matters
Rule 64ER20-32 governs how the ingredient list is written, not merely that one exists. It requires the list to be:
- In order of prominence.
- Written with each ingredient's common or usual name.
- Identifying major allergens in accordance with the Food Allergen Labeling and Consumer Protection Act of 2004 (Pub. L. 108-282, Title II), which the rule incorporates by reference.
The label prints the array in the order you send it, so array order is statutorily meaningful — sending your POS's SKU order produces a non-compliant list. None of the three requirements is checked for you; all three are the MMTC's duty, in the same way the product-name restriction is.
Identify allergens either inline — "soy lecithin (soy)" — or by sending the optional allergen_statement ("Contains: soy"), which prints on its own ALLERGENS: row beneath the ingredient list. FALCPA accepts either form, so neither is required; send allergen_statement only when your ingredient names do not already carry the allergens. Omit it and no row prints. Maximum 200 characters.
Florida puts FALCPA allergen identification on the dispensing label's ingredient list (64ER20-32) — this label. Maryland puts major-allergen identification on the processor's package label (COMAR 14.17.18.03D), which is why cannabis-label-maryland (v1) carries neither an ingredient list nor an allergen field.
Both are correct for their state. Neither omission is an oversight, and the two should not be harmonized — sending Florida-shaped data to Maryland, or expecting a Maryland-shaped payload to satisfy Florida, gets one of them wrong.
Fixed text supplied by the template
The following appear on the label as fixed text — you do not send any of them in orderData:
| Text | When it prints |
|---|---|
| "This product meets the testing requirements of s. 381.986(8)(e), Florida Statutes." | Every label (element I) |
| "WARNING: It is illegal to transfer medical marijuana to another person." | Every label (element VIII) |
| "KEEP AWAY FROM CHILDREN." and "Marijuana smoke contains carcinogens and may negatively affect health." | route_of_administration: "smoking" |
| "KEEP AWAY FROM CHILDREN AND PETS." and "This product has not been produced or inspected pursuant to federal food safety laws." | route_of_administration: "edible" |
Formatting the data you send
The template prints the data you send largely verbatim, with a few regulation-driven rules to be aware of when populating orderData:
- Prohibited wording in
product_name. The product name is printed verbatim and the label adds no wording of its own, so the name you send "may not contain wording commonly associated with products that are attractive to children or which promote the recreational use of marijuana" (§ 381.986(8)(e)11.f(VI)). Enforcement is the MMTC's duty — the name is not screened for you. - Concentrations print amount then unit.
thcandcbdare{ amount, unit }pairs, printed as sent —22.4%,100 mg,5 mg/ml. Send the numeric value; a value below 1 prints with its leading zero (0.1%). - Legibility, not a point size. Florida sets no minimum point size — the standard is that the label be "firmly affixed and legible." Required content is never truncated: long text wraps and the type is fitted to the label. A dense edible label with a long
recommended_doseand a long ingredient list prints at a smaller size than a flower label. Keeprecommended_doseconcise and the ingredient list to the product's actual ingredients. - English. Template captions and the fixed warnings are in English. Product data you send is printed as supplied.
- Dates.
dispensed_dateandexpiration_dateare ISO 8601 dates (YYYY-MM-DD) and print asMM/DD/YYYY.
What this label does not include
Some Florida requirements are not discharged by this label. Printing a compliant label does not complete your packaging obligations:
- The patient package insert (§ 381.986(8)(e)12.) — a separate seven-topic document that goes inside the package. It is a distinct print job, not part of this label.
- Individually wrapped single servings of a multi-serving edible (64ER20-32) — an MMTC packaging duty this label does not satisfy.
- The receptacle requirements themselves — plain, opaque and white — which attach to the container, not to the sticker on it.
- Maryland- or California-style government warning paragraphs, Poison Center numbers and net-weight dual units. These are not Florida label elements; do not import them from another state's payload.
Shape
orderData: object
├── id: string # required — dispensing-transaction identifier (minLength 1)
├── dispensed_date: string (date) # required — ISO 8601 date, e.g. "2026-07-31"
├── mmtc: { # required
│ name, # required
│ license_number?, phone?, website?, address?
│ }
├── patient: { # required
│ name, # required
│ patient_id? # optional (not a printed element)
│ }
├── physician: { name } # required
└── line_items: [FloridaLabelItem, ...] # required — minItems 1
FloridaLabelItem
{
quantity: integer (≥ 1), # required — one label prints per unit
product_name?: string, # optional — element VI, "if applicable"
dosage_form: string, # required — printed only; e.g. "whole flower",
# "pre-roll", "edible", "capsule", "tincture"
route_of_administration: # required — gates the conditional blocks
"smoking" | "inhalation" | "edible" | "oral"
| "sublingual" | "suppository" | "topical",
thc: { # required
amount: number (≥ 0), # required
unit: "mg" | "%" | "mg/ml" # required
| "mg/g"
},
cbd: { amount, unit }, # required — same shape as thc
recommended_dose: string, # required
batch_number: string, # required
harvest_number: string, # required
# required when route_of_administration is "edible", otherwise optional:
ingredients?: [string, ...], # order of prominence — see above
storage_instructions?: string,
expiration_date?: string (date), # ISO 8601 date
allergen_statement?: string # always optional — maxLength 200
}
orderData is validated strictly — unknown/extra properties are rejected. Note that the root object uses mmtc and physician, where Maryland uses dispensary and certifying_provider; a Maryland payload will not validate here.
Required fields
| Scope | Required fields |
|---|---|
orderData (root) | id, dispensed_date, mmtc, patient, physician, line_items |
each line_items[] entry | quantity, dosage_form, route_of_administration, thc, cbd, recommended_dose, batch_number, harvest_number |
each line_items[] entry where route_of_administration is "edible" | the above, plus ingredients, storage_instructions, expiration_date |
thc / cbd | amount, unit |
dispensed_date and expiration_date must be ISO 8601 dates (YYYY-MM-DD).
webhook_url and webhook_method are also required on every job creation, but live at the root of the POST body (alongside printerId), not inside orderData. See the Create job page.
The callback sent to webhook_url carries only a state update — the Job id, the state change, your externalId, and timestamps. No orderData is transmitted to your webhook URL, so the patient block and patient_id you supply here are never sent to that endpoint. Retrieve them, if you need them, with an authenticated request to GET /v20/jobs/{jobId}.
Printed output
The default template produces a compact landscape label. The previews below are two of the four labels from the example — the smokable flower item and the edible item — shown side by side because the conditional block is the main difference between them.
The red universal symbol in the lower-left corner of each comes from the pre-printed label stock, not from the printer — the previews show it in place so they match the finished label. Run this label on plain stock and that corner comes out empty.
Smokable flower — carries the § 381.986(8)(e)13. warnings:

Edible — carries the § 381.986(8)(e)15. block: ingredients, allergens, storage, expiration, and the two edible warnings:

The tincture item (sublingual) prints neither block.
Example
Three line items — quantities 1, 2 and 1 — producing four labels. The first is a smokable product and carries the § 381.986(8)(e)13. warnings; the second is an edible and carries the § 381.986(8)(e)15. block; the third is a tincture, sublingual, and carries neither.
{
"id": "FL-DISP-90417",
"dispensed_date": "2026-07-31",
"mmtc": {
"name": "Suncoast Wellness MMTC, LLC",
"license_number": "MMTC-2017-0042",
"phone": "813-555-0190",
"address": "4120 Gulf Breeze Pkwy, Tampa, FL 33607"
},
"patient": {
"name": "Robert Alvarez",
"patient_id": "P7Q4R2"
},
"physician": {
"name": "Dr. Elaine Whitfield, M.D."
},
"line_items": [
{
"quantity": 1,
"product_name": "Sunset Kush Whole Flower 3.5g",
"dosage_form": "whole flower",
"route_of_administration": "smoking",
"thc": { "amount": 22.4, "unit": "%" },
"cbd": { "amount": 0.1, "unit": "%" },
"recommended_dose": "Inhale one inhalation; wait 10 minutes before repeating. Do not exceed 3 inhalations per dose.",
"batch_number": "SW-FLW-260614",
"harvest_number": "H-2026-0601-03"
},
{
"quantity": 2,
"product_name": "Calm Citrus Gel Chews 100mg",
"dosage_form": "edible",
"route_of_administration": "edible",
"thc": { "amount": 100, "unit": "mg" },
"cbd": { "amount": 0, "unit": "mg" },
"recommended_dose": "One 10 mg gel chew by mouth; wait at least 2 hours before a second dose.",
"batch_number": "SW-EDB-260620",
"harvest_number": "H-2026-0528-01",
"ingredients": [
"glucose syrup",
"sugar",
"pectin",
"citric acid",
"natural citrus flavor",
"soy lecithin",
"cannabis extract"
],
"allergen_statement": "Contains: soy",
"storage_instructions": "Store in a cool, dry place away from direct sunlight.",
"expiration_date": "2026-12-20"
},
{
"quantity": 1,
"product_name": "Balance Tincture 10mL",
"dosage_form": "tincture",
"route_of_administration": "sublingual",
"thc": { "amount": 5, "unit": "mg/ml" },
"cbd": { "amount": 5, "unit": "mg/ml" },
"recommended_dose": "0.25 mL under the tongue; wait 2 hours before repeating.",
"batch_number": "SW-TIN-260701",
"harvest_number": "H-2026-0605-02"
}
]
}
This orderData is the body of a POST /v20/jobs request (alongside printerId, webhook_url, and webhook_method). See Create job.