QannasAPI

Limpe uma lista de e-mails em lote

O que você vai construir: um pipeline de enviar e recolher que verifica uma lista de endereços como um único job em lote e depois busca os resultados classificados — sem um laço de consulta próprio para manter.

SeçãoFluxos no servidor
Ações usadasPOST /v1/data/workflows/clean-list:estimatePOST /v1/bulk/jobsGET /v1/bulk/jobs/{job_id}/result
Créditos1 por endereço verificado (pior caso)
Funciona com chave de testeNão — precisa de uma chave real
Tempo estimado~15 min
Pré-requisitosUma chave qk_live_ com saldo e uma lista de endereços como array ou como texto CSV.

Envie a lista como um único job

Poste a ação e seus endereços no endpoint de lote, seja como array queries ou como csv_text. Você recebe um id de job na hora, em vez de manter uma conexão aberta durante toda a lista.

submit.sh
# Exactly one input source: queries[] or csv_text.
curl -X POST https://api.qannasapi.com/v1/bulk/jobs \
  -H "Authorization: Bearer $QANNAS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
        "action": "verify_email",
        "queries": ["jane@acme.example", "sam@acme.example"],
        "webhook_url": "https://yourapp.example/hooks/qannas"
      }'

# < 200  { "status": "OK", "data": { /* job id */ } }

Recolha os resultados

Consulte o job para ver o estado e depois busque o resultado quando ele terminar. Informe um webhook_url no envio e nós chamamos você — essa é a forma certa para qualquer lista acima de algumas centenas de endereços.

collect.sh
# Poll the job …
curl https://api.qannasapi.com/v1/bulk/jobs/$JOB_ID \
  -H "Authorization: Bearer $QANNAS_API_KEY"

# … then pull the graded results once it has finished.
curl https://api.qannasapi.com/v1/bulk/jobs/$JOB_ID/result \
  -H "Authorization: Bearer $QANNAS_API_KEY"

# Supplying webhook_url on submission skips this loop entirely.

Leia as notas, não só os veredictos

A verificação devolve uma nota por endereço, e não um simples sim ou não. Defina seu próprio limiar: escrever para um endereço classificado como arriscado é uma decisão de entregabilidade, não de API.

Reverifique periodicamente

A qualidade dos endereços se degrada conforme as pessoas mudam de emprego. Rodar a lista de novo a cada trimestre e comparar as notas dá uma taxa de degradação dos seus próprios dados, normalmente mais útil que qualquer verificação isolada.

decay.py
# Re-run quarterly and diff the grades. Your own decay rate is
# more useful than any single verification pass.
previous = load_grades("2026-Q2")
current = load_grades("2026-Q3")

decayed = [e for e in previous
           if ok(previous[e]) and not ok(current.get(e))]

print(f"{len(decayed) / len(previous):.1%} decayed this quarter")

Resumo

PadrãoComo
EnviarPOST /v1/bulk/jobs com action e queries ou csv_text
ConsultarGET /v1/bulk/jobs/{job_id}
RecolherGET /v1/bulk/jobs/{job_id}/result
Dispensar a consultaPasse webhook_url no envio
Forma do custoPor endereço resolvido, não por endereço enviado

Checklist de produção

  • Use um webhook para qualquer lista acima de algumas centenas de endereços.
  • Guarde a nota, não um booleano — você vai querer reajustar o limiar depois.
  • Cote a execução antes de enviar uma lista grande.
  • Reverifique a cada trimestre e acompanhe sua própria taxa de degradação.

Próximos passos

Rode a estimativa primeiro. Ela não custa nada e aplica exatamente a mesma aritmética que o medidor.