Saltar al contenido principal
Version: 1.0.0

Referencia de errores

Esta página documenta cada error que la API Scan de Cert-IX puede devolver, organizado por categoría.

Formato de respuesta

{
"success": false,
"error": "Descripción legible del error",
"code": "CODIGO_LEGIBLE_POR_MAQUINA"
}

Códigos de estado HTTP

EstadoCategoríaSignificado
400Error del clienteSolicitud inválida — JSON malformado, campos requeridos faltantes
401AutenticaciónClave API faltante, inválida, expirada o revocada
403AutorizaciónClave válida pero alcance insuficiente, IP no permitida o tipo de análisis no permitido
404No encontradoEl recurso no existe o no pertenece a su tenant
409ConflictoConflicto de estado del recurso (ej.: cancelar un análisis ya completado)
429Límite de tasaLímite de tasa o cuota excedida
500Error del servidorError interno — contacte soporte si persiste
503No disponibleServicio temporalmente no disponible — reintente con backoff

Errores de autenticación (401)

CódigoMensajeCausaResolución
MISSING_API_KEYLa clave API es requeridaNo se proporcionó encabezado X-API-KeyAgregue el encabezado X-API-Key a su solicitud
INVALID_API_KEYClave API inválidaEl formato es incorrecto o la clave no existeVerifique que la clave comience con cix_sk_
KEY_EXPIREDLa clave API ha expiradoLa clave superó su fecha expiresAtCree una nueva clave o realice rotación
KEY_REVOKEDLa clave API ha sido revocadaLa clave fue explícitamente revocadaCree una nueva clave
KEY_SUSPENDEDLa clave API ha sido suspendidaLa clave fue suspendida por un administradorContacte al administrador de su organización

Errores de autorización (403)

CódigoMensajeCausaResolución
INSUFFICIENT_SCOPEAlcance insuficiente: requiere {scope}La clave no tiene el alcance requeridoCree una nueva clave con el alcance requerido
SCAN_TYPE_NOT_ALLOWEDTipo de análisis {type} no permitidoallowedScanTypes de la clave no incluye este motorActualice la clave o cree una que permita este tipo
IP_NOT_ALLOWEDIP de origen no está en la lista permitidaLa IP de la solicitud no está en allowedIpAddressesAgregue la IP de origen a la lista o elimine las restricciones
TENANT_SUSPENDEDLa cuenta del tenant está suspendidaLa cuenta de su organización ha sido suspendidaContacte [email protected]

Errores de análisis (400 / 404 / 409)

CódigoHTTPMensajeResolución
SCAN_NOT_FOUND404Análisis no encontradoVerifique el ID del análisis y el parámetro scanType
INVALID_SCAN_TYPE400Tipo de análisis inválido: {type}Use un motor válido: nmap, zap, trivy, nuclei, nikto, sqlmap, wapiti, harvester, sublist3r, sentinel
INVALID_TARGET400Formato de objetivo inválidoVerifique que el objetivo coincida con el formato esperado
INVALID_PRIORITY400Prioridad inválida: {value}Use: critical, high, normal o low
SCAN_ALREADY_COMPLETED409El análisis ya está completadoNo se puede cancelar un análisis que alcanzó un estado terminal
SCAN_ALREADY_CANCELLED409El análisis ya está canceladoEl análisis ya fue cancelado
SCAN_ALREADY_FAILED409El análisis ya fallóNo se puede cancelar un análisis fallido
RESULTS_NOT_READY409Los resultados aún no están disponiblesEspere a que el análisis alcance el estado completed

Errores de plantillas (400 / 404)

CódigoHTTPMensajeResolución
TEMPLATE_NOT_FOUND404Plantilla de análisis no encontradaVerifique el ID de la plantilla
TEMPLATE_NAME_REQUIRED400El nombre de la plantilla es requeridoProporcione un campo name
DUPLICATE_TEMPLATE_NAME400El nombre de la plantilla ya existeUse un nombre único

Errores de webhooks (400 / 404)

CódigoHTTPMensajeResolución
WEBHOOK_NOT_FOUND404Webhook no encontradoVerifique el ID del webhook
INVALID_WEBHOOK_URL400La URL del webhook debe usar HTTPSAsegúrese de que su URL comience con https://
WEBHOOK_URL_UNREACHABLE400No se puede alcanzar la URL del webhookVerifique que su endpoint sea accesible públicamente
INVALID_WEBHOOK_EVENT400Tipo de evento inválido: {event}Use eventos válidos: scan.completed, scan.failed, scan.started, scan.cancelled
WEBHOOK_DISABLED409Webhook desactivado por fallos consecutivosReactive con PATCH y corrija su endpoint

Errores de límite de tasa y cuotas (429)

CódigoMensajeResolución
RATE_LIMIT_EXCEEDEDLímite de tasa excedido. Reintente en {N} segundos.Implemente backoff exponencial; verifique el encabezado Retry-After
QUOTA_EXCEEDEDCuota mensual de análisis excedidaActualice su plan o espere al siguiente período de facturación

Errores de validación (400)

CódigoMensajeResolución
INVALID_JSONEl cuerpo de la solicitud no es JSON válidoVerifique su sintaxis JSON
MISSING_REQUIRED_FIELDCampo requerido faltante: {field}Incluya todos los campos requeridos
INVALID_FIELD_TYPEEl campo {field} debe ser de tipo {type}Corrija el tipo de datos del campo
INVALID_PAGELa página debe ser un entero positivoUse page ≥ 1
INVALID_LIMITEl límite debe estar entre 1 y 100Use limit entre 1 y 100

Errores del servidor (500 / 503)

CódigoMensajeResolución
INTERNAL_ERRORSe produjo un error interno del servidorReintente con backoff; contacte soporte si persiste
SERVICE_UNAVAILABLEServicio temporalmente no disponibleReintente con backoff; verifique status.cert-ix.com
DATABASE_ERRORLa operación de base de datos fallóReintente; contacte soporte si persiste
KAFKA_ERRORLa operación de cola de mensajes fallóReintente; la cola puede estar temporalmente congestionada

Guía de resolución de problemas

« 401 — MISSING_API_KEY »

# ✅ Correcto
curl -H "X-API-Key: cix_sk_..." https://api.cert-ix.com/scan-api/api/v1/scans

# ❌ Incorrecto — clave en parámetros URL
curl "https://api.cert-ix.com/scan-api/api/v1/scans?apiKey=cix_sk_..."

« 404 — SCAN_NOT_FOUND »

Causas más comunes:

  1. scanType incorrecto — Si creó un análisis zap, debe consultar con ?scanType=zap
  2. ID de análisis incorrecto — Verifique el UUID
  3. Tenant diferente — Las claves de organizaciones diferentes no pueden ver los análisis de las demás

« 429 — RATE_LIMIT_EXCEEDED »

Implemente backoff exponencial:

import time

def solicitud_con_backoff(func, max_reintentos=5):
for intento in range(max_reintentos):
response = func()
if response.status_code != 429:
return response
retry_after = int(response.headers.get("Retry-After", 2 ** intento))
time.sleep(retry_after)
raise Exception("Número máximo de reintentos superado")

Próximos pasos: