Pular para o conteúdo principal

Convenções e erros

Esta página reúne as regras que valem para todos os endpoints. Leia uma vez antes de começar a implementar: quase todo erro de integração nasce de algo aqui.

Como ler as páginas de referência

Cada operação aparece com o método e o caminho relativo à URL base:

POST /places/{idPlace}/tabs/{idTab}/checkin

Tudo entre chaves é substituído pelo valor real — as chaves não fazem parte da URL:

ErradoCerto
/places/{idPlace}/tabs/{idTab}/checkin/places/P-PDV/tabs/006/checkin

O endereço final junta a URL base com o caminho:

https://api-demo.letsenjoy.it/pos/places/P-PDV/tabs/006/checkin

URL base

Homologação: https://api-demo.letsenjoy.it/pos
Produção: https://api.letsenjoy.it/pos

Todos os caminhos das páginas seguintes são relativos a essa URL. Cada ambiente tem a sua própria chave — veja Autenticação.

Headers

x-api-key: SUA_CHAVE_DE_API
Content-Type: application/json

Content-Type é necessário sempre que a chamada tiver corpo, ou seja, em POST e PUT.

Identificadores

CampoO que éDe onde vemExemplo
idPlaceCódigo do estabelecimentoFornecido pela Enjoy.itP-PDV
idTabNúmero impresso na comandaLido ou digitado no caixa006
rfidCódigo do chip do cartãoLido pelo leitor RFID/NFC4623227593
referenceCódigo do cliente no seu sistemaVocê definecliente-123
uidCódigo interno do cliente na Enjoy.itVem nas respostas5FS6DS0B...
idTransactionCódigo único de uma transaçãoVem nas respostase2f64f70-...
idTapCódigo de uma torneiraFornecido pela Enjoy.itT-01

Envie números de comanda com três dígitos. A API completa com zeros à esquerda quando você manda menos, mas usar o formato cheio evita confusão em log e conciliação: mande 006, não 6.

Datas e valores

Este é o ponto onde sistemas brasileiros mais tropeçam, porque o formato da API não é o formato de tela:

CampoErradoCerto
Valor"R$ 12,80"12.8
Valor"12,80"12.8
Valor1280 (centavos)12.8
Data"20/10/2026 14:35""2026-10-20T17:35:18.417Z"

As regras:

  • Valores são números decimais em reais, com ponto como separador. Não são centavos, não são texto e não levam símbolo de moeda.
  • Datas seguem o padrão ISO 8601 em UTC — o Z no fim indica isso. Horário de Brasília é UTC−3: 14:35 em São Paulo é 17:35Z.
  • Em filtros por período, startAt e finishAt andam sempre juntos.

Modelo de consumidor

{
"name": "Maria Silva",
"cellphone": "+5511999999999",
"consumerReference": "cliente-123",
"document": "12345678900",
"email": "maria@example.com",
"showLeaderboard": true,
"gender": "female",
"birthdate": "1990-05-20",
"region": {
"street": "Alameda Exemplo",
"postalcode": "04547000",
"number": "100",
"neighborhood": "Vila Olímpia",
"city": "São Paulo",
"state": "São Paulo"
}
}
CampoObrigatórioObservação
nameSimNome apresentado na operação e no totem
consumerReferenceRecomendadoO código do cliente no seu sistema. Sem ele, a conciliação depende só da comanda
cellphoneNãoPreferencialmente no formato internacional, com +55
documentNãoDocumento do consumidor, só dígitos
emailNãoE-mail do consumidor
showLeaderboardNãoPermissão para aparecer em ranking
genderNãomale, female ou other
birthdateNãoData de nascimento
regionNãoEndereço do consumidor

Modelo de check-in

{
"plan": "postpaid",
"hasConsumptionLimit": false,
"balance": 120,
"consumer": {
"name": "Maria Silva",
"consumerReference": "cliente-123"
},
"consumptionIpn": "https://parceiro.example.com/enjoy/consumptions",
"balanceIpn": "https://parceiro.example.com/enjoy/balance"
}
CampoObrigatórioObservação
planSimprepaid ou postpaid
consumerSimDados do consumidor
hasConsumptionLimitNãoEm pré-pago use true, senão a torneira libera sem saldo
balanceCondicionalSaldo disponível quando existe limite
consumptionIpnNãoWebhook chamado após cada consumo. Só informe se você usa webhook
balanceIpnNãoEndereço seu que a Enjoy.it consulta para saber o saldo atualizado
broughtGlassNãoIndica se o cliente trouxe o próprio copo
glassPriceNãoValor do copo, quando a operação cobra por ele

Modelo de produto externo

Use este modelo para mandar itens vendidos no seu PDV para o extrato da Enjoy.it, seja por POST .../transactions ou na lista products do checkout.

