Documentación de la API
Sube números, obtén cotizaciones, haz pedidos y descarga resultados por HTTP. Pensada para equipos que procesan en bloque y automatizan. Las reglas son las mismas que en los pedidos web, y los precios corresponden a tu cuenta.
Obtener acceso a la API
- Pide a soporte que te abra una cuenta.
- Envía a soporte los servicios que necesitas, tu cuenta y las IP de salida de tus servidores.
- Después te enviamos una clave de API y la guía de integración completa. Las claves son válidas de 1 a 730 días, y cada clave admite hasta 32 IP de salida.
Conceptos básicos
URL base
https://api.checkim.ai/openapi/v1- Autenticación
- Envía Authorization: Bearer <clave de API> en cada solicitud
- User-Agent
- Obligatorio. Cloudflare bloquea las solicitudes que no lo envían (error 1010)
- Formato
- Solicitudes y respuestas en JSON con UTF-8, excepto la carga de archivos
- Hora
- Marcas de tiempo Unix en UTC, en milisegundos
- Montos
- Hasta ocho decimales. Usa un tipo decimal y no redondees a dos decimales
Flujo de integración
- Consulta los servicios y tu saldo. Guarda el productId que necesitas.
- Lee la declaración de uso de datos y acéptala si aún no lo has hecho.
- Sube el archivo de números y guarda el fileId que se devuelve.
- Obtén una cotización con el productId y el fileId. Revisa la cantidad, el precio unitario y el total.
- Crea y guarda una clave de idempotencia y después haz el pedido. Esto genera un cargo a tu saldo.
- Configura un webhook para recibir los cambios de estado y concilia con updatedSince cada 5–10 minutos para no perder ninguno.
- Cuando el pedido termine, lista los archivos de resultados, descárgalos todos y verifica su sha256. Descarga también los no exitosos.
Ejemplo con curl
Reemplaza los marcadores. Los parámetros completos de cotización y pedido están en la guía que recibes junto con el acceso.
Configura tu clave y lista los servicios
export CHECKIM_TOKEN='reemplaza con la clave de API que te dio soporte' export CHECKIM_BASE='https://api.checkim.ai/openapi/v1' curl -H "Authorization: Bearer $CHECKIM_TOKEN" "$CHECKIM_BASE/products"Sube un archivo de números
curl -H "Authorization: Bearer $CHECKIM_TOKEN" \ -F 'file=@./numbers.csv;type=text/csv' \ "$CHECKIM_BASE/files"Obtén una cotización
curl -H "Authorization: Bearer $CHECKIM_TOKEN" \ -H 'Content-Type: application/json' \ -d '{"productId":"<productId>","name":"batch-001","fileId":"<fileId>"}' \ "$CHECKIM_BASE/orders/check"Haz el pedido
# Genera un cargo a tu saldo. Al reintentar, mantén idénticos la clave y el cuerpo. 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"Consulta un pedido o concilia por hora de cambio
curl -H "Authorization: Bearer $CHECKIM_TOKEN" "$CHECKIM_BASE/orders/<orderId>" curl -H "Authorization: Bearer $CHECKIM_TOKEN" \ "$CHECKIM_BASE/orders?updatedSince=<UTC ms>&size=100"Lista y descarga los resultados y verifica el 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
Cuenta y declaración
| Endpoint | Para qué sirve |
|---|---|
GET/compliance | Consultar la declaración de uso de datos y si la aceptaste |
POST/compliance | Aceptar la versión vigente de la declaración |
GET/balance | Consultar el saldo de la cuenta |
GET/products | Listar los servicios disponibles y tus precios unitarios |
Archivos y cotizaciones
| Endpoint | Para qué sirve |
|---|---|
POST/files | Subir un archivo de números (multipart, campo "file") |
POST/orders | Validar números y obtener una cotización, válida durante 180 segundos |
Pedidos
| Endpoint | Para qué sirve |
|---|---|
POST/orders | Hacer el pedido de una cotización; requiere el encabezado Idempotency-Key |
GET/orders | Listar pedidos: paginación con cursor, filtros por estado y fecha de creación, conciliación con updatedSince |
GET/orders | Consultar el estado y las cantidades de un pedido |
POST/orders | Cancelar un pedido: los que están en cola o sin despachar se reembolsan completos al instante, los despachados pasan a cancelándose y los que están en ejecución no se pueden cancelar |
Resultados
| Endpoint | Para qué sirve |
|---|---|
GET/orders | Listar los archivos de resultados, cada uno con su sha256 |
GET/orders | Descargar un archivo de resultados, con reanudación por Range e If-None-Match |
Webhook
| Endpoint | Para qué sirve |
|---|---|
GET/webhook | Consultar la configuración del webhook y el estado de las entregas |
PUT/webhook | Definir la URL de recepción y los eventos que se envían |
DELETE/webhook | Desactivar el webhook |
GET/webhook | Consultar el secreto de firma |
POST/webhook | Rotar el secreto de firma; el anterior y el nuevo firman durante 24 horas |
POST/webhook | Enviar un evento de prueba |
GET/webhook | Listar las entregas recientes |
Listar y conciliar pedidos
- Los pedidos se listan del más reciente al más antiguo. Si una página trae nextCursor, envíalo como cursor para obtener la siguiente; la paginación con cursor nunca omite ni repite pedidos aunque lleguen nuevos.
- Filtra por status y por fecha de creación (createdFrom, createdTo, en milisegundos UTC), o busca un pedido por su clientOrderId.
- updatedSince devuelve solo los pedidos cuyo estado cambió después de esa hora, del cambio más antiguo al más reciente. Consúltalo con regularidad y un webhook perdido nunca te hará perder un estado.
Descargar resultados
- Cada archivo de la lista de resultados tiene un sha256. El ETag de la descarga es el mismo valor, así que compáralo después de descargar.
- Las solicitudes con Range reanudan una descarga. Antes verifica que el sha256 no haya cambiado; si cambió, el archivo se regeneró y debes descargarlo completo otra vez.
- Si ya tienes el archivo completo, envía If-None-Match: si no cambió, recibes 304 sin cuerpo.
- Los pedidos grandes con entrega por lotes muestran los lotes terminados mientras se ejecutan; el archivo final, al terminar, es la versión válida.
- En los servicios con foto de perfil (verificación ampliada o de género y edad de Telegram y WhatsApp), la columna avatar del CSV de resultados incluye un enlace de imagen firmado que se puede abrir directamente con GET mientras se conserven los resultados (sin enviar el encabezado Authorization; admite If-None-Match).
Webhooks
- Cuando cambia el estado de un pedido hecho por la API, enviamos un evento por POST a tu URL HTTPS. Requiere el permiso webhook:manage.
- Cada evento trae el encabezado CheckIM-Signature (t=marca de tiempo,v1=firma). Verifícalo con HMAC-SHA256 de "t.cuerpo original de la solicitud" usando tu secreto de firma.
- Cualquier 2xx cuenta como entregado; los fallos se reintentan 9 veces durante unos 2 días. Puedes recibir un evento más de una vez, así que elimina duplicados por su id.
- Las solicitudes salen de la IP fija 34.21.195.36, así que puedes permitir solo esa dirección.
| Evento | Se envía cuando |
|---|---|
order.completed | El pedido se liquidó y los resultados se pueden descargar |
order.cancelled | El pedido se canceló con reembolso total |
order.cancel_pending | El pedido se está cancelando y se liquida cuando se detiene la ejecución |
order.needs_attention | El pedido pasó a posventa o requiere atención manual |
order.partial_results | Hay un nuevo lote de resultados listo para descargar |
Estados del pedido
| Estado | Significado |
|---|---|
inQueue | En cola. Sigue consultando |
orderTaken | Aceptado. Sigue consultando |
executing | En ejecución. En los pedidos grandes con entrega por lotes ya se pueden descargar los lotes terminados |
completed | Terminado. Descarga los resultados y revisa las cantidades |
waitAfterSale | Se está atendiendo una solicitud de posventa |
pendingCancel | Cancelando. Sigue consultando hasta el estado final |
cancelled | Cancelado. Reembolso total si seguía en cola; de lo contrario, se cobra el trabajo realizado |
Límites y notas
- De forma predeterminada, como máximo 1,200 solicitudes por minuto por IP de salida, 240 por cuenta y 120 por clave. Los encabezados RateLimit-Limit, RateLimit-Remaining y RateLimit-Reset indican cuántas te quedan en el minuto.
- Las cotizaciones y las cargas son lentas, así que cada cuenta puede tener como máximo 3 en curso a la vez. Las demás reciben 429 TOO_MANY_CONCURRENT_REQUESTS.
- Ante un 429 o un 503, espera los segundos que indique Retry-After y reintenta la misma solicitud.
- No hay entorno de pruebas. Cada pedido genera un cargo real.
- Que una consulta exceda el tiempo de espera no significa que el pedido haya fallado. Busca el pedido por orderId o clientOrderId antes de volver a pedir.
Errores comunes
Los errores incluyen code, requestId, message y, opcionalmente, detail.field. Manéjalos según code; message llega en uno de 9 idiomas según Accept-Language y es solo para mostrar.
| Código | HTTP | Qué hacer |
|---|---|---|
INVALID_REQUEST | 400 | Corrige el parámetro indicado en detail.field |
INVALID_CURSOR | 400 | El cursor no es válido; empieza desde la primera página |
INVALID_API_TOKEN | 401 | Verifica que la clave esté completa, no haya vencido y no se haya revocado |
PERMISSION_DENIED | 403 | Pide a soporte que revise tus servicios y tus IP de salida |
QUOTE_EXPIRED | 409 | Confirma que no se haya hecho ningún pedido y vuelve a cotizar |
INSUFFICIENT_BALANCE | 409 | Recarga saldo y vuelve a cotizar y pedir |
ORDER_NOT_CANCELLABLE | 409 | El pedido ya empezó o terminó y no se puede cancelar |
RETRY_SAME_REQUEST | 409 | Chocó con otra operación; reintenta la misma solicitud con espera progresiva |
COMPLIANCE_ACCEPTANCE_REQUIRED | 422 | Primero lee y acepta la declaración de uso de datos |
RATE_LIMITED | 429 | Espera lo que indique Retry-After y envía con menos frecuencia |
TOO_MANY_CONCURRENT_REQUESTS | 429 | Espera a que termine una cotización o carga anterior |
DATABASE_UNAVAILABLE | 503 | No disponible temporalmente; reintenta después de Retry-After |
¿Necesitas acceso a la API?
Envía a soporte los servicios que necesitas y tus IP de salida. Te enviaremos una clave y la guía completa, con un cliente de ejemplo en Python.