ContrastAPI — Third-Party Dependencies & Function Reference
All third-party libraries, their functions we use, signatures, and what they do.
Update this file when adding new library imports.
ASGI web framework for building APIs.
Function / Class
Signature
What it does
Used in
FastAPI()
FastAPI(title, description, version, lifespan, openapi_url, docs_url)
Creates the ASGI application
main.py
APIRouter()
APIRouter(prefix, tags)
Groups related routes under a URL prefix
domain/routes.py, cve/routes.py, codesec/routes.py, ioc/routes.py
HTTPException
HTTPException(status_code, detail)
Raises HTTP error response with JSON detail
auth.py, all routes
Request
request.headers, request.url.path, request.state, request.client.host
Access request data (headers, path, client IP)
auth.py, all routes
Query()
Query(default, ge, le, description)
Declares query parameter with validation
cve/routes.py
HTMLResponse
HTMLResponse(content, status_code)
Returns HTML content type
main.py
JSONResponse
JSONResponse(status_code, content)
Returns JSON with custom status code
main.py
StaticFiles
StaticFiles(directory)
Serves static files (CSS/JS/images)
main.py
ASGI toolkit — FastAPI's foundation.
Function / Class
Signature
What it does
Used in
StarletteHTTPException
from starlette.exceptions import HTTPException
Base exception class — used for 404/405 error handler registration
main.py
HTML template engine.
Function / Class
Signature
What it does
Used in
Jinja2Templates
Jinja2Templates(directory="templates")
Loads and renders HTML templates
main.py
.TemplateResponse()
templates.TemplateResponse(request, "index.html", context)
Returns rendered HTML template as response
main.py
Data validation and serialization.
Function / Class
Signature
What it does
Used in
BaseModel
class MyModel(BaseModel): field: type = default
Defines response/request schema with validation
schemas.py, codesec/routes.py
Field()
Field(default, description, examples)
Adds metadata and validation to model fields
schemas.py
Sync and async HTTP client with connection pooling.
Function / Class
Signature
What it does
Used in
httpx.Client()
httpx.Client(timeout, headers, follow_redirects, transport)
Creates sync HTTP client with connection pool
recon.py, reputation.py, threat.py, cve/routes.py, ioc/routes.py
httpx.AsyncClient()
httpx.AsyncClient(timeout, headers)
Creates async HTTP client
mcp_server.py
client.get()
client.get(url, params, headers) -> Response
HTTP GET request
recon.py, reputation.py, all routes
client.post()
client.post(url, json, headers) -> Response
HTTP POST request
codesec/routes.py
response.json()
response.json() -> dict
Parse JSON response body
everywhere
response.raise_for_status()
response.raise_for_status()
Raises HTTPStatusError if 4xx/5xx
reputation.py, cve/routes.py
httpx.Timeout()
httpx.Timeout(total, connect=5.0)
Configures request timeout
recon.py, reputation.py
httpx.HTTPStatusError
except httpx.HTTPStatusError as e: e.response.status_code
Catches non-2xx responses
reputation.py, mcp_server.py
httpx.RequestError
except httpx.RequestError
Catches connection/network errors
reputation.py
httpx.TimeoutException
except httpx.TimeoutException
Catches timeout errors
cve/routes.py
Low-level HTTP transport — subclassed for SSRF protection.
Function / Class
Signature
What it does
Used in
httpcore.SyncBackend
class _SSRFSafeBackend(httpcore.SyncBackend)
Base class for DNS validation before connecting
recon.py
httpcore.ConnectError
raise httpcore.ConnectError(msg)
Raised when connection to private/internal IP detected
recon.py
DNS resolution and record queries.
Function / Class
Signature
What it does
Used in
dns.resolver.Resolver()
resolver = dns.resolver.Resolver(); resolver.nameservers = [...]
Creates DNS resolver with custom nameservers
recon.py
dns.resolver.resolve()
dns.resolver.resolve(domain, rdtype) -> Answer
Queries DNS records (A, AAAA, MX, NS, TXT, CNAME, SOA)
recon.py, validation.py
dns.exception.DNSException
except dns.exception.DNSException
Catches all DNS errors (NXDOMAIN, timeout, no answer)
recon.py, validation.py
X.509 certificate parsing. Used by Bug F AIA (Authority Information Access) intermediate fetch in /v1/ssl/{domain}.
Function / Class
Signature
What it does
Used in
x509.load_der_x509_certificate()
x509.load_der_x509_certificate(der_bytes) -> Certificate
Parse DER-encoded cert (TLS handshake output + most AIA responses)
domain/routes.py:ssl_certificate
x509.load_pem_x509_certificate()
x509.load_pem_x509_certificate(pem_bytes) -> Certificate
Parse PEM-encoded cert (AIA fallback when body is -----BEGIN CERTIFICATE-----)
domain/routes.py:ssl_certificate
cert.subject.rfc4514_string()
Name.rfc4514_string() -> str
Distinguished Name as RFC 4514 string (CN=...,O=...)
domain/routes.py:ssl_certificate
cert.issuer.rfc4514_string()
same
Issuer DN as RFC 4514 string
domain/routes.py:ssl_certificate
cert.not_valid_after
datetime property
Certificate expiry timestamp
domain/routes.py:ssl_certificate
cert.extensions.get_extension_for_class()
extensions.get_extension_for_class(x509.AuthorityInformationAccess) -> Extension
Look up AIA extension on leaf cert to find CA Issuers URLs
domain/routes.py:ssl_certificate
x509.ExtensionNotFound
except x509.ExtensionNotFound
Raised when cert has no AIA extension (self-signed / missing)
domain/routes.py:ssl_certificate
AuthorityInformationAccessOID.CA_ISSUERS
OID constant
Filters AIA access descriptions to caIssuers URLs (ignores OCSP)
domain/routes.py:ssl_certificate
x509.CertificateBuilder()
.subject_name().issuer_name().public_key().serial_number().not_valid_before().not_valid_after().add_extension().sign()
Builds synthetic cert for tests
tests/test_domain_bulk.py
x509.Name() / x509.NameAttribute()
Name([NameAttribute(NameOID.COMMON_NAME, "example.com")])
Build DN for test certs
tests/test_domain_bulk.py
x509.SubjectAlternativeName() / x509.DNSName()
extension body
SAN extension for test certs
tests/test_domain_bulk.py
x509.AuthorityInformationAccess() / x509.AccessDescription() / x509.UniformResourceIdentifier()
AIA extension body
Attach AIA URL for test fixtures
tests/test_domain_bulk.py
x509.random_serial_number()
-> int
RFC 5280 serial number generator for test certs
tests/test_domain_bulk.py
NameOID.COMMON_NAME, NameOID.ORGANIZATION_NAME
OID constants
DN attribute types for Name()
tests/test_domain_bulk.py
hashes.SHA256()
algorithm instance
Signature hash for CertificateBuilder.sign()
tests/test_domain_bulk.py
serialization.Encoding.DER / .PEM
enum
Output encoding for cert.public_bytes() when feeding mocked handshakes/AIA responses
tests/test_domain_bulk.py
rsa.generate_private_key()
rsa.generate_private_key(public_exponent=65537, key_size=2048)
Key pair for test certs
tests/test_domain_bulk.py
C-backed radix trie (patricia) for fast longest-prefix-match CIDR lookup. Used to check whether an IP belongs to AWS/GCP/Cloudflare published ranges in /v1/ip/{ip}.
Function / Class
Signature
What it does
Used in
pytricia.PyTricia()
pytricia.PyTricia(32) for v4, pytricia.PyTricia(128) for v6
Creates a radix trie keyed on IP prefix length
domain/ip_intel.py
trie[cidr] = value
trie["3.0.0.0/8"] = "AWS"
Inserts CIDR → provider label
domain/ip_intel.py
trie.get(ip)
trie.get("3.5.140.2") -> str | None
Longest-prefix lookup, returns value of covering CIDR or None
domain/ip_intel.py:check_cloud_provider
list(trie)
iterates inserted CIDR prefixes
Snapshot of keys — used to preserve previous entries when a source fails
domain/ip_intel.py:_refresh_cloud_cache
CVSS (Common Vulnerability Scoring System) v2/v3/v4 vector parsing. Used to recompute base scores when OSV.dev returns only a vector string (no numeric score) in _parse_cvss_vector_score(). Imported lazily to keep cold-path modules off the critical import graph.
Function / Class
Signature
What it does
Used in
CVSS3()
CVSS3(vector_string) -> CVSS3
Parses CVSS:3.0/CVSS:3.1 vector string; raises on malformed input
cve/sync.py:_parse_cvss_vector_score
.base_score
CVSS3(v).base_score -> Decimal
Computed base score (0.0–10.0) derived from vector metrics
cve/sync.py:_parse_cvss_vector_score
Phone number parsing, validation, and carrier/geo lookup (Google libphonenumber).
Function / Class
Signature
What it does
Used in
phonenumbers.parse()
phonenumbers.parse(number_str, region=None) -> PhoneNumber
Parses string into PhoneNumber object
recon.py:phone_lookup
phonenumbers.is_valid_number()
phonenumbers.is_valid_number(parsed) -> bool
Validates number for region (length, format)
recon.py:phone_lookup
phonenumbers.format_number()
phonenumbers.format_number(parsed, PhoneNumberFormat.E164) -> str
Formats to E.164 (+905321234567), international, national
recon.py:phone_lookup
phonenumbers.region_code_for_number()
phonenumbers.region_code_for_number(parsed) -> str
Returns ISO country code ("TR", "US")
recon.py:phone_lookup
phonenumbers.number_type()
phonenumbers.number_type(parsed) -> PhoneNumberType
Returns type enum (MOBILE, FIXED_LINE, VOIP...)
recon.py:phone_lookup
geocoder.description_for_number()
geocoder.description_for_number(parsed, "en") -> str
Returns country/region name ("Turkey", "California")
recon.py:phone_lookup
carrier.name_for_number()
carrier.name_for_number(parsed, "en") -> str
Returns carrier name ("Turkcell", "Vodafone")
recon.py:phone_lookup
timezone.time_zones_for_number()
timezone.time_zones_for_number(parsed) -> tuple[str]
Returns IANA timezone list ("Europe/Istanbul")
recon.py:phone_lookup
PhoneNumberFormat.E164
enum: E164, INTERNATIONAL, NATIONAL
Format constants for format_number()
recon.py:phone_lookup
PhoneNumberType.MOBILE
enum: MOBILE, FIXED_LINE, VOIP, TOLL_FREE, PREMIUM_RATE, etc.
Number type constants
recon.py:phone_lookup
NumberParseException
except phonenumbers.NumberParseException
Raised on unparseable input
recon.py:phone_lookup
MCP (Model Context Protocol)
MCP server framework for AI agent tool integration.
Function / Class
Signature
What it does
Used in
FastMCP()
FastMCP(name, instructions, stateless_http=True)
Creates MCP server with tool registry
mcp_server.py
@mcp.tool()
@mcp.tool() async def my_tool(param: str) -> str
Registers function as MCP tool (55 tools)
mcp_server.py
TransportSecuritySettings
TransportSecuritySettings(enable_dns_rebinding_protection=False)
Configures transport security for public API
mcp_server.py
tldextract >=5.0
Public Suffix List-aware domain parser. Bundled PSL snapshot — no network refresh on the hot path.
Function / Class
Signature
What it does
Used in
tldextract.TLDExtract()
TLDExtract(suffix_list_urls=())
Constructs an extractor with bundled PSL (network refresh disabled)
target_throttle.py, domain/seo_audit.py
extract(host)
extract('news.bbc.co.uk') -> ExtractResult
Splits a hostname into subdomain / domain / suffix using PSL
target_throttle.py (eTLD+1 buckets), seo_audit._same_registrable
.top_domain_under_public_suffix
result.top_domain_under_public_suffix -> 'bbc.co.uk'
Registrable domain (eTLD+1); correct for multi-label suffixes (.co.uk, .edu.au, .gov.uk) where last-2-labels heuristic fails
target_throttle, seo_audit
Lenient HTML parser for homepage scraping (brand_assets + seo_audit).
Function / Class
Signature
What it does
Used in
BeautifulSoup()
BeautifulSoup(html, "html.parser")
Parses HTML with the stdlib parser (no lxml C dep)
domain/brand_assets.py, domain/seo_audit.py
.find() / .find_all()
soup.find_all("meta", attrs={"property":"og:image"}, limit=20)
DOM lookup with limit=N to bound traversal cost
brand_assets, seo_audit
tag.get(attr)
tag.get("content")
Safe attribute access (returns None if missing)
brand_assets, seo_audit
Not Directly Imported (Transitive / Runtime)
Package
Version
Role
pydantic-settings
2.13.1
Settings management extension (available, not imported)
python-whois
0.9.6
WHOIS library — unused , project has own raw-socket WHOIS client in recon.py. Consider removing.
requests
2.33.1
HTTP client; transitive dep, httpx used instead
PyJWT
2.12.1
JWT encoding/decoding; reserved for future auth features
sse-starlette
3.3.4
Server-Sent Events; required by MCP HTTP transport at runtime
python-dotenv
1.2.2
.env file loading; env vars loaded via systemd on production
fastapi-mcp
0.4.0
FastAPI-MCP integration; not imported (standalone mcp package used)
Module
Third-Party Imports
app/main.py
fastapi, starlette, jinja2, re
app/domain/recon.py
dnspython, httpcore, httpx, phonenumbers
app/domain/routes.py
fastapi, httpx, pydantic, cryptography
app/domain/ip_intel.py
httpx, pytricia
app/domain/reputation.py
httpx
app/domain/threat.py
httpx
app/cve/routes.py
fastapi, httpx
app/cve/sync.py
httpx, cvss (lazy)
app/codesec/routes.py
fastapi, pydantic
app/ioc/routes.py
fastapi, httpx
app/auth.py
fastapi
app/validation.py
dnspython, fastapi
app/ratelimit.py
(stdlib only)
app/db.py
(stdlib only)
mcp_server.py
httpx, mcp