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.
    OmniTicketz API Documentation