SheetStamp
Send JSON, get print-ready barcode labels, thermal printer ZPL, invoices and packing slips. One API key, no rendering code to maintain.
Get a free API key
100 units a month free. No card needed. We email you a one-time link that shows your key.
Quick start
curl https://api.sheetstamp.com/v1/labels/render \
-H "Authorization: Bearer YOUR_KEY" \
-H "Content-Type: application/json" \
-o labels.pdf \
-d '{
"template": "avery-5160",
"items": [
{ "barcode": "012345678905", "title": "Blue Mug 12oz", "price": "$14.00", "qty": 30 },
{ "barcode": "SKU-RED-01", "title": "Red Mug 12oz", "price": "$14.00", "qty": 30 }
]
}'
Plans
| Plan | Price | Units per month | Labels per request |
|---|---|---|---|
| Free | $0 | 100 | 100 |
| Starter | $9 / month | 2,500 | 1,000 |
| Pro | $29 / month | 25,000 | 5,000 |
| Scale | $79 / month | 250,000 | 5,000 |
One label is 1 unit. One barcode image is 1 unit. One invoice or packing slip is 5 units. Failed requests cost nothing.
Reference
Every request needs Authorization: Bearer YOUR_KEY and a JSON body. Errors come back as {"error":{"code","message","details"}}.
POST/v1/labels/render
| Field | Meaning |
|---|---|
template | A preset id from GET /v1/templates, or a custom object (below). |
items[] | Each has any of barcode, title, price, text, plus qty (default 1) and symbology (default auto). |
format | pdf (default) or zpl for Zebra-compatible thermal printers. |
options.start_position | First label slot to use on a part-used sheet, counted from 1. |
options.show_text | Print the value under linear barcodes. Default true. |
options.outline | Draw dashed label borders, for alignment tests. |
options.dpi | ZPL only: 203 (default), 300 or 600. |
Symbologies: auto, code128, ean13, ean8, upca, code39, itf14, qrcode, datamatrix. With auto, a value prints as UPC-A, EAN-13 or EAN-8 only when it is a valid GTIN with a correct check digit; everything else prints as Code 128.
Custom template:
"template": {
"unit": "mm",
"page": { "width": 210, "height": 297 },
"label": { "width": 63.5, "height": 38.1 },
"cols": 3, "rows": 7,
"margin": { "left": 7.2, "top": 15.1 },
"gap": { "x": 2.5, "y": 0 }
}
Leave out page for a roll: each label becomes its own page. Units: mm, cm, in, pt.
Response headers: X-SheetStamp-Labels, X-SheetStamp-Pages, X-SheetStamp-Units-Used, X-SheetStamp-Units-Limit, and X-SheetStamp-Warnings (URL-encoded JSON) when a barcode is too dense for the label size.
Print PDFs at 100% scale ("Actual size"), not "Fit to page". Text uses DejaVu Sans, which covers Latin, Greek and Cyrillic; Chinese, Japanese and Korean text is not supported yet.
POST/v1/barcodes/render
{ "value": "SKU-123", "symbology": "auto", "format": "png", "scale": 3, "height_mm": 15, "show_text": true }
Returns a PNG or SVG image.
POST/v1/documents/render
{
"type": "invoice",
"page_size": "A4",
"currency": "USD", "locale": "en-US",
"seller": { "name": "Acme Co", "address": ["1 Main St", "Raleigh, NC 27601"], "email": "hi@acme.test" },
"customer": { "name": "Pat Lee", "billing_address": ["9 Elm Rd", "Austin, TX 78701"], "shipping_address": ["9 Elm Rd", "Austin, TX 78701"] },
"order": { "number": "1042", "date": "2026-11-11", "payment_method": "Card", "shipping_method": "Ground" },
"lines": [ { "name": "Blue Mug 12oz", "sku": "MUG-BLU", "qty": 2, "unit_price": 14 } ],
"totals": { "shipping": 5, "tax": 2.31 },
"notes": "Thanks for your order.",
"barcode": true
}
type is invoice or packing_slip. Missing subtotal and total are calculated. logo accepts a base64 PNG or JPEG under 400 KB. barcode: true prints the order number as Code 128.
GET/v1/account
Your plan and this month's usage.
GET/v1/templates GET/v1/plans
Public lists of label presets and plans. No key needed.
POST/v1/billing/checkout POST/v1/billing/portal
Send {"plan":"starter"} to checkout to get a payment link. The portal returns a link to change or cancel a plan.
Limits
120 requests a minute per key. 2 MB request body. Up to 5,000 distinct items per request.