API-Referenz
Labelixa REST-API-Referenz: Render- und Barcode-Endpunkte, Anfrage-/Antwort-Header, Fehlercodes und Authentifizierung per API-Schlüssel.
Authentifizierung
Die kostenlose Stufe funktioniert ohne Schlüssel (IP-basiertes Limit); kein Tarif fügt der Ausgabe ein Wasserzeichen hinzu. Senden Sie den Schlüssel im Header X-API-Key; er erhöht die Limits. Der Query-Parameter ?key= funktioniert weiterhin, ist aber veraltet (Abschaltung 2027-01-31): Query-Strings gelangen in Browser-Verlauf, Referer-Header, Proxy-Logs und geteilte Links. Solche Anfragen erhalten Deprecation- und Sunset-Antwortheader.
Anonyme (schlüssellose) Anfragen werden pro IP-Adresse gezählt (IPv6: pro /64-Präfix) — alle hinter dieser Adresse teilen sich einen Topf: 5.000 Etiketten und 10.000 Anfragen pro Kalendermonat (UTC), eine Tagesobergrenze von 5.000 Etiketten, 3 Anfragen pro Sekunde, bis zu 50 Etiketten pro Anfrage. Ein kostenloses Konto (labelixa.com/panel) erhält einen API-Schlüssel mit eigenem, von der IP unabhängigem Monatskontingent und kann Etiketten speichern; kostenpflichtige Tarife heben die Limits an.
API-Stabilität
Innerhalb von /v1 kommt nur Neues hinzu: neue Antwortfelder, neue optionale Parameter und neue Endpunkte können jederzeit auftauchen — ignorieren Sie Felder, die Sie nicht kennen. Ein Breaking Change — ein entferntes oder umbenanntes Feld, ein geänderter Typ oder eine geänderte Bedeutung, ein neu definierter Fehlercode — erscheint als neue Hauptversion neben dieser. Entfällt ein Endpunkt oder ein Auth-Verfahren, erhalten Sie mindestens sechs Monate Vorlauf, Deprecation- und Sunset-Header mit dem Entfernungsdatum und danach 410 Gone samt Verweis auf den Nachfolger — nie ein stilles 404. Das ist eine vertragliche Zusage, keine Gewohnheit: AGB §24.4.1. Die Zusage gilt für die auf dieser Seite dokumentierten Endpunkte. Unter /v1 können auch nicht dokumentierte Pfade antworten; sie dienen internen Abläufen, tragen keine Stabilitätszusage und können sich ohne Ankündigung ändern — bauen Sie Ihre Integration ausschließlich auf den dokumentierten Endpunkten auf.
Schnellstart
- Senden Sie ein ZPL-Etikett an den anonymen Endpunkt — kein Schlüssel nötig, das kostenlose Kontingent reicht:bash
curl -X POST "https://api.labelixa.com/v1/printers/8dpmm/labels/4x6/0" \ -H "Content-Type: text/plain" \ --data-binary '^XA^FO50,50^A0N,40,40^FDHello^FS^XZ' \ -o label.png - Das zurückgegebene PNG ist das Etikett. Mit
Accept: application/pdferhalten Sie stattdessen ein PDF. - Mit Konto und
X-API-Key-Header gelten Kontingent und Ratenlimit Ihres Plans; Details in den Abschnitten unten.
Endpunkte
| Methode | Pfad | Beschreibung |
|---|---|---|
| POST | /v1/printers/{dpmm}dpmm/labels/{w}x{h}/{index} | Rendert das ZPL zu einem einzelnen Etikett (PNG oder PDF). |
| POST | /v1/printers/{dpmm}dpmm/labels/{w}x{h}/ | Gibt alle Etiketten in einem einzigen PDF zurück (ohne Index). |
| GET | /v1/barcodes | Erzeugt einen einzelnen Barcode (PNG/SVG/PDF). |
| GET | /v1/barcodes/catalog | Gibt den Barcode-Typkatalog (JSON) zurück. |
| POST | /v1/graphics | Wandelt ein Bild in einen ZPL-Grafikbefehl (^GF) um. Geben Sie die PHYSISCHE Größe an, die Punktrechnung übernehmen wir: X-Label-MM: 100x150 mit X-Dpmm: 8 (203 dpi) druckt genau in dieser Größe. Ohne diese Angabe wird ein Quellpixel zu einem Druckerpunkt — die Druckgröße ergibt sich dann zufällig aus der Pixelzahl. X-Wrap: label liefert einen druckfertigen Auftrag (^XA/^PW/^LL/^XZ). Jede Antwort enthält X-Print-Size-MM. Vorverarbeitung: X-Resize-Width/Height, X-Crop, X-Img-Rotate, X-Contrast, X-Dither, X-Invert, X-Threshold. X-Output: tspl liefert statt ZPL einen fertigen BINÄREN TSPL-Auftrag für TSC-Drucker (SIZE/CLS/BITMAP/PRINT; in BITMAP ist ein 0-Bit schwarz). X-Output: cpcl liefert eine CPCL-Sitzung für mobile Zebra-Drucker (!-Kopf, PAGE-WIDTH, EG-Hex-Grafik, PRINT; in EG ist ein 1-Bit schwarz). X-Snap-Grid: 1 skaliert per Nearest-Neighbour (keine grauen Kanten, Dithering aus). Die Antwort enthält X-Scale; X-Scale-Integer: false meldet ein nicht ganzzahliges Verhältnis (Barcodemodule evtl. ungleich). Sie können auch ein PDF senden: die Seite wird in Ihrer Druckerauflösung (X-Dpmm) gerastert und folgt danach demselben Weg wie ein Bild. Bei mehrseitigen PDFs wird JEDE SEITE ZU EINEM ETIKETT (siehe X-Label-Count), jeweils in eigenem ^XA/^XZ; für eine einzelne Seite X-PDF-Page: 3. Grenzen: 5 MB, 20 Seiten, 12 MP je Seite. Liegt das Etikett in einer Ecke einer Letter/A4-Versandseite, findet X-Label-Crop: 4x6 den Etikettbereich, zeichnet ihn aus dem PDF neu, richtet ihn auf und liefert genau 4x6; der Zuschnitt steht in X-Crop-Box (Zoll x,y,B,H). |
| POST | /v1/fonts | Wandelt eine TrueType-Schrift in einen ZPL-Schriftbefehl (~DU) um; Subsetting mit ?chars=. |
| POST | /v1/fonts/library | Lädt eine Schrift in den Schriftspeicher Ihres Kontos (virtueller Druckerspeicher); sie wird Renderings mit ^A@ automatisch vorangestellt. GET listet, DELETE .../{name} entfernt. Konto erforderlich. |
| POST | /v1/graphics/preview.png | Wandelt einen ^GF-Befehl zurück in ein PNG (Vorschau dessen, was zum Drucker geht). |
| POST | /v1/text/measure | Misst die Textbreite in Punkten (zum Zentrieren und für ^FB): JSON {text, font (0-9/A-Z), height, width, dpmm, block_width, label_width}. Liefert width_dots, height_dots, bei block_width lines und bei label_width center_x (das ^FO-x zum Zentrieren). Gemessen von der Vorschau-Engine selbst; der ROM-Font eines Druckers kann um einige Punkte abweichen. Nur Ratenlimit. |
| POST | /v1/diagnostics | Analysiert ZPL ohne zu rendern und liefert eine Liste von Befunden (JSON). Etikettenkontext über ?dpmm=&w=&h=. Geben Sie ein Druckermodell wie ?model=GK420d an, werden zusätzlich Kompatibilitätsbefunde zu Auflösung und Breite dieses Modells geliefert (ZPL7xxx). Das Feld-Array der Antwort nennt Zeile/Spalte jedes ^FD/^FV-Feldes — damit springen Sie aus der Vorschau in den Code. Jeder Befund trägt die Adresse seiner Regelseite (url, /zpl/rules/ZPL####). |
| POST | /v1/fields/map | Liefert die bearbeitbaren Felder (^FD/^FV) eines ZPL mit ihren Start-/End-Offsets im Quelltext; jedes Feld ist als Text oder Barcode markiert. Das ist die Datenquelle formularbasierter Editoren: durch Ersetzen im Bereich ändern Sie ein einzelnes Feld, ohne den Rest des ZPL zu berühren. |
| POST | /v1/variables/schema | Extrahiert die {{Variablen}} einer Vorlage (Typ/Pflicht/Standard). |
| POST | /v1/variables/bind | Bindet JSON-Daten sicher an eine Vorlage; 422 bei fehlenden oder ungültigen Daten. |
| POST | /v1/variables/bind-rows | Bindet bis zu 20 Zeilen ({"zpl", "satirlar": [...]}) in einer Anfrage und liefert einen ZPL-Strom — ohne Konto, ohne Speicherung, nur Ratenlimit. 422 mit Zeilenindex, wenn eine Zeile nicht gebunden werden kann; mehr als 20 Zeilen ergeben 422 satir_tavani. Für ein PDF das Ergebnis an den Render-Endpunkt ohne Index senden (zählt gegen das Kontingent). |
| POST | /v1/variables/csv | Lädt eine CSV oder XLSX hoch; das Format wird aus dem INHALT erkannt, nicht aus dem Namen. Kopfzeilen-, Kodierungs- und Trennzeichenerkennung plus Vorschau der ersten Zeile; bei Dateien bis 20 Zeilen kommen auch alle Zeilen zurück (satirlar). Mit Zugang zu Bulk-Aufträgen gilt das auch für größere Dateien, bis zum Zeilenlimit Ihres Plans pro Auftrag (satir_tavani). Alte .xls-Dateien und kennwortgeschützte Arbeitsmappen werden mit 400 abgelehnt — vorher als .xlsx oder CSV speichern. |
| POST | /v1/bulk/jobs | Startet einen Massenauftrag (1 Vorgang je Zeile; Pro-, Business- und Enterprise-Tarif). GET /v1/bulk/jobs listet eigene Aufträge; GET .../{id} Status, .../{id}/download ZIP, .../{id}/download?bicim=pdf eine einzelne zusammengefasste mehrseitige PDF, .../{id}/cancel bricht ab. Ohne den Parameter bleibt die Antwort unverandert (ZIP). Ist ein Auftrag fur eine PDF zu gross, kommt 413 mit der ungefahren Zahl der passenden Etiketten. |
| POST | /v1/designs/zpl | Wandelt ein Design-JSON in ZPL um. Zustandslos und NICHT gespeichert: Das Design wird weder auf die Festplatte geschrieben noch protokolliert und verbraucht kein Kontingent (ein Designer muss bei jeder Änderung eine Vorschau anfordern können). Die Prüfung läuft erneut auf dem Server; ein ungültiges Design liefert ALLE Fehler in einer Antwort (400). |
| POST | /v1/webhooks | Registriert einen ausgehenden Webhook-Endpunkt (Pro-, Business- und Enterprise-Tarif). Das Signaturgeheimnis wird NUR in dieser Antwort zurückgegeben. GET listet, DELETE .../{id} entfernt. |
| GET | /v1/plans | Listet die Tarifstufen und ihre Grenzen auf. |
| POST | /v1/accounts | Erstellt ein Konto und generiert einen API-Schlüssel. Die E-Mail-Adresse wird hier nicht bestätigt: Meldet sich der Inhaber der Adresse zum ersten Mal im Panel an (Magic Link oder Google), werden die vorher erstellten Schlüssel widerrufen; in diesem Zeitraum eingerichtete Webhook-Endpunkte und Konnektoren werden deaktiviert, Agent-Kopplungen aufgehoben und weitere Mitglieder des Arbeitsbereichs entfernt (die deaktivierten Einträge bleiben zur Prüfung erhalten; das Panel zeigt sie einmalig an). Ein neuer Schlüssel wird im Panel erzeugt. |
| GET | /v1/usage | Die Nutzung des API-Schlüssels der letzten 7 Tage. Erfordert einen Schlüssel: ohne Schlüssel wird 401 zurückgegeben. Ein unbekannter Schlüssel wird an jedem Endpunkt mit 401 abgewiesen (Body {"hata": ..., "kod": "gecersiz_anahtar"}); Anfragen ohne Schlüssel laufen anonym. |
| GET | /v1/keys | Listet Ihre zusätzlichen API-Schlüssel (Business: 3 Schlüssel; alle zählen auf dasselbe Kontingent). POST erstellt einen — der vollständige Wert wird NUR in dieser Antwort zurückgegeben; DELETE .../{id} widerruft. Verwaltung nur mit dem Primärschlüssel. Wird der Primärschlüssel im Panel neu erzeugt, werden auch alle zusätzlichen Schlüssel widerrufen. |
Anfrage-Header
| Header | Zweck | Werte |
|---|---|---|
X-API-Key | API-Schlüssel (auch key= im Query — veraltet) | lbx_... |
Idempotency-Key | Ein erneuter Versuch erzeugt keinen zweiten Auftrag; die gespeicherte Antwort wird wiederholt (nur /v1/bulk/jobs) | beliebiger eindeutiger Wert |
Accept | Ausgabeformat | image/png (Standard), application/pdf, application/json, application/zpl, application/epl |
X-Target-Dpmm | Zielauflösung bei der ZPL-Umwandlung | 6, 8, 12, 24 |
X-Formatter | ZPL-Formatierung (application/zpl) | On, Off |
X-Page-Size | PDF-Seitengröße | A4, A5, A6, Letter, Legal |
X-Page-Layout | Raster pro Seite | z. B. 2x3 |
X-Quality | PNG-Qualität | Grayscale, Bitonal |
X-Rotation | Dreht das Etikett | 0, 90, 180, 270 |
Antwort-Header
| Header | Bedeutung |
|---|---|
X-Total-Count | Gesamtzahl der erzeugten Etiketten. |
X-Warnings | Übersprungene/nicht unterstützte Befehle. Bei EPL-Ausgabe steht zusätzlich vorn, was der Auftrag in den Drucker selbst schreibt: die Etikettenbreite (bleibt nach dem Auftrag bestehen) und die Formularlänge (verschiebt sich, wenn sie nicht zu Ihrem Medium passt). Vor dem Druck lesen. |
X-Plan | Der Tarif, unter dem die Anfrage erkannt wurde. |
X-RateLimit-Remaining | Heute unter der täglichen Etikettenobergrenze verbleibende Etiketten — Etiketten, keine Anfragen, und nicht Ihr Monatskontingent. Die Obergrenze zählt Etiketten (ein gerendertes Etikett = eine Einheit); ein einzelner Aufruf mit 50 Etiketten senkt den Wert um 50; Zurücksetzung um 00:00 UTC. Die monatlichen Etiketten- und Anfragezähler werden in einer 200-Antwort nicht gemeldet: Ist einer voll, trägt die 429 X-Quota-Reason und X-Quota-Reset; Konten mit Schlüssel lesen sie aus /v1/usage. Das separate Anfragelimit pro Sekunde wird hier nicht gemeldet. |
X-Quota-Hint | Nur bei anonymen (schlüssellosen) 200-Antworten, sobald 150 Etiketten der heutigen anonymen Tagesobergrenze verbraucht sind (150 von 5.000, laut X-RateLimit-Remaining). Anonyme Nutzung wird pro IP gezählt und ist innerhalb dieser Tagesobergrenze auf 5.000 Etiketten und 10.000 Anfragen pro Kalendermonat (UTC) begrenzt; der Header trägt die Adresse, unter der ein kostenloser API-Schlüssel ausgestellt wird (eigenes Monatskontingent, gespeicherte Etiketten). Bei Anfragen mit Schlüssel nicht vorhanden; die Antwort selbst bleibt unverändert. |
Fehlercodes
| Code | Bedeutung |
|---|---|
| 400 | Ungültiger Parameter (dpmm, Größe usw.). |
| 413 | Anfragekörper über dem Limit des Endpunkts (ZPL-Rendering 1 MB; EPL/TSPL/CPCL-, DPI- und Kompatibilitäts-Endpunkte 512 KB), Etikettenzahl über dem Tariflimit oder ein einzelnes Etikett über 20.000 Befehlen. |
| 429 | Raten-/Kontingentlimit überschritten; ein Retry-After-Header wird zurückgegeben. |
In der Barcode-API werden ungültige Daten zusammen mit HTTP 200 als Bild zurückgegeben (Kompatibilität mit No-Code-Tools), und das Detail steht im Header X-Warnings.
Fehler und ihre Behebung
Jeder Fehler ist ein HTTP-Statuscode plus ein Body. Lesen Sie zuerst den Status, dann den Body: Render-Endpunkte antworten mit EINER ZEILE KLARTEXT, alle anderen mit JSON, dessen Meldung in hata steht (Englisch). Manche JSON-Bodies tragen zusätzlich einen stabilen maschinenlesbaren Namen — kod (snake_case) oder hata_tipi (PascalCase) — und diese Namen sind Wire-Werte: verzweigen Sie darauf, nie auf den Satz. Der Abschnitt Feldnamen in Antworten erklärt, warum die Schlüsselnamen türkisch sind. Die Tabelle unten listet die Fehler, auf die Integratoren tatsächlich treffen, wann jeder auftritt und was ihn behebt.
401 / 403 — Schlüssel, Herkunft, Tarif, Scope, Business Central
| HTTP | kod / hata_tipi | Wann er auftritt | Behebung | Beispiel |
|---|---|---|---|---|
| 401 | gecersiz_anahtar | Ein X-API-Key (oder ?key=) wurde gesendet und kein Konto besitzt diesen Schlüssel — Tippfehler, ein im Panel widerrufener Schlüssel oder ein Schlüssel einer anderen Installation (selbst gehostet vs. Cloud). | Den Schlüssel erneut aus dem Panel kopieren; neu erzeugen, wenn er widerrufen wurde. Eine Anfrage OHNE Schlüssel läuft anonym, eine leere Variable erzeugt diesen Fehler also nie — eine falsche schon. | Header: WWW-Authenticate: ApiKey realm="labelixa" |
| 401 | — | Ein Endpunkt nur für Konten (GET /v1/usage, GET /v1/keys, POST /v1/webhooks) wurde ohne Schlüssel aufgerufen. | Den Header X-API-Key ergänzen. Ein kostenloses Konto genügt. | |
| 403 | origin_kapisi | Die Anfrage erreichte die Anwendung, ohne den öffentlichen Eingang zu passieren — etwa über den internen Hostnamen des Hosting-Anbieters. | https://api.labelixa.com als Basis-URL verwenden. Kein Header behebt das, mit Absicht. | |
| 403 | — | Die in der Meldung genannte Funktion (Webhooks, Massenaufträge, Drucken, gespeicherte Etiketten über der freien Grenze) ist im Tarif des Schlüssels nicht enthalten. X-Quota-Action wird mitgesendet. | Unter der Adresse in X-Quota-Upgrade-Url upgraden oder mit GET /v1/plans prüfen, welcher Tarif die Funktion enthält. Nicht wiederholen: Die Antwort ändert sich nicht mit der Zeit. | Header: X-Quota-Action: upgrade |
| 403 | kapsam_yok | Der Schlüssel ist eingeschränkt (mit begrenzten Scopes erzeugt) und dieser Endpunkt braucht einen Scope, den er nicht hat; gereken_kapsam nennt den fehlenden. | Im Panel einen Schlüssel mit diesem Scope erzeugen oder den Primärschlüssel verwenden. Der Scope-Name ist Vertrag, kein Geheimnis. | |
| 403 | birincil_gerekli | Abrechnung oder Schlüsselverwaltung wurde mit einem zusätzlichen (sekundären) Schlüssel aufgerufen. | Dafür den Primärschlüssel des Kontos oder das Panel verwenden; zusätzliche Schlüssel sind für den Produktionsverkehr. | |
| 403 | rol_yetkisiz | Der Schlüssel gehört einem Arbeitsbereichsmitglied, dessen Rolle die Aktion nicht erlaubt (gereken_kapsam nennt sie): Ein Betrachter wollte ein Etikett schreiben. | Den Eigentümer des Arbeitsbereichs um eine höhere Rolle bitten oder den Schlüssel eines Mitglieds mit dieser Rolle verwenden. | |
| 403 | hesap_gerekli | Endpunkte für gespeicherte Etiketten wurden anonym aufgerufen. Render-Endpunkte funktionieren ohne Schlüssel, Speichern nicht. X-Quota-Action: signup wird mitgesendet. | Mit POST /v1/accounts ein kostenloses Konto anlegen (keine Karte) und dessen Schlüssel senden. | Header: X-Quota-Action: signup |
| 401 | EntraJetonuGecersiz | Die Business-Central-Erweiterung hat sich mit einem Microsoft-Entra-Token authentifiziert, dessen Prüfung scheiterte (Signatur, Audience, Ablauf). | Erneut in Business Central anmelden, damit die Erweiterung ein frisches Token erhält; prüfen, dass die App-Registrierung auf die Audience der Labelixa-API zeigt. | |
| 404 | EntraEslemesiYok | Der Entra-Mandant ist gültig, aber noch kein Labelixa-Konto ist mit ihm verknüpft. | In der Erweiterung einmal Connect Account mit einem API-Schlüssel ausführen; danach genügt die Entra-Anmeldung. | |
| 409 | EntraBelirsiz | Mehr als ein Labelixa-Konto beansprucht denselben Entra-Mandanten, der Server kann nicht wählen. | Mit dem API-Schlüssel des Kontos verbinden, dem der Mandant gehören soll; die veraltete Zuordnung im anderen Konto entfernen. | |
| 409 | KiraciBaskasinin | Das Tripel Mandant / Umgebung / Unternehmen ist bereits einem anderen Labelixa-Konto zugeordnet. | Die Zuordnung im besitzenden Konto löschen (DELETE /v1/bc/tenants/{id}) oder eine andere Umgebung zuordnen. Dasselbe Konto, das dasselbe Tripel erneut zuordnet, erhält 200, keinen Fehler. | |
400 / 404 / 413 / 422 — Parameter, Größe, Validierung
| HTTP | kod / hata_tipi | Wann er auftritt | Behebung | Beispiel |
|---|---|---|---|---|
| 400 | — | Ein Pfad- oder Query-Parameter liegt außerhalb der zulässigen Menge: dpmm muss 6 | 8 | 12 | 24 sein, ein Barcodetyp ist unbekannt, eine Seitengröße nicht in der Liste. | 6 dpmm (152 dpi), 8 (203 dpi), 12 (300 dpi) oder 24 (600 dpi) verwenden. Die Meldung nennt immer die zulässigen Werte. | |
| 400 | — | Breite oder Höhe des Etiketts im Pfad ist null, keine Zahl oder über 15 Zoll. Der Pfad ist in ZOLL: /labels/4x6/0 ist 4 x 6 in, ein Etikett von 100 x 150 mm also /labels/3.94x5.91/0. | Millimeter vor dem Aufbau des Pfads in Zoll umrechnen (durch 25,4 teilen); Dezimalstellen sind erlaubt. | |
| 404 | — | Unbekannter Pfad, eine Ressourcen-ID eines anderen Kontos oder eine auf dieser Installation abgeschaltete Funktion (abgeschaltete Funktionen antworten 404, nicht 403). | Den Pfad mit der Endpunkttabelle oben abgleichen; eine fehlende ID wird nicht wiederholt. Undokumentierte Pfade tragen keine Stabilitätszusage. | |
| 413 | — | Der Body liegt über dem Limit des Endpunkts: 1 MB für ZPL-Rendering und Diagnose, 512 KB für EPL/TSPL/CPCL, DPI und Kompatibilität, 5 MB für Bilder und PDFs. | Den Datenstrom in mehrere Etiketten aufteilen, eingebettete Grafiken (^GF) entfernen und stattdessen als Schriften oder Grafiken hochladen, oder Bilder vor der Umwandlung komprimieren. | |
| 413 | — | Ein Etikett enthält mehr als 20.000 Befehle — meist ein Generator, der eine Grafik als Tausende ^GB-Kästen schreibt. | Die Grafik mit POST /v1/graphics in ein einzelnes ^GF umwandeln oder den Datenstrom in mehrere Etiketten aufteilen. | |
| 413 | — | Der Datenstrom enthält mehr Etiketten, als der Tarif pro Anfrage erlaubt (Free und Starter 50, Pro 100, Business 250). | Die Etiketten in mehreren Anfragen senden oder ab Pro einen Massenauftrag nutzen; die Kontingentkosten sind gleich. | |
| 422 | — | Ein JSON-Body ließ sich nicht parsen oder passte nicht zum Schema (falscher Typ, fehlendes Pflichtfeld). Der Body stammt vom Framework und hat eine ANDERE Form: eine detail-Liste mit loc und msg pro Problem. | Das in loc genannte Feld korrigieren. detail als einzigen Schlüssel behandeln; hata fehlt in diesem einen Fall. | |
| 422 | satir_tavani | POST /v1/variables/bind-rows erhielt mehr als 20 Zeilen; der Body trägt tavan und satir_sayisi. | Höchstens 20 Zeilen pro Anfrage senden oder ab Pro einen Massenauftrag (POST /v1/bulk/jobs) starten. | |
| 409 | eposta_kullanimda | POST /v1/accounts wurde mit einer E-Mail-Adresse aufgerufen, die bereits ein Konto hat. | Mit dieser Adresse im Panel anmelden und den vorhandenen Schlüssel lesen; ein zweites Konto wird nicht angelegt. | |
402 / 429 — Ratenlimit vs. Tages- und Monatskontingent
| HTTP | kod / hata_tipi | Wann er auftritt | Behebung | Beispiel |
|---|---|---|---|---|
| 429 | — | Mehr Anfragen pro Sekunde, als der Tarif erlaubt (Free 3/s, Starter 5/s, Pro 10/s, Business 20/s). Nur Retry-After: 1 wird gesendet — kein X-Quota-Reason-Header. | Die Sekunde abwarten und wiederholen; eine clientseitige Warteschlange, die Anfragen verteilt, vermeidet es ganz. Free-Antworten nennen den nächsten Tarif in X-Quota-Next-Plan. | Header: Retry-After: 1X-Quota-Next-Plan: starterX-Quota-Upgrade-Url: https://labelixa.com/pricing?amac=kota |
| 429 | — | Das heutige Etikettenkontingent deckt diese Anfrage nicht (X-Quota-Reason ist gunluk). Das Kontingent zählt ETIKETTEN, ein Aufruf mit 50 Etiketten verbraucht also 50. X-RateLimit-Remaining trägt die noch verbleibenden Etiketten. | Upgraden (X-Quota-Action ist yukselt; Tarif und Adresse in X-Quota-Next-Plan und X-Quota-Upgrade-Url) oder bis X-Quota-Reset warten (00:00 UTC). Ein früherer Versuch liefert dasselbe 429. | Header: Retry-After: 3600X-Quota-Action: yukseltX-Quota-Reason: gunlukX-Quota-Reset: 2026-10-28T00:00:00ZX-RateLimit-Remaining: 3X-Quota-Next-Plan: starterX-Quota-Upgrade-Url: https://labelixa.com/pricing?amac=kota |
| 429 | — | Das monatliche Etiketten- oder Anfragefenster ist aufgebraucht (X-Quota-Reason ist aylik_etiket oder aylik_istek). Es gilt ZUSAMMEN mit dem Tagesfenster, verankert am Tag des Abonnements. | Upgraden oder auf den Erneuerungszeitpunkt in X-Quota-Reset warten. X-RateLimit-Remaining wird hier NICHT gesendet, weil der Tagesrest an diesem Punkt unbekannt ist. | Header: Retry-After: 3600X-Quota-Action: yukseltX-Quota-Reason: aylik_etiketX-Quota-Reset: 2026-11-17T00:00:00Z |
| 429 | hiz_siniri | Zu viele POST /v1/accounts-Aufrufe von einer Adresse im Zeitfenster. | Das Konto einmal anlegen und seinen Schlüssel behalten; Retry-After abwarten, bevor Sie es erneut versuchen. | Header: Retry-After: 3600 |
| 403 | — | Das Konto hält so viele gespeicherte Etiketten, wie der Tarif erlaubt (Free 5, Starter 50, Pro 500, Business 2.500). Unabhängig vom täglichen Render-Kontingent. | Nicht mehr benötigte Etiketten löschen oder archivieren, oder upgraden (X-Quota-Action ist upgrade). | Header: X-Quota-Action: upgrade |
| 402 | DenemeDoldu | Die kostenlose DirectPrint-Probe (25 Etiketten) ist aufgebraucht und der Tarif enthält kein Drucken. | Auf Starter oder höher upgraden; der Auftrag wurde nicht eingereiht und muss danach erneut gesendet werden. | Header: X-Quota-Action: upgrade |
| 402 | TavanDoldu | Der Business-Central-Mandant hat seine monatliche Druckobergrenze erreicht. | Tarif erhöhen oder auf den nächsten Monat warten; der Zähler steigt nur bei 202, ein abgelehnter Auftrag kostet nichts. | Header: X-Quota-Action: upgrade |
Zwei verschiedene Grenzen teilen sich den Status 429; die Header unterscheiden sie. Das Ratenlimit pro Sekunde antwortet mit Retry-After: 1 und OHNE X-Quota-Reason-Header: eine Sekunde warten und erneut senden. Das Tages- oder Monatskontingent antwortet mit Retry-After: 3600, X-Quota-Action und X-Quota-Reason (gunluk, aylik_etiket oder aylik_istek); X-Quota-Reset nennt den exakten UTC-Zeitpunkt der Erneuerung, und ein Versuch davor ist sinnlos — Tarif erhöhen (der nächste Tarif und seine Adresse stehen maschinenlesbar in X-Quota-Next-Plan und X-Quota-Upgrade-Url) oder auf die Erneuerung warten. Anonyme 200-Antworten ergänzen X-Quota-Hint, sobald 150 der 5.000 freien Etiketten verbraucht sind: Ein kostenloser Schlüssel gibt Ihnen ein eigenes Kontingent.
409 / 412 / 428 — Nebenläufigkeit und Wiederholungen
| HTTP | kod / hata_tipi | Wann er auftritt | Behebung | Beispiel |
|---|---|---|---|---|
| 428 | — | Ein gespeichertes Etikett wurde (PATCH /v1/labels/{id}) ohne den Header If-Match geschrieben. Der Body trägt die aktuelle Version und das ETag. | Das Etikett zuerst lesen und sein ETag als If-Match senden; If-Match: * senden, um bewusst zu überschreiben. | |
| 412 | — | Der Wert von If-Match ist älter als die gespeicherte Version: Jemand anderes hat zwischenzeitlich gespeichert. | Das Etikett erneut lesen, zusammenführen und mit dem neuen ETag erneut schreiben. Aus Automatisierung nie blind mit If-Match: * wiederholen. | |
| 422 | — | Derselbe Idempotency-Key wurde mit einem ANDEREN Body wiederverwendet. | Ein Idempotenzschlüssel bezeichnet eine Anfrage: Für einen neuen Body einen neuen Schlüssel erzeugen. | |
| 409 | — | Eine Wiederholung kam an, während die erste Anfrage mit demselben Idempotency-Key noch läuft. | Retry-After abwarten und die identische Anfrage erneut senden; die gespeicherte Antwort wird wiedergegeben. | Header: Retry-After: 2 |
5xx — Render-Budget und Dienst
| HTTP | kod / hata_tipi | Wann er auftritt | Behebung | Beispiel |
|---|---|---|---|---|
| 503 | — | Das Etikett ist gültig, aber zu teuer, um es innerhalb des Render-Budgets zu zeichnen (riesige Bitmaps, Tausende Felder). Das Kontingent für das nicht erzeugte Etikett wird erstattet. | Das Etikett vereinfachen (kleineres ^GF, weniger Felder), dpmm senken oder den Datenstrom aufteilen. Retry-After ist 1 s, aber dieselbe Eingabe trifft das Budget erneut. | Header: Retry-After: 1 |
| 503 | — | Eine Abhängigkeit ist nicht verfügbar (Datenbank, Schlüssel-Hashing, E-Mail). Klartext auf Render-Endpunkten, hata-JSON sonst. | Mit exponentiellem Backoff wiederholen (mit einigen Sekunden beginnen). Hält es Minuten an: /status prüfen. | |
| 500 | — | Eine unbehandelte Ausnahme. Der Body trägt nie Details; der Header X-Request-ID identifiziert die Anfrage in unseren Logs. | Einmal wiederholen; tritt es erneut auf, X-Request-ID an den Support senden — der schnellste Weg zur Ursache. | Header: X-Request-ID: 1da4dafa121247ab8dd6e413d2aeef33 |
Fehlertypen von Druckaufträgen
Ein fehlgeschlagener Druckauftrag lässt die HTTP-Anfrage nicht fehlschlagen — POST /v1/print hat mit 202 geantwortet, das Ergebnis steht im Auftragsstatus. Das Feld hata_tipi eines fehlgeschlagenen Auftrags ist eine dieser Klassen; asama sagt, wie weit der Auftrag vor dem Fehler kam.
| kod / hata_tipi | Bedeutung |
|---|---|
AdaptorYok | Verbindungstyp nicht unterstützt (nichts gesendet) |
AgentHatasi | Agentenfehler |
CihazEslenmemis | Drucker im Agenten nicht zugeordnet (nichts gesendet) |
GonderilmedenBirakildi | Der Agent wurde vor dem Senden beendet (nichts wurde gesendet) |
KimlikAlinamadi | Druckeridentität konnte nicht gelesen werden (nichts gesendet) |
KimlikUyusmazligi | Druckeridentität stimmte nicht überein (nichts gesendet) |
TeslimBelirsiz | Zustellung ungewiss — vor einem erneuten Druck den Drucker prüfen |
YaziciHatasi | Druckerfehler (möglicherweise teilweise gedruckt) |
ZplBulunamadi | Etiketteninhalt war nicht mehr verfügbar (nichts gesendet) |
Feldnamen in Antworten
JSON-Antworten verwenden stabile Schlüsselnamen. Die meisten sind türkische Wörter (zum Beispiel ozet, mesaj, durum) und bleiben genau so: Ein umbenannter Schlüssel wäre eine inkompatible Änderung, die die oben beschriebene API-Stabilitätszusage innerhalb von /v1 ausschließt. Die offiziellen Integrationen — der MCP-Server und der n8n-Knoten — übersetzen die Schlüssel und zeigen englische Namen. Die folgende Tabelle wird aus derselben Zuordnung erzeugt, die sie verwenden; rohe Antworten und Integrationsausgabe lassen sich so nebeneinander lesen. Ein nicht aufgeführter Schlüssel behält auch in den Integrationen seinen JSON-Namen. Fehlerantworten tragen die lesbare Meldung auf Englisch in hata. Wann jeder Fehler auftritt und wie er behoben wird: Fehler und ihre Behebung.
| JSON-Schlüssel | Englischer Name |
|---|---|
mesaj | message |
ozet | summary |
toplam | total |
alanlar | fields |
onizleme | preview |
baslik | title |
baslik_key | title_key |
yeni | replacement |
islem | operation |
bicim | format |
banka | bank |
veri | data |
komut | command |
oneri | suggestion |
parametre | parameter |
deger | value |
hane | digits |
verilen | given |
dogru | correct |
beklenen | expected |
gelen | actual |
uzunluk | length |
yol | path |
genislik | label_width |
yukseklik | label_height |
bitis | end |
gen | print_width |
azami | maximum |
desteklenen | supported_dpi |
tip | type |
dil | language |
guven | confidence |
karma | mixed |
puanlar | scores |
kanitlar | evidence |
kod | code |
satir | line |
uretici | manufacturer |
kategori | category |
dil_postur | language_support |
tur | type |
kaynak_url | source_url |
dogrulama | verification |
cihaz_seri | device_serial |
not | note |
seviye | level |
gerekceler | reasons |
boyut_kurali_var | has_size_rule |
boyut_bulgulari | size_findings |
onizleme_kapsami | preview_coverage |
destekli | supported |
kismi | partial |
desteksiz | unsupported |
yok_sayilan | ignored |
bilinmiyor | unknown |
sinir | limitation |
puan | score |
puan_formulu | score_formula |
degerlendirilen | assessed |
degerlendirilmeyen | not_assessed |
bolumler | sections |
notlar | notes |
durum | status |
bulgular | findings |
uyarilar | warnings |
sebep | reason |
sozdizimi | syntax |
boyut_dpi | size_dpi |
yon | orientation |
barkod | barcode |
gorsel_bellek | graphics_memory |
is_davranisi | job_behaviour |
model_uyum | model_compatibility |
komut_adedi | command_count |
etiket_adedi | label_count |
dondurulmus_alan | rotated_fields |
adet | count |
komutlar | commands |
indirilen_font_adedi | downloaded_font_count |
indirilen_font_bayt | downloaded_font_bytes |
ozel_font_cagrisi | custom_font_calls |
grafik_bayt | graphic_bytes |
grafik_adet | graphic_count |
font_bayt | font_bytes |
font_adet | font_count |
toplam_bayt | total_bytes |
tavan_bayt | limit_bytes |
en_dots | width_dots |
boy_dots | height_dots |
boyut_kaynagi | size_source |
adaylar | candidates |
en_inch | width_in |
boy_inch | height_in |
en_mm | width_mm |
boy_mm | height_mm |
standart | standard |
tahmini_dpi | estimated_dpi |
tahmin_sebebi | estimate_reason |
kopya | copies |
format_adedi | format_count |
sablon_adedi | template_count |
toplam_baski | total_prints |
tasma_olculen_format | overflow_measured_formats |
render_siniri | render_limit |
etiketler | labels |
sira | index |
alan_adedi | field_count |
barkod_adedi | barcode_count |
sablon | template |
tasan_alan | overflowing_fields |
modeller | models |
is_id | job_id |
satir_sayisi | row_count |
sonuc | result |
deneme | attempts |
uretilen | produced |
hatali_sayisi | failed_count |
hatali | failed |
sorunlar | problems |
ad | name |
cikti | output |
olcu | size |
genislik_in | width_in |
yukseklik_in | height_in |
kota_iade | quota_refunded |
islenen | processed |
isler | jobs |
hata_tipi | error_type |
baski | print |
gonderildi | sent |
ucretlendi | charged |
basim_onaylandi | print_confirmed |
etiket | label_count |
olculdu | measured |
okunan | decoded |
neden | reason |
Feste Werte
Manche Felder enthalten ein Wort aus einer festen Menge. Der JSON-Wert bleibt unverändert; die Integrationen zeigen das englische Wort. Pfade verwenden die englischen Feldnamen aus der Tabelle oben; [] steht für ein Array-Element, * für einen beliebigen Schlüssel.
| Feld (englischer Pfad) | JSON-Wert | Englischer Wert |
|---|---|---|
risk.level | dusuk | low |
orta | medium | |
yuksek | high | |
risk.reasons[] | native | native |
emulasyon | emulation | |
dil_yok | no_zpl_support | |
boyut_bulgusu | size_finding | |
model.category | masaustu | desktop |
endustriyel | industrial | |
mobil | mobile | |
language_support.type | native | native |
emulasyon | emulation | |
limitation | risk_analizi | risk_analysis |
evidence[].code | zpl_xa | zpl_xa |
zpl_xz | zpl_xz | |
zpl_komut_yogunlugu | zpl_command_density | |
zpl_tilde | zpl_tilde | |
epl_metin_satiri | epl_text_line | |
epl_barkod_satiri | epl_barcode_line | |
epl_kontrol_satiri | epl_control_line | |
tspl_mm_boyut | tspl_mm_size | |
tspl_kelime | tspl_keyword | |
cpcl_baslik | cpcl_header | |
cpcl_kelime | cpcl_keyword | |
sections.*.status | temiz | clean |
bulgulu | findings | |
degerlendirilmedi | not_evaluated | |
assessed[] | sozdizimi | syntax |
boyut_dpi | size_dpi | |
yon | orientation | |
barkod | barcode | |
font | font | |
gorsel_bellek | graphics_memory | |
is_davranisi | job_behaviour | |
model_uyum | model_compatibility | |
not_assessed[] | sozdizimi | syntax |
boyut_dpi | size_dpi | |
yon | orientation | |
barkod | barcode | |
font | font | |
gorsel_bellek | graphics_memory | |
is_davranisi | job_behaviour | |
model_uyum | model_compatibility | |
sections.size_dpi.summary.size_source | komut | command |
alanlardan | from_fields | |
karma | mixed | |
onceki | previous | |
sections.job_behaviour.summary.labels[].size_source | komut | command |
alanlardan | from_fields | |
karma | mixed | |
onceki | previous | |
status | bekliyor | queued |
calisiyor | running | |
bitti | done | |
hata | failed | |
iptal | cancelled | |
jobs[].status | bekliyor | queued |
calisiyor | running | |
bitti | done | |
hata | failed | |
iptal | cancelled | |
jobs[].type | toplu_uretim | bulk_production |
result.failed[].problems[].code | eksik | missing |
sayi_degil | not_a_number | |
sozdizimi | syntax | |
temizlendi | sanitized | |
render | render |
Status von Massenaufträgen
Das Feld durum eines Massenauftrags ist einer von:
| JSON-Wert | Bedeutung |
|---|---|
bekliyor | In der Warteschlange: wartet auf einen Worker. Ein fehlgeschlagener Versuch, der wiederholt wird, kehrt ebenfalls hierher zurück. |
calisiyor | Läuft. |
bitti | Fertig: die Ausgabe kann heruntergeladen werden. Zeilen, die nicht erzeugt werden konnten, stehen im Ergebnisobjekt. |
hata | Fehlgeschlagen: der letzte erlaubte Versuch ist gescheitert oder der Fehler ist nicht wiederholbar. Es folgen keine weiteren Versuche. |
iptal | Abgebrochen. Nur ein noch nicht gestarteter Auftrag kann abgebrochen werden. |
Kompatibilitätsstufen
Die Kompatibilitätsprüfung liefert in risk.seviye eine Risikostufe, nie eine Garantie:
| JSON-Wert | Bedeutung |
|---|---|
dusuk | Niedrig: das Modell verarbeitet ZPL nativ. |
orta | Mittel: das Modell verarbeitet ZPL über einen vom Hersteller dokumentierten Emulationsmodus. |
yuksek | Hoch: für das Modell ist keine ZPL-Unterstützung erfasst. |
onizleme_kapsami gruppiert die Befehle des Etiketts danach, was UNSERE Vorschau mit ihnen macht. Es beschreibt die Vorschau, nicht den Drucker:
| JSON-Schlüssel | Bedeutung |
|---|---|
destekli | Unterstützt: wird gezeichnet, keine bekannten Parametergrenzen. |
kismi | Teilweise: wird gezeichnet, mit einer dokumentierten Einschränkung. |
yok_sayilan | Ignoriert: erkannt und gemeldet, aber nicht gezeichnet (zum Beispiel RFID, das nur der Drucker schreibt). |
desteksiz | Nicht unterstützt: bekannter Befehl, wird nicht verarbeitet; die Diagnose warnt davor. |
bilinmiyor | Unbekannt: nicht im Befehlskatalog. |
Datenextraktion (JSON)
Wenn Sie Accept: application/json an den Render-Endpunkt senden, werden die sichtbaren Text- und Barcode-Felder des Etiketts zusammen mit ihren Koordinaten als JSON zurückgegeben (Barcodes werden mit tur: barkod gekennzeichnet):
curl -X POST "https://api.labelixa.com/v1/printers/8dpmm/labels/4x6/0" \
--data "^XA^FO50,60^FDHello^FS^XZ" -H "Accept: application/json"ZPL-Umwandlung (application/zpl)
Mit Accept: application/zpl wird Ihr ZPL neu formatiert (jeder Befehl in einer eigenen Zeile; mit X-Formatter: Off deaktiviert), und wenn X-Target-Dpmm angegeben ist, werden die Koordinaten-/Größenparameter von der Quell- zur Zielauflösung skaliert. Datenfelder (^FD) ändern sich nicht.
curl -X POST "https://api.labelixa.com/v1/printers/8dpmm/labels/4x6/0" \
--data-binary @label.zpl -H "Accept: application/zpl" \
-H "X-Target-Dpmm: 12" > label-12dpmm.zplEPL2-Ausgabe (application/epl)
Mit Accept: application/epl wird Ihr Etikett in EPL2 umgewandelt — die Sprache älterer Zebra-Drucker. Text-, Barcode-, Kasten- und Linienfelder werden zu EPL2-Befehlen; Größen werden aus der Punktdichte des Druckers berechnet (8dpmm = 203 dpi, 12dpmm = 300 dpi — die EPL2-Schriftmaße UNTERSCHEIDEN sich zwischen beiden, die richtige Tabelle wird automatisch gewählt). Unterstützte Barcodes: ^BC Code 128, ^B3 Code 39, ^BE EAN-13, ^B8 EAN-8, ^BU UPC-A, ^B2 Interleaved 2/5, ^BK Codabar.
EPL2 hat einen kleineren Befehlssatz als ZPL, daher lässt sich nicht jedes Etikett eins zu eins umwandeln. Nichts entfällt stillschweigend: was nicht übersetzt werden konnte, wird im X-Warnings-Header benannt. Derzeit nicht umgewandelt: QR (^BQ), DataMatrix (^BX), eingebettete Grafiken (^GF) und Textblöcke (^FB). Zudem ist die EPL2-Textgröße nicht stufenlos — feste Schrift x ganzzahliger Multiplikator — und die schmale Balkenbreite ist je Symbologie begrenzt (1-10 bei Code 128, 2-4 bei EAN/UPC); ein Wert außerhalb wird gekappt und ebenfalls gemeldet.
curl -X POST "https://api.labelixa.com/v1/printers/8dpmm/labels/4x6/" \
--data-binary @label.zpl -H "Accept: application/epl" \
-D headers.txt > label.eplAusgehende Webhooks
Statt den Status eines Massenauftrags abzufragen, können wir Sie benachrichtigen. Registrieren Sie einen Endpunkt mit POST /v1/webhooks; die Ereignisse sind toplu.tamamlandi und toplu.basarisiz.
curl -X POST "https://api.labelixa.com/v1/webhooks" \
-H "X-API-Key: $LABELIXA_KEY" -H "Content-Type: application/json" \
-d '{"url": "https://erp.example.com/labelixa"}'Das Signaturgeheimnis wird NUR in dieser Antwort zurückgegeben und in Auflistungen nie wieder gezeigt; geht es verloren, löschen Sie den Endpunkt und legen ihn neu an. Das Geheimnis ist vom API-Schlüssel des Kontos getrennt: Ein Schlüsselwechsel bricht die Webhook-Prüfung nicht.
Jede Anfrage trägt Labelixa-Signature: t=<unix>,v1=<hmac>. Der HMAC-SHA256 wird über "<t>.<body>" berechnet — der Zeitstempel steckt IN der Signatur, sodass Sie Replays über seine Aktualität ausschließen können. Das Format entspricht dem von Stripe; Code, der Stripe-Webhooks prüft, lässt sich übernehmen.
import hmac, hashlib, time
def verify(secret, body, header, tolerance=300):
p = dict(x.split("=", 1) for x in header.split(","))
t = int(p["t"])
if abs(time.time() - t) > tolerance:
return False
expected = hmac.new(secret.encode(), f"{t}.".encode() + body,
hashlib.sha256).hexdigest()
return hmac.compare_digest(p["v1"], expected)Jede Anfrage trägt zudem Labelixa-Delivery-Id, und diese Kennung ändert sich bei Wiederholungen NICHT. Sehen Sie dieselbe Kennung ein zweites Mal, führen Sie die Verarbeitung nicht erneut aus — die Zustellung erfolgt mindestens einmal.
Geheimnisrotation
POST /v1/webhooks/{id}/rotate erzeugt ein neues Geheimnis. Das alte bleibt während eines Übergangsfensters gültig (standardmäßig 24 Stunden); in dieser Zeit trägt jede Anfrage ZWEI Signaturen (v1=… ,v1=…). Es passt diejenige, die Ihre Prüfung kennt — Sie können also unterbrechungsfrei rotieren. Die Restzeit steht im Feld rotasyon_bitis der Antwort von GET /v1/webhooks.
Ihr Prüfcode muss MEHRERE v1-Werte unterstützen — wer den Header in ein Wörterbuch umwandelt und einen einzelnen Wert liest, sieht nur den letzten und lehnt in der ersten Hälfte einer Rotation gültige Signaturen ab.
Jede Antwort außer 2xx gilt als Fehlschlag und wird wiederholt; Weiterleitungen (3xx) werden NICHT verfolgt. Ein dauerhaft fehlschlagender Endpunkt wird automatisch deaktiviert — die Auflistung zeigt dann aktif: false und den letzten Statuscode. Der Rumpf enthält KEINE Zeilendaten: nur Auftragskennung und Zähler; das Ergebnis holen Sie über die Auftragskennung.
Gespeicherte Etiketten
Render-Endpunkte sind zustandslos und speichern nichts; das Speichern geschieht nur über diese Endpunkte, auf ausdrückliche Anfrage. Jedes Konto kann speichern: Free 5, Starter 50, Professional 500, Business 2.500 gespeicherte Etiketten; Enterprise unbegrenzt. Anonyme (schlüssellose) Anfragen können nicht speichern — ein kostenloses Konto genügt, keine Karte nötig. Dieses Limit ist unabhängig vom täglichen Kontingent: das eine zählt, wie viele Etiketten Sie drucken, das andere, wie viele Designs Sie aufbewahren.
| Methode | Pfad | Beschreibung |
|---|---|---|
| POST | /v1/labels | Speichert ein Etikett (201). |
| GET | /v1/labels | Listet Ihre Etiketten (ohne Inhalte; Suche, Status, Ordner, Favorit, Sortierung, Paginierung). |
| GET | /v1/labels/{id} | Vollständiger Inhalt + ETag. |
| PATCH | /v1/labels/{id} | Teilaktualisierung; If-Match erforderlich. |
| DELETE | /v1/labels/{id} | In den Papierkorb; ?kalici=true löscht endgültig. |
| POST | /v1/labels/{id}/restore | Stellt aus dem Papierkorb wieder her. |
| POST | /v1/labels/{id}/duplicate | Dupliziert (die Kopie ist ein Entwurf ohne Verlauf). |
| PUT/DELETE | /v1/labels/{id}/favorite | Favoriten-Markierung. |
| PUT/DELETE | /v1/labels/{id}/archive | Archivieren / aus dem Archiv holen. |
| POST | /v1/labels/{id}/publish | Veröffentlicht; 409 mit Befundliste bei ZPL-Fehlern. |
| POST | /v1/labels/{id}/unpublish | Zurück zum Entwurf. |
| GET | /v1/labels/{id}/versions | Versionsverlauf (ohne Inhalte). |
| GET | /v1/labels/{id}/versions/{n} | Vollständiger Inhalt einer Version. |
| POST | /v1/labels/{id}/versions/{n}/restore | Stellt eine Version wieder her (vorwärts: der Verlauf wird nie gelöscht). |
| GET | /v1/labels/{id}/events | Prüfprotokoll (Ereignistyp + Zeit; ohne Inhalte). |
| POST | /v1/folders | Erstellt einen Ordner (eine Ebene). |
| GET | /v1/folders | Ordner + Etikettenzahlen. |
| PATCH/DELETE | /v1/folders/{id} | Benennt um / löscht (Inhalte wandern zur Wurzel, werden nicht gelöscht). |
| PUT | /v1/labels/{id}/folder | Verschiebt ein Etikett in einen Ordner (klasor_id: null = Wurzel). |
Gleichzeitigkeit (If-Match)
Jede Leseantwort enthält ein ETag, und jede Schreibanfrage erfordert den Header If-Match: ohne ihn kommt 428 zurück, mit veralteter Version 412 (der Rumpf enthält die aktuelle Version). So kann ein zweiter Browser-Tab die Änderungen des ersten nicht stillschweigend überschreiben. Zum bewussten Überschreiben senden Sie If-Match: *.
Versionen und Papierkorb
Jede Aktualisierung sichert den vorherigen Stand (die letzten 50 Versionen pro Etikett bleiben erhalten). Das Wiederherstellen einer alten Version wird als neue Version geschrieben — auch das Wiederherstellen ist also umkehrbar. Ein gelöschtes Etikett bleibt 30 Tage im Papierkorb; aktive Etiketten werden unbegrenzt aufbewahrt. Idempotency-Key gilt auch für POST /v1/labels: eine Wiederholung mit demselben Schlüssel nach einem Netzwerk-Timeout erzeugt kein zweites Etikett.
Render-Endpunkte liefern Ihnen ein Bild; diese Endpunkte senden den Auftrag an einen registrierten Drucker. Ein kostenpflichtiger Tarif ist erforderlich (ab Starter); der kostenlose Tarif enthält eine einmalige Testphase mit 25 Etiketten auf 1 Drucker. Es wird nicht doppelt abgerechnet: Übergeben Sie die ID eines bereits gerenderten Auftrags als kaynak_is_id, ist der Druck kostenlos; senden Sie rohes ZPL, gilt das Etikett als hier erzeugt und wird hier abgerechnet.
| Methode | Pfad | Beschreibung |
|---|---|---|
| POST | /v1/devices | Registriert ein Druckerprofil (201). Rumpf: takma_ad, grup, dpmm, genislik_dots, varsayilan_mi, dil, adaptor. dil ist die Sprache des Geräts (zpl, epl, tspl, cpcl oder raw; Standard zpl) und bestimmt, in welcher Sprache ein Testdruck erzeugt wird. adaptor ist der Ausgabeweg; heute verfügbar: raw_tcp, os_driver. Seriennummer und Netzwerkadresse werden nicht entgegengenommen — das Gerät im Netz zu finden ist Aufgabe des Agenten. |
| GET | /v1/devices | Listet Ihre registrierten Drucker. |
| DELETE | /v1/devices/{id} | Löscht ein Druckerprofil. |
| GET | /v1/devices/{id}/status | Was die Cloud über das Gerät weiß: Anzahl der Aufträge in der Warteschlange, Alter des ältesten wartenden Auftrags, letzter Auftrag und Agent-Lebenszeichen. Der physische Zustand des Druckers (Material, Druckkopf, Stau) ist von hier NICHT lesbar — ein roher 9100-Socket meldet ihn nicht, und die Antwort sagt das ausdrücklich: yazici_durumu: "BILINMIYOR". kimlik meldet die Identitätsprüfung, die der Agent vor jedem Auftrag für ein fixiertes Gerät ausführt: sabitlendi, son_dogrulama (zuletzt bestätigt, Epoch-Sekunden), son_sonuc (verified, mismatch, unavailable oder not_pinned) und son_sonuc_zamani. verified belegt, dass zum Auftragszeitpunkt das fixierte Gerät geantwortet hat, nicht dass ein Etikett herauskam. Alles null, bis ein Agent, der die Prüfung meldet, einen Auftrag für das Gerät ausführt. |
| POST | /v1/print | Stellt einen Druckauftrag in die Warteschlange (202). Rumpf: device_id (oder printer_group), yuk (die Nutzdaten), dil, kopya, etiket_sayisi, kaynak_is_id. Die Nutzdaten werden unverändert übertragen und nie geparst, daher geht jede Druckersprache durch — dil akzeptiert zpl, epl, tspl, cpcl oder raw. Ohne dil gilt die Sprache des Geräts. zpl bleibt als alter Name für yuk gültig; beide mit unterschiedlichen Werten zu senden wird abgelehnt. Widerspricht die angegebene Sprache dem Inhalt deutlich, wird der Auftrag trotzdem eingereiht und die Antwort enthält ein uyari-Feld. |
| POST | /v1/bulk/jobs | Wird einem Massenauftrag device_id mitgegeben, geht der erzeugte ZPL-Strom als EIN Druckauftrag in die Warteschlange — die Kette muss nicht mehr in einer ZIP-Datei enden. Nur mit cikti="zpl" gültig. Die Etiketten werden NICHT doppelt berechnet (der Massenauftrag hat bereits je Zeile abgerechnet). Die Ergebniszusammenfassung enthält ein baski-Feld; kann der Druckauftrag nicht eingereiht werden, bleibt der Massenauftrag erfolgreich und der Grund steht in diesem Feld. |
| GET | /v1/print/jobs/{id} | Auftragsstatus. Der Auftrag eines anderen liefert 404. |
| POST | /v1/print/jobs/{id}/cancel | Storniert einen Auftrag, der noch wartet (200, Status cancelled; die Nutzdaten werden gelöscht und der Agent erhält ihn nie). Ein erneuter Aufruf für einen stornierten Auftrag liefert denselben 200-Rumpf. Ein Auftrag im Status dispatching, uncertain, dispatched oder failed liefert 409 mit seinem aktuellen Status: Wurde der Auftrag an den Agent oder den Drucker übergeben, lässt er sich nicht zurückholen — prüfen Sie vor einem erneuten Druck den Drucker. Der Auftrag eines anderen liefert 404. Eine Stornierung löst kein Webhook-Ereignis aus. |
Auftragsstatus — und warum es kein `printed` gibt
Einen Status „gedruckt“ gibt es bewusst nicht. Über rohes 9100 lässt sich nicht beweisen, dass ein Etikett gedruckt wurde: Dass der Socket Ihre Bytes annimmt, zeigt nur, dass sie im Puffer des Druckers angekommen sind; leeres Material, ein offener Druckkopf oder ein Stau passieren, nachdem die Bytes angenommen wurden — und der Socket sagt Ihnen das nie. Der weiteste Zustand ist dispatched = „übergeben“. Jede Antwort trägt zudem basim_onaylandi: false, damit das Ignorieren des Feldes nicht als „also wurde gedruckt“ gelesen werden kann.
| Status | Bedeutung |
|---|---|
queued | Auftrag angenommen, wartet. |
dispatching | Wird an den Drucker übergeben. |
dispatched | Bytes an den Drucker übergeben. Das bedeutet NICHT, dass das Etikett gedruckt wurde. |
failed | Übergabe fehlgeschlagen. |
cancelled | Auftrag abgebrochen. |
uncertain | Der Auftrag hat den Agent erreicht, aber es kam kein Ergebnis zurück (zum Beispiel wurde der Agent mitten im Senden beendet); ob Bytes den Drucker erreicht haben, ist NICHT bekannt. Der Auftrag wird nie automatisch wiederholt: Prüfen Sie den Drucker und drucken Sie ein fehlendes Etikett als NEUEN Auftrag. Die Statusantwort enthält dann uyari_kodu: delivery_uncertain und einen uyari-Satz. Ein spätes, eindeutiges Ergebnis des Agents kann den Auftrag noch auf dispatched oder failed setzen; zurück auf queued setzt ihn nichts. Im Panel (Gespeicherte Arbeit) bietet der Auftrag „Als neuen Auftrag erneut drucken“, solange sein Etiketteninhalt noch aufbewahrt wird (höchstens 24 Stunden nach dem Einreihen); der neue Auftrag verweist in kaynak_is_id auf den ursprünglichen. |
Sie können also einen Workflow bauen, der das Drucken auslöst, aber bauen Sie keine Geschäftsregeln auf eine Druckbestätigung. Wo eine Bestätigung wirklich zählt (Pharma, Rückverfolgung), muss die Prüfung vom Etikett selbst zurückgelesen werden.
`failed` heißt nicht „nichts wurde gedruckt“
Ein Auftrag kann an fünf verschiedenen Stellen scheitern, und in vier davon erreicht kein einziges Byte den Drucker (Gerät nicht zugeordnet, kein Adapter, Identitätsprüfung fehlgeschlagen). Im fünften Fall — die Verbindung zum Drucker bricht ab — sind die Bytes hinausgegangen, und bei mehreren Kopien liegt ein Teil davon möglicherweise schon auf Papier. Die Statusantwort trägt diesen Unterschied in eigenen Feldern:
| Feld | Bedeutung |
|---|---|
asama | Wie weit der Auftrag kam: queued → delivered_to_agent → submitted_to_printer. |
gonderilen_kopya | Tatsächlich an den Drucker geschriebene Kopien. -1 bedeutet unbekannt — das ist NICHT dasselbe wie null. |
yaziciya_giden_var_mi | true/false/null. null heißt: eine ältere Agent-Version hat es nicht gemeldet — nicht, dass nichts gesendet wurde. |
Ein Auftrag, dessen Bytes den Drucker erreicht haben, wird nie automatisch wiederholt — eine Wiederholung würde das Etikett ein zweites Mal drucken. Ein solcher Auftrag wird angehalten, und die Entscheidung zum Fortfahren liegt bei Ihnen. Fehler, die den Drucker nie erreicht haben, werden weiterhin wie bisher wiederholt.
Doppeldrucke vermeiden: Idempotency-Key
Eine Anfrage nach einem Netzwerk-Timeout erneut zu senden ist der richtige Reflex — aber das Etikett liegt möglicherweise schon auf Papier. Senden Sie einen Idempotency-Key-Header, und eine zweite Anfrage mit demselben Schlüssel erzeugt keinen neuen Auftrag: Sie gibt die erste Antwort erneut zurück (Idempotency-Replayed: true). Derselbe Schlüssel mit einem ANDEREN Rumpf ergibt 422 — einen Schlüssel wiederzuverwenden würde stillt das falsche Etikett drucken. Ein 429 (Warteschlange voll) verbraucht den Schlüssel NICHT; ein erneuter Versuch damit ist vorgesehen.
Aus einer gespeicherten Vorlage drucken
Statt yuk können Sie sablon_id und degiskenler senden; die Nutzlast wird aus der Vorlage erzeugt. Beides zusammen wird abgelehnt. Eine fehlende oder ungültige Variable ergibt 400 — ein Etikett mit fehlender Variable verschwendet Material, und nur die Person am Drucker würde es bemerken.
Ein gespeichertes Etikett drucken: etiket_id
Statt yuk können Sie die etiket_id eines in Ihrem Konto gespeicherten Etiketts (/v1/labels) zusammen mit degiskenler für seine Variablen senden; die Nutzlast wird aus dem Etikett erzeugt. Um mehrere Etiketten als EINEN Auftrag zu drucken, senden Sie satirlar: ein Objekt pro Etikett, 1-1000 Zeilen; die Werte einer Zeile überschreiben degiskenler, und etiket_sayisi wird zur Zeilenzahl. Eine leere satirlar-Liste wird abgelehnt; lassen Sie sie weg, um ein einzelnes Etikett zu drucken. etiket_id lässt sich nicht mit yuk, zpl oder sablon_id kombinieren (422). Eine fehlende oder ungültige Variable ergibt 422 und nennt die Zeile — der Auftrag wird nicht eingereiht, keine Zeile wird übersprungen. Das Etikett eines anderen Kontos erhält dasselbe 404 wie ein fehlendes, archivierte Etiketten werden nicht gedruckt. Idempotency-Key, kopya, device_id / printer_group und die Abrechnung funktionieren genau wie bei einer Roh-Nutzlast; die Antwort enthält etiket_id. Ist der Freigabe-Workflow aktiv, können nur veröffentlichte Etiketten gedruckt werden (sonst 422); reichen Sie das Etikett im Panel unter Gespeicherte Arbeit zur Freigabe ein und geben Sie es frei, oder nutzen Sie POST /v1/labels/{id}/publish und /approve.
Druckergruppen: printer_group
Vergeben Sie bei der Geräteregistrierung ein grup (DEPO, URETIM), dann darf eine Druckanfrage statt device_id ein printer_group tragen. Der Zweck: Gerätekennungen aus dem Geschäftssystem heraushalten — wird ein Drucker getauscht, wandert die Gruppe mit dem Geräteeintrag und der Code auf ERP-Seite bleibt unberührt. Die Auflösung ist bewusst DETERMINISTISCH: für ein "nimm den freien" fehlen uns die Daten, denn ein roher 9100-Socket meldet keine Auslastung. Ein Gerät in der Gruppe: dieses Gerät. Mehrere: das als Standard markierte. Kein Standard oder mehrere, dann wird der Auftrag NICHT gedruckt — der Fehler nennt die kollidierenden Geräte. device_id und printer_group zusammen zu senden wird abgelehnt. Gruppennamen werden in Großbuchstaben normalisiert und dürfen nur Buchstaben, Ziffern, - und _ enthalten. Für Integrationen ohne Gruppen ändert sich nichts: grup entsteht leer und device_id funktioniert wie bisher. In beiden Fällen liefert die Antwort die device_id zurück, auf der der Auftrag gelandet ist.
Webhook-Benachrichtigungen
Sie müssen den Status nicht abfragen: Abonnieren Sie baski.teslim und baski.basarisiz. Ein Ereignis baski.basildi gibt es nicht — aus demselben Grund, aus dem es keinen Status printed gibt. Der Rumpf enthält keinen rohen Etiketteninhalt: nur Auftrags-ID, Stufe und Zähler. Das Fehlerereignis wird erst ausgelöst, wenn ein Auftrag dauerhaft fehlgeschlagen ist; eine Benachrichtigung bei jedem Versuch würde den echten Fehler im Rauschen begraben. Ein Auftrag, der ungewiss wird, löst baski.belirsiz aus — ein eigenes Ereignis, damit eine Automatisierung, die bei baski.basarisiz neu druckt, ihn nicht doppelt druckt; bestehende Abonnements erhalten es erst, wenn Sie es hinzufügen. Jeder baski.*-Rumpf enthält veri.sira (1, 2, … je Auftrag) und veri.status (der Status bei diesem Ereignis). Zustellungen werden wiederholt, daher kann ein älteres Ereignis nach einem neueren eintreffen: Vergleichen Sie sira und ignorieren Sie ein Ereignis, dessen sira kleiner ist als das zuletzt verarbeitete desselben Auftrags.
Der DirectPrint-Agent, der diese Aufträge abholt und an den Drucker liefert, wird hier heruntergeladen: /de/download
Agent einrichten (Einrichtungsassistent)
Führen Sie auf dem Computer, an dem die Drucker hängen, labelixa-agent setup aus (der Einzeiler-Installer auf der Download-Seite installiert den Agent und startet ihn). Der Agent öffnet die Labelixa-Seite im Browser; prüfen Sie, dass dort derselbe kurze Code steht wie im Agent-Fenster, und klicken Sie auf Verbinden. Ohne Browser erstellen Sie auf der Seite Drucker im Panel einen Kopplungscode und führen labelixa-agent setup CODE aus. Der kostenlose Plan enthält eine Testphase mit 1 Computer, 1 Drucker und insgesamt 25 Etiketten (Testetiketten zählen nicht); darüber hinaus ist ein bezahlter Plan nötig. Das Herunterladen ist kostenlos.
Der Assistent liest die Druckwarteschlangen des Computers: ein einzelner Etikettendrucker wird ohne Rückfrage verwendet, mehrere werden als Liste angeboten, ein Bürodrucker nur nach Ihrer Bestätigung. Jeder gewählte Drucker wird Ihrem Konto hinzugefügt und auf diesem Computer zugeordnet; am Ende kann ein Testetikett gedruckt werden. Während der Einrichtung wird nichts an einen Drucker gesendet und das Netzwerk nicht durchsucht.
labelixa-agent discover -mdnslistet die Netzwerkdrucker, die sich selbst ankündigen (Bonjour/mDNS), ohne ihnen etwas zu senden.labelixa-agent import DATEIfügt viele Netzwerkdrucker auf einmal aus einer CSV-Datei hinzu, eine Zeilename,adresse[,gruppe]pro Drucker (-dry-runprüft die Datei vorher). Jede Zeile wird gemeldet; eine fehlerhafte Zeile stoppt die Datei nicht.- Ein erneutes
setupauf einem verbundenen Computer behält die Verbindung und die bereits eingerichteten Drucker.
Der Agent fragt die Cloud nach Arbeit, und die Cloud hält die Anfrage offen, bis ein Auftrag eintrifft (Long Polling) — ein Etikett wird übergeben, sobald es gesendet ist. Der Agent öffnet keinen Port: jede Verbindung geht vom Computer zu Labelixa.
Windows: stille Installation für IT-Teams
Für Intune-, Gruppenrichtlinien- oder SCCM-Rollouts gibt es den Windows-Agent auch als MSI-Paket. Eine Zeile richtet ihn als Windows-Dienst LabelixaAgent ein, koppelt ihn mit einem Einmalcode von der Seite Drucker im Dashboard und importiert die Druckerliste: msiexec /i labelixa-agent_0.6.1_windows_amd64.msi /qn PAIRCODE=CODE PRINTERSFILE=C:\pfad\drucker.csv. PRINTERSFILE ist optional (eine Zeile name,adresse[,gruppe] je Drucker); schlägt Kopplung oder Import fehl, wird die Installation zurückgerollt, und der Code landet nicht im Installationsprotokoll. Paket und Prüfsumme liegen auf der Release-Seite.
USB-Drucker: die Druckwarteschlange des Betriebssystems
Ein Desktop-Drucker am USB-Anschluss öffnet keinen Port 9100; er erscheint im Betriebssystem als Druckwarteschlange (Windows-Spooler, CUPS unter macOS und Linux). Ab Agent 0.2.0 werden die Bytes als RAW-Daten an diese Warteschlange übergeben: Der Treiber rendert nichts, die Etikettensprache erreicht den Drucker genau so, wie Sie sie gesendet haben.
- Registrieren Sie das Gerät mit
adaptor: "os_driver"(POST /v1/devices). - Ermitteln Sie auf dem Agent-Rechner den Namen der Warteschlange:
labelixa-agent discover -queues. - Ordnen Sie das Gerät der Warteschlange zu:
labelixa-agent map-printer -device GERAETE_ID -queue "WARTESCHLANGE". - Optional läuft der Agent ab jeder Anmeldung im Hintergrund:
labelixa-agent install(LaunchAgent unter macOS, systemd-Benutzereinheit unter Linux; unter Windows gibt er die Dienstbefehle für eine Administrator-Eingabeaufforderung aus).
Auf diesem Weg ist die weiteste Stufe submitted_to_os: Der Spooler hat den Auftrag angenommen. Das ist ein Schritt vor submitted_to_printer — ein ausgeschalteter Drucker oder fehlendes Material zeigt sich in der Warteschlange des Betriebssystems, nicht hier, und die Warteschlange meldet keinen Druckerstatus (yazici_durumu: null). Ein Auftrag, der bei ausgeschaltetem Drucker gesendet wird, wartet dort und wird gedruckt, sobald der Drucker wieder an ist. Ein teilweise übergebener Mehrfachauftrag wird nicht automatisch wiederholt.
Cloud-Eintrag und Agent-Zuordnung müssen übereinstimmen: Ein os_driver-Gerät mit Netzwerkadresse oder ein raw_tcp-Gerät mit Warteschlange wird nicht gedruckt und schlägt mit AdaptorYok fehl — Anhalten ist besser als ein Druck auf dem falschen Drucker.
ZPL aus der Cloud auf einem USB-Zebra-Drucker drucken
PrintOps — Kennzahlen, Warnungen, Druckprüfung
Die Betriebsseite der Druck-Endpunkte: Was wurde gedruckt, was hängt, wer hat gedruckt. Nur lesend — fasst die vorhandenen Druckaufträge des Kontos zusammen und schreibt nichts. Dieselben Daten stehen im Panel im Reiter PrintOps (gleiche Plan-Schranke wie Drucker). Es gibt bewusst keine Zahl „gedruckt“: Zugestellt heißt, die Bytes haben den Agenten erreicht, nicht das Papier.
| Methode | Pfad | Beschreibung |
|---|---|---|
| GET | /v1/printops/dashboard?gun=7 | Sieben Kennzahlen für das Fenster (1–90 Tage): Auftragszahl, zugestellte Etiketten (Σ Etiketten × Kopien, dispatched), Erfolgsquote, fehlgeschlagene Aufträge mit den fünf häufigsten Fehlertypen, aktuell wartende Aufträge, mittlere Zustellzeit (erstellt → Agentenergebnis), Aufträge/Fehler je Drucker (Top 10). Dazu Agentenzahl und online (letzte 2 Min.). |
| GET | /v1/printops/alerts | Fünf Warnungstypen: ajan_cevrimdisi (Agent zuletzt > 10 Min. gesehen, kritisch), kuyruk_birikmesi (Aufträge warten > 5 Min.; ≥ 20 kritisch), tekrarli_hata (≥ 3 Fehler an einem Drucker in 60 Min.), yazici_engel (letzte Statusantwort des Druckers ist eine Blockade), eslenmemis_cihaz (kein Agent ordnet das Gerät zu). Ohne gemeldete Zuordnungen wird „nicht zugeordnet“ nicht erfunden. |
| GET | /v1/printops/audit | Druckprüfung — je Auftrag: wer (Akteur im Prüfpfad), was (Inhaltsdigest + Vorlage), wo (Drucker), wann, Ergebnis (Status + Phase + Fehlertyp), Kopien und Quelle (kaynak_is_id). Filter: device_id, status, baslangic, bitis, limit. „Wer“ bleibt leer, solange der Prüfpfad aus ist. |
Business Central
Die Business-Central-Erweiterung von Labelixa (Labelixa Core + DirectPrint) nutzt diese Endpunkte; Ihre eigene Integration kann sie ebenfalls nutzen. Die Authentifizierung erfolgt per API-Schlüssel; eine anonyme Anfrage kann keine Zuordnung anlegen (403). Die Plan-Schranke ist dieselbe wie bei den Druck-Endpunkten.
| Methode | Pfad | Beschreibung |
|---|---|---|
| POST | /v1/bc/tenants | Ordnet einen BC-Mandanten / eine Umgebung / ein Unternehmen diesem Konto zu. Body {kiraci, ortam, sirket?}; ein leeres Unternehmen deckt alle Unternehmen der Umgebung ab. Neue Zuordnung 201, Wiederholung vom selben Konto 200; ein Tripel, das einem anderen Konto gehört, ergibt 409 KiraciBaskasinin. |
| GET | /v1/bc/tenants | Die Zuordnungen des Kontos und für jede den BC-Druckzähler des laufenden Monats. |
| DELETE | /v1/bc/tenants/{id} | Löscht die Zuordnung und ihre Zähler (204). Die Zuordnung eines anderen Kontos erhält dieselbe Antwort wie eine fehlende (404). |
| POST | /v1/bc/print | Der /v1/print-Body plus kiraci, ortam, sirket?. Die Zuordnung wird aufgelöst, die Monatsgrenze geprüft, dann nimmt der Auftrag denselben Weg wie /v1/print. 202 bedeutet eingereiht, nicht gedruckt. Für ein gespeichertes Etikett etiket_id mit degiskenler senden, für mehrere Zeilen satirlar (1-1000 Zeilen; leere Liste ergibt 400, ohne satirlar wird ein Etikett gedruckt; Kopien 1-100). Nutzt das Etikett die Paketnummer (shipment_package_number) und enthalten die Werte shipment_package_count = N, druckt dieser Datensatz N Etiketten (1 / N bis N / N); so viele Etiketten werden gezählt, höchstens weiterhin 1000. Ist die Grenze erreicht: 402 mit X-Quota-Action: upgrade. Der Zähler steigt nur bei 202; das Web-Kontingent wird nicht belastet. Idempotency-Key wird vor der Grenze geprüft: Ein erneuter Versuch mit demselben Schlüssel erhält die ursprüngliche 202 (Idempotency-Replayed: true), ohne erneut zu zählen, auch bei erreichter Grenze; derselbe Schlüssel mit anderem Body erhält 422. |
| GET | /v1/bc/dictionary | Das BC-Feldwörterbuch: Quelltyp → BC-Feld → Vorlagenvariable (Schreibweise item_number). |
| POST | /v1/labels/starter-set | Fügt dem Konto das Versandetiketten-Set ohne Markenzeichen (Inhalt auf Englisch) als Entwürfe hinzu: 10x10 cm, 10x15 cm, 4x6 Zoll, 103x150 mm und A6, gefüllt aus gebuchten Verkaufslieferungen; jedes Etikett zeigt die Paketnummer (PACKAGE 1 / 3) und das gesamte Bruttogewicht der Lieferung (TOTAL WEIGHT). Ein Etikett mit demselben Namen (auch archiviert) wird übersprungen, ein zweiter Aufruf fügt also nichts hinzu; reicht das Limit für gespeicherte Etiketten nicht für alle fehlenden, wird keines hinzugefügt (403 + X-Quota-Action: upgrade). |
MCP-Server für KI-Assistenten
Claude, ChatGPT und andere MCP-fähige KI-Clients können Labelixa direkt als Werkzeug verwenden: Der entfernte MCP-Server läuft unter https://api.labelixa.com/mcp (streamable HTTP, JSON-RPC; keine Installation — eine URL in den Client einfügen genügt). Ein Schlüssel ist nicht erforderlich — anonyme Nutzung unterliegt den Limits der kostenlosen Stufe; mit Authorization: Bearer lbx_... verbrauchen Sie Ihr eigenes Kontokontingent.
| Werkzeug | Beschreibung |
|---|---|
zpl_preview | Rendert ZPL als PNG (dpmm/Größe/Index wählbar). |
zpl_validate | Prüft ZPL mit zeilen-/spaltengenauen Diagnosen. |
barcode_png | Erzeugt einen einzelnen Barcode als PNG. |
save_label | Speichert das Etikett im Konto; ohne API-Schlüssel wird es 24 Stunden gehalten und ein einmaliger Konto-Link zurückgegeben. |
printer_language_to_zpl | Wandelt einen SATO-SBPL-, Datamax-DPL- oder Intermec-IPL-Datenstrom in ZPL um; die Quellsprache wählen Sie. Warnungen bedeuten: keine 1:1-Umwandlung; nicht auf physischen Druckern geprüft. |
MCP-Aufrufe zählen gegen dieselben Kontingente und Ratenlimits wie REST — MCP ist keine separate Stufe, sondern dieselbe API mit Werkzeug-Gesicht. Die Tabelle zeigt eine Auswahl; die vollständige, stets aktuelle Liste liefert der Live-Server (tools/list) und die Seite /mcp.
Regeldateien für Coding-Assistenten
Eine Regeldatei bringt Claude Code, Cursor, GitHub Copilot oder Windsurf bei, Etikettencode mit Labelixa zu prüfen und zu rendern, statt aus dem Text zu raten. Kopieren Sie die Datei für Ihren Assistenten aus dem Repository Labelixa/agent-skills in Ihr Projekt: .claude/skills/labelixa/SKILL.md, .cursor/rules/labelixa.mdc, .github/instructions/labelixa.instructions.md, .windsurf/rules/labelixa.md. Die Regeln rufen den MCP-Server oder die CLI auf; ein API-Schlüssel kommt, falls vorhanden, nur aus der Umgebung.
Ein gedrucktes Etikett zurücklesen
POST /v1/verify liest die Barcodes in einem Foto oder Scan, den Sie hochladen — die Antwort auf "gedruckt, aber liest das Handgerät es auch?". Der Rumpf wird als multipart/form-data gesendet, das Bild im Feld file; akzeptiert werden PNG, JPEG, BMP und GIF, bis 5 MB und 6000×6000 Pixel. Die Antwort enthält olculdu (lief der Decoder), eine Liste okunan (je format und veri) und ein Feld not.
Nicht zu verwechseln mit POST /v1/barcode-check: dort ist die Eingabe ZPL — wir rendern das Etikett und lesen zurück, was wir selbst gezeichnet haben. Hier ist die Eingabe ein Bild aus der realen Welt.
Die Grenzen des Ergebnisses stehen in der Antwort und sind ernst zu nehmen: "gelesen" GARANTIERT nicht, dass jedes Handgerät es liest, und "nicht gelesen" BEWEIST nicht, dass das Etikett schlecht ist — Winkel, Fokus oder Beleuchtung des Fotos können schlicht nicht ausreichen. Dieser Endpunkt ist KEINE ISO/IEC-15416-Druckqualitätsnote (A–F); dafür braucht es ein Prüfgerät.
curl -X POST "https://api.labelixa.com/v1/verify" \
-F "file=@label-photo.jpg"Dasselbe im Browser: Barcode-Prüfer.
Druckersprachen über ZPL hinaus
Labelixa rendert und validiert vier Druckersprachen. Die folgenden Endpunkte entsprechen den ZPL-Pendants: render liefert ein PNG des Etiketts, diagnostics liefert Diagnosen mit Zeilennummern. Der Umfang ist je Sprache bewusst eine MVP-Teilmenge, und jede Antwort nennt ihre eigenen Grenzen — ein Befehl, den wir nicht zeichnen, wird gemeldet und nie stillschweigend übergangen.
| Methode | Pfad | Beschreibung |
|---|---|---|
| POST | /v1/language-detect | ZPL / EPL / TSPL / CPCL erkennen |
| POST | /v1/epl/render | EPL/EPL2 als PNG rendern. Ein Datenstrom kann mehrere Etiketten enthalten (je mit P beendet): X-Label-Count ist die Gesamtzahl, ?index= wählt eines aus. |
| POST | /v1/epl/diagnostics | EPL-Diagnose mit Zeilennummern |
| POST | /v1/tspl/render | TSPL/TSPL2 als PNG rendern. Ein Datenstrom kann mehrere Etiketten enthalten (je mit PRINT beendet): X-Label-Count ist die Gesamtzahl, ?index= wählt eines aus. |
| POST | /v1/tspl/diagnostics | TSPL-Diagnose mit Zeilennummern |
| POST | /v1/cpcl/render | CPCL als PNG rendern. Ein Datenstrom kann mehrere Etiketten enthalten (je mit PRINT beendet): X-Label-Count ist die Gesamtzahl, ?index= wählt eines aus. |
| POST | /v1/cpcl/diagnostics | CPCL-Diagnose mit Zeilennummern |
| POST | /v1/compatibility | ZPL-Kompatibilitäts-Risikoanalyse |
POST /v1/language-detect beantwortet eine andere Frage: Um welche Sprache handelt es sich bei fremdem Code? Die Antwort ist heuristisch und deterministisch (kein LLM); die Sicherheit wird als High/Medium/Low angegeben statt als erfundener Prozentwert.
POST /v1/compatibility nimmt ZPL plus ein Druckermodell entgegen und liefert eine Risikoanalyse zur Kompatibilität — Sprachlage, Befunde zu Größenregeln und Vorschau-Umfang. Es ist KEIN Emulator und gibt nie eine Kompatibilitätsgarantie: Wir haben nur eines von vierzig Modellen physisch getestet, und ein dokumentierter Emulationsmodus ist keine native Unterstützung.
Druckersprachen-Umwandlung (SBPL / DPL / IPL → ZPL)
Drei Endpunkte wandeln SATO-SBPL-, Honeywell-(Datamax-)DPL- und Honeywell-(Intermec-)IPL-Datenströme in ZPL um, damit das Etikett mit den ZPL-Werkzeugen angezeigt, geprüft und gedruckt werden kann. Der Body ist der Rohdatenstrom — echte Steuerzeichen und die lesbare Schreibweise der Handbücher (<STX>, <ESC>) ergeben dasselbe Ergebnis. Die Quellsprache wählen Sie: Die automatische Spracherkennung kennt diese drei Sprachen nicht.
| Methode | Pfad | Beschreibung |
|---|---|---|
| POST | /v1/convert/sbpl-to-zpl | SATO SBPL → ZPL |
| POST | /v1/convert/dpl-to-zpl | Datamax / Honeywell DPL → ZPL |
| POST | /v1/convert/ipl-to-zpl | Intermec / Honeywell IPL → ZPL |
Parameter
| Parameter | Standard | Bedeutung |
|---|---|---|
dpmm | 8 | Zielauflösung: 6, 8, 12 oder 24 Punkte pro mm (152 / 203 / 300 / 600 dpi). Andere Werte fallen auf 8 zurück. |
etiket_boyu_mm | — | Nur DPL: Etikettenlänge in mm. DPL misst Zeilen von der UNTERKANTE des Etiketts, ZPL von oben; ohne diesen Wert (oder <STX>c / <STX>KcCL im Datenstrom) werden 6 Zoll angenommen und eine Warnung ergänzt. |
Antwort
| Feld | Bedeutung |
|---|---|
zpl | Das umgewandelte ZPL (ein ^XA…^XZ-Block pro Etikett). |
uyarilar | Liste der Warnungen auf Englisch: jeder Befehl oder Barcode, der nicht übertragen werden konnte, mit Handbuchseite. |
kaynak_dil | sbpl, dpl oder ipl — der aufgerufene Endpunkt. |
birebir | true nur, wenn die Warnliste leer ist. |
X-Warnings-Count | Antwort-Header: Anzahl der Warnungen. |
Gibt es Warnungen, ist die Umwandlung nicht 1:1. Befehle außerhalb der unterstützten Teilmenge — Druckereinstellungen (Geschwindigkeit, Schwärzung, Sensor), RFID, Auftragsverwaltung und einige 2D-Symbologien — werden MIT Warnung übersprungen, nie stillschweigend. Zeigen Sie die Warnungen der Person, die das Etikett druckt.
curl -X POST "https://api.labelixa.com/v1/convert/sbpl-to-zpl?dpmm=8" \
--data-binary "<A><CS>6<V>100<H>200<L>0202<XM>ABCD<Q>1<Z>"{"zpl": "^XA\n^FO199,99^A0N,48,48^FDABCD^FS\n^PQ1\n^XZ",
"uyarilar": ["<CS> Print Speed not carried over to ZPL (manual p. 326; printer setting or outside the supported subset)"],
"kaynak_dil": "sbpl", "birebir": false}curl -X POST "https://api.labelixa.com/v1/convert/dpl-to-zpl?dpmm=8&etiket_boyu_mm=101.6" \
--data-binary @label.dplNicht auf einem physischen Drucker geprüft. Es wurde kein SATO-, Datamax- oder Intermec-Drucker verwendet: Die Ausgabe ist das ZPL-Äquivalent laut Befehlsreferenz des jeweiligen Herstellers. Positionen gedrehter Felder sind angenähert und andere Schriftfamilien werden auf ^A0 abgebildet; beides wird als Warnung gemeldet. Prüfen Sie vor der Produktion die Vorschau und einen Testdruck.
Die Umwandlung zählt nicht gegen das Anfragekontingent; es gilt nur das Limit pro Sekunde. Body bis 512 KB (darüber 413), leerer Body 400. Die Endpunkte sind zustandslos: Der Code wird weder gespeichert noch protokolliert.
Dasselbe im Browser: Druckersprachen-Konverter.
Die Vorschau in die eigene Seite einbetten
/embed/viewer ist eine minimale Vorschaukomponente ohne Seitenrahmen; Sie binden sie per <iframe> in Ihre eigene Anwendung ein. Das ZPL reist im URL-Fragment (#), nicht im Query-String — das Fragment wird nie an den Server gesendet, Ihr Etiketteninhalt landet also weder in unseren noch in den Logs zwischengeschalteter Proxys. Das Format ist IDENTISCH mit der Ausgabe von "Link kopieren" im Vorschauwerkzeug (base64-JSON) — Sie können diesen Link direkt einfügen.
<iframe src="https://labelixa.com/embed/viewer#eyJ6IjoiXlhBLi4uIiwiZCI6IjgiLCJ3IjoiNCIsImgiOiI2In0"
width="420" height="620" style="border:0"></iframe>Die Höhe geben Sie vor; die Komponente passt das Bild in den Rahmen ein. Die Seite ist noindex und nicht in der Sitemap — sie ist eine Komponente, keine Inhaltsseite.
Postman-Sammlung
Jeder Endpunkt dieser Referenz liegt als fertige Anfrage im öffentlichen Postman-Workspace: postman.com/labelixa-3901521. Die Sammlung wird aus dem OpenAPI-Schema (/openapi.json) erzeugt, nicht von Hand gepflegt. Der Schlüssel reist in der Variablen apiKey und ist NICHT in der Sammlung eingebettet — forken Sie den Workspace und setzen Sie ihn in Ihrer eigenen Umgebung; bleibt er leer, laufen die Anfragen über das anonyme Kontingent.
Ein Badge für Ihre README
Werden die ZPL-Dateien Ihres Repositorys in der CI geprüft (POST /v1/diagnostics beendet sich bei Fehlern mit Exit-Code ≠ 0), können Sie das mit einem statischen Badge sagen — kein Zähler, kein Tracking, einen Tag gecacht:
[](https://labelixa.com/tools/zpl-preview)Nur verwenden, wenn die Aussage für Ihr Repository stimmt. Den Viewer in die eigene Seite einbetten, mit Quellenzeile darunter: Einbettungsanleitung.