Arbeitsbereich
Startseite›Entwickler›API-Referenz

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

  1. 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
  2. Das zurückgegebene PNG ist das Etikett. Mit Accept: application/pdf erhalten Sie stattdessen ein PDF.
  3. Mit Konto und X-API-Key-Header gelten Kontingent und Ratenlimit Ihres Plans; Details in den Abschnitten unten.

Endpunkte

MethodePfadBeschreibung
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/barcodesErzeugt einen einzelnen Barcode (PNG/SVG/PDF).
GET/v1/barcodes/catalogGibt den Barcode-Typkatalog (JSON) zurück.
POST/v1/graphicsWandelt 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/fontsWandelt eine TrueType-Schrift in einen ZPL-Schriftbefehl (~DU) um; Subsetting mit ?chars=.
POST/v1/fonts/libraryLä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.pngWandelt einen ^GF-Befehl zurück in ein PNG (Vorschau dessen, was zum Drucker geht).
POST/v1/text/measureMisst 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/diagnosticsAnalysiert 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/mapLiefert 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/schemaExtrahiert die {{Variablen}} einer Vorlage (Typ/Pflicht/Standard).
POST/v1/variables/bindBindet JSON-Daten sicher an eine Vorlage; 422 bei fehlenden oder ungültigen Daten.
POST/v1/variables/bind-rowsBindet 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/csvLä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/jobsStartet 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/zplWandelt 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/webhooksRegistriert 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/plansListet die Tarifstufen und ihre Grenzen auf.
POST/v1/accountsErstellt 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/usageDie 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/keysListet 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

HeaderZweckWerte
X-API-KeyAPI-Schlüssel (auch key= im Query — veraltet)lbx_...
Idempotency-KeyEin erneuter Versuch erzeugt keinen zweiten Auftrag; die gespeicherte Antwort wird wiederholt (nur /v1/bulk/jobs)beliebiger eindeutiger Wert
AcceptAusgabeformatimage/png (Standard), application/pdf, application/json, application/zpl, application/epl
X-Target-DpmmZielauflösung bei der ZPL-Umwandlung6, 8, 12, 24
X-FormatterZPL-Formatierung (application/zpl)On, Off
X-Page-SizePDF-SeitengrößeA4, A5, A6, Letter, Legal
X-Page-LayoutRaster pro Seitez. B. 2x3
X-QualityPNG-QualitätGrayscale, Bitonal
X-RotationDreht das Etikett0, 90, 180, 270

Antwort-Header

HeaderBedeutung
X-Total-CountGesamtzahl 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-PlanDer Tarif, unter dem die Anfrage erkannt wurde.
X-RateLimit-RemainingHeute 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-HintNur 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

CodeBedeutung
400Ungültiger Parameter (dpmm, Größe usw.).
413Anfragekö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.
429Raten-/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

HTTPkod / hata_tipiWann er auftrittBehebungBeispiel
401gecersiz_anahtarEin 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.
{"hata": "Invalid API key", "kod": "gecersiz_anahtar"}
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.
{"hata": "X-API-Key required"}
403origin_kapisiDie 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.
{"hata": "Access denied", "kod": "origin_kapisi"}
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.
{"hata": "This feature (webhook) is not available on the free plan. See the /v1/plans endpoints to upgrade."}
Header: X-Quota-Action: upgrade
403kapsam_yokDer 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.
{"hata": "This key does not have the 'etiket_yaz' scope", "kod": "kapsam_yok", "gereken_kapsam": "etiket_yaz"}
403birincil_gerekliAbrechnung 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.
{"hata": "The billing portal can only be opened with the account's primary key or a panel session", "kod": "birincil_gerekli"}
403rol_yetkisizDer 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.
{"hata": "Role 'viewer' is not allowed to perform 'etiket_yaz'", "kod": "rol_yetkisiz", "gereken_eylem": "etiket_yaz"}
403hesap_gerekliEndpunkte 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.
{"hata": "Saved labels require an account; a free account is enough (POST /v1/accounts).", "kod": "hesap_gerekli"}
Header: X-Quota-Action: signup
401EntraJetonuGecersizDie 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.
{"hata": "Invalid Entra token: signature verification failed", "hata_tipi": "EntraJetonuGecersiz"}
404EntraEslemesiYokDer 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.
{"hata": "This Entra tenant is not linked to a Labelixa account; run Connect Account with an API key first", "hata_tipi": "EntraEslemesiYok"}
409EntraBelirsizMehr 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.
{"hata": "This Entra tenant is linked to more than one Labelixa account; connect with an API key", "hata_tipi": "EntraBelirsiz"}
409KiraciBaskasininDas 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.
{"hata": "This tenant/environment/company is linked to another account", "hata_tipi": "KiraciBaskasinin"}

