Integration guide · API v1
Evidence and property labels
A 4 × 2 inch label for an evidence or property item: the case number, when it was collected and by whom, the item number as a Code 128 barcode, and the case number again as a QR code.
The request
Send this body to POST https://api.zeepler.com/v1/zeeplify with your API key in the x-api-key header. It is a working request, not an illustration: on every change, our tests run this same file through the API's code and compare the result with the ZPL below.
1{2 "config": {3 "size": "4x2"4 },5 "data": {6 "caseNumber": "CASE-2026-00841",7 "item": "ITEM-014",8 "collectedBy": "BADGE-2291",9 "collectedAt": "2026-08-23T14:20Z"10 },11 "templates": [12 {13 "type": "Text",14 "dataPath": "caseNumber",15 "coords": [30, 25],16 "font": "0,36"17 },18 {19 "type": "Text",20 "dataPath": "collectedAt",21 "coords": [30, 70],22 "font": "0,24"23 },24 {25 "type": "Text",26 "dataPath": "collectedBy",27 "coords": [30, 105],28 "font": "0,24"29 },30 {31 "type": "BarCode",32 "dataPath": "item",33 "coords": [30, 145],34 "style": "code128"35 },36 {37 "type": "QRCode",38 "dataPath": "caseNumber",39 "coords": [560, 25],40 "magnification": 541 }42 ]43}And the ZPL that comes back, ready to send to the printer:
^XA^MCY^XZ
^XA
^SZ2
^MMT
^MNY
^LL406
^PW815
^LH0,0
^CF0,36^FO30,25^FDCASE-2026-00841^FS
^CF0,24^FO30,70^FD2026-08-23T14:20Z^FS
^CF0,24^FO30,105^FDBADGE-2291^FS
^BY2,2,59^FO30,145^BCN,,N,N,N,A^FDITEM-014^FS
^BY2,2,0^FO560,25^BQN,2,5^FDQA,CASE-2026-00841^FS
^XZWhat each part does
caseNumberprints first and largest, and appears twice: as text, and as the QR code on the right for handheld scanners.collectedAtandcollectedByprint as given. Format them before you send them: zeepler prints the value, it does not reformat dates.itemis a Code 128 barcode, so an item number with letters and dashes scans as printed.
Sending it
- Call the API from your own server or integration engine, not from a web page. An API key in a browser is a key anyone can copy.
- A successful call answers
200with the ZPL as plain text. A request the API cannot turn into a label answers400with every problem listed by field, and is not billed. - Send the ZPL to a Zebra or other ZPL printer at 203 dpi. At 300 dpi the same label prints at two-thirds of the size.
The API reference has every field and status code.
Before you go live
- Text does not wrap. A value longer than the space you left runs off the edge of the label, so set
maxLengthon any field whose length you do not control. - Coordinates are in dots from the top-left corner. Print one label, measure it, and adjust: there is no preview.
- Scan every barcode and QR code on a printed label before relying on it.
Your data
zeepler runs on Amazon Web Services in the United States (us-east-1).
A label request is used to generate the label and is then discarded. zeepler does not store request bodies and does not write them to its logs.
Send only the fields the label prints. zeepler reads the fields your templates name and ignores the rest, but there is no reason to send data that will not be used.
The Security page sets out what is kept, for how long, and who can reach it.
Audit trail
For every label it generates, zeepler records the account, the time, the endpoint, how long it took and how many labels it made. It does not record what was on the label, and a refused request leaves no record here. These records are kept for 90 days, and they are what billing is calculated from.
The dashboard shows this month's totals. The individual records cannot be exported yet, so keep your own record of what was printed, when and by whom. Your system remains the system of record.
zeepler generates a label; it is not a chain-of-custody system. Beyond the record above, it holds no proof that a label was printed, and no way to show that the data on it was not changed before it arrived. Custody records stay in your system.
Help with an integration
Email zeepler@bates-solutions.com. You will get a reply within 2 business days. The support policy covers response times and version changes.