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
- Peça ao suporte para abrir uma conta para você.
- Envie ao suporte os serviços de que você precisa, a sua conta e os IPs de saída dos seus servidores.
- 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 base
https://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
- Liste os serviços e consulte seu saldo. Guarde o productId de que você precisa.
- Leia a declaração de uso de dados e aceite-a, se ainda não tiver aceitado.
- Envie o arquivo de números e guarde o fileId retornado.
- Obtenha uma cotação com o productId e o fileId. Confira a quantidade, o preço unitário e o total.
- Crie e armazene uma chave de idempotência e depois faça o pedido. Isso cobra do seu saldo.
- 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.
- 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.
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"Envie um arquivo de números
curl -H "Authorization: Bearer $CHECKIM_TOKEN" \ -F 'file=@./numbers.csv;type=text/csv' \ "$CHECKIM_BASE/files"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"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"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"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
| Endpoint | Finalidade |
|---|---|
GET/compliance | Ler a declaração de uso de dados e saber se você a aceitou |
POST/compliance | Aceitar a versão atual da declaração |
GET/balance | Consultar o saldo da conta |
GET/products | Listar os serviços disponíveis e seus preços unitários |
Arquivos e cotações
| Endpoint | Finalidade |
|---|---|
POST/files | Enviar um arquivo de números (multipart, campo "file") |
POST/orders | Validar os números e obter uma cotação, válida por 180 segundos |
Pedidos
| Endpoint | Finalidade |
|---|---|
POST/orders | Fazer o pedido de uma cotação; exige o cabeçalho Idempotency-Key |
GET/orders | Listar pedidos: paginação por cursor, filtros por status e data de criação, conciliação com updatedSince |
GET/orders | Consultar o status e as quantidades de um pedido |
POST/orders | Cancelar 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
| Endpoint | Finalidade |
|---|---|
GET/orders | Listar os arquivos de resultado, cada um com seu sha256 |
GET/orders | Baixar um arquivo de resultado, com retomada por Range e If-None-Match |
Webhook
| Endpoint | Finalidade |
|---|---|
GET/webhook | Consultar a configuração do webhook e a saúde das entregas |
PUT/webhook | Definir a URL de recebimento e os eventos enviados |
DELETE/webhook | Desativar o webhook |
GET/webhook | Consultar o segredo de assinatura |
POST/webhook | Rotacionar o segredo de assinatura; o antigo e o novo assinam por 24 horas |
POST/webhook | Enviar um evento de teste |
GET/webhook | Listar 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.
| Evento | Enviado quando |
|---|---|
order.completed | O pedido foi liquidado e os resultados podem ser baixados |
order.cancelled | O pedido foi cancelado e reembolsado integralmente |
order.cancel_pending | O pedido está sendo cancelado e é liquidado quando a execução para |
order.needs_attention | O pedido foi para pós-venda ou precisa de tratamento manual |
order.partial_results | Um novo lote de resultados está pronto para download |
Status dos pedidos
| Status | Significado |
|---|---|
inQueue | Na fila. Continue consultando |
orderTaken | Aceito. Continue consultando |
executing | Em execução. Pedidos grandes com entrega em lotes já disponibilizam os lotes concluídos |
completed | Concluído. Baixe os resultados e confira as quantidades |
waitAfterSale | Uma solicitação de pós-venda está em análise |
pendingCancel | Cancelando. Continue consultando até o status final |
cancelled | Cancelado. 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.
| Código | HTTP | O que fazer |
|---|---|---|
INVALID_REQUEST | 400 | Corrija o parâmetro indicado em detail.field |
INVALID_CURSOR | 400 | O cursor é inválido; comece pela primeira página |
INVALID_API_TOKEN | 401 | Verifique se a chave está completa, não expirou e não foi revogada |
PERMISSION_DENIED | 403 | Peça ao suporte para conferir seus serviços e IPs de saída |
QUOTE_EXPIRED | 409 | Confirme que nenhum pedido foi feito e depois cote novamente |
INSUFFICIENT_BALANCE | 409 | Recarregue e depois cote e faça o pedido novamente |
ORDER_NOT_CANCELLABLE | 409 | O pedido já começou ou terminou e não pode ser cancelado |
RETRY_SAME_REQUEST | 409 | Houve conflito com outra operação; repita a mesma requisição com espera progressiva |
COMPLIANCE_ACCEPTANCE_REQUIRED | 422 | Leia e aceite primeiro a declaração de uso de dados |
RATE_LIMITED | 429 | Aguarde o tempo de Retry-After e envie com menos frequência |
TOO_MANY_CONCURRENT_REQUESTS | 429 | Aguarde a conclusão de uma cotação ou envio anterior |
DATABASE_UNAVAILABLE | 503 | Indisponí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.