400 / 404 / 413 / 422 — Parameter, Größe, Validierung

HTTPkod / hata_tipiWann er auftrittBehebungBeispiel
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.
dpmm must be 6, 8, 12 or 24
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.
Label size must be at most 15 inches
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.
{"hata": "Not found"}
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.
Request body exceeds the 1 MB limit
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.
At most 20000 commands per label (23417 found). Split the ZPL stream into several labels or simplify it.
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.
At most 50 labels per request (120 sent). Upgrade your plan for a higher limit.
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.
{"detail": [{"type": "json_invalid", "loc": ["body", 1], "msg": "JSON decode error", "input": {}}]}
422satir_tavaniPOST /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.
{"hata": "Quick batch accepts at most 20 rows; for more, use a Pro bulk job (/v1/bulk/jobs)", "kod": "satir_tavani", "tavan": 20, "satir_sayisi": 21}
409eposta_kullanimdaPOST /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.
{"hata": "An account with this email already exists", "kod": "eposta_kullanimda"}

402 / 429 — Ratenlimit vs. Tages- und Monatskontingent

HTTPkod / hata_tipiWann er auftrittBehebungBeispiel
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.
Per-second request limit exceeded (3/s). Starter: 5/s, 9 USD/month -> https://labelixa.com/pricing?amac=kota
Header: Retry-After: 1
X-Quota-Next-Plan: starter
X-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.
Daily quota insufficient: 3 operations left, this request needs 5 (daily 5000). Upgrade your plan to continue. Next plan: starter, 9 USD/month -> https://labelixa.com/pricing?amac=kota
Header: Retry-After: 3600
X-Quota-Action: yukselt
X-Quota-Reason: gunluk
X-Quota-Reset: 2026-10-28T00:00:00Z
X-RateLimit-Remaining: 3
X-Quota-Next-Plan: starter
X-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.
Monthly label quota insufficient: 40 labels left, this request needs 50 (monthly 20000). The quota renews on 2026-11-17T00:00:00Z; upgrade your plan to continue.
Header: Retry-After: 3600
X-Quota-Action: yukselt
X-Quota-Reason: aylik_etiket
X-Quota-Reset: 2026-11-17T00:00:00Z
429hiz_siniriZu 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.
{"hata": "Too many account creation attempts; try again later", "kod": "hiz_siniri"}
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).
{"hata": "Saved label limit reached (5/5)"}
Header: X-Quota-Action: upgrade
402DenemeDolduDie 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.
{"hata": "Free DirectPrint trial used up (25 labels). Upgrade to Starter or higher to continue.", "hata_tipi": "DenemeDoldu"}
Header: X-Quota-Action: upgrade
402TavanDolduDer 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.
{"hata": "This tenant's monthly BC print cap (500) is reached", "hata_tipi": "TavanDoldu"}
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

HTTPkod / hata_tipiWann er auftrittBehebungBeispiel
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.
{"hata": "If-Match is required (prevents lost updates)", "guncel_surum": 7, "etag": "\"7\""}
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.
{"hata": "The label changed in the meantime (version mismatch)", "guncel_surum": 8, "etag": "\"8\""}
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.
{"hata": "Same Idempotency-Key but a different request"}
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.
{"hata": "A previous request with the same Idempotency-Key is still being processed"}
Header: Retry-After: 2

5xx — Render-Budget und Dienst

