API endpoints for urlscan.io and urlscan Pro. Most of these API endpoints require authentication.
The fastest way to start working with our APIs is by using one of the many existing commercial or open-source integrations.
https://urlscan.io/
urlscan Pro - Live Scanning allows users to scan websites from different geographical locations and using different device settings.
See additional info about this proprietary feature on urlscan Pro.
Channels subscribed to this incident.
Interval (seconds) between triggering full website scans.
If this is set to manual then scanIntervalAfterSuspended and scanIntervalAfterMalicious will not have an effect.
Determine which items will be monitored for.
Browser User-Agents to use during scanning
List of countries to scan from as ISO-3166-1 country codes.
When to automatically close the incident after the observable was suspended.
When to automatically close the incident after the observable became inactive.
When to automatically close the incident after the observable became malicious.
How to change the scan interval after the observable was suspended.
How to change the scan interval after the observable became malicious.
https://urlscan.io/api/v1/user/incidents
curl -i -X POST \
https://urlscan.io/api/v1/user/incidents \
-H 'Content-Type: application/json' \
-H 'api-key: YOUR_API_KEY_HERE' \
-d '{
"incident": {
"scanInterval": 3600,
"watchedAttributes": [
"detections",
"tls"
],
"userAgents": [
"Chrome on Linux",
"Chrome on macOS"
],
"userAgentsPerInterval": 1,
"countries": [
"de",
"us"
],
"countriesPerInterval": 2,
"stopDelaySuspended": 3600,
"stopDelayInactive": 86400,
"stopDelayMalicious": 90000,
"scanIntervalAfterSuspended": 86400,
"scanIntervalAfterMalicious": 86400,
"observable": "foobar.com",
"visibility": "private",
"channels": [
"{{channelId}}"
],
"scanIntervalMode": "automatic",
"expireAfter": 86400
}
}'Incident body
{ "incident": { "_id": "{{incidentId}}", "scanInterval": 3600, "watchedAttributes": [ … ], "userAgents": [ … ], "userAgentsPerInterval": 1, "countries": [ … ], "countriesPerInterval": 2, "stopDelaySuspended": 3600, "stopDelayInactive": 86400, "stopDelayMalicious": 90000, "scanIntervalAfterSuspended": 86400, "scanIntervalAfterMalicious": 86400, "owner": "own", "type": "hostname", "observable": "foobar.com", "state": "active", "visibility": "private", "channels": [ … ], "sourceType": "manual", "sourceId": "{{sourceId}}", "stateSize": 3717, "stateCount": 3, "scanIntervalMode": "automatic", "labels": [ … ], "expireAt": "2025-01-24T11:44:52.563Z", "createdAt": "2025-01-21T11:44:52.566Z", "scannedAt": "2025-01-21T12:44:52.566Z" } }
https://urlscan.io/api/v1/user/incidents/{incidentId}
curl -i -X GET \
'https://urlscan.io/api/v1/user/incidents/{incidentId}' \
-H 'api-key: YOUR_API_KEY_HERE'Incident body
{ "incident": { "_id": "{{incidentId}}", "scanInterval": 3600, "watchedAttributes": [ … ], "userAgents": [ … ], "userAgentsPerInterval": 1, "countries": [ … ], "countriesPerInterval": 2, "stopDelaySuspended": 3600, "stopDelayInactive": 86400, "stopDelayMalicious": 90000, "scanIntervalAfterSuspended": 86400, "scanIntervalAfterMalicious": 86400, "owner": "own", "type": "hostname", "observable": "foobar.com", "state": "active", "visibility": "private", "channels": [ … ], "sourceType": "manual", "sourceId": "{{sourceId}}", "stateSize": 3717, "stateCount": 3, "scanIntervalMode": "automatic", "labels": [ … ], "expireAt": "2025-01-24T11:44:52.563Z", "createdAt": "2025-01-21T11:44:52.566Z", "scannedAt": "2025-01-21T12:44:52.566Z" } }
Channels subscribed to this incident.
Interval (seconds) between triggering full website scans.
If this is set to manual then scanIntervalAfterSuspended and scanIntervalAfterMalicious will not have an effect.
Determine which items will be monitored for.
Browser User-Agents to use during scanning
List of countries to scan from as ISO-3166-1 country codes.
When to automatically close the incident after the observable was suspended.
When to automatically close the incident after the observable became inactive.
When to automatically close the incident after the observable became malicious.
How to change the scan interval after the observable was suspended.
How to change the scan interval after the observable became malicious.
https://urlscan.io/api/v1/user/incidents/{incidentId}
curl -i -X PUT \
'https://urlscan.io/api/v1/user/incidents/{incidentId}' \
-H 'Content-Type: application/json' \
-H 'api-key: YOUR_API_KEY_HERE' \
-d '{
"incident": {
"scanInterval": 3600,
"watchedAttributes": [
"detections",
"tls"
],
"userAgents": [
"Chrome on Linux",
"Chrome on macOS"
],
"userAgentsPerInterval": 1,
"countries": [
"de",
"us"
],
"countriesPerInterval": 2,
"stopDelaySuspended": 3600,
"stopDelayInactive": 86400,
"stopDelayMalicious": 90000,
"scanIntervalAfterSuspended": 86400,
"scanIntervalAfterMalicious": 86400,
"observable": "foobar.com",
"visibility": "private",
"channels": [
"{{channelId}}"
],
"scanIntervalMode": "automatic",
"expireAfter": 86400
}
}'Incident body
{ "incident": { "_id": "{{incidentId}}", "scanInterval": 3600, "watchedAttributes": [ … ], "userAgents": [ … ], "userAgentsPerInterval": 1, "countries": [ … ], "countriesPerInterval": 2, "stopDelaySuspended": 3600, "stopDelayInactive": 86400, "stopDelayMalicious": 90000, "scanIntervalAfterSuspended": 86400, "scanIntervalAfterMalicious": 86400, "owner": "own", "type": "hostname", "observable": "foobar.com", "state": "active", "visibility": "private", "channels": [ … ], "sourceType": "manual", "sourceId": "{{sourceId}}", "stateSize": 3717, "stateCount": 3, "scanIntervalMode": "automatic", "labels": [ … ], "expireAt": "2025-01-24T11:44:52.563Z", "createdAt": "2025-01-21T11:44:52.566Z", "scannedAt": "2025-01-21T12:44:52.566Z" } }
https://urlscan.io/api/v1/user/incidents/{incidentId}/copy
curl -i -X POST \
'https://urlscan.io/api/v1/user/incidents/{incidentId}/copy' \
-H 'Content-Type: application/json' \
-H 'api-key: YOUR_API_KEY_HERE'Incident body
{ "incident": { "_id": "{{incidentId}}", "scanInterval": 3600, "watchedAttributes": [ … ], "userAgents": [ … ], "userAgentsPerInterval": 1, "countries": [ … ], "countriesPerInterval": 2, "stopDelaySuspended": 3600, "stopDelayInactive": 86400, "stopDelayMalicious": 90000, "scanIntervalAfterSuspended": 86400, "scanIntervalAfterMalicious": 86400, "owner": "own", "type": "hostname", "observable": "foobar.com", "state": "active", "visibility": "private", "channels": [ … ], "sourceType": "manual", "sourceId": "{{sourceId}}", "stateSize": 3717, "stateCount": 3, "scanIntervalMode": "automatic", "labels": [ … ], "expireAt": "2025-01-24T11:44:52.563Z", "createdAt": "2025-01-21T11:44:52.566Z", "scannedAt": "2025-01-21T12:44:52.566Z" } }
https://urlscan.io/api/v1/user/incidents/{incidentId}/fork
curl -i -X POST \
'https://urlscan.io/api/v1/user/incidents/{incidentId}/fork' \
-H 'Content-Type: application/json' \
-H 'api-key: YOUR_API_KEY_HERE'Incident body
{ "incident": { "_id": "{{incidentId}}", "scanInterval": 3600, "watchedAttributes": [ … ], "userAgents": [ … ], "userAgentsPerInterval": 1, "countries": [ … ], "countriesPerInterval": 2, "stopDelaySuspended": 3600, "stopDelayInactive": 86400, "stopDelayMalicious": 90000, "scanIntervalAfterSuspended": 86400, "scanIntervalAfterMalicious": 86400, "owner": "own", "type": "hostname", "observable": "foobar.com", "state": "active", "visibility": "private", "channels": [ … ], "sourceType": "manual", "sourceId": "{{sourceId}}", "stateSize": 3717, "stateCount": 3, "scanIntervalMode": "automatic", "labels": [ … ], "expireAt": "2025-01-24T11:44:52.563Z", "createdAt": "2025-01-21T11:44:52.566Z", "scannedAt": "2025-01-21T12:44:52.566Z" } }
https://urlscan.io/api/v1/user/watchableAttributes
curl -i -X GET \
https://urlscan.io/api/v1/user/watchableAttributes \
-H 'api-key: YOUR_API_KEY_HERE'https://urlscan.io/api/v1/user/incidentstates/{incidentId}/
curl -i -X GET \
'https://urlscan.io/api/v1/user/incidentstates/{incidentId}/' \
-H 'api-key: YOUR_API_KEY_HERE'{ "incidentstates": [ { … } ] }