The Stripe for Printing

One API to send labels to any thermal printer. Ship faster with ZPL, templates, or images — 6 lines of code.

Quick Start OpenAPI Spec MCP for AI Agents
cURL
Python
Node.js
C#
# Print a shipping label in one call
curl https://labelinn.com/v1/print/jobs \
  -H "Authorization: Bearer sk_live_xxx" \
  -H "Content-Type: application/json" \
  -d '{"printer_id":"abc","payload_type":"template",
       "design_id":"tmpl_shipping",
       "data":{"name":"Jane Doe","order":"ORD-4521"}}'

Everything You Need to Print

From raw ZPL to visual templates — one unified API.

Multi-Protocol Printing

ZPL, ESC/POS, TSPL, SLCS — Zebra, TSC, Bixolon, Honeywell, Brother and more. TCP, USB, and Bluetooth.

Batch Printing

Submit up to 100 labels in a single API call. Perfect for order fulfillment and warehouse operations.

Template Engine

Design once in the LabelInn app, fill with data via API. Variables, barcodes, images — all dynamic.

Preview Before Print

Render any template with data and get a PNG/PDF preview. Verify labels before committing to paper.

Real-time Webhooks

Get notified on job completion, failures, printer status changes, and low supply alerts.

Data Connect

Push XML, CSV, JSON, or TSV from any ERP/WMS. Auto-parse, map fields to labels, and print — one API call.

Usage Analytics

Track API calls, print volumes, and endpoint breakdown. See your usage in real-time.

Test Mode

Use sk_test_ keys to simulate everything without physical prints. Full API parity.

AI Agent Ready

OpenAPI spec + ai-plugin.json manifest. ChatGPT, Claude, and Copilot can discover and use your printing setup.

Enterprise Security

SHA-256 key hashing, HMAC webhook signatures, SSRF protection, and per-key permission scoping.

Edge Server

Local LAN API on port 6631. Print via USB/TCP without internet — offline queue syncs back automatically.

Auto-Discovery

Discover USB, network, and Bluetooth printers via API. Trigger scans on remote devices and add printers to your fleet in one flow.

Official SDKs

Get started in your language with type-safe, idiomatic client libraries.

Node.js / TypeScript

npm install labelinn

Python

pip install labelinn

C# / .NET

dotnet add package LabelInn

Go

go get github.com/labelinn/labelinn-go

Quick Start — From Zero to First Print in 5 Minutes

Three concrete steps. The path from a fresh account to a thermal printer humming.

1. Get an API Key

Sign up for a free 14-day Pro trial — no credit card. Open Settings → API Keys in the dashboard, generate a key. Use sk_test_* for sandbox, sk_live_* for production.

Create account →

2. Pick an Integration Path

REST API — for ERPs, WMSes, custom dashboards. Submit jobs, query the fleet, subscribe to webhooks.

MCP Server — for Claude, Cursor, Copilot, or any AI agent. Natural-language printing.

Edge Server — for offline LAN printing without cloud round-trips.

3. Send Your First Job

Submit a print job with the saved design ID and your printer ID. Watch the printer come alive within 2–4 seconds.

See endpoints →

Four rules that decide whether your integration works

Printing is physical and asynchronous. These four cover almost every integration that looks correct in testing and misbehaves in production — worth reading whether you are writing the code yourself or having an AI agent write it.

1. 201 Created does not mean “printed”. The response comes back as soon as the job is queued; the label is rendered and printed afterwards by the customer’s own device. Render and hardware errors therefore never appear in the create response — only in the job. Poll GET /v1/print/jobs/{id} every ~2 s until status is completed, failed or cancelled. A job you never poll is a failure you will never see.

2. A retry needs a new idempotency key. X-Idempotency-Key caches the response for 24 h, so replaying a key returns the original job and prints nothing — that is what protects you from double labels on a network retry. The trap: after a job comes back failed, reusing the same key returns that failed job instead of reprinting, so a naive retry loop leaves the row permanently unprinted. Put an attempt counter in the key: erp:<order>-<line>:<attempt>.

3. Check the printer before you send. A job aimed at an offline printer sits in queued indefinitely. Call GET /v1/fleet/printers first: the target needs is_online: true and cloud_print_enabled: true — the latter is switched on by the customer in the desktop app and cannot be enabled through the API.

4. Ask the design what fields it wants. Do not guess variable names. GET /v1/designs/{id}/variables returns the exact keys plus a ready-made example_payload. Unknown keys in data are ignored silently, which looks exactly like a binding bug.

