Skip to main content
POST
Devuelve un recibo que ya viene maquetado: cada línea llega rellenada al ancho del papel, con las etiquetas, el formato de moneda, las fechas en la zona horaria de la tienda y lo que exija el fisco del país, todo resuelto del lado de Fire. Tu caja no interpreta reglas de negocio. Recibe una lista de tipos de línea — texto, separador, banda invertida, código, corte — y los dibuja. Eso es deliberado: hay muchas cajas distintas en la calle, y una regla que vive en cada una de ellas es una regla que se desincroniza.
El reporte de fin de día tiene su propio endpoint, porque su sujeto es un día de negocio y no una venta: mirá Imprimir el cierre de día.

Si hay orden, hay papel

El endpoint no va a dejar a un cajero sin recibo por algo que Fire puede resolver solo:
  • ¿No hay plantilla configurada? Cae a la plantilla del account, y después a la genérica de Fire. Te llega template.source: "seed" y un warning TEMPLATE_FELL_BACK_TO_SEED, no un error.
  • ¿La plantilla no se puede leer? El mismo fallback, más TEMPLATE_UNREADABLE.
  • ¿El fisco todavía no contestó? El papel se imprime sin el número fiscal, y freshness.fiscal te dice que sigue en pending.
Lo que sí falla es no encontrar el sujeto, o pedir un documento que no aplica — imprimir esos sería inventarlos.

Autenticación

string
required
Tu API key de Fire con scope printing:read. La key debe ser vendor-scoped — las keys system-only se rechazan con 403.printing:read está separado de orders:read a propósito: una key que inyecta órdenes no tiene motivo para bajar recibos, y las dos necesitan poder revocarse por separado.
printing:read es un scope nuevo. Las keys existentes no lo tienen — otorgalo en el dashboard de Fire antes de tu primera llamada, o cada request vuelve 403 con la lista de scopes que la key sí tiene.

Path parameters

string
required
El UUID de la orden o su código de orden. La orden se busca dentro del vendor de tu key, así que una orden de otro vendor sencillamente no existe para vos.
string
required
invoice, credit_note o kitchen.day_close se rechaza acá con PRINT_WRONG_SUBJECT: un cierre de día no sale de una venta.

Cuerpo

object
required
El papel que la caja tiene adelante.
number
Ancho de la columna de etiquetas en las filas etiqueta/valor, entre 6 y 24. Omitilo y el motor elige uno según el contenido.
number
Cuántas copias idénticas imprimir, de 1 a 5. Default 1. Fire no repite las líneas — te dice cuántas veces mandarlas.
number
Reimprimí con la versión de plantilla con la que el recibo salió originalmente, en vez de la que está publicada hoy.
string
A qué plantilla pertenece esa versión. Mandalo junto con templateVersion.“Versión 3” no identifica un recibo por sí sola: la plantilla asignada a la tienda puede haber cambiado desde que se imprimió, y la versión 3 de otra plantilla es un recibo que nunca existió. Tomalo de template.templateId en la respuesta original. Si mandás templateVersion sin él, el papel igual sale, con un warning TEMPLATE_VERSION_AMBIGUOUS.

Respuesta

string
Siempre print.v1. Solo cambia si algo rompe cajas que ya están en la calle — los tipos de línea nuevos y los campos nuevos son aditivos y no lo mueven.
string
Identifica esta entrega. Hoy no se te pide nada con él: existe porque pedir un recibo e imprimirlo no son el mismo evento — una impresora con cola contesta “listo” antes de que haya tinta en el papel — y el día que haya que confirmar la impresión, no hay forma de correlacionar nada sin un identificador que haya venido del origen.
string
invoice, credit_note o kitchen, repitiendo lo que pediste.
object
De qué se trata el papel.
object
Qué plantilla produjo este papel. Guardalo: es lo que te permite reimprimir el mismo recibo después, y lo que le permite a soporte contestar “por qué este salió distinto”.
object
El recibo propiamente dicho.
object
Si este papel es definitivo, y si cambió desde la última vez que preguntaste.
string[]
Cosas que vale la pena loguear y que no impidieron que el recibo se imprimiera. Ignorá cualquier código que no reconozcas — la lista crece.

El vocabulario de líneas

paper.lines es el recibo entero. Cada entrada tiene una t y dibuja una cosa. Ignorá una t que no conozcas — eso es lo que le permite a Fire agregar tipos de línea sin romper cajas ya desplegadas.
{ "t": "text", "s": string, "bold"?: true }
Una línea de texto, ya rellenada al ancho del papel. Imprimí s tal cual; no la recortes, ni la alinees, ni la vuelvas a rellenar.
{ "t": "rule", "ch": string, "s": string }
Un separador. s ya viene expandido al ancho completo — no hay nada que calcular. ch es el carácter con el que se armó, si lo necesitás.
{ "t": "band", "lines": [{ "text": string, "big": boolean }], "plain"?: true }
El bloque que se lee desde el otro lado del mostrador — el número de retiro. Imprimilo en blanco sobre negro (GS B 1) y con las entradas "big": true a doble tamaño (GS ! 0x11), salvo que plain sea true, en cuyo caso imprimilo sin invertir. Ese flag viene de la plantilla: el estilo es una decisión del documento, no de la caja.
{ "t": "code", "content": string, "symbology": string, "key": string, "ecLevel"?: "l" | "m" | "q" | "h" }
Un código para imprimir — el QR de una NFC-e, la clave de acceso de una factura ecuatoriana. Fire manda el contenido y la simbología, no una imagen: el tamaño depende del dispositivo, así que lo dibuja la impresora. ecLevel es el nivel de corrección de errores del QR que eligió la plantilla.
{ "t": "blank" }
Una línea vacía.
{ "t": "cut", "partial"?: boolean }
Cortá el papel (GS V). Viene del documento, no de tu caja: dónde termina un recibo es parte del recibo.
{ "t": "drawer" }
Abrí el cajón de dinero (ESC p). El mismo razonamiento.

Errores

Notas

¿Por qué POST para algo de solo lectura? El request lleva el papel de la impresora, y el recibo depende del estado fiscal. Un GET lo cachearía alguien por URL en el camino, y un recibo cacheado es un recibo que puede estar mintiendo sobre si el fisco lo autorizó. Esta llamada no persiste nada.
El modelo de impresora no es parte del request. Fire necesita el ancho, porque la maqueta se calcula en columnas. Todo lo demás del dispositivo — code page, si puede dibujar un QR nativamente, si hay que transliterar los acentos — es el perfil de tu caja y se queda de tu lado. Por eso charset siempre vuelve utf-8.
Reimprimir honestamente. Guardá freshness.fingerprint y template.templateId / template.version junto a cada recibo impreso. Para reimprimir exactamente lo que recibió el cliente, mandá templateId y templateVersion. Para averiguar si hay algo nuevo para imprimir, volvé a preguntar y compará fingerprints.