Pular para o conteúdo

Documentação da API

Envie números, obtenha cotações, faça pedidos e baixe resultados via HTTP. Feita para equipes que processam em massa e automatizam. As regras são as mesmas dos pedidos pela web, e os preços seguem a sua conta.

Obter acesso à API

  1. Peça ao suporte para abrir uma conta para você.
  2. Envie ao suporte os serviços de que você precisa, a sua conta e os IPs de saída dos seus servidores.
  3. Em seguida, emitimos uma chave de API e o guia de integração completo. As chaves valem de 1 a 730 dias, e cada chave aceita até 32 IPs de saída.

Informações básicas

URL basehttps://api.checkim.ai/openapi/v1
Autenticação
Envie Authorization: Bearer <chave de API> em todas as requisições
User-Agent
Obrigatório. Requisições sem ele são bloqueadas pela Cloudflare (error 1010)
Formato
Requisições e respostas em JSON, em UTF-8, exceto no envio de arquivos
Horário
Timestamps Unix em UTC, em milissegundos
Valores
Até oito casas decimais. Use um tipo decimal e não arredonde para duas casas

Fluxo de integração

  1. Liste os serviços e consulte seu saldo. Guarde o productId de que você precisa.
  2. Leia a declaração de uso de dados e aceite-a, se ainda não tiver aceitado.
  3. Envie o arquivo de números e guarde o fileId retornado.
  4. Obtenha uma cotação com o productId e o fileId. Confira a quantidade, o preço unitário e o total.
  5. Crie e armazene uma chave de idempotência e depois faça o pedido. Isso cobra do seu saldo.
  6. Configure um webhook para receber as mudanças de status e faça a conciliação com updatedSince a cada 5–10 minutos para não perder nada.
  7. Quando o pedido for concluído, liste os arquivos de resultado, baixe todos e confira o sha256 de cada um. Baixe também os sem sucesso.

Exemplo com curl

Substitua os placeholders. Os parâmetros completos de cotação e pedido estão no guia que você recebe com o acesso.

  1. Defina sua chave e liste os serviços

    export CHECKIM_TOKEN='substitua pela chave de API fornecida pelo suporte'
    export CHECKIM_BASE='https://api.checkim.ai/openapi/v1'
    
    curl -H "Authorization: Bearer $CHECKIM_TOKEN" "$CHECKIM_BASE/products"
  2. Envie um arquivo de números

    curl -H "Authorization: Bearer $CHECKIM_TOKEN" \
      -F 'file=@./numbers.csv;type=text/csv' \
      "$CHECKIM_BASE/files"
  3. Obtenha uma cotação

    curl -H "Authorization: Bearer $CHECKIM_TOKEN" \
      -H 'Content-Type: application/json' \
      -d '{"productId":"<productId>","name":"batch-001","fileId":"<fileId>"}' \
      "$CHECKIM_BASE/orders/check"
  4. Faça o pedido

    # Cobra do seu saldo. Mantenha a chave e o corpo idênticos ao tentar novamente.
    curl -H "Authorization: Bearer $CHECKIM_TOKEN" \
      -H 'Content-Type: application/json' \
      -H 'Idempotency-Key: partner-request-001' \
      -d '{"quoteId":"<quoteId>","clientOrderId":"partner-batch-001"}' \
      "$CHECKIM_BASE/orders"
  5. Consulte um pedido ou concilie pelo horário de alteração

    curl -H "Authorization: Bearer $CHECKIM_TOKEN" "$CHECKIM_BASE/orders/<orderId>"
    
    curl -H "Authorization: Bearer $CHECKIM_TOKEN" \
      "$CHECKIM_BASE/orders?updatedSince=<UTC ms>&size=100"
  6. Liste e baixe os resultados e confira o sha256

    curl -H "Authorization: Bearer $CHECKIM_TOKEN" "$CHECKIM_BASE/orders/<orderId>/results"
    
    curl -H "Authorization: Bearer $CHECKIM_TOKEN" -o result.csv \
      "$CHECKIM_BASE/orders/<orderId>/results/<fileId>/download"
    shasum -a 256 result.csv

Endpoints

Conta e declaração

Endpoints: Conta e declaração
EndpointFinalidade
GET/complianceLer a declaração de uso de dados e saber se você a aceitou
POST/compliance/acceptAceitar a versão atual da declaração
GET/balanceConsultar o saldo da conta
GET/productsListar os serviços disponíveis e seus preços unitários

Arquivos e cotações

Endpoints: Arquivos e cotações
EndpointFinalidade
POST/filesEnviar um arquivo de números (multipart, campo "file")
POST/orders/checkValidar os números e obter uma cotação, válida por 180 segundos

Pedidos

Endpoints: Pedidos
EndpointFinalidade
POST/ordersFazer o pedido de uma cotação; exige o cabeçalho Idempotency-Key
GET/ordersListar pedidos: paginação por cursor, filtros por status e data de criação, conciliação com updatedSince
GET/orders/{orderId}Consultar o status e as quantidades de um pedido
POST/orders/{orderId}/cancelCancelar um pedido: pedidos na fila ou não despachados são reembolsados integralmente na hora, os despachados passam a cancelando e os em execução não podem ser cancelados

Resultados

Endpoints: Resultados
EndpointFinalidade
GET/orders/{orderId}/resultsListar os arquivos de resultado, cada um com seu sha256
GET/orders/{orderId}/results/{fileId}/downloadBaixar um arquivo de resultado, com retomada por Range e If-None-Match

Webhook

Endpoints: Webhook
EndpointFinalidade
GET/webhookConsultar a configuração do webhook e a saúde das entregas
PUT/webhookDefinir a URL de recebimento e os eventos enviados
DELETE/webhookDesativar o webhook
GET/webhook/secretConsultar o segredo de assinatura
POST/webhook/secret/rotateRotacionar o segredo de assinatura; o antigo e o novo assinam por 24 horas
POST/webhook/testEnviar um evento de teste
GET/webhook/deliveriesListar as entregas recentes

