Detect 141+ technologies on any website with a single API call.
techdetect is a clean Python client for the Technology Detection API on RapidAPI. Pass in a URL, get back a structured list of every framework, CMS, analytics tool, CDN, and more running on that site — complete with version numbers and confidence scores.
Get your free API key → rapidapi.com/dapdev-dapdev-default/api/technology-detection-api
pip install techdetectfrom techdetect import TechDetect
with TechDetect(api_key="YOUR_RAPIDAPI_KEY") as td:
result = td.detect("https://wordpress.org")
print(f"Scanned: {result.url}")
print(f"Found {len(result.technologies)} technologies ({result.scan_time_ms}ms)\n")
for tech in result.technologies:
version = f" v{tech.version}" if tech.version else ""
cats = ", ".join(tech.categories)
print(f" {tech.name}{version} [{cats}] confidence={tech.confidence:.0%}")Scanned: https://wordpress.org
Found 18 technologies (847ms)
WordPress v6.7.1 [CMS, Blog] confidence=100%
PHP [Programming Language] confidence=100%
MySQL [Database] confidence=100%
jQuery v3.7.1 [JavaScript Library] confidence=100%
Nginx [Web Server] confidence=100%
Yoast SEO v23.5 [SEO] confidence=100%
WooCommerce v9.3.3 [Ecommerce] confidence=100%
Google Analytics [Analytics] confidence=100%
Gravatar [Widgets] confidence=100%
reCAPTCHA [Security] confidence=100%
Google Tag Manager [Tag Manager] confidence=100%
Cloudflare [CDN, Security] confidence=100%
React v18.3.1 [JavaScript Framework] confidence=97%
Webpack [Build Tool] confidence=95%
Lodash v4.17.21 [JavaScript Library] confidence=95%
Moment.js v2.30.1 [JavaScript Library] confidence=90%
Chart.js v4.4.4 [JavaScript Graphics] confidence=88%
Underscore.js v1.13.7 [JavaScript Library] confidence=85%
Synchronous client. Use as a context manager or call .close() manually.
td = TechDetect(api_key="YOUR_KEY")
result = td.detect("https://example.com")
td.close()
# Or with context manager (recommended):
with TechDetect(api_key="YOUR_KEY") as td:
result = td.detect("https://example.com")Scan a URL and return all detected technologies.
| Parameter | Type | Description |
|---|---|---|
url |
str |
Full URL to scan, including scheme (e.g. https://example.com) |
Returns: DetectionResult
Async client for use in asyncio / FastAPI / aiohttp contexts. Drop-in replacement for TechDetect.
import asyncio
from techdetect import AsyncTechDetect
async def main():
async with AsyncTechDetect(api_key="YOUR_KEY") as td:
result = await td.detect("https://example.com")
print(result.technologies)
asyncio.run(main())Same signature and return type as the sync version.
| Field | Type | Description |
|---|---|---|
url |
str |
The URL that was scanned |
technologies |
list[Technology] |
All detected technologies |
scan_time_ms |
int |
How long the scan took in milliseconds |
cached |
bool |
Whether the result came from cache |
# Check if a specific technology is present
result.has("WordPress") # True / False
result.has("react") # case-insensitive
# Filter by category
cms = result.by_category("CMS")
cdn = result.by_category("CDN")
js_libs = result.by_category("JavaScript Library")| Field | Type | Description |
|---|---|---|
name |
str |
Technology name (e.g. "WordPress") |
categories |
list[str] |
Categories (e.g. ["CMS", "Blog"]) |
confidence |
float |
Detection confidence from 0.0 to 1.0 |
version |
str | None |
Detected version, if available |
detected_by |
list[str] |
Which signals triggered detection |
import asyncio
from techdetect import AsyncTechDetect
URLS = [
"https://wordpress.org",
"https://shopify.com",
"https://squarespace.com",
]
async def main():
async with AsyncTechDetect(api_key="YOUR_KEY") as td:
results = await asyncio.gather(*[td.detect(u) for u in URLS])
for r in results:
cms = r.by_category("CMS")
cms_names = ", ".join(t.name for t in cms) or "none detected"
print(f"{r.url:35s} CMS: {cms_names}")
asyncio.run(main())from techdetect import TechDetect
with TechDetect(api_key="YOUR_KEY") as td:
shopify = td.detect("https://shopify.com")
bigcommerce = td.detect("https://bigcommerce.com")
# Find shared technologies
shopify_names = {t.name for t in shopify.technologies}
bigcommerce_names = {t.name for t in bigcommerce.technologies}
shared = shopify_names & bigcommerce_names
only_shopify = shopify_names - bigcommerce_names
only_bigcommerce = bigcommerce_names - shopify_names
print(f"Shared ({len(shared)}): {', '.join(sorted(shared))}")
print(f"Only Shopify ({len(only_shopify)}): {', '.join(sorted(only_shopify))}")
print(f"Only BigCommerce ({len(only_bigcommerce)}): {', '.join(sorted(only_bigcommerce))}")This library calls the Technology Detection API hosted on RapidAPI.
- Go to rapidapi.com/dapdev-dapdev-default/api/technology-detection-api
- Click Subscribe — there is a free tier available
- Copy your
X-RapidAPI-Keyfrom the dashboard - Pass it to
TechDetect(api_key="...")
The free tier is enough to explore the API and build prototypes. Upgrade for higher rate limits and bulk scanning.
import httpx
from techdetect import TechDetect
with TechDetect(api_key="YOUR_KEY") as td:
try:
result = td.detect("https://example.com")
except httpx.HTTPStatusError as e:
if e.response.status_code == 401:
print("Invalid API key — check your RapidAPI key")
elif e.response.status_code == 429:
print("Rate limit hit — upgrade your RapidAPI plan")
else:
print(f"API error: {e.response.status_code}")
except httpx.TimeoutException:
print("Request timed out — the site may be slow or unreachable")MIT — see LICENSE.
Built on httpx. Powered by the Technology Detection API on RapidAPI.