@page "/docs/n8n" @model Nalu.Web.Pages.Docs.N8nModel @{ ViewData["Title"] = "Integração com N8N — NaLU AI Docs"; ViewData["Description"] = "Como usar o NaLU AI no N8N para validar CPF, CEP, nome e mais em fluxos de chatbot sem escrever código."; }
Docs / N8N

Integrando com N8N

Sem código. Arraste um nó, cole a URL, mapeie os campos. Pronto.

O que você vai precisar

  • 1. Uma conta NaLU AI com uma API Key — crie grátis aqui. A key fica no seu Painel, formato nalu-XXXXXXXXXX.
  • 2. N8N rodando (cloud ou self-hosted). Qualquer versão moderna funciona.
  • 3. Um fluxo que já recebe a mensagem do usuário — pode ser Webhook, Typebot, Chatwoot, Z-API, Telegram, etc.

Conceito em 30 segundos

O NaLU é uma API REST. No N8N, qualquer API REST é chamada com o nó HTTP Request. Você manda o que o usuário digitou, o NaLU devolve o dado extraído e limpo — ou uma sugestão de como perguntar de novo.

Entrada: "meu cpf é 111.444.777-35"
NaLU: obtained: true · extracted_value: "111.444.777-35"
Entrada: "não lembro agora"
NaLU: obtained: false · suggestion_to_agent: "Tudo bem! Pode digitar só os números do CPF?"

Configurando o nó HTTP Request

Exemplo com validação de CPF. O processo é idêntico para todos os outros validadores — só muda a URL.

1
Arraste um nó HTTP Request

No painel do N8N, clique no + para adicionar nó. Busque por "HTTP Request" e selecione.

2
Configure o método e a URL
Method: POST
URL: https://api.naluai.dev/v1/extract/cpf

Troque cpf pelo validador que precisar: cep, name, email, etc.

3
Adicione a autenticação

Em Authentication, selecione Header Auth e configure:

Name: Authorization
Value: Bearer nalu-SUA_API_KEY
Dica: Guarde a key em Credentials → Header Auth no N8N. Assim você reutiliza em todos os nós NaLU sem copiar a key toda vez.
4
Configure o corpo (Body)

Selecione Body → JSON e use expressões N8N para mapear os dados:

{
  "user_input":    "{{ $json.message }}",
  "agent_input":   "Qual o seu CPF?",
  "agent_context": "Agente de cadastro de clientes",
  "language":      "pt-BR"
}

$json.message é o campo que vem do nó anterior com a resposta do usuário. O nome exato depende do seu trigger (Webhook, Typebot, etc.) — use o painel de expressões do N8N para localizar.

5
Use o resultado com um nó IF

Conecte um nó IF na saída do HTTP Request:

Condição: {{ $json.obtained }} igual a true
✓ Ramo TRUE

Dado extraído. Use $json.extracted_value no próximo passo do fluxo.

✗ Ramo FALSE

Não encontrou. Envie $json.suggestion_to_agent como resposta ao usuário e aguarde nova tentativa.

Fluxo completo de coleta de dados

Exemplo: coletar CPF em um chatbot de cobrança via WhatsApp.

[ Webhook — mensagem do WhatsApp ]
         ↓
[ HTTP Request → NaLU /extract/cpf ]
  body: { user_input: mensagem do usuário }
         ↓
[ IF: obtained === true ]
    ↓ TRUE                    ↓ FALSE
[ Salvar CPF no BD ]    [ Enviar suggestion_to_agent ]
[ Próxima etapa ]       [ Aguardar nova resposta ]
                        [ (volta para o Webhook) ]

Exemplo avançado: validate_reply

O validate_reply analisa a resposta do usuário no contexto do que o agente disse. Útil para detectar contrapropostas, confirmações e handoffs.

{
  "agent_message": "Posso parcelar em 20x de R$100. Topa?",
  "user_reply":    "{{ $json.message }}",
  "agent_context": "Agente de negociação de parcelas",
  "language":      "pt-BR"
}

A resposta inclui o campo reply_type. Use um nó Switch (em vez de IF) para rotear:

[ Switch: $json.reply_type ]

  "confirmation"      → prosseguir com fechamento
  "counter_proposal"  → avaliar nova proposta ($json.extracted_value)
  "rejection"         → oferecer alternativa
  "handoff"           → transferir para atendente humano
  "cancel"            → acionar fluxo de retenção
  "unclear"           → pedir esclarecimento

Campos disponíveis na resposta

Todos acessíveis como $json.nome_do_campo no nó seguinte:

Campo O que contém
obtainedtrue/false — se o dado foi extraído
extracted_valueO dado limpo e normalizado (ex: "111.444.777-35")
certainfalse = pedir confirmação antes de salvar
confidencelow / medium / high
suggestion_to_agentFrase pronta para enviar ao usuário quando obtained=false
reply_typeSó validate_reply: confirmation, counter_proposal, handoff, etc.
Dicas para não errar
  • Limite de tentativas: coloque um contador no N8N. Se o usuário errar 3 vezes, escale para humano — não deixe o bot em loop infinito.
  • certain: false: quando true mas certain é false, confirme com o usuário antes de salvar. Ex: "Encontrei o nome João Silva, está correto?"
  • Campos do CEP: além de extracted_value, o validate_cep retorna um objeto com logradouro, bairro, cidade e estado separados — útil para preencher formulários.
  • Erros 429: créditos acabaram. Trate com um nó IF no status code antes do IF do obtained.
  • agent_context: sempre envie — melhora muito a qualidade das sugestões contextuais quando o usuário não responde o que foi pedido.

URLs de referência rápida

POST https://api.naluai.dev/v1/extract/cpf
POST https://api.naluai.dev/v1/extract/cep
POST https://api.naluai.dev/v1/extract/cnpj
POST https://api.naluai.dev/v1/extract/email
POST https://api.naluai.dev/v1/extract/phone
POST https://api.naluai.dev/v1/extract/name
POST https://api.naluai.dev/v1/extract/yes-no
POST https://api.naluai.dev/v1/extract/birthdate
POST https://api.naluai.dev/v1/extract/handoff
POST https://api.naluai.dev/v1/extract/cancel-intent
POST https://api.naluai.dev/v1/extract/company-name
POST https://api.naluai.dev/v1/extract/plate-br
POST https://api.naluai.dev/v1/extract/reply        ← usa agent_message + user_reply