MÓDULO 4.3

🔌 Integrações e dados

Sua automação precisa conversar com o mundo. Aqui você domina o HTTP Request e APIs REST, autenticação Bearer e OAuth, leitura/gravação no Supabase, Google Sheets, paginação com SplitInBatches e tratamento de nulos no mapeamento de campos.

6
Tópicos
55
Minutos
Intermediário
Nível
Mão na massa
Tipo
HTTP Request + auth Bearer/OAuth API REST Supabase Google Sheets SplitInBatches

Ilustrativo — o HTTP Request no centro fala com qualquer serviço; a paginação processa listas em lotes.

1

🌐 HTTP Request e APIs REST

O HTTP Request node é o canivete suíço: quando não existe node nativo, ele fala com qualquer API REST. Você define método, URL, headers e body, e recebe a resposta como item.

# GET com query params dinâmicos
GET  https://api.exemplo.com/v1/pedidos
?status=={{ $json.status }}&limit=50

// a resposta vira item; acesse com: ={{ $json.data }}

📊 Os verbos REST que importam

  • GET - ler dados (não muda nada no servidor).
  • POST - criar um novo registro.
  • PUT/PATCH - atualizar um registro existente.
  • DELETE - remover. Confira sempre o status code: 2xx ok, 4xx erro seu, 5xx erro deles.
2

🪪 Autenticação

O erro 401 Unauthorized é o tropeço nº1 em integração. A API precisa provar quem é você: um token no header (Bearer) ou um fluxo de consentimento (OAuth2).

# header de autenticação Bearer
Authorization: Bearer ={{ $env.API_TOKEN }}
Content-Type:  application/json

✓ Bearer token

  • Simples: 1 chave fixa no header.
  • Bom para APIs de servidor (OpenAI, Stripe).
  • Guarde a chave em $env/credential.

✓ OAuth2

  • Para acessar conta de um usuário (Google, Slack).
  • O n8n renova o token automaticamente (refresh).
  • Configure uma vez na credential e reuse.

⚠️ Deu 401? Cheque nesta ordem

Chave certa? Header com o nome exato (Authorization)? Prefixo Bearer com espaço? Token expirado (OAuth)? Escopo suficiente? 90% dos 401 caem aqui.

3

🗄️ Supabase / banco: ler e gravar

O banco é a memória da automação. Sem ele, cada execução esquece tudo. Com Supabase/Postgres você lê com SELECT e grava com INSERT/UPDATE — ou melhor, UPSERT, que grava ou atualiza por chave única.

# UPSERT no Supabase via HTTP Request
POST https://abcd.supabase.co/rest/v1/leads
Headers:
  apikey: ={{ $env.SUPABASE_SERVICE_KEY }}
  Prefer: resolution=merge-duplicates
Body:
  { "email": "={{ $json.email }}", "intencao": "={{ $json.intencao }}" }

🔑 Chave única = sua âncora

Defina uma coluna única (ex.: email). O UPSERT usa ela para decidir entre criar e atualizar — é o que evita duplicata (assunto do módulo 4.4).

  • SELECT com filtro ?email=eq.ana@x.com para ler.
  • Prefer: resolution=merge-duplicates faz o UPSERT no Supabase.
4

📊 Planilhas (Google Sheets)

O Google Sheets é o "banco" favorito de quem não é dev. Cliente entende planilha. Entregar resultado numa aba é a forma mais rápida de mostrar valor sem treinar ninguém — leitura por linha, escrita por append ou update.

# append row mapeando campos para colunas
Nome:       ={{ $json.nome }}
Email:      ={{ $json.email }}
Prioridade: ={{ $json.prioridade }}
Data:       ={{ $now.format('dd/MM/yyyy') }}
Append row

Adiciona linha nova

Update

Por chave/coluna

Read rows

Planilha como entrada

Range

Aba e intervalo

💡 Dica prática

Planilha é ótima para entrega visível, mas péssima como banco transacional. Para dedupe e volume, use Supabase; para o cliente ver o resultado, espelhe numa aba.

5

🔄 Paginação e processar listas

APIs limitam quantos itens devolvem por chamada e impõem rate limit. Processar tudo de uma vez quebra. SplitInBatches (Loop Over Items) fatia a lista em lotes; cursor/offset busca página por página.

# buscar próxima página com cursor
GET https://api.exemplo.com/v1/itens?cursor=={{ $json.next_cursor }}
// repita o HTTP node em loop enquanto next_cursor não for null
// SplitInBatches: tamanho 50 + Wait 1s entre lotes p/ respeitar rate limit

⚠️ O erro N+1 e o rate limit

Disparar uma chamada por item, sem lote nem espera, leva ao 429 Too Many Requests e a custo absurdo. Sempre agrupe em batches e adicione um Wait entre eles.

1

Fatie a lista

SplitInBatches com tamanho de lote (ex.: 50) divide 500 itens em 10 voltas.

2

Processe o lote e espere

Faça o trabalho do lote, adicione um node Wait, e volte ao SplitInBatches.

3

Pare quando acabar

O loop encerra quando não há mais lotes (ou next_cursor é null).

6

🧮 Tratar nulos e mapear campos

Um campo nulo inesperado quebra o fluxo no meio. Expressões n8n ={{ }} com valor padrão e optional chaining tornam a automação resiliente a dados sujos.

# expressões defensivas em n8n
// valor padrão quando vem nulo/undefined
={{ $json.email ?? 'sem-email@placeholder.com' }}

// optional chaining evita "cannot read property of undefined"
={{ $json.cliente?.endereco?.cidade ?? 'N/D' }}

// renomear/formatar ao mapear
={{ $json.valor ? 'R$ ' + $json.valor.toFixed(2) : 'R$ 0,00' }}

✓ Mapeamento resiliente

  • Sempre ?? valor_padrao em campo que pode faltar.
  • ?. em objetos aninhados de fonte externa.
  • Formatar tipos (data, número) no mapeamento.

✗ Mapeamento frágil

  • Assumir que todo item tem todos os campos.
  • Acessar $json.a.b.c sem proteção.
  • Gravar undefined no banco/planilha.

📌 Resumo do Módulo

HTTP Request - fala com qualquer API REST; confira sempre o status code.
Autenticação - Bearer para servidor, OAuth2 para conta de usuário; 401 = checklist.
Supabase - banco é a memória; UPSERT por chave única grava ou atualiza.
Planilhas - entrega visível para o cliente; append/update por coluna.
Paginação - SplitInBatches + Wait respeita rate limit e evita N+1.
Nulos e mapeamento - ?? e ?. nas expressões ={{ }} tornam o fluxo resiliente.

Próximo Módulo:

4.4 - Confiabilidade (erros, retries, idempotência, observabilidade, checklist de produção)