API quickstart

Let's simplify how you design, render, and print your labels and documents.

One request in. A rendered label or document out.
If your system can make an authenticated HTTPS request, it can render a Qpro+ label or document. You send a template name and your data; you get back ZPL, PDF, SVG, or the resolved markup as JSON. Nothing to install, no print server to run. Get SandBox account and test dive for yourself.

Create a Sandbox Account. One email with your sign-up link. No sales sequence.

No expiry · No print cap · ZPL never watermarked

Hello, label

The whole thing, in four steps.

01

Create a sandbox account

Free, no card, no expiry. You get two templates and one user.

02

Design a template

Or open one from the gallery. Give it a name; that name is your API template handle.

03

Map your fields

Name the values your system will send. Qpro+ generates the request snippet for you to copy out.

04

Call fetch-markups

Send your key pair and your data. When every value resolves, switch the route to the output you need.

POST /custom-labels/fetch-markupscurl · sandbox
curl -X POST "https://api.beta.quandosol.com/api/custom-labels/fetch-markups" \
  -H "Content-Type: application/json" \
  -H "X-API-KEY: $QPRO_API_KEY" \
  -H "X-API-SECRET: $QPRO_API_SECRET" \
  -d '{
    "label_name": "hello",
    "amount": 1,
    "apiData": {
      "mytext":    "HELLO WORLD",
      "mybarcode": "L25-8814",
      "myqrcode":  "https://quandopro.com"
    }
  }'
200 OKjson · trimmed
[
  {
    "stage": { "width": 4, "height": 2, "unit": "in" },
    "elements": [
      { "type": "text",    "text": "HELLO WORLD" },
      { "type": "barcode", "text": "L25-8814" },
      { "type": "barcode", "text": "https://quandopro.com" }
    ]
  }
]

Every value you sent, resolved onto the template. Nothing prints, so this is the safe first call. Swap hello for any template in your account.

Authentication

An API token and a secret. Nothing exotic.

Generate a key and secret under API Settings in your account. Send them as the X-API-KEY and X-API-SECRET headers on every request. The secret is shown once; regenerating it retires the old one immediately.

Keep the secret server-side

Never ship a Qpro+ secret in browser code, a mobile binary, or firmware a customer can read.

Sandbox first, then production

Sandbox and production use separate key pairs. Moving over means changing the base URL and the keys, nothing else.

Prove the data before you print

Fetch Markups returns the resolved label without printing it. Check your values there, then switch routes.

Output formats

Ask for what you're going to do with it.

RouteReturnsUse it for
render-zplZPL strings, one per copySending straight to a thermal printer on your own network
render-pdfBase64 vector PDF, one per copyPacking lists, certificates, form-fill and archival documents
export-svgLinks to hosted SVG files, live 24 hVector output, scaling, downstream editing
fetch-markupsResolved markup JSONInspecting what the template resolved to
print-nodeZPL sent through PrintNodeThermal printers you reach through PrintNode
print-node-pdfPDF sent through PrintNodeOffice and laser printers you reach through PrintNode
printBrowser print dialog, via the SDKPrinting from a web page with no print server

Every route, field and response in the API reference →

Languages

It is an HTTP call, so it works wherever you are.

POST /custom-labels/render-zplpython · requests
import os, requests

res = requests.post(
    "https://api.beta.quandosol.com/api/custom-labels/render-zpl",
    headers={
        "X-API-KEY": os.environ["QPRO_API_KEY"],
        "X-API-SECRET": os.environ["QPRO_API_SECRET"],
    },
    json={
        "label_name": "FG-PALLET-4x6",
        "amount": 1,
        "apiData": {
            "lot_number": "L25-8814",
            "pallet_id": "PLT-4471",
            "piece_qty": "48 CS",
        },
    },
    timeout=15,
)
res.raise_for_status()
zpl = res.json()["labels"][0]
POST /custom-labels/render-zpljavascript · node 18+
const res = await fetch("https://api.beta.quandosol.com/api/custom-labels/render-zpl", {
  method: "POST",
  headers: {
    "Content-Type": "application/json",
    "X-API-KEY": process.env.QPRO_API_KEY,
    "X-API-SECRET": process.env.QPRO_API_SECRET
  },
  body: JSON.stringify({
    label_name: "FG-PALLET-4x6",
    amount: 1,
    apiData: {
      lot_number: "L25-8814",
      pallet_id:  "PLT-4471",
      piece_qty:  "48 CS"
    }
  })
});

if (!res.ok) throw new Error(await res.text());
const { labels } = await res.json();   // one ZPL job per copy

Postman

Load every route into Postman without writing anything.

Import the Qpro+ OpenAPI spec and Postman builds the collection for you: all seven routes, example bodies, and both auth headers. Add your sandbox key and secret, then send. If Fetch Markups comes back with your values, the integration is going to work.

Imported requestsopenapi.json
Qpro+ Label and Document API · sandbox
├── POST 01 Fetch Markups   /custom-labels/fetch-markups
├── POST 02 Print Markups    /custom-labels/print
├── POST 03 PrintNode ZPL    /custom-labels/print-node
├── POST 04 PrintNode PDF    /custom-labels/print-node-pdf
├── POST 05 Export SVG       /custom-labels/export-svg
├── POST 06 Render ZPL       /custom-labels/render-zpl
└── POST 07 Render PDF       /custom-labels/render-pdf

Limits and errors

What you'll hit, and what it means.

StatusMeaningWhat to do
401Key or secret missing, wrong, or regeneratedCheck X-API-KEY and X-API-SECRET. Sandbox and production keys aren't interchangeable
404 / 422No template with that label_nameNames are case-sensitive; copy the name from your gallery. Render ZPL and Render PDF report this as 422
422A parameter is missing or invalid, or an RFID template was sent to a PDF routeRead the message in the response body. Render RFID labels with render-zpl
429Rate limit reached60 requests a minute per key by default. Back off and retry
200A field shows its placeholder instead of your valueAn apiData key doesn't match the field name. It isn't an error response; compare your keys with the names in the canvas

Paid accounts are provisioned against your expected throughput rather than a fixed published ceiling. If you're load-testing toward production volume, tell us first so we raise it before you hit it.

Get a label on real stock today.

Free account, no expiry, no print cap, and ZPL output is never watermarked, so what you print now is exactly what you'd print in production.

Qpro+ is a product of Quando Solutions, a supply chain & manufacturing IT company