Voltar para Central de ajuda
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 03/10/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:

  • Gatilho: vem da conexão de origem SFTP/FTP — a tela mostra Leitura de arquivos (file_polling), não pergunta
  • Source connection: SFTP/FTP/FTPS com credenciais (host, porta, user, senha). O host precisa ser público: se ele (ou o que o DNS devolve para ele) for rede interna, loopback ou endereço de metadata da nuvem, a conexão é recusada por segurança, como nas conexões HTTP
  • 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 um incidente 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/mapeamentos/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 um incidente pedindo streaming.
  • Não suporta polling recursivo em subdiretórios (só o diretório configurado).
  • Glob suporta apenas * e ?. Sem **, sem [abc], sem brace expansion.


Arquivo EDI do parceiro (EDIFACT, X12, IDoc)



Quando a integração tem mapeamento e a mensagem de origem é EDIFACT, X12 ou IDoc, o Lefia lê o arquivo na estrutura da mensagem antes de aplicar o mapeamento: segmentos, grupos (por exemplo, cada LIN com os seus QTY e MOA), repetições e posições vêm do catálogo da mensagem, e os separadores vêm do próprio arquivo (UNA/ISA). O envelope (UNB, UNH, ISA, GS, ST…) fica à parte, em _envelope. Um arquivo com várias mensagens vira uma mensagem por documento, cada uma com o trecho exato do arquivo nos dados originais. A 1ª é processada na hora; as outras entram na fila de processamento, que passa a cada 5 minutos e leva até 50 mensagens por vez — um arquivo com 500 documentos termina em cerca de 50 minutos. Arquivo fora da forma da spec fica em erro com a linha e o segmento. Sem mapeamento, o arquivo segue como chegou.

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.

    07/05/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.

    07/05/2026 · new