API Docs
Use the fixasap API to analyze websites from your own scripts and services. The API applies the same rules and limits as the website.
Getting started
- Log in and accept the legal notice on the website once.
- Go to My page > API keys and create your key (one per account). The full key is shown only once, so store it safely.
- Send the key in the Authorization header of every request.
Authentication
Send your key as a Bearer token. Requests without a valid key return 401 invalid_api_key.
Authorization: Bearer fxa_xxxxxxxxxxxxxxxx
Start an analysis
POST/api/v1/scans
Submit up to 20 URLs, domains or IPs. The response returns a result ID right away; analysis runs in the background.
curl -X POST https://fixasap.net/api/v1/scans \
-H "Authorization: Bearer $FIXASAP_API_KEY" \
-H "Content-Type: application/json" \
-d '{"targets": ["example.com", "https://another.com"]}'
HTTP/1.1 202 Accepted
{"job_id": "1c6a4c2e-8f0b-4c4f-9b8e-2f3a6d1e9b10", "status": "queued", "count": 2}
Get results
GET/api/v1/scans/{job_id}
Poll with the result ID until status is done. Results are kept for 24 hours.
curl https://fixasap.net/api/v1/scans/1c6a4c2e-8f0b-4c4f-9b8e-2f3a6d1e9b10 \
-H "Authorization: Bearer $FIXASAP_API_KEY"
{
"job_id": "1c6a4c2e-8f0b-4c4f-9b8e-2f3a6d1e9b10",
"status": "done", "count": 2, "done": 2, "percent": 100,
"targets": [
{
"target": "example.com", "status": "done",
"result": {
"final_url": "https://example.com/", "http_version": "HTTP/2", "edge_detected": true,
"layers": {
"edge": [{"name": "Cloudflare", "confidence": 100, "determined": true}],
"server": [{"name": "nginx", "version": "1.25.3", "confidence": 80, "determined": false}],
"runtime": [{"name": "PHP", "confidence": 56, "determined": false}],
"framework": [],
"app": [{"name": "WordPress", "confidence": 100, "determined": true}]
}
}
},
{"target": "another.com", "status": "failed", "error": "unreachable"}
]
}
Response fields
status | running or done for the whole request |
done / count | finished targets / total targets |
targets[].status | queued, running, done or failed |
targets[].result.layers | detected technologies by layer: edge, server, runtime, framework, app |
layers.*[].confidence | 0 to 100; determined is true when seen directly |
targets[].error | error code when a target failed |
Limits
- Up to 20 targets at a time
- Up to 200 targets per hour for each account
- Up to 120 requests per minute per IP
- One API key per account
Errors
Errors return JSON like {"error": "code"}.
400 | no_targets, too_many_targets, invalid_request |
401 | invalid_api_key |
403 | consent_required (accept the legal notice on the website) |
404 | not_found (unknown or expired result ID) |
429 | quota_exceeded, rate_limited |