Pular para o conteúdo principal

RFID

Use estes endpoints quando o parceiro lê diretamente o identificador RFID/NFC do cartão. Envie o código lido no parâmetro rfid.

Resumo

MétodoEndpointFinalidade
GET/places/{idPlace}/rfids/{rfid}Consultar RFID
GET/places/{idPlace}/rfidListar credenciais
POST/places/{idPlace}/rfid/{rfid}/checkinAbrir RFID
PUT/places/{idPlace}/rfid/{rfid}/customersAlterar consumidor
GET/places/{idPlace}/rfid/{rfid}/transactionsConsultar transações
POST/places/{idPlace}/rfid/{rfid}/transactionsRegistrar produto externo
DELETE/places/{idPlace}/rfid/{rfid}/transactions/{idTransaction}Estornar transação
POST/places/{idPlace}/rfid/{rfid}/rechargesRegistrar recarga
PUT/places/{idPlace}/rfid/{rfid}/balanceAtualizar saldo
PUT/places/{idPlace}/rfidTrocar RFID
POST/places/{idPlace}/rfid/{rfid}/checkoutEncerrar RFID
POST/places/{idPlace}/rfid/{rfid}/resetReiniciar RFID
Singular e plural

A consulta individual e a abertura de torneira usam rfids. As demais operações usam rfid. Copie o caminho exatamente como documentado.

Parâmetros e erros comuns

Valem para todos os endpoints desta página.

Parâmetros de caminho

ParâmetroTipoObrigatórioDescrição
idPlacestringSimCódigo do estabelecimento. Precisa estar no escopo da sua chave
rfidstringSimCódigo do chip. A API completa com zeros à esquerda até 10 dígitos

Erros comuns

StatusCódigoMensagemQuando acontece
400validação do payloadCampo obrigatório ausente ou com tipo errado
403Not authorized to interact with this place (idPlace)A chave não tem acesso a esse estabelecimento
4044042RFID card not found in userRfid table.Não existe credencial para esse chip no estabelecimento
4234231Place suspended!O estabelecimento está suspenso

Consultar RFID

Retorna o estado atual da credencial e o consumidor vinculado a ela.

GET /places/{idPlace}/rfids/{rfid}

Resposta 200

CampoTipoDescrição
rfidstringCódigo do chip
idTabstringNúmero da comanda vinculada, quando houver
uidstringIdentificador do consumidor na Enjoy.it
planstringprepaid ou postpaid
statusstringEstado da credencial. enable indica que ela libera consumo
accountBalancenumberSaldo disponível, em reais
hasConsumptionLimitbooleanSe true, a torneira respeita o saldo. Vem false quando não definido
createdAtstringData de abertura da sessão, em ISO 8601
consumerReferencestringCódigo do consumidor no seu sistema
consumptionIpnstringWebhook de consumo configurado nesta sessão
balanceIpnstringEndereço consultado para obter o saldo
openTapIpnstringWebhook de mudança de estado da torneira
broughtGlassbooleanSe o consumidor trouxe o próprio copo
glassPricenumberValor do copo, quando a operação cobra por ele
qrCodestringQR Code vinculado, quando houver
customerobjetoDados do consumidor: uid, name, document, cellphone, consumerReference, email, gender, birthdate, region
{
"accountBalance": 80,
"createdAt": "2026-08-02T19:43:29.416Z",
"hasConsumptionLimit": true,
"consumerReference": "cliente-123",
"plan": "prepaid",
"rfid": "4623227593",
"status": "enable",
"uid": "5FS6DS0BDERIWG9QL6ojfuLedg23",
"customer": {
"name": "Maria Silva"
}
}

Só os erros comuns.

Listar credenciais abertas

Retorna todas as credenciais com sessão aberta no estabelecimento.

GET /places/{idPlace}/rfid

Query string

ParâmetroTipoObrigatórioDescrição
sourcesstringNãoFiltra por origem. Aceita vários valores separados por vírgula
lastTransactionAfterstringNãoData em ISO 8601. Retorna apenas credenciais com consumo posterior a ela

Resposta 200

Lista de objetos no mesmo formato de Consultar RFID.

Erros

StatusMensagemQuando acontece
400Invalid lastTransactionAfterA data enviada não é reconhecida como data válida

Abrir um RFID

Vincula o consumidor à credencial e libera o consumo. É o check-in.

POST /places/{idPlace}/rfid/{rfid}/checkin

Corpo da requisição

