Exemplos de integração da API de impressão

Atualizado em 30/10/2026

Todos os exemplos fazem a mesma coisa: mandam uma etiqueta ZPL para a impressora com id em TAGU_ZEBRA, usando a chave em TAGU_KEY. Para PDF, troque format para pdf e mande o arquivo em base64 ou em content_url.

01

Antes do primeiro envio

  1. Crie a conta. São 14 dias de teste grátis, sem cartão.
  2. Instale o agente na bancada que tem a impressora (tagu-setup.exe, Windows 10 ou 11) e aprove o código que ele mostra no painel.
  3. Marque as impressoras que a bancada vai usar. Cada uma ganha um id.
  4. Em Chaves de API, crie uma chave para o seu sistema. Ela começa com tg_live_ e aparece uma vez só: guarde num cofre ou variável de ambiente.
02

Node.js e TypeScript

Node.js 18+
const res = await fetch("https://api.tagu.com.br/v1/jobs", {
  method: "POST",
  headers: {
    Authorization: `Bearer ${process.env.TAGU_KEY}`,
    "Content-Type": "application/json",
  },
  body: JSON.stringify({
    printer_id: process.env.TAGU_ZEBRA,
    format: "zpl",
    content: Buffer.from(zpl).toString("base64"),
    external_ref: pedido.numero,
    idempotency_key: `etiqueta-${pedido.numero}`,
  }),
});
if (!res.ok) throw new Error(`Tagu respondeu ${res.status}: ${await res.text()}`);
const job = await res.json();
03

PHP

PHP com cURL
$ch = curl_init("https://api.tagu.com.br/v1/jobs");
curl_setopt_array($ch, [
    CURLOPT_POST => true,
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_HTTPHEADER => [
        "Authorization: Bearer " . getenv("TAGU_KEY"),
        "Content-Type: application/json",
    ],
    CURLOPT_POSTFIELDS => json_encode([
        "printer_id" => getenv("TAGU_ZEBRA"),
        "format" => "zpl",
        "content" => base64_encode($zpl),
        "external_ref" => $pedido["numero"],
        "idempotency_key" => "etiqueta-" . $pedido["numero"],
    ]),
]);
$job = json_decode(curl_exec($ch), true);
$status = curl_getinfo($ch, CURLINFO_HTTP_CODE);
curl_close($ch);
04

C# e .NET

.NET 6+
using System.Net.Http.Json;
using System.Text;

var http = new HttpClient { BaseAddress = new Uri("https://api.tagu.com.br") };
http.DefaultRequestHeaders.Authorization =
    new("Bearer", Environment.GetEnvironmentVariable("TAGU_KEY"));

var res = await http.PostAsJsonAsync("/v1/jobs", new
{
    printer_id = Environment.GetEnvironmentVariable("TAGU_ZEBRA"),
    format = "zpl",
    content = Convert.ToBase64String(Encoding.UTF8.GetBytes(zpl)),
    external_ref = pedido.Numero,
    idempotency_key = $"etiqueta-{pedido.Numero}",
});
res.EnsureSuccessStatusCode();
05

Python

Python com requests
import base64, os, requests

res = requests.post(
    "https://api.tagu.com.br/v1/jobs",
    headers={"Authorization": f"Bearer {os.environ['TAGU_KEY']}"},
    json={
        "printer_id": os.environ["TAGU_ZEBRA"],
        "format": "zpl",
        "content": base64.b64encode(zpl.encode()).decode(),
        "external_ref": pedido["numero"],
        "idempotency_key": f"etiqueta-{pedido['numero']}",
    },
    timeout=15,
)
res.raise_for_status()
job = res.json()
06

Delphi

Delphi 10.3+
uses
  System.SysUtils, System.Classes, System.JSON, System.NetEncoding,
  System.Net.HttpClient, System.Net.URLClient;

procedure ImprimirEtiqueta(const Zpl, Pedido: string);
var
  Http: THTTPClient;
  Body: TJSONObject;
  Stream: TStringStream;
  Res: IHTTPResponse;
begin
  Http := THTTPClient.Create;
  Body := TJSONObject.Create;
  try
    Body.AddPair('printer_id', GetEnvironmentVariable('TAGU_ZEBRA'));
    Body.AddPair('format', 'zpl');
    Body.AddPair('content', TNetEncoding.Base64String.Encode(Zpl));
    Body.AddPair('external_ref', Pedido);
    Body.AddPair('idempotency_key', 'etiqueta-' + Pedido);
    Stream := TStringStream.Create(Body.ToJSON, TEncoding.UTF8);
    try
      Res := Http.Post('https://api.tagu.com.br/v1/jobs', Stream, nil, [
        TNetHeader.Create('Authorization', 'Bearer ' + GetEnvironmentVariable('TAGU_KEY')),
        TNetHeader.Create('Content-Type', 'application/json')
      ]);
      if Res.StatusCode >= 300 then
        raise Exception.Create('Tagu: ' + Res.ContentAsString);
    finally
      Stream.Free;
    end;
  finally
    Body.Free;
    Http.Free;
  end;
end;
07

Respostas e erros

  • 202: trabalho aceito. O corpo traz id, status e o seu external_ref.
  • 401: chave ausente, errada ou revogada.
  • 402: limite do plano atingido ou assinatura vencida.
  • 404: a impressora não existe nesta conta.
  • 413: conteúdo acima de 16 MB. Use content_url.
  • 422: corpo inválido, por exemplo sem content nem content_url.
  • 429: limite de requisições. Espere o tempo do cabeçalho Retry-After e mande de novo com a mesma idempotency_key.
08

Referência completa

Todos os campos, filtros da fila, reimpressão e cancelamento estão na documentação da API, gerada a partir do código e sempre em dia.

09

Perguntas frequentes

Qual linguagem a API do Tagu aceita?
Qualquer uma que faça uma requisição HTTPS com JSON. A API é REST, com autenticação por chave no cabeçalho Authorization.
Posso repetir a chamada se der timeout?
Sim. Mande a mesma idempotency_key e o Tagu devolve o trabalho que já existe, sem imprimir de novo.

Teste 14 dias grátis.

API de impressão: exemplos em Node.js, PHP, C#, Python e Delphi · Tagu