Developers
API Documentation
Detect AI builders, tech stacks, hosting, and confidence scores for any URL — programmatically.
Authentication
Every request must include your API key. You can pass it two ways:
Option A — Authorization header
Authorization: Bearer YOUR_API_KEYOption B — X-Api-Key header
X-Api-Key: YOUR_API_KEYAPI keys are available on the dashboard. Contact us if you need a key.
Endpoints
/api/v1/scanDetect a websiteScans a URL and returns the detected builder, tech stack, hosting, and confidence score. Results are cached for 1 hour — subsequent requests for the same URL return instantly.
Request body (POST)
{ "url": "https://example.com" }Query param (GET)
GET /api/v1/scan?url=https://example.comExample — cURL
curl -X POST https://www.aiwebsitedetector.com/api/v1/scan \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{"url": "https://framer.com"}'Response
{
"url": "https://framer.com",
"builder": "Framer",
"builderSlug": "framer",
"confidence": "high",
"category": "visual-builder",
"technologies": ["React", "Framer Motion", "Cloudflare"],
"hosting": "Framer",
"siteType": "marketing",
"cached": false
}Response fields
| Field | Type | Description |
|---|---|---|
| url | string | Resolved final URL after redirects |
| builder | string | null | Detected builder name (e.g. Framer, Webflow, WordPress) |
| builderSlug | string | null | Slug identifier for the builder |
| confidence | "high" | "medium" | "low" | null | Detection confidence level |
| category | string | null | Builder category (ai-builder, cms, ecommerce, etc.) |
| technologies | string[] | Detected technologies and services |
| hosting | string | null | Detected hosting provider |
| siteType | string | null | Type of site (marketing, ecommerce, blog, etc.) |
| cached | boolean | true if result was served from cache |
/api/v1/meAPI key info & usageReturns your API key details, current usage, and remaining quota for the billing month.
Example — cURL
curl https://www.aiwebsitedetector.com/api/v1/me \
-H "Authorization: Bearer YOUR_API_KEY"Response
{
"name": "My App",
"email": "you@example.com",
"plan": "starter",
"requests_used": 42,
"requests_limit": 1000,
"requests_remaining": 958,
"resets_on": "2026-04-01",
"last_used_at": "2026-03-27T10:30:00.000Z",
"created_at": "2026-03-01T00:00:00.000Z"
}Rate Limits
Per-minute limit
30
requests / minute per key
Monthly limit
Plan-based
resets on the 1st of each month
Rate limit headers are included in every response:
X-RateLimit-Limit: 30
X-RateLimit-Remaining: 28
X-RateLimit-Reset: 1743084060
Retry-After: 60 # only on 429 responsesWhen the per-minute limit is exceeded you'll receive a 429 Too Many Requests response. When monthly quota is exceeded the scan endpoint returns 429 until the next reset.
Error Codes
| Status | Meaning |
|---|---|
| 200 | Success |
| 400 | Bad request — missing or invalid url parameter |
| 401 | Unauthorized — missing, invalid, or revoked API key |
| 429 | Rate limit exceeded — slow down or check monthly quota |
| 500 | Server error — scan failed (try again) |
| 503 | Service unavailable — maintenance or API access disabled |
All error responses include an error field with a human-readable message.
Code Examples
Node.js / fetch
const res = await fetch("https://www.aiwebsitedetector.com/api/v1/scan", {
method: "POST",
headers: {
"Authorization": "Bearer YOUR_API_KEY",
"Content-Type": "application/json",
},
body: JSON.stringify({ url: "https://example.com" }),
});
const data = await res.json();
console.log(data.builder, data.confidence);Python
import requests
response = requests.post(
"https://www.aiwebsitedetector.com/api/v1/scan",
headers={"Authorization": "Bearer YOUR_API_KEY"},
json={"url": "https://example.com"},
)
data = response.json()
print(data["builder"], data["confidence"])Need a higher quota or have questions? Get in touch →