API quickstart
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.
No expiry · No print cap · ZPL never watermarked
Hello, label
Free, no card, no expiry. You get two templates and one user.
Or open one from the gallery. Give it a name; that name is your API template handle.
Name the values your system will send. Qpro+ generates the request snippet for you to copy out.
Send your key pair and your data. When every value resolves, switch the route to the output you need.
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" } }'
[
{
"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
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.
Never ship a Qpro+ secret in browser code, a mobile binary, or firmware a customer can read.
Sandbox and production use separate key pairs. Moving over means changing the base URL and the keys, nothing else.
Fetch Markups returns the resolved label without printing it. Check your values there, then switch routes.
Output formats
| Route | Returns | Use it for |
|---|---|---|
| render-zpl | ZPL strings, one per copy | Sending straight to a thermal printer on your own network |
| render-pdf | Base64 vector PDF, one per copy | Packing lists, certificates, form-fill and archival documents |
| export-svg | Links to hosted SVG files, live 24 h | Vector output, scaling, downstream editing |
| fetch-markups | Resolved markup JSON | Inspecting what the template resolved to |
| print-node | ZPL sent through PrintNode | Thermal printers you reach through PrintNode |
| print-node-pdf | PDF sent through PrintNode | Office and laser printers you reach through PrintNode |
| Browser print dialog, via the SDK | Printing from a web page with no print server |
Languages
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]
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
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.
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
| Status | Meaning | What to do |
|---|---|---|
| 401 | Key or secret missing, wrong, or regenerated | Check X-API-KEY and X-API-SECRET. Sandbox and production keys aren't interchangeable |
| 404 / 422 | No template with that label_name | Names are case-sensitive; copy the name from your gallery. Render ZPL and Render PDF report this as 422 |
| 422 | A parameter is missing or invalid, or an RFID template was sent to a PDF route | Read the message in the response body. Render RFID labels with render-zpl |
| 429 | Rate limit reached | 60 requests a minute per key by default. Back off and retry |
| 200 | A field shows its placeholder instead of your value | An 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.
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