Many labels at once: data accepts an array of rows (max 1000) — one row renders one label, which is how serial numbers and per-row values work. copies repeats the whole job instead. Use the array for different labels, copies for N identical ones.

Mirroring an ERP or database: keep the “printed” state in a table you own rather than writing into the source system’s own schema — that is what breaks ERP vendor support contracts. Match on a stable row key and reuse that key in the idempotency header above.

The same guidance is machine-readable in the OpenAPI spec, so an agent that reads the spec gets it without being told.

Authentication — two ways in

API key (Bearer) — the default for code. Send Authorization: Bearer sk_live_xxx on every request. This is what all four official SDKs use.

OAuth 2.0 — for no-code connectors (Make, Zapier) so your users never copy a key by hand. Authorization-code flow with optional S256 PKCE; client_credentials is also accepted with the API key passed as client_secret.

  • GET  /v1/oauth/authorize
  • POST /v1/oauth/token
  • GET  /.well-known/oauth-authorization-server

The issued access_token is a long-lived LabelInn API key, so expires_in and refresh_token are deliberately omitted (RFC 6749 §5.1) — treat the token as non-expiring rather than attempting a refresh.

Full REST API Guide → OpenAPI Reference

MCP Server — Print from Claude, Cursor & ChatGPT

Plug LabelInn into any Model Context Protocol client. AI agents call your printers with structured tools, not glue code.

12 Tool Modules

print_label, print_zpl, batch_print, list_printers, design CRUD, render previews, audit, edge rules — the full LabelInn surface as MCP tools.

4 Resources

Browse labelinn://printers, labelinn://designs, labelinn://usage, labelinn://jobs/recent — read-only data the agent can pull on demand.

Local Server

Runs on your machine via npx @labelinn/mcp-server. Prompts and template data never leave your computer; only LLM calls go to your provider.

claude_desktop_config.json
{
  "mcpServers": {
    "labelinn": {
      "command": "npx",
      "args": ["-y", "@labelinn/mcp-server"],
      "env": { "LABELINN_API_KEY": "sk_live_..." }
    }
  }
}
Full MCP Guide →

Edge Server — Local LAN API

Print directly to USB and network printers over your LAN — zero cloud round-trips, works offline.

Why Edge?

  • Sub-millisecond latency — no internet required
  • Bearer token auth (optional open mode)
  • Offline queue with automatic cloud sync-back
  • USB, TCP, and Bluetooth printers

Endpoints

  • GET /local/v1/health — Server status
  • POST /local/v1/print/jobs — Submit a print job
  • GET /local/v1/jobs/{id} — Poll job status
  • GET /local/v1/fleet/printers — List printers
  • POST /local/v1/fleet/discover — Auto-discover printers
  • GET /local/v1/fleet/discover/{id} — Poll discovery
// 1. Discover the Edge Server on your LAN
const health = await fetch('http://192.168.1.100:6631/local/v1/health');
//  { status: "ok", server: "LabelInn Edge Server", mode: "hybrid", ... }

// 2. List connected printers
const printers = await fetch('http://192.168.1.100:6631/local/v1/fleet/printers', {
  headers: { 'Authorization': 'Bearer YOUR_EDGE_TOKEN' }
});
//  { printers: [{ id: "usb_zebra_01", name: "ZD420", ... }], count: 1 }

// 3. Print a label — returns instantly (HTTP 202)
const job = await fetch('http://192.168.1.100:6631/local/v1/print/jobs', {
  method: 'POST',
  headers: {
    'Authorization': 'Bearer YOUR_EDGE_TOKEN',
    'Content-Type': 'application/json'
  },
  body: JSON.stringify({
    printerId: 'usb_zebra_01',
    payloadType: 'zpl',
    payloadData: '^XA^FO50,50^ADN,36,20^FDHello Edge^FS^XZ',
    copies: 1
  })
});
//  { jobId: "abc-123", status: "accepted" }

// 4. Poll for result
const result = await fetch('http://192.168.1.100:6631/local/v1/jobs/abc-123', {
  headers: { 'Authorization': 'Bearer YOUR_EDGE_TOKEN' }
});
//  { jobId: "abc-123", success: true, printedLabels: 1 }

Auto-Discovery — Find Printers via API

Scan for printers on any device running LabelInn. USB, mDNS, network scan, and ZPL validation — all from one API call.

Cloud API (Remote)

  • Trigger scan on any online device
  • mDNS, port 9100, USB, Bluetooth
  • One-click add to fleet
  • 5-minute session TTL
POST /v1/fleet/discover
GET /v1/fleet/discover/{sessionId}
POST /v1/fleet/discover/{sessionId}/add

