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.
Antes do primeiro envio
- Crie a conta. São 14 dias de teste grátis, sem cartão.
- 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.
- Marque as impressoras que a bancada vai usar. Cada uma ganha um id.
- 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.
Node.js e TypeScript
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();PHP
$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);C# e .NET
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();Python
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()Delphi
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;Respostas e erros
202: trabalho aceito. O corpo trazid,statuse o seuexternal_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. Usecontent_url.422: corpo inválido, por exemplo semcontentnemcontent_url.429: limite de requisições. Espere o tempo do cabeçalhoRetry-Aftere mande de novo com a mesmaidempotency_key.
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.
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.