Comece pela superfície certa
O que você quer colocar no ar?
Widgets cuidam da experiência no navegador. A API recebe eventos com segurança no seu backend.
Mostrar pontos e produtos
Web Components prontos para Nuxt, Vue e HTML. Sem dependências e sem expor sua API Key.
Enviar compras e ações
Uma API HTTP para identificar clientes, processar regras e creditar recompensas de forma idempotente.
API de eventos · 5 minutos
Envie seu primeiro evento
Uma única requisição HTTP para enviar um evento de compra e gerar pontos:
curl -X POST https://api.enggaja.com/api/v1/events \
-H "Content-Type: application/json" \
-H "X-API-Key: SUA_API_KEY" \
-d '{
"type": "purchase",
"identifier_type": "cpf",
"identifier_value": "12345678901",
"data": { "amount": 89.90 },
"idempotency_key": "order-2024-00123"
}'Seu sistema
Envia POST com evento
Enggaja
Identifica o cliente
Regras
Avalia condições e limites
Recompensa
Credita pontos, badges, cupons
Web Components · Nuxt, Vue e HTML
Widgets para frontend
Use a apresentação oficial de saldo do Enggaja em Nuxt 3, Vue 3 ou qualquer frontend compatível com Web Components. O pacote inclui o mesmo ícone, tipografia numérica e cores exibidos no portal do consumidor.
Prévia ao vivo
Os próprios Web Components publicados, sem réplica visual.
Saldo
Compacto para cabeçalhos, perfis e checkout.
Catálogo
Produtos com preço, pontos e ações de carrinho.
Instalação no Nuxt 3
export default defineNuxtConfig({
vue: {
compilerOptions: {
isCustomElement: (tag) => ['enggaja-points', 'enggaja-products'].includes(tag),
},
},
})<script setup lang="ts">
useHead({
script: [{
type: 'module',
src: 'https://enggaja.com/widgets/points-widget.v0.2.3.js',
}],
})
</script>
<template>
<enggaja-points points="1240" />
</template>HTML ou qualquer framework
<script type="module" src="https://enggaja.com/widgets/points-widget.v0.2.3.js"></script>
<enggaja-points points="1240"></enggaja-points>points. Busque o valor no seu backend; nenhuma API Key deve ser enviada ao navegador. Use label para trocar “pontos creditados” e variáveis CSS --enggaja-points-* para tematização controlada. As fontes oficiais Bricolage Grotesque e Nunito Sans são incorporadas em WOFF2 e carregadas pelo Web Component sem requisição ao Google Fonts.Produtos disponíveis
O catálogo exportável preserva os cards do cardápio Enggaja, incluindo preço em centavos, alternativa em pontos e disponibilidade.
<script type="module" src="https://enggaja.com/widgets/products-widget.v0.2.3.js"></script>
<enggaja-products id="cardapio" user-points="1240"></enggaja-products>
<script>
const products = [{
id: 'prod_cafe',
name: 'Cappuccino da casa',
price: 1490,
points_price: 300,
availability: { available: true }
}]
document.querySelector('#cardapio')
.setAttribute('products', JSON.stringify(products))
document.querySelector('#cardapio')
.setAttribute('quantities', JSON.stringify({ prod_cafe: 1 }))
document.querySelector('#cardapio')
.setAttribute('extras-cents', JSON.stringify({ prod_cafe: 400 }))
</script>extras-cents, informe a soma dos adicionais selecionados por produto, sempre em centavos. O eventoproduct-select abre detalhes; product-add eproduct-remove integram o carrinho controlado pelo site hospedeiro.Server-to-server · Parceiro + unidade
API de fidelidade para parceiros
Exiba o catálogo resgatável de uma unidade e, com autorização do cliente, consulte saldo e distância até cada produto. Cada API Key pertence a uma combinação de parceiro, unidade e permissões — nunca envie essa chave ao navegador.
/api/partner/v1/catalogRetorna todos os produtos ativos e resgatáveis da unidade, inclusive os que ainda estão longe do saldo do cliente.
/api/partner/v1/customer-contextEnvie pelo menos um identificador — CPF, telefone (com ou sem +55) ou e-mail. Os enviados devem identificar a mesma conta vinculada à unidade.
curl -X POST https://api.enggaja.com/api/partner/v1/customer-context \
-H "Content-Type: application/json" \
-H "X-API-Key: SUA_API_KEY_DO_PARCEIRO" \
-d '{
"cpf": "52998224725",
"phone": "+5511999887766",
"email": "[email protected]",
"request_reference": "pedido-parceiro-001"
}'registration_url única e atribuível ao parceiro. Esse link permite medir cadastro e conversão sem virar dependência do cadastro, dos pontos ou do resgate.Autenticação
Toda requisição deve incluir o header X-API-Key. A key é gerada ao criar o app no dashboard.
POST /api/v1/events HTTP/1.1
Host: api.enggaja.com
Content-Type: application/json
X-API-Key: SUA_API_KEYEnviar Evento
/api/v1/eventsParâmetros do body (JSON)
| Campo | Tipo | Descrição |
|---|---|---|
type* | string | Tipo do evento. Ex: purchase, checkin, review |
data* | object | Dados do evento. Campos livres usados nas condições. Ex: {"amount":89.90} |
user_id | string | ID do consumidor no Enggaja. Prioridade sobre outros identificadores. |
identifier_type | string | Tipo do identificador: cpf ou phone |
identifier_value | string | Valor. CPF: 12345678901 | Telefone: 11999887766 |
platform | string | Nome da plataforma de origem. Ex: instagram, ifood, rappi. Qualquer string. |
platform_identifier | string | Identificador do cliente na plataforma (username, email, ID externo). |
idempotency_key | string | Chave única anti-duplicata. Max 255 chars. Ex: order-12345 |
timestamp | string | RFC3339 para backfill. Ex: 2024-01-15T14:30:00Z. Omitido = agora |
priority | string | Fila: immediate, normal (padrão), low |
user_id, identifier_type + identifier_value, ou platform + platform_identifier.Identificação do Cliente
Escolha o método que faz sentido para o seu sistema. O Enggaja normaliza os valores automaticamente.
CPF
POS / E-commerceidentifier_type: "cpf", identifier_value: "123.456.789-01"Pontos, traços e espaços são removidos. Resultado: 11 dígitos.
Telefone
Delivery / WhatsAppidentifier_type: "phone", identifier_value: "11999887766"Envie no formato local (sem +55). O Enggaja normaliza para E.164 (5511999887766).
Plataforma
Social / Delivery / Qualquerplatform: "instagram", platform_identifier: "joao_insta"Envie o nome da plataforma e o identificador do cliente nela (username, email, ID). O valor é normalizado para minúsculo.
user_id direto
SSO / Banco compartilhadouser_id: "cusr_abc123def456"Mais performático — sem lookup. Tem prioridade sobre os outros métodos.
Respostas
202 Evento aceito (assíncrono)
Resposta padrão. O evento entra na fila de processamento.
{
"success": true,
"data": {
"status": "accepted",
"message": "event queued for processing"
}
}200 Evento processado (sync)
Quando a fila está cheia, o evento é processado na hora e retorna o resultado completo.
{
"success": true,
"data": {
"event_id": "evt_a1b2c3d4e5f6",
"actions_run": ["act_compra_pontos"],
"points_earned": 100,
"xp_earned": 25,
"coins_earned": 0,
"badges_earned": [],
"coupons_earned": [],
"missions_updated": [],
"missions_completed": [],
"rules_executed": [],
"warnings": [],
"duplicate": false
}
}200 Duplicata (idempotência)
Mesmo resultado do original, mas duplicate: true. Pontos NÃO são creditados novamente.
{
"success": true,
"data": {
"event_id": "evt_a1b2c3d4e5f6",
"duplicate": true,
"points_earned": 100,
"xp_earned": 25
}
}Erros
Todas as respostas de erro seguem o formato:
{
"success": false,
"error": "mensagem descritiva"
}| Status | Mensagem | O que fazer |
|---|---|---|
| 400 | "type is required" | Envie type e data no body |
| 400 | "unsupported identifier_type: must be 'cpf' or 'phone'" | Use cpf ou phone |
| 401 | "invalid or missing API key" | Verifique o header X-API-Key |
| 404 | "user not found for identifier:cpf" | Cliente precisa se cadastrar no portal primeiro |
| 409 | "idempotency key already used for a different user" | Cada idempotency_key é vinculada ao primeiro cliente |
| 429 | Rate limit | Aguarde e reenvie |
Idempotência
Use idempotency_key para evitar processamento duplicado. Essencial para retries e falhas de rede.
idempotency_key que já existe para o mesmo tenant → retorna resultado original com duplicate: trueBoas práticas
- Use o ID do pedido: "order-12345", "ifood-abc123"
- Única por estabelecimento (tenant)
- Máximo 255 caracteres
- Whitespace-only é tratado como vazio
Exemplos de Código
Compra via POS (CPF)
O caso mais comum: POS envia o CPF do cliente na hora da venda.
curl -X POST https://api.enggaja.com/api/v1/events \
-H "Content-Type: application/json" \
-H "X-API-Key: SUA_API_KEY" \
-d '{
"type": "purchase",
"identifier_type": "cpf",
"identifier_value": "12345678901",
"data": {
"amount": 89.90,
"payment_method": "credit_card"
},
"idempotency_key": "order-2024-00123"
}'Delivery (Telefone)
Delivery apps identificam por telefone. Envie sem +55.
curl -X POST https://api.enggaja.com/api/v1/events \
-H "Content-Type: application/json" \
-H "X-API-Key: SUA_API_KEY" \
-d '{
"type": "purchase",
"identifier_type": "phone",
"identifier_value": "11999887766",
"data": { "amount": 45.50, "source": "ifood" },
"idempotency_key": "ifood-order-abc123"
}'Com user_id direto
Se você já tem o ID do consumidor (SSO, banco compartilhado).
curl -X POST https://api.enggaja.com/api/v1/events \
-H "Content-Type: application/json" \
-H "X-API-Key: SUA_API_KEY" \
-d '{
"type": "purchase",
"user_id": "cusr_abc123def456",
"data": { "amount": 200.00, "items_count": 3 }
}'Perguntas frequentes
Preciso de um SDK para integrar?
▾
Não. A integração é via HTTP REST. Qualquer linguagem que faça requisições HTTP funciona.
E se o CPF ou telefone não estiver cadastrado?
▾
O webhook retorna HTTP 404 com a mensagem "user not found for identifier:cpf". O cliente precisa se cadastrar no portal do estabelecimento antes.
Posso enviar o mesmo evento duas vezes?
▾
Sim, desde que use o campo idempotency_key. O Enggaja detecta duplicatas e retorna o resultado original sem creditar pontos novamente.
Como testo a integração?
▾
Use sua API Key real. Crie um usuário de teste no portal e envie eventos com dados fictícios. Você pode deletar os eventos depois pelo dashboard.
O webhook suporta OAuth?
▾
Não. A autenticação é exclusivamente via API Key no header X-API-Key.