Edge Server (Local)

  • Sub-second local scan
  • Direct USB + network discovery
  • No cloud round-trip needed
  • Up to 3 concurrent scans
POST /local/v1/fleet/discover
GET /local/v1/fleet/discover/{sessionId}
// ── Cloud API: Discover printers on a remote device ──

// 1. Start a discovery session (target a specific device or any online device)
const session = await fetch('https://labelinn.com/v1/fleet/discover', {
  method: 'POST',
  headers: {
    'Authorization': 'Bearer sk_live_xxx',
    'Content-Type': 'application/json'
  },
  body: JSON.stringify({ device_id: 'dev_warehouse_pc' })
});
//  { data: { session_id: "abc123", status: "pending" } }

// 2. Poll until discovery is complete
const results = await fetch('https://labelinn.com/v1/fleet/discover/abc123', {
  headers: { 'Authorization': 'Bearer sk_live_xxx' }
});
//  { data: { status: "complete", printers: [
//      { name: "ZD420", address: "192.168.1.50", brand: "ZEBRA", is_thermal: true },
//      { name: "Brother QL-820", address: "USB001", connection_type: "usb" }
//    ], count: 2 } }

// 3. Add a discovered printer to your fleet
const printer = await fetch('https://labelinn.com/v1/fleet/discover/abc123/add', {
  method: 'POST',
  headers: {
    'Authorization': 'Bearer sk_live_xxx',
    'Content-Type': 'application/json'
  },
  body: JSON.stringify({ address: '192.168.1.50', name: 'Warehouse Zebra #3' })
});
//  { data: { id: "prt_a1b2c3d4e5f6", name: "Warehouse Zebra #3", status: "registered" } }

// 4. Now print to it!
await fetch('https://labelinn.com/v1/print/jobs', {
  method: 'POST',
  headers: { 'Authorization': 'Bearer sk_live_xxx', 'Content-Type': 'application/json' },
  body: JSON.stringify({
    printer_id: 'prt_a1b2c3d4e5f6',
    payload_type: 'template',
    design_id: 'tmpl_shipping',
    data: { name: 'Jane Doe', order: 'ORD-4521' }
  })
});

Data Connect

Universal enterprise data ingestion — connect any data source to label printing.

Any Format, Any Source

  • XML / SAP IDoc
  • CSV / TSV
  • JSON / NDJSON
  • Auto-detection

How It Works

  1. Push data via API or webhook
  2. Schema auto-discovered
  3. Map fields label variables
  4. Print labels in one call
// 1. Test-parse your data first (no storage, no cost)
const preview = await fetch('https://labelinn.com/v1/connect/test-parse', {
  method: 'POST',
  headers: { 'Authorization': 'Bearer sk_test_YOUR_KEY', 'Content-Type': 'application/json' },
  body: JSON.stringify({
    payload: 'name,sku,qty,price\nWidget,SKU-001,50,9.99\nGadget,SKU-002,30,14.50',
    format: 'csv'
  })
});
//  { schema: [{path:"name",type:"string"}, {path:"qty",type:"number"}, ...], records_preview: [...] }

// 2. Push real data & print labels — 2 API calls
const result = await client.connect.ingest({
  source_id: "conn_sap_orders",
  payload: xmlFromSAP,
  format: "xml",
  config: { repeatPath: "IDOC.E1EDP01" }
});

await client.connect.sources.print("conn_sap_orders", {
  printer_id: "prt_warehouse_01",
  design_id: "dsg_shipping_label",
  ingest_id: result.data.ingest_id
});

Integrations

Connect LabelInn to your existing stack — code-free.

Zapier
Available
Make.com
Available
Shopify
Live
Trendyol
Live
Hepsiburada
Live
ikas
Live
SAP / ERP
Via API

Complete Endpoint Catalogue

108 operations across 16 categories — every backend route, machine-readable via OpenAPI 3.0.3 spec v2.0.0. AI agents discover this at https://labelinn.com/.well-known/ai-plugin.json.

Print Jobs (8)

  • POST /v1/print/jobs
  • POST /v1/print/batch
  • GET  /v1/print/jobs
  • GET  /v1/print/jobs/{id}
  • POST /v1/print/jobs/{id}/cancel
  • DELETE /v1/print/jobs/{id} (cancel alias)
  • POST /v1/print/jobs/{id}/reprint
  • POST /v1/print/jobs/{id}/retry

