Todos os artigos
FT-FILE-POLL-V1· 1.0.1Integrações

Como configurar file polling SFTP/FTP

File polling busca arquivos de um diretório SFTP/FTP em intervalos regulares, baixa, processa pelo pipeline e marca como duplicado se já viu o arquivo.

Atualizado em 8/6/2026
Use file polling quando o parceiro deposita arquivos num servidor (SFTP, FTP, FTPS) e você precisa que o Lefia busque e processe automaticamente.

Configuração obrigatória



Na criação da integração, defina:

  • Trigger type: file_polling
  • Source connection: SFTP/FTP/FTPS com credenciais (host, porta, user, senha)
  • Poll directory: caminho absoluto do diretório no servidor remoto (ex: /inbound, /edi/orders)
  • Poll file pattern: padrão glob dos arquivos a buscar:
- *.xml — qualquer arquivo XML
- INV_*.csv — começa com INV_ e termina em .csv - pedido_???.dat? casa exatamente 1 caractere
- ou .* ou vazio — todos os arquivos
  • Post-processing: o que fazer com o arquivo depois de processar
- delete — apaga
- archive — move pra subpasta archive/ (criada se não existir)
- none — deixa em paz (cuidado: vai re-listar mesmo arquivo no próximo poll, mas não reprocessa graças à dedup)

Como funciona a dedup



Cada arquivo gera uma idempotency_key no formato file:<filename>:<size>. A constraint unique uq_messages_idempotency_key em (tenant_id, integration_id, idempotency_key) garante que o mesmo arquivo nunca é processado duas vezes — mesmo se duas execuções do cron rodarem em paralelo.

Se o arquivo for substituído por um com mesmo nome mas tamanho diferente, é tratado como novo. Se você precisar dedup por conteúdo, abra ticket pra adicionar hash SHA-256 no key.

Teste manual



Use dryRun: true pra ver o que casaria sem baixar nem processar:

curl -X POST $BASE_URL/api/edi-hub/execute-file-poll \
-H "authorization: Bearer $CRON_SECRET" \
-H "content-type: application/json" \
-d '{"integrationId":"<uuid>","dryRun":true}'


A resposta lista cada arquivo encontrado com status: dry_run.

Limites conhecidos



  • Arquivos baixam pra memória antes de inserir no banco (Buffer). Ok pra payload EDI/CSV típico (<10MB). Pra arquivos enormes abrir ticket de streaming.
  • Não suporta polling recursivo em subdiretórios (só o diretório configurado).
  • Glob suporta apenas * e ?. Sem **, sem [abc], sem brace expansion.

Histórico de versões

  • 1.0.1

    E2E real contra test.rebex.net validou connector SFTP: connect/sftp/readdir/glob/download em 4.1s, 7/7 steps OK. Resolve pendência aberta no snapshot 2026-05-07.

    5/7/2026 · updated

  • 1.0.0

    File polling real: connector list/download/postProcess + glob matcher + dedup at-insert via idempotency_key. Substitui o TODO stub anterior em execute-file-poll/route.ts.

    5/7/2026 · new