{
  "schemaVersion": 1,
  "language": "zpl",
  "name": "ZPL",
  "fullName": "Zebra Programming Language",
  "canonicalUrl": "https://rfid.me/reference/zpl/",
  "reuseNotice": "No reuse license is granted by this export. Consult the upstream package or repository terms before reusing the data.",
  "commandCount": 215,
  "commands": [
    {
      "command": "^XA",
      "name": "Start Label",
      "description": "This is like pressing \"New Document\". Every ZPL label must begin with ^XA — it tells the printer \"I'm about to describe a label\".",
      "category": "structure",
      "syntax": "^XA",
      "parameters": [],
      "whenToUse": "Always. It's the very first thing in every label.",
      "example": {
        "source": "^XA\n^FO50,50^A0N,30,30^FDHello^FS\n^XZ",
        "description": "The simplest possible label — just \"Hello\""
      },
      "previewSupported": true,
      "canonicalUrl": "https://rfid.me/reference/zpl/xa/"
    },
    {
      "command": "^XZ",
      "name": "End Label",
      "description": "This tells the printer \"I'm done describing this label, go ahead and print it\" — `^XZ` ends the format AND flushes the accumulated buffer to the print engine for execution.",
      "category": "structure",
      "syntax": "^XZ",
      "parameters": [],
      "whenToUse": "Always. It is the print trigger — without `^XZ`, the printer holds the format in its buffer indefinitely and nothing prints. The `^XA`…`^XZ` pair brackets every executable label.",
      "example": {
        "source": "^XA\n^FO50,50^A0N,30,30^FDDone!^FS\n^XZ",
        "description": "`^XZ` at the end triggers the print. Remove `^XZ` and the printer waits forever."
      },
      "previewSupported": true,
      "canonicalUrl": "https://rfid.me/reference/zpl/xz/"
    },
    {
      "command": "^FS",
      "name": "Field Separator",
      "description": "Terminates the current field — tells the printer \"that field is complete, commit it to the label\". Fields are NOT implicitly closed: most field commands (`^FD`, `^GB`, `^GE`, etc.) need an explicit `^FS` to end them.",
      "category": "structure",
      "syntax": "^FS",
      "parameters": [],
      "whenToUse": "After every field — text, barcode, box, or any content element. Omitting `^FS` between two fields can cause them to merge or behave unpredictably depending on firmware.",
      "example": {
        "source": "^XA\n^FO50,50^A0N,30,30^FDFirst^FS\n^FO50,90^A0N,30,30^FDSecond^FS\n^XZ",
        "description": "Each text field ends with `^FS`. Drop the first `^FS` and \"First\" + \"Second\" may merge."
      },
      "previewSupported": true,
      "canonicalUrl": "https://rfid.me/reference/zpl/fs/"
    },
    {
      "command": "^FX",
      "name": "Comment",
      "description": "A comment — the printer completely ignores everything between ^FX and the next ^FS. Use it to add notes to your ZPL so other people (or future you) can understand what each section does.",
      "category": "structure",
      "syntax": "^FX comment text",
      "parameters": [
        {
          "name": "text",
          "description": "Any text you want — the printer ignores it"
        }
      ],
      "whenToUse": "When you want to annotate your ZPL for readability. Great for complex labels.",
      "example": {
        "source": "^XA\n^FX Header section\n^FO50,30^A0N,40,40^FDInvoice^FS\n^FX Barcode section\n^FO50,100^BY2^BCN,80,Y^FD12345^FS\n^XZ",
        "description": "Comments labelling each section of a label"
      },
      "previewSupported": true,
      "canonicalUrl": "https://rfid.me/reference/zpl/fx/"
    },
    {
      "command": "^FO",
      "name": "Field Origin",
      "description": "Sets where the next field is placed, **relative to the current `^LH`** (label home). x is how far from the label-home origin horizontally, y is how far down. Measured in printer dots — about 8 dots/mm at 203 dpi, 12 dots/mm at 300 dpi. With no `^LH` set, `^FO` is relative to the label corner.",
      "category": "position",
      "syntax": "^FOx,y",
      "parameters": [
        {
          "name": "x",
          "description": "Horizontal position in dots, added to `^LH` x"
        },
        {
          "name": "y",
          "description": "Vertical position in dots, added to `^LH` y"
        }
      ],
      "whenToUse": "Before every field. This is the most-used command after `^XA`/`^XZ`. If you set `^LH50,50` and then `^FO10,10`, the field actually lands at (60,60) — `^FO` adds to `^LH`.",
      "example": {
        "source": "^XA\n^LH50,50\n^FO10,10^A0N,25,25^FDActual position is (60,60)^FS\n^XZ",
        "description": "`^FO` composes with `^LH` — both contribute to final position. Physical mm depends on printer DPI."
      },
      "previewSupported": true,
      "canonicalUrl": "https://rfid.me/reference/zpl/fo/"
    },
    {
      "command": "^FT",
      "name": "Field Typeset",
      "description": "Like `^FO`, but `y` is the text **baseline** (where letter bottoms sit, with descenders extending below) instead of the **top-left** of the bounding box. With `^FO` at (100,100) the glyph top sits at 100; with `^FT` at (100,100) the glyph baseline sits at 100 and the body of the letters extends upward.",
      "category": "position",
      "syntax": "^FTx,y",
      "parameters": [
        {
          "name": "x",
          "description": "Horizontal position in dots, relative to `^LH`"
        },
        {
          "name": "y",
          "description": "Vertical **baseline** position in dots, relative to `^LH` (NOT the glyph top)"
        }
      ],
      "whenToUse": "When text must sit on an exact line regardless of font size — invoice totals aligned to a rule, mixed font sizes on the same line, baseline-anchored layouts ported from other typographic systems. Use `^FO` when you want the glyph top-left at a known position instead.",
      "example": {
        "source": "^XA\n^FT50,100^A0N,30,30^FDText^FS\n^XZ",
        "description": "The letter baseline sits at y=100; descenders (g, j, p, q, y) drop below this line."
      },
      "previewSupported": true,
      "canonicalUrl": "https://rfid.me/reference/zpl/ft/"
    },
    {
      "command": "^LH",
      "name": "Label Home",
      "description": "Shifts the origin for ALL subsequent positioning commands (`^FO`, `^FT`) by a fixed amount, in printer **dots**. If you set `^LH30,30`, then `^FO0,0` actually prints at (30,30). Like setting page margins — instead of changing every `^FO`, you offset the whole layout in one place.",
      "category": "position",
      "syntax": "^LHx,y",
      "parameters": [
        {
          "name": "x",
          "description": "Horizontal offset in dots — added to every subsequent `^FO`/`^FT` x"
        },
        {
          "name": "y",
          "description": "Vertical offset in dots — added to every subsequent `^FO`/`^FT` y"
        }
      ],
      "whenToUse": "When printing on pre-printed label stock where the printable area doesn't start at the edge, or to quickly shift an entire design. Remember units are **printer dots**, so 100 dots is ~12.5 mm on a 203 dpi printer and ~8.5 mm on a 300 dpi printer.",
      "example": {
        "source": "^XA\n^LH20,20\n^FO0,0^A0N,25,25^FDThis prints at 20,20^FS\n^XZ",
        "description": "Label home shifts all content inward by 20 dots — physical mm depends on printer DPI."
      },
      "previewSupported": true,
      "canonicalUrl": "https://rfid.me/reference/zpl/lh/"
    },
    {
      "command": "^LS",
      "name": "Label Shift",
      "description": "Shifts the entire label left or right. Unlike ^LH which sets a home position, ^LS is specifically for horizontal adjustments — useful when the label stock is slightly misaligned in the printer.",
      "category": "position",
      "syntax": "^LSn",
      "parameters": [
        {
          "name": "n",
          "description": "Dots to shift left (negative) or right (positive)"
        }
      ],
      "whenToUse": "When labels are printing slightly off-centre and you need a quick horizontal fix.",
      "example": {
        "source": "^XA\n^LS10\n^FO50,50^A0N,25,25^FDShifted right 10 dots^FS\n^XZ",
        "description": "Entire label content shifted 10 dots right"
      },
      "previewSupported": true,
      "canonicalUrl": "https://rfid.me/reference/zpl/ls/"
    },
    {
      "command": "^LT",
      "name": "Label Top",
      "description": "Shifts the entire label up or down. The vertical equivalent of ^LS — for when labels are printing too high or too low.",
      "category": "position",
      "syntax": "^LTn",
      "parameters": [
        {
          "name": "n",
          "description": "Dots to shift up (negative) or down (positive)"
        }
      ],
      "whenToUse": "Fine-tuning vertical alignment when label stock is slightly off.",
      "example": {
        "source": "^XA\n^LT-10\n^FO50,50^A0N,25,25^FDShifted up 10 dots^FS\n^XZ",
        "description": "Content shifted up by 10 dots"
      },
      "previewSupported": true,
      "canonicalUrl": "https://rfid.me/reference/zpl/lt/"
    },
    {
      "command": "^A0",
      "name": "Scalable Font",
      "description": "Selects the built-in scalable font and sets its size and rotation. This is the main font you'll use — it can be any size. The \"0\" is the font number (zero, not the letter O).",
      "category": "text",
      "syntax": "^A0o,h,w",
      "parameters": [
        {
          "name": "o",
          "description": "Rotation: N (normal), R (90° right), I (upside-down), B (270° right)"
        },
        {
          "name": "h",
          "description": "Character height in dots"
        },
        {
          "name": "w",
          "description": "Character width in dots (use 0 for auto/proportional)"
        }
      ],
      "whenToUse": "Before any text field where you want to control the font size. Almost every text field uses this.",
      "example": {
        "source": "^XA\n^FO50,30^A0N,50,50^FDBig Text^FS\n^FO50,90^A0N,20,20^FDSmall text^FS\n^FO50,130^A0R,30,30^FDRotated^FS\n^XZ",
        "description": "Three sizes and a rotated field"
      },
      "previewSupported": true,
      "canonicalUrl": "https://rfid.me/reference/zpl/a0/"
    },
    {
      "command": "^A",
      "name": "Bitmap Font",
      "description": "Selects one of the built-in bitmap fonts (A through V). Unlike `^A0` which scales smoothly, these are fixed-size pixel fonts — crisp at their native size but blocky when scaled. The orientation parameter (N/R/I/B = 0°/90°/180°/270°) is part of the syntax, not optional.",
      "category": "text",
      "syntax": "^Af,o,h,w",
      "parameters": [
        {
          "name": "f",
          "description": "Font letter: A through V"
        },
        {
          "name": "o",
          "description": "Orientation: N (0°), R (90°), I (180°), B (270°)"
        },
        {
          "name": "h",
          "description": "Height (ignored for bitmap fonts — uses native size)"
        },
        {
          "name": "w",
          "description": "Width (ignored for bitmap fonts)"
        }
      ],
      "whenToUse": "Before each `^FD` whose font you want to control. **`^A` only applies to the next field**, so it must come *before* the `^FD` of that field — placing `^A` after `^FD` (or omitting the order) leaves the field on whatever font was last set. Fonts A-H are monospaced (every character same width), P-V are proportional.",
      "example": {
        "source": "^XA\n^FO50,50^AAN^FDFont A - small^FS\n^FO50,80^ADN^FDFont D - medium^FS\n^FO50,120^AGR^FDRotated G^FS\n^XZ",
        "description": "Three bitmap fonts; the third uses orientation R for 90° rotation. `^A` precedes its `^FD`."
      },
      "previewSupported": true,
      "canonicalUrl": "https://rfid.me/reference/zpl/a/"
    },
    {
      "command": "^CF",
      "name": "Change Default Font",
      "description": "Sets the **global default** font and size for the rest of the label. Any text field that does not have its own `^A0`/`^A` override inherits the `^CF` setting. Persists until another `^CF` is encountered or the label ends.",
      "category": "text",
      "syntax": "^CFf,h,w",
      "parameters": [
        {
          "name": "f",
          "description": "Font: 0 (scalable) or A-V (bitmap)"
        },
        {
          "name": "h",
          "description": "Default height in dots"
        },
        {
          "name": "w",
          "description": "Default width in dots (optional)"
        }
      ],
      "whenToUse": "Near the top of the label when most text should share a single font/size — `^CF` is global, `^A` is per-field. A field-level `^A`/`^A0` always overrides the active `^CF` for just that field.",
      "example": {
        "source": "^XA\n^CF0,22\n^FO50,30^FDInherits ^CF default^FS\n^FO50,60^FDStill the default^FS\n^FO50,90^A0N,40,40^FDPer-field ^A overrides it^FS\n^XZ",
        "description": "Two fields inherit `^CF`; the third field uses `^A0` for a one-off override."
      },
      "previewSupported": true,
      "canonicalUrl": "https://rfid.me/reference/zpl/cf/"
    },
    {
      "command": "^FD",
      "name": "Field Data",
      "description": "The actual content — text to display, barcode data to encode, or an RFID payload to write. Everything between `^FD` and `^FS` is the data. When the field is preceded by `^FH`, the data may include hex-escape sequences (e.g. `\\20` for space, `\\0A` for newline) which the printer decodes into bytes.",
      "category": "text",
      "syntax": "^FDdata^FS",
      "parameters": [
        {
          "name": "data",
          "description": "The content: text, barcode number, RFID hex, or `^FH`-escaped sequence"
        }
      ],
      "whenToUse": "In every field that has content. `^FD` always pairs with `^FS`. Pair with `^FH` to embed control characters or non-printable bytes.",
      "example": {
        "source": "^XA\n^FH\\\n^FO50,50^A0N,30,30^FDLine 1\\0ALine 2^FS\n^XZ",
        "description": "`^FH\\` declares `\\` as the hex escape; `\\0A` decodes to a newline byte inside the field data."
      },
      "previewSupported": true,
      "canonicalUrl": "https://rfid.me/reference/zpl/fd/"
    },
    {
      "command": "^FW",
      "name": "Field Orientation",
      "description": "Sets the default rotation for all fields on the label. If you set ^FWR, every field will be rotated 90° unless it has its own rotation set via ^A0.",
      "category": "text",
      "syntax": "^FWo",
      "parameters": [
        {
          "name": "o",
          "description": "Default rotation: N (normal), R (90°), I (180°), B (270°)"
        }
      ],
      "whenToUse": "When you need the entire label rotated — for example, a vertical label on a shelf edge.",
      "example": {
        "source": "^XA\n^FWR\n^FO100,50^A0N,30,30^FDAll rotated 90°^FS\n^FO100,200^A0N,30,30^FDThis too^FS\n^XZ",
        "description": "Entire label content rotated 90° clockwise"
      },
      "previewSupported": true,
      "canonicalUrl": "https://rfid.me/reference/zpl/fw/"
    },
    {
      "command": "^FB",
      "name": "Field Block",
      "description": "Creates a text box with automatic word wrapping inside a fixed width. The printer breaks the text into lines and renders up to the configured maximum — **any text past `lines` is truncated, not overflowed**, so undersized blocks silently drop content.",
      "category": "text",
      "syntax": "^FBw,lines,space,align,indent",
      "parameters": [
        {
          "name": "w",
          "description": "Width of the text block in dots"
        },
        {
          "name": "lines",
          "description": "Maximum number of lines (extra lines are truncated, not overflowed)"
        },
        {
          "name": "space",
          "description": "Extra space between lines in dots (0 = auto from font)"
        },
        {
          "name": "align",
          "description": "L (left), C (centre), R (right), J (full-justified)"
        },
        {
          "name": "indent",
          "description": "Hanging indent in dots — applied to lines 2..n only (not line 1)"
        }
      ],
      "whenToUse": "For wrapped content where the box dimensions are known up-front (addresses, descriptions, compliance text). Set `lines` generously and verify wrapping with realistic worst-case data, otherwise long inputs will be silently cut.",
      "example": {
        "source": "^XA\n^FO50,50^A0N,22,22\n^FB400,3,5,C,0\n^FDThis is a long description that will wrap within 400 dots, centred, max 3 lines. Anything past three lines is dropped.^FS\n^XZ",
        "description": "3-line max, centre-justified. Worth confirming wrapping with realistic worst-case input."
      },
      "previewSupported": true,
      "canonicalUrl": "https://rfid.me/reference/zpl/fb/"
    },
    {
      "command": "^FH",
      "name": "Field Hex Indicator",
      "description": "Defines an **escape character** that the next `^FD` will use to introduce hex byte sequences. Default is underscore (`_`), but you can supply any single ASCII character as the argument (commonly `\\`). Each escape pair (`_NN` or `\\NN`) decodes to a single byte — letting you embed control characters (newline `_0A`, tab `_09`), special symbols (`_5E` for `^`, `_7E` for `~`), or non-ASCII bytes that the printer would otherwise treat as syntax.",
      "category": "text",
      "syntax": "^FH_",
      "parameters": [
        {
          "name": "esc",
          "description": "Single character used to introduce hex escape sequences (default `_`). Common alternatives: `\\` or `~`."
        }
      ],
      "whenToUse": "Immediately before the `^FD` whose data needs hex escapes. Scope is the next `^FD` only — repeat `^FH` for every field that needs it. Pair with `^CI` for non-ASCII text encoded as hex.",
      "example": {
        "source": "^XA\n^FH\\\n^FO50,50^A0N,30,30^FDLine 1\\0ALine 2^FS\n^XZ",
        "description": "`^FH\\` declares `\\` as the escape character; `\\0A` decodes to a newline byte, splitting the field into two lines."
      },
      "previewSupported": true,
      "canonicalUrl": "https://rfid.me/reference/zpl/fh/"
    },
    {
      "command": "^FN",
      "name": "Field Number",
      "description": "Creates a numbered placeholder in a stored label template. When you recall the template later, you fill in just the variable parts by their number — like mail merge in Word.",
      "category": "text",
      "syntax": "^FNn",
      "parameters": [
        {
          "name": "n",
          "description": "Field number (0-9999)"
        }
      ],
      "whenToUse": "When creating reusable label templates where some data changes each time (names, serial numbers, dates).",
      "example": {
        "source": "^XA\n^FO50,50^A0N,30,30^FN1^FS\n^FO50,90^A0N,20,20^FDAlways the same^FS\n^FO50,120^A0N,30,30^FN2^FS\n^XZ",
        "description": "Template with two variable fields (^FN1 and ^FN2)"
      },
      "previewSupported": true,
      "canonicalUrl": "https://rfid.me/reference/zpl/fn/"
    },
    {
      "command": "^FR",
      "name": "Field Reverse",
      "description": "Inverts the colours — black becomes white and white becomes black. Put it before any field to make white text on a black background. Works with text, barcodes, and graphics.",
      "category": "text",
      "syntax": "^FR",
      "parameters": [],
      "whenToUse": "When you want white text on a filled black bar, or any inverted/knockout effect.",
      "example": {
        "source": "^XA\n^FO50,50^GB400,50,50^FS\n^FO60,55^FR^A0N,35,35^FDWhite on black^FS\n^XZ",
        "description": "Filled bar with reversed (white) text on top"
      },
      "previewSupported": true,
      "canonicalUrl": "https://rfid.me/reference/zpl/fr/"
    },
    {
      "command": "^FP",
      "name": "Field Parameter (Direction & Spacing)",
      "description": "Sets two field-level rendering tweaks for the next `^FD`: direction (horizontal, vertical, or reverse) and inter-character gap. Different from `^A`'s rotation parameter — `^FP` controls how characters within the field are arranged, while `^A`'s orientation rotates the field as a whole.",
      "category": "text",
      "syntax": "^FPd,g",
      "parameters": [
        {
          "name": "d",
          "description": "Direction: `H` (horizontal, default), `V` (vertical — characters stacked top-to-bottom), `R` (reverse — characters laid right-to-left)"
        },
        {
          "name": "g",
          "description": "Extra gap between characters in dots (default 0). Negative values are not supported — characters cannot overlap via `^FP`."
        }
      ],
      "whenToUse": "For vertical text on narrow labels (spine labels, side panels), reverse layout for right-to-left scripts, or when default character spacing needs nudging. Place `^FP` between `^A` and `^FD` for the field you want to affect — scope is one field.",
      "example": {
        "source": "^XA\n^FO50,50^A0N,25,25^FPV,2^FDStacked^FS\n^XZ",
        "description": "Vertical layout with 2-dot extra spacing between each stacked character."
      },
      "previewSupported": true,
      "canonicalUrl": "https://rfid.me/reference/zpl/fp/"
    },
    {
      "command": "^TB",
      "name": "Text Block",
      "description": "A more modern version of ^FB. Creates a fixed-size text box with automatic word wrapping and rotation support. Preferred over ^FB on newer firmware.",
      "category": "text",
      "syntax": "^TBo,w,h",
      "parameters": [
        {
          "name": "o",
          "description": "Rotation: N, R, I, B"
        },
        {
          "name": "w",
          "description": "Block width in dots"
        },
        {
          "name": "h",
          "description": "Block height in dots"
        }
      ],
      "whenToUse": "Same as ^FB — for word-wrapped text. Use ^TB if your printer supports it (firmware V60.14+).",
      "example": {
        "source": "^XA\n^FO50,50^A0N,20,20\n^TBN,400,200\n^FDThis text will wrap inside a 400x200 dot box automatically.^FS\n^XZ",
        "description": "Modern text block with wrapping"
      },
      "previewSupported": true,
      "canonicalUrl": "https://rfid.me/reference/zpl/tb/"
    },
    {
      "command": "^SN",
      "name": "Serialization",
      "description": "Automatically increments a number across multiple labels. If you're printing 100 labels with sequential serial numbers, you don't need to send 100 separate labels — just one with ^SN and ^PQ.",
      "category": "text",
      "syntax": "^SNstart,step,count",
      "parameters": [
        {
          "name": "start",
          "description": "Starting value"
        },
        {
          "name": "step",
          "description": "How much to increment each label"
        },
        {
          "name": "count",
          "description": "How many digits to serialise (from the right)"
        }
      ],
      "whenToUse": "When printing batches of labels with sequential numbers (serial numbers, shelf labels, tickets).",
      "example": {
        "source": "^XA\n^FO50,50^A0N,30,30^FD001^FS\n^FO50,50^SN001,1,3\n^PQ10\n^XZ",
        "description": "Prints 10 labels numbered 001 through 010"
      },
      "previewSupported": true,
      "canonicalUrl": "https://rfid.me/reference/zpl/sn/"
    },
    {
      "command": "^CI",
      "name": "Character Encoding",
      "description": "Selects how the printer interprets the bytes inside subsequent `^FD` fields. Without `^CI`, non-ASCII characters render as garbled bytes whose appearance depends on the printer's default code page. `^CI28` (UTF-8) is the right choice for almost all modern multilingual labels.",
      "category": "text",
      "syntax": "^CIn",
      "parameters": [
        {
          "name": "n",
          "description": "Encoding ID. Common values: 0 (USA-1), 7 (USA-2), 13 (Latin-1 / ISO 8859-1, Western European), 17 (Asian), 27 (UTF-8 alias), 28 (Unicode UTF-8 — recommended), 29 (UTF-16 BE), 30 (UTF-16 LE), 31 (UTF-32). 0–14 are pre-Unicode legacy code pages."
        }
      ],
      "whenToUse": "Whenever the label contains anything outside basic ASCII — accents (é, ü, ñ), currency symbols (€, £), Cyrillic, CJK. Place `^CI` once per label, before any non-ASCII `^FD`. Mismatching `^CI` and the actual byte encoding produces silently wrong glyphs.",
      "example": {
        "source": "^XA\n^CI28\n^FO50,50^A0N,30,30^FDCafé résumé naïve^FS\n^XZ",
        "description": "`^CI28` enables UTF-8 so accented Latin characters render correctly. Drop the `^CI28` line and the printer falls back to its default code page — likely producing the wrong glyphs."
      },
      "previewSupported": true,
      "canonicalUrl": "https://rfid.me/reference/zpl/ci/"
    },
    {
      "command": "^GB",
      "name": "Graphic Box",
      "description": "Draws a rectangle. Thin and wide → horizontal line; thin and tall → vertical line; thick border → outlined box. **Fill rule:** when `t >= min(w, h)` the rectangle is rendered as a solid filled shape (handy for black bars and reverse-text backgrounds). Corner rounding (`r` 0-8) softens the corners — useful for badge-style headers.",
      "category": "graphics",
      "syntax": "^GBw,h,t,c,r",
      "parameters": [
        {
          "name": "w",
          "description": "Width in dots (1–32000)"
        },
        {
          "name": "h",
          "description": "Height in dots (1–32000)"
        },
        {
          "name": "t",
          "description": "Border thickness in dots. Fill triggers when `t >= w` or `t >= h`."
        },
        {
          "name": "c",
          "description": "Colour: `B` (black) or `W` (white). White on black background reverses out the underlying area."
        },
        {
          "name": "r",
          "description": "Corner rounding: 0 (sharp) to 8 (most rounded)"
        }
      ],
      "whenToUse": "For divider lines between sections, borders around content, filled bars under reverse-printed text (`^FR`), or rounded badge backgrounds. To force a fill without computing thickness, set `t` to the larger of `w` and `h`.",
      "example": {
        "source": "^XA\n^FO50,50^GB500,2,2,B,0^FS\n^FO50,70^GB200,100,3,B,4^FS\n^FO50,190^GB200,40,40,B,0^FS\n^XZ",
        "description": "Three shapes: a 2-dot horizontal line, a 200×100 rounded outlined box (radius 4), and a solid black bar (`t=40 >= h=40` triggers fill)."
      },
      "previewSupported": true,
      "canonicalUrl": "https://rfid.me/reference/zpl/gb/"
    },
    {
      "command": "^GC",
      "name": "Graphic Circle",
      "description": "Draws a circle. You set the diameter and border thickness. Like ^GB, if the border is thick enough it fills solid.",
      "category": "graphics",
      "syntax": "^GCd,t,c",
      "parameters": [
        {
          "name": "d",
          "description": "Diameter in dots"
        },
        {
          "name": "t",
          "description": "Border thickness in dots"
        },
        {
          "name": "c",
          "description": "Colour: B (black) or W (white)"
        }
      ],
      "whenToUse": "For bullet points, status indicators, decorative elements, or any round shape on a label.",
      "example": {
        "source": "^XA\n^FO50,50^GC100,3,B^FS\n^FO200,50^GC100,50,B^FS\n^XZ",
        "description": "An outlined circle and a filled circle"
      },
      "previewSupported": true,
      "canonicalUrl": "https://rfid.me/reference/zpl/gc/"
    },
    {
      "command": "^GD",
      "name": "Graphic Diagonal",
      "description": "Draws a diagonal line inside a `w × h` bounding rectangle anchored at the current `^FO`. The `d` parameter picks which corner pair the line connects — `R` for top-left → bottom-right, `L` for top-right → bottom-left. The bounding box itself is not drawn; only the diagonal stroke.",
      "category": "graphics",
      "syntax": "^GDw,h,t,c,d",
      "parameters": [
        {
          "name": "w",
          "description": "Width of the bounding rectangle in dots — sets the horizontal span of the diagonal"
        },
        {
          "name": "h",
          "description": "Height of the bounding rectangle in dots — sets the vertical span of the diagonal"
        },
        {
          "name": "t",
          "description": "Line thickness in dots (1 minimum)"
        },
        {
          "name": "c",
          "description": "Colour: `B` (black) or `W` (white — knocks out underlying ink)"
        },
        {
          "name": "d",
          "description": "Direction: `R` = top-left → bottom-right (forward slash); `L` = top-right → bottom-left (back slash). Default `R`."
        }
      ],
      "whenToUse": "For crossing out a region (combine `R` + `L` for a void X), drawing arrow-stroke decorations, or precisely angled separator lines whose slope is set by the `w:h` ratio of the bounding box.",
      "example": {
        "source": "^XA\n^FO50,50^GD200,200,3,B,R^FS\n^FO50,50^GD200,200,3,B,L^FS\n^XZ",
        "description": "Two diagonals at the same `^FO` anchor, opposite directions, forming a \"void X\" inside a 200×200 box."
      },
      "previewSupported": true,
      "canonicalUrl": "https://rfid.me/reference/zpl/gd/"
    },
    {
      "command": "^GE",
      "name": "Graphic Ellipse",
      "description": "Draws an ellipse (oval) inside a `w × h` bounding box. When `w == h` the result is a circle. **Fill rule:** mirrors `^GB` — when `t >= min(w, h) / 2` the printer renders a solid filled shape rather than a stroked outline. White (`c = W`) knocks out the underlying ink.",
      "category": "graphics",
      "syntax": "^GEw,h,t,c",
      "parameters": [
        {
          "name": "w",
          "description": "Width in dots (3–4095)"
        },
        {
          "name": "h",
          "description": "Height in dots (3–4095). Equal to `w` for a circle."
        },
        {
          "name": "t",
          "description": "Border thickness in dots. Fill triggers when `t >= min(w, h) / 2`."
        },
        {
          "name": "c",
          "description": "Colour: `B` (black) or `W` (white — knocks out underlying ink for spot effects)."
        }
      ],
      "whenToUse": "For oval shapes, circular badge backgrounds, or knock-out spotlights over filled regions. To force a solid filled circle, set `t >= w/2` (with `w == h`); to force a clean outline, keep `t` well below `min(w,h)/2`.",
      "example": {
        "source": "^XA\n^FO50,50^GE300,100,3,B^FS\n^FO400,50^GE100,100,50,B^FS\n^XZ",
        "description": "Wide outlined ellipse on the left; on the right, a 100×100 with `t=50` triggers fill — solid black circle."
      },
      "previewSupported": true,
      "canonicalUrl": "https://rfid.me/reference/zpl/ge/"
    },
    {
      "command": "^GF",
      "name": "Graphic Field (Image)",
      "description": "Embeds a 1-bit-per-pixel bitmap directly in the ZPL stream. Three encodings: **A** (ASCII hex — portable, ~2× larger), **B** (binary — smaller but printer must accept binary safely), **Z**/**C** (Zebra LZ77-compressed — smallest, ideal for slow links). You normally do not author this by hand — a converter (`zebra-image-converter`, ImageMagick + script, or rfid.me's image tool) turns a PNG / SVG / logo into the `^GF` data.",
      "category": "graphics",
      "syntax": "^GFa,b,c,bpr,data",
      "parameters": [
        {
          "name": "a",
          "description": "Encoding: `A` (ASCII hex, default), `B` (binary), `C` or `Z` (Zebra LZ77-compressed)"
        },
        {
          "name": "b",
          "description": "Total bytes that will be sent (after decoding for ASCII; compressed length for `Z`)"
        },
        {
          "name": "c",
          "description": "Total bytes in the resulting bitmap (uncompressed). For ASCII/binary equals `b`; for compressed `b < c`."
        },
        {
          "name": "bpr",
          "description": "Bytes per row of the bitmap. Image width in pixels = `bpr * 8` (1 bit per pixel, MSB-first)."
        },
        {
          "name": "data",
          "description": "Encoded bitmap payload. Linewise ASCII hex (`A`), or a ZB64 envelope: `:B64:<base64>:<crc>` (base64 of raw bytes) or `:Z64:<base64>:<crc>` (base64 of zlib-deflated bytes). The `<crc>` is a CRC-16/XMODEM over the base64 text. All three forms render in the playground."
        }
      ],
      "whenToUse": "For company logos, icons, or any one-off image on a label. For repeat-use logos, store once with `~DG` then recall with `^XG` — much less data per label. Choose encoding by transport: ASCII (`A`) for safety, compressed (`Z`) for slow serial links, binary (`B`) for fastest local USB.",
      "example": {
        "source": "^XA\n^FO50,50\n^GFA,48,48,2,\nFFFF\nC003\nBFFD\nBFFD\nC003\nFFFF\n^FS\n^XZ",
        "description": "6 rows × 2 bytes/row = a 16-pixel-wide × 6-tall bitmap (`A` ASCII hex). For real logos, generate with a converter — the encoding is rarely written by hand."
      },
      "previewSupported": true,
      "canonicalUrl": "https://rfid.me/reference/zpl/gf/"
    },
    {
      "command": "^GS",
      "name": "Graphic Symbol",
      "description": "Prints a single character from Zebra's built-in legal/regulatory symbol font (font `0` selector when paired with `^GS`). The actual glyph is chosen by the **single character** placed in the following `^FD` — for example `^FDA` → registered (®), `^FDB` → copyright (©), `^FDC` → trademark (™). Each printer firmware lists its specific letter→glyph mapping; the common four are A/B/C/D for ®/©/™ and the global \"wash care\" set on retail-ready models.",
      "category": "graphics",
      "syntax": "^GSo,h,w",
      "parameters": [
        {
          "name": "o",
          "description": "Orientation: N, R, I, B"
        },
        {
          "name": "h",
          "description": "Symbol height in dots (typical 15–60)"
        },
        {
          "name": "w",
          "description": "Symbol width in dots (typical 15–60). Setting `h == w` keeps the glyph proportional."
        }
      ],
      "whenToUse": "For legal marks (©, ®, ™) and regulatory pictograms that must render even when the host environment has no Unicode font for those code points. Place `^GS` **before** the `^FD` whose single character selects the glyph; rotation/height/width apply to that one symbol only.",
      "example": {
        "source": "^XA\n^FO50,50^A0N,30,30^FDAcme Corp^FS\n^FO220,45^GSN,20,20^FDB^FS\n^FO250,45^GSN,20,20^FDA^FS\n^XZ",
        "description": "\"Acme Corp\" followed by © (`^FDB`) and ® (`^FDA`). Single-character `^FD` picks the glyph; check your printer's firmware doc for the full A-Z mapping."
      },
      "previewSupported": true,
      "canonicalUrl": "https://rfid.me/reference/zpl/gs/"
    },
    {
      "command": "^BY",
      "name": "Barcode Defaults",
      "description": "Sets the default size for all barcodes that follow. The \"module width\" controls how thick the thinnest bar is — bigger = easier to scan but takes more space. Set this once and it applies to all subsequent barcodes.",
      "category": "barcode",
      "syntax": "^BYw,r,h",
      "parameters": [
        {
          "name": "w",
          "description": "Module width: 1-10 dots (default 2). Thinnest bar width."
        },
        {
          "name": "r",
          "description": "Wide-to-narrow ratio: 2.0-3.0 (default 3.0). For Code 39/ITF."
        },
        {
          "name": "h",
          "description": "Default barcode height in dots (default 10)"
        }
      ],
      "whenToUse": "Before your first barcode command. Usually only needed once per label.",
      "example": {
        "source": "^XA\n^FO50,50^BY3^BCN,100,Y^FD12345^FS\n^XZ",
        "description": "^BY3 sets wider bars — easier to scan from distance"
      },
      "previewSupported": true,
      "canonicalUrl": "https://rfid.me/reference/zpl/by/"
    },
    {
      "command": "^BC",
      "name": "Code 128",
      "description": "The most versatile 1D barcode — encodes any ASCII character (letters, numbers, symbols) using three subsets (A: control + uppercase, B: full ASCII, C: numeric-pair compression). Zebra firmware **auto-switches** subsets based on data content, so even-length numeric data automatically uses subset C and produces a noticeably narrower barcode than the same byte count of mixed text.",
      "category": "barcode",
      "syntax": "^BCo,h,f,g,e,m",
      "parameters": [
        {
          "name": "o",
          "description": "Rotation: N, R, I, B"
        },
        {
          "name": "h",
          "description": "Bar height in dots"
        },
        {
          "name": "f",
          "description": "Show human-readable text: Y or N"
        },
        {
          "name": "g",
          "description": "Text above barcode: Y or N (default N = below)"
        },
        {
          "name": "e",
          "description": "UCC check digit: Y or N"
        },
        {
          "name": "m",
          "description": "Mode: N (no selected mode, default), U (UCC Case Mode), A (auto subset switch — recommended), D (UCC/EAN with automatic application identifiers)"
        }
      ],
      "whenToUse": "Default choice for most barcodes — shipping labels, inventory, asset tags. If in doubt, use Code 128. Knowing about subset switching helps debug \"why is the barcode narrower than I expected\" — the answer is usually subset-C compression on numeric runs.",
      "example": {
        "source": "^XA\n^FO50,50^BY2^BCN,80,Y,N,N,A^FD1234567890^FS\n^XZ",
        "description": "Mode `A` enables auto-switching — the 10-digit even-length payload encodes via subset C (5 numeric pairs), producing a shorter barcode than the same 10 bytes of letters."
      },
      "previewSupported": true,
      "canonicalUrl": "https://rfid.me/reference/zpl/bc/"
    },
    {
      "command": "^B3",
      "name": "Code 39",
      "description": "An older but very common barcode format. Standard Code 39 supports uppercase letters, digits, and a small symbol set (`- . $ / + % SPACE`). With the `e` parameter set to `Y`, **Extended Code 39** uses two-character sequences to encode the full ASCII set including lowercase and control characters — at the cost of doubling the symbol width per encoded character.",
      "category": "barcode",
      "syntax": "^B3o,e,h,f,g",
      "parameters": [
        {
          "name": "o",
          "description": "Rotation: N, R, I, B"
        },
        {
          "name": "e",
          "description": "Extended Code 39 / Mod-43 check digit: `Y` enables Extended Code 39 (two-char sequences encode full ASCII including lowercase, ~, _, etc.); `N` keeps standard 43-character set"
        },
        {
          "name": "h",
          "description": "Bar height in dots"
        },
        {
          "name": "f",
          "description": "Show human-readable text: Y or N"
        },
        {
          "name": "g",
          "description": "Text above barcode: Y or N"
        }
      ],
      "whenToUse": "When compatibility is more important than space — defence/military (LOGMARS), automotive, healthcare. Use standard mode (`e=N`) for fixed-format part numbers; switch to extended (`e=Y`) only when the payload genuinely needs lowercase or special chars, since extended mode roughly doubles the barcode length.",
      "example": {
        "source": "^XA\n^FO50,50^BY2^B3N,N,80,Y,N^FDPART-A1234^FS\n^FO50,180^BY2^B3N,Y,80,Y,N^FDmixed Case +ext^FS\n^XZ",
        "description": "First barcode is standard Code 39 (uppercase only). Second uses `e=Y` for extended encoding so lowercase and `+ext` chars survive — about 2× the width."
      },
      "previewSupported": true,
      "canonicalUrl": "https://rfid.me/reference/zpl/b3/"
    },
    {
      "command": "^BE",
      "name": "EAN-13",
      "description": "The barcode on almost every product in a shop outside North America — the international version of UPC. **You supply 12 digits; the printer auto-calculates the 13th (check digit).** Numeric-only — letters or symbols cause the field to be rejected. The full GTIN-13 / EAN displayed below the barcode is 12 input + 1 calculated.",
      "category": "barcode",
      "syntax": "^BEo,h,f,g",
      "parameters": [
        {
          "name": "o",
          "description": "Rotation: N, R, I, B"
        },
        {
          "name": "h",
          "description": "Bar height in dots"
        },
        {
          "name": "f",
          "description": "Show human-readable text: Y or N"
        },
        {
          "name": "g",
          "description": "Text above: Y or N"
        }
      ],
      "whenToUse": "For retail products sold internationally. If you have a GTIN-13 or EAN number with 13 digits already, supply only the first 12 — the printer recomputes the check digit. Supplying all 13 will likely fail validation.",
      "example": {
        "source": "^XA\n^FO50,50^BY2^BEN,80,Y,N^FD590123412345^FS\n^XZ",
        "description": "12 numeric digits in `^FD`. The printer adds the check digit automatically; the rendered barcode and human-readable text show all 13."
      },
      "previewSupported": true,
      "canonicalUrl": "https://rfid.me/reference/zpl/be/"
    },
    {
      "command": "^BU",
      "name": "UPC-A",
      "description": "The standard barcode on products in the US and Canada. **You supply 11 digits; the printer calculates the 12th (check digit).** Numeric-only — any non-digit causes the field to be rejected. The full 12-digit UPC-A renders below the bars.",
      "category": "barcode",
      "syntax": "^BUo,h,f,g,e",
      "parameters": [
        {
          "name": "o",
          "description": "Rotation: N, R, I, B"
        },
        {
          "name": "h",
          "description": "Bar height in dots"
        },
        {
          "name": "f",
          "description": "Show human-readable text: Y or N"
        },
        {
          "name": "g",
          "description": "Text above: Y or N"
        },
        {
          "name": "e",
          "description": "Check digit: Y or N (Y = printer prints the calculated 12th digit alongside, N = printed barcode only)"
        }
      ],
      "whenToUse": "For retail products in North America. If your UPC has 12 digits, supply only the first 11 — the printer recomputes the check digit. Letters or symbols in `^FD` will fail validation, not silently encode.",
      "example": {
        "source": "^XA\n^FO50,50^BY2^BUN,80,Y,N^FD07123456789^FS\n^XZ",
        "description": "11 numeric digits in `^FD`. The printer computes and appends the 12th check digit automatically."
      },
      "previewSupported": true,
      "canonicalUrl": "https://rfid.me/reference/zpl/bu/"
    },
    {
      "command": "^BQ",
      "name": "QR Code",
      "description": "The square barcode you see everywhere — on menus, posters, and websites. QR codes encode URLs, text, contact info, or any data. The Zebra `^BQ` requires a **mode prefix in the `^FD` payload** — typically `LA,` (alphanumeric), `QA,` (mixed/automatic), or `LB,` (binary). Without a prefix, the printer firmware decides what to do — often producing a different (or invalid) barcode.",
      "category": "barcode",
      "syntax": "^BQo,model,magnification,errorCorrection,maskValue",
      "parameters": [
        {
          "name": "o",
          "description": "Rotation: N, R, I, B"
        },
        {
          "name": "model",
          "description": "1 (original) or 2 (enhanced — recommended)"
        },
        {
          "name": "magnification",
          "description": "Size multiplier: 1-10 (each unit adds dots per module)"
        },
        {
          "name": "errorCorrection",
          "description": "H (high, 30%), Q (quartile, 25%), M (medium, 15% — default), L (low, 7%)"
        },
        {
          "name": "maskValue",
          "description": "Mask pattern 0-7 (default 7 — the printer auto-picks). Rarely needs tuning."
        }
      ],
      "whenToUse": "When end users will scan with a phone, when you need to encode a URL, or when data exceeds what fits in a 1D barcode. Always start `^FD` with a 2-letter mode prefix followed by a comma.",
      "example": {
        "source": "^XA\n^FO50,50^BQN,2,6,M,7^FDQA,https://rfid.me^FS\n^XZ",
        "description": "`QA,` selects mixed/auto mode for the URL payload. Other prefixes: `LA,` (alphanumeric), `LB,` (binary), `LH,` (Kanji). Without a mode prefix, the firmware behaviour is undefined."
      },
      "previewSupported": true,
      "canonicalUrl": "https://rfid.me/reference/zpl/bq/"
    },
    {
      "command": "^BD",
      "name": "UPS MaxiCode",
      "description": "A fixed-size circular 2D barcode used by UPS for shipping labels. Looks like a hexagonal pattern of dots inside a circle (very different from DataMatrix or QR). Always 1.11\" × 1.054\" — the size is fixed by the spec, not user-controlled.",
      "category": "barcode",
      "syntax": "^BDmode,symbol number,total number of symbols",
      "parameters": [
        {
          "name": "mode",
          "description": "Encoding mode: 2 (US structured carrier), 3 (international structured carrier), 4 (standard symbol), 6 (reader programming). Default 4."
        },
        {
          "name": "symbol number",
          "description": "Symbol position when used in a multi-symbol structured-append set (1-based)."
        },
        {
          "name": "total number of symbols",
          "description": "Total number of symbols in the structured-append set."
        }
      ],
      "whenToUse": "When producing UPS-format shipping labels. Outside UPS shipping, use DataMatrix (^BX) or QR (^BQ) instead — MaxiCode is not a general-purpose 2D barcode.",
      "example": {
        "source": "^XA\n^FO50,50^BD4,1,1\n^FDUPS shipping payload^FS\n^XZ",
        "description": "A standalone MaxiCode (mode 4, single symbol). Currently rendered as a labelled placeholder until a MaxiCode encoder is added."
      },
      "previewSupported": false,
      "canonicalUrl": "https://rfid.me/reference/zpl/bd/"
    },
    {
      "command": "^B7",
      "name": "PDF417",
      "description": "A 2D barcode that looks like a tall stack of tiny barcodes — stores up to ~1,800 characters. PDF417 is **tunable**: `security` (0-8), `columns` × `rows`, and `truncate` together set the trade-off between density and damage tolerance. Higher `security` recovers from more damage but enlarges the barcode; tighter `columns` keeps it tall and narrow; truncated mode drops the right-hand row indicators to save space at the cost of error recovery.",
      "category": "barcode",
      "syntax": "^B7o,h,security,columns,rows,truncate",
      "parameters": [
        {
          "name": "o",
          "description": "Rotation: N, R, I, B"
        },
        {
          "name": "h",
          "description": "Row height in dots (typically 4-10)"
        },
        {
          "name": "security",
          "description": "Error correction level 0-8. Higher = more recoverable but larger. 5 is a balanced general-purpose choice; 6-8 for harsh/outdoor; 0-2 only when label area is severely constrained and the read environment is clean."
        },
        {
          "name": "columns",
          "description": "Data columns 1-30. Lower = taller/narrower; higher = shorter/wider. 3-5 typical for narrow labels, 8-15 for shipping documents."
        },
        {
          "name": "rows",
          "description": "Number of rows. 0 = auto-calculate from data length and columns (recommended)."
        },
        {
          "name": "truncate",
          "description": "`Y` = truncated PDF417 (no right-hand row indicators — saves space, less robust to damage), `N` = full PDF417 (recommended)."
        }
      ],
      "whenToUse": "For large data payloads — addresses, detailed product info, regulatory/compliance text. Raise `security` to 6-8 for hazmat/outdoor labels that take a beating; keep `security=2-4` and tighter geometry when label area is precious and the environment is clean. Use truncated mode (`truncate=Y`) only on labels that will not be torn or smudged.",
      "example": {
        "source": "^XA\n^FO50,50^B7N,5,5,3,0,N^FDShipper: Acme Corp, 123 Main St, Sydney 2000, AU^FS\n^XZ",
        "description": "Balanced PDF417: `security=5` (~25% error correction), `columns=3` (tall and narrow for a shipping label edge), rows auto-calculated, full (non-truncated) format."
      },
      "previewSupported": true,
      "canonicalUrl": "https://rfid.me/reference/zpl/b7/"
    },
    {
      "command": "^BX",
      "name": "Data Matrix Bar Code (ECC 200)",
      "description": "A 2D barcode that looks like a small square grid of dots — compact, error-correcting, scannable from any rotation. The modern Data Matrix standard (ECC 200) — what GS1 recommends for healthcare and regulated industries. Supports **structured append** (one logical payload split across up to 16 linked symbols) for very long data, and **fixed sizing** via `c`/`r` for layouts where the symbol must hit a specific footprint. (Note: `^BD` is UPS MaxiCode, a different barcode type — not an older Data Matrix.)",
      "category": "barcode",
      "syntax": "^BXo,h,s,c,r,f,g,a",
      "parameters": [
        {
          "name": "o",
          "description": "Orientation: N, R, I, B"
        },
        {
          "name": "h",
          "description": "Dimensional height of individual symbol elements (1-dot floor)"
        },
        {
          "name": "s",
          "description": "Quality level: 0, 50, 80, 100, 140, 200 (200 = ECC 200, recommended)"
        },
        {
          "name": "c",
          "description": "Columns to encode: 9-49 (odd values for ECC 0-140, even for ECC 200). 0 = auto."
        },
        {
          "name": "r",
          "description": "Rows to encode: 9-49 (odd values for ECC 0-140, even for ECC 200). 0 = auto."
        },
        {
          "name": "f",
          "description": "Format ID: 1-6 (varies content type — controls ASCII subset and compaction)"
        },
        {
          "name": "g",
          "description": "Escape sequence control character (single ASCII character, default ~)"
        },
        {
          "name": "a",
          "description": "Aspect ratio: 1 (square, default) or 2 (rectangular)"
        }
      ],
      "whenToUse": "When you need a 2D barcode but space is limited — small component labels, PCB boards, medical devices, GS1 traceability. Set `c` and `r` together for fixed-size symbols (e.g. 18×18) when the label slot is rigid; leave both 0 for the printer to size automatically. Use structured append when the payload exceeds a single ECC 200 symbol's capacity.",
      "example": {
        "source": "^XA\n^FO50,50^BXN,6,200,18,18^FD01034531200000111719112510ABCD1234^FS\n^XZ",
        "description": "GS1 Data Matrix forced to 18×18 ECC 200 for a fixed label footprint. Drop `c`/`r` (or set both to 0) for auto-sizing."
      },
      "previewSupported": true,
      "canonicalUrl": "https://rfid.me/reference/zpl/bx/"
    },
    {
      "command": "^BO",
      "name": "Aztec",
      "description": "A 2D barcode with a distinctive bullseye centre pattern. Used on boarding passes and some transport tickets. Aztec doesn't need a quiet zone (white space around it), making it space-efficient.",
      "category": "barcode",
      "syntax": "^BOo,magnification,ecl,menu,symbols,id",
      "parameters": [
        {
          "name": "o",
          "description": "Rotation: N, R, I, B"
        },
        {
          "name": "magnification",
          "description": "Size: 1-10"
        },
        {
          "name": "ecl",
          "description": "Error correction: 0 (default), 1-99 (percentage), 100-104 (layers)"
        }
      ],
      "whenToUse": "Transport/ticketing applications, or where the barcode must work without surrounding white space.",
      "example": {
        "source": "^XA\n^FO50,50^BON,6,0^FDGATE-A12-SEAT-14C^FS\n^XZ",
        "description": "Aztec code for a boarding pass"
      },
      "previewSupported": true,
      "canonicalUrl": "https://rfid.me/reference/zpl/bo/"
    },
    {
      "command": "^BA",
      "name": "Code 93",
      "description": "An improved version of Code 39 that's about 25% shorter for the same data. Less common than Code 128 but still used in some logistics and postal systems.",
      "category": "barcode",
      "syntax": "^BAo,h,f,g,e",
      "parameters": [
        {
          "name": "o",
          "description": "Rotation: N, R, I, B"
        },
        {
          "name": "h",
          "description": "Bar height in dots"
        },
        {
          "name": "f",
          "description": "Show text: Y or N"
        },
        {
          "name": "g",
          "description": "Text above: Y or N"
        },
        {
          "name": "e",
          "description": "Extended mode: Y or N"
        }
      ],
      "whenToUse": "When you need something more compact than Code 39 but your system specifically requires Code 93 (e.g., some postal standards).",
      "example": {
        "source": "^XA\n^FO50,50^BY2^BAN,80,Y,N^FDPACKAGE-789^FS\n^XZ",
        "description": "Code 93 barcode for a package"
      },
      "previewSupported": true,
      "canonicalUrl": "https://rfid.me/reference/zpl/ba/"
    },
    {
      "command": "^B1",
      "name": "Code 11",
      "description": "A numeric-only barcode used primarily in telecoms for labelling telephone equipment. Very specialised — you probably won't need this unless you're in the telecom industry.",
      "category": "barcode",
      "syntax": "^B1o,e,h,f,g",
      "parameters": [
        {
          "name": "o",
          "description": "Rotation"
        },
        {
          "name": "e",
          "description": "Check digit: Y or N"
        },
        {
          "name": "h",
          "description": "Height"
        },
        {
          "name": "f",
          "description": "Show text: Y or N"
        },
        {
          "name": "g",
          "description": "Text above: Y or N"
        }
      ],
      "whenToUse": "Telephone and telecom equipment labelling only.",
      "example": {
        "source": "^XA\n^FO50,50^BY2^B1N,N,80,Y,N^FD0412345678^FS\n^XZ",
        "description": "Code 11 for telecom equipment"
      },
      "previewSupported": true,
      "canonicalUrl": "https://rfid.me/reference/zpl/b1/"
    },
    {
      "command": "^B2",
      "name": "Interleaved 2 of 5",
      "description": "A compact numeric-only barcode where pairs of digits interleave. Very space-efficient for numbers. Common in warehouse and distribution for case/pallet labels.",
      "category": "barcode",
      "syntax": "^B2o,h,f,g,e",
      "parameters": [
        {
          "name": "o",
          "description": "Rotation"
        },
        {
          "name": "h",
          "description": "Height"
        },
        {
          "name": "f",
          "description": "Show text: Y or N"
        },
        {
          "name": "g",
          "description": "Text above: Y or N"
        },
        {
          "name": "e",
          "description": "Check digit: Y or N"
        }
      ],
      "whenToUse": "Warehouse carton labels, distribution, and anywhere you need a compact barcode for numeric-only data.",
      "example": {
        "source": "^XA\n^FO50,50^BY2^B2N,80,Y,N,Y^FD1234567890^FS\n^XZ",
        "description": "ITF barcode for a carton label (must be even number of digits)"
      },
      "previewSupported": true,
      "canonicalUrl": "https://rfid.me/reference/zpl/b2/"
    },
    {
      "command": "^B4",
      "name": "Code 49",
      "description": "A multi-row (stacked) barcode that encodes large amounts of data in a small space by stacking 2-8 rows of symbols. Each row is a separate linear barcode linked together.",
      "category": "barcode",
      "syntax": "^B4o,h,f,m",
      "parameters": [
        {
          "name": "o",
          "description": "Rotation"
        },
        {
          "name": "h",
          "description": "Height of each row"
        },
        {
          "name": "f",
          "description": "Show text: Y or N"
        },
        {
          "name": "m",
          "description": "Mode: A (automatic) or U (UCC/EAN)"
        }
      ],
      "whenToUse": "When you need to encode more data than a single linear barcode can hold but a 2D code isn't supported by your scanner.",
      "example": {
        "source": "^XA\n^FO50,50^BY2^B4N,30,Y^FDMULTI-ROW-DATA-12345^FS\n^XZ",
        "description": "Code 49 multi-row barcode"
      },
      "previewSupported": false,
      "canonicalUrl": "https://rfid.me/reference/zpl/b4/"
    },
    {
      "command": "^B5",
      "name": "Planet Code",
      "description": "USPS PLANET (Postal Alpha Numeric Encoding Technique) barcode used for mail tracking. Similar to POSTNET but includes both tall and short bars for encoding. Being phased out in favour of Intelligent Mail.",
      "category": "barcode",
      "syntax": "^B5o,h,f,g",
      "parameters": [
        {
          "name": "o",
          "description": "Rotation"
        },
        {
          "name": "h",
          "description": "Height"
        },
        {
          "name": "f",
          "description": "Show text: Y or N"
        },
        {
          "name": "g",
          "description": "Text above: Y or N"
        }
      ],
      "whenToUse": "USPS mail tracking and routing — mostly legacy, replaced by Intelligent Mail barcode.",
      "example": {
        "source": "^XA\n^FO50,50^BY2^B5N,80,Y,N^FD12345678901^FS\n^XZ",
        "description": "PLANET barcode for mail tracking"
      },
      "previewSupported": false,
      "canonicalUrl": "https://rfid.me/reference/zpl/b5/"
    },
    {
      "command": "^B8",
      "name": "EAN-8",
      "description": "The compact 8-digit version of EAN-13, designed for small packages where a full-size barcode won't fit — think chewing gum, lipstick, or small batteries.",
      "category": "barcode",
      "syntax": "^B8o,h,f,g",
      "parameters": [
        {
          "name": "o",
          "description": "Rotation"
        },
        {
          "name": "h",
          "description": "Height"
        },
        {
          "name": "f",
          "description": "Show text: Y or N"
        },
        {
          "name": "g",
          "description": "Text above: Y or N"
        }
      ],
      "whenToUse": "Small consumer products where EAN-13 is too large to print.",
      "example": {
        "source": "^XA\n^FO50,50^BY2^B8N,80,Y,N^FD12345670^FS\n^XZ",
        "description": "EAN-8 barcode for a small product"
      },
      "previewSupported": false,
      "canonicalUrl": "https://rfid.me/reference/zpl/b8/"
    },
    {
      "command": "^B9",
      "name": "UPC-E",
      "description": "A compressed version of UPC-A that encodes 6 digits (plus check digit) in roughly half the space. Used on very small items in US/Canadian retail.",
      "category": "barcode",
      "syntax": "^B9o,h,f,g",
      "parameters": [
        {
          "name": "o",
          "description": "Rotation"
        },
        {
          "name": "h",
          "description": "Height"
        },
        {
          "name": "f",
          "description": "Show text: Y or N"
        },
        {
          "name": "g",
          "description": "Text above: Y or N"
        }
      ],
      "whenToUse": "Small retail products in North America where UPC-A won't fit.",
      "example": {
        "source": "^XA\n^FO50,50^BY2^B9N,80,Y,N^FD01234565^FS\n^XZ",
        "description": "UPC-E barcode for a small retail item"
      },
      "previewSupported": false,
      "canonicalUrl": "https://rfid.me/reference/zpl/b9/"
    },
    {
      "command": "^BB",
      "name": "CODABLOCK-F",
      "description": "A stacked barcode based on Code 128. Each row is a full Code 128 barcode with linking characters. Encodes large amounts of data in a compact rectangular area.",
      "category": "barcode",
      "syntax": "^BBo,h,n,c,r,m",
      "parameters": [
        {
          "name": "o",
          "description": "Rotation"
        },
        {
          "name": "h",
          "description": "Height per row"
        },
        {
          "name": "n",
          "description": "Security level"
        },
        {
          "name": "c",
          "description": "Number of columns per row"
        },
        {
          "name": "r",
          "description": "Number of rows"
        },
        {
          "name": "m",
          "description": "Mode: F (CODABLOCK-F) or E (CODABLOCK-E)"
        }
      ],
      "whenToUse": "When you need to encode large amounts of data and your scanners support CODABLOCK-F but not 2D codes.",
      "example": {
        "source": "^XA\n^FO50,50^BY2^BBN,30,,,4^FDLong data that wraps across rows^FS\n^XZ",
        "description": "CODABLOCK-F stacked barcode with 4 rows"
      },
      "previewSupported": false,
      "canonicalUrl": "https://rfid.me/reference/zpl/bb/"
    },
    {
      "command": "^BF",
      "name": "MicroPDF417",
      "description": "A compact version of PDF417 designed for small items. Encodes less data than full PDF417 but takes up much less space. Popular for healthcare and small component labelling.",
      "category": "barcode",
      "syntax": "^BFo,h",
      "parameters": [
        {
          "name": "o",
          "description": "Rotation"
        },
        {
          "name": "h",
          "description": "Row height"
        }
      ],
      "whenToUse": "When you need a 2D barcode but PDF417 is too large — healthcare vials, small electronic components.",
      "example": {
        "source": "^XA\n^FO50,50^BFN,4^FDVIAL-SN-12345^FS\n^XZ",
        "description": "MicroPDF417 on a healthcare vial label"
      },
      "previewSupported": false,
      "canonicalUrl": "https://rfid.me/reference/zpl/bf/"
    },
    {
      "command": "^BI",
      "name": "Industrial 2 of 5",
      "description": "An older numeric-only barcode used in industrial applications. Encodes digits using only the bars (not spaces). Less dense than Interleaved 2 of 5 but simpler.",
      "category": "barcode",
      "syntax": "^BIo,h,f,g",
      "parameters": [
        {
          "name": "o",
          "description": "Rotation"
        },
        {
          "name": "h",
          "description": "Height"
        },
        {
          "name": "f",
          "description": "Show text: Y or N"
        },
        {
          "name": "g",
          "description": "Text above: Y or N"
        }
      ],
      "whenToUse": "Legacy industrial systems — most new applications should use Interleaved 2 of 5 (^B2) instead.",
      "example": {
        "source": "^XA\n^FO50,50^BY2^BIN,80,Y,N^FD12345^FS\n^XZ",
        "description": "Industrial 2 of 5 barcode"
      },
      "previewSupported": false,
      "canonicalUrl": "https://rfid.me/reference/zpl/bi/"
    },
    {
      "command": "^BJ",
      "name": "Standard 2 of 5",
      "description": "The original 2 of 5 barcode — numeric only, low density. The simplest member of the 2-of-5 family. Rarely used in new applications.",
      "category": "barcode",
      "syntax": "^BJo,h,f,g",
      "parameters": [
        {
          "name": "o",
          "description": "Rotation"
        },
        {
          "name": "h",
          "description": "Height"
        },
        {
          "name": "f",
          "description": "Show text: Y or N"
        },
        {
          "name": "g",
          "description": "Text above: Y or N"
        }
      ],
      "whenToUse": "Legacy systems only — Interleaved 2 of 5 (^B2) or Code 128 (^BC) are better for new applications.",
      "example": {
        "source": "^XA\n^FO50,50^BY2^BJN,80,Y,N^FD12345^FS\n^XZ",
        "description": "Standard 2 of 5 barcode"
      },
      "previewSupported": false,
      "canonicalUrl": "https://rfid.me/reference/zpl/bj/"
    },
    {
      "command": "^BK",
      "name": "ANSI Codabar",
      "description": "Also known as NW-7, Monarch, or Code 2 of 7. A self-checking barcode that encodes digits plus six special characters. Widely used in libraries, blood banks, and FedEx airbills.",
      "category": "barcode",
      "syntax": "^BKo,e,h,f,g,l",
      "parameters": [
        {
          "name": "o",
          "description": "Rotation"
        },
        {
          "name": "e",
          "description": "Check digit: Y or N"
        },
        {
          "name": "h",
          "description": "Height"
        },
        {
          "name": "f",
          "description": "Show text: Y or N"
        },
        {
          "name": "g",
          "description": "Text above: Y or N"
        },
        {
          "name": "l",
          "description": "Start/stop characters: A, B, C, or D"
        }
      ],
      "whenToUse": "Libraries (book tracking), blood banks (specimen labelling), FedEx airbills, and photo finishing.",
      "example": {
        "source": "^XA\n^FO50,50^BY2^BKN,N,80,Y,N^FDA123456B^FS\n^XZ",
        "description": "Codabar barcode with A/B start/stop chars (blood bank label)"
      },
      "previewSupported": false,
      "canonicalUrl": "https://rfid.me/reference/zpl/bk/"
    },
    {
      "command": "^BL",
      "name": "LOGMARS",
      "description": "Logistics Applications of Automated Marking and Reading Symbols — essentially Code 39 with a mandatory mod-43 check character. Required by the US Department of Defense for military logistics.",
      "category": "barcode",
      "syntax": "^BLo,h,f",
      "parameters": [
        {
          "name": "o",
          "description": "Rotation"
        },
        {
          "name": "h",
          "description": "Height"
        },
        {
          "name": "f",
          "description": "Show text: Y or N"
        }
      ],
      "whenToUse": "US military/defense supply chain — MIL-STD-1189 compliance. Also used by some NATO allies.",
      "example": {
        "source": "^XA\n^FO50,50^BY2^BLN,80,Y^FDMIL-PART-123^FS\n^XZ",
        "description": "LOGMARS barcode for military logistics"
      },
      "previewSupported": false,
      "canonicalUrl": "https://rfid.me/reference/zpl/bl/"
    },
    {
      "command": "^BM",
      "name": "Micro QR Code",
      "description": "A smaller version of QR Code designed for applications where space is extremely limited. Encodes less data than a full QR code but requires only one position detection pattern instead of three.",
      "category": "barcode",
      "syntax": "^BMo,s",
      "parameters": [
        {
          "name": "o",
          "description": "Rotation"
        },
        {
          "name": "s",
          "description": "Symbol size (cell size in dots)"
        }
      ],
      "whenToUse": "Very small labels, PCB marking, or tiny product identification where even a small QR code is too large.",
      "example": {
        "source": "^XA\n^FO50,50^BMN,4^FDPART123^FS\n^XZ",
        "description": "Micro QR code on a small component label"
      },
      "previewSupported": false,
      "canonicalUrl": "https://rfid.me/reference/zpl/bm/"
    },
    {
      "command": "^BP",
      "name": "Plessey",
      "description": "A pulse-width modulated barcode developed in England. Used primarily in UK and European library systems and some retail shelf-edge labels. Encodes hexadecimal digits (0-9, A-F).",
      "category": "barcode",
      "syntax": "^BPo,e,h,f,g",
      "parameters": [
        {
          "name": "o",
          "description": "Rotation"
        },
        {
          "name": "e",
          "description": "Check digit: Y or N"
        },
        {
          "name": "h",
          "description": "Height"
        },
        {
          "name": "f",
          "description": "Show text: Y or N"
        },
        {
          "name": "g",
          "description": "Text above: Y or N"
        }
      ],
      "whenToUse": "UK library systems, European retail shelf-edge pricing, and legacy Plessey-based systems.",
      "example": {
        "source": "^XA\n^FO50,50^BY2^BPN,N,80,Y,N^FD1234ABCD^FS\n^XZ",
        "description": "Plessey barcode with hexadecimal data"
      },
      "previewSupported": false,
      "canonicalUrl": "https://rfid.me/reference/zpl/bp/"
    },
    {
      "command": "^BR",
      "name": "GS1 DataBar",
      "description": "Formerly known as RSS (Reduced Space Symbology). A family of compact barcodes designed by GS1 for small items. Can encode a full GTIN in less space than EAN/UPC and supports additional data like weight, expiry, and lot.",
      "category": "barcode",
      "syntax": "^BRo,s,h,q,v",
      "parameters": [
        {
          "name": "o",
          "description": "Rotation"
        },
        {
          "name": "s",
          "description": "Symbology type: 1 (Omnidirectional), 2 (Truncated), 3 (Stacked), 4 (Stacked Omnidirectional), 5 (Limited), 6 (Expanded), etc."
        },
        {
          "name": "h",
          "description": "Height multiplier"
        },
        {
          "name": "q",
          "description": "Segment count (for expanded variants)"
        },
        {
          "name": "v",
          "description": "Separator height"
        }
      ],
      "whenToUse": "Fresh produce (weight/price), pharmacy (expiry dates), and small items where EAN-13 is too large. Required at point-of-sale for loose produce in GS1 markets.",
      "example": {
        "source": "^XA\n^FO50,50^BR,1,8^FD0109501101530003^FS\n^XZ",
        "description": "GS1 DataBar Omnidirectional encoding a GTIN"
      },
      "previewSupported": false,
      "canonicalUrl": "https://rfid.me/reference/zpl/br/"
    },
    {
      "command": "^BS",
      "name": "UPC/EAN Extensions",
      "description": "Prints 2-digit or 5-digit supplemental barcodes that appear to the right of a UPC or EAN barcode. The 2-digit add-on is used for periodicals (issue number), the 5-digit add-on for books (suggested price).",
      "category": "barcode",
      "syntax": "^BSo,h,f,g",
      "parameters": [
        {
          "name": "o",
          "description": "Rotation"
        },
        {
          "name": "h",
          "description": "Height"
        },
        {
          "name": "f",
          "description": "Show text: Y or N"
        },
        {
          "name": "g",
          "description": "Text above: Y or N"
        }
      ],
      "whenToUse": "Magazines/periodicals (2-digit issue number) and books (5-digit suggested retail price alongside ISBN barcode).",
      "example": {
        "source": "^XA\n^FO50,50^BY2^BSN,80,Y,N^FD52495^FS\n^XZ",
        "description": "5-digit price add-on ($24.95) for a book barcode"
      },
      "previewSupported": false,
      "canonicalUrl": "https://rfid.me/reference/zpl/bs/"
    },
    {
      "command": "^BT",
      "name": "TLC39",
      "description": "Telecoms Industry Forum 39 — a composite barcode combining Code 39 with a MicroPDF417 component. Used by the telecommunications industry for component marking.",
      "category": "barcode",
      "syntax": "^BTo,m,h",
      "parameters": [
        {
          "name": "o",
          "description": "Rotation"
        },
        {
          "name": "m",
          "description": "Mode"
        },
        {
          "name": "h",
          "description": "Height"
        }
      ],
      "whenToUse": "Telecommunications equipment manufacturing — part marking and inventory for telecom components.",
      "example": {
        "source": "^XA\n^FO50,50^BY2^BTN,,80^FDTLC-PART-5678^FS\n^XZ",
        "description": "TLC39 barcode for telecom component"
      },
      "previewSupported": false,
      "canonicalUrl": "https://rfid.me/reference/zpl/bt/"
    },
    {
      "command": "^BZ",
      "name": "USPS Intelligent Mail",
      "description": "The current USPS mail barcode, replacing POSTNET and PLANET. Encodes tracking number, routing code, and service type in a 65-bar barcode with 4 bar states (full, ascender, descender, tracker). Required for USPS automation discounts.",
      "category": "barcode",
      "syntax": "^BZo,h,f,g",
      "parameters": [
        {
          "name": "o",
          "description": "Rotation"
        },
        {
          "name": "h",
          "description": "Height"
        },
        {
          "name": "f",
          "description": "Show text: Y or N"
        },
        {
          "name": "g",
          "description": "Text above: Y or N"
        }
      ],
      "whenToUse": "All USPS mail that needs automation rate discounts. Required for First-Class, Standard, and Periodicals mail.",
      "example": {
        "source": "^XA\n^FO50,50^BZN,80,Y,N^FD01234567094987654321^FS\n^XZ",
        "description": "USPS Intelligent Mail barcode for automation-rate mail"
      },
      "previewSupported": false,
      "canonicalUrl": "https://rfid.me/reference/zpl/bz/"
    },
    {
      "command": "^PW",
      "name": "Print Width",
      "description": "Sets how wide the label is, in dots. At 203 DPI (the most common resolution), 1 inch = 203 dots. So a 4-inch label is ^PW812.",
      "category": "config",
      "syntax": "^PWw",
      "parameters": [
        {
          "name": "w",
          "description": "Width in dots. Common: 406 (2\"), 609 (3\"), 812 (4\")"
        }
      ],
      "whenToUse": "At the start of your label, right after ^XA. Match this to your actual label width.",
      "example": {
        "source": "^XA\n^PW609\n^FO50,50^A0N,25,25^FD3-inch wide label^FS\n^XZ",
        "description": "3-inch label at 203 DPI"
      },
      "previewSupported": true,
      "canonicalUrl": "https://rfid.me/reference/zpl/pw/"
    },
    {
      "command": "^LL",
      "name": "Label Length",
      "description": "Sets how tall the label is, in dots. Combined with ^PW, this defines the total label size. At 203 DPI: 2\" = 406 dots, 3\" = 609 dots, 4\" = 812 dots.",
      "category": "config",
      "syntax": "^LLy",
      "parameters": [
        {
          "name": "y",
          "description": "Height in dots. Common: 406 (2\"), 609 (3\"), 812 (4\"), 1218 (6\")"
        }
      ],
      "whenToUse": "At the start of your label, with ^PW. Match this to your actual label height.",
      "example": {
        "source": "^XA\n^PW812^LL406\n^FO50,50^A0N,25,25^FD4x2 inch label^FS\n^XZ",
        "description": "4\" wide by 2\" tall label"
      },
      "previewSupported": true,
      "canonicalUrl": "https://rfid.me/reference/zpl/ll/"
    },
    {
      "command": "^PO",
      "name": "Print Orientation",
      "description": "Flips the entire label upside-down. Useful when labels feed out of the printer in the wrong direction and you can't physically rotate the stock.",
      "category": "config",
      "syntax": "^POo",
      "parameters": [
        {
          "name": "o",
          "description": "N (normal) or I (inverted/upside-down)"
        }
      ],
      "whenToUse": "When labels come out upside-down and rotating the label stock isn't an option.",
      "example": {
        "source": "^XA\n^POI\n^FO50,50^A0N,30,30^FDUpside-down label^FS\n^XZ",
        "description": "Entire label printed inverted"
      },
      "previewSupported": true,
      "canonicalUrl": "https://rfid.me/reference/zpl/po/"
    },
    {
      "command": "^LR",
      "name": "Label Reverse",
      "description": "Reverses the entire label — everything that was black becomes white and vice versa. The entire label prints as white-on-black.",
      "category": "config",
      "syntax": "^LRy",
      "parameters": [
        {
          "name": "y",
          "description": "Y (reverse entire label) or N (normal)"
        }
      ],
      "whenToUse": "For high-contrast labels, warning labels, or when printing on dark media with white ribbon.",
      "example": {
        "source": "^XA\n^LRY\n^FO50,50^A0N,30,30^FDReversed label^FS\n^XZ",
        "description": "White text on black background (entire label)"
      },
      "previewSupported": true,
      "canonicalUrl": "https://rfid.me/reference/zpl/lr/"
    },
    {
      "command": "^PQ",
      "name": "Print Quantity",
      "description": "Controls a multi-label print run with **five distinct knobs**. `q` is the **total quantity** of unique labels to print (when paired with `^SN` serialization, this advances the serial). `r` is **replicates per serial** — each unique label is printed `r+1` times before advancing the serial (so `^PQ5,0,2,N,N` with serialisation prints 5 unique serials, each duplicated 3 times = 15 labels total). `p` is the **pause-after-N count** for batch separation: after every `p` labels the printer pauses for the operator (set 0 to disable). `o` Y/N overrides any pause requested by `p` (`Y` = ignore pause). `e` Y/N controls **cut on error** when paired with `^MMC` cutter mode (`Y` = retain partial output to investigate, `N` = continue cutting).",
      "category": "print",
      "syntax": "^PQq,p,r,o,e",
      "parameters": [
        {
          "name": "q",
          "description": "Total quantity of unique labels (1–99,999,999). With `^SN` this is the count of serial advances."
        },
        {
          "name": "p",
          "description": "Pause after every N labels (1–99,999,999); `0` disables pause batching"
        },
        {
          "name": "r",
          "description": "Replicates per unique label (0–99,999,999); each label prints `r+1` times. Without `^SN` this multiplies the total by `r+1`"
        },
        {
          "name": "o",
          "description": "Override pause requested by `p`: `Y` = ignore pause; `N` = honour pause (default)"
        },
        {
          "name": "e",
          "description": "Cut-on-error flag for cutter mode (paired with `^MMC`): `Y` retain partial output, `N` continue cutting"
        }
      ],
      "whenToUse": "Quantity vs replicate matters with `^SN` serialization: `q` advances the serial, `r` repeats the same one. Without `^SN`, `q` and `r` give the same total label count and either is fine. Use `p>0` for batch operations where the operator needs to retrieve and stack labels in groups (e.g. `^PQ100,10,0,N,N` = print 100, pause every 10). The `e` cut-on-error flag only takes effect on cutter-equipped printers running in `^MMC` mode (cross-reference `^MM`).",
      "example": {
        "source": "^XA\n^PQ5,1,1,N,N\n^FO50,50^FDHello^FS\n^XZ",
        "description": "Prints 5 unique labels (`q=5`), pauses after each one (`p=1`), with 1 replicate per label (`r=1` → each label printed twice = 10 labels total), no pause override, no cut-on-error retention. Replicate makes a duplicate of each label rather than advancing to a 6th unique one — distinguishes from raw `^PQ10` which prints 10 unique labels with no replication."
      },
      "previewSupported": true,
      "canonicalUrl": "https://rfid.me/reference/zpl/pq/"
    },
    {
      "command": "^PR",
      "name": "Print Rate (Speed)",
      "description": "Sets **three independent media-feed speeds** in inches per second (ips): `p` = **print speed** (head heating active, pixels being marked), `s` = **slew speed** (blank media advancing between fields or between labels — head idle), `b` = **backfeed speed** (reverse motion, e.g. tear-off retract or peel-and-present indexing). The valid range is model-dependent — typically 1–14 ips on industrial printers, 2–6 ips on desktop models; values are silently clamped to the printer's supported range. Trailing parameters default to `p` if omitted, so `^PR5` sets all three to 5.",
      "category": "print",
      "syntax": "^PRp,s,b",
      "parameters": [
        {
          "name": "p",
          "description": "Print speed in inches per second; range 1–14 (model-dependent, clamped silently)"
        },
        {
          "name": "s",
          "description": "Slew speed (blank-media advance) in ips; range 1–14. Defaults to `p` if omitted"
        },
        {
          "name": "b",
          "description": "Backfeed speed (reverse motion for tear-off/peel) in ips; range 1–14. Defaults to `p` if omitted"
        }
      ],
      "whenToUse": "Print speed is the **dominant quality lever** — every doubling of `p` measurably reduces edge sharpness because the print head has half the dwell time per dot. **Drop `p` to 2–3 ips** for high-density 1D barcodes (Code 128 narrow-bar < 8 dots), small text (< 8 pt at 203 dpi), or fine GS1 DataMatrix; **stay at `p` = 5–6 ips** for typical shipping labels; **push to 8+ ips** only when the print is purely large text/graphics with no scan-critical content. `s` and `b` only affect throughput, not quality — leave them at the printer default unless minimising cycle time matters. Persisted via `^JU`; some firmware exposes the same setting in the operator menu.",
      "example": {
        "source": "^XA\n^PR3,6,6\n^FO50,50^BY2^BCN,80,Y^FD12345^FS\n^XZ",
        "description": "Print at 3 ips (sharp edges for the Code 128 barcode), but slew and backfeed at 6 ips so blank-media motion does not slow throughput. For high-density barcodes always lower `p` first — slewing fast on blank media costs nothing in scan reliability."
      },
      "previewSupported": true,
      "canonicalUrl": "https://rfid.me/reference/zpl/pr/"
    },
    {
      "command": "^MD",
      "name": "Media Darkness",
      "description": "Adjusts how dark the print is — like the darkness/contrast setting on a printer. Higher values mean more heat, making darker prints but using more ribbon and potentially reducing printhead life.",
      "category": "print",
      "syntax": "^MDn",
      "parameters": [
        {
          "name": "n",
          "description": "Adjustment: -30 to +30 (relative to printer setting)"
        }
      ],
      "whenToUse": "When barcodes aren't scanning well (increase darkness) or when print is smudging/bleeding (decrease darkness).",
      "example": {
        "source": "^XA\n^MD10\n^FO50,50^A0N,30,30^FDDarker print^FS\n^XZ",
        "description": "Slightly darker than normal"
      },
      "previewSupported": true,
      "canonicalUrl": "https://rfid.me/reference/zpl/md/"
    },
    {
      "command": "^MN",
      "name": "Media Tracking",
      "description": "Tells the printer **how to find the boundary between labels** so the next label starts in the right place on the media. The detection method depends on what the loaded media has: `Y` (Web/gap sensing) — a transmissive sensor sees the gap of light between adjacent die-cut labels; `M` (Mark sensing) — a reflective sensor reads black registration marks printed on the back of the liner at fixed intervals; `N` (Continuous) — no boundary detection at all, the printer indexes by `^LL` label-length value (used for receipt-style roll, fanfold journal stock, or when running die-cut labels with the gap sensor disabled). Some firmware also accepts `W` as an alias for `Y` (web).",
      "category": "print",
      "syntax": "^MNt",
      "parameters": [
        {
          "name": "t",
          "description": "Tracking method: `Y` Web/gap sensing (transmissive), `M` Mark sensing (reflective), `N` Continuous (length-based, requires `^LL`). `W` accepted as alias for `Y` on some firmware"
        }
      ],
      "whenToUse": "Set this **whenever the loaded media changes type**, then run `~JC` (Set Media Sensor Calibration) so the printer auto-calibrates the gap/mark sensor against the new stock — sensor thresholds set for the previous media will not work for the new one. Symptoms of mismatch: labels print half on / half off the next page (wrong sensor type), or every other label is blank (sensor mis-thresholded). For `N` continuous mode, also set `^LL` to the label length the printer should index by, otherwise feeding behaviour is unpredictable. Persisted via `^JU`.",
      "example": {
        "source": "^XA\n^MNY\n^XZ",
        "description": "Selects gap (web) sensing for standard die-cut label stock. Pair with `~JC` after loading the new roll so the gap sensor calibrates against the actual gap-vs-label opacity — without that step the printer may mistrack on stock with a different liner thickness."
      },
      "previewSupported": true,
      "canonicalUrl": "https://rfid.me/reference/zpl/mn/"
    },
    {
      "command": "^MM",
      "name": "Print Mode",
      "description": "Selects how the printer **handles each label after printing**. The mode letter selects the post-print behaviour: `T` Tear-off (label advances to the tear bar; user tears manually — default for most printers), `P` Peel-off (label is dispensed past the peel bar with backing retracted; printer waits for the operator to remove the label before printing the next), `R` Rewind (entire output is wound onto an internal rewind spindle, no per-label dispense), `C` Cutter (the cutter blade fires after each label), `D` Delayed Cut (cutter fires only when an explicit `^CN` cut-now command is sent — used for batches), `A` Applicator (handshake with an external label-applicator device via the applicator interface).",
      "category": "print",
      "syntax": "^MMm",
      "parameters": [
        {
          "name": "m",
          "description": "Mode letter: `T` Tear-off (default), `P` Peel-off, `R` Rewind, `C` Cutter, `D` Delayed Cut, `A` Applicator. Modes other than `T` require the corresponding printer hardware option"
        }
      ],
      "whenToUse": "Setting must match the **physical hardware fitted to the printer** — `^MMP` on a model without the peel-off kit, `^MMC`/`^MMD` without the cutter, `^MMR` without the rewinder, or `^MMA` without the applicator interface returns an error and the printer stays in its previous mode. Choose the mode that matches the dispense workflow: tear-off for manual operations, peel-off for one-at-a-time application, cutter for separated stickers from a continuous roll, applicator for inline labelling cells. Persisted via `^JU`; can also be set in the operator menu.",
      "example": {
        "source": "^XA\n^MMP\n^FO50,50^A0N,25,25^FDPeel and present^FS\n^XZ",
        "description": "Switches into peel-off mode: the printer dispenses the label past the peel bar and pauses until the operator removes it before starting the next print. Requires the peel-off hardware option — on a tear-only printer this returns an error and the mode does not change."
      },
      "previewSupported": true,
      "canonicalUrl": "https://rfid.me/reference/zpl/mm/"
    },
    {
      "command": "^MU",
      "name": "Set Units",
      "description": "Changes the measurement units from dots to inches or millimetres. Instead of calculating dots, you can say ^FO25,50 and mean millimetres. Makes ZPL much more readable.",
      "category": "config",
      "syntax": "^MUd,x,y",
      "parameters": [
        {
          "name": "d",
          "description": "Unit: D (dots, default), I (inches), M (millimetres)"
        },
        {
          "name": "x",
          "description": "DPI for x-axis (usually leave blank)"
        },
        {
          "name": "y",
          "description": "DPI for y-axis (usually leave blank)"
        }
      ],
      "whenToUse": "When you find it easier to think in mm or inches instead of dots.",
      "example": {
        "source": "^XA\n^MUM\n^PW100^LL50\n^FO10,10^A0N,5,5^FD100x50mm label^FS\n^XZ",
        "description": "Label defined in millimetres instead of dots"
      },
      "previewSupported": true,
      "canonicalUrl": "https://rfid.me/reference/zpl/mu/"
    },
    {
      "command": "^RF",
      "name": "RFID Read or Write",
      "description": "Reads from or writes to the **RFID inlay** embedded in a smart label, addressing a specific memory bank on a Gen2 tag. `o=W` (write — written `^RFW,…` in shorthand; this is **not a separate command**, just `^RF` with the operation parameter set to `W`) takes the data from the next `^FD` and **encodes it into the tag** during print — the printed media moves under the RFID encoder, the inlay is energised, the new value is committed; `o=R` (read — `^RFR,…`) **retrieves** the bank contents and stores them in the print field for use elsewhere in the format. The `b` parameter selects which Gen2 memory bank to address: `0` EPC (the scannable identifier — most common write target), `1` TID (Tag ID — read-only chip serial, factory-locked), `2` USER (free-form bytes, optional on the inlay), `3` RESERVED (kill and access passwords). Pair with a preceding `^RS` (RFID Setup) to declare the protocol/region/retry policy — `^RF` alone uses defaults that may not match the encoder.",
      "category": "rfid",
      "syntax": "^RFo,f,b,n,p",
      "parameters": [
        {
          "name": "o",
          "description": "Operation: `W` write into bank, `R` read from bank"
        },
        {
          "name": "f",
          "description": "Data format: `A` ASCII, `H` hexadecimal (most common — EPCs are hex-encoded), `E` EPC (96-bit EPC structure)"
        },
        {
          "name": "b",
          "description": "Memory bank: `0` EPC (scannable ID), `1` TID (read-only chip serial), `2` USER (free-form payload), `3` RESERVED (kill/access passwords)"
        },
        {
          "name": "n",
          "description": "Number of bytes to read or write — must match the bank capacity (e.g. 12 for SGTIN-96 EPC). Default 1."
        },
        {
          "name": "p",
          "description": "Starting byte offset within the bank. `0` for full-bank operations; non-zero only for partial updates. Default 0."
        }
      ],
      "whenToUse": "For Gen2 RFID encoding: write to bank `0` (EPC) for SGTIN/serialised inventory tags, bank `2` (USER) for application-specific payloads, bank `3` (RESERVED) for kill/access passwords (encode once, lock with `^RZ`/`^HL`). Always send `^RS` first to set protocol, encoder type, and retry/void behaviour — without it, write-failures may not void the label and you ship blank inlays. **`^FD` data length MUST align with `n` exactly:** for `f=H` (hex format) the `^FD` payload must contain `2 × n` hex characters (each byte = 2 hex chars); for `f=A` (ASCII) it must contain exactly `n` characters. A 14- or 18-char hex `^FD` paired with `n=8` is a silent encoder error — the inlay either rejects the partial write or accepts misaligned bytes that won't scan correctly. Likewise `p` (offset) + `n` (count) must stay within the bank's byte range (EPC = 12 bytes max for SGTIN-96; USER size is inlay-dependent). For diagnostics use `^HV`/`~HL` to read tag state back to host.",
      "example": {
        "source": "^XA\n^RS8\n^RFW,H,0,12,0\n^FD3034257BF7194E4000001A85^FS\n^XZ",
        "description": "Configure Gen2 protocol via `^RS8`, then write a 12-byte SGTIN-96 EPC into bank `0` (EPC) starting at byte offset `0`, no password offset. **Alignment check:** `n=12` bytes × `f=H` hex format = exactly **24 hex characters required in `^FD`** — and the `^FD` here (`3034257BF7194E4000001A85`) is exactly 24 chars. A 22- or 26-char `^FD` with this header would silently produce a bad encode. `^RFW` is shorthand for `^RF` with `o=W`, not a separate command."
      },
      "previewSupported": true,
      "canonicalUrl": "https://rfid.me/reference/zpl/rf/"
    },
    {
      "command": "^HL",
      "name": "Return RFID Data Log to Host",
      "description": "Sends the printer's **RFID encoding event log** back to the host over the **same connection that issued the command** — TCP socket, USB serial, parallel, etc. Output is plain ASCII (one event per line) listing recent encode/read attempts, success/void status, and tag IDs as recorded in the printer's rolling RFID log buffer. **Nothing is printed on label media** — `^HL` is purely a diagnostic / fleet-management read-back, not a layout primitive. The host application reads the response off the same socket it wrote `^HL` into.",
      "category": "rfid",
      "syntax": "^HL",
      "parameters": [],
      "whenToUse": "For host-driven diagnostic flows: detect runs of voided labels (correlate with `^RR`/`^RS` settings), verify the latest write actually committed before releasing the next batch, audit RFID inventory before shipping. Always send `^HL` over a connection where the host application is actively reading the response — fire-and-forget over a print-only socket loses the data. Cross-reference `^HV` (host verification — returns a single field), `~HQES` (status query), and `^RT` (read tag → label-side or host-side per `^FN`).",
      "example": {
        "source": "^XA\n^HL\n^XZ",
        "description": "Requests the RFID data log. The host receives plain-ASCII output on the same socket that sent the format — no label is printed. Each line records one recent encode event (timestamp, EPC value, write status). Use to verify the last batch encoded correctly before releasing the next."
      },
      "previewSupported": false,
      "canonicalUrl": "https://rfid.me/reference/zpl/hl/"
    },
    {
      "command": "^HR",
      "name": "RFID Calibrate",
      "description": "Runs RFID antenna calibration to optimise the signal strength for the current label stock. The printer adjusts power levels for reliable encoding.",
      "category": "rfid",
      "syntax": "^HR",
      "parameters": [],
      "whenToUse": "After loading new RFID label stock or when experiencing encoding failures — calibration finds the optimal power.",
      "example": {
        "source": "^XA\n^HR\n^XZ",
        "description": "Calibrate RFID antenna for current media"
      },
      "previewSupported": false,
      "canonicalUrl": "https://rfid.me/reference/zpl/hr/"
    },
    {
      "command": "^RA",
      "name": "Read or Write AFI",
      "description": "Reads or writes the Application Family Identifier (AFI) byte on an RFID tag. AFI categorises what the tag is used for (retail, transport, healthcare, etc.).",
      "category": "rfid",
      "syntax": "^RAo,f",
      "parameters": [
        {
          "name": "o",
          "description": "Operation: W (write), R (read)"
        },
        {
          "name": "f",
          "description": "Format: H (hex), A (ASCII)"
        }
      ],
      "whenToUse": "When your application needs to set the AFI to identify the tag's purpose — common in library and retail EAS systems.",
      "example": {
        "source": "^XA\n^RAW,H^FD07^FS\n^XZ",
        "description": "Set AFI to 07 (retail trade)"
      },
      "previewSupported": false,
      "canonicalUrl": "https://rfid.me/reference/zpl/ra/"
    },
    {
      "command": "^RB",
      "name": "Define RFID Block Size",
      "description": "Configures the **memory-block geometry** the encoder uses for subsequent RFID operations. A \"block\" is the **fixed-bit unit of access** that the underlying Gen2 protocol opcodes (Write/BlockWrite/BlockErase/Lock) operate on — not arbitrary bytes. Setting `^RB` declares: how many bits in a block (`n`), where the first writable block starts (`b`), the per-bank read/write/lock policy (`r`/`m`/`w`). Most modern tags support per-word access (16-bit blocks) without `^RB`; `^RB` matters for older or specialised inlays whose firmware exposes blocks of 32/64/128 bits and refuses unaligned writes.",
      "category": "rfid",
      "syntax": "^RBn,b,r,m,w",
      "parameters": [
        {
          "name": "n",
          "description": "Block bit length — typically 16 (default per-word), 32, 64, or 128. Inlay-firmware-dependent; sizes outside the supported set silently fail BlockWrite"
        },
        {
          "name": "b",
          "description": "Starting bit position (offset within bank) for the configured block; defaults to 0"
        },
        {
          "name": "r",
          "description": "Read access policy: `0` open, `1` permanent open, `2` secured (password required), `3` permanent secured"
        },
        {
          "name": "m",
          "description": "Memory bank lock policy — same value space as `r`, applied at write time"
        },
        {
          "name": "w",
          "description": "Write access policy: `0` open, `1` permanent open, `2` secured, `3` permanent secured (lock — irreversible)"
        }
      ],
      "whenToUse": "**Tag-class dependent — check the inlay datasheet first.** Class-1 Gen-2 tags (Impinj Monza, NXP UCODE, Alien Higgs) commonly support both per-word and BlockWrite (multi-word atomic), but the supported block sizes vary by chip family — `^RB32` works on some Monza variants and silently fails on others. Use `^RB` when (1) the inlay datasheet specifies a non-default block size, (2) you need atomic multi-word writes for tamper-evidence, (3) you are setting block-level lock policy (`m`/`w`) for compliance encoding. Skip it for typical SGTIN-96 EPC writes — those work fine on the default per-word geometry. Always pair with `^RS` (encoder setup) and verify with `^RT` after the first encode batch.",
      "example": {
        "source": "^XA\n^RS8\n^RB32,16,0,2,2\n^XZ",
        "description": "After Gen2 setup (`^RS8`), declare a **32-bit block** geometry starting at bit offset 16, with read open (`r=0`), bank locked-via-password on write (`m=2`), and write secured (`w=2`). Subsequent `^RF`/`^RT` will operate on 32-bit aligned blocks. Whether the tag honours this depends on its firmware — verify with `^RT` after encoding a test batch and confirm the readback matches."
      },
      "previewSupported": false,
      "canonicalUrl": "https://rfid.me/reference/zpl/rb/"
    },
    {
      "command": "^RE",
      "name": "RFID Enable/Disable",
      "description": "Enables or disables RFID functionality on the printer. When disabled, ^RF commands are ignored and no RFID encoding occurs.",
      "category": "rfid",
      "syntax": "^REa",
      "parameters": [
        {
          "name": "a",
          "description": "Y (enable RFID) or N (disable RFID)"
        }
      ],
      "whenToUse": "When switching between RFID and non-RFID label stock — disable to avoid RFID errors on plain labels.",
      "example": {
        "source": "^XA\n^REY\n^XZ",
        "description": "Enable RFID encoding"
      },
      "previewSupported": false,
      "canonicalUrl": "https://rfid.me/reference/zpl/re/"
    },
    {
      "command": "^RI",
      "name": "RFID Tag ID",
      "description": "Reads the unique Tag ID (TID) from the RFID chip. The TID is factory-programmed and cannot be changed — it uniquely identifies the chip itself.",
      "category": "rfid",
      "syntax": "^RIa",
      "parameters": [
        {
          "name": "a",
          "description": "Format: H (hex), A (ASCII)"
        }
      ],
      "whenToUse": "For tag authentication — verify the chip is genuine by reading its factory-set TID.",
      "example": {
        "source": "^XA\n^RIH\n^XZ",
        "description": "Read the RFID tag's unique TID in hex"
      },
      "previewSupported": false,
      "canonicalUrl": "https://rfid.me/reference/zpl/ri/"
    },
    {
      "command": "^RL",
      "name": "RFID Label Location",
      "description": "Sets the position of the RFID inlay within the label, measured from the leading edge. Tells the printer where the antenna is so it encodes at the right moment during the print stroke.",
      "category": "rfid",
      "syntax": "^RLn",
      "parameters": [
        {
          "name": "n",
          "description": "Distance from label leading edge in dots"
        }
      ],
      "whenToUse": "When using label stock with non-standard inlay placement — critical for reliable encoding.",
      "example": {
        "source": "^XA\n^RL200\n^XZ",
        "description": "Set RFID inlay position at 200 dots from label edge"
      },
      "previewSupported": false,
      "canonicalUrl": "https://rfid.me/reference/zpl/rl/"
    },
    {
      "command": "^RM",
      "name": "RFID Calibration Mode",
      "description": "Sets the RFID calibration mode — controls how the printer optimises encoding power. Auto mode lets the printer find the best power; manual mode uses a fixed value.",
      "category": "rfid",
      "syntax": "^RMa",
      "parameters": [
        {
          "name": "a",
          "description": "Mode: A (auto), M (manual)"
        }
      ],
      "whenToUse": "When auto-calibration isn't reliable — set manual mode and specify exact power levels.",
      "example": {
        "source": "^XA\n^RMA\n^XZ",
        "description": "Set RFID calibration to automatic mode"
      },
      "previewSupported": false,
      "canonicalUrl": "https://rfid.me/reference/zpl/rm/"
    },
    {
      "command": "^RN",
      "name": "RFID No-Read",
      "description": "Sets how many void labels the printer will produce before stopping when an RFID tag fails to encode. Void labels are printed with \"VOID\" across them.",
      "category": "rfid",
      "syntax": "^RNn",
      "parameters": [
        {
          "name": "n",
          "description": "Number of retries/void labels before error (0 = no limit)"
        }
      ],
      "whenToUse": "Production lines — controls how many failed tags are tolerated before the printer pauses for operator attention.",
      "example": {
        "source": "^XA\n^RN3\n^XZ",
        "description": "Allow 3 RFID encoding failures before stopping"
      },
      "previewSupported": false,
      "canonicalUrl": "https://rfid.me/reference/zpl/rn/"
    },
    {
      "command": "^RQ",
      "name": "RFID Query",
      "description": "Queries the RFID subsystem for its current status — reports tag presence, last operation result, error codes, and power levels.",
      "category": "rfid",
      "syntax": "^RQ",
      "parameters": [],
      "whenToUse": "Diagnostics — check if the RFID system is working, if a tag is present, and what the last error was.",
      "example": {
        "source": "^XA\n^RQ\n^XZ",
        "description": "Query RFID subsystem status"
      },
      "previewSupported": false,
      "canonicalUrl": "https://rfid.me/reference/zpl/rq/"
    },
    {
      "command": "^RR",
      "name": "RFID Retry",
      "description": "Sets how many times the encoder will **re-attempt the read or write against the same physical tag** before declaring the operation failed. A \"failure\" is any of: (1) **read-back mismatch** — written value does not match what was just programmed (the most common failure mode, indicates a partial write or bad coupling), (2) **weak / no signal** — the inlay is missing, dead, or the antenna alignment is off, (3) **blank tag response** — the tag answers but reports no value where one is expected, (4) **protocol error** — Gen2 NACK or password failure on locked memory. **When all `n` attempts are exhausted**, the printer voids the label (paints the configured void pattern across it via `^MMV` settings or the global void style) and feeds the next blank tag, where a fresh attempt begins. The voided-label count then increments toward the `^RS` `e` ceiling — too many consecutive voids halt the printer.",
      "category": "rfid",
      "syntax": "^RRn",
      "parameters": [
        {
          "name": "n",
          "description": "Number of retry attempts per tag operation; typical 3 (default), max usually 10 (firmware-dependent). High values hide real problems"
        }
      ],
      "whenToUse": "**Default 3 is the right answer for typical Gen2 inlay batches** — it absorbs intermittent coupling glitches without masking real problems. Bump to 5–10 only when you have evidence of borderline-encoder-positioning issues or marginal antenna alignment that you cannot fix at the hardware level. **Avoid high counts (>10)** — they hide genuine defects (dead inlays, wrong protocol, mis-set encoder power) and waste media: every retry costs another encode attempt before the label gives up. If you find yourself raising `^RR` past 5, run `~JC` to recalibrate, verify `^RS` matches the inlay protocol, and check encoder antenna position before adding more retries. Pair with `^RS` `e` to control how many voids in a row trip the halt-on-batch-failure safety.",
      "example": {
        "source": "^XA\n^RS8\n^RR3\n^RFW,H,0,12,0^FD0123456789ABCDEF01234567^FS\n^XZ",
        "description": "After Gen2 setup, allow up to 3 attempts to write 12 hex bytes (24 chars) to the EPC bank. If all 3 fail (read-back mismatch, weak signal, or blank tag), the label is voided (printed with the configured void pattern) and the printer feeds the next blank tag for a fresh attempt. The voided count increments toward the `^RS` `e` ceiling."
      },
      "previewSupported": false,
      "canonicalUrl": "https://rfid.me/reference/zpl/rr/"
    },
    {
      "command": "^RS",
      "name": "RFID Setup",
      "description": "**Configures the RFID encoder before any read or write** in the same label format. The first parameter `t` selects the **tag protocol** the encoder will use to talk to the inlay — `8` is **Gen2** (EPC Class-1 Gen-2, the dominant UHF standard, used by virtually every modern RFID label). Older protocols still selectable: `1` ISO 18000-6B, `4` Gen1, `5` ISO 18000-6A, `6` UCODE EPC 1.19. The remaining parameters tune **encoder retry / void behaviour**: `e` voided-label count limit, `n` numeric retry count for write failures, `a` antenna port (multi-antenna encoders only). Without an `^RS` in the format, the encoder runs on whatever defaults the firmware was configured with — which may not match the inlay protocol, silently fail, and ship blank or mis-encoded labels.",
      "category": "rfid",
      "syntax": "^RSt,p,v,n,e,a,c,s",
      "parameters": [
        {
          "name": "t",
          "description": "Tag protocol: `8` Gen2 (default, recommended), `1` ISO 18000-6B, `4` Gen1, `5` ISO 18000-6A, `6` UCODE EPC 1.19"
        },
        {
          "name": "p",
          "description": "Position of the RFID label (start position offset in dots) — for printers where the encoder is offset from the print head; default depends on printer model"
        },
        {
          "name": "v",
          "description": "Length of the void message (dots) printed across a failed label; `0` disables voiding"
        },
        {
          "name": "n",
          "description": "Number of retries per label before declaring a write failure (typical 3)"
        },
        {
          "name": "e",
          "description": "Voided-label count limit — printer halts after this many consecutive voids (typical 3)"
        },
        {
          "name": "a",
          "description": "Antenna port for multi-antenna encoders (1–8 model-dependent); usually omitted"
        },
        {
          "name": "c",
          "description": "Reserved / `^RS` continuation flag (firmware-specific)"
        },
        {
          "name": "s",
          "description": "Reserved / additional setup field (firmware-specific)"
        }
      ],
      "whenToUse": "**Send `^RS` once at the top of every RFID format**, before any `^RF`/`^RT`/`^RW`/`^RZ` operation. The Gen2 default `^RS8` is the right answer for ~99% of modern UHF inlays (any chip from Impinj Monza, NXP UCODE, Alien Higgs families). Set `e` (voided-label limit) to control batch-failure handling — when `e` consecutive labels fail to encode the printer halts (default is usually 3); raise it for unreliable inlay batches, lower it to fail-fast in production. The `n` retry count works per-label, not per-batch. Cross-references: `^RF` (read/write), `^RT` (read tag), `^RZ` (lock memory), `^WT`/`^WV` (verify written data).",
      "example": {
        "source": "^XA\n^RS8,,,,5\n^RFW,H,0,12,0\n^FD3034257BF7194E4000001A85^FS\n^XZ",
        "description": "Selects Gen2 protocol (`t=8`), leaves position/void/retry at firmware defaults, sets the voided-label count limit to 5 (`e=5`) — printer will void up to 5 labels in a row before halting on a bad inlay batch. The subsequent `^RFW` write into the EPC bank uses this configuration."
      },
      "previewSupported": false,
      "canonicalUrl": "https://rfid.me/reference/zpl/rs/"
    },
    {
      "command": "^RT",
      "name": "RFID Read Tag",
      "description": "Reads bytes from an RFID tag memory bank and **routes the result to one of two destinations**: (1) **into a numbered field on the same label** — the read value is captured into field number `f`, and any later `^FN<f>^FS` placeholder in the format substitutes that read value into a printable field (so the printed label can show what was just read); (2) **back to the host** over the serial / network connection — used by host-driven verification flows that need to log encoded values, build serial→tag mappings, or fail jobs on mismatch. The destination depends on the printer's host-status mode and whether the format contains a matching `^FN<f>` reference. Comparable to `^RFR,…` (the read variant of `^RF`) but `^RT` predates the consolidated `^RF` syntax and remains common in legacy templates.",
      "category": "rfid",
      "syntax": "^RTf,b,n,r,m,p",
      "parameters": [
        {
          "name": "f",
          "description": "Field number (1–9999) that receives the read value; pair with `^FN<f>^FS` later in the format to print it"
        },
        {
          "name": "b",
          "description": "Starting byte offset within the chosen memory bank (default 0)"
        },
        {
          "name": "n",
          "description": "Number of bytes to read; for hex format the field receives `2 × n` characters"
        },
        {
          "name": "r",
          "description": "Per-read retry count before declaring a failure"
        },
        {
          "name": "m",
          "description": "Memory bank — letter form: `E` EPC, `T` TID (read-only chip serial), `U` USER, `R` RESERVED"
        },
        {
          "name": "p",
          "description": "Password offset within the RESERVED bank, when accessing protected banks (default 0)"
        }
      ],
      "whenToUse": "For **read-back-after-write verification labels** (write a serial via `^RF`, then `^RT` it back into a `^FN` placeholder so the printed barcode shows the actual encoded value — proves the encode succeeded). Also for **read-only audits** (tag-survey workflows pulling EPCs out of an inbound roll, host-driven inventory). Always preceded by `^RS` (RFID Setup — see #83) so the encoder protocol matches the inlay. Cross-reference `^FN`/`^FD` for placeholder substitution and `^RF` for the modern read/write command.",
      "example": {
        "source": "^XA\n^RS8\n^RT1,0,8,3,E,0\n^FO50,50^FN1^FS\n^XZ",
        "description": "After `^RS8` (Gen2 setup), read 8 bytes from the EPC bank starting at offset 0 (`m=E`, `b=0`, `n=8`), with 3 retries on failure. The value lands in field 1; the `^FN1^FS` placeholder later in the format prints those 8 bytes (16 hex characters) on the label as a verification text — operator can scan-compare the printed value against what the optical barcode encodes."
      },
      "previewSupported": false,
      "canonicalUrl": "https://rfid.me/reference/zpl/rt/"
    },
    {
      "command": "^RU",
      "name": "RFID Read Until",
      "description": "Reads RFID tag data until a specific condition is met or a delimiter is found. Useful for reading variable-length data from user memory.",
      "category": "rfid",
      "syntax": "^RUa,b",
      "parameters": [
        {
          "name": "a",
          "description": "Memory bank to read from"
        },
        {
          "name": "b",
          "description": "Stop condition or delimiter"
        }
      ],
      "whenToUse": "When reading variable-length data from RFID tags where you don't know the exact length in advance.",
      "example": {
        "source": "^XA\n^RUU,00\n^XZ",
        "description": "Read user memory until a null byte is found"
      },
      "previewSupported": false,
      "canonicalUrl": "https://rfid.me/reference/zpl/ru/"
    },
    {
      "command": "~RV",
      "name": "RFID Verify Valid Tag",
      "description": "Verifies that a valid RFID tag is present and functioning. Returns tag type, memory size, and status. A quick health check for the tag.",
      "category": "rfid",
      "syntax": "~RV",
      "parameters": [],
      "whenToUse": "Before encoding — verify the tag is present and responsive to avoid wasting labels.",
      "example": {
        "source": "~RV",
        "description": "Check if a valid RFID tag is present"
      },
      "previewSupported": false,
      "canonicalUrl": "https://rfid.me/reference/zpl/rv/"
    },
    {
      "command": "^RW",
      "name": "RFID Write",
      "description": "Writes data to a specific memory bank on the RFID tag. More granular than ^RF — lets you target specific memory banks and addresses.",
      "category": "rfid",
      "syntax": "^RWa,b,c",
      "parameters": [
        {
          "name": "a",
          "description": "Memory bank: E (EPC), U (user), R (reserved)"
        },
        {
          "name": "b",
          "description": "Start address (word offset)"
        },
        {
          "name": "c",
          "description": "Format: H (hex), A (ASCII)"
        }
      ],
      "whenToUse": "When you need to write to specific tag memory locations (user memory, access password, etc.) rather than just the EPC.",
      "example": {
        "source": "^XA\n^RWU,0,H^FD48656C6C6F^FS\n^XZ",
        "description": "Write \"Hello\" in hex to user memory bank"
      },
      "previewSupported": false,
      "canonicalUrl": "https://rfid.me/reference/zpl/rw/"
    },
    {
      "command": "^RZ",
      "name": "RFID Zero Memory",
      "description": "Zeros out (clears) a memory bank on the RFID tag. Writes all zeros to the specified bank. Cannot zero the TID bank (factory-set).",
      "category": "rfid",
      "syntax": "^RZa",
      "parameters": [
        {
          "name": "a",
          "description": "Memory bank: E (EPC), U (user), R (reserved)"
        }
      ],
      "whenToUse": "When repurposing or recycling RFID tags — clear old data before writing new data.",
      "example": {
        "source": "^XA\n^RZU\n^XZ",
        "description": "Zero out the user memory bank"
      },
      "previewSupported": false,
      "canonicalUrl": "https://rfid.me/reference/zpl/rz/"
    },
    {
      "command": "^WT",
      "name": "RFID Write Tag",
      "description": "Sets the number of write retries for RFID encoding. If a write fails, the printer retries up to this many times before voiding the label.",
      "category": "rfid",
      "syntax": "^WTn",
      "parameters": [
        {
          "name": "n",
          "description": "Number of write retries"
        }
      ],
      "whenToUse": "Adjust write reliability vs speed — more retries means fewer void labels but slower throughput.",
      "example": {
        "source": "^XA\n^WT3\n^XZ",
        "description": "Set RFID write retries to 3"
      },
      "previewSupported": false,
      "canonicalUrl": "https://rfid.me/reference/zpl/wt/"
    },
    {
      "command": "^WV",
      "name": "RFID Verify Write",
      "description": "Enables or disables automatic verification after RFID writes. When enabled, the printer reads back the data after writing to confirm it was encoded correctly.",
      "category": "rfid",
      "syntax": "^WVa",
      "parameters": [
        {
          "name": "a",
          "description": "Y (verify after write) or N (skip verification)"
        }
      ],
      "whenToUse": "Quality assurance — enable to catch encoding errors at the cost of slightly slower throughput.",
      "example": {
        "source": "^XA\n^WVY\n^XZ",
        "description": "Enable RFID write verification"
      },
      "previewSupported": false,
      "canonicalUrl": "https://rfid.me/reference/zpl/wv/"
    },
    {
      "command": "^A@",
      "name": "Use Font Name to Call Font",
      "description": "Selects a downloaded TrueType font by filename rather than the single-letter alias assigned with ^CW. Allows using any downloaded font directly.",
      "category": "text",
      "syntax": "^A@o,h,w,d:fontname.TTF",
      "parameters": [
        {
          "name": "o",
          "description": "Rotation: N, R, I, or B"
        },
        {
          "name": "h",
          "description": "Font height in dots"
        },
        {
          "name": "w",
          "description": "Font width in dots"
        },
        {
          "name": "d",
          "description": "Drive: R, E, or B"
        },
        {
          "name": "fontname.TTF",
          "description": "Filename of the downloaded font"
        }
      ],
      "whenToUse": "When you have downloaded TrueType fonts and want to use them without first assigning a letter with ^CW.",
      "example": {
        "source": "^XA\n^A@N,40,40,E:ARIAL.TTF\n^FO50,50^FDArial text^FS\n^XZ",
        "description": "Use a downloaded Arial font by filename"
      },
      "previewSupported": false,
      "canonicalUrl": "https://rfid.me/reference/zpl/a/"
    },
    {
      "command": "^FC",
      "name": "Field Clock",
      "description": "Sets the field clock characters used for real-time clock (RTC) substitution in ^FD data. When the printer encounters these characters in text, it replaces them with the current date/time.",
      "category": "text",
      "syntax": "^FCa,b,c",
      "parameters": [
        {
          "name": "a",
          "description": "Clock indicator character 1"
        },
        {
          "name": "b",
          "description": "Clock indicator character 2"
        },
        {
          "name": "c",
          "description": "Clock indicator character 3"
        }
      ],
      "whenToUse": "When printing date/time stamps — define which characters in your ^FD text should be replaced with clock values.",
      "example": {
        "source": "^XA\n^FC%,%,%\n^FO50,50^A0N,30,30^FDPrinted: %d/%m/%Y^FS\n^XZ",
        "description": "Use % as clock indicator for date substitution"
      },
      "previewSupported": false,
      "canonicalUrl": "https://rfid.me/reference/zpl/fc/"
    },
    {
      "command": "^FL",
      "name": "Font Link",
      "description": "Defines a fallback chain: when a glyph is missing from the **base** font, the printer falls back to the **linked** font for that glyph. Same idea as web `font-family` fallback. Multiple `^FL` calls chain — base → link 1 → link 2 → ... — so a Latin primary can fall back to a CJK font for Chinese characters and to a symbol font for currency, all in one render.",
      "category": "text",
      "syntax": "^FLd:base.TTF,d:link.TTF",
      "parameters": [
        {
          "name": "base",
          "description": "Drive + filename of the primary font (e.g. `E:ARIAL.TTF`)"
        },
        {
          "name": "link",
          "description": "Drive + filename of the fallback font, used only for glyphs missing from `base`"
        }
      ],
      "whenToUse": "For multilingual labels where no single font covers every script — e.g. an English/French primary plus Arabic/Hebrew/CJK fallbacks. Without `^FL`, missing glyphs render as the printer's \"missing glyph\" box and silently degrade label quality.",
      "example": {
        "source": "^XA\n^FLE:ARIAL.TTF,E:ARIALUNI.TTF\n^FLE:ARIALUNI.TTF,E:CJK.TTF\n^FO50,50^A@N,30,30,E:ARIAL.TTF^FDLatin + CJK 中文^FS\n^XZ",
        "description": "Two-link chain: Arial → Arial Unicode → CJK font. Latin glyphs use Arial; missing glyphs walk down the chain."
      },
      "previewSupported": false,
      "canonicalUrl": "https://rfid.me/reference/zpl/fl/"
    },
    {
      "command": "^FM",
      "name": "Field Map",
      "description": "Sets an additional offset for field placement. Unlike ^FO which sets absolute position, ^FM adds a relative shift that is applied on top of ^FO coordinates.",
      "category": "data",
      "syntax": "^FMx,y",
      "parameters": [
        {
          "name": "x",
          "description": "Horizontal offset in dots"
        },
        {
          "name": "y",
          "description": "Vertical offset in dots"
        }
      ],
      "whenToUse": "When you need to adjust all field positions by a fixed offset — useful for fine-tuning pre-printed form alignment.",
      "example": {
        "source": "^XA\n^FM10,5\n^FO50,50^A0N,30,30^FDShifted by FM offset^FS\n^XZ",
        "description": "Add a 10x5 dot offset to all field positions"
      },
      "previewSupported": false,
      "canonicalUrl": "https://rfid.me/reference/zpl/fm/"
    },
    {
      "command": "^FV",
      "name": "Field Variable",
      "description": "Supplies variable data for a recalled format (^XF). Works like ^FD but specifically for filling in variable fields in stored templates. Used with ^FN field numbers.",
      "category": "data",
      "syntax": "^FVdata",
      "parameters": [
        {
          "name": "data",
          "description": "Variable data to insert into the template field"
        }
      ],
      "whenToUse": "When printing from a stored template — ^FV provides the changing data (order numbers, names, etc.) while the template provides the layout.",
      "example": {
        "source": "^XA\n^XFR:SHIPPING.ZPL\n^FN1^FVOrder #12345^FS\n^FN2^FV987654321^FS\n^XZ",
        "description": "Recall a template and fill variable fields with ^FV"
      },
      "previewSupported": false,
      "canonicalUrl": "https://rfid.me/reference/zpl/fv/"
    },
    {
      "command": "^SF",
      "name": "Serialization Field",
      "description": "An alternative serialization command to ^SN. Offers more control over which characters in the data increment and by how much.",
      "category": "data",
      "syntax": "^SFa,b,c",
      "parameters": [
        {
          "name": "a",
          "description": "Mask: which positions to increment (hex)"
        },
        {
          "name": "b",
          "description": "Increment value"
        },
        {
          "name": "c",
          "description": "Decrement/increment direction"
        }
      ],
      "whenToUse": "When ^SN's simple increment isn't flexible enough — use ^SF for complex serial number patterns.",
      "example": {
        "source": "^XA\n^FO50,50^A0N,30,30^FD001-A^FS\n^SF0,1,0\n^PQ10\n^XZ",
        "description": "Serialise with custom mask across 10 labels"
      },
      "previewSupported": false,
      "canonicalUrl": "https://rfid.me/reference/zpl/sf/"
    },
    {
      "command": "^XB",
      "name": "Suppress Backfeed",
      "description": "Suppresses the backfeed that normally occurs at the end of a label format. The label stays in its current position instead of backing up to the tear/peel position.",
      "category": "config",
      "syntax": "^XB",
      "parameters": [],
      "whenToUse": "When printing multiple formats in sequence and you don't want backfeed between them — improves throughput.",
      "example": {
        "source": "^XA\n^XB\n^FO50,50^A0N,30,30^FDNo backfeed^FS\n^XZ",
        "description": "Print label without backfeed at end"
      },
      "previewSupported": false,
      "canonicalUrl": "https://rfid.me/reference/zpl/xb/"
    },
    {
      "command": "^XG",
      "name": "Recall Graphic",
      "description": "Recalls a graphic that was **previously stored** in printer memory and places it at the current `^FO` position. The graphic must exist on one of the printer storage devices first — uploaded via `~DG` (download GRF), `~DY` (download arbitrary file), or transferred from USB. The leading `d:` selects which storage device: `R:` = volatile RAM (lost on power-off, fastest), `E:` = onboard flash (persistent, default if `d:` omitted), `B:` = optional non-volatile memory (when fitted). Like `^IM` but adds optional `mx,my` magnification, so the same stored asset can render at multiple sizes without re-uploading.",
      "category": "storage",
      "syntax": "^XGd:name.GRF,mx,my",
      "parameters": [
        {
          "name": "d",
          "description": "Storage device: `R:` RAM (volatile, fast), `E:` flash (default, persistent), `B:` optional memory module"
        },
        {
          "name": "name.GRF",
          "description": "Filename of a previously stored graphic (typically `.GRF`; some firmware also accepts `.PNG`/`.BMP` recalled by name)"
        },
        {
          "name": "mx",
          "description": "Horizontal magnification factor, integer 1–10"
        },
        {
          "name": "my",
          "description": "Vertical magnification factor, integer 1–10"
        }
      ],
      "whenToUse": "For repeat-use logos, headers, watermarks — upload once, recall many. `mx` and `my` independently scale the recalled bitmap from 1× to 10× (integer factors only — fractional scaling is not supported). Use `R:` during development for quick iteration, `E:` for shipped firmware so the asset survives reboot. If you only need 1:1 placement of a fixed-size image inline, prefer `^IM`; if the asset already lives in flash and you want sizing flexibility, prefer `^XG`.",
      "example": {
        "source": "^XA\n^FO50,50\n^XGE:LOGO.GRF,2,2^FS\n^XZ",
        "description": "Recall `LOGO.GRF` from onboard flash (`E:`) and render at 2× horizontal, 2× vertical magnification at FO 50,50. Assumes `LOGO.GRF` was previously stored via `~DG` or USB import."
      },
      "previewSupported": true,
      "canonicalUrl": "https://rfid.me/reference/zpl/xg/"
    },
    {
      "command": "^DF",
      "name": "Download Format",
      "description": "Writes the **current label format** (everything between `^XA` and `^XZ` in the same job) to a named file on a printer storage device. The path takes the standard `d:name.ext` form: `d` is the storage device — `R:` volatile RAM (lost on power-off, fastest), `E:` onboard flash (default if `d:` omitted; **persists across power cycles**), `B:` optional non-volatile memory module if fitted. `^DF` is the **producer side** of the `^DF`/`^XF` template pattern: store once with `^DF`, then recall many times with `^XF` and inject per-print data via `^FN` variable substitution. The job that contains `^DF` does NOT print — it stores the format.",
      "category": "storage",
      "syntax": "^DFd:o.x",
      "parameters": [
        {
          "name": "d",
          "description": "Storage device: `R:` RAM (volatile, fast), `E:` flash (default, persistent across power cycles), `B:` optional memory module"
        },
        {
          "name": "o.x",
          "description": "Filename including extension (typically `.ZPL` or `.GRF`); 1–8 character base name per Zebra firmware limits"
        }
      ],
      "whenToUse": "For label layouts reused with different data per print (shipping labels, badges, asset tags). Write to `E:` for production firmware so the template survives reboot; `R:` is fine during development for quick iteration. Always pair `^DF` with `^XF` (recall) and `^FN` (numbered variable placeholders) — `^DF` is meaningless without a downstream `^XF`. Saves transmission bandwidth: send the full layout once at provisioning, then transmit only the variable data per print.",
      "example": {
        "source": "^XA\n^DFE:SHIPPING.ZPL\n^FO50,50^A0N,30,30^FN1^FS\n^FO50,100^BY2^BCN,80,Y^FN2^FS\n^XZ",
        "description": "Stores a two-field shipping template to onboard flash (`E:SHIPPING.ZPL`) — `^FN1` for address line, `^FN2` for tracking-number barcode. Persists across power cycles. Recall later with `^XFE:SHIPPING.ZPL` and supply field data via `^FN1^FD…^FS` / `^FN2^FD…^FS`."
      },
      "previewSupported": true,
      "canonicalUrl": "https://rfid.me/reference/zpl/df/"
    },
    {
      "command": "^XF",
      "name": "Recall Format",
      "description": "Loads a label format previously stored with `^DF`, then merges in per-print variable data via `^FN<n>^FD<value>^FS` lines. The stored format contains numbered placeholders (`^FN1`, `^FN2`, …) at field positions; the recall job supplies one `^FN<n>^FD<value>^FS` per placeholder. The path is the same `d:name.ext` form as `^DF`/`^XG`: `R:` volatile RAM, `E:` flash (default if `d:` omitted, persistent), `B:` optional memory module. `^XF` is the **consumer side** of the `^DF`/`^XF`/`^FN` template pattern — meaningless without a corresponding `^DF` having stored the format earlier.",
      "category": "storage",
      "syntax": "^XFd:o.x",
      "parameters": [
        {
          "name": "d",
          "description": "Storage device: `R:` RAM (volatile), `E:` flash (default, persistent), `B:` optional memory module"
        },
        {
          "name": "o.x",
          "description": "Filename of a format previously stored via `^DF` — typically `name.ZPL` (1–8 character base per Zebra firmware limits)"
        }
      ],
      "whenToUse": "For high-volume production where labels share a fixed layout (shipping, asset tags, manufacturing serials) and only a handful of fields change per print. Sending only the `^FN<n>^FD<value>` lines uses far less bandwidth than re-transmitting the full layout per label, and lets the printer cache the parsed format. Pair every `^XF` with a matching `^DF` (typically run at provisioning) and number the `^FN` placeholders consistently between them. Use `^FN<n>` ordering or by name as supported by your firmware.",
      "example": {
        "source": "^XA\n^XFE:LABEL.ZPL\n^FN1^FDPart-A1234^FS\n^FN2^FDLot-2026-04^FS\n^XZ",
        "description": "Recall the format previously stored at `E:LABEL.ZPL` (which contains `^FN1` and `^FN2` placeholders) and substitute runtime values: `Part-A1234` into the field at `^FN1`, `Lot-2026-04` into `^FN2`. Compare to the producer side: `^DF` example shows the matching store step."
      },
      "previewSupported": true,
      "canonicalUrl": "https://rfid.me/reference/zpl/xf/"
    },
    {
      "command": "^ID",
      "name": "Delete Object",
      "description": "**Permanently removes** a stored file from a printer storage device — formats (`.ZPL`), graphics (`.GRF`/`.PNG`), fonts (`.FNT`), or arbitrary downloaded files (`.DAT`). The path uses the standard `d:name.ext` form: `R:` volatile RAM (deletion is moot — it disappears at power-off anyway), `E:` onboard flash (deletion is **persistent** — file is gone after `^XZ` and survives reboot), `B:` optional memory module. **No undo and no confirmation prompt** — the deletion happens immediately when the format is parsed. Wildcards in either name (`LOGO*.GRF`) or extension (`*.ZPL`) match multiple files; `*.*` deletes everything on the device. Fail-safe: deleting a non-existent file is a no-op (no error, no warning).",
      "category": "storage",
      "syntax": "^IDd:o.x",
      "parameters": [
        {
          "name": "d",
          "description": "Storage device: `R:` RAM (volatile, fast), `E:` flash (default, persistent), `B:` optional memory module"
        },
        {
          "name": "o.x",
          "description": "Filename including extension; supports wildcards — `LOGO*.GRF`, `*.ZPL`, `*.*` to delete everything on the device"
        }
      ],
      "whenToUse": "For housekeeping during firmware provisioning or template lifecycle (replace v1 of a label with v2 — `^ID` v1 then `^DF` v2). **Do not** include `^ID` in production-print formats — it permanently removes assets that downstream `^XG`/`^XF` recalls depend on. Use the storage prefix that matches what you stored: a `^DF` to `E:` is undone by `^IDE:`. Test with `^WD` first to see what is on the device before issuing wildcard deletes; once gone, the file must be re-uploaded.",
      "example": {
        "source": "^XA\n^IDE:FORMAT.ZPL\n^XZ",
        "description": "Permanently removes `FORMAT.ZPL` from onboard flash. Survives reboot. No prompt, no undo. If `FORMAT.ZPL` does not exist on `E:`, the command is a no-op (no error). Run `^XA^WDE:*.ZPL^XZ` first to see what is currently stored."
      },
      "previewSupported": true,
      "canonicalUrl": "https://rfid.me/reference/zpl/id/"
    },
    {
      "command": "^IM",
      "name": "Image Move",
      "description": "Recalls a previously stored graphic (like a logo) and places it on the label at the current ^FO position. The graphic must have been stored first using ~DG or ^DY.",
      "category": "storage",
      "syntax": "^IMd:name.GRF",
      "parameters": [
        {
          "name": "d",
          "description": "Drive: R, E, or B"
        },
        {
          "name": "name.GRF",
          "description": "Filename of the stored graphic"
        }
      ],
      "whenToUse": "When your label needs a logo or image that's already saved on the printer.",
      "example": {
        "source": "^XA\n^FO50,50^IMR:LOGO.GRF^FS\n^FO200,50^A0N,30,30^FDAcme Corp^FS\n^XZ",
        "description": "Place a stored logo next to company name"
      },
      "previewSupported": true,
      "canonicalUrl": "https://rfid.me/reference/zpl/im/"
    },
    {
      "command": "~DG",
      "name": "Download Graphic",
      "description": "Downloads a graphic image (like a logo) to the printer's memory so it can be recalled later with ^XG or ^IM. The image data is ASCII hex, or a ZB64 envelope (`:B64:`/`:Z64:`) — the same encodings `^GF` accepts.",
      "category": "download",
      "syntax": "~DGd:name.GRF,total,bpr,data",
      "parameters": [
        {
          "name": "d",
          "description": "Drive letter: R (RAM), E (flash), B (both)"
        },
        {
          "name": "name.GRF",
          "description": "Filename to store as (e.g., LOGO.GRF)"
        },
        {
          "name": "total",
          "description": "Total number of bytes in the graphic"
        },
        {
          "name": "bpr",
          "description": "Bytes per row"
        },
        {
          "name": "data",
          "description": "Image bitmap: ASCII hex, or a `:B64:<base64>:<crc>` / `:Z64:<base64>:<crc>` (ZB64) envelope"
        }
      ],
      "whenToUse": "When you need to store a logo or graphic on the printer for repeated use across many labels.",
      "example": {
        "source": "~DGR:LOGO.GRF,00080,004,FFFF00FF00FFFFFF00FF00FFFF",
        "description": "Download a small graphic to RAM as LOGO.GRF"
      },
      "previewSupported": true,
      "canonicalUrl": "https://rfid.me/reference/zpl/dg/"
    },
    {
      "command": "~DY",
      "name": "Download Objects",
      "description": "A more versatile version of ~DG — downloads fonts, graphics, or other objects in various formats (PNG, TTF, etc.) to the printer's storage.",
      "category": "download",
      "syntax": "~DYd:name,format,ext,total,bpr,data",
      "parameters": [
        {
          "name": "d",
          "description": "Drive letter: R, E, or B"
        },
        {
          "name": "name",
          "description": "Object name"
        },
        {
          "name": "format",
          "description": "Source data format: A (uncompressed), B (binary), P (PNG)"
        },
        {
          "name": "ext",
          "description": "File extension: .GRF, .TTF, .PNG, etc."
        },
        {
          "name": "total",
          "description": "Total number of bytes"
        },
        {
          "name": "bpr",
          "description": "Bytes per row (for graphics)"
        },
        {
          "name": "data",
          "description": "The object data"
        }
      ],
      "whenToUse": "When downloading TrueType fonts, PNG images, or other non-GRF objects to the printer.",
      "example": {
        "source": "~DYE:MYFONT,A,.TTF,28000,0,<font data>",
        "description": "Download a TrueType font to flash storage"
      },
      "previewSupported": false,
      "canonicalUrl": "https://rfid.me/reference/zpl/dy/"
    },
    {
      "command": "~DB",
      "name": "Download Bitmap Font",
      "description": "Downloads a bitmap font to the printer. Bitmap fonts are fixed-size, pixel-perfect fonts — useful when you need exact character shapes at specific sizes.",
      "category": "download",
      "syntax": "~DBd:name,orientation,height,data",
      "parameters": [
        {
          "name": "d",
          "description": "Drive letter: R, E, or B"
        },
        {
          "name": "name",
          "description": "Font name"
        },
        {
          "name": "orientation",
          "description": "N (normal), R (rotated 90°), I (inverted), B (bottom-up)"
        },
        {
          "name": "height",
          "description": "Character height in dots"
        },
        {
          "name": "data",
          "description": "Bitmap data for the font characters"
        }
      ],
      "whenToUse": "When you need a custom bitmap font that isn't built into the printer.",
      "example": {
        "source": "~DBE:CUSTOM.FNT,N,24,<font data>",
        "description": "Download a 24-dot bitmap font to flash"
      },
      "previewSupported": false,
      "canonicalUrl": "https://rfid.me/reference/zpl/db/"
    },
    {
      "command": "~DE",
      "name": "Download Encoding",
      "description": "Downloads a custom character encoding table to the printer, allowing you to remap which characters appear for specific byte values.",
      "category": "download",
      "syntax": "~DEd:name,size,data",
      "parameters": [
        {
          "name": "d",
          "description": "Drive letter: R, E, or B"
        },
        {
          "name": "name",
          "description": "Encoding table name"
        },
        {
          "name": "size",
          "description": "Size of the encoding data"
        },
        {
          "name": "data",
          "description": "Encoding table data"
        }
      ],
      "whenToUse": "When you need a custom character encoding that isn't built into the printer (rare — usually ^CI is sufficient).",
      "example": {
        "source": "~DEE:CUSTOM.DAT,256,<encoding data>",
        "description": "Download a custom encoding table"
      },
      "previewSupported": false,
      "canonicalUrl": "https://rfid.me/reference/zpl/de/"
    },
    {
      "command": "~DN",
      "name": "Abort Download",
      "description": "Cancels a download that is currently in progress. Useful if you started a ~DG or ~DY transfer and need to abort it.",
      "category": "download",
      "syntax": "~DN",
      "parameters": [],
      "whenToUse": "When a download is in progress and needs to be cancelled.",
      "example": {
        "source": "~DN",
        "description": "Abort the current download operation"
      },
      "previewSupported": false,
      "canonicalUrl": "https://rfid.me/reference/zpl/dn/"
    },
    {
      "command": "~DS",
      "name": "Download Intellifont",
      "description": "Downloads an Intellifont (scalable outline font) to the printer. Intellifonts can be scaled to any size without losing quality.",
      "category": "download",
      "syntax": "~DSd:name,size,data",
      "parameters": [
        {
          "name": "d",
          "description": "Drive letter: R, E, or B"
        },
        {
          "name": "name",
          "description": "Font name"
        },
        {
          "name": "size",
          "description": "Total size in bytes"
        },
        {
          "name": "data",
          "description": "Intellifont data"
        }
      ],
      "whenToUse": "When you need a scalable font on older Zebra printers that support Intellifont format.",
      "example": {
        "source": "~DSE:MYFONT.FNT,45000,<font data>",
        "description": "Download an Intellifont to flash storage"
      },
      "previewSupported": false,
      "canonicalUrl": "https://rfid.me/reference/zpl/ds/"
    },
    {
      "command": "~DT",
      "name": "Download Bounded TrueType Font",
      "description": "Downloads a TrueType font to the printer with bounds checking. The font can then be used with ^A@ for high-quality text rendering at any size.",
      "category": "download",
      "syntax": "~DTd:name,size,data",
      "parameters": [
        {
          "name": "d",
          "description": "Drive letter: R, E, or B"
        },
        {
          "name": "name",
          "description": "Font name (e.g., ARIAL.TTF)"
        },
        {
          "name": "size",
          "description": "Total size in bytes"
        },
        {
          "name": "data",
          "description": "TrueType font data"
        }
      ],
      "whenToUse": "When downloading a TrueType font that should be bounds-checked during storage.",
      "example": {
        "source": "~DTE:ARIAL.TTF,85000,<font data>",
        "description": "Download Arial TrueType font to flash"
      },
      "previewSupported": false,
      "canonicalUrl": "https://rfid.me/reference/zpl/dt/"
    },
    {
      "command": "~DU",
      "name": "Download Unbounded TrueType Font",
      "description": "Downloads a TrueType font without bounds checking — faster than ~DT but skips validation. Used when you trust the font data is valid.",
      "category": "download",
      "syntax": "~DUd:name,size,data",
      "parameters": [
        {
          "name": "d",
          "description": "Drive letter: R, E, or B"
        },
        {
          "name": "name",
          "description": "Font name"
        },
        {
          "name": "size",
          "description": "Total size in bytes"
        },
        {
          "name": "data",
          "description": "TrueType font data"
        }
      ],
      "whenToUse": "When speed matters and you're confident the TrueType font data is well-formed.",
      "example": {
        "source": "~DUE:CUSTOM.TTF,92000,<font data>",
        "description": "Download a TrueType font without bounds checking"
      },
      "previewSupported": false,
      "canonicalUrl": "https://rfid.me/reference/zpl/du/"
    },
    {
      "command": "~EG",
      "name": "Erase All Graphic Images",
      "description": "Deletes all graphic images from the printer's RAM. This is a quick way to free up memory, but it removes ALL stored graphics — not selective.",
      "category": "download",
      "syntax": "~EG",
      "parameters": [],
      "whenToUse": "When you need to clear all graphics from RAM before downloading new ones, or to free memory.",
      "example": {
        "source": "~EG",
        "description": "Erase all graphics from printer RAM"
      },
      "previewSupported": false,
      "canonicalUrl": "https://rfid.me/reference/zpl/eg/"
    },
    {
      "command": "^CM",
      "name": "Change Memory Letter Designation",
      "description": "Changes the default memory device letter. Normally R: is RAM and E: is flash — this command lets you reassign those letters.",
      "category": "download",
      "syntax": "^CMletter",
      "parameters": [
        {
          "name": "letter",
          "description": "New default memory letter designation"
        }
      ],
      "whenToUse": "Rarely needed. Only when you need to change the default storage location for downloaded objects.",
      "example": {
        "source": "^XA\n^CME\n^XZ",
        "description": "Set flash as the default storage location"
      },
      "previewSupported": false,
      "canonicalUrl": "https://rfid.me/reference/zpl/cm/"
    },
    {
      "command": "^CO",
      "name": "Cache On",
      "description": "Controls the font caching system on the printer. Caching speeds up repeated use of the same font by keeping rendered characters in memory.",
      "category": "download",
      "syntax": "^COaction,size",
      "parameters": [
        {
          "name": "action",
          "description": "Y (enable), N (disable), or size in KB"
        },
        {
          "name": "size",
          "description": "Cache size in KB (optional)"
        }
      ],
      "whenToUse": "When optimising print speed for labels that use the same fonts repeatedly.",
      "example": {
        "source": "^XA\n^COY,512\n^XZ",
        "description": "Enable font cache with 512KB"
      },
      "previewSupported": false,
      "canonicalUrl": "https://rfid.me/reference/zpl/co/"
    },
    {
      "command": "^CW",
      "name": "Font Identifier",
      "description": "Assigns a single-letter alias to a font already stored on the printer so subsequent `^A` commands can select it. The font file must be uploaded **first** (via `~DY`, `~DG`, `~DU`, USB import, or factory pre-load) — `^CW` only maps an existing file to a letter, it does not transfer the font.",
      "category": "download",
      "syntax": "^CWletter,d:name.TTF",
      "parameters": [
        {
          "name": "letter",
          "description": "Single character (A-Z, 0-9) used as the alias in `^A<letter>`"
        },
        {
          "name": "d",
          "description": "Storage device: `R:` (RAM, lost on power-off), `E:` (flash, persistent), `B:` (optional onboard memory). Match where the font was uploaded."
        },
        {
          "name": "name.TTF",
          "description": "Filename on that storage device. Extension is `.TTF`, `.OTF`, `.FNT`, etc."
        }
      ],
      "whenToUse": "After uploading a TrueType / OpenType / bitmap font onto the printer's storage. Place `^CW` near the top of the label so the alias is in scope for all subsequent `^A<letter>` references.",
      "example": {
        "source": "^XA\n^CWM,E:ARIAL.TTF\n^FO50,50^AMN,40,40^FDArial text^FS\n^XZ",
        "description": "Maps letter `M` to `E:ARIAL.TTF`. Requires `ARIAL.TTF` to already exist in flash storage — `^CW` alone does not upload the font."
      },
      "previewSupported": false,
      "canonicalUrl": "https://rfid.me/reference/zpl/cw/"
    },
    {
      "command": "^DC",
      "name": "Download Calendar",
      "description": "Downloads a calendar/date format to the printer's real-time clock. Used to define custom date formats for date-stamped labels.",
      "category": "download",
      "syntax": "^DCformat,language",
      "parameters": [
        {
          "name": "format",
          "description": "Date format string"
        },
        {
          "name": "language",
          "description": "Language for month/day names"
        }
      ],
      "whenToUse": "When your labels include dates and you need a custom date format on printers with a real-time clock.",
      "example": {
        "source": "^XA\n^DC0,Y,YYYY-MM-DD\n^XZ",
        "description": "Set date format to ISO 8601 style"
      },
      "previewSupported": false,
      "canonicalUrl": "https://rfid.me/reference/zpl/dc/"
    },
    {
      "command": "^DN",
      "name": "Abort Download",
      "description": "Aborts a download operation that is currently in progress. The caret version of ~DN — they do the same thing.",
      "category": "download",
      "syntax": "^DN",
      "parameters": [],
      "whenToUse": "When a download needs to be cancelled.",
      "example": {
        "source": "^XA\n^DN\n^XZ",
        "description": "Abort current download from within a label format"
      },
      "previewSupported": false,
      "canonicalUrl": "https://rfid.me/reference/zpl/dn/"
    },
    {
      "command": "^EF",
      "name": "Erase Downloaded Formats",
      "description": "Deletes all stored label formats from the printer's RAM. Does not affect graphics or fonts — only formats saved with ^DF.",
      "category": "download",
      "syntax": "^EF",
      "parameters": [],
      "whenToUse": "When you need to clear old label templates from RAM before loading new ones.",
      "example": {
        "source": "^XA\n^EF\n^XZ",
        "description": "Erase all stored formats from RAM"
      },
      "previewSupported": false,
      "canonicalUrl": "https://rfid.me/reference/zpl/ef/"
    },
    {
      "command": "^HF",
      "name": "Host Format",
      "description": "Sends a stored label format back to the host computer. Useful for retrieving a template that was previously saved on the printer.",
      "category": "download",
      "syntax": "^HFd:name.ZPL",
      "parameters": [
        {
          "name": "d",
          "description": "Drive letter: R, E, or B"
        },
        {
          "name": "name.ZPL",
          "description": "Filename to retrieve"
        }
      ],
      "whenToUse": "When you need to retrieve a stored format from the printer for editing or backup.",
      "example": {
        "source": "^XA\n^HFR:SHIPPING.ZPL\n^XZ",
        "description": "Retrieve the SHIPPING template from RAM"
      },
      "previewSupported": false,
      "canonicalUrl": "https://rfid.me/reference/zpl/hf/"
    },
    {
      "command": "^HG",
      "name": "Host Graphic",
      "description": "Sends a stored graphic image back to the host computer in ASCII hex format. The reverse of ~DG.",
      "category": "download",
      "syntax": "^HGd:name.GRF",
      "parameters": [
        {
          "name": "d",
          "description": "Drive letter: R, E, or B"
        },
        {
          "name": "name.GRF",
          "description": "Graphic filename to retrieve"
        }
      ],
      "whenToUse": "When you need to retrieve a stored graphic from the printer for backup or inspection.",
      "example": {
        "source": "^XA\n^HGR:LOGO.GRF\n^XZ",
        "description": "Retrieve the LOGO graphic from RAM"
      },
      "previewSupported": false,
      "canonicalUrl": "https://rfid.me/reference/zpl/hg/"
    },
    {
      "command": "^HY",
      "name": "Upload Graphic",
      "description": "Uploads a graphic from the printer to the host. Similar to ^HG but uses a different transfer protocol.",
      "category": "download",
      "syntax": "^HYd:name.GRF",
      "parameters": [
        {
          "name": "d",
          "description": "Drive letter: R, E, or B"
        },
        {
          "name": "name.GRF",
          "description": "Graphic filename"
        }
      ],
      "whenToUse": "When retrieving graphics from the printer — check your printer model to decide between ^HY and ^HG.",
      "example": {
        "source": "^XA\n^HYE:LOGO.GRF\n^XZ",
        "description": "Upload LOGO graphic from flash to host"
      },
      "previewSupported": false,
      "canonicalUrl": "https://rfid.me/reference/zpl/hy/"
    },
    {
      "command": "^IL",
      "name": "Image Load",
      "description": "Loads a previously-stored image from a printer storage device into the **label background bitmap** at the start of a format. The path takes the standard `d:name.ext` form: `d` is the storage device (`R:` volatile RAM, `E:` onboard flash — default if omitted, `B:` optional memory module), `name.ext` is the filename (commonly `.GRF`, but firmware also accepts `.PCX`/`.PNG`/`.BMP` if those formats are stored). Unlike `^XG` which positions a stored asset at the current `^FO` origin, `^IL` paints the entire image into the label canvas as a backdrop that subsequent fields render on top of.",
      "category": "download",
      "syntax": "^ILd:o.x",
      "parameters": [
        {
          "name": "d",
          "description": "Storage device: `R:` RAM (volatile), `E:` flash (default, persistent), `B:` optional memory module"
        },
        {
          "name": "o.x",
          "description": "Stored filename including extension — typically `name.GRF`, also `.PCX`/`.PNG`/`.BMP` per firmware support"
        }
      ],
      "whenToUse": "For a full-label background watermark or pre-printed-form overlay where every other field draws on top — invoice templates, hazard-banded labels, branded receipts. Pick `^IL` for \"background-image-and-then-fields\", `^XG` for \"drop a stored logo at this XY with optional magnification\", and `^IM` for \"place an unscaled image inline at the current FO\". `^IL` must precede the fields that should appear over it; storage device follows the same `R:`/`E:`/`B:` semantics as `^XG`/`^XF`.",
      "example": {
        "source": "^XA\n^ILE:BACKGROUND.PCX\n^FO50,50^A0N,30,30^FDOverlay text^FS\n^XZ",
        "description": "Load `BACKGROUND.PCX` from onboard flash (`E:`) as the label background, then overlay a 30-dot text field at FO 50,50. The PCX renders behind every subsequent field on this label."
      },
      "previewSupported": false,
      "canonicalUrl": "https://rfid.me/reference/zpl/il/"
    },
    {
      "command": "^IS",
      "name": "Image Save",
      "description": "Saves the current label's bitmap image to the printer's memory. Captures what would be printed as a stored graphic.",
      "category": "download",
      "syntax": "^ISd:name.GRF,p",
      "parameters": [
        {
          "name": "d",
          "description": "Drive letter: R, E, or B"
        },
        {
          "name": "name.GRF",
          "description": "Filename to save as"
        },
        {
          "name": "p",
          "description": "Print image after save: Y or N"
        }
      ],
      "whenToUse": "When you want to save a rendered label as a reusable graphic image.",
      "example": {
        "source": "^XA\n^FO50,50^A0N,30,30^FDCapture this^FS\n^ISR:CAPTURE.GRF,Y\n^XZ",
        "description": "Render a label and save it as a graphic"
      },
      "previewSupported": false,
      "canonicalUrl": "https://rfid.me/reference/zpl/is/"
    },
    {
      "command": "^JB",
      "name": "Initialize Flash Memory",
      "description": "Erases and reinitialises the printer's flash memory (E: drive). WARNING: This deletes ALL stored fonts, graphics, and formats from flash.",
      "category": "download",
      "syntax": "^JB",
      "parameters": [],
      "whenToUse": "When flash memory is corrupted or you need a complete reset of stored objects. Use with caution.",
      "example": {
        "source": "^XA\n^JB\n^XZ",
        "description": "Reinitialise flash memory (deletes everything on E:)"
      },
      "previewSupported": false,
      "canonicalUrl": "https://rfid.me/reference/zpl/jb/"
    },
    {
      "command": "^LF",
      "name": "List Font Links",
      "description": "Returns a list of all font identifier assignments (^CW mappings) currently active on the printer.",
      "category": "download",
      "syntax": "^LF",
      "parameters": [],
      "whenToUse": "When you need to check which letter-to-font mappings are configured.",
      "example": {
        "source": "^XA\n^LF\n^XZ",
        "description": "List all font identifier assignments"
      },
      "previewSupported": false,
      "canonicalUrl": "https://rfid.me/reference/zpl/lf/"
    },
    {
      "command": "^MC",
      "name": "Map Clear",
      "description": "Clears the label's internal bitmap buffer. When set to Y, the bitmap is cleared before each label — this is the normal behaviour. Set to N to overlay multiple formats.",
      "category": "download",
      "syntax": "^MCY",
      "parameters": [
        {
          "name": "a",
          "description": "Y (clear map before each label) or N (do not clear)"
        }
      ],
      "whenToUse": "When you need to overlay multiple label formats on top of each other without clearing between them.",
      "example": {
        "source": "^XA\n^MCY\n^FO50,50^A0N,30,30^FDClean slate^FS\n^XZ",
        "description": "Ensure bitmap is cleared before rendering"
      },
      "previewSupported": false,
      "canonicalUrl": "https://rfid.me/reference/zpl/mc/"
    },
    {
      "command": "^SE",
      "name": "Select Encoding Table",
      "description": "Selects a previously downloaded encoding table as the active character set. Works with custom encodings downloaded via ~DE.",
      "category": "download",
      "syntax": "^SEd:name.DAT",
      "parameters": [
        {
          "name": "d",
          "description": "Drive letter: R, E, or B"
        },
        {
          "name": "name.DAT",
          "description": "Encoding table filename"
        }
      ],
      "whenToUse": "When switching between custom character encodings on the printer.",
      "example": {
        "source": "^XA\n^SEE:CUSTOM.DAT\n^FO50,50^A0N,30,30^FDCustom encoding^FS\n^XZ",
        "description": "Select a custom encoding table from flash"
      },
      "previewSupported": false,
      "canonicalUrl": "https://rfid.me/reference/zpl/se/"
    },
    {
      "command": "^TO",
      "name": "Transfer Object",
      "description": "Copies a stored object (font, graphic, or format) from one memory location to another. For example, copy a graphic from RAM to flash for permanent storage.",
      "category": "download",
      "syntax": "^TOdest:name,source:name",
      "parameters": [
        {
          "name": "dest",
          "description": "Destination drive and filename"
        },
        {
          "name": "source",
          "description": "Source drive and filename"
        }
      ],
      "whenToUse": "When you need to move objects between RAM and flash, or between memory locations.",
      "example": {
        "source": "^XA\n^TOE:LOGO.GRF,R:LOGO.GRF\n^XZ",
        "description": "Copy LOGO from RAM to flash for permanent storage"
      },
      "previewSupported": false,
      "canonicalUrl": "https://rfid.me/reference/zpl/to/"
    },
    {
      "command": "^WD",
      "name": "Print Directory Label",
      "description": "**Diagnostic command — prints a system label, not user content.** `^WD` causes the printer to render and print a label whose body is a printer-formatted **directory listing** of files stored on the named device — fonts (`.FNT`), graphics (`.GRF`/`.PNG`), formats (`.ZPL`), images. The label content is generated by firmware (filename, size, type per Zebra firmware format) and is **not user-styleable** — `^WD` ignores any `^FO`/`^A`/`^FD` you place around it. Each `^WD` invocation consumes one label of media; do NOT issue it inside automated print loops.",
      "category": "download",
      "syntax": "^WDd:o.x",
      "parameters": [
        {
          "name": "d",
          "description": "Storage device: `R:` RAM, `E:` flash (default), `B:` optional memory module, `*` all devices"
        },
        {
          "name": "o.x",
          "description": "Filename pattern, supports wildcards. Common: `*.*` (everything), `*.GRF` (graphics only), `*.FNT` (fonts only), `*.ZPL` (stored formats only)"
        }
      ],
      "whenToUse": "For audit / debugging only — confirm whether a logo (`^XG`/`^IL`), template (`^XF`), or font (`^A` recall) actually exists on the device before another job tries to recall it. Pair with the standard storage prefixes: `R:` lists volatile RAM, `E:` onboard flash (default if `d:` omitted), `B:` optional memory module, `*` aggregates all devices. Use a wildcard like `*.GRF` to filter to one file type. Not a layout primitive — never include in production label formats.",
      "example": {
        "source": "^XA\n^WDE:*.GRF\n^XZ",
        "description": "Prints one media label listing every `.GRF` graphic stored on onboard flash. Useful when `^XGE:LOGO.GRF` recalls nothing — confirm the file is actually present. Output is firmware-formatted system content, not a label you designed."
      },
      "previewSupported": false,
      "canonicalUrl": "https://rfid.me/reference/zpl/wd/"
    },
    {
      "command": "~HS",
      "name": "Return Host Status",
      "description": "The most important status command — returns three lines of comma-separated printer status including paper out, head open, pause state, label length, and more. This is what monitoring software polls continuously.",
      "category": "status",
      "syntax": "~HS",
      "parameters": [],
      "whenToUse": "When you need a complete snapshot of the printer's current state — paper, ribbon, head, errors, and counters.",
      "example": {
        "source": "~HS",
        "description": "Query full printer status (returns 3 lines of CSV data)"
      },
      "previewSupported": false,
      "canonicalUrl": "https://rfid.me/reference/zpl/hs/"
    },
    {
      "command": "~HI",
      "name": "Return Host Identification",
      "description": "Returns the printer's model name, firmware version, DPI, and memory size. Like asking the printer \"who are you?\".",
      "category": "status",
      "syntax": "~HI",
      "parameters": [],
      "whenToUse": "When you need to identify what printer model and firmware you're talking to.",
      "example": {
        "source": "~HI",
        "description": "Query printer identity (e.g., \"ZD621-203dpi,V85.20.19Z,8192KB\")"
      },
      "previewSupported": false,
      "canonicalUrl": "https://rfid.me/reference/zpl/hi/"
    },
    {
      "command": "~HM",
      "name": "Return Host RAM Status",
      "description": "Returns how much RAM is available on the printer — total and free. Useful before downloading large graphics or fonts.",
      "category": "status",
      "syntax": "~HM",
      "parameters": [],
      "whenToUse": "When you need to check if the printer has enough memory for a download operation.",
      "example": {
        "source": "~HM",
        "description": "Query available RAM on the printer"
      },
      "previewSupported": false,
      "canonicalUrl": "https://rfid.me/reference/zpl/hm/"
    },
    {
      "command": "~HQ",
      "name": "Return Host Query",
      "description": "A versatile query command that returns different information depending on the sub-command. ~HQES returns error history, ~HQJT returns head test results, etc.",
      "category": "status",
      "syntax": "~HQES",
      "parameters": [
        {
          "name": "subcmd",
          "description": "Sub-command: ES (error status), JT (head test), MA (maintenance), OD (odometer), SN (serial number), etc."
        }
      ],
      "whenToUse": "When you need specific diagnostic information beyond what ~HS provides.",
      "example": {
        "source": "~HQES",
        "description": "Query error status history"
      },
      "previewSupported": false,
      "canonicalUrl": "https://rfid.me/reference/zpl/hq/"
    },
    {
      "command": "~HB",
      "name": "Return Battery Status",
      "description": "Returns battery charge level and health on mobile/portable Zebra printers. Not applicable to desktop printers.",
      "category": "status",
      "syntax": "~HB",
      "parameters": [],
      "whenToUse": "When monitoring battery-powered mobile printers in the field.",
      "example": {
        "source": "~HB",
        "description": "Query battery status on a mobile printer"
      },
      "previewSupported": false,
      "canonicalUrl": "https://rfid.me/reference/zpl/hb/"
    },
    {
      "command": "~HD",
      "name": "Return Head Diagnostic",
      "description": "Returns printhead diagnostic data including element resistance values. Used to detect failing dots on the printhead before they cause print quality issues.",
      "category": "status",
      "syntax": "~HD",
      "parameters": [],
      "whenToUse": "For preventive maintenance — detecting printhead wear before it affects print quality.",
      "example": {
        "source": "~HD",
        "description": "Run printhead diagnostic and return element resistance data"
      },
      "previewSupported": false,
      "canonicalUrl": "https://rfid.me/reference/zpl/hd/"
    },
    {
      "command": "~HU",
      "name": "Return ZebraNet Alert Configuration",
      "description": "Returns the current alert/notification configuration for ZebraNet-enabled printers. Shows which events trigger alerts and where they're sent.",
      "category": "status",
      "syntax": "~HU",
      "parameters": [],
      "whenToUse": "When configuring or auditing printer alert settings on networked printers.",
      "example": {
        "source": "~HU",
        "description": "Query ZebraNet alert configuration"
      },
      "previewSupported": false,
      "canonicalUrl": "https://rfid.me/reference/zpl/hu/"
    },
    {
      "command": "~JD",
      "name": "Enable Communications Diagnostics",
      "description": "Puts the printer into diagnostic mode where it prints all incoming data as ASCII hex on labels instead of interpreting it as ZPL. Invaluable for debugging communication issues.",
      "category": "status",
      "syntax": "~JD",
      "parameters": [],
      "whenToUse": "When troubleshooting — you're sending data but the printer isn't doing what you expect. This shows exactly what bytes it's receiving.",
      "example": {
        "source": "~JD",
        "description": "Enable diagnostic mode (prints raw data as hex)"
      },
      "previewSupported": false,
      "canonicalUrl": "https://rfid.me/reference/zpl/jd/"
    },
    {
      "command": "~JE",
      "name": "Disable Diagnostics",
      "description": "Takes the printer out of diagnostic mode and back to normal ZPL processing. The counterpart to ~JD.",
      "category": "status",
      "syntax": "~JE",
      "parameters": [],
      "whenToUse": "After finishing diagnostic troubleshooting — return the printer to normal operation.",
      "example": {
        "source": "~JE",
        "description": "Disable diagnostic mode, resume normal printing"
      },
      "previewSupported": false,
      "canonicalUrl": "https://rfid.me/reference/zpl/je/"
    },
    {
      "command": "~WC",
      "name": "Print Configuration Label",
      "description": "Prints a physical label showing the printer's complete configuration — darkness, speed, label size, IP address, firmware, and more. The \"settings page\" of a Zebra printer.",
      "category": "status",
      "syntax": "~WC",
      "parameters": [],
      "whenToUse": "When you need a quick physical reference of all printer settings — often the first step in troubleshooting.",
      "example": {
        "source": "~WC",
        "description": "Print the printer's configuration label"
      },
      "previewSupported": false,
      "canonicalUrl": "https://rfid.me/reference/zpl/wc/"
    },
    {
      "command": "~WQ",
      "name": "Write Query",
      "description": "Prints a label showing the printer's current RFID configuration and status — antenna power, tag type, encoding position, and error counts.",
      "category": "status",
      "syntax": "~WQ",
      "parameters": [],
      "whenToUse": "When troubleshooting RFID encoding issues or verifying RFID configuration.",
      "example": {
        "source": "~WQ",
        "description": "Print RFID configuration/status label"
      },
      "previewSupported": false,
      "canonicalUrl": "https://rfid.me/reference/zpl/wq/"
    },
    {
      "command": "^HH",
      "name": "Configuration Label Return",
      "description": "Returns the printer's configuration data to the host computer (instead of printing it like ~WC). Same information, but sent over the communication channel.",
      "category": "status",
      "syntax": "^HH",
      "parameters": [],
      "whenToUse": "When you need the configuration data programmatically rather than as a printed label.",
      "example": {
        "source": "^XA\n^HH\n^XZ",
        "description": "Send configuration data to host"
      },
      "previewSupported": false,
      "canonicalUrl": "https://rfid.me/reference/zpl/hh/"
    },
    {
      "command": "^HV",
      "name": "Host Verification",
      "description": "Returns the **runtime value of a numbered field** (`^FN<f>`) back to the host **after the label has been processed** — for read-back-after-write verification. The host receives a single line over the same connection that issued the format: an optional header `h`, the field value (truncated to `n` bytes if specified), and an optional terminator `t`. Crucially, when paired with `^RT` (read RFID tag → into `^FN<f>`), the host receives the **value the RFID encoder actually read off the tag** — making `^HV` the canonical \"did my encode succeed?\" signal in production RFID flows. For a label without `^RT`, `^HV` simply echoes the input value sent in `^FN<f>^FD…^FS`.",
      "category": "status",
      "syntax": "^HVf,n,h,e,t",
      "parameters": [
        {
          "name": "f",
          "description": "Field number (matches `^FN<f>` placeholder); the value of that field is returned"
        },
        {
          "name": "n",
          "description": "Maximum number of bytes to return (truncates long values); 1–256 typical"
        },
        {
          "name": "h",
          "description": "Header text prepended to the response — useful for tagging multiple `^HV` returns to the same parser"
        },
        {
          "name": "e",
          "description": "Return-on-error flag: `Y` send response even when the field encoding/read failed (lets host distinguish dead-printer vs failed-encode), `N` suppress on error"
        },
        {
          "name": "t",
          "description": "Terminator text appended to the response (default CR/LF on most firmware)"
        }
      ],
      "whenToUse": "For **RFID encode-then-verify**: write via `^RFW`, read back via `^RT` into a numbered field, return that field via `^HV` to the host — the host compares against what it sent and detects mis-encodes before shipping. Also for **printed-data audit** in regulated industries (pharmacy, IVD): record what was actually rendered on each label for trace/recall purposes. Use `e=Y` to receive a value even on error so the host can distinguish \"no response\" (printer dead) from \"encode failed\" (got an error code). The `h` header is useful when multiplexing several fields back to one host parser. Always send over a connection where the host is actively reading.",
      "example": {
        "source": "^XA\n^RS8\n^RT1,0,12,3,E,0\n^HV1,24,EPC=,Y,;\n^FO50,50^FN1^FS\n^XZ",
        "description": "After Gen2 setup, read 12 bytes from EPC bank into `^FN1`, then `^HV1,24,EPC=,Y,;` returns up to 24 chars of that value to the host as `EPC=3034257BF7194E4000001A85;` — host parses on `EPC=` prefix and `;` terminator. The `^FN1^FS` at FO 50,50 also prints the value visibly on the label. `e=Y` ensures the host receives a response even if the read failed, so it can distinguish dead printer from bad encode."
      },
      "previewSupported": false,
      "canonicalUrl": "https://rfid.me/reference/zpl/hv/"
    },
    {
      "command": "^HW",
      "name": "Host Directory List",
      "description": "**Direction: printer → host**, not host → printer. The printer enumerates files on the chosen storage device and sends a plain-ASCII listing back over the **same connection that issued the command** — TCP socket, USB serial, parallel, etc. Where `^WD` (Print Directory Label) wastes a label on the same data, `^HW` keeps the result programmatic and machine-parseable. Output rows give filename, size, and type per Zebra firmware format. Storage device and filename pattern follow the standard `d:o.x` form: `R:` RAM, `E:` flash (default), `B:` optional memory, `*` aggregates all; `*.GRF` / `*.ZPL` / `*.*` filters by extension.",
      "category": "status",
      "syntax": "^HWd:o.x",
      "parameters": [
        {
          "name": "d",
          "description": "Storage device: `R:` RAM, `E:` flash (default), `B:` optional memory module, `*` all devices"
        },
        {
          "name": "o.x",
          "description": "Filename pattern with wildcards: `*.*` (everything), `*.GRF` (graphics), `*.FNT` (fonts), `*.ZPL` (formats)"
        }
      ],
      "whenToUse": "For host-driven inventory of stored assets — fleet-management tooling polling each printer to verify a logo / template / font is present before shipping a print job that recalls it. Pair with `^HV` for value verification or `^HL` for RFID log read-back. Always send `^HW` over a connection where the host application is **actively reading the response** — fire-and-forget over a print-only socket loses the data. For the user-visible (label-printed) variant, see `^WD`.",
      "example": {
        "source": "^XA\n^HWE:*.GRF\n^XZ",
        "description": "Requests a list of every `.GRF` graphic on onboard flash. The printer sends the listing back over the same TCP/USB/serial connection that received the format. The host application reads the response off that socket — useful before triggering a print job that recalls a stored logo. For the printed-label equivalent see `^WD`."
      },
      "previewSupported": false,
      "canonicalUrl": "https://rfid.me/reference/zpl/hw/"
    },
    {
      "command": "^HZ",
      "name": "Display Description Information",
      "description": "Returns detailed printer description including model, serial number, firmware version, and installed options. More detailed than ~HI.",
      "category": "status",
      "syntax": "^HZ",
      "parameters": [],
      "whenToUse": "When you need comprehensive printer identification for asset management or support.",
      "example": {
        "source": "^XA\n^HZ\n^XZ",
        "description": "Return detailed printer description to host"
      },
      "previewSupported": false,
      "canonicalUrl": "https://rfid.me/reference/zpl/hz/"
    },
    {
      "command": "^JT",
      "name": "Head Test Interval",
      "description": "Sets how often the printer automatically tests its printhead for bad elements. The test runs every n labels. Set to 0 to disable.",
      "category": "status",
      "syntax": "^JTn",
      "parameters": [
        {
          "name": "n",
          "description": "Number of labels between head tests (0 = disabled)"
        }
      ],
      "whenToUse": "For production lines where print quality is critical — automatically detect failing printhead dots.",
      "example": {
        "source": "^XA\n^JT100\n^XZ",
        "description": "Test printhead every 100 labels"
      },
      "previewSupported": false,
      "canonicalUrl": "https://rfid.me/reference/zpl/jt/"
    },
    {
      "command": "^MA",
      "name": "Set Maintenance Alert",
      "description": "Configures maintenance alerts that trigger when the printhead, cleaning, or other counters reach a threshold. Helps schedule preventive maintenance.",
      "category": "status",
      "syntax": "^MAtype,threshold",
      "parameters": [
        {
          "name": "type",
          "description": "Alert type: H (head clean), P (head replace), C (cutter), etc."
        },
        {
          "name": "threshold",
          "description": "Number of labels/cm before alert triggers"
        }
      ],
      "whenToUse": "For fleet management — set alerts so printers get maintained before they fail.",
      "example": {
        "source": "^XA\n^MAH,5000\n^XZ",
        "description": "Alert after 5000 labels for head cleaning"
      },
      "previewSupported": false,
      "canonicalUrl": "https://rfid.me/reference/zpl/ma/"
    },
    {
      "command": "^WR",
      "name": "Print Wireless/Wired Info",
      "description": "Prints a label showing the printer's network configuration — IP address, subnet mask, gateway, SSID (for wireless), signal strength, and MAC address.",
      "category": "status",
      "syntax": "^WR",
      "parameters": [],
      "whenToUse": "When troubleshooting network connectivity or verifying network settings on the printer.",
      "example": {
        "source": "^XA\n^WR\n^XZ",
        "description": "Print network configuration label"
      },
      "previewSupported": false,
      "canonicalUrl": "https://rfid.me/reference/zpl/wr/"
    },
    {
      "command": "~JC",
      "name": "Set Media Sensor Calibration",
      "description": "Runs an automatic media sensor calibration. The printer feeds labels while measuring the gap/mark sensor to learn the label layout. Essential after loading a new roll of labels.",
      "category": "calibration",
      "syntax": "~JC",
      "parameters": [],
      "whenToUse": "After loading new media or changing label stock. The printer must \"learn\" the new label gap/mark pattern.",
      "example": {
        "source": "~JC",
        "description": "Calibrate media sensors (feeds several labels)"
      },
      "previewSupported": false,
      "canonicalUrl": "https://rfid.me/reference/zpl/jc/"
    },
    {
      "command": "~JG",
      "name": "Graphing Sensor Calibration",
      "description": "Prints a graph showing sensor readings across several labels — a visual diagnostic that helps you see exactly what the sensor sees. Dark areas are gaps/marks, light areas are label backing.",
      "category": "calibration",
      "syntax": "~JG",
      "parameters": [],
      "whenToUse": "When troubleshooting sensor issues — the graph shows if sensors are reading correctly or if the media is confusing them.",
      "example": {
        "source": "~JG",
        "description": "Print sensor calibration graph"
      },
      "previewSupported": false,
      "canonicalUrl": "https://rfid.me/reference/zpl/jg/"
    },
    {
      "command": "~JL",
      "name": "Set Label Length",
      "description": "Sets the maximum label length that the printer will accept. If a label format exceeds this, the printer skips it. Acts as a safety limit.",
      "category": "calibration",
      "syntax": "~JL",
      "parameters": [],
      "whenToUse": "As a safety measure on production lines — prevents a bad format from feeding excessive media.",
      "example": {
        "source": "~JL",
        "description": "Set maximum label length from current calibration"
      },
      "previewSupported": false,
      "canonicalUrl": "https://rfid.me/reference/zpl/jl/"
    },
    {
      "command": "~JN",
      "name": "Head Test Fatal",
      "description": "Runs a printhead element test and treats failures as fatal — the printer stops and reports an error if any dots are bad. Stricter than ~JO.",
      "category": "calibration",
      "syntax": "~JN",
      "parameters": [],
      "whenToUse": "In quality-critical applications where a single bad printhead dot is unacceptable (pharma, compliance labels).",
      "example": {
        "source": "~JN",
        "description": "Run fatal head test (stops on failure)"
      },
      "previewSupported": false,
      "canonicalUrl": "https://rfid.me/reference/zpl/jn/"
    },
    {
      "command": "~JO",
      "name": "Head Test Non-Fatal",
      "description": "Runs a printhead element test but treats failures as warnings — printing continues even if bad dots are detected. Less strict than ~JN.",
      "category": "calibration",
      "syntax": "~JO",
      "parameters": [],
      "whenToUse": "For routine monitoring where some dot failures are tolerable (shipping labels, general use).",
      "example": {
        "source": "~JO",
        "description": "Run non-fatal head test (warns but continues)"
      },
      "previewSupported": false,
      "canonicalUrl": "https://rfid.me/reference/zpl/jo/"
    },
    {
      "command": "~JS",
      "name": "Change Backfeed Sequence",
      "description": "Controls when and how the printer backs up the media after printing. Options include no backfeed, before printing, or after printing.",
      "category": "calibration",
      "syntax": "~JSa",
      "parameters": [
        {
          "name": "a",
          "description": "Backfeed mode: N (no backfeed), A (after), B (before)"
        }
      ],
      "whenToUse": "When adjusting tear-off or peel-off position — backfeed controls where the label stops after printing.",
      "example": {
        "source": "~JSB",
        "description": "Backfeed before printing each label"
      },
      "previewSupported": false,
      "canonicalUrl": "https://rfid.me/reference/zpl/js/"
    },
    {
      "command": "~PH",
      "name": "Slew to Home Position",
      "description": "Feeds the media forward until the next label gap is at the printhead. Like pressing the \"feed\" button once — positions the next label for printing.",
      "category": "calibration",
      "syntax": "~PH",
      "parameters": [],
      "whenToUse": "After manually loading media or when the label position is off. Gets the printer back in sync.",
      "example": {
        "source": "~PH",
        "description": "Feed to the next label position"
      },
      "previewSupported": false,
      "canonicalUrl": "https://rfid.me/reference/zpl/ph/"
    },
    {
      "command": "~PL",
      "name": "Present Length Adjust",
      "description": "Adjusts how far the label is presented (extended out) after printing. Useful for peel-off or tear-off applications.",
      "category": "calibration",
      "syntax": "~PLn",
      "parameters": [
        {
          "name": "n",
          "description": "Present distance adjustment in dots"
        }
      ],
      "whenToUse": "When fine-tuning the label presentation position for your specific applicator or tear-off setup.",
      "example": {
        "source": "~PL100",
        "description": "Present label 100 dots beyond default position"
      },
      "previewSupported": false,
      "canonicalUrl": "https://rfid.me/reference/zpl/pl/"
    },
    {
      "command": "~PP",
      "name": "Programmable Pause",
      "description": "Pauses the printer after each label. The operator must press feed (or send ~PS) to continue. Useful for manual inspection of each label.",
      "category": "calibration",
      "syntax": "~PP",
      "parameters": [],
      "whenToUse": "When each label needs visual inspection before the next one prints.",
      "example": {
        "source": "~PP",
        "description": "Enable pause-after-each-label mode"
      },
      "previewSupported": false,
      "canonicalUrl": "https://rfid.me/reference/zpl/pp/"
    },
    {
      "command": "~PR",
      "name": "Applicator Reprint",
      "description": "Reprints the last label that was printed. Useful when an applicator misses a label or a label is damaged during application.",
      "category": "calibration",
      "syntax": "~PR",
      "parameters": [],
      "whenToUse": "When using an applicator — if a label fails to apply, this reprints it without resending the data.",
      "example": {
        "source": "~PR",
        "description": "Reprint the last label"
      },
      "previewSupported": false,
      "canonicalUrl": "https://rfid.me/reference/zpl/pr/"
    },
    {
      "command": "~PS",
      "name": "Print Start",
      "description": "Resumes printing after a pause (~PP or front panel pause). The \"unpause\" command.",
      "category": "calibration",
      "syntax": "~PS",
      "parameters": [],
      "whenToUse": "To resume printing after a programmable pause or manual pause.",
      "example": {
        "source": "~PS",
        "description": "Resume printing after a pause"
      },
      "previewSupported": false,
      "canonicalUrl": "https://rfid.me/reference/zpl/ps/"
    },
    {
      "command": "~RO",
      "name": "Reset Advanced Counter",
      "description": "Resets one of the printer's internal counters (odometer, head clean counter, etc.) to zero.",
      "category": "calibration",
      "syntax": "~ROn",
      "parameters": [
        {
          "name": "n",
          "description": "Counter to reset: H (head clean), P (head replace), etc."
        }
      ],
      "whenToUse": "After performing maintenance — reset the counter so the next maintenance alert triggers at the right time.",
      "example": {
        "source": "~ROH",
        "description": "Reset the head cleaning counter after cleaning"
      },
      "previewSupported": false,
      "canonicalUrl": "https://rfid.me/reference/zpl/ro/"
    },
    {
      "command": "~SD",
      "name": "Set Darkness",
      "description": "Sets the print darkness (heat intensity) from 0 to 30. Higher values make darker prints but wear the printhead faster. The tilde version of ^MD.",
      "category": "calibration",
      "syntax": "~SDnn",
      "parameters": [
        {
          "name": "nn",
          "description": "Darkness value: 0 (lightest) to 30 (darkest)"
        }
      ],
      "whenToUse": "When adjusting print quality — too light means faded prints, too dark means smeared prints or reduced head life.",
      "example": {
        "source": "~SD15",
        "description": "Set darkness to 15 (medium)"
      },
      "previewSupported": false,
      "canonicalUrl": "https://rfid.me/reference/zpl/sd/"
    },
    {
      "command": "~TA",
      "name": "Tear-off Adjust Position",
      "description": "Fine-tunes where the label stops relative to the tear bar. Positive values feed more, negative values retract. Measured in dots.",
      "category": "calibration",
      "syntax": "~TAn",
      "parameters": [
        {
          "name": "n",
          "description": "Offset in dots: -120 to +120"
        }
      ],
      "whenToUse": "When the perforation between labels doesn't line up with the tear bar — adjust until it tears cleanly.",
      "example": {
        "source": "~TA010",
        "description": "Advance 10 dots past default tear position"
      },
      "previewSupported": false,
      "canonicalUrl": "https://rfid.me/reference/zpl/ta/"
    },
    {
      "command": "^JC",
      "name": "Set Media Sensor Calibration",
      "description": "The caret version of ~JC — runs automatic media sensor calibration from within a label format.",
      "category": "calibration",
      "syntax": "^JC",
      "parameters": [],
      "whenToUse": "When you need to trigger calibration as part of a setup label format.",
      "example": {
        "source": "^XA\n^JC\n^XZ",
        "description": "Calibrate sensors from within a label format"
      },
      "previewSupported": false,
      "canonicalUrl": "https://rfid.me/reference/zpl/jc/"
    },
    {
      "command": "^JH",
      "name": "Early Warning Settings",
      "description": "Configures when the printer alerts you about low media or ribbon. Set thresholds so you get warnings before the printer runs out.",
      "category": "calibration",
      "syntax": "^JHa,b,c,d",
      "parameters": [
        {
          "name": "a",
          "description": "Media low warning: distance in inches before empty"
        },
        {
          "name": "b",
          "description": "Ribbon low warning: distance in inches before empty"
        },
        {
          "name": "c",
          "description": "Media out handling: Y or N"
        },
        {
          "name": "d",
          "description": "Ribbon out handling: Y or N"
        }
      ],
      "whenToUse": "In production environments — get alerted before media runs out so an operator can prepare a new roll.",
      "example": {
        "source": "^XA\n^JH10,10,Y,Y\n^XZ",
        "description": "Warn when less than 10 inches of media or ribbon remain"
      },
      "previewSupported": false,
      "canonicalUrl": "https://rfid.me/reference/zpl/jh/"
    },
    {
      "command": "^JJ",
      "name": "Set Auxiliary Port",
      "description": "Configures the behaviour of the printer's auxiliary (applicator) port. Controls signals for label-applied, start-print, and error conditions.",
      "category": "calibration",
      "syntax": "^JJa,b",
      "parameters": [
        {
          "name": "a",
          "description": "Port mode"
        },
        {
          "name": "b",
          "description": "Signal configuration"
        }
      ],
      "whenToUse": "When connecting the printer to an automated applicator — configure the handshake signals.",
      "example": {
        "source": "^XA\n^JJA,B\n^XZ",
        "description": "Configure auxiliary port for applicator mode"
      },
      "previewSupported": false,
      "canonicalUrl": "https://rfid.me/reference/zpl/jj/"
    },
    {
      "command": "^JM",
      "name": "Set Dots per Millimeter",
      "description": "Tells the printer to interpret coordinates at a different DPI than its physical resolution. Allows ZPL designed for 203dpi to print on a 300dpi printer (or vice versa).",
      "category": "calibration",
      "syntax": "^JMdpi",
      "parameters": [
        {
          "name": "dpi",
          "description": "Resolution mode: A (203dpi) or B (300dpi)"
        }
      ],
      "whenToUse": "When deploying the same ZPL across printers with different resolutions — avoids redesigning every label.",
      "example": {
        "source": "^XA\n^JMA\n^XZ",
        "description": "Set printer to interpret coordinates as 203dpi"
      },
      "previewSupported": false,
      "canonicalUrl": "https://rfid.me/reference/zpl/jm/"
    },
    {
      "command": "^JN",
      "name": "Head Test Fatal",
      "description": "The caret version of ~JN — enables fatal head testing from within a label format. Printer stops on dot failure.",
      "category": "calibration",
      "syntax": "^JN",
      "parameters": [],
      "whenToUse": "To enable strict head testing as part of a configuration label.",
      "example": {
        "source": "^XA\n^JN\n^XZ",
        "description": "Enable fatal head test mode"
      },
      "previewSupported": false,
      "canonicalUrl": "https://rfid.me/reference/zpl/jn/"
    },
    {
      "command": "^JS",
      "name": "Sensor Select",
      "description": "Selects which sensor to use for detecting labels — transmissive (gap sensing through the media) or reflective (mark sensing on the backing).",
      "category": "calibration",
      "syntax": "^JSa",
      "parameters": [
        {
          "name": "a",
          "description": "Sensor type: A (auto), T (transmissive/gap), R (reflective/mark)"
        }
      ],
      "whenToUse": "When switching between gap labels and black-mark labels — the printer needs to know which sensor to read.",
      "example": {
        "source": "^XA\n^JSR\n^XZ",
        "description": "Select reflective sensor for black-mark media"
      },
      "previewSupported": false,
      "canonicalUrl": "https://rfid.me/reference/zpl/js/"
    },
    {
      "command": "^JU",
      "name": "Configuration Update",
      "description": "Saves or restores the printer's configuration. Save (S) writes current settings to flash so they survive power cycles. Restore (R) reloads saved settings.",
      "category": "calibration",
      "syntax": "^JUa",
      "parameters": [
        {
          "name": "a",
          "description": "Action: S (save current), R (restore saved), F (restore factory)"
        }
      ],
      "whenToUse": "After configuring the printer — save so settings persist. Or restore factory defaults if something goes wrong.",
      "example": {
        "source": "^XA\n^JUS\n^XZ",
        "description": "Save current configuration to flash"
      },
      "previewSupported": false,
      "canonicalUrl": "https://rfid.me/reference/zpl/ju/"
    },
    {
      "command": "^JW",
      "name": "Set Ribbon Tension",
      "description": "Adjusts the tension applied to the thermal transfer ribbon. Higher tension prevents wrinkles but can cause ribbon breaks. Only relevant for thermal transfer (not direct thermal).",
      "category": "calibration",
      "syntax": "^JWa",
      "parameters": [
        {
          "name": "a",
          "description": "Tension level: L (low), M (medium), H (high)"
        }
      ],
      "whenToUse": "When you see ribbon wrinkles in the print — increase tension. If ribbon breaks — decrease it.",
      "example": {
        "source": "^XA\n^JWH\n^XZ",
        "description": "Set ribbon tension to high"
      },
      "previewSupported": false,
      "canonicalUrl": "https://rfid.me/reference/zpl/jw/"
    },
    {
      "command": "^JZ",
      "name": "Reprint After Error",
      "description": "Controls whether the printer automatically reprints the last label after recovering from an error (head open, paper out, etc.).",
      "category": "calibration",
      "syntax": "^JZa",
      "parameters": [
        {
          "name": "a",
          "description": "Y (reprint after error) or N (do not reprint)"
        }
      ],
      "whenToUse": "In automated environments — ensures no labels are lost when errors occur and are resolved.",
      "example": {
        "source": "^XA\n^JZY\n^XZ",
        "description": "Automatically reprint after error recovery"
      },
      "previewSupported": false,
      "canonicalUrl": "https://rfid.me/reference/zpl/jz/"
    },
    {
      "command": "^ML",
      "name": "Maximum Label Length",
      "description": "Sets the maximum label length the printer will accept. If a format exceeds this, the printer rejects it. A safety limit to prevent runaway feeding.",
      "category": "calibration",
      "syntax": "^MLn",
      "parameters": [
        {
          "name": "n",
          "description": "Maximum length in dots"
        }
      ],
      "whenToUse": "As a safety measure — prevents a corrupt or malicious format from feeding the entire roll.",
      "example": {
        "source": "^XA\n^ML2400\n^XZ",
        "description": "Set maximum label length to 2400 dots (about 12 inches at 203dpi)"
      },
      "previewSupported": false,
      "canonicalUrl": "https://rfid.me/reference/zpl/ml/"
    },
    {
      "command": "^MT",
      "name": "Media Type",
      "description": "Selects the **physical printing mechanism** the firmware should drive. `^MTT` = **Thermal Transfer** — the print head heats a wax/resin **ribbon** which transfers ink onto plain label stock; the ribbon is consumed. `^MTD` = **Direct Thermal** — the print head heats specially-coated, heat-sensitive label stock directly, blackening the coating where heated; **no ribbon** is used. The setting tells the printer how to drive head energy, ribbon-low sensors, and ribbon take-up motor — not just a print-quality knob.",
      "category": "calibration",
      "syntax": "^MTa",
      "parameters": [
        {
          "name": "a",
          "description": "Media type: `T` = Thermal Transfer (ribbon required), `D` = Direct Thermal (heat-sensitive media, no ribbon)"
        }
      ],
      "whenToUse": "**Setting must match the loaded media physically**, not your preference. Mismatch is silent and visible only in output: `^MTT` on direct-thermal media → print head heats a non-existent ribbon and the heat-sensitive coating burns intermittently or unpredictably; `^MTD` on thermal-transfer media → head heats but no coating exists to react and no ribbon is engaged → output is **completely blank** (clean media still passes through). Persisted settings are usually written via `^JU` (configuration save) so this command takes effect for subsequent jobs until the next `^MT` is sent. Most printers expose the same setting in the front-panel menu.",
      "example": {
        "source": "^XA\n^MTT\n^XZ",
        "description": "Switches the printer into thermal-transfer mode (ribbon required). If the printer is loaded with direct-thermal media but `^MTT` is set, output will be blank — the head heats a non-existent ribbon and never marks the heat-sensitive coating. Always pair `^MT` with the actual loaded stock."
      },
      "previewSupported": false,
      "canonicalUrl": "https://rfid.me/reference/zpl/mt/"
    },
    {
      "command": "^MW",
      "name": "Modify Head Cold Warning",
      "description": "Controls whether the printer warns when the printhead is too cold for quality printing. Some environments (cold warehouses) trigger this frequently.",
      "category": "calibration",
      "syntax": "^MWa",
      "parameters": [
        {
          "name": "a",
          "description": "Y (enable cold warning) or N (disable)"
        }
      ],
      "whenToUse": "In cold environments — disable the warning if it's causing unnecessary pauses, or keep it enabled for quality assurance.",
      "example": {
        "source": "^XA\n^MWY\n^XZ",
        "description": "Enable printhead cold warning"
      },
      "previewSupported": false,
      "canonicalUrl": "https://rfid.me/reference/zpl/mw/"
    },
    {
      "command": "^SR",
      "name": "Set Printhead Resistance",
      "description": "Manually sets the printhead resistance value. Normally auto-detected, but can be overridden if the auto-detection is wrong (rare — usually after a head replacement).",
      "category": "calibration",
      "syntax": "^SRn",
      "parameters": [
        {
          "name": "n",
          "description": "Resistance value in ohms"
        }
      ],
      "whenToUse": "After replacing a printhead where auto-detection isn't working correctly. Incorrect resistance = incorrect darkness.",
      "example": {
        "source": "^XA\n^SR1500\n^XZ",
        "description": "Set printhead resistance to 1500 ohms"
      },
      "previewSupported": false,
      "canonicalUrl": "https://rfid.me/reference/zpl/sr/"
    },
    {
      "command": "^SS",
      "name": "Set Media Sensors",
      "description": "Manually sets the sensitivity thresholds for the media and ribbon sensors. Normally auto-calibrated with ~JC, but this allows manual fine-tuning.",
      "category": "calibration",
      "syntax": "^SSa,b,c,d,e,f",
      "parameters": [
        {
          "name": "a",
          "description": "Media sensor gain"
        },
        {
          "name": "b",
          "description": "Media sensor threshold"
        },
        {
          "name": "c",
          "description": "Ribbon sensor gain"
        },
        {
          "name": "d",
          "description": "Ribbon sensor threshold"
        },
        {
          "name": "e",
          "description": "Media sensor LED brightness"
        },
        {
          "name": "f",
          "description": "Ribbon sensor LED brightness"
        }
      ],
      "whenToUse": "When auto-calibration isn't producing reliable results — unusual media or environmental conditions.",
      "example": {
        "source": "^XA\n^SS100,50,100,50,100,100\n^XZ",
        "description": "Manually set sensor gains and thresholds"
      },
      "previewSupported": false,
      "canonicalUrl": "https://rfid.me/reference/zpl/ss/"
    },
    {
      "command": "~NC",
      "name": "Network Connect",
      "description": "Sets the primary network connection type. Tells the printer which network interface to use for communication.",
      "category": "network",
      "syntax": "~NCn",
      "parameters": [
        {
          "name": "n",
          "description": "Connection type number"
        }
      ],
      "whenToUse": "When configuring which network interface (wired, wireless, Bluetooth) the printer should use.",
      "example": {
        "source": "~NC1",
        "description": "Select primary network connection"
      },
      "previewSupported": false,
      "canonicalUrl": "https://rfid.me/reference/zpl/nc/"
    },
    {
      "command": "~NR",
      "name": "Set All Network Printers",
      "description": "Resets all network settings to factory defaults. Clears IP address, subnet, gateway, and all other network configuration.",
      "category": "network",
      "syntax": "~NR",
      "parameters": [],
      "whenToUse": "When the network configuration is corrupted or you need to start fresh with network setup.",
      "example": {
        "source": "~NR",
        "description": "Reset all network settings to factory defaults"
      },
      "previewSupported": false,
      "canonicalUrl": "https://rfid.me/reference/zpl/nr/"
    },
    {
      "command": "~NT",
      "name": "Set Currently Connected Network",
      "description": "Sets the currently active network type. Switches between wired Ethernet and wireless without changing saved configuration.",
      "category": "network",
      "syntax": "~NTtype",
      "parameters": [
        {
          "name": "type",
          "description": "Network type to activate"
        }
      ],
      "whenToUse": "When temporarily switching between wired and wireless connections.",
      "example": {
        "source": "~NTW",
        "description": "Switch to wireless network"
      },
      "previewSupported": false,
      "canonicalUrl": "https://rfid.me/reference/zpl/nt/"
    },
    {
      "command": "^NC",
      "name": "Network Connect",
      "description": "The caret version of ~NC — sets the primary network connection from within a label format.",
      "category": "network",
      "syntax": "^NCn",
      "parameters": [
        {
          "name": "n",
          "description": "Connection type number"
        }
      ],
      "whenToUse": "When configuring network as part of a setup label.",
      "example": {
        "source": "^XA\n^NC1\n^XZ",
        "description": "Set primary network connection from a label format"
      },
      "previewSupported": false,
      "canonicalUrl": "https://rfid.me/reference/zpl/nc/"
    },
    {
      "command": "^ND",
      "name": "Network and Device Settings",
      "description": "Configures the **wired Ethernet** network parameters — static IP, subnet mask, default gateway, optional WINS server (legacy NetBIOS name resolution), and TCP listening port (default 9100 for raw print). **Settings are written to the print server's persistent NVRAM** and survive power cycles. **The new IP does not bind until the print server reboots** — either send `~JR` (Reset Printer) or power-cycle the printer manually after the format containing `^ND` finishes. Until reboot, the existing network configuration remains active and the new values are queued.",
      "category": "network",
      "syntax": "^NDip,subnet,gateway,wins,port",
      "parameters": [
        {
          "name": "ip",
          "description": "Static IPv4 address in dotted-quad form (e.g. `192.168.1.100`); must be unique on the subnet"
        },
        {
          "name": "subnet",
          "description": "Subnet mask in dotted-quad form (e.g. `255.255.255.0`)"
        },
        {
          "name": "gateway",
          "description": "Default gateway IP for off-subnet routing; `0.0.0.0` if none required"
        },
        {
          "name": "wins",
          "description": "WINS server address for legacy NetBIOS name resolution; `0.0.0.0` to disable (typical on modern networks)"
        },
        {
          "name": "port",
          "description": "TCP listening port for raw print jobs; default 9100 (industry standard, do not change unless your firewall requires it)"
        }
      ],
      "whenToUse": "During first-time deployment to provision a printer on a static-IP fleet, or to reconfigure when relocating across subnets. **The connection drops the instant the printer reboots** — if you are sending `^ND` over the same Ethernet interface you intend to change, your TCP socket disconnects at `~JR`/power-cycle, and you must reconnect on the new IP. For DHCP environments, leave `^ND` alone (most firmware uses DHCP by default if no static config is set). For 802.11 wireless, use `^WA`/`^WS`/`^WP` instead — `^ND` only configures the wired interface. Always verify with `~HQES` (host status query) on the new IP after reboot.",
      "example": {
        "source": "^XA\n^ND192.168.1.100,255.255.255.0,192.168.1.1,0.0.0.0,9100\n^XZ\n~JR",
        "description": "Configures static IP `192.168.1.100/24` with gateway `192.168.1.1`, no WINS, raw-print port 9100. The values are written to NVRAM during the format. The trailing `~JR` immediately reboots the printer so the new IP binds — without it, the old IP remains active until the next power cycle. Reconnect your sender to the new IP after reboot and verify with `~HQES`."
      },
      "previewSupported": false,
      "canonicalUrl": "https://rfid.me/reference/zpl/nd/"
    },
    {
      "command": "^NI",
      "name": "Network ID",
      "description": "Sets the printer's **network identifier** — a string (or numeric ID, depending on firmware) used by host-side discovery and management systems to recognise this specific unit on the LAN. Stored in NVRAM. Surface where the ID actually appears varies: SNMP `sysName`, Zebra Setup Utilities discovery, fleet-management APIs, and label-print job routing all read this value. The wire format and persistence are firmware-specific — older Z-series treat it as a numeric station ID (1–999), newer ZebraNet print servers accept arbitrary identifier strings (typically 16-char ASCII).",
      "category": "network",
      "syntax": "^NIid",
      "parameters": [
        {
          "name": "id",
          "description": "Network identifier — numeric (older firmware, 1–999) or ASCII string (newer ZebraNet print servers, typically up to 16 chars). Persists in NVRAM"
        }
      ],
      "whenToUse": "**Most useful when paired with `^ND` static-IP configuration** in printer-fleet deployments where each unit has a known address and a human-readable name (e.g. `PRINTER-FLOOR2`, `WAREHOUSE-DOCK-3`). In **DHCP environments** the DHCP server's hostname assignment usually wins for discovery purposes — `^NI` may still be set, but most discovery tooling reads the DHCP-assigned hostname before falling back to `^NI`. Cross-reference `^ND` (static IP), `~HQHA` (host status — name query), and check the printer's management UI for which identifier it actually advertises.",
      "example": {
        "source": "^XA\n^NIPRINTER-FLOOR2\n^XZ",
        "description": "Sets the network ID to `PRINTER-FLOOR2` for fleet identification. Pair with `^ND` static-IP for fixed addressing — the human-readable label complements the static address. In DHCP environments this may be overridden in discovery scans by the DHCP-assigned hostname."
      },
      "previewSupported": false,
      "canonicalUrl": "https://rfid.me/reference/zpl/ni/"
    },
    {
      "command": "^NK",
      "name": "Network Address (Wired)",
      "description": "Sets the wired Ethernet IP address. A simpler alternative to ^ND when you only need to change the IP.",
      "category": "network",
      "syntax": "^NKip",
      "parameters": [
        {
          "name": "ip",
          "description": "IP address for wired Ethernet"
        }
      ],
      "whenToUse": "When you just need to set or change the wired IP address without touching other network settings.",
      "example": {
        "source": "^XA\n^NK192.168.1.100\n^XZ",
        "description": "Set wired Ethernet IP address"
      },
      "previewSupported": false,
      "canonicalUrl": "https://rfid.me/reference/zpl/nk/"
    },
    {
      "command": "^NP",
      "name": "Set Primary / Backup Print Server",
      "description": "Selects **which network interface acts as the primary print server** on a multi-interface Zebra printer. On models with both wired Ethernet and wireless 802.11 (or with optional secondary print servers), `^NP` decides which interface accepts incoming print jobs and is reported as the active network identity. The single-letter selector is **model-dependent** — the universally-supported value is `P` (Primary print server, whichever the firmware considers default); newer ZebraNet print servers also accept `W` (force Wired) and `I` (force Internal/wireless), and historically `E` (External print server) on models with the optional ZebraNet 10/100. **Not a TCP port command** — for the print listening port use `^ND`'s 5th parameter.",
      "category": "network",
      "syntax": "^NPi",
      "parameters": [
        {
          "name": "i",
          "description": "Interface selector — model-dependent: `P` Primary (default), `W` Wired, `I` Internal/wireless, `E` External print server (legacy). Unsupported values silently ignored or return error per firmware"
        }
      ],
      "whenToUse": "For printers fitted with both wired and wireless interfaces where you need to deterministically pin the print path (e.g. force `^NPW` on a wireless-capable printer permanently cabled in to avoid roaming-to-wireless under interference). Read the printer's Programming Guide for the exact letter set on your model — sending an unsupported value is silently ignored or returns an error depending on firmware. Persists in NVRAM; takes effect on next reboot (`~JR`). Cross-reference `^ND` (wired IP) and `^WA`/`^WS`/`^WP` (wireless setup).",
      "example": {
        "source": "^XA\n^NPP\n^XZ\n~JR",
        "description": "Selects the firmware-default primary print server (`P`). On a dual-interface printer this is whichever the firmware designates default (usually wired if both are configured). Followed by `~JR` for the change to take effect. For wireless-only operation on a dual-interface model use `^NPI` instead; for wired-pinned use `^NPW`."
      },
      "previewSupported": false,
      "canonicalUrl": "https://rfid.me/reference/zpl/np/"
    },
    {
      "command": "^NR",
      "name": "Network Request",
      "description": "The caret version of ~NR — resets network settings to factory defaults from within a label format.",
      "category": "network",
      "syntax": "^NR",
      "parameters": [],
      "whenToUse": "When resetting network configuration as part of a factory reset label.",
      "example": {
        "source": "^XA\n^NR\n^XZ",
        "description": "Reset network settings from a label format"
      },
      "previewSupported": false,
      "canonicalUrl": "https://rfid.me/reference/zpl/nr/"
    },
    {
      "command": "^NS",
      "name": "Network Settings",
      "description": "Configures miscellaneous network settings like DHCP enable/disable, default protocol, and timeout values.",
      "category": "network",
      "syntax": "^NSa,b",
      "parameters": [
        {
          "name": "a",
          "description": "DHCP: Y (enabled) or N (static IP)"
        },
        {
          "name": "b",
          "description": "Additional network parameters"
        }
      ],
      "whenToUse": "When fine-tuning network behaviour — switching between DHCP and static IP, setting timeouts.",
      "example": {
        "source": "^XA\n^NSY\n^XZ",
        "description": "Enable DHCP"
      },
      "previewSupported": false,
      "canonicalUrl": "https://rfid.me/reference/zpl/ns/"
    },
    {
      "command": "^NT",
      "name": "Network Type",
      "description": "Sets the network type — wired Ethernet or wireless. The caret version of ~NT.",
      "category": "network",
      "syntax": "^NTtype",
      "parameters": [
        {
          "name": "type",
          "description": "Network type: W (wired) or L (wireless/WLAN)"
        }
      ],
      "whenToUse": "When switching between wired and wireless from within a configuration label.",
      "example": {
        "source": "^XA\n^NTW\n^XZ",
        "description": "Set network type to wired Ethernet"
      },
      "previewSupported": false,
      "canonicalUrl": "https://rfid.me/reference/zpl/nt/"
    },
    {
      "command": "^SC",
      "name": "Set Serial Communications",
      "description": "Configures the printer's **RS-232 serial port** line discipline — baud rate, word length, parity, stop bits, and the two layers of handshake (electrical/software flow control plus the optional Zebra acknowledge protocol). On a serial-attached printer this is the contract every byte from the host must travel under: framing, speed, and back-pressure. The six parameters together fully describe the UART configuration; **the host serial library (Windows COM-port settings, Linux `termios`/`stty`, or your application's serial driver) must be set to the *exact* same six values** or the printer will see corrupt bytes (silent garbage characters in fields, format-prefix `^` not detected, no labels printed) or no traffic at all (one side blocked waiting for a handshake the other never sends). Note: the baud parameter on classic firmware uses an **encoded token** (`1`–`9`,`A`–`E`) rather than the raw baud number — see the parameter list below; modern firmware accepts the raw baud as well, but the encoded form is what most real-world `^SC` examples in Zebra documentation use.",
      "category": "network",
      "syntax": "^SCa,b,c,d,e,f",
      "parameters": [
        {
          "name": "a",
          "description": "Baud rate (encoded token on classic Zebra firmware): **`1`** = 110, **`2`** = 300, **`3`** = 600, **`4`** = 1200, **`5`** = 2400, **`6`** = 4800, **`7`** = 9600 (factory default), **`8`** = 19200, **`9`** = 28800, **`A`** = 38400, **`B`** = 57600, **`C`** = 115200. Some printers also use an alternate encoding where `8` = 14400 and `A` = 19200 — consult the printer's programming guide for the exact mapping. Modern firmware additionally accepts the raw baud number (`9600`, `19200`, etc.)."
        },
        {
          "name": "b",
          "description": "Word length in **data bits**: `7` or `8`. Default: `8`. Almost all modern hosts use 8."
        },
        {
          "name": "c",
          "description": "**Parity**: `N` = none, `E` = even, `O` = odd. Default: `N`. With 8 data bits parity is usually `N`; with 7 data bits parity is usually `E`."
        },
        {
          "name": "d",
          "description": "**Stop bits**: `1` or `2`. Default: `1`."
        },
        {
          "name": "e",
          "description": "**Protocol / handshake** (electrical and software flow control on the wire): `X` = XON/XOFF (software), `D` = DSR/DTR (hardware via DTR pin), `R` = RTS/CTS (hardware via RTS pin), `N` = none / no flow control. Default: `X`. Must match what the host serial library asserts — XON/XOFF is the most portable; hardware handshake requires a fully-wired DB-9 cable (not a 3-wire null-modem)."
        },
        {
          "name": "f",
          "description": "Zebra **acknowledge-protocol mode** (application-layer, on top of the line settings above): `A` = Zebra Ack/Nak protocol (printer responds to each format with `<ACK>`/`<NAK>`), `N` = no protocol (printer is silent unless explicitly asked via `^HH`/`^HS`). Default: `N`. Almost all modern hosts use `N`; `A` is legacy (1990s host applications that polled for acknowledgments)."
        }
      ],
      "whenToUse": "When the printer is attached over an **RS-232 serial cable** (DB-9 or DB-25) and the host needs different line settings from the factory default of `9600,8,N,1`. Most commonly issued **once** in a configuration label sent over the existing serial connection (or USB/network) to permanently change the serial port for future serial-attached hosts. ⚠️ **Mismatched parameters are the #1 cause of \"the printer sees nothing\" or \"the printer prints garbage\"** on serial — if the host says 19200,8,N,1 and the printer is at 9600,7,E,2, neither side will recognise a single character. **Verify both ends** before issuing `^SC`: read the host serial settings (`stty -F /dev/ttyS0 -a` on Linux, COM-port properties on Windows), match every field, and ideally print a configuration label (`^XA^HH^XZ`) afterwards to confirm. **Avoid changing baud over the same serial link you're using** — the ack/response will go out at the new baud while the host is still listening at the old one; use USB or network for the configuration push instead.",
      "example": {
        "source": "^XA\n^SC8,8,N,1,X,N\n^XZ",
        "description": "Configure the serial port to **19200 baud, 8 data bits, no parity, 1 stop bit, XON/XOFF flow control, no Zebra ack protocol** (the most common host-friendly setting for modern serial-attached Zebra printers). The host serial library must be set to exactly `19200,8,N,1,XON/XOFF` — any mismatch and the printer will either see garbage or receive nothing. (`8` in the baud slot is the encoded token for 19200 on classic Zebra firmware; modern firmware also accepts `19200` written out.)"
      },
      "previewSupported": false,
      "canonicalUrl": "https://rfid.me/reference/zpl/sc/"
    },
    {
      "command": "^SL",
      "name": "Set Mode and Language",
      "description": "Sets the printer's command language mode. Zebra printers can accept ZPL, EPL, CPCL, or line-print mode. This switches between them.",
      "category": "network",
      "syntax": "^SLmode",
      "parameters": [
        {
          "name": "mode",
          "description": "Language mode: Z (ZPL), E (EPL), C (CPCL), L (line print)"
        }
      ],
      "whenToUse": "When you need the printer to accept a different command language — for example, switching from ZPL to EPL mode.",
      "example": {
        "source": "^XA\n^SLZ\n^XZ",
        "description": "Set printer to ZPL mode"
      },
      "previewSupported": false,
      "canonicalUrl": "https://rfid.me/reference/zpl/sl/"
    },
    {
      "command": "^SO",
      "name": "Set Offset",
      "description": "Sets a global offset for label length and width. Adjusts the effective print area without changing the label stock dimensions.",
      "category": "network",
      "syntax": "^SOlength,width",
      "parameters": [
        {
          "name": "length",
          "description": "Length offset in dots"
        },
        {
          "name": "width",
          "description": "Width offset in dots"
        }
      ],
      "whenToUse": "When fine-tuning print position across all labels — compensates for mechanical alignment differences.",
      "example": {
        "source": "^XA\n^SO10,5\n^XZ",
        "description": "Offset all printing by 10 dots vertically and 5 horizontally"
      },
      "previewSupported": false,
      "canonicalUrl": "https://rfid.me/reference/zpl/so/"
    },
    {
      "command": "^SP",
      "name": "Start Print",
      "description": "Starts printing — the caret version of ~PS. Resumes printing after a pause.",
      "category": "network",
      "syntax": "^SP",
      "parameters": [],
      "whenToUse": "To resume printing from within a label format after a programmable pause.",
      "example": {
        "source": "^XA\n^SP\n^XZ",
        "description": "Resume printing after a pause"
      },
      "previewSupported": false,
      "canonicalUrl": "https://rfid.me/reference/zpl/sp/"
    },
    {
      "command": "^WF",
      "name": "WiFi Configuration",
      "description": "Configures the printer's wireless settings — SSID, security type, and password. The primary command for connecting a printer to a WiFi network.",
      "category": "network",
      "syntax": "^WFssid,security,password",
      "parameters": [
        {
          "name": "ssid",
          "description": "Wireless network name"
        },
        {
          "name": "security",
          "description": "Security type: OPEN, WPA, WPA2, etc."
        },
        {
          "name": "password",
          "description": "Network password/key"
        }
      ],
      "whenToUse": "When setting up a printer on a wireless network — equivalent to the WiFi setup wizard.",
      "example": {
        "source": "^XA\n^WFWarehouse-WiFi,WPA2,MySecurePass123\n^XZ",
        "description": "Connect to a WPA2 wireless network"
      },
      "previewSupported": false,
      "canonicalUrl": "https://rfid.me/reference/zpl/wf/"
    },
    {
      "command": "~CC",
      "name": "Change Carets",
      "description": "Changes the caret character (^) to a different character. After this command, the new character is used instead of ^ for all commands. Rarely needed — mainly for environments where ^ conflicts.",
      "category": "control",
      "syntax": "~CCx",
      "parameters": [
        {
          "name": "x",
          "description": "New caret character (any single ASCII character)"
        }
      ],
      "whenToUse": "When the ^ character causes problems in your communication channel or host system.",
      "example": {
        "source": "~CC#",
        "description": "Change caret from ^ to # (commands become #XA, #FO, etc.)"
      },
      "previewSupported": false,
      "canonicalUrl": "https://rfid.me/reference/zpl/cc/"
    },
    {
      "command": "~CD",
      "name": "Change Delimiter",
      "description": "Changes the delimiter character (comma by default) to a different character. Affects parameter separation in all subsequent commands.",
      "category": "control",
      "syntax": "~CDx",
      "parameters": [
        {
          "name": "x",
          "description": "New delimiter character"
        }
      ],
      "whenToUse": "When your data contains commas and you need a different separator for ZPL parameters.",
      "example": {
        "source": "~CD|",
        "description": "Change delimiter from comma to pipe (parameters become ^FO50|50)"
      },
      "previewSupported": false,
      "canonicalUrl": "https://rfid.me/reference/zpl/cd/"
    },
    {
      "command": "~CT",
      "name": "Change Tilde",
      "description": "Changes the tilde character (~) to a different character. After this, the new character is used for all tilde commands.",
      "category": "control",
      "syntax": "~CTx",
      "parameters": [
        {
          "name": "x",
          "description": "New tilde character"
        }
      ],
      "whenToUse": "When the ~ character conflicts with your communication protocol or host system.",
      "example": {
        "source": "~CT!",
        "description": "Change tilde from ~ to ! (commands become !HS, !JC, etc.)"
      },
      "previewSupported": false,
      "canonicalUrl": "https://rfid.me/reference/zpl/ct/"
    },
    {
      "command": "~JA",
      "name": "Cancel All",
      "description": "Cancels all label formats currently in the print queue and clears the buffer. The \"emergency stop\" for printing — stops everything immediately.",
      "category": "control",
      "syntax": "~JA",
      "parameters": [],
      "whenToUse": "When you need to immediately stop all printing — wrong labels, wrong data, or a production emergency.",
      "example": {
        "source": "~JA",
        "description": "Cancel all pending labels and clear the queue"
      },
      "previewSupported": false,
      "canonicalUrl": "https://rfid.me/reference/zpl/ja/"
    },
    {
      "command": "~JB",
      "name": "Reset Optional Memory",
      "description": "Resets the optional memory card (if installed). Clears all data from the memory expansion module.",
      "category": "control",
      "syntax": "~JB",
      "parameters": [],
      "whenToUse": "When resetting an external memory card on printers that support memory expansion.",
      "example": {
        "source": "~JB",
        "description": "Reset optional memory card"
      },
      "previewSupported": false,
      "canonicalUrl": "https://rfid.me/reference/zpl/jb/"
    },
    {
      "command": "~JF",
      "name": "Set Battery Condition",
      "description": "Sets the battery condition threshold on mobile printers. Controls when the printer warns about low battery.",
      "category": "control",
      "syntax": "~JF",
      "parameters": [],
      "whenToUse": "On mobile/portable printers — configure when battery warnings trigger.",
      "example": {
        "source": "~JF",
        "description": "Set battery condition threshold"
      },
      "previewSupported": false,
      "canonicalUrl": "https://rfid.me/reference/zpl/jf/"
    },
    {
      "command": "~JI",
      "name": "Start ZBI (Zebra Basic Interpreter)",
      "description": "Starts the ZBI (Zebra Basic Interpreter) program stored on the printer. ZBI lets you run custom programs directly on the printer for data processing, conditional logic, and more.",
      "category": "control",
      "syntax": "~JI",
      "parameters": [],
      "whenToUse": "When you have a ZBI program stored on the printer and want to start it running.",
      "example": {
        "source": "~JI",
        "description": "Start the stored ZBI program"
      },
      "previewSupported": false,
      "canonicalUrl": "https://rfid.me/reference/zpl/ji/"
    },
    {
      "command": "~JP",
      "name": "Pause and Cancel Format",
      "description": "Pauses the printer and cancels the currently printing format. Different from ~JA — this only cancels the current label, not the entire queue.",
      "category": "control",
      "syntax": "~JP",
      "parameters": [],
      "whenToUse": "When the current label is wrong but you want to keep the rest of the queue intact.",
      "example": {
        "source": "~JP",
        "description": "Pause and cancel the current label only"
      },
      "previewSupported": false,
      "canonicalUrl": "https://rfid.me/reference/zpl/jp/"
    },
    {
      "command": "~JQ",
      "name": "Terminate ZBI",
      "description": "Stops the running ZBI program. The counterpart to ~JI.",
      "category": "control",
      "syntax": "~JQ",
      "parameters": [],
      "whenToUse": "When you need to stop a running ZBI program on the printer.",
      "example": {
        "source": "~JQ",
        "description": "Stop the running ZBI program"
      },
      "previewSupported": false,
      "canonicalUrl": "https://rfid.me/reference/zpl/jq/"
    },
    {
      "command": "~JR",
      "name": "Power On Reset",
      "description": "Performs a software reset of the printer — equivalent to turning it off and on again. All volatile settings are lost, but saved configuration persists.",
      "category": "control",
      "syntax": "~JR",
      "parameters": [],
      "whenToUse": "When the printer is in a bad state and needs a reboot without physically cycling power.",
      "example": {
        "source": "~JR",
        "description": "Software reboot the printer"
      },
      "previewSupported": false,
      "canonicalUrl": "https://rfid.me/reference/zpl/jr/"
    },
    {
      "command": "~JX",
      "name": "Reset Optional Memory",
      "description": "An alternative reset for optional memory. Similar to ~JB but may behave differently on certain printer models.",
      "category": "control",
      "syntax": "~JX",
      "parameters": [],
      "whenToUse": "When ~JB doesn't work on your printer model — consult the specific printer's manual.",
      "example": {
        "source": "~JX",
        "description": "Alternative optional memory reset"
      },
      "previewSupported": false,
      "canonicalUrl": "https://rfid.me/reference/zpl/jx/"
    },
    {
      "command": "^CC",
      "name": "Change Carets",
      "description": "The caret version of ~CC — changes the caret character from within a label format. The change takes effect immediately.",
      "category": "control",
      "syntax": "^CCx",
      "parameters": [
        {
          "name": "x",
          "description": "New caret character"
        }
      ],
      "whenToUse": "When you need to change the caret character as part of a label format.",
      "example": {
        "source": "^XA\n^CC#\n#FO50,50#A0N,30,30#FDNew caret#FS\n#XZ",
        "description": "Switch to # as caret mid-format"
      },
      "previewSupported": false,
      "canonicalUrl": "https://rfid.me/reference/zpl/cc/"
    },
    {
      "command": "^CD",
      "name": "Change Delimiter",
      "description": "The caret version of ~CD — changes the parameter delimiter from within a label format.",
      "category": "control",
      "syntax": "^CDx",
      "parameters": [
        {
          "name": "x",
          "description": "New delimiter character"
        }
      ],
      "whenToUse": "When your field data contains commas and you need a different delimiter.",
      "example": {
        "source": "^XA\n^CD|\n^FO50|50^A0N|30|30^FDPipe delimited^FS\n^XZ",
        "description": "Switch to pipe as delimiter"
      },
      "previewSupported": false,
      "canonicalUrl": "https://rfid.me/reference/zpl/cd/"
    },
    {
      "command": "^CT",
      "name": "Change Tilde",
      "description": "The caret version of ~CT — changes the tilde character from within a label format.",
      "category": "control",
      "syntax": "^CTx",
      "parameters": [
        {
          "name": "x",
          "description": "New tilde character"
        }
      ],
      "whenToUse": "When you need to change the tilde character as part of a configuration label.",
      "example": {
        "source": "^XA\n^CT!\n^XZ",
        "description": "Change tilde to exclamation mark"
      },
      "previewSupported": false,
      "canonicalUrl": "https://rfid.me/reference/zpl/ct/"
    },
    {
      "command": "^KD",
      "name": "Select Date and Time Format",
      "description": "Sets the format for date and time fields when using the printer's real-time clock (RTC). Controls how dates appear on labels.",
      "category": "control",
      "syntax": "^KDformat",
      "parameters": [
        {
          "name": "format",
          "description": "Date format: see Zebra RTC documentation for format codes"
        }
      ],
      "whenToUse": "When your labels include date/time stamps and you need a specific format (e.g., DD/MM/YYYY vs MM-DD-YY).",
      "example": {
        "source": "^XA\n^KD0\n^XZ",
        "description": "Select date format 0 (default)"
      },
      "previewSupported": false,
      "canonicalUrl": "https://rfid.me/reference/zpl/kd/"
    },
    {
      "command": "^KL",
      "name": "Define Language",
      "description": "Sets the language for the printer's display panel and configuration labels. Doesn't affect ZPL commands — only the printer's UI.",
      "category": "control",
      "syntax": "^KLn",
      "parameters": [
        {
          "name": "n",
          "description": "Language code: 0 (English), 1 (Spanish), 2 (French), etc."
        }
      ],
      "whenToUse": "When deploying printers in non-English environments — set the display language for operators.",
      "example": {
        "source": "^XA\n^KL0\n^XZ",
        "description": "Set printer display language to English"
      },
      "previewSupported": false,
      "canonicalUrl": "https://rfid.me/reference/zpl/kl/"
    },
    {
      "command": "^KN",
      "name": "Define Printer Name",
      "description": "Sets a human-readable name for the printer. This name appears in ~HI responses and on the printer's display. Useful for identifying printers in a fleet.",
      "category": "control",
      "syntax": "^KNname",
      "parameters": [
        {
          "name": "name",
          "description": "Printer name (alphanumeric, up to 40 characters)"
        }
      ],
      "whenToUse": "When managing multiple printers — give each a meaningful name like \"Warehouse-Dock-3\" or \"Line-B-Labeller\".",
      "example": {
        "source": "^XA\n^KNWarehouse-Dock-3\n^XZ",
        "description": "Name the printer \"Warehouse-Dock-3\""
      },
      "previewSupported": false,
      "canonicalUrl": "https://rfid.me/reference/zpl/kn/"
    },
    {
      "command": "^KP",
      "name": "Define Password",
      "description": "Sets or changes the printer's configuration password. When a password is set, configuration commands require the password to execute.",
      "category": "control",
      "syntax": "^KPoldpass,newpass",
      "parameters": [
        {
          "name": "oldpass",
          "description": "Current password (blank if none set)"
        },
        {
          "name": "newpass",
          "description": "New password"
        }
      ],
      "whenToUse": "To prevent unauthorised configuration changes — protects printer settings in shared environments.",
      "example": {
        "source": "^XA\n^KP,SECRET123\n^XZ",
        "description": "Set printer password to SECRET123 (no previous password)"
      },
      "previewSupported": false,
      "canonicalUrl": "https://rfid.me/reference/zpl/kp/"
    },
    {
      "command": "^MP",
      "name": "Mode Protection",
      "description": "Locks or unlocks certain printer settings to prevent changes. A more granular approach than passwords — protect specific settings while leaving others open.",
      "category": "control",
      "syntax": "^MPmode",
      "parameters": [
        {
          "name": "mode",
          "description": "Protection mode setting"
        }
      ],
      "whenToUse": "When you want to lock down specific settings (like darkness or speed) but still allow label printing.",
      "example": {
        "source": "^XA\n^MPE\n^XZ",
        "description": "Enable mode protection"
      },
      "previewSupported": false,
      "canonicalUrl": "https://rfid.me/reference/zpl/mp/"
    },
    {
      "command": "^PA",
      "name": "Advanced Text Properties",
      "description": "Sets advanced text rendering properties including character spacing, line spacing, and justification defaults.",
      "category": "control",
      "syntax": "^PAa,b,c,d",
      "parameters": [
        {
          "name": "a",
          "description": "Character spacing adjustment"
        },
        {
          "name": "b",
          "description": "Line spacing adjustment"
        },
        {
          "name": "c",
          "description": "Space character width"
        },
        {
          "name": "d",
          "description": "Additional text properties"
        }
      ],
      "whenToUse": "When fine-tuning text rendering beyond what ^CF and ^A0 provide.",
      "example": {
        "source": "^XA\n^PA0,0,0,0\n^XZ",
        "description": "Reset text properties to defaults"
      },
      "previewSupported": false,
      "canonicalUrl": "https://rfid.me/reference/zpl/pa/"
    },
    {
      "command": "^PE",
      "name": "Print Engine Language",
      "description": "Sets the printer's primary command language. Similar to ^SL but specifically targets the print engine. Switches between ZPL, EPL, CPCL.",
      "category": "control",
      "syntax": "^PElang",
      "parameters": [
        {
          "name": "lang",
          "description": "Language: Z (ZPL), E (EPL), C (CPCL)"
        }
      ],
      "whenToUse": "When permanently changing the printer's command language — use ^SL for temporary changes.",
      "example": {
        "source": "^XA\n^PEZ\n^XZ",
        "description": "Set print engine to ZPL mode"
      },
      "previewSupported": false,
      "canonicalUrl": "https://rfid.me/reference/zpl/pe/"
    },
    {
      "command": "^PM",
      "name": "Printing Mirror Image",
      "description": "Mirrors the entire label horizontally — everything prints as a mirror image. Useful for printing on transparent media that will be viewed from the other side.",
      "category": "control",
      "syntax": "^PMa",
      "parameters": [
        {
          "name": "a",
          "description": "Y (mirror image on) or N (normal printing)"
        }
      ],
      "whenToUse": "When printing on transparent labels or window decals that are read from the reverse side.",
      "example": {
        "source": "^XA\n^PMY\n^FO50,50^A0N,30,30^FDMirrored^FS\n^XZ",
        "description": "Print entire label as mirror image"
      },
      "previewSupported": true,
      "canonicalUrl": "https://rfid.me/reference/zpl/pm/"
    },
    {
      "command": "^PP",
      "name": "Programmable Pause",
      "description": "The caret version of ~PP — enables pause-after-each-label from within a label format.",
      "category": "control",
      "syntax": "^PP",
      "parameters": [],
      "whenToUse": "When you want to enable pause mode as part of a configuration or setup label.",
      "example": {
        "source": "^XA\n^PP\n^FO50,50^A0N,30,30^FDPause after this^FS\n^XZ",
        "description": "Enable pause mode from a label format"
      },
      "previewSupported": false,
      "canonicalUrl": "https://rfid.me/reference/zpl/pp/"
    },
    {
      "command": "^SQ",
      "name": "Halt ZBI",
      "description": "Halts (pauses) the running ZBI program without terminating it. The program can be resumed later. Different from ~JQ which fully terminates.",
      "category": "control",
      "syntax": "^SQ",
      "parameters": [],
      "whenToUse": "When you need to temporarily pause a ZBI program — for example, to send a manual label before resuming automation.",
      "example": {
        "source": "^XA\n^SQ\n^XZ",
        "description": "Halt the running ZBI program"
      },
      "previewSupported": false,
      "canonicalUrl": "https://rfid.me/reference/zpl/sq/"
    },
    {
      "command": "^ST",
      "name": "Set Date and Time",
      "description": "Sets the printer's real-time clock (RTC). Required for date/time stamping on labels. Only works on printers with an RTC module installed.",
      "category": "control",
      "syntax": "^STyear,month,day,hour,minute,second",
      "parameters": [
        {
          "name": "year",
          "description": "Year (2-digit or 4-digit)"
        },
        {
          "name": "month",
          "description": "Month (01-12)"
        },
        {
          "name": "day",
          "description": "Day (01-31)"
        },
        {
          "name": "hour",
          "description": "Hour (00-23)"
        },
        {
          "name": "minute",
          "description": "Minute (00-59)"
        },
        {
          "name": "second",
          "description": "Second (00-59)"
        }
      ],
      "whenToUse": "During initial printer setup or after a battery replacement that reset the clock.",
      "example": {
        "source": "^XA\n^ST2026,04,01,14,30,00\n^XZ",
        "description": "Set clock to April 1, 2026 at 2:30 PM"
      },
      "previewSupported": false,
      "canonicalUrl": "https://rfid.me/reference/zpl/st/"
    },
    {
      "command": "^SX",
      "name": "Set XML Mode",
      "description": "Toggles the printer's **XML-aware input parser** — when enabled, the printer accepts label data wrapped inside XML elements (rather than as raw ZPL strings) and binds the XML field values into a previously-stored ZPL template (typically loaded with `^DF`/recalled with `^XF`). This is the entry point for **integrations driven by XML label-management systems** that produce one XML document per label (or per batch) and expect the printer to resolve the document against a saved format. While XML mode is on, the printer treats incoming bytes as XML to be parsed (extracting field values into the recalled format's `^FN` placeholders) rather than as a raw ZPL command stream — turning it off restores raw-ZPL parsing. The mode is **sticky** across power cycles when committed via `^JU` and is normally enabled once during printer commissioning, not toggled per label.",
      "category": "network",
      "syntax": "^SXa",
      "parameters": [
        {
          "name": "a",
          "description": "**XML mode toggle**: `Y` = enable XML-aware parsing (host sends XML wrapping of `^FN` field values against a recalled format), `N` = disable, restoring raw-ZPL parsing. Default: `N`. Some firmware also accepts numeric form (`1`/`0`) — check the printer's programming guide for the exact form it expects. The setting persists across the rest of the format and is committed across power cycles via `^JU`."
        }
      ],
      "whenToUse": "When the printer is the **endpoint of an XML-based label workflow**. The most common integration targets are **SAP printing** (SAP Smart Forms / SAPscript / Adobe Forms via the SAP-to-Zebra connector that emits Zebra XML), **Loftware NiceLabel / BarTender** when configured to push XML rather than rendered ZPL, **Bartender Commander** or **Seagull JLB** outputs in XML mode, and **enterprise WMS/MES systems** (Manhattan, Oracle WMS, Infor) whose printer adapters target Zebra XML over a saved template. The host workflow is: (1) operator/print-engineer designs the label as a normal ZPL format with `^FN`-numbered fields and saves it to the printer with `^DF` — typically once, during commissioning; (2) the host application emits an XML document referencing the saved format name and listing field values; (3) with `^SX` on, the printer parses the incoming XML, recalls the format with `^XF`, fills the `^FN` slots from the XML field values, and prints. ⚠️ **Do not enable XML mode on a printer that also receives raw ZPL** from the same channel — incoming raw-ZPL bytes will be misinterpreted as malformed XML and silently rejected. Dedicate the printer (or the network port) to XML traffic, or use separate logical queues. To verify XML mode, send the host's exact XML payload and check the printer's configuration label (`^XA^HH^XZ`) — the XML mode setting is reported there.",
      "example": {
        "source": "^XA\n^SXY\n^JUS\n^XZ",
        "description": "Enable XML mode and persist the setting (`^JUS` = save current configuration). After this runs, the printer accepts XML payloads from the host that recall a previously-stored format (loaded via `^DF^FORMAT.ZPL` … `^XZ`) and bind XML element values into the format's `^FN` placeholders. Typical XML payload shape (sent over the same TCP/USB channel the printer normally listens on): `<labels _FORMAT=\"E:FORMAT.ZPL\"><label><field name=\"1\">12345</field><field name=\"2\">Acme Corp</field></label></labels>` — the `name=\"1\"` value lands in `^FN1`, `name=\"2\"` lands in `^FN2`, and the printer renders the recalled format with those values. To return to raw-ZPL parsing later: `^XA^SXN^JUS^XZ`."
      },
      "previewSupported": false,
      "canonicalUrl": "https://rfid.me/reference/zpl/sx/"
    },
    {
      "command": "^SZ",
      "name": "Set ZPL Mode",
      "description": "Selects the ZPL language dialect the printer uses to parse the rest of the format: **`B` = ZPL II (modern, default)**, **`A` = ZPL (legacy / ZPL I)**. ZPL II is the superset Zebra has shipped since the mid-1990s — it added advanced barcodes (PDF417, Data Matrix, QR, MaxiCode, Aztec, GS1 Composite), scalable/extended fonts (`^A0` family, `^CW`/`^CI` variants), graphic boxes/lines (`^GB`), bitmap import (`~DG`/`^XG`), download/format storage (`^DF`/`^XF`), and the modern label-format command set as a whole. ZPL (legacy) is the original 1980s pre-ZPL-II language and silently rejects or mis-renders any of those modern constructs. The mode is **sticky** — once set, it persists until changed by another `^SZ`, a configuration reset (`^JU`), or a power cycle that loads a different default from saved configuration. **In legacy ZPL I mode, `^SZB` is itself the only escape route back to ZPL II** — most other ZPL II commands will be rejected. Almost all real-world labels use ZPL II; legacy mode exists only for backward compatibility with very old host software that still emits pre-ZPL-II command streams.",
      "category": "control",
      "syntax": "^SZa",
      "parameters": [
        {
          "name": "a",
          "description": "Mode letter: **`A`** = ZPL (legacy / ZPL I — pre-1990s dialect, no advanced barcodes/fonts/graphics), **`B`** = ZPL II (modern superset, factory default and the dialect every example in this reference assumes). Default: `B`. Any other value is invalid and the command is ignored."
        }
      ],
      "whenToUse": "⚠️ **Avoid switching to `^SZA` (ZPL legacy) unless you have a specific reason.** Legacy mode breaks every ZPL II feature in the rest of the format: advanced barcodes (`^B7`/`^BQ`/`^BX`/`^BD`/`^BO`/`^BC` GS1 modes), scalable and extended fonts, `^GB` boxes, downloaded graphics (`^XG`), stored formats (`^XF`/`^DF`), `^FB` field blocks, `^FN`/`^FS` numbered fields, RFID commands (`^RFW`/`^RT`/`^HV`), and most modern positioning/configuration commands will either error, render as text, or be silently ignored. Use `^SZA` **only** when driving a printer from a host application that still emits pre-ZPL-II command streams and you cannot upgrade the host. Use `^SZB` (the default) for everything else — and explicitly emit `^SZB` at the top of any format that runs against a printer whose persistent configuration may have been left in legacy mode by a previous job. After issuing `^SZA`, the only safe next command is `^SZB` to restore ZPL II before doing anything else.",
      "example": {
        "source": "^XA\n^SZB\n^FO50,50^A0N,40,40^FDZPL II mode^FS\n^FO50,120^GB400,2,2^FS\n^XZ",
        "description": "`^SZB` explicitly forces ZPL II at the top of the format, guaranteeing the scalable `^A0` font and the `^GB` underline render correctly even if the printer was previously left in legacy mode by another job. The same format under `^SZA` would fail: `^A0` would not be recognised as a scalable font and `^GB` would either error or be ignored, leaving a label with the text rendered (if at all) in a default bitmap font and no underline."
      },
      "previewSupported": false,
      "canonicalUrl": "https://rfid.me/reference/zpl/sz/"
    },
    {
      "command": "^ZZ",
      "name": "Sleep / Power Save",
      "description": "Puts the printer into a **low-power sleep state** to save energy (and, on battery-powered models like the QLn / ZQ-series, extend battery life). While asleep, the printer's **CPU, display, and most I/O subsystems are powered down** — incoming bytes on the serial/USB/network ports may be **buffered, deferred, or dropped entirely** depending on the model and the channel; the printer will not respond to status queries (`^HH`, `~HS`, `~HI`) and will not start a print job until it wakes. The wake condition depends on **how `^ZZ` was issued**: with a timeout argument `t`, the printer auto-wakes after `t` seconds; without `t` (or with `t=0`), the printer sleeps **until an external wake signal arrives** — a button press on the front panel, a host-side wake command (`~WC` on supporting firmware, or a low-level USB/serial wake-up byte sequence), or on networked models a `WoL` magic packet to the printer's MAC. Optional second parameter `b` controls whether to **beep on wake** (audible confirmation that the printer is again ready). Sleep state is **not persistent across power cycles** — a power-on always resets to fully-awake.",
      "category": "control",
      "syntax": "^ZZt,b",
      "parameters": [
        {
          "name": "t",
          "description": "**Sleep timeout in seconds** — how long the printer remains in low-power state before auto-waking. Range: typically `1`–`65535` (model-specific upper bound; consult the printer's programming guide for the QLn/ZQ/ZD/ZT model in question). **`0` or omitted** = sleep until an external wake signal (button press, host wake command, magic packet) — the printer will *not* wake on its own. Default: `0` (indefinite sleep). For host-driven workflows that have no out-of-band wake path, **always supply a finite timeout** so the printer cannot be lost forever."
        },
        {
          "name": "b",
          "description": "**Beep-on-wake flag**: `Y` = sound the printer's built-in beeper when waking (audible confirmation, useful for unattended/kiosk deployments and for diagnostic verification), `N` = silent wake. Default: `N`. Only meaningful on models with a beeper — silently ignored on models without one."
        }
      ],
      "whenToUse": "For **battery-powered or unattended deployments** where idle power consumption matters: handheld units (QLn220/QLn320, ZQ-series) parked between print jobs, kiosk printers in low-traffic windows, or fixed-location printers in shift-based workflows where overnight sleep saves measurable wattage. ⚠️ **Critical caveat — the printer may stop responding to the host until woken.** Status polling (`~HS`, `^HH`), `^XF` recall queries, and even raw incoming labels can be dropped on the floor while the printer is asleep on some firmware. **Always pair `^ZZ` with a known wake path** before issuing it: either give it a finite timeout `t` so it auto-wakes (preferred for fire-and-forget host workflows), or guarantee the host can issue the wake command (and that the channel transports the wake byte through to the asleep printer). **Never issue `^ZZ` without a timeout from a host that has no wake mechanism** — you will lose the printer until someone walks over and pushes the power button. For diagnostic and integration testing, default to `^ZZ60,Y` (sleep 60s, beep on wake) so you get an audible signal the printer came back. Avoid issuing `^ZZ` from inside a long-running print job — the sleep transition can interrupt motion control on some models and cause label misregistration.",
      "example": {
        "source": "^XA\n^ZZ300,Y\n^XZ",
        "description": "Sleep for **300 seconds (5 minutes)** then auto-wake with an audible beep. Suitable for a battery-powered handheld parked between print runs in a warehouse shift — the printer drops to low-power state immediately, drains negligible battery for 5 minutes, and signals readiness when it wakes. To sleep until an external wake signal instead (no auto-wake): `^XA^ZZ0^XZ` — but only do this when you have a guaranteed wake path (front-panel button, `~WC` host command, or magic packet) or you will lose the printer until someone power-cycles it. ⚠️ Do not use `^ZZ` without a timeout from a host that polls the printer for status — the polls will time out (or be silently dropped on the floor) until the printer wakes."
      },
      "previewSupported": false,
      "canonicalUrl": "https://rfid.me/reference/zpl/zz/"
    }
  ]
}