Fleet (9)

  • GET  /v1/fleet/printers
  • GET  /v1/fleet/printers/{id}
  • GET  /v1/fleet/printers/{id}/status
  • GET  /v1/fleet/supply-alerts
  • POST /v1/fleet/printers/{id}/identify
  • PUT  /v1/fleet/printers/{id}/media
  • POST /v1/fleet/discover
  • GET  /v1/fleet/discover/{sessionId}
  • POST /v1/fleet/discover/{sessionId}/add

Printer Groups (5)

  • GET  /v1/fleet/groups
  • POST /v1/fleet/groups
  • GET  /v1/fleet/groups/{id}
  • PUT  /v1/fleet/groups/{id}
  • DEL  /v1/fleet/groups/{id}

Designs (24)

  • GET/POST /v1/designs
  • GET/PUT/DEL /v1/designs/{id}
  • POST /v1/designs/{id}/render
  • GET  /v1/designs/renders/{renderId}
  • POST /v1/designs/{id}/publish
  • GET  /v1/designs/{id}/revisions
  • GET  /v1/designs/{id}/snapshots
  • GET  /v1/designs/{id}/snapshots/{snapId}
  • GET  /v1/designs/{id}/pages
  • GET/POST /v1/designs/{id}/pages/{pageId}/elements
  • PUT/PATCH/DEL .../elements/{elementId}
  • + legacy element CRUD

Render (4)

  • POST /v1/render
  • POST /v1/render/html
  • GET  /v1/render/{renderId}
  • GET  /v1/render/{renderId}/image

Webhooks (6)

  • GET  /v1/webhooks/events
  • GET/POST /v1/webhooks
  • GET/PUT/DEL /v1/webhooks/{id}
  • POST /v1/webhooks/{id}/test
  • GET  /v1/webhooks/{id}/deliveries

Rules (6)

  • GET/POST /v1/rules
  • GET/PUT/DEL /v1/rules/{id}
  • POST /v1/rules/{id}/test

Sites (9)

  • GET/POST /v1/sites
  • GET  /v1/sites/nearest?lat&lon
  • GET/PUT/DEL /v1/sites/{id}
  • POST /v1/sites/{id}/printers
  • DEL  /v1/sites/{id}/printers/{printerId}
  • GET  /v1/sites/{id}/analytics

Analytics (5)

  • GET  /v1/analytics/fleet/trends
  • GET  /v1/analytics/predictions/{printerId}
  • GET  /v1/analytics/quality/{printerId}
  • POST /v1/analytics/digital-twin/simulate
  • POST /v1/analytics/digital-twin/compare

Audit (4)

  • GET  /v1/audit/trail
  • GET  /v1/audit/trail/{entryId}
  • GET  /v1/audit/summary
  • POST /v1/audit/ingest

Compliance (6)

  • GET/POST /v1/audit/compliance/pools
  • GET  .../pools/{poolId}
  • POST .../pools/{poolId}/allocate
  • POST .../pools/{poolId}/void
  • GET  .../pools/{poolId}/report

Data Connect (13)

  • GET  /v1/connect
  • POST /v1/connect/ingest
  • POST /v1/connect/test-parse
  • POST /v1/connect/print
  • POST /v1/connect/sources/{id}/print
  • GET  /v1/connect/sources/{id}/schema
  • + 7 source-management routes

Edge Server (6)

  • GET  /local/v1/health
  • GET  /local/v1/fleet/printers
  • POST /local/v1/print/jobs
  • GET  /local/v1/jobs/{id}
  • POST /local/v1/fleet/discover
  • GET  /local/v1/fleet/discover/{id}

Usage (2)

  • GET  /v1/usage
  • GET  /v1/usage/daily

Relay (1)

  • GET  /v1/relay/status
  • WS   wss://labelinn.com/v1/relay
View OpenAPI 3.0.3 Spec AI Plugin Manifest npm: labelinn PyPI: labelinn NuGet: LabelInn

API Pricing

API access is included with Pro and Enterprise plans.

Starter

$14.90/mo
  • No API access
  • 1 PC + 1 Mobile
  • Excel/CSV data
  • Email support

Enterprise

Custom Quote
  • Unlimited API calls
  • Unlimited PCs & Mobile
  • Unlimited integrations
  • SQL connections
  • Priority support & SLA
Talk to Sales

Start Printing in 5 Minutes

Create an account, generate an API key, send your first print job.

Create Free Account Quick Start Guide

Compatible with all your systems

REST API, OpenAPI, webhooks, files, databases and reviewed custom contracts

Trendyol
Hepsiburada
Amazon
Shopify
WooCommerce
ikas
N11
ÇiçekSepeti
Etsy
eBay
Shopier
PTT AVM
Ticimax
IdeaSoft