Referência completa para conectar seu ERP ou sistema ao Indicae — criar afiliados, atualizar status de leads e receber webhooks de conversão.
A integração tem dois sentidos: seu ERP envia eventos ao Indicae (inbound) e o Indicae notifica seu ERP sobre novos leads e conversões (outbound webhooks).
POST erp-order-confirmed → Indicae cria o afiliado e devolve um welcome_url (magic-link).welcome_url ao cliente (WhatsApp, e-mail ou SMS). O Indicae já envia via WhatsApp por padrão — você pode desativar se quiser controlar o envio.referral.created para a URL configurada no painel da empresa.erp-referral-status para atualizar o estágio. Quando converter, inclua o bloco contract para liberar a comissão.Toda requisição inbound (seu ERP → Indicae) é autenticada por um token de integração da empresa, enviado no header Authorization: Bearer. O token identifica a empresa — não há header de slug nem assinatura HMAC, e as chamadas trafegam sempre por HTTPS.
Content-Type: application/jsonAuthorization: Bearer <token de integração>Dispare quando um cliente fechar um pedido no seu ERP. O Indicae registra o afiliado, gera o código de indicação e devolve um welcome_url (magic-link). Se o afiliado já existir pelo CPF, o endpoint é idempotente — retorna o afiliado existente sem duplicar.
| Valor | Comportamento |
|---|---|
hub | Afiliado pode indicar para todas as empresas ativas no hub. |
specific_products | Afiliado só indica os produtos definidos no campo product_ids (array de UUIDs). |
{
"order_id": "ORD-12345",
"customer": {
"cpf": "12345678900",
"first_name": "Daniel",
"last_name": "Almeida",
"phone": "+5511999998888",
"email": "daniel@example.com"
},
"product_type": "credito",
"amount": 5000,
"confirmed_at": "2026-05-14T15:32:11Z",
"affiliate_scope": "hub"
}{
"status": "ok",
"affiliate_id": "8e6f0c8c-...",
"referral_code": "Dn7K2aZx",
"welcome_url": "https://<sub>.indicae.club/auto/<token>",
"welcome_sent_to": "+5511999998888",
"referred_name": "Daniel Almeida",
"referrer_name": "Marina Souza"
}export INDICAE_TOKEN='ind_live_...' # gerado no painel
curl -X POST 'https://fwenhjalbnlphpkdsszy.supabase.co/functions/v1/erp-order-confirmed' \
-H 'Content-Type: application/json' \
-H "Authorization: Bearer $INDICAE_TOKEN" \
--data-raw '{
"order_id": "ORD-12345",
"customer": {
"cpf": "12345678900",
"first_name": "Daniel",
"last_name": "Almeida",
"phone": "+5511999998888",
"email": "daniel@example.com"
},
"product_type": "credito",
"amount": 5000,
"confirmed_at": "2026-05-14T15:32:11Z",
"affiliate_scope": "hub"
}'welcome_url é o magic-link que você entrega ao cliente (Indicae já envia via WhatsApp por padrão). Ao abrir, o cliente cai direto na área dele dentro do /app com o link de indicação pronto para copiar.referred_name é o nome do cliente (o indicado) que recebeu o welcome. referrer_name é o nome de quem o indicou — resolvido pelo telefone a partir da indicação registrada na LP. Vem null quando o cliente não veio de uma indicação (compra direta ou lead orgânico).Dispare a cada mudança de estágio do lead no funil da empresa. O referral_id é o UUID devolvido pelo webhook referral.created quando o lead foi criado.
| to_status | Significado | Campos extras |
|---|---|---|
in_service | Lead em atendimento pela equipe comercial | — |
in_analysis | Lead em análise / proposta enviada | — |
converted | Negócio fechado — comissão liberada na carência | contract.external_contract_id, contract.sale_amount |
lost | Lead perdido / descartado | — |
{
"referral_id": "uuid-do-indicae",
"external_id": "LEAD-789",
"to_status": "in_service",
"occurred_at": "2026-05-14T16:00:00Z",
"notes": "Cliente respondeu o primeiro contato"
}{
"referral_id": "uuid-do-indicae",
"external_id": "LEAD-789",
"to_status": "converted",
"occurred_at": "2026-05-14T18:00:00Z",
"contract": {
"external_contract_id": "CTR-001",
"sale_amount": 5000
}
}{
"status": "ok",
"referral_id": "8e6f0c8c-...",
"stage": "in_service"
}export INDICAE_TOKEN='ind_live_...' # gerado no painel
curl -X POST 'https://fwenhjalbnlphpkdsszy.supabase.co/functions/v1/erp-referral-status' \
-H 'Content-Type: application/json' \
-H "Authorization: Bearer $INDICAE_TOKEN" \
--data-raw '{
"referral_id": "uuid-do-indicae",
"external_id": "LEAD-789",
"to_status": "in_service",
"occurred_at": "2026-05-14T16:00:00Z",
"notes": "Cliente respondeu o primeiro contato"
}'O Indicae envia eventos para a URL configurada no painel (Configurações → Integração → URL de webhook). Configure quais eventos deseja receber ou deixe em branco para receber todos.
| Evento | Quando é disparado |
|---|---|
referral.created | Novo lead criado a partir de uma indicação. |
referral.stage_changed | Estágio do lead atualizado via erp-referral-status. |
referral.converted | Lead convertido — inclui sale_amount e snapshot de comissão. |
withdrawal.paid | Saque de comissão pago ao afiliado. |
O Indicae assina cada webhook enviado com o mesmo algoritmo HMAC-SHA256. Valide o cabeçalho X-Indicaai-Signature antes de processar o payload.
X-Indicaai-Timestamp e X-Indicaai-Signature dos headers.sha256=hex(HMAC_SHA256(segredo, "{timestamp}.{rawBody}")){
"event": "referral.created",
"delivery_id": "uuid",
"occurred_at": "2026-05-14T15:35:00Z",
"data": {
"referral_id": "uuid-do-indicae",
"affiliate_id": "uuid-do-afiliado",
"referral_code": "Dn7K2aZx",
"lead_name": "Maria Souza",
"lead_phone": "+5511****8888",
"product_type": "credito",
"stage": "received"
}
}200 imediatamente e processe de forma assíncrona para evitar timeouts.| Status | Nome | Descrição |
|---|---|---|
| 200 | OK | Requisição processada com sucesso. |
| 400 | Bad Request | Payload inválido ou campos obrigatórios ausentes. |
| 401 | Unauthorized | Token de integração ausente ou inválido. |
| 409 | Conflict | order_id ou external_id já processado (idempotência). |
| 429 | Too Many Requests | Rate limit atingido. Aguarde e tente novamente. |
| 500 | Internal Server Error | Erro interno no Indicae. Contate o suporte se persistir. |
O corpo de erro segue o formato { error: "mensagem", code: "SNAKE_CASE" }.
Dúvidas? integracoes@indicae.club