URLScan.io API

Anti-malware / API Key Intermediate HTTPS
30 per window
59 C
Measured Score 0 50 100 Speed 4/30 Consistency 20/20 Security 20/20 Browser access 0/15 Transparency 15/15 TESTED 2026-08-10

Overview

URLScan.io scans and screenshots any URL in a sandboxed browser, then returns a detailed report covering the page content, network requests, linked domains, technologies detected, and threat indicators. It is particularly useful for safely investigating suspicious links without visiting them yourself. Beginners can use it to build phishing investigation tools or link preview features.

Beginner Tip

Register at urlscan.io for a free API key. Scanning is asynchronous — first POST to /scan to submit, then poll GET /result/{uuid}/ until the scan is complete (usually 10-30 seconds).

Measurement Record

What actually happened when we called this API from our own infrastructure. Every value below was recorded by the request, not copied from the provider's documentation.

Request
GET https://urlscan.io/api/v1/search/?q=domain:urlscan.io
Result
HTTP 200 · application/json · 175,111 bytes · compressed
Response time
617 ms (median of 3) · fastest 598 ms
Transport
TLSv1.3 · TLS_AES_256_GCM_SHA384 · certificate issued by Let's Encrypt
Browser CORS
No Access-Control-Allow-Origin header — call it from a server, not the browser
Rate limit
30 per window
Served by
nginx
Recorded
2026-08-10

Fields Returned

Top-level fields present in the response we captured, with the type and value we actually received.

Field Type Value received
results array [1 item]
total integer 10000
took integer 583
has_more boolean true

Captured Response

Captured from a real request to https://urlscan.io/api/v1/search/?q=domain:urlscan.io on 2026-08-10. Long arrays and nested objects are truncated to keep the shape readable.

JSON Response · Captured
{
  "results": [
    {
      "submitter": {},
      "canonical": {
        "…": "(2 more fields)"
      },
      "task": {
        "…": "(7 more fields)"
      },
      "stats": {
        "…": "(5 more fields)"
      },
      "page": {
        "…": "(20 more fields)"
      },
      "_id": "019fec4c-012b-71e9-a10d-3d839356646a",
      "_score": null,
      "sort": [
        1786375838304
      ],
      "result": "https://urlscan.io/api/v1/result/019fec4c-012b-71e9-a10d-3d839356646a/",
      "screenshot": "https://urlscan.io/screenshots/019fec4c-012b-71e9-a10d-3d839356646a.png"
    }
  ],
  "total": 10000,
  "took": 583,
  "has_more": true
}

Field Reference

result URL where the full scan report will be available once processing is complete

Implementation Example

Calls a real endpoint of this API. Replace any placeholder credentials with your own key.

Request
const url = "https://urlscan.io/about-api/";
// Replace headers or query params with the values required by this API.
const response = await fetch(url, {
  headers: {
  "X-API-Key": "YOUR_API_KEY"
  }
});
if (!response.ok) throw new Error(`Request failed: ${response.status}`);
const data = await response.json();
console.log(data);

What Can You Build?

Note: These code examples are AI-generated and unverified. Always refer to the official API documentation for accurate usage.

How This API Fails

We deliberately sent this API a broken request and recorded exactly what came back on 2026-08-10. Knowing the shape of an error before you hit it makes error handling much easier to write.

HTTP 404 Requesting a path that does not exist application/json
{
  "message": "Not Found",
  "description": "We could not find this page",
  "status": 404,
  "errors": [
    {
      "title": "Not Found",
      "detail": "We could not find this page",
      "status": 404
    }
  ]
}
HTTP 400 Sending an invalid value for "q" application/json
{
  "message": "ElasticSearch search error, make sure your query is syntactically correct",
  "status": 400,
  "errors": [
    {
      "title": "ElasticSearch search error, make sure your query is syntactically correct",
      "detail": "ElasticSearch search error, make sure your query is syntactically correct",
      "status": 400
    }
  ]
}

Common Errors & Troubleshooting

Generated guidance based on this API's documentation, not observed by us. Treat it as a starting point and check against the provider's own error reference.

400 Bad Request on scan submission The url field is missing from the POST body or is not a valid URL
Send a JSON body with at least {"url": "https://example.com", "visibility": "public"} and set Content-Type: application/json
404 on result fetch Polling for results too quickly before the scan has finished processing
Wait at least 10 seconds after submitting before fetching results; implement a polling loop with a delay
429 Too Many Requests Free tier is limited to 100 scans per day
Cache scan results by URL and avoid rescanning recently checked URLs; upgrade to a paid plan for higher limits

Measured Score Breakdown

Live HTTP request to the API endpoint

Speed 4/30
Consistency 20/20
Security 20/20
Browser access 0/15
Transparency 15/15
Endpoint Response Time 617ms

Fully tested on Aug 10, 2026

Technical Specifications

Auth API Key
HTTPS REQUIRED
CORS UNKNOWN
Category Anti-malware
Difficulty Intermediate
Endpoint last called: 2026-08-10

Related Tags

Similar APIs

View All →