Skip to main content

Official Python SDK for ContrastAPI — security intelligence for developers and AI agents

Project description

ContrastAPI Python SDK

Official Python client for ContrastAPI — security intelligence for developers and AI agents.

42 MCP tools / 50+ HTTP endpoints: CVE / EPSS / KEV / CWE, MITRE ATLAS (AI/ML attacks) + bulk drill, MITRE D3FEND defenses, domain audit, IOC + threat intel, OSINT, code-security checks, and more. No API key required for the free tier (100 req/hr).

Install

pip install contrastapi

Requires Python 3.10+. Depends only on httpx>=0.25.

Quickstart

Sync

from contrastapi import ContrastAPI
from contrastapi.models import CveResponse, AuditResponse

with ContrastAPI() as client:                    # keyless, free tier
    cve: CveResponse = client.cve.lookup("CVE-2021-44228")
    print(cve["kev"]["in_kev"])                  # True (IDE autocompletes "kev", "epss"...)

    techs = client.atlas.bulk_technique_lookup(["AML.T0051", "AML.T0043"])
    print(techs["successful"])                   # 2

    audit: AuditResponse = client.domain.audit("example.com")
    print(audit["score"])

Every response method has a typed return — client.cve.lookup(...) returns CveResponse, client.atlas.technique(...) returns AtlasTechniqueResponse, etc. You never need to write the type annotation; IDEs (VSCode/PyCharm) infer it from the method signature and offer autocomplete on response keys. Import from contrastapi.models only if you want to annotate explicitly or pass responses across function boundaries.

Async

import asyncio
from contrastapi import AsyncContrastAPI

async def main():
    async with AsyncContrastAPI(api_key="cc_...") as client:
        defenses = await client.d3fend.defense_for_attack("T1059")
        print(len(defenses["defenses"]))

asyncio.run(main())

Shortcuts (multi-call helpers)

from contrastapi import ContrastAPI, audit_full, enrich_batch, triage_ioc

with ContrastAPI() as client:
    # Auto-route IP/hash/domain to the right enrichment leg
    report = triage_ioc(client, "8.8.8.8")              # ioc + threat_report

    # Audit + subdomains + tech + per-subdomain SSL (capped)
    audit = audit_full(client, "example.com", ssl_subdomains=5)

    # Auto-detect CVE vs IOC and bulk-route
    enriched = enrich_batch(client, ["CVE-2021-44228", "8.8.8.8", "evil.com"])

Shortcuts swallow per-leg ContrastAPIError so partial failures still return whatever succeeded — see result["errors"] for the failure map.

Authentication

Pass an API key as the first positional argument or as api_key=:

client = ContrastAPI("cc_<your-key>")            # 1000 req/hr (Pro tier)

Get a key at contrastcyber.com/pricing.

Exception model

The SDK maps server error codes (v1.22.2+ wire envelope) to typed exceptions:

Exception Status Server code
InvalidArgumentError 400, 422 invalid_argument
AuthRequiredError 401 auth_required
TierLimitError 403 tier_limit
NotFoundError 404 not_found
RateLimitError 429 rate_limit_exceeded
UpstreamError 502 upstream_error
UpstreamTimeoutError 504 upstream_timeout
TransportError n/a (network failure, before HTTP)
ContrastAPIError * base / unknown

Every exception carries the parsed envelope:

from contrastapi import ContrastAPI, RateLimitError

try:
    client.cve.lookup("CVE-2021-44228")
except RateLimitError as exc:
    print(exc.message)                  # "Hourly limit reached"
    print(exc.retry_after_seconds)      # 60 (capped at 3600)
    print(exc.upgrade_url)              # "https://contrastcyber.com/pricing"
    print(exc.extras)                   # back-compat top-level fields (tier, limit, ...)

Namespaces

Namespace Methods
cve lookup, search, leading, kev, exploit, bulk
cwe lookup
ioc lookup, hash, phishing, bulk
atlas technique, technique_search, bulk_technique_lookup, case_study, case_study_search
d3fend defense, defense_search, defense_for_attack, coverage
domain report, dns, whois, subdomains, certs, ssl, tech, threat, monitor, vulns, audit, wayback, bulk
ip lookup, threat_report
asn lookup
email mx, disposable
phone lookup
password check (k-anonymity SHA-1 prefix)
username lookup
check secrets, injection, headers, dependencies
scan headers (live HTTP scan)

The async client (AsyncContrastAPI) exposes the same namespace surface 1:1 — every method is async def.

Parity with the Node SDK

Surface Node SDK Python SDK
Sync ✅ (Promise-based) ✅ (ContrastAPI)
Async (Promise model) ✅ (AsyncContrastAPI)
Namespace count 13 14 (adds username)
bulk_technique_lookup (ATLAS) (added in v1.4.0)
wayback archive lookup (added in v1.4.0)
Typed errors Error subclasses full hierarchy with envelope fields
Shortcuts triage_ioc, audit_full, enrich_batch
Response models Promise<any> TypedDict (IDE autocomplete, no runtime cost)

Configuration

client = ContrastAPI(
    api_key="cc_...",                  # optional; keyless = free tier
    base_url="https://api.contrastcyber.com",  # override for self-host
    timeout=30.0,                       # seconds; clamped to [1, 120]
    allow_insecure=False,               # set True to allow http:// (dev only)
)

The transport hard-caps response bodies at 10 MB, sends a User-Agent: contrastapi-python/<version> header, and refuses to send your API key over plaintext HTTP even when allow_insecure=True.

Links

License

MIT — see LICENSE.

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

contrastapi-1.22.4.tar.gz (27.4 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

contrastapi-1.22.4-py3-none-any.whl (23.9 kB view details)

Uploaded Python 3

File details

Details for the file contrastapi-1.22.4.tar.gz.

File metadata

  • Download URL: contrastapi-1.22.4.tar.gz
  • Upload date:
  • Size: 27.4 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.12.3

File hashes

Hashes for contrastapi-1.22.4.tar.gz
Algorithm Hash digest
SHA256 0b2e2fadab4213fd145f5558cef841a349f73e7001aac48e442dccd523c6c4c6
MD5 0eb073dc648a0c4dcfce95b3c75c1263
BLAKE2b-256 a46f7aa8b3c6d9be423b38ca430b0cbc2f07f2f754f5227efbafbb4b53441515

See more details on using hashes here.

File details

Details for the file contrastapi-1.22.4-py3-none-any.whl.

File metadata

  • Download URL: contrastapi-1.22.4-py3-none-any.whl
  • Upload date:
  • Size: 23.9 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.12.3

File hashes

Hashes for contrastapi-1.22.4-py3-none-any.whl
Algorithm Hash digest
SHA256 65761ddefb240270b75b98d7ca4c2d0f3034024fc556e9985ed32e1c92f0f8f0
MD5 8249a898654731c9ad08d3e3b1b049f5
BLAKE2b-256 42fd33eb72a0b26b5e2814d6d7434289108f91f0cd2482dfe671d50caa657200

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page