CampoTipoObrigatórioDescrição
planstringSimprepaid ou postpaid
consumerobjetoSimDados do consumidor. Ver tabela abaixo
hasConsumptionLimitbooleanNãoEm pré-pago use true, senão a torneira libera sem saldo
balancenumberNãoSaldo inicial em reais
bonusnumberNãoCrédito de cortesia em reais
consumptionIpnstringNãoURL chamada a cada consumo. Informe apenas se você usa webhook
balanceIpnstringNãoURL consultada pela Enjoy.it para obter o saldo antes de liberar a torneira
broughtGlassbooleanNãoIndica que o consumidor trouxe o próprio copo
glassPricenumberNãoValor do copo, quando a operação cobra por ele
reopenTabstringNãoReabre uma sessão anterior em vez de criar uma nova
idTabstringNãoNúmero de comanda a associar a este chip

Campos de consumer:

CampoTipoObrigatórioDescrição
namestringSimNome apresentado no totem e nos relatórios
consumerReferencestringNãoRecomendado. O código do consumidor no seu sistema
cellphonestringNãoTelefone, preferencialmente com +55
documentstringNãoDocumento, apenas dígitos
emailstringNãoE-mail
genderstringNãomale, female ou other
birthdatestringNãoData de nascimento
showLeaderboardbooleanNãoAutoriza exibir o consumidor em ranking
optInsobjetoNãoPermissões de contato. Contém marketing (boolean)
regionobjetoNãoEndereço: street, postalcode, number, neighborhood, city, state
{
"plan": "prepaid",
"hasConsumptionLimit": true,
"balance": 120,
"consumer": {
"name": "Maria Silva",
"consumerReference": "cliente-123"
}
}

Resposta 201

Corpo vazio. Só entregue o cartão ao consumidor depois de receber este 201.

{}

Erros

StatusCódigoMensagemQuando acontece
4004001This RFID card has an opened consumption.O cartão já tem sessão aberta. Faça o checkout antes
4224221It was not possible to link the phone number with the document provided.Telefone e documento pertencem a cadastros diferentes

Alterar consumidor

Troca ou completa os dados do consumidor de uma sessão já aberta, sem encerrá-la.

PUT /places/{idPlace}/rfid/{rfid}/customers

Corpo da requisição

Os mesmos campos de consumer em Abrir um RFIDname é obrigatório.

{
"name": "Maria Silva",
"consumerReference": "cliente-123",
"email": "maria@example.com"
}

Resposta 200

Corpo vazio.

{}

Só os erros comuns.

Consultar transações

Retorna o extrato da credencial: consumos de chope, recargas e produtos lançados pelo parceiro.

GET /places/{idPlace}/rfid/{rfid}/transactions

Query string

ParâmetroTipoObrigatórioDescrição
startAtstringNãoInício do período em ISO 8601
finishAtstringNãoFim do período em ISO 8601

startAt e finishAt só têm efeito quando enviados juntos.

Resposta 200

Lista de transações, ordenada por createdAt. Os campos estão descritos em Consultar transações da comanda — o formato é idêntico.

Os três que mais importam:

CampoTipoDescrição
idTransactionstringIdentificador único. Use para não lançar duas vezes
totalnumberValor a lançar, em reais. Já vem calculado
typestringD consumo, C recarga, P produto do parceiro

Só os erros comuns.

Registrar produto externo

Lança na Enjoy.it um item vendido no seu PDV. A transação sensibiliza o saldo do consumidor.

POST /places/{idPlace}/rfid/{rfid}/transactions

Corpo da requisição

CampoTipoObrigatórioDescrição
createdAtstringSimData e hora da venda em ISO 8601. Participa da identificação da transação
productstringSimDescrição do item
categorystringSimCategoria do item
quantitynumberSimQuantidade vendida
totalnumberNãoValor total da venda, em reais
sellingPricenumberNãoPreço unitário praticado
pricenumberNãoPreço de tabela
valuenumberNãoValor a debitar, quando diferente do total
skustringNãoCódigo do produto no seu catálogo
transactionReferencestringNãoReferência da venda no seu sistema
referencestringNãoReferência auxiliar
reversedbooleanNãoMarca a transação como estornada
{
"createdAt": "2026-10-20T17:35:18.417Z",
"product": "Coca-Cola lata",
"category": "Bebidas",
"transactionReference": "venda-987",
"sellingPrice": 8.5,
"quantity": 1,
"total": 8.5
}

Resposta 201

A transação criada, sempre com type: "P". Os campos mlServed e idTap não se aplicam e vêm ausentes.