{
"createdAt": "2026-10-20T17:35:18.417Z",
"product": "Coca-Cola lata",
"category": "Bebidas",
"transactionReference": "venda-987",
"sku": "COCA350",
"sellingPrice": 8.5,
"quantity": 1,
"total": 8.5
}

O createdAt participa da identificação da transação: reenviar a mesma operação com a mesma data não deve criar um segundo lançamento. Use transactionReference para apontar para o registro correspondente no seu sistema.

Modelo de transação

É o que você recebe ao consultar o extrato ou por webhook:

{
"idTransaction": "e2f64f70-e320-4c4b-acae-d4aff934b8a0",
"createdAt": "2026-10-20T17:35:18.417Z",
"idPlace": "P-PDV",
"idTab": "006",
"rfid": "4623227593",
"consumerReference": "cliente-123",
"product": "Chopp Pilsen",
"sku": "PILSEN",
"mlServed": 340.3,
"sellingPrice": 0.05,
"total": 17.02,
"type": "D",
"reversed": false
}
CampoO que fazer com ele
totalÉ o valor a lançar. Já vem calculado; não recalcule por preço de tabela
skuO código do produto. Ver abaixo — é o campo que liga a transação ao seu catálogo
mlServedO volume servido. Vale exibir: explica por que o valor não é redondo
sellingPriceO preço por mililitro. Não é o preço do copo
idTransactionGrave para não lançar duas vezes
reversedSe true, a transação foi estornada e não deve ser cobrada

O campo sku

O produto de cada torneira e o preço por mililitro são cadastrados no sistema da Enjoy.it — seu PDV não envia preço nem escolhe produto.

Para que você consiga lançar o consumo no item certo do seu catálogo, o sku é configurado no cadastro do produto dentro da Enjoy.it e pode receber o código do produto no sistema integrador. A transação chega então com um identificador que o seu PDV já conhece, em vez de exigir que você case por nome — que muda a cada troca de barril.

Combine o preenchimento dos sku durante a homologação.

typeSignificado
DDébito: consumo realizado na Enjoy.it
CCrédito: recarga
PProduto registrado pelo PDV parceiro

Respostas de sucesso

StatusQuando acontece
200 OKConsulta, atualização, checkout, reset ou exclusão concluída
201 CreatedCheck-in, recarga ou transação criada

Operações que não precisam devolver dados respondem com um objeto vazio. Isso é sucesso, não falta de resposta:

{}

Erros

StatusSignificadoO que fazer
400 Bad RequestConteúdo inválido, campo faltando ou regra de negócio não atendidaCorrija o envio. Repetir igual não resolve
403 ForbiddenSua chave não tem acesso a esse estabelecimentoConfira a chave e o idPlace
404 Not FoundComanda, cartão, cliente ou recurso não existeConfira o identificador. Em comanda, confira o cadastro da loja
409 ConflictRecurso ou operação duplicadaVerifique se você já não enviou. Não force
429 Too Many RequestsChamadas demais em pouco tempoEspere e tente de novo, espaçando as chamadas
500 Internal Server ErrorFalha do nosso ladoPode tentar de novo. Se persistir, acione o suporte

Erros de negócio conhecidos:

CódigoMensagemCausa comum
4001Credencial já possui consumo abertoCheck-in em uma comanda que nunca recebeu checkout
4002Comanda ou credencial não está abertaLançamento após o checkout, ou check-in que falhou
4003Saldo insuficientePré-pago sem crédito, ou saldo não sincronizado
4004Já existe transação com a data informadaReenvio da mesma transação. Geralmente é a proteção funcionando
4041Número de comanda não encontradoComanda inexistente no cadastro da loja

Como não cobrar o cliente duas vezes

Toda transação tem um identificador único. Antes de lançar, verifique se já gravou aquele identificador; se já gravou, ignore e responda sucesso.

É o que evita este cenário:

1. Cliente tira um chope de R$ 12,80
2. A Enjoy.it entrega o consumo ao seu sistema
3. Seu sistema lança na comanda......... OK
4. A resposta se perde (queda de rede, timeout)
5. A Enjoy.it considera que falhou e entrega de novo
6. Seu sistema lança de novo........... o cliente paga R$ 25,60
IdentificadorOnde aparece
idTransactionCampo pronto, único por transação — o mais simples de usar
uid + createdAtA identificação estável: consumidor + data e hora exata da servida

Grave o identificador antes do lançamento financeiro. Assim uma tentativa repetida encontra o registro, responde sucesso e não duplica nada.

O mesmo cuidado vale na consulta: consultar o extrato duas vezes traz as mesmas transações nas duas respostas. Grave apenas as que ainda não estão no seu banco.