Recursos
Exemplos Completos
Exemplos de código prontos para copiar e usar na sua integração.
Node.js - Sincronização de Vouchers
Script que busca vouchers novos, processa e mantém a sincronização automática:
sync-vouchers.js
const API_KEY = process.env.OMNI_API_KEY;
const BASE_URL = process.env.OMNI_BASE_URL; // ex: https://sua-plataforma.com.br
async function syncVouchers() {
console.log("Buscando vouchers não sincronizados...");
const res = await fetch(
`${BASE_URL}/api-vouchers?sincronizado=false`,
{
headers: {
"X-API-Key": API_KEY,
"Content-Type": "application/json",
},
}
);
if (!res.ok) {
console.error("Erro:", res.status, await res.text());
return;
}
const { pedidos, pagination } = await res.json();
console.log(`Encontrados ${pagination.total_pedidos} pedidos, ${pagination.total_pessoas} pessoas`);
for (const pedido of pedidos) {
console.log(`Pedido ${pedido.numero_pedido} - ${pedido.cliente.nome}`);
for (const lote of pedido.lotes) {
console.log(` Lote: ${lote.nome_lote} (x${lote.quantidade})`);
for (const pessoa of lote.pessoas) {
console.log(` -> ${pessoa.nome} | QR: ${pessoa.qr_code}`);
// Aqui você processaria no seu sistema:
// await seuSistema.salvarVoucher({
// qrCode: pessoa.qr_code,
// nome: pessoa.nome,
// cpf: pessoa.cpf,
// dataUso: lote.data_uso,
// lote: lote.nome_lote,
// });
}
}
}
console.log("Sincronização concluída!");
}
// Executar a cada 5 minutos
setInterval(syncVouchers, 5 * 60 * 1000);
syncVouchers();Python - Check-in via Catraca
Script para integrar com catracas ou leitores de QR Code:
catraca_checkin.py
import requests
import os
API_KEY = os.environ["OMNI_API_KEY"]
BASE_URL = os.environ["OMNI_BASE_URL"]
TERMINAL = "Catraca Principal"
OPERADOR = "Sistema Automatizado"
def checkin(qr_code: str) -> dict:
"""Realiza check-in e retorna dados do visitante."""
res = requests.post(
f"{BASE_URL}/api-qrcode-checkin",
json={
"qr_code": qr_code,
"terminal": TERMINAL,
"operador": OPERADOR,
},
headers={"X-API-Key": API_KEY},
)
if res.status_code == 200:
data = res.json()[0]
return {
"sucesso": True,
"nome": data["visitante"]["nome"],
"ingresso": data["ingresso"]["nome"],
"lote": data["lote"]["nome"],
"categoria": data["categoria"]["nome"],
}
elif res.status_code == 409:
err = res.json()
return {
"sucesso": False,
"motivo": "ja_utilizado",
"mensagem": err["message"],
}
elif res.status_code == 404:
return {
"sucesso": False,
"motivo": "nao_encontrado",
"mensagem": "QR Code inválido",
}
else:
return {
"sucesso": False,
"motivo": "erro",
"mensagem": f"Erro {res.status_code}: {res.text}",
}
# Exemplo de uso:
if __name__ == "__main__":
resultado = checkin("20260415-3904")
if resultado["sucesso"]:
print(f"Bem-vindo, {resultado['nome']}!")
print(f"Ingresso: {resultado['ingresso']} - {resultado['lote']}")
else:
print(f"Bloqueado: {resultado['mensagem']}")Node.js - Receber Webhooks
Endpoint Express.js para receber e validar webhooks:
webhook-receiver.js
const express = require("express");
const crypto = require("crypto");
const app = express();
app.use(express.json());
const WEBHOOK_SECRET = process.env.OMNI_WEBHOOK_SECRET;
function validateSignature(body, signature) {
const expected = crypto
.createHmac("sha256", WEBHOOK_SECRET)
.update(JSON.stringify(body))
.digest("hex");
return crypto.timingSafeEqual(
Buffer.from(signature || ""),
Buffer.from(expected)
);
}
app.post("/webhook/omniticketz", (req, res) => {
// 1. Validar assinatura HMAC
const signature = req.headers["x-webhook-signature"];
if (!validateSignature(req.body, signature)) {
console.error("Assinatura inválida!");
return res.status(401).json({ error: "Invalid signature" });
}
// 2. Processar evento
const { evento, dados } = req.body;
switch (evento) {
case "pedido.pago":
console.log(`Pedido pago: ${dados.numero_pedido}`);
console.log(`Cliente: ${dados.cliente.nome}`);
console.log(`Total: R$ ${dados.total}`);
// Processar no seu sistema...
break;
default:
console.log(`Evento desconhecido: ${evento}`);
}
// 3. Responder rapidamente
res.status(200).json({ received: true });
});
app.listen(3001, () => {
console.log("Webhook receiver rodando na porta 3001");
});Paginação - Buscar Todos os Registros
Exemplo de como iterar por todas as páginas de resultados:
paginate-all.js
async function fetchAllClientes(apiKey, baseUrl) {
const allClientes = [];
let offset = 0;
const limit = 100;
let hasMore = true;
while (hasMore) {
const res = await fetch(
`${baseUrl}/api-clientes?limit=${limit}&offset=${offset}&marcar_sincronizado=false`,
{ headers: { "X-API-Key": apiKey } }
);
const { data, pagination } = await res.json();
allClientes.push(...data);
hasMore = pagination.has_more;
offset += limit;
console.log(`Carregados ${allClientes.length} de ${pagination.total}`);
}
return allClientes;
}Dica de Performance
Use
?marcar_sincronizado=false em buscas de paginação completa para não marcar todos como sincronizados acidentalmente. Só use a marcação automática no seu fluxo real de sincronização.