Erros

StatusCódigoMensagemQuando acontece
4004002This tab is not open.A credencial não tem sessão aberta
4004003Insufficient funds!Saldo insuficiente para o valor lançado
4004004There is already a transaction for this customer with the createdAt provided.Reenvio da mesma venda. Normalmente é a proteção contra duplicidade funcionando

Estornar transação

Cancela um lançamento já registrado, devolvendo o valor ao saldo.

DELETE /places/{idPlace}/rfid/{rfid}/transactions/{idTransaction}

Parâmetros de caminho

ParâmetroTipoObrigatórioDescrição
idTransactionstringSimO idTransaction devolvido em Consultar transações

Não possui corpo.

Resposta 200

Corpo vazio.

{}

Erros

StatusCódigoMensagemQuando acontece
4044040Transaction not found!O idTransaction não pertence ao extrato dessa credencial

Registrar recarga

Credita saldo na credencial. Chame somente depois de o pagamento ser aprovado.

POST /places/{idPlace}/rfid/{rfid}/recharges

Corpo da requisição

CampoTipoObrigatórioDescrição
valuenumberSimValor creditado, em reais
paymentMethodstringNãodebit-card, credit-card, cash ou on-the-house (cortesia)
{
"value": 50,
"paymentMethod": "credit-card"
}

Resposta 201

Corpo vazio. Só apresente o novo saldo ao consumidor depois deste 201.

{}

Erros

StatusCódigoMensagemQuando acontece
404Missing value!value ausente ou não numérico. Repare que o status é 404, não 400
4004002This tab is not open.A credencial não tem sessão aberta

Atualizar saldo

Sincroniza na Enjoy.it o saldo que o consumidor ainda tem disponível para chope.

PUT /places/{idPlace}/rfid/{rfid}/balance

Query string

ParâmetroTipoObrigatórioDescrição
relativebooleanNãoCom true, o valor enviado é somado ao saldo atual em vez de substituí-lo

Corpo da requisição

CampoTipoObrigatórioDescrição
balancenumberCondicionalNovo saldo em reais, ou a variação quando relative=true
glassPricenumberCondicionalValor do copo

Pelo menos um dos dois precisa ser enviado.

{
"balance": 75.5
}

Resposta 200

Corpo vazio.

{}

Erros

StatusMensagemQuando acontece
400Missing balance or glassPrice.Corpo vazio ou sem nenhum dos dois campos

Trocar RFID

Transfere a sessão para outro cartão, preservando consumos e saldo. Use quando o consumidor perder ou danificar o cartão.

PUT /places/{idPlace}/rfid

Corpo da requisição

CampoTipoObrigatórioDescrição
currentRfidstringSimChip em uso. Completado com zeros à esquerda até 10 dígitos
newRfidstringSimChip que passará a valer. Precisa estar livre
{
"currentRfid": "4623227593",
"newRfid": "4623227821"
}

Resposta 200

Corpo vazio.

{}

Erros

StatusMensagemQuando acontece
400Missing currentRfid or newRfid.Faltou um dos dois campos
400The current tab is not in use.A credencial de origem não tem sessão aberta
400The new tab is already in use.A credencial de destino já está com outro consumidor

Encerrar RFID

Encerra a sessão e bloqueia a credencial contra novas servidas.

POST /places/{idPlace}/rfid/{rfid}/checkout

Corpo da requisição

CampoTipoObrigatórioDescrição
productslista de objetosSimItens do seu PDV ainda não enviados. Mande [] quando não houver nenhum

Cada item usa os mesmos campos de Registrar produto externo.

{ "products": [] }
aviso

Não repita aqui produtos já enviados por Registrar produto externo — seriam lançados duas vezes.

Resposta 200

Corpo vazio. Só libere o consumidor e reutilize o cartão depois deste 200.

{}

Erros

StatusCódigoMensagemQuando acontece
4004002This tab is not open.A credencial já foi encerrada ou nunca foi aberta

Reiniciar RFID

Desassocia o ciclo atual da credencial, deixando o cartão pronto para outro uso.

POST /places/{idPlace}/rfid/{rfid}/reset

Corpo da requisição

CampoTipoObrigatórioDescrição
keepBalancebooleanNãoCom true, o saldo permanece disponível para o próximo ciclo

O corpo em si é obrigatório: envie ao menos {}.

{
"keepBalance": false
}

Resposta 200

Corpo vazio.

{}

Só os erros comuns.