Listar e conciliar pedidos

  • Os pedidos são listados do mais recente para o mais antigo. Quando uma página trouxer nextCursor, envie-o como cursor para obter a próxima; a paginação por cursor nunca pula nem repete pedidos, mesmo com novos chegando.
  • Filtre por status e por data de criação (createdFrom, createdTo, em milissegundos UTC), ou busque um pedido pelo clientOrderId.
  • updatedSince retorna apenas os pedidos cujo status mudou depois desse horário, da mudança mais antiga para a mais recente. Consulte com regularidade e um webhook perdido nunca fará você perder um status.

Baixar resultados

  • Cada arquivo da lista de resultados tem um sha256. O ETag do download é o mesmo valor, então compare depois de baixar.
  • Requisições com Range retomam um download. Antes, confira se o sha256 não mudou; se mudou, o arquivo foi regerado e você precisa baixá-lo inteiro de novo.
  • Se você já tem o arquivo completo, envie If-None-Match: se nada mudou, a resposta é 304 sem corpo.
  • Pedidos grandes com entrega em lotes listam os lotes concluídos durante a execução; o arquivo final, após a conclusão, é a versão oficial.
  • Nos serviços com foto de perfil (verificação avançada ou de gênero e idade do Telegram e do WhatsApp), a coluna avatar do CSV de resultado traz um link de imagem assinado que pode ser aberto diretamente com GET enquanto os resultados estiverem disponíveis (sem enviar o cabeçalho Authorization; aceita If-None-Match).

Webhooks

  • Quando o status de um pedido feito pela API muda, enviamos um evento por POST para a sua URL HTTPS. Exige a permissão webhook:manage.
  • Cada evento traz o cabeçalho CheckIM-Signature (t=timestamp,v1=assinatura). Verifique-o com HMAC-SHA256 de "t.corpo bruto da requisição" usando o seu segredo de assinatura.
  • Qualquer 2xx conta como entregue; falhas são repetidas 9 vezes ao longo de cerca de 2 dias. Você pode receber um evento mais de uma vez, então elimine duplicados pelo id.
  • As requisições saem do IP fixo 34.21.195.36, então você pode liberar apenas esse endereço.
Webhooks
EventoEnviado quando
order.completedO pedido foi liquidado e os resultados podem ser baixados
order.cancelledO pedido foi cancelado e reembolsado integralmente
order.cancel_pendingO pedido está sendo cancelado e é liquidado quando a execução para
order.needs_attentionO pedido foi para pós-venda ou precisa de tratamento manual
order.partial_resultsUm novo lote de resultados está pronto para download

Status dos pedidos

Status dos pedidos
StatusSignificado
inQueueNa fila. Continue consultando
orderTakenAceito. Continue consultando
executingEm execução. Pedidos grandes com entrega em lotes já disponibilizam os lotes concluídos
completedConcluído. Baixe os resultados e confira as quantidades
waitAfterSaleUma solicitação de pós-venda está em análise
pendingCancelCancelando. Continue consultando até o status final
cancelledCancelado. Reembolso integral se ainda estava na fila; caso contrário, cobrado pelo trabalho realizado

Limites e observações

  • Por padrão, no máximo 1.200 requisições por minuto por IP de saída, 240 por conta e 120 por chave. Os cabeçalhos RateLimit-Limit, RateLimit-Remaining e RateLimit-Reset mostram quantas restam neste minuto.
  • Cotações e envios de arquivo são lentos, então cada conta pode ter no máximo 3 em andamento ao mesmo tempo. Os demais recebem 429 TOO_MANY_CONCURRENT_REQUESTS.
  • Ao receber 429 ou 503, aguarde os segundos indicados em Retry-After e repita a mesma requisição.
  • Não há ambiente de testes (sandbox). Todo pedido gera uma cobrança real.
  • Um tempo limite esgotado na consulta não significa que o pedido falhou. Procure o pedido pelo orderId ou clientOrderId antes de fazer um novo pedido.

Erros comuns

Os erros trazem code, requestId, message e, opcionalmente, detail.field. Trate-os pelo code; message vem em um de 9 idiomas conforme o Accept-Language e serve apenas para exibição.

Erros comuns
CódigoHTTPO que fazer
INVALID_REQUEST400Corrija o parâmetro indicado em detail.field
INVALID_CURSOR400O cursor é inválido; comece pela primeira página
INVALID_API_TOKEN401Verifique se a chave está completa, não expirou e não foi revogada
PERMISSION_DENIED403Peça ao suporte para conferir seus serviços e IPs de saída
QUOTE_EXPIRED409Confirme que nenhum pedido foi feito e depois cote novamente
INSUFFICIENT_BALANCE409Recarregue e depois cote e faça o pedido novamente
ORDER_NOT_CANCELLABLE409O pedido já começou ou terminou e não pode ser cancelado
RETRY_SAME_REQUEST409Houve conflito com outra operação; repita a mesma requisição com espera progressiva
COMPLIANCE_ACCEPTANCE_REQUIRED422Leia e aceite primeiro a declaração de uso de dados
RATE_LIMITED429Aguarde o tempo de Retry-After e envie com menos frequência
TOO_MANY_CONCURRENT_REQUESTS429Aguarde a conclusão de uma cotação ou envio anterior
DATABASE_UNAVAILABLE503Indisponível no momento; tente novamente após o Retry-After

Precisa de acesso à API?

Envie ao suporte os serviços de que você precisa e seus IPs de saída. Emitiremos uma chave e o guia completo, com um cliente de exemplo em Python.