Quick Start
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
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.
