Skip to main content
POST
Retorna um cupom que já vem diagramado: cada linha chega preenchida até a largura do papel, com os rótulos, o formato da moeda, as datas no fuso horário da loja e o que o fisco do país exigir, tudo resolvido do lado do Fire. Seu caixa não interpreta regras de negócio. Ele recebe uma lista de tipos de linha — texto, separador, faixa invertida, código, corte — e os desenha. Isso é deliberado: existem muitos caixas diferentes em campo, e uma regra que mora dentro de cada um deles é uma regra que sai de sincronia.
O relatório de fim do dia tem seu próprio endpoint, porque o assunto dele é um dia de negócio e não uma venda: veja Imprimir o fechamento do dia.

Se existe pedido, existe papel

O endpoint não vai deixar um operador de caixa sem cupom por algo que o Fire consegue resolver sozinho:
  • Nenhum template configurado? Ele cai para o template do account, e depois para o genérico do Fire. Você recebe template.source: "seed" e um aviso TEMPLATE_FELL_BACK_TO_SEED, não um erro.
  • Template ilegível? O mesmo fallback, mais TEMPLATE_UNREADABLE.
  • O fisco ainda não respondeu? O papel é impresso sem o número fiscal, e freshness.fiscal informa que ele continua pending.
O que de fato falha é não encontrar o assunto, ou pedir um documento que não se aplica — imprimir esses seria inventá-los.

Autenticação

string
required
Sua API key do Fire com scope printing:read. A key deve ser vendor-scoped — keys system-only são rejeitadas com 403.printing:read é separado de orders:read de propósito: uma key que injeta pedidos não tem motivo para baixar cupons, e as duas precisam poder ser revogadas de forma independente.
printing:read é um scope novo. As keys existentes não o possuem — conceda-o no dashboard do Fire antes da sua primeira chamada, ou toda requisição volta 403 com a lista de scopes que a key de fato carrega.

Path parameters

string
required
O UUID do pedido ou seu código de pedido. O pedido é buscado dentro do vendor da sua key, então um pedido de outro vendor simplesmente não existe para você.
string
required
invoice, credit_note ou kitchen.day_close é rejeitado aqui com PRINT_WRONG_SUBJECT: um fechamento do dia não nasce de uma venda.

Corpo

object
required
O papel que o caixa tem na frente.
number
Largura da coluna de rótulos nas linhas rótulo/valor, entre 6 e 24. Omita e o motor escolhe uma com base no conteúdo.
number
Quantas cópias idênticas imprimir, de 1 a 5. Default 1. O Fire não repete as linhas — ele diz quantas vezes enviá-las.
number
Reimprima com a versão de template com que o cupom saiu originalmente, em vez da publicada hoje.
string
A qual template aquela versão pertence. Envie junto com templateVersion.“Versão 3” não identifica um cupom sozinha: o template atribuído à loja pode ter mudado desde que ele foi impresso, e a versão 3 de outro template é um cupom que nunca existiu. Pegue de template.templateId na resposta original. Se você enviar templateVersion sem ele, o papel sai mesmo assim, com um aviso TEMPLATE_VERSION_AMBIGUOUS.

Resposta

string
Sempre print.v1. Só muda se algo quebrar caixas que já estão em campo — novos tipos de linha e novos campos são aditivos e não o movem.
string
Identifica esta entrega. Hoje nada é exigido de você: ele existe porque pedir um cupom e imprimi-lo não são o mesmo evento — uma impressora com fila responde “pronto” antes de haver tinta no papel — e no dia em que a impressão tiver que ser confirmada, não há como correlacionar nada sem um identificador que tenha vindo da origem.
string
invoice, credit_note ou kitchen, ecoando o que você pediu.
object
Do que o papel trata.
object
Qual template produziu este papel. Guarde: é o que permite reimprimir o mesmo cupom depois, e o que permite ao suporte responder “por que este saiu diferente”.
object
O cupom em si.
object
Se este papel é definitivo, e se mudou desde a última vez que você perguntou.
string[]
Coisas que vale a pena logar e que não impediram o cupom de ser impresso. Ignore qualquer código que você não reconheça — a lista cresce.

O vocabulário de linhas

paper.lines é o cupom inteiro. Cada entrada tem um t e desenha uma coisa. Ignore um t que você não conheça — é isso que permite ao Fire adicionar tipos de linha sem quebrar caixas já instalados.
{ "t": "text", "s": string, "bold"?: true }
Uma linha de texto, já preenchida até a largura do papel. Imprima s como está; não corte, não alinhe e não preencha de novo.
{ "t": "rule", "ch": string, "s": string }
Um separador. s já vem expandido até a largura completa — não há nada a calcular. ch é o caractere com que foi montado, se você precisar.
{ "t": "band", "lines": [{ "text": string, "big": boolean }], "plain"?: true }
O bloco que é lido do outro lado do balcão — o número de retirada. Imprima em branco sobre preto (GS B 1) e em tamanho dobrado as entradas com "big": true (GS ! 0x11), exceto quando plain for true, caso em que imprima sem inverter. Esse flag vem do template: o estilo é uma decisão do documento, não do caixa.
{ "t": "code", "content": string, "symbology": string, "key": string, "ecLevel"?: "l" | "m" | "q" | "h" }
Um código para imprimir — o QR de uma NFC-e, a chave de acesso de uma nota equatoriana. O Fire envia o conteúdo e a simbologia, não uma imagem: o tamanho depende do dispositivo, então quem desenha é a impressora. ecLevel é o nível de correção de erros do QR que o template escolheu.
{ "t": "blank" }
Uma linha em branco.
{ "t": "cut", "partial"?: boolean }
Corte o papel (GS V). Vem do documento, não do seu caixa: onde um cupom termina faz parte do cupom.
{ "t": "drawer" }
Abra a gaveta de dinheiro (ESC p). Mesmo raciocínio.

Erros

Notas

Por que POST para algo somente de leitura? A requisição carrega o papel da impressora, e o cupom depende do estado fiscal. Um GET seria cacheado por URL em algum ponto do caminho, e um cupom cacheado é um cupom que pode estar mentindo sobre se o fisco o autorizou. Esta chamada não persiste nada.
O modelo da impressora não faz parte da requisição. O Fire precisa da largura, porque a diagramação é calculada em colunas. Todo o resto do dispositivo — code page, se ele desenha um QR nativamente, se os acentos precisam ser transliterados — é o perfil do seu caixa e fica do seu lado. É por isso que charset sempre volta utf-8.
Reimprimir com honestidade. Guarde freshness.fingerprint e template.templateId / template.version junto de cada cupom impresso. Para reimprimir exatamente o que o cliente recebeu, envie templateId e templateVersion. Para descobrir se há algo novo a imprimir, pergunte de novo e compare os fingerprints.