Migrar de la API de Labelary a OpenZPL
Para mover un cliente de Labelary v1 a OpenZPL, cambie el host de api.labelary.com a api.openzpl.com y mantenga las rutas, encabezados y cuerpos de solicitud. Luego revise los pocos códigos de estado y límites que difieren, listados a continuación junto con las pruebas que realizamos.
Actualizado 2026-10-20 · Renderizados hechos con el motor de OpenZPL
Abrir en el visor1. Cambiar el host
La ruta de renderización es la misma, por lo que solo cambia la URL base:
- https://api.labelary.com/v1/printers/8dpmm/labels/4x6/0/ + https://api.openzpl.com/v1/printers/8dpmm/labels/4x6/0/
curl https://api.openzpl.com/v1/printers/8dpmm/labels/4x6/0/ \ --data-binary @label.zpl > label.png curl https://api.openzpl.com/v1/printers/8dpmm/labels/4x6/ \ -H "Accept: application/pdf" --data-binary @labels.zpl > labels.pdf
En Python, mantén la URL base en una configuración para que puedas volver:
import os
import requests
BASE = os.environ.get("ZPL_API", "https://api.openzpl.com") # was https://api.labelary.com
def render_pdf(zpl: str, size: str = "4x6", dpmm: int = 8) -> bytes:
res = requests.post(
f"{BASE}/v1/printers/{dpmm}dpmm/labels/{size}/",
data=zpl.encode("utf-8"),
headers={"Accept": "application/pdf"},
timeout=15,
)
res.raise_for_status()
return res.content
2. Mantenga sus encabezados
Accept (image/png o application/pdf), X-Quality y X-Rotation funcionan como lo hacen en Labelary, y la respuesta lleva X-Total-Count. X-Page-Size, X-Page-Layout, X-Label-Border y X-Linter no están soportados: OpenZPL devuelve una etiqueta por página al tamaño de la etiqueta. Otros valores de Accept como application/epl devuelven 406.
3. Añada una clave si necesita más que el plan gratuito
El plan gratuito no necesita clave y está limitado por IP. Con una clave de su panel de control, envíela en X-API-Key y se aplican los límites de su espacio de trabajo. Un nombre de host privado de Labelary no tiene equivalente: todos usan api.openzpl.com.
curl https://api.openzpl.com/v1/printers/8dpmm/labels/4x6/0/ \ -H "X-API-Key: oz_live_…" --data-binary @label.zpl > label.png
4. Recuente sus límites
La cuota diaria de Labelary cuenta solicitudes; la de OpenZPL cuenta etiquetas. Si tus solicitudes devuelven PDFs con múltiples etiquetas, divide tus solicitudes diarias por las etiquetas por solicitud para ver qué cabe en 5,000 etiquetas, o en tu plan en la página de precios.
5. Manejar 429 y 503
En 429, espere los segundos en Retry-After: 1 para el límite por segundo, hasta la medianoche UTC para el diario. En 503 (una etiqueta con más de 10 segundos de tiempo de renderizado, o el servicio a plena capacidad), intente nuevamente una vez con un breve retraso.
import time
def post_with_retry(url, body, headers, attempts=3):
for _ in range(attempts):
res = requests.post(url, data=body, headers=headers, timeout=15)
if res.status_code == 429:
wait = int(res.headers.get("Retry-After", "1"))
if wait > 60:
res.raise_for_status() # daily allowance used up
time.sleep(wait)
continue
if res.status_code == 503:
time.sleep(1)
continue
res.raise_for_status()
return res
res.raise_for_status()
Lo que probamos
probado el 2026-10-20 con etiquetas sintéticas, la misma solicitud enviada a api.labelary.com (nivel gratuito) y al motor de OpenZPL. Comparamos códigos de estado, encabezados, conteos de páginas y tamaño de imagen, no píxeles.
| Solicitud | OpenZPL | Labelary |
|---|---|---|
| PNG, una etiqueta, 4 × 6 in a 8 dpmm | 200, 812 × 1218 px | 200, 812 × 1218 px |
| PNG a 12 dpmm | 200, 1216 × 1824 px | 200, 1216 × 1824 px |
| PDF, una etiqueta | 200, 1 página | 200, 1 página |
PDF, sin índice, 2 formatos con ^PQ2 en el segundo | 200, 3 páginas, X-Total-Count: 3 | 200, 3 páginas, X-Total-Count: 3 |
| PNG, índice 2 de 3 | 200 | 200 |
| Índice 5 de 1 | 404, X-Total-Count: 1 | 404, X-Total-Count: 1 |
^XA^XZ sin campos | 404, X-Total-Count: 0 | 404, X-Total-Count: 0 |
Accept: application/x-nope | 406 | 406 |
Accept: application/epl | 406 | 200, EPL |
X-Rotation: 90 | 200, 1218 × 812 px | 200, 1218 × 812 px |
X-Quality: Bitonal | 200, PNG de 1 bit | 200, PNG de 1 bit |
^GFA imagen, 32 × 32 puntos | 200, misma posición | 200, misma posición |
^CI28 con texto acentuado | 200 | 200 |
| Etiqueta 16 en ancha | 400 | 400 |
Diferencias a tener en cuenta
- Los formatos de salida distintos a PNG y PDF responden con
406; mantenga esas solicitudes en Labelary o elimínelas. - Los píxeles pueden diferir donde las fuentes difieren. Compare imágenes visualmente o por la posición de campos clave, no byte por byte.
- Los textos de error difieren. Ambos comienzan con
ERROR:; no se comparan en el resto. - Los comandos que el motor no admite aún se imprimen de manera diferente o no se imprimen en absoluto; consulte compatibilidad.
Revirtiendo
Dado que nada más cambia, revertir es restablecer la URL base a api.labelary.com nuevamente. Mantenlo en la configuración, no en el código, y cambia primero una parte del tráfico: renderiza un día de etiquetas reales en ambos, compara una muestra, luego mueve el resto.
Preguntas
¿Tengo que cambiar mi ZPL?
No. El ZPL va en el cuerpo o en la URL exactamente como antes.
¿OpenZPL guarda mis etiquetas?
No. La API renderiza la etiqueta y la devuelve; el ZPL no se almacena. Las solicitudes de claves de API se cuentan para el panel de uso sin su contenido.