Getting Started
Submit your first vulnerability scan in under 5 minutes. This guide walks you through obtaining an API key, submitting a scan, checking its status, and retrieving results.
Prerequisites
Before you begin, ensure you have:
- ✅ An active Cert-IX account with Scan API access
- ✅ Access to the Cert-IX Dashboard for API key management
- ✅ cURL or any HTTP client (Python
requests, Postman, etc.)
Step 1: Get Your API Key
- Log in to the Cert-IX Dashboard
- Navigate to Settings → API Keys
- Click Create API Key
- Configure the key:
- Name: Give it a descriptive name (e.g., "My First Scan Key")
- Scopes: Select at least
scans:create,scans:read,results:read - Expiration: Set an appropriate expiration (e.g., 90 days)
- Click Create and copy the key immediately
The raw API key is shown only once at creation time. Store it securely in a password manager or secrets vault. Cert-IX cannot retrieve it later.
Set the key as an environment variable for convenience:
export CERTIX_API_KEY="cix_sk_your_api_key_here"
Step 2: Submit Your First Scan
Let's run a basic Nmap network scan against a target:
curl -X POST https://api.cert-ix.com/scan-api/api/v1/scans \
-H "X-API-Key: $CERTIX_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"target": "example.com",
"scanType": "nmap",
"name": "My First Scan",
"options": {
"ports": "1-1024",
"timing": "T3",
"serviceDetection": true
}
}'
Response:
{
"success": true,
"data": {
"id": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
"scanType": "nmap",
"name": "My First Scan",
"target": "example.com",
"status": "queued",
"priority": "normal",
"progress": 0,
"createdAt": "2026-03-06T10:00:00Z"
}
}
Copy the id from the response — you'll need it to check status and retrieve results.
export SCAN_ID="a1b2c3d4-e5f6-7890-abcd-ef1234567890"
Step 3: Check Scan Status
Scans run asynchronously. Poll the status endpoint to track progress:
curl -X GET "https://api.cert-ix.com/scan-api/api/v1/scans/$SCAN_ID?scanType=nmap" \
-H "X-API-Key: $CERTIX_API_KEY"
Response (running):
{
"success": true,
"data": {
"id": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
"status": "running",
"progress": 67
}
}
Response (completed):
{
"success": true,
"data": {
"id": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
"status": "completed",
"progress": 100,
"resultCount": 12,
"durationMs": 135000
}
}
Status Values
| Status | Meaning |
|---|---|
queued | Accepted, waiting for scanner capacity |
running | Scanner is actively executing |
completed | Finished successfully — results available |
failed | Encountered a fatal error |
cancelled | Cancelled by user |
Step 4: Retrieve Results
Once the scan status is completed, fetch the full results:
curl -X GET "https://api.cert-ix.com/scan-api/api/v1/scans/$SCAN_ID/results?scanType=nmap" \
-H "X-API-Key: $CERTIX_API_KEY"
Response:
{
"success": true,
"data": {
"scanId": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
"scanType": "nmap",
"target": "example.com",
"status": "completed",
"results": {
"hosts": [
{
"ip": "93.184.216.34",
"hostname": "example.com",
"state": "up",
"ports": [
{
"port": 80,
"protocol": "tcp",
"state": "open",
"service": "http",
"version": "nginx 1.25.4"
},
{
"port": 443,
"protocol": "tcp",
"state": "open",
"service": "https",
"version": "nginx 1.25.4"
}
]
}
],
"stats": {
"hostsUp": 1,
"openPorts": 2,
"closedPorts": 1022
}
}
}
}
Complete Script
Here's a full Bash script that automates the entire workflow:
#!/bin/bash
# Cert-IX Scan API — Complete scan workflow
set -euo pipefail
API_KEY="${CERTIX_API_KEY:?Set CERTIX_API_KEY environment variable}"
BASE_URL="https://api.cert-ix.com/scan-api/api/v1"
TARGET="${1:-example.com}"
echo "🔍 Submitting Nmap scan for: $TARGET"
# Step 1: Submit scan
RESPONSE=$(curl -s -X POST "$BASE_URL/scans" \
-H "X-API-Key: $API_KEY" \
-H "Content-Type: application/json" \
-d "{
\"target\": \"$TARGET\",
\"scanType\": \"nmap\",
\"name\": \"Quick scan - $TARGET\",
\"options\": {
\"ports\": \"1-1024\",
\"timing\": \"T3\",
\"serviceDetection\": true
}
}")
SCAN_ID=$(echo "$RESPONSE" | jq -r '.data.id')
echo "✅ Scan submitted: $SCAN_ID"
# Step 2: Poll until complete
echo "⏳ Waiting for scan to complete..."
while true; do
STATUS_RESP=$(curl -s -X GET "$BASE_URL/scans/$SCAN_ID?scanType=nmap" \
-H "X-API-Key: $API_KEY")
STATUS=$(echo "$STATUS_RESP" | jq -r '.data.status')
PROGRESS=$(echo "$STATUS_RESP" | jq -r '.data.progress')
echo " Status: $STATUS ($PROGRESS%)"
case "$STATUS" in
completed) break ;;
failed) echo "❌ Scan failed"; exit 1 ;;
cancelled) echo "⚠️ Scan cancelled"; exit 1 ;;
esac
sleep 5
done
# Step 3: Get results
echo "📊 Retrieving results..."
curl -s -X GET "$BASE_URL/scans/$SCAN_ID/results?scanType=nmap" \
-H "X-API-Key: $API_KEY" | jq .
echo "✨ Done!"
What's Next?
Now that you've completed your first scan, explore these topics:
- Authentication & API Keys — Scopes, rotation, IP allowlisting
- Submitting Scans — All 10 engines with detailed options
- Webhooks — Real-time notifications instead of polling
- Code Examples — Production-ready Python, Go, and Node.js clients
For production integrations, use webhooks instead of polling. Webhooks deliver instant notifications and consume zero API quota for status checks.
¿Te resultó útil esta página?