HTTPkod / hata_tipiWann er auftrittBehebungBeispiel
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.
Render time limit exceeded
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.
Service temporarily unavailable
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.
{"hata": "Unexpected server error"}
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_tipiBedeutung
AdaptorYokVerbindungstyp nicht unterstützt (nichts gesendet)
AgentHatasiAgentenfehler
CihazEslenmemisDrucker im Agenten nicht zugeordnet (nichts gesendet)
GonderilmedenBirakildiDer Agent wurde vor dem Senden beendet (nichts wurde gesendet)
KimlikAlinamadiDruckeridentität konnte nicht gelesen werden (nichts gesendet)
KimlikUyusmazligiDruckeridentität stimmte nicht überein (nichts gesendet)
TeslimBelirsizZustellung ungewiss — vor einem erneuten Druck den Drucker prüfen
YaziciHatasiDruckerfehler (möglicherweise teilweise gedruckt)
ZplBulunamadiEtiketteninhalt 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üsselEnglischer Name
mesajmessage
ozetsummary
toplamtotal
alanlarfields
onizlemepreview
basliktitle
baslik_keytitle_key
yenireplacement
islemoperation
bicimformat
bankabank
veridata
komutcommand
onerisuggestion
parametreparameter
degervalue
hanedigits
verilengiven
dogrucorrect
beklenenexpected
gelenactual
uzunluklength
yolpath
genisliklabel_width
yuksekliklabel_height
bitisend
genprint_width
azamimaximum
desteklenensupported_dpi
tiptype
dillanguage
guvenconfidence
karmamixed
puanlarscores
kanitlarevidence
kodcode
satirline
ureticimanufacturer
kategoricategory
dil_posturlanguage_support
turtype
kaynak_urlsource_url
dogrulamaverification
cihaz_seridevice_serial
notnote
seviyelevel
gerekcelerreasons
boyut_kurali_varhas_size_rule
boyut_bulgularisize_findings
onizleme_kapsamipreview_coverage
desteklisupported
kismipartial
desteksizunsupported
yok_sayilanignored
bilinmiyorunknown
sinirlimitation
puanscore
puan_formuluscore_formula
degerlendirilenassessed
degerlendirilmeyennot_assessed
bolumlersections
notlarnotes
durumstatus
bulgularfindings
uyarilarwarnings
sebepreason
sozdizimisyntax
boyut_dpisize_dpi
yonorientation
barkodbarcode
gorsel_bellekgraphics_memory
is_davranisijob_behaviour
model_uyummodel_compatibility
komut_adedicommand_count
etiket_adedilabel_count
dondurulmus_alanrotated_fields
adetcount
komutlarcommands
indirilen_font_adedidownloaded_font_count
indirilen_font_baytdownloaded_font_bytes
ozel_font_cagrisicustom_font_calls
grafik_baytgraphic_bytes
grafik_adetgraphic_count
font_baytfont_bytes
font_adetfont_count
toplam_bayttotal_bytes
tavan_baytlimit_bytes
en_dotswidth_dots
boy_dotsheight_dots
boyut_kaynagisize_source
adaylarcandidates
en_inchwidth_in
boy_inchheight_in
en_mmwidth_mm
boy_mmheight_mm
standartstandard
tahmini_dpiestimated_dpi
tahmin_sebebiestimate_reason
kopyacopies
format_adediformat_count
sablon_adeditemplate_count
toplam_baskitotal_prints
tasma_olculen_formatoverflow_measured_formats
render_sinirirender_limit
etiketlerlabels
siraindex
alan_adedifield_count
barkod_adedibarcode_count
sablontemplate
tasan_alanoverflowing_fields
modellermodels
is_idjob_id
satir_sayisirow_count
sonucresult
denemeattempts
uretilenproduced
hatali_sayisifailed_count
hatalifailed
sorunlarproblems
adname
ciktioutput
olcusize
genislik_inwidth_in
yukseklik_inheight_in
kota_iadequota_refunded
islenenprocessed
islerjobs
hata_tipierror_type
baskiprint
gonderildisent
ucretlendicharged
basim_onaylandiprint_confirmed
etiketlabel_count
olculdumeasured
okunandecoded
nedenreason

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-WertEnglischer Wert
risk.leveldusuklow
ortamedium
yuksekhigh
risk.reasons[]nativenative
emulasyonemulation
dil_yokno_zpl_support
boyut_bulgususize_finding
model.categorymasaustudesktop
endustriyelindustrial
mobilmobile
language_support.typenativenative
emulasyonemulation
limitationrisk_analizirisk_analysis
evidence[].codezpl_xazpl_xa
zpl_xzzpl_xz
zpl_komut_yogunluguzpl_command_density
zpl_tildezpl_tilde
epl_metin_satiriepl_text_line
epl_barkod_satiriepl_barcode_line
epl_kontrol_satiriepl_control_line
tspl_mm_boyuttspl_mm_size
tspl_kelimetspl_keyword
cpcl_baslikcpcl_header
cpcl_kelimecpcl_keyword
sections.*.statustemizclean
bulgulufindings
degerlendirilmedinot_evaluated
assessed[]sozdizimisyntax
boyut_dpisize_dpi
yonorientation
barkodbarcode
fontfont
gorsel_bellekgraphics_memory
is_davranisijob_behaviour
model_uyummodel_compatibility
not_assessed[]sozdizimisyntax
boyut_dpisize_dpi
yonorientation
barkodbarcode
fontfont
gorsel_bellekgraphics_memory
is_davranisijob_behaviour
model_uyummodel_compatibility
sections.size_dpi.summary.size_sourcekomutcommand
alanlardanfrom_fields
karmamixed
oncekiprevious
sections.job_behaviour.summary.labels[].size_sourcekomutcommand
alanlardanfrom_fields
karmamixed
oncekiprevious
statusbekliyorqueued
calisiyorrunning
bittidone
hatafailed
iptalcancelled
jobs[].statusbekliyorqueued
calisiyorrunning
bittidone
hatafailed
iptalcancelled
jobs[].typetoplu_uretimbulk_production
result.failed[].problems[].codeeksikmissing
sayi_degilnot_a_number
sozdizimisyntax
temizlendisanitized
renderrender

Status von Massenaufträgen

Das Feld durum eines Massenauftrags ist einer von:

JSON-WertBedeutung
bekliyorIn der Warteschlange: wartet auf einen Worker. Ein fehlgeschlagener Versuch, der wiederholt wird, kehrt ebenfalls hierher zurück.
calisiyorLäuft.
bittiFertig: die Ausgabe kann heruntergeladen werden. Zeilen, die nicht erzeugt werden konnten, stehen im Ergebnisobjekt.
hataFehlgeschlagen: der letzte erlaubte Versuch ist gescheitert oder der Fehler ist nicht wiederholbar. Es folgen keine weiteren Versuche.
iptalAbgebrochen. 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-WertBedeutung
dusukNiedrig: das Modell verarbeitet ZPL nativ.
ortaMittel: das Modell verarbeitet ZPL über einen vom Hersteller dokumentierten Emulationsmodus.
yuksekHoch: 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üsselBedeutung
destekliUnterstützt: wird gezeichnet, keine bekannten Parametergrenzen.
kismiTeilweise: wird gezeichnet, mit einer dokumentierten Einschränkung.
yok_sayilanIgnoriert: erkannt und gemeldet, aber nicht gezeichnet (zum Beispiel RFID, das nur der Drucker schreibt).
desteksizNicht unterstützt: bekannter Befehl, wird nicht verarbeitet; die Diagnose warnt davor.
bilinmiyorUnbekannt: 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
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 — 8→12 dpmm
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.zpl

EPL2-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
curl -X POST "https://api.labelixa.com/v1/printers/8dpmm/labels/4x6/" \
     --data-binary @label.zpl -H "Accept: application/epl" \
     -D headers.txt > label.epl

Ausgehende 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 — Endpunkt registrieren
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.

Python — Prüfung
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.

MethodePfadBeschreibung
POST/v1/labelsSpeichert ein Etikett (201).
GET/v1/labelsListet 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}/restoreStellt aus dem Papierkorb wieder her.
POST/v1/labels/{id}/duplicateDupliziert (die Kopie ist ein Entwurf ohne Verlauf).
PUT/DELETE/v1/labels/{id}/favoriteFavoriten-Markierung.
PUT/DELETE/v1/labels/{id}/archiveArchivieren / aus dem Archiv holen.
POST/v1/labels/{id}/publishVeröffentlicht; 409 mit Befundliste bei ZPL-Fehlern.
POST/v1/labels/{id}/unpublishZurück zum Entwurf.
GET/v1/labels/{id}/versionsVersionsverlauf (ohne Inhalte).
GET/v1/labels/{id}/versions/{n}Vollständiger Inhalt einer Version.
POST/v1/labels/{id}/versions/{n}/restoreStellt eine Version wieder her (vorwärts: der Verlauf wird nie gelöscht).
GET/v1/labels/{id}/eventsPrüfprotokoll (Ereignistyp + Zeit; ohne Inhalte).
POST/v1/foldersErstellt einen Ordner (eine Ebene).
GET/v1/foldersOrdner + Etikettenzahlen.
PATCH/DELETE/v1/folders/{id}Benennt um / löscht (Inhalte wandern zur Wurzel, werden nicht gelöscht).
PUT/v1/labels/{id}/folderVerschiebt 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.

Drucken

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.

