Aller au contenu principal
Version: Next đźš§

Error Reference

This page documents every error the Cert-IX Scan API can return, organized by category. Use this as a reference when debugging integration issues.

Response Format​

All error responses follow a consistent JSON envelope:

{
"success": false,
"error": "Human-readable error description",
"code": "MACHINE_READABLE_CODE"
}
FieldDescription
successAlways false for errors
errorDescriptive message explaining the problem
codeStable machine-readable error code for programmatic handling

HTTP Status Codes​

StatusCategoryMeaning
400Client ErrorInvalid request — malformed JSON, missing required fields, invalid parameters
401AuthenticationMissing, invalid, expired, or revoked API key
403AuthorizationValid key but insufficient scope, IP not allowed, or scan type not permitted
404Not FoundResource does not exist or does not belong to your tenant
409ConflictResource state conflict (e.g., cancelling an already completed scan)
429Rate LimitRate limit or quota exceeded
500Server ErrorInternal server error — contact support if persistent
503UnavailableService temporarily unavailable — retry with backoff

Authentication Errors (401)​

CodeMessageCauseResolution
MISSING_API_KEYAPI key is requiredNo X-API-Key header providedAdd the X-API-Key header to your request
INVALID_API_KEYInvalid API keyKey format is incorrect or doesn't existVerify the key format starts with cix_sk_
KEY_EXPIREDAPI key has expiredKey has passed its expiresAt dateCreate a new key or rotate the expired one
KEY_REVOKEDAPI key has been revokedKey was explicitly revokedCreate a new key
KEY_SUSPENDEDAPI key has been suspendedKey was suspended by an adminContact your organization admin

Authorization Errors (403)​

CodeMessageCauseResolution
INSUFFICIENT_SCOPEInsufficient scope: requires {scope}Key lacks the required scope for this operationCreate a new key with the required scope
SCAN_TYPE_NOT_ALLOWEDScan type {type} not allowed for this API keyKey's allowedScanTypes doesn't include this engineUpdate the key or create one with this scan type allowed
IP_NOT_ALLOWEDSource IP not in allowed listRequest IP is not in the key's allowedIpAddressesAdd the source IP to the key's allowlist or remove IP restrictions
TENANT_SUSPENDEDTenant account is suspendedYour organization's account has been suspendedContact [email protected]

Scan Errors (400 / 404 / 409)​

CodeHTTPMessageResolution
SCAN_NOT_FOUND404Scan not foundVerify the scan ID and scanType parameter
INVALID_SCAN_TYPE400Invalid scan type: {type}Use a valid engine: nmap, zap, trivy, nuclei, nikto, sqlmap, wapiti, harvester, sublist3r, sentinel
INVALID_TARGET400Invalid target formatCheck the target matches the expected format for the scan type
INVALID_PRIORITY400Invalid priority: {value}Use: critical, high, normal, or low
SCAN_ALREADY_COMPLETED409Scan has already completedCannot cancel a scan that has reached a terminal state
SCAN_ALREADY_CANCELLED409Scan has already been cancelledScan was already cancelled
SCAN_ALREADY_FAILED409Scan has already failedCannot cancel a scan that has failed
RESULTS_NOT_READY409Scan results are not yet availableWait for the scan to reach completed status

Template Errors (400 / 404)​

CodeHTTPMessageResolution
TEMPLATE_NOT_FOUND404Scan template not foundVerify the template ID
TEMPLATE_NAME_REQUIRED400Template name is requiredProvide a name field
DUPLICATE_TEMPLATE_NAME400Template name already existsUse a unique name

Webhook Errors (400 / 404)​

CodeHTTPMessageResolution
WEBHOOK_NOT_FOUND404Webhook not foundVerify the webhook ID
INVALID_WEBHOOK_URL400Webhook URL must use HTTPSEnsure your URL starts with https://
WEBHOOK_URL_UNREACHABLE400Could not reach webhook URLVerify your endpoint is publicly accessible
INVALID_WEBHOOK_EVENT400Invalid event type: {event}Use valid events: scan.completed, scan.failed, scan.started, scan.cancelled
WEBHOOK_DISABLED409Webhook is disabled due to consecutive failuresRe-enable with PATCH and fix your endpoint

Rate Limit & Quota Errors (429)​

CodeMessageResolution
RATE_LIMIT_EXCEEDEDRate limit exceeded. Retry in {N} seconds.Implement exponential backoff; check Retry-After header
QUOTA_EXCEEDEDMonthly scan quota exceededUpgrade your plan or wait for the next billing period

Validation Errors (400)​

CodeMessageResolution
INVALID_JSONRequest body is not valid JSONCheck your JSON syntax
MISSING_REQUIRED_FIELDMissing required field: {field}Include all required fields
INVALID_FIELD_TYPEField {field} must be of type {type}Correct the field data type
INVALID_PAGEPage must be a positive integerUse page ≥ 1
INVALID_LIMITLimit must be between 1 and 100Use limit between 1 and 100

Server Errors (500 / 503)​

CodeMessageResolution
INTERNAL_ERRORAn internal server error occurredRetry with backoff; contact support if persistent
SERVICE_UNAVAILABLEService temporarily unavailableRetry with backoff; check status.cert-ix.com
DATABASE_ERRORDatabase operation failedRetry; contact support if persistent
KAFKA_ERRORMessage queue operation failedRetry; the scan queue may be temporarily congested

Troubleshooting Guide​

"401 — MISSING_API_KEY"​

Check: Are you passing the X-API-Key header?

# âś… Correct
curl -H "X-API-Key: cix_sk_..." https://api.cert-ix.com/scan-api/api/v1/scans

# ❌ Wrong — key in URL params
curl "https://api.cert-ix.com/scan-api/api/v1/scans?apiKey=cix_sk_..."

# ❌ Wrong — using Authorization header
curl -H "Authorization: Bearer cix_sk_..." https://api.cert-ix.com/scan-api/api/v1/scans

"403 — INSUFFICIENT_SCOPE"​

Your key doesn't have the required scope. Check which scope is needed in the error message, then create a new key or update the existing one with the required scope.

"404 — SCAN_NOT_FOUND"​

Most common causes:

  1. Wrong scanType — If you created a zap scan, you must query with ?scanType=zap
  2. Wrong scan ID — Double-check the UUID
  3. Different tenant — Keys from different organizations can't see each other's scans

"429 — RATE_LIMIT_EXCEEDED"​

Implement exponential backoff:

import time

def request_with_backoff(func, max_retries=5):
for attempt in range(max_retries):
response = func()
if response.status_code != 429:
return response
retry_after = int(response.headers.get("Retry-After", 2 ** attempt))
print(f"Rate limited. Retrying in {retry_after}s...")
time.sleep(retry_after)
raise Exception("Max retries exceeded")

"429 — QUOTA_EXCEEDED"​

Options:

  1. Upgrade your plan for a higher quota
  2. Wait until the next billing period (1st of the month, midnight UTC)
  3. Optimize — Reduce unnecessary scans or use templates with narrower scan options

"500 — INTERNAL_ERROR"​

  1. Retry — Most 500 errors are transient
  2. Check status.cert-ix.com for outage information
  3. Contact [email protected] with the request ID from the error response

Next Steps: