API Reference

API Documentation

Complete reference for the isMalicious threat intelligence API. Check domains, IPs, and URLs for malicious activity.

Welcome

Introduction to the isMalicious API

Welcome to the isMalicious API documentation. This API provides programmatic access to our comprehensive threat intelligence database, enabling you to check domains, IPs, emails, and URLs for malicious activity.

Base URL: https://api.ismalicious.com (all paths below are relative to this host — not ismalicious.com/api/...).

Documentation: Interactive reference · OpenAPI JSON · Playground

Key Features:

Real-time threat intelligence checks (IPs, domains, URLs, file hashes)

Ransomware intelligence, CVE catalog search, and threat-intel utilities (ASN, reverse IP, history)

Email: lightweight check on this host; full email risk analysis is on the web app (see Email)

Reputation scoring from configured sources

Geolocation and WHOIS data

Vulnerability scanning

Downloadable blocklists

Getting Started:

1.Create an account at ismalicious.com/auth/register

2.Generate API keys from your dashboard

3.Make your first API call

Need Help?

Support Page

API Playground

Authentication

How to authenticate API requests

Routes are split into public (no key) and protected (authentication required).

Hosts for automation

Canonical API: https://api.ismalicious.com — use this for SDK/API-key clients (/check, /monitoring, /alerts, /taxii, /cve, webhook CRUD, etc.).

Web API: https://ismalicious.com/api — dashboard session routes and some analyze helpers (/analyze, email/phone/crypto). Prefer api.ismalicious.com for server-to-server integrations; pointing automation at the web host can hit session-only mirrors.

Protected routes (typical integration): Send either

X-API-KEY: <base64(apiKey:apiSecret)>, or

a valid dashboard session cookie (browser / same-site requests).

If neither is present, the API returns 401 with "message": "Provide an x-api-key header, a Bearer token, Basic Auth credentials, or a valid session cookie".

Public routes (no `X-API-KEY`): include GET /health, GET /openapi.json, GET /stats, GET /blocklist/stats, GET /blocklist/download/{filename}, GET /analytics, GET /cve/stats/epss, GET /cve/stats/timeseries, POST /contact, POST /feedback, POST /newsletter, POST /license, GET /email-sequences/unsubscribe (and related), plus POST /auth/resend-verification. Cron, webhooks, and internal routes use separate tokens — not customer API keys.

Getting your API keys

1.Log in and open Account Settings

2.Create an API key pair (apiKey + apiSecret)

Header

X-API-KEY: <base64_encoded_credentials>

Base64-encode apiKey:apiSecret (single colon, no spaces).

const credentials = btoa(`${apiKey}:${apiSecret}`);
import base64
credentials = base64.b64encode(f"{api_key}:{api_secret}".encode()).decode()

Special: licensed source listPOST /sources also requires header X-License-Key: <your_license_key> (active row in license_keys). You still pass X-API-KEY (or session) to satisfy the gateway.

Security: Never ship secrets to browsers; use env vars; rotate keys; optional IP allowlists on custom plans.

Public endpoints

No API key required — health, OpenAPI, aggregate stats, analytics slices, and CVE statistics.

GET
/health

Health check

Liveness probe for load balancers and monitoring. Returns a small JSON payload when the API process is up.

Example Request

curl -sS "https://api.ismalicious.com/health"

Responses

{
  "status": "operational",
  "timestamp": "2026-03-29T12:00:00.000Z",
  "services": {
    "api": "operational",
    "database": "operational",
    "redis": "operational"
  }
}
GET
/openapi.json

OpenAPI 3 specification

Machine-readable API description (may lag slightly behind this page; routes are defined in apps/rust-api).

Example Request

curl -sS "https://api.ismalicious.com/openapi.json" | head -c 400

Responses

{ ... }
GET
/stats

Public threat statistics

High-level counts and trends from cached metrics (threat overview, categories, recent activity).

Example Request

curl -sS "https://api.ismalicious.com/stats"

Responses

{
  "totalThreats": 0,
  "byType": {
    "domains": 0,
    "ips": 0
  },
  "recentActivity": {
    "last24h": 0,
    "last7d": 0,
    "growthRate": 0
  }
}
GET
/analytics

Analytics metric slices

Reads sub-documents from the metrics:threats Redis JSON. Optional metric query selects one slice (same names as the Next.js /api/analytics route).

Parameters

NameTypeRequiredDescription
metricstringNoe.g. threatOverview, categoryBreakdown, topSources, threatDistribution, threatTimeline, geoThreatMap, vulnerabilityPatterns

Example Request

curl -sS "https://api.ismalicious.com/analytics?metric=threatOverview"

Responses

{"threatOverview": { ... }}
GET
/cve/stats/epss

CVE EPSS distribution & summary

EPSS bucket distribution, top CVEs, and summary counts from CveCatalog. Query params filter results.

Parameters

NameTypeRequiredDescription
limitintegerNoTop CVEs limit (default 20, max 100) (default: 20)
minEpssnumberNoMinimum EPSS score 0–1 (default: 0)
kevstringNoSet to `true` to restrict to KEV entries
exploitstringNoFilter by SSVC exploitation value (e.g. active)

Example Request

curl -sS "https://api.ismalicious.com/cve/stats/epss?limit=10&minEpss=0.5"

Responses

{"distribution": [], "top": [], "summary": {}}
GET
/cve/stats/timeseries

CVE activity time series

Time-bucketed counts by severity, KEV, and active exploit flags from CveCatalog.lastModifiedAt.

Parameters

NameTypeRequiredDescription
daysintegerNoLookback window (default 30; max depends on bucket) (default: 30)
bucketstringNo`day` (default), `week`, or `month` (default: day)

Example Request

curl -sS "https://api.ismalicious.com/cve/stats/timeseries?days=14&bucket=day"

Responses

[{"day": "2026-01-01", "critical": 0, "high": 0, "medium": 0, "low": 0, "kev": 0, "active_exploit": 0}]

Check Endpoints

Threat intelligence check endpoints

GET
/check

Full Threat Analysis

Comprehensive threat intelligence check. Supply one target via query or legacy aliases ip, domain, or hash (same semantics as query). Supports IPv4/IPv6, domain, URL, or file hash (MD5/SHA1/SHA256 hex). Response size depends on enrichment: basic, standard (default), or full. If no target is provided, the API still returns 200 with a minimal body (malicious: false, apiVersion, enrichmentLevel) — prefer validating client-side. For smaller, stable JSON use sub-endpoints (/check/reputation, etc.). Verdict semantics: malicious reflects high-confidence scanner-style signals (e.g. VirusTotal malicious/suspicious thresholds), while blocklistHits / blocklistListed report aggregate feed matches that may include privacy or ads lists. Data Trust: responses include dataTrust for freshness, source reliability, completeness, and provider agreement, plus evidence for SOC-ready reasons, contradictory signals, and recommendedAction. OTX: With standard or full enrichment, the response may include otx — normalized AlienVault OTX data: community pulses (and optional reputationScore from indicator general). For IPs, full adds LevelBlue Labs labsReputation and a capped passive DNS summary. For domains, full adds passive DNS. For URLs (primary query is http(s)://...), OTX uses the URL indicator. For file hashes, standard/full may include pulse context from file/.../general; full may add a capped fileAnalysis excerpt. Uses the public OTX API; optional OTX_API_KEY improves rate limits. Omitted on basic or when OTX fails.

Parameters

NameTypeRequiredDescription
querystringNoPrimary target: IP, domain, URL, or hash
ipstringNoAlias of `query` when the value is an IP
domainstringNoAlias of `query` for a hostname / domain
hashstringNoAlias of `query` for MD5/SHA1/SHA256 hex
enrichmentstringNoLevel of data enrichment: basic, standard, or full (default: standard)
intelowlstringNoWhen set to the string `true`, the pipeline may include IntelOwl-related enrichment (server-side; requires IntelOwl to be configured) (default: false)
trackReportsbooleanNoSave this check to your reports history (default: false)

Example Request

curl -X GET "https://api.ismalicious.com/check?query=8.8.8.8&enrichment=standard" \
  -H "X-API-KEY: YOUR_BASE64_CREDENTIALS"

Responses

{
  "malicious": false,
  "blocklistHits": 0,
  "blocklistListed": false,
  "reputation": {
    "malicious": 0,
    "suspicious": 0,
    "harmless": 85,
    "undetected": 15
  },
  "riskScore": {
    "score": 5,
    "level": "safe",
    "factors": []
  },
  "confidence": {
    "score": 95,
    "level": "high"
  },
  "classification": {
    "primary": "safe",
    "secondary": []
  },
  "geo": {
    "country": "United States",
    "countryCode": "US",
    "city": "Mountain View",
    "isp": "Google LLC"
  },
  "otx": {
    "source": "alienvault_otx",
    "fetchedAt": "2026-03-30T12:00:00.000Z",
    "pulseCount": 2,
    "moreCount": 0,
    "reputationScore": 0,
    "labsReputation": {
      "source": "alienvault_otx_labs",
      "fetchedAt": "2026-03-30T12:00:00.000Z",
      "score": 2,
      "countryName": "United States",
      "malwareSampleCount": 0,
      "urlCount": 1
    },
    "passiveDns": {
      "source": "alienvault_otx_passive_dns",
      "fetchedAt": "2026-03-30T12:00:00.000Z",
      "totalRecords": 1,
      "moreCount": 0,
      "records": [
        {
          "hostname": "example.com",
          "address": "203.0.113.10",
          "recordType": "A",
          "firstSeen": "2025-01-01",
          "lastSeen": "2026-03-01"
        }
      ]
    },
    "pulses": [
      {
        "id": "58f15111d3bb0b0b8ac54662",
        "name": "Example pulse",
        "description": "Community IOC context (truncated in API).",
        "tags": [
          "malware",
          "ssh"
        ],
        "tlp": "green",
        "modified": "2026-03-25T19:07:52.831000",
        "references": [
          "https://example.com/ref"
        ],
        "authorUsername": "researcher",
        "subscriberCount": 120,
        "pulseUrl": "https://otx.alienvault.com/pulse/58f15111d3bb0b0b8ac54662"
      }
    ]
  },
  "apiVersion": "v2",
  "enrichmentLevel": "full",
  "dataTrust": {
    "observedAt": "2026-05-09T10:00:00.000Z",
    "freshness": "fresh",
    "sourceAgreement": {
      "count": 1,
      "weightedStrength": 0.95,
      "level": "weak",
      "scannerDetections": 0,
      "scannerSuspicious": 0,
      "scannerClean": 85
    },
    "sources": [
      {
        "name": "Spamhaus",
        "type": "blocklist",
        "reliability": 0.95,
        "reliabilityLevel": "high",
        "noiseProfile": "authoritative"
      }
    ],
    "completeness": {
      "score": 75,
      "present": [
        "sources",
        "reputation",
        "otx"
      ],
      "missing": [
        "vulnerabilities"
      ]
    },
    "providerAgreement": {
      "status": "partial",
      "summary": "Cross-provider signals available",
      "contradictorySignals": []
    }
  },
  "evidence": {
    "verdict": "safe",
    "score": 5,
    "observedAt": "2026-05-09T10:00:00.000Z",
    "reasons": [
      "No high-confidence malicious evidence"
    ],
    "contradictorySignals": [],
    "sourceSummary": {
      "count": 1,
      "weightedStrength": 0.95,
      "highReliabilityCount": 1,
      "noiseWarnings": []
    },
    "freshness": "fresh",
    "recommendedAction": "allow",
    "analystStatus": "new"
  }
}
GET
/check/reputation

Check Reputation

Get reputation data from aggregated threat intelligence sources including VirusTotal integration.

Parameters

NameTypeRequiredDescription
querystringYesIP address or domain

Example Request

curl -X GET "https://api.ismalicious.com/check/reputation?query=example.com" \
  -H "X-API-KEY: YOUR_BASE64_CREDENTIALS"

Responses

{
  "reputation": {
    "malicious": 0,
    "suspicious": 2,
    "harmless": 80,
    "undetected": 18
  }
}
GET
/check/location

Check Geolocation

Get geographic location data including country, city, region, ISP, and coordinates.

Parameters

NameTypeRequiredDescription
querystringYesIP address or domain

Example Request

curl -X GET "https://api.ismalicious.com/check/location?query=1.1.1.1" \
  -H "X-API-KEY: YOUR_BASE64_CREDENTIALS"

Responses

{
  "geo": {
    "country": "Australia",
    "countryCode": "AU",
    "city": "Sydney",
    "region": "New South Wales",
    "lat": -33.8688,
    "lon": 151.2093,
    "isp": "Cloudflare Inc"
  }
}
GET
/check/whois

Check WHOIS

Get WHOIS registration data including registrant, registrar, and dates.

Parameters

NameTypeRequiredDescription
querystringYesIP address or domain

Example Request

curl -X GET "https://api.ismalicious.com/check/whois?query=example.com" \
  -H "X-API-KEY: YOUR_BASE64_CREDENTIALS"

Responses

{
  "whois": {
    "registrar": "GoDaddy.com, LLC",
    "registrant": "REDACTED FOR PRIVACY",
    "createdDate": "1997-09-15T04:00:00.000Z",
    "updatedDate": "2023-08-14T07:00:00.000Z",
    "expiresDate": "2028-09-14T04:00:00.000Z",
    "nameServers": [
      "ns1.example.com",
      "ns2.example.com"
    ]
  }
}
GET
/check/certificates

Check Certificates

Get SSL/TLS certificate information including issuer, validity, and chain.

Parameters

NameTypeRequiredDescription
querystringYesDomain or IP address

Example Request

curl -X GET "https://api.ismalicious.com/check/certificates?query=google.com" \
  -H "X-API-KEY: YOUR_BASE64_CREDENTIALS"

Responses

{
  "certificates": {
    "issuer": "Let's Encrypt Authority X3",
    "subject": "example.com",
    "validFrom": "2024-01-01T00:00:00.000Z",
    "validTo": "2024-03-31T23:59:59.000Z",
    "serialNumber": "03:A1:B2:C3:D4:E5:F6",
    "fingerprint": "SHA256:ABC123..."
  }
}
GET
/check/vulnerabilities

Check Vulnerabilities

Get known vulnerabilities associated with an IP address from CVE databases.

Parameters

NameTypeRequiredDescription
querystringYesIP address

Example Request

curl -X GET "https://api.ismalicious.com/check/vulnerabilities?query=192.168.1.1" \
  -H "X-API-KEY: YOUR_BASE64_CREDENTIALS"

Responses

{
  "vulnerabilities": {
    "total": 3,
    "critical": 1,
    "high": 1,
    "medium": 1,
    "low": 0,
    "cves": [
      {
        "id": "CVE-2024-1234",
        "severity": "CRITICAL",
        "score": 9.8,
        "description": "Remote code execution vulnerability"
      }
    ]
  }
}
GET
/check/intelowl

IntelOwl observable analysis

Proxies an observable to IntelOwl (/api/analyze_observable) when INTELOWL_URL and INTELOWL_API_KEY are configured. Results are cached in Redis (~1h). Use HEAD to probe without body. Set cache_only=true to return only cached data (404 if missing).

Parameters

NameTypeRequiredDescription
querystringYesIP, domain, URL, or hash to analyze
typestringNoObservable classification: `ip`, `domain`, `url`, or `hash` — inferred from `query` when omitted
cache_onlystringNoIf `true`, skip live IntelOwl and only return cache (default: false)

Example Request

curl -sS -H "X-API-KEY: YOUR_BASE64_CREDENTIALS" \
  "https://api.ismalicious.com/check/intelowl?query=8.8.8.8&type=ip"

Responses

{"status": "accepted", ...}
HEAD
/check/intelowl

IntelOwl route probe (HEAD)

Same route as GET; use HEAD for connectivity checks without a response body.

Parameters

NameTypeRequiredDescription
querystringYesObservable to check

Example Request

curl -sSI -H "X-API-KEY: YOUR_BASE64_CREDENTIALS" \
  "https://api.ismalicious.com/check/intelowl?query=1.1.1.1"

Responses

GET
/check/ransomware

Ransomware intelligence (summary or entity)

Without query, or with type=stats, returns aggregated ransomware stats from cache (ransomware:stats) or computed from recent victims. With query, returns a lightweight stub for entity-oriented checks (full deep-dive uses dashboard / GET /ransomware/* routes). Optional include_ttps, include_iocs, limit are parsed for forward compatibility.

Parameters

NameTypeRequiredDescription
querystringNoEntity or keyword; omit (or use type=stats) for global stats
typestringNoSet to `stats` to force statistics response
include_ttpsstringNoReserved / forward-compatible
include_iocsstringNoReserved / forward-compatible
limitstringNoReserved / forward-compatible

Example Request

curl -sS -H "X-API-KEY: YOUR_BASE64_CREDENTIALS" \
  "https://api.ismalicious.com/check/ransomware?type=stats"

Responses

{
  "query": "stats",
  "queryType": "stats",
  "stats": {
    "totalVictims": 0,
    "activeGroups": 0,
    "attacksThisMonth": 0,
    "attacksThisYear": 0
  }
}
GET
/check/tenant

Microsoft 365 tenant (domain)

Returns azureTenant data from Redis for a domain (not supported for raw IPs).

Parameters

NameTypeRequiredDescription
querystringYesDomain or URL host to look up

Example Request

curl -sS -H "X-API-KEY: YOUR_BASE64_CREDENTIALS" \
  "https://api.ismalicious.com/check/tenant?query=example.com"

Responses

{
  "tenant": null,
  "message": "Domain is not associated with a Microsoft 365 tenant"
}
GET
/check/email

Email check (Rust API — lightweight)

On api.ismalicious.com this route returns a small JSON stub (validated email, domain parts, placeholder risk summary) for pipeline compatibility.

For full email risk analysis (breaches, SPF/DKIM/DMARC, reputation, typosquatting, etc.), call the Next.js route on the main site with the same auth pattern your app uses for dashboard API calls:

GET https://ismalicious.com/api/check/email?email=user@example.com

(Implementation: apps/web/app/api/check/email/route.ts.)

Parameters

NameTypeRequiredDescription
emailstringYesEmail address to analyze
enrichmentstringNoEchoed in response as enrichmentLevel (default: standard)

Example Request

curl -X GET "https://api.ismalicious.com/check/email?email=user@example.com&enrichment=standard" \
  -H "X-API-KEY: YOUR_BASE64_CREDENTIALS"

Responses

{
  "email": "user@example.com",
  "domain": "example.com",
  "localPart": "user",
  "riskScore": {
    "score": 50,
    "level": "medium",
    "summary": "Email risk evaluation via Rust API"
  },
  "apiVersion": "v1",
  "enrichmentLevel": "standard"
}
POST
/analyze

Unified analyze (auto-detect type)

On ismalicious.com this route auto-detects crypto, email, phone, hash, URL, IP, or domain and forwards to the matching check handler.

POST https://ismalicious.com/api/analyze

Host split: not available on api.ismalicious.com (Rust). SDK clients must set webBaseUrl: 'https://ismalicious.com/api' (default in SDK) for analyze / checkEmail / checkPhone / checkCrypto; keep baseUrl for /check and other Rust routes.

Body: { "input": "..." } (optional input_type / query aliases). Auth uses the same API key or session pattern as other web API routes.

(Implementation: apps/web/app/api/analyze/route.ts.)

Parameters

NameTypeRequiredDescription
inputstringYesRaw indicator (URL, domain, IP, email, phone, hash, or crypto address)
input_typestringNoOptional force type: crypto | email | phone | hash | url | ip | domain

Example Request

curl -X POST "https://ismalicious.com/api/analyze" \
  -H "Content-Type: application/json" \
  -H "X-API-KEY: YOUR_BASE64_CREDENTIALS" \
  -d '{"input":"user@example.com"}'

Responses

{
  "detectedType": "email",
  "email": "user@example.com",
  "riskScore": {
    "score": 42,
    "level": "medium"
  }
}
GET
/check/phone

Phone scam / fraud check

Phone risk analysis on the web app (heuristics + optional IPQS when configured).

GET https://ismalicious.com/api/check/phone?phone=%2B14155552671

(Implementation: apps/web/app/api/check/phone/route.ts.)

Parameters

NameTypeRequiredDescription
phonestringYesE.164 or common phone number formats

Example Request

curl -X GET "https://ismalicious.com/api/check/phone?phone=%2B14155552671" \
  -H "X-API-KEY: YOUR_BASE64_CREDENTIALS"

Responses

{
  "phone": "+14155552671",
  "riskScore": {
    "score": 35,
    "level": "low"
  },
  "factors": []
}
GET
/check/crypto

Crypto wallet scam check

Checks BTC/ETH wallet addresses against ingested ScamSniffer and related scam indexes.

GET https://ismalicious.com/api/check/crypto?address=0x...

(Implementation: apps/web/app/api/check/crypto/route.ts.)

Parameters

NameTypeRequiredDescription
addressstringYesBitcoin or Ethereum wallet address

Example Request

curl -X GET "https://ismalicious.com/api/check/crypto?address=0xd8dA6BF26964aF9D7eEd9e03E53415D37aA96045" \
  -H "X-API-KEY: YOUR_BASE64_CREDENTIALS"

Responses

{
  "address": "0x0000000000000000000000000000000000000000",
  "chain": "eth",
  "riskScore": {
    "score": 95,
    "level": "critical"
  },
  "localBlacklistHit": true
}

Bulk check

Batch-check multiple domains, IPs, and URLs in one request. Plan limits apply (see **GET** `/bulk/check`).

GET
/bulk/check

Bulk limits

Returns plan label, maxEntitiesPerRequest for your subscription, and allPlans limits map. The JSON may include endpoint as /api/bulk/check (legacy string); the real URL is https://api.ismalicious.com/bulk/check. POST the same path with a JSON body to run a batch.

Example Request

curl -X GET "https://api.ismalicious.com/bulk/check" \
  -H "X-API-KEY: YOUR_BASE64_CREDENTIALS"

Responses

{
  "endpoint": "/api/bulk/check",
  "method": "POST",
  "description": "Check multiple entities (domains, IPs, URLs) in a single request",
  "authentication": "Required - API key or session",
  "limits": {
    "currentPlan": "BASIC_MONTHLY",
    "maxEntitiesPerRequest": 50,
    "allPlans": {
      "FREE": 10,
      "BASIC_MONTHLY": 50,
      "PRO_MONTHLY": 100
    }
  }
}
POST
/bulk/check

Run bulk check

Request body: entities (required array of strings), optional enrichment. Each result includes the same SOC evidence summary fields used by single checks: evidence, recommendedAction, analystStatus, and observedAt.

Request Body

{
  "entities": [
    "example.com",
    "8.8.8.8",
    "https://example.org/path"
  ],
  "enrichment": "full"
}

Example Request

curl -X POST "https://api.ismalicious.com/bulk/check" \
  -H "X-API-KEY: YOUR_BASE64_CREDENTIALS" \
  -H "Content-Type: application/json" \
  -d '{"entities":["example.com","8.8.8.8"],"enrichment":"full"}'

Responses

{
  "success": true,
  "total": 2,
  "processed": 2,
  "results": [
    {
      "entity": "example.com",
      "type": "domain",
      "isMalicious": false,
      "confidence": 0.12,
      "sources": 3,
      "categories": [],
      "riskScore": 5,
      "riskLevel": "safe",
      "recommendedAction": "allow",
      "analystStatus": "new",
      "observedAt": "2026-05-09T10:00:00.000Z",
      "evidence": {
        "verdict": "safe",
        "observedAt": "2026-05-09T10:00:00.000Z",
        "reasons": [
          "No high-confidence malicious evidence"
        ],
        "contradictorySignals": [],
        "sourceSummary": {
          "count": 3,
          "weightedStrength": 1.72,
          "highReliabilityCount": 2,
          "noiseWarnings": []
        },
        "freshness": "fresh",
        "recommendedAction": "allow",
        "analystStatus": "new"
      }
    },
    {
      "entity": "8.8.8.8",
      "type": "ip",
      "isMalicious": false,
      "confidence": 0.05,
      "sources": 1,
      "categories": []
    }
  ],
  "processingTimeMs": 210
}

CVE catalog

Authenticated Redis-backed CVE search and recent list (`/cve` counts against monthly quota like `/check`).

GET
/cve/recent

Recent CVEs

Returns the cve:recent Redis document as a JSON array (or object), truncated to limit.

Parameters

NameTypeRequiredDescription
limitintegerNoMax items (default 20, max 100) (default: 20)

Example Request

curl -sS -H "X-API-KEY: YOUR_BASE64_CREDENTIALS" \
  "https://api.ismalicious.com/cve/recent?limit=5"

Responses

[]

Threat intel utilities

ASN/IP intelligence helpers and AlienVault OTX pulse lookups (authenticated).

GET
/threat-intel/asn

ASN lookup

Pass ip for full ASN/org data via ipwho.is, or asn (e.g. AS15169 or 15169) for a minimal ASN record.

Parameters

NameTypeRequiredDescription
ipstringNoIPv4/IPv6 address
asnstringNoASN number or `AS####` string

Example Request

curl -sS -H "X-API-KEY: YOUR_BASE64_CREDENTIALS" \
  "https://api.ismalicious.com/threat-intel/asn?ip=8.8.8.8"

Responses

{"ip": "8.8.8.8", "asn": "AS15169", ...}
GET
/threat-intel/reverse-ip

Reverse IP

Domains hosted on an IPv4 address via HackerTarget (one domain per line).

Parameters

NameTypeRequiredDescription
ipstringYesIPv4 address

Example Request

curl -sS -H "X-API-KEY: YOUR_BASE64_CREDENTIALS" \
  "https://api.ismalicious.com/threat-intel/reverse-ip?ip=8.8.8.8"

Responses

{"ip": "8.8.8.8", "domains": ["..."], "total_domains": 0}
GET
/threat-intel/history

Reputation history

Historical reputation timeline for a domain or IP (entity), optional days window.

Parameters

NameTypeRequiredDescription
entitystringYesDomain or IP
daysintegerNoLookback days (implementation-specific default)

Example Request

curl -sS -H "X-API-KEY: YOUR_BASE64_CREDENTIALS" \
  "https://api.ismalicious.com/threat-intel/history?entity=example.com&days=30"

Responses

{}

Ransomware intelligence

Ransomware.live-backed feeds and analytics (authenticated). Data is cached in Redis when possible.

GET
/ransomware/feed

Recent victims feed

limit (default 30, max 100). Optional press=true adjusts filtering (see server).

Parameters

NameTypeRequiredDescription
limitintegerNoVictims to return (default: 30)
pressstringNoOptional flag consumed by handler

Example Request

curl -sS -H "X-API-KEY: YOUR_BASE64_CREDENTIALS" \
  "https://api.ismalicious.com/ransomware/feed?limit=20"

Responses

{"victims": []}
GET
/ransomware/stats

Global ransomware stats

Reads ransomware:stats from Redis.

Example Request

curl -sS -H "X-API-KEY: YOUR_BASE64_CREDENTIALS" "https://api.ismalicious.com/ransomware/stats"

Responses

{}
GET
/ransomware/sector-risk

Sector risk

Without sector, returns all sectors. With sector, returns drill-down for that vertical. Optional press flag.

Parameters

NameTypeRequiredDescription
sectorstringNoIndustry sector name
pressstringNoOptional modifier

Example Request

curl -sS -H "X-API-KEY: YOUR_BASE64_CREDENTIALS" \
  "https://api.ismalicious.com/ransomware/sector-risk?sector=Healthcare"

Responses

{"sectors": []}
GET
/ransomware/sector-risk/history

Sector risk history

Daily sector-risk snapshots from Redis (ransomware:sector-risk:snapshots). days defaults to 30 (max 120). Optional sector filters to one vertical.

Parameters

NameTypeRequiredDescription
daysintegerNoLookback window in days (default: 30)
sectorstringNoOptional sector name (lowercased server-side)

Example Request

curl -sS -H "X-API-KEY: YOUR_BASE64_CREDENTIALS" \
  "https://api.ismalicious.com/ransomware/sector-risk/history?sector=Technology"

Responses

{}
GET
/ransomware/sector-victims

Sector victims drill-down

Requires sector. Enriches victims, risk level, top groups.

Parameters

NameTypeRequiredDescription
sectorstringYesSector name

Example Request

curl -sS -H "X-API-KEY: YOUR_BASE64_CREDENTIALS" \
  "https://api.ismalicious.com/ransomware/sector-victims?sector=Healthcare"

Responses

{"sector": "healthcare", "riskLevel": "low", ...}
GET
/ransomware/press

Press / newsfeed

limit (default 50, max 100). Optional groups — comma-separated group names to filter.

Parameters

NameTypeRequiredDescription
limitintegerNoEntries to return (default: 50)
groupsstringNoComma-separated ransomware group names

Example Request

curl -sS -H "X-API-KEY: YOUR_BASE64_CREDENTIALS" \
  "https://api.ismalicious.com/ransomware/press?limit=10"

Responses

{"entries": [], "total": 0}
GET
/ransomware/group-profile

Group profile

Requires group — full threat-actor aggregate (TTPs, victims, etc.).

Parameters

NameTypeRequiredDescription
groupstringYesRansomware group name

Example Request

curl -sS -H "X-API-KEY: YOUR_BASE64_CREDENTIALS" \
  "https://api.ismalicious.com/ransomware/group-profile?group=lockbit"

Responses

{}
GET
/ransomware/groups

List ransomware groups

Returns the normalized list of tracked ransomware groups (cached from ransomware.live as ransomware:groups:all, ~6h TTL). limit defaults to 100 (max 500).

Parameters

NameTypeRequiredDescription
limitintegerNoGroups to return (1–500) (default: 100)

Example Request

curl -sS -H "X-API-KEY: YOUR_BASE64_CREDENTIALS" \
  "https://api.ismalicious.com/ransomware/groups?limit=50"

Responses

{"groups": [], "total": 0}

Sources

Threat-source statistics and licensed full export (authenticated + license key for POST).

GET
/sources/statistics

Source statistics

Returns source:statistics from Redis (success, data, timestamp). 404 if cache empty.

Example Request

curl -sS -H "X-API-KEY: YOUR_BASE64_CREDENTIALS" \
  "https://api.ismalicious.com/sources/statistics"

Responses

{"success": true, "data": {}, "timestamp": "2026-01-01T00:00:00Z"}
POST
/sources

Full sources list (licensed)

Requires X-License-Key with an active key from license_keys, plus X-API-KEY or session. Returns cached sources:all JSON or embedded sources.json fallback.

Example Request

curl -sS -X POST "https://api.ismalicious.com/sources" \
  -H "X-API-KEY: YOUR_BASE64_CREDENTIALS" \
  -H "X-License-Key: YOUR_LICENSE_KEY"

Responses

[]

STIX / TAXII 2.1

TAXII 2.1 discovery, API roots, and STIX bundles. **Mirrored** under `/taxii` and `/taxii2` (same handlers). Requires `X-API-KEY` or session; Pro plan for collections (see server enforcement).

GET
/taxii

TAXII discovery (root)

Returns default and api_roots pointing to /taxii/api-root (same for /taxii2).

Example Request

curl -sS -H "X-API-KEY: YOUR_BASE64_CREDENTIALS" \
  -H "Accept: application/taxii+json;version=2.1" \
  "https://api.ismalicious.com/taxii"

Responses

{"title":"isMalicious","api_roots":["/taxii/api-root"]}
GET
/taxii/api-root

API root

Lists available collections (collections array) for this API root.

Example Request

curl -sS -H "X-API-KEY: YOUR_BASE64_CREDENTIALS" \
  -H "Accept: application/taxii+json;version=2.1" \
  "https://api.ismalicious.com/taxii/api-root"

Responses

{"collections":[{"id":"malicious-ips","title":"Malicious IPs"},{"id":"malicious-domains","title":"Malicious Domains"},{"id":"c2-indicators","title":"C2 Indicators"}]}
GET
/taxii/api-root/collections

List collections

Same collection list as embedded in API root (dedicated path).

Example Request

curl -sS -H "X-API-KEY: YOUR_BASE64_CREDENTIALS" \
  "https://api.ismalicious.com/taxii/api-root/collections"

Responses

{"collections":[{"id":"malicious-ips","title":"Malicious IPs"},{"id":"malicious-domains","title":"Malicious Domains"},{"id":"phishing-indicators","title":"Phishing Indicators"},{"id":"org-reported-ips","title":"Org-reported IPs"}]}
GET
/taxii/api-root/collections/{collectionId}

Collection metadata

Metadata for a single collection id (e.g. malicious-domains).

Parameters

NameTypeRequiredDescription
collectionIdstringYesCollection UUID or slug

Example Request

curl -sS -H "X-API-KEY: YOUR_BASE64_CREDENTIALS" \
  "https://api.ismalicious.com/taxii/api-root/collections/malicious-domains"

Responses

{}
GET
/taxii/api-root/collections/{collectionId}/objects

Collection objects (STIX 2.1 bundle)

Returns a STIX 2.1 bundle (identity + indicators) from Redis-backed threat data.

Authentication: X-API-KEY (Base64 apiKey:apiSecret) — Pro subscription required.

Performance: Each request examines at most a fixed number of Redis keys (currently 20,000). If your filters match rarely (e.g. a narrow time window), a page may return fewer than limit indicators even when X-TAXII-Has-More is true — call again with next until the feed is exhausted.

Date filters: If added_after or added_before is set, entities without a parseable firstSeen / lastSeen in Redis are excluded (they cannot be placed in a time window). Indicators without intel timestamps still appear in the bundle when no date query parameters are used.

Full-collection ingestion: For complete feed collection, omit both `added_after` and `added_before`. This returns the most complete dataset — including indicators without intel timestamps — and pagination with next behaves identically. Apply date filters only for incremental/windowed pulls where excluding timestamp-less indicators is acceptable.

Response headers:

HeaderMeaning
Content-Typeapplication/stix+json;version=2.1
X-TAXII-Has-Moretrue if more data exists — pass X-TAXII-Next as the next query parameter.
X-TAXII-NextOpaque token (URL-safe Base64 JSON) for the next page.
X-TAXII-Date-Added-First / LastFirst and last indicator created in this page (for convenience).

Note: match[type] / match[id] query params are accepted for forward compatibility but are not yet applied server-side.

Parameters

NameTypeRequiredDescription
collectionIdstringYese.g. malicious-domains, malicious-ips, org-reported-ips (org-scoped, API key required)
limitintegerNoMax bundle size hint (default 50, max 1001 for Pro, max 10001 for Enterprise). Bundle includes one identity object; indicators are capped at approximately limit − 1.
added_afterstringNoISO 8601 / RFC 3339. Include only indicators whose intel time (firstSeen / lastSeen in Redis) is on or after this instant.
added_beforestringNoISO 8601 / RFC 3339. Include only indicators whose intel time is on or before this instant. Use with added_after for a time window.
nextstringNoOpaque pagination token from the previous response header X-TAXII-Next. Repeat the same added_after / added_before when paging.

Example Request

curl -sS -H "X-API-KEY: $CREDENTIALS" -H "Accept: application/taxii+json;version=2.1" \
  "https://api.ismalicious.com/taxii/api-root/collections/malicious-domains/objects?limit=100&added_after=2026-03-01T00:00:00.000Z&added_before=2026-03-03T23:59:59.999Z"

Responses

{
  "type": "bundle",
  "id": "bundle--…",
  "objects": [
    {
      "type": "identity",
      "spec_version": "2.1"
    },
    {
      "type": "indicator",
      "spec_version": "2.1"
    }
  ]
}

Organization Indicators

Submit and consume org-scoped IOCs (PRO / ENTERPRISE). Indicators are auto-approved and isolated per organization.

Report malicious IPs, domains, and file hashes that apply only to your organization. Approved values are stored in Postgres and mirrored to Redis keys org:blocklist:{orgId}:ips|domains|hashes for downloads and TAXII collections org-reported-ips, org-reported-domains, and org-reported-file-hashes.

Requirements: PRO or ENTERPRISE subscription on the authenticated organization. Daily caps: PRO 200/day, ENTERPRISE 100,000/day (technical guardrail).

Authentication: X-API-KEY (Base64 apiKey:apiSecret) or dashboard session cookie with org membership.

POST
/org/indicators

Submit org indicators

Batch submit up to 100 indicators. Duplicates upsert by (organization, type, value). Returns auto-approved rows.

Request Body

{
  "indicators": [
    {
      "type": "ip",
      "value": "203.0.113.10",
      "category": "malware",
      "comment": "IPS correlation"
    }
  ]
}

Example Request

curl -sS -X POST "https://api.ismalicious.com/org/indicators" \
  -H "Content-Type: application/json" \
  -H "X-API-KEY: $CREDENTIALS" \
  -d '{"indicators":[{"type":"domain","value":"evil.example.com","category":"phishing"}]}'

Responses

{
  "message": "Submitted 1 indicator(s)",
  "inserted": 1,
  "indicators": [
    {
      "id": "…",
      "entityType": "ip",
      "value": "203.0.113.10"
    }
  ]
}
GET
/org/indicators

List org indicators

Paginated list filtered by entityType and status.

Parameters

NameTypeRequiredDescription
entityTypestringNoip | domain | hash
statusstringNoapproved | revoked
pagenumberNoPage number (default 1)
limitnumberNoPage size (max 100, default 25)

Example Request

curl -sS -H "X-API-KEY: $CREDENTIALS" \
  "https://api.ismalicious.com/org/indicators?status=approved&limit=50"

Responses

{
  "indicators": [],
  "total": 0,
  "page": 1,
  "limit": 25
}
DELETE
/org/indicators/{id}

Revoke org indicator

Sets status to revoked and removes the value from the org Redis blocklist.

Parameters

NameTypeRequiredDescription
idstringYesOrganizationIndicator id

Example Request

curl -sS -X DELETE -H "X-API-KEY: $CREDENTIALS" \
  "https://api.ismalicious.com/org/indicators/{id}"

Responses

{
  "indicator": {
    "id": "…",
    "status": "revoked"
  }
}
GET
/org/blocklists/download/{entityType}

Download org blocklist

Plain text, one IOC per line. entityType: ips, domains, or hashes (aliases ip/domain/hash accepted).

Parameters

NameTypeRequiredDescription
entityTypestringYesips | domains | hashes

Example Request

curl -sS -H "X-API-KEY: $CREDENTIALS" \
  "https://api.ismalicious.com/org/blocklists/download/ips"

Responses

203.0.113.10
evil.example.com
GET
/org/blocklists/stats

Org blocklist counts

Entry counts per entity type from Redis org blocklist metadata.

Example Request

curl -sS -H "X-API-KEY: $CREDENTIALS" \
  "https://api.ismalicious.com/org/blocklists/stats"

Responses

{
  "ips": 12,
  "domains": 4,
  "hashes": 1,
  "total": 17,
  "updatedAt": "2026-05-26T12:00:00.000Z"
}

Blocklists

Download threat intelligence blocklists

GET
/blocklist/stats

Get Blocklist Stats

Get entry counts and last updated timestamps for all available blocklists. No authentication required.

Example Request

curl -X GET "https://api.ismalicious.com/blocklist/stats"

Responses

{
  "blocklist-ips-critical.txt": {
    "count": 15420,
    "lastUpdated": "2024-12-28T07:00:00.000Z"
  },
  "blocklist-domains-phishing.txt": {
    "count": 89234,
    "lastUpdated": "2024-12-28T07:00:00.000Z"
  },
  "blocklist-domains-malware.txt": {
    "count": 45123,
    "lastUpdated": "2024-12-28T07:00:00.000Z"
  }
}
GET
/blocklist/download/{filename}

Download Blocklist

Download a specific blocklist file.

Plan Access:

FREE: 10% sample (lite version)

BASIC+: Full blocklist

Available Blocklists:

blocklist-ips-critical.txt - Critical severity IPs

blocklist-ips-all.txt - All malicious IPs

blocklist-ips-c2.txt - C2 server IPs

blocklist-ips-botnet.txt - Botnet IPs

blocklist-domains-phishing.txt - Phishing domains

blocklist-domains-malware.txt - Malware domains

blocklist-domains-ransomware.txt - Ransomware domains

blocklist-domains-all.txt - All malicious domains

Parameters

NameTypeRequiredDescription
filenamestringYesBlocklist filename

Example Request

curl -X GET "https://api.ismalicious.com/blocklist/download/blocklist-domains-phishing.txt" \
  -H "X-API-KEY: YOUR_BASE64_CREDENTIALS" \
  -o blocklist-domains-phishing.txt

Responses

malicious-domain1.com
malicious-domain2.com
malicious-domain3.com
...

Submit Sources

Submit new threat intelligence sources

POST
/submit

Submit Sources

Submit new threat intelligence sources to the community database.

Categories: malware, phishing, spam, scam, fraud, botnet, ransomware, c2

Request Body

{
  "sources": [
    {
      "name": "Example Threat Feed",
      "type": "ip",
      "url": "https://example.com/threats-ips.txt",
      "category": "malware"
    },
    {
      "name": "Phishing Domains Feed",
      "type": "domain",
      "url": "https://example.com/phishing-domains.txt",
      "category": "phishing"
    }
  ]
}

Example Request

curl -X POST "https://api.ismalicious.com/submit" \
  -H "X-API-KEY: YOUR_BASE64_CREDENTIALS" \
  -H "Content-Type: application/json" \
  -d '{
    "sources": [{
      "name": "My Threat Feed",
      "type": "domain",
      "url": "https://example.com/feed.txt",
      "category": "phishing"
    }]
  }'

Responses

{
  "message": "Submitted successfully, thanks sharing new sources with us!"
}

Streaming (SSE)

Progressive check results over Server-Sent Events

Endpoints: GET https://api.ismalicious.com/check/stream?query=<target> or GET https://api.ismalicious.com/stream?query=<target>

Auth: Same as other protected routes (X-API-KEY with Base64 apiKey:apiSecret, or session cookie).

Requirements: query is required. Streaming is for IP/domain-style targets (not file hashes).

Event format: Each SSE data line is JSON:

{ "type": "reputation", "data": { } }

Phases include reputation, basic, insights, optional dns (domains), enrichment, then done. The insights payload may include asnReputation ({ asn, listed, list: "spamhaus-asn-drop", … }) when an ASN resolves — a light network-context signal (also contributes a small capped boost to riskScore when listed is true). The enrichment payload may include otx (AlienVault OTX): pulses and, with full enrichment, labs reputation and passive DNS for IP/domain targets when OTX succeeds (public API; optional OTX_API_KEY for rate limits).

Example:

curl -N -H "X-API-KEY: YOUR_BASE64_CREDENTIALS" \
  "https://api.ismalicious.com/check/stream?query=example.com"

Dashboard & platform API

Additional routes on the same host power the web app (session cookie) and accept `X-API-KEY` where `require_any_auth` is applied.

These are implemented in apps/rust-api/src/main.rs (session + API key tier). Full request/response schemas are best read from openapi.json when present, or from source.

ReportsGET/POST /reports, GET/DELETE /reports/{id}, GET /reports/export, POST /reports/save, POST /reports/entity-export

MonitoringGET/POST /monitoring, GET /monitoring/metrics, POST /monitoring/toggle-notify, POST /monitoring/unwatch

CVE Watch/cve-watch/perimeters (CRUD, plus /{id}/cpes, /{id}/cves, /{id}/sync), /cve-watch/findings (with /{id}, /bulk-status, /stats), /cve-watch/cpe-search, /cve-watch/vendor-search, /cve-watch/global-threats, /cve-watch/recent-publications

AlertsGET /alerts, GET /alerts/metrics, GET /alerts/funnel, PATCH /alerts/{id}

Action center & casesGET /action-center/overview, GET/POST /cases, PATCH /cases/{id}, POST /cases/{id}/evidence, GET /risk-brief/latest, GET /trust/assessment/schema

Data-to-action surfacesGET /platform/data-freshness, GET /platform/data-ops/pipeline, GET /network/intel

User / webhooksGET /user/analytics, GET/POST /user/webhooks, GET/PATCH/DELETE /user/webhooks/{id}, GET /user/webhooks/events

Billing & subscriptionPOST /billing/checkout, POST /billing/portal, /subscription/*, Stripe POST /webhook/stripe (called by Stripe, not customers)

Onboarding/onboarding/status, /onboarding/save-step, /onboarding/complete, /onboarding/complete-wizard

GPT / SBOM / AIGET /gpt/check, GET /gpt/search, GET /gpt/email, GET /gpt/ransomware; GET/POST /sbom; POST /ai-analysis

MMDBGET /mmdb/info, GET /mmdb/download

Metrics (auth)GET /metrics/subscription, GET /metrics/threats, GET /cve/stats/top-products (PG or Redis; meta.source), GET /cve/vendors (paginated, search, sort), GET /cve/products (paginated, vendor filter, search, sort). Populate PG via sync-opencve-catalog; Redis fallback via opencve-global-top-products.

Admin / email / CVE dashboard JSON/admin/*, /emails/*, /cve/dashboard/* (operators; Infinity / dashboards; separate credentials)

Public utilitiesPOST /contact, POST /feedback, POST /newsletter, POST /license, GET|POST /cache, GET /debug/headers, GET /internal/whois (internal header auth), cron routes with bearer tokens.

Rate Limits

API rate limiting information

API rate limits vary by subscription plan. Each plan combines a burst limit (short rolling window) and a monthly quota on reputation checks.

PlanAPI accessBurst limitMonthly checks
FREENo (dashboard use)1 / hour when using checks while logged in30
BASICYes1 / minute2,000
PROYes60 / minute10,000
CustomYesNegotiatedNegotiated

Rate Limit Headers:

Each response includes headers indicating your current usage:

X-RateLimit-Limit - Maximum requests allowed

X-RateLimit-Remaining - Requests remaining

X-RateLimit-Reset - Unix timestamp when limit resets

When Rate Limited:

If you exceed your rate limit, you'll receive a 429 Too Many Requests response. Wait until the reset time or upgrade your plan.

Best Practices:

Cache responses when possible

Use batch endpoints for bulk operations

Implement exponential backoff for retries

Monitor your usage via the dashboard

Error Codes

API error response formats

All API errors return a consistent JSON format:

{
  "error": "Error Type",
  "message": "Detailed error message"
}

HTTP Status Codes:

CodeDescription
200Success
400Bad Request - Invalid parameters
401Unauthorized - Missing or invalid API key
403Forbidden - Access denied (plan restriction)
404Not Found - Resource doesn't exist
429Too Many Requests - Rate limit exceeded
500Internal Server Error

Common Errors:

400 Bad Request

{
  "error": "Bad Request",
  "message": "Missing required parameter: query"
}

401 Unauthorized

{
  "error": "Unauthorized",
  "message": "Invalid API key"
}

429 Rate Limited

{
  "error": "Rate Limited",
  "message": "You have exceeded your rate limit. Please try again later."
}

Enterprise SSO (OIDC)

Configure OpenID Connect SSO for your organization (Enterprise plan). Users sign in at `/auth/sso` with a work email, get redirected to your IdP, and return through `/api/auth/sso/callback`.

## Okta (OIDC)

1.In Okta Admin → Applications → Create App Integration → OIDC / Web.

2.Sign-in redirect URI: https://YOUR_DOMAIN/api/auth/sso/callback

3.Copy Issuer (e.g. https://YOUR_OKTA_DOMAIN/oauth2/default), Client ID, and Client secret.

4.In isMalicious → Account → SSO, set Email domain to your corporate domain (e.g. acme.com), paste issuer/client values, and save.

5.Optional: enable Require SSO to block password and social login for that domain.

## Microsoft Entra ID (Azure AD)

1.App registrations → New registration → Web redirect URI https://YOUR_DOMAIN/api/auth/sso/callback.

2.Create a client secret under Certificates & secrets.

3.Issuer URL: https://login.microsoftonline.com/TENANT_ID/v2.0

4.Configure the same values in Account → SSO and test from /auth/sso.

## User flow

1.User visits /auth/sso and enters user@company.com.

2.POST /api/auth/sso/lookup resolves the organization.

3.Browser redirects to GET /api/auth/sso/start?orgId=... → IdP login.

4.IdP returns to /api/auth/sso/callback → session established via one-time token at /auth/sso/complete.

Callback URL (register with IdP): https://YOUR_DOMAIN/api/auth/sso/callback

GET
/api/organization/sso

Read SSO configuration (Enterprise admin)

Returns redacted OIDC settings for the authenticated organization. Requires Enterprise plan and OWNER/ADMIN role.

Example Request

curl -sS -b cookies.txt https://ismalicious.com/api/organization/sso

Responses

{"connection":{"emailDomain":"acme.com","issuerUrl":"https://login.okta.com/oauth2/default","clientId":"...","hasClientSecret":true,"enforceSso":true,"enabled":true}}
POST
/api/auth/sso/lookup

Discover SSO by email

Public endpoint used by the SSO login page. Returns { found, organizationId, domain } when an enabled connection matches the email domain.

Parameters

NameTypeRequiredDescription
emailstringYesUser work email (JSON body)

Example Request

curl -sS -X POST https://ismalicious.com/api/auth/sso/lookup   -H "Content-Type: application/json"   -d '{"email":"analyst@acme.com"}'

Responses

{"found":true,"organizationId":"550e8400-e29b-41d4-a716-446655440000","domain":"acme.com"}

Ready to Get Started?

Get your free API key and start protecting your infrastructure today.