OmniTicketz

    Vouchers

    GET

    Liste pedidos com vouchers agrupados por cliente e lotes. Estrutura achatada por pessoa (qr_code + campos do formulário) e marcação automática de sincronização.

    GET/api/v1/api-vouchers

    Lista pedidos com vouchers agrupados por cliente e lotes.

    Sincronização Automática
    Por padrão, os vouchers retornados são automaticamente marcados como sincronizados para sua API Key. Use ?marcar_sincronizado=false para apenas consultar sem marcar.
    Estrutura achatada por pessoa (v2)
    Cada item de lote.dados[] traz qr_code + os campos do formulário do ingresso usando o label definido pelo admin (ex: "Nome Completo", "CPF", "RG", "Matricula"). Chaves só aparecem se o valor estiver preenchido. Tenants sem form_config recebem labels padrão (Nome, CPF, Data de Nascimento, Email, Telefone) — também só com valores presentes.
    IDs Fixos para Integração Externa
    Cada lote inclui identificadores que representam o produto cadastrado, não a venda individual:
    • ingresso_id — ID do tipo de ingresso (ex: "Ingresso - DayUse").
    • lote_mestre_id — ID da variação/lote (ex: "Adulto (11 anos ou mais)").
    • categoria — Tipo público: adulto, infantil ou outros.
    • valor_unitario — Preço por ingresso desse lote.
    Esses IDs são sempre os mesmos para o mesmo produto, independente do pedido, do cliente ou da data de uso.
    Objeto pagamento — breakdown monetário (v2.4)
    Todo pedido traz pagamento.valores com a composição do preço. Os 3 totais no topo fecham a conta:
    total_bruto         209.70    (soma de cada ingresso pelo preço cheio)
    total_desconto       76.89    (soma de TODOS os descontos − acréscimos)
    total_pago          132.81    (= total_bruto − total_desconto)
    Em seguida vem o detalhamento de cada desconto/acréscimo:
    total_bruto                       209.70
    - desconto_promocao.valor          69.90    (promo de item: brindes, %, fixa)
    = subtotal                        139.80
    - desconto_pagamento.valor          6.99    (promo de forma: ex: 5% no PIX)
    + acrescimo_pagamento.valor         (0)     (ex: acréscimo de cartão parcelado)
    = total_pago                      132.81
    + valor_estornado                   (0)     (em estornos parciais)
    desconto_pagamento e acrescimo_pagamento são mutuamente exclusivos: um dos dois é sempre null. Ambos null = forma de pagamento sem ajuste (ex: cartão à vista sem desconto/acréscimo).
    Cancelamentos e reembolsos reaparecem na sincronização
    Pedidos com status cancelado ou reembolsado entram na resposta da API junto com os pagos. Quando um pedido é cancelado/reembolsado no painel, seus vouchers são automaticamente dessincronizados para todas as API Keys — ou seja, eles voltam a aparecer na próxima chamada com ?sincronizado=false, agora carregando status: "cancelado" (ou "reembolsado").

    Use o campo status para reagir no seu sistema: estornar acesso, invalidar QR codes, atualizar contagens, notificar cozinha/operação, etc. Os QR codes continuam vindo no payload — não os invalide cegamente, apenas com base no status do pedido.

    Autenticação

    Permissão necessária: vouchers:read

    Parâmetros

    Filtros

    ParâmetroTipoDescrição
    numero_pedido
    stringBusca exata por número do pedido (ex: 20260105-0001)
    sincronizado
    booleantrue/false — Filtrar por status de sincronização
    data_uso
    stringYYYY-MM-DD — Filtrar por data de uso do ingresso
    checkin_realizado
    booleantrue/false — Filtrar por status de check-in
    marcar_sincronizado
    booleanMarcar vouchers retornados como sincronizados
    limit
    numberItens por página (máx: 1000)
    offset
    numberPular N registros

    Ordenação

    ParâmetroTipoDescrição
    order_by
    stringCampo: pago_em (data do pagamento) ou created_at
    order
    stringDireção: desc ou asc

    Outros Exemplos

    Buscar por número do pedido

    curl -X GET "https://api.omniticketz.com/v1/api-vouchers?numero_pedido=20260105-0001" \
      -H "X-API-Key: sk_live_SUA_CHAVE_AQUI"

    Vouchers sem check-in

    curl -X GET "https://api.omniticketz.com/v1/api-vouchers?checkin_realizado=false&marcar_sincronizado=false" \
      -H "X-API-Key: sk_live_SUA_CHAVE_AQUI"

    Campos da Resposta

    Pedido (chaves no topo)

    ParâmetroTipoDescrição
    numero_pedido
    stringIdentificador do pedido (ex: 20260218-0004)
    status
    stringStatus do pedido: pago, cancelado ou reembolsado. Veja Callout abaixo sobre cancelamentos
    pago_em
    stringData/hora do pagamento (ISO 8601). null se origem balcão sem pagamento ou se o pedido foi cancelado antes de pagar
    origem
    stringCanal da venda: online, balcao, central ou afiliado_pdv
    pagamento
    objectTudo financeiro num lugar só: breakdown monetário em 5 etapas (pagamento.valores). Ver tabela Pagamento
    cupom
    object | nullDados do cupom usado: { codigo, nome }. null se sem cupom
    cliente
    objectDados do comprador (ver tabela Cliente)
    lotes
    arrayLista de combinações lote × data (ver tabela Lote)
    total_pessoas
    numberTotal de pessoas/ingressos no pedido
    total_lotes
    numberQuantidade de combinações lote × data no pedido
    sincronizado
    booleantrue se TODOS os vouchers do pedido foram sincronizados via esta API Key
    adicionais
    arrayLista de adicionais comprados. Aparece SOMENTE quando o pedido tem adicionais

    Pagamento (pedido.pagamento)

    ParâmetroTipoDescrição
    valores
    objectBreakdown monetário completo do pedido (ver tabela Valores)

    Valores (pedido.pagamento.valores) — composição do preço

    ParâmetroTipoDescrição
    total_bruto
    numberResumo (1/3): soma de TODOS os ingressos pelo preço cheio + adicionais. É o que o cliente pagaria sem nenhuma promoção
    total_desconto
    numberResumo (2/3): soma de TODOS os descontos do pedido menos acréscimos (= desconto_promocao + desconto_pagamento − acrescimo_pagamento). 0 quando não há nenhum ajuste
    total_pago
    numberResumo (3/3): total que o cliente efetivamente pagou (= total_bruto − total_desconto). Considera estornos parciais
    desconto_promocao
    object | nullDetalhe: desconto aplicado por promoção de item (compre N ganhe M, percentual em ingressos, etc). null quando não há promo de item. Ver tabela DescontoPromocao
    subtotal
    numberDetalhe: = total_bruto − desconto_promocao.valor. Valor antes do ajuste por forma de pagamento
    desconto_pagamento
    object | nullDetalhe: desconto vindo da forma de pagamento (ex: 5% no PIX). null se não houve desconto OU se houve acréscimo. Mutuamente exclusivo com acrescimo_pagamento. Ver tabela DescontoPagamento
    acrescimo_pagamento
    object | nullDetalhe: acréscimo vindo da forma de pagamento (ex: cartão parcelado com juros). null se não houve acréscimo OU se houve desconto. Mutuamente exclusivo com desconto_pagamento. Mesma estrutura de desconto_pagamento
    valor_estornado
    numberValor estornado ao cliente. 0 quando não houve estorno. Para descobrir o total original em pedidos com estorno: total_pago + valor_estornado

    DescontoPromocao (pedido.pagamento.valores.desconto_promocao)

    ParâmetroTipoDescrição
    nome
    stringNome da promoção (ex: 'MÊS DA MÃES', 'FERIADÕES DE ABRIL')
    tipo
    stringTipo da promoção: BUY_N_GET_M (compre N ganhe M), TIERED_QUANTITY (desconto por quantidade), PERCENTAGE (percentual), FIXED (valor fixo)
    detalhes
    stringDescrição textual (ex: '1 brindes', '2 itens = 5% de desconto')
    valor
    numberValor monetário do desconto em reais. Para BUY_N_GET_M é calculado: qtd_brindes × preço real do ingresso

    DescontoPagamento / AcrescimoPagamento (mesma estrutura)

    ParâmetroTipoDescrição
    nome
    string | nullNome da promoção de pagamento (ex: '5% no PIX'). Para acréscimo, vem como 'Acréscimo de cartão'
    forma
    stringForma de pagamento que disparou: pix, cartao_credito_1x, cartao_credito_2x, ... cartao_debito
    percentual
    numberPercentual aplicado (ex: 5.00 para 5%)
    valor
    numberValor monetário em reais. Sempre POSITIVO em ambos os objetos (a semântica desconto/acréscimo vem do qual campo está populado)

    Cliente (pedido.cliente)

    ParâmetroTipoDescrição
    nome
    stringPrimeiro nome
    sobrenome
    stringSobrenome
    email
    stringE-mail do comprador
    cpf
    stringCPF (somente dígitos)
    data_nascimento
    stringYYYY-MM-DD
    telefone
    stringSomente dígitos
    whatsapp
    stringSomente dígitos
    endereco
    object{ cep, rua, numero, complemento, bairro, cidade, estado }

    Cupom (pedido.cupom) — null se não usado

    ParâmetroTipoDescrição
    codigo
    stringCódigo do cupom utilizado (ex: VERAO2026)
    nome
    stringNome/descrição do cupom (ex: Desconto de Verão 10%)

    Lote (dentro de pedido.lotes[])

    ParâmetroTipoDescrição
    ingresso_id
    uuidID fixo do tipo de ingresso (ex: Ingresso - DayUse)
    lote_mestre_id
    uuidID fixo da variação do lote (ex: Adulto - 11 anos ou mais)
    categoria
    stringTipo público: adulto, infantil ou outros
    nome_ingresso
    stringNome do tipo de ingresso
    nome_lote
    stringNome da variação
    tipo_ingresso
    stringTipo técnico: dayuse, evento, dayuse_sem_data ou dia_unico
    data_uso
    stringData de uso (YYYY-MM-DD)
    valor_unitario
    numberPreço por ingresso deste lote em reais
    sincronizado
    booleantrue se TODOS os vouchers desse lote foram sincronizados (bool_and)
    sincronizado_em
    stringData/hora mais recente de sincronização entre as pessoas (MAX)
    checkin_realizado
    booleantrue se TODAS as pessoas fizeram check-in (bool_and)
    checkin_em
    stringData/hora mais recente de check-in entre as pessoas (MAX). null se nenhum
    dados
    arrayLista de pessoas (qr_code + campos do formulário)

    Pessoa (dentro de lote.dados[])

    ParâmetroTipoDescrição
    qr_code
    stringCódigo QR do ingresso (use para check-in). Sempre presente
    <label do form_config>
    stringCada chave restante usa o label definido no formulário do ingresso (ex: "Nome Completo", "CPF", "RG", "Matricula"). Só aparece se o valor estiver preenchido
    Sem form_config (labels default)
    Quando o tipo de ingresso não tem form_config personalizado, os campos preenchidos aparecem com labels default:Nome, CPF, Data de Nascimento, Email, Telefone. Em ambos os casos, chaves vazias são omitidas.

    Adicional (dentro de pedido.adicionais[])

    ParâmetroTipoDescrição
    adicional_id
    uuidID do produto adicional no catálogo (cruze com seu cadastro)
    nome
    stringNome do adicional (snapshot no momento da venda)
    quantidade
    numberQuantidade comprada
    preco_unitario
    numberPreço unitário em reais
    subtotal
    numberTotal do adicional (preço × quantidade)
    pessoa_ingresso_id
    uuid | nullVínculo com pessoa específica (quando adicional é por pessoa)
    combo_id
    uuid | nullID do combo (combos.id) quando o adicional veio embutido em um combo. null = adicional avulso
    combo_item_id
    uuid | nullID da linha do combo (combo_itens.id) que originou este adicional — define a config específica de quantidade/preço/is_brinde
    is_brinde
    booleantrue se configurado como brinde dentro do combo (subtotal pode ser 0)
    codigo_integracao
    stringCódigo externo do adicional para ERPs/cozinha. Sempre string — vazia ("") quando não cadastrado
    adicional_qr_code
    string | nullQR Code da unidade do adicional (primeira unidade gerada). null quando não há unidade
    Fluxo típico de integração
    1. Chame ?sincronizado=false para obter vouchers novos (marca automaticamente)
    2. Processe os dados no seu sistema
    3. Na próxima chamada, apenas vouchers novos aparecerão
    Como funciona a sincronização
    • Ao chamar a API, os vouchers são marcados como sincronizados para sua API Key
    • O campo sincronizado_em registra a data/hora da primeira chamada
    • Chamadas subsequentes NÃO alteram o sincronizado_em
    • Outra API Key ainda verá os mesmos vouchers como não sincronizados
    Mudanças mais recentes (2026-05-19) — v2.4 pagamento.valores em 5 etapas
    • pagamento.valores reescrito pra refletir a composição real do preço em 5 linhas:total_brutodesconto_promocaosubtotaldesconto_pagamento / acrescimo_pagamentototal.
    • Novo: total_bruto mostra o valor que o cliente pagaria sem nenhuma promoção (brindes contam pelo preço cheio). Calculado a partir do preço REAL de cada lote no pedido.
    • desconto_promocao virou objeto: { nome, tipo, detalhes, valor }. O valor agora é correto pra BUY_N_GET_M (= qtd_brindes × preço real, não mais o cálculo divergente da v2.3).
    • desconto_pagamento também virou objeto: { nome, forma, percentual, valor }. Resolve nome via promoções de pagamento ativas (ex: "5% no PIX").
    • Novo: acrescimo_pagamento separado pra acréscimos de cartão parcelado (mutuamente exclusivo com desconto_pagamento). Mesma estrutura.
    • Removidos da v2.3: subtotal_ingressos, subtotal_adicionais,desconto (dentro de valores), valor_brindes, taxa_gateway,preco_cartao, preco_pix. Toda essa info agora está nos 5 campos novos.
    • Removidos do topo do pedido: desconto, total_ingressos,total_pedido, total_adicionais e promocao_ativa. Eram redundantes — todas essas informações vivem em pagamento.valores com nomenclatura mais clara.
    Mudanças anteriores (2026-05-12)
    • Novo campo status no topo do pedido (pago, cancelado ou reembolsado) — permite distinguir pedidos ativos dos cancelados/reembolsados na mesma resposta.
    • Quando um pedido é cancelado/reembolsado, seus vouchers são automaticamente dessincronizadose voltam a aparecer na próxima chamada com ?sincronizado=false, agora trazendo o novo status.
    • Respostas vazias passaram a incluir um campo mensagem explicando o motivo (ex: "Nenhum voucher pendente — todos os pedidos pagos já foram sincronizados para esta API Key").
    Mudanças desde a v1 (2026-04-26)
    • pessoas dentro do lote foi renomeado para dados e achatado (qr_code + labels do formulário).
    • O id interno da pessoa e o id interno do adicional foram removidos do payload.
    • Status (sincronizado, checkin_realizado e timestamps) e preco_unitario subiram para o nível do lote.
    • Topo do pedido reorganizado: descontototal_ingressostotal_adicionaistotal_pedido.
    • desconto agora vem arredondado a 2 casas decimais.
    • total_adicionais antes era contagem (count). Agora é valor (R$).
    • adicionais e total_adicionais são condicionais: se o pedido não tem adicionais, essas chaves não aparecem.
    • Bloco pagination foi removido — resposta minimalista.
    OmniTicketz API Documentation