MethodePfadBeschreibung
POST/v1/devicesRegistriert 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/devicesListet Ihre registrierten Drucker.
DELETE/v1/devices/{id}Löscht ein Druckerprofil.
GET/v1/devices/{id}/statusWas 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/printStellt 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/jobsWird 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}/cancelStorniert 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.

StatusBedeutung
queuedAuftrag angenommen, wartet.
dispatchingWird an den Drucker übergeben.
dispatchedBytes an den Drucker übergeben. Das bedeutet NICHT, dass das Etikett gedruckt wurde.
failedÜbergabe fehlgeschlagen.
cancelledAuftrag abgebrochen.
uncertainDer 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:

FeldBedeutung
asamaWie weit der Auftrag kam: queued → delivered_to_agent → submitted_to_printer.
gonderilen_kopyaTatsächlich an den Drucker geschriebene Kopien. -1 bedeutet unbekannt — das ist NICHT dasselbe wie null.
yaziciya_giden_var_mitrue/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 -mdns listet die Netzwerkdrucker, die sich selbst ankündigen (Bonjour/mDNS), ohne ihnen etwas zu senden.
  • labelixa-agent import DATEI fügt viele Netzwerkdrucker auf einmal aus einer CSV-Datei hinzu, eine Zeile name,adresse[,gruppe] pro Drucker (-dry-run prüft die Datei vorher). Jede Zeile wird gemeldet; eine fehlerhafte Zeile stoppt die Datei nicht.
  • Ein erneutes setup auf 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.

  1. Registrieren Sie das Gerät mit adaptor: "os_driver" (POST /v1/devices).
  2. Ermitteln Sie auf dem Agent-Rechner den Namen der Warteschlange: labelixa-agent discover -queues.
  3. Ordnen Sie das Gerät der Warteschlange zu: labelixa-agent map-printer -device GERAETE_ID -queue "WARTESCHLANGE".
  4. 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.

MethodePfadBeschreibung
GET/v1/printops/dashboard?gun=7Sieben 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/alertsFü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/auditDruckprü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.

MethodePfadBeschreibung
POST/v1/bc/tenantsOrdnet 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/tenantsDie 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/printDer /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/dictionaryDas BC-Feldwörterbuch: Quelltyp → BC-Feld → Vorlagenvariable (Schreibweise item_number).
POST/v1/labels/starter-setFü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.

WerkzeugBeschreibung
zpl_previewRendert ZPL als PNG (dpmm/Größe/Index wählbar).
zpl_validatePrüft ZPL mit zeilen-/spaltengenauen Diagnosen.
barcode_pngErzeugt einen einzelnen Barcode als PNG.
save_labelSpeichert das Etikett im Konto; ohne API-Schlüssel wird es 24 Stunden gehalten und ein einmaliger Konto-Link zurückgegeben.
printer_language_to_zplWandelt 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
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.

MethodePfadBeschreibung
POST/v1/language-detectZPL / EPL / TSPL / CPCL erkennen
POST/v1/epl/renderEPL/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/diagnosticsEPL-Diagnose mit Zeilennummern
POST/v1/tspl/renderTSPL/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/diagnosticsTSPL-Diagnose mit Zeilennummern
POST/v1/cpcl/renderCPCL 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/diagnosticsCPCL-Diagnose mit Zeilennummern
POST/v1/compatibilityZPL-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.

MethodePfadBeschreibung
POST/v1/convert/sbpl-to-zplSATO SBPL → ZPL
POST/v1/convert/dpl-to-zplDatamax / Honeywell DPL → ZPL
POST/v1/convert/ipl-to-zplIntermec / Honeywell IPL → ZPL

Parameter

ParameterStandardBedeutung
dpmm8Zielauflö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

FeldBedeutung
zplDas umgewandelte ZPL (ein ^XA…^XZ-Block pro Etikett).
uyarilarListe der Warnungen auf Englisch: jeder Befehl oder Barcode, der nicht übertragen werden konnte, mit Handbuchseite.
kaynak_dilsbpl, dpl oder ipl — der aufgerufene Endpunkt.
birebirtrue nur, wenn die Warnliste leer ist.
X-Warnings-CountAntwort-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
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>"
JSON
{"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 (DPL)
curl -X POST "https://api.labelixa.com/v1/convert/dpl-to-zpl?dpmm=8&etiket_boyu_mm=101.6" \
     --data-binary @label.dpl

Nicht 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.

HTML
<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.

Run in Postman

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:

Markdown
[![ZPL validated with Labelixa](https://labelixa.com/static/badge-zpl-validated.svg)](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.