curl -sS -X POST "https://api.adscrawl.net/html" \
-H "content-type: application/json" \
-H "x-api-key: YOUR_API_KEY" \
-d '{
"url": "https://example.com/article",
"contentMode": "json",
"waitUntil": "domcontentloaded",
"viewport": { "width": 1280, "height": 720 },
"locale": "en-US",
"countryCode": "GLOBAL",
"userAgentMode": "random",
"userAgentOs": "windows"
}'
const response = await fetch("https://api.adscrawl.net/html", {
method: "POST",
headers: {
"content-type": "application/json",
"x-api-key": "YOUR_API_KEY",
},
body: JSON.stringify({
url: "https://example.com/article",
contentMode: "json",
waitUntil: "domcontentloaded",
viewport: { width: 1280, height: 720 },
locale: "en-US",
countryCode: "GLOBAL",
userAgentMode: "random",
userAgentOs: "windows",
}),
});
if (!response.ok) {
const err = await response.json();
throw new Error(`${response.status} ${err.code}: ${err.error}`);
}
const article = await response.json();
console.log(article.title, article.byline);
import httpx, json
response = httpx.post(
"https://api.adscrawl.net/html",
headers={
"content-type": "application/json",
"x-api-key": "YOUR_API_KEY",
},
json={
"url": "https://example.com/article",
"contentMode": "json",
"waitUntil": "domcontentloaded",
"viewport": {"width": 1280, "height": 720},
"locale": "en-US",
"countryCode": "GLOBAL",
"userAgentMode": "random",
"userAgentOs": "windows",
},
)
response.raise_for_status()
article = response.json()
print(article["title"], article["byline"])
{
"title": "Example Article",
"byline": "OpenAI",
"excerpt": "A concise article summary.",
"siteName": "Example",
"lang": "en",
"dir": null,
"content": "<div><p>Readable body...</p></div>",
"textContent": "Readable body...",
"length": 2487,
"publishedTime": null
}
# Example Article
Readable body...
- key point one
- key point two
{
"error": "Insufficient credits",
"code": "INSUFFICIENT_CREDITS",
"balance": 0,
"requiredCredits": 1
}
{
"error": "Readable article content was not found",
"code": "READABILITY_CONTENT_NOT_FOUND"
}
{
"error": "countryCode is not supported",
"code": "INVALID_COUNTRY_CODE"
}
{
"error": "Dynamic country/region routing is unavailable",
"code": "DYNAMIC_PROXY_NOT_CONFIGURED"
}
Browser Tasks
Render HTML, Markdown, or Article JSON
Fetch a fully rendered page in raw HTML, readable Markdown, or structured article JSON, routed through residential proxies.
POST
/
html
curl -sS -X POST "https://api.adscrawl.net/html" \
-H "content-type: application/json" \
-H "x-api-key: YOUR_API_KEY" \
-d '{
"url": "https://example.com/article",
"contentMode": "json",
"waitUntil": "domcontentloaded",
"viewport": { "width": 1280, "height": 720 },
"locale": "en-US",
"countryCode": "GLOBAL",
"userAgentMode": "random",
"userAgentOs": "windows"
}'
const response = await fetch("https://api.adscrawl.net/html", {
method: "POST",
headers: {
"content-type": "application/json",
"x-api-key": "YOUR_API_KEY",
},
body: JSON.stringify({
url: "https://example.com/article",
contentMode: "json",
waitUntil: "domcontentloaded",
viewport: { width: 1280, height: 720 },
locale: "en-US",
countryCode: "GLOBAL",
userAgentMode: "random",
userAgentOs: "windows",
}),
});
if (!response.ok) {
const err = await response.json();
throw new Error(`${response.status} ${err.code}: ${err.error}`);
}
const article = await response.json();
console.log(article.title, article.byline);
import httpx, json
response = httpx.post(
"https://api.adscrawl.net/html",
headers={
"content-type": "application/json",
"x-api-key": "YOUR_API_KEY",
},
json={
"url": "https://example.com/article",
"contentMode": "json",
"waitUntil": "domcontentloaded",
"viewport": {"width": 1280, "height": 720},
"locale": "en-US",
"countryCode": "GLOBAL",
"userAgentMode": "random",
"userAgentOs": "windows",
},
)
response.raise_for_status()
article = response.json()
print(article["title"], article["byline"])
{
"title": "Example Article",
"byline": "OpenAI",
"excerpt": "A concise article summary.",
"siteName": "Example",
"lang": "en",
"dir": null,
"content": "<div><p>Readable body...</p></div>",
"textContent": "Readable body...",
"length": 2487,
"publishedTime": null
}
# Example Article
Readable body...
- key point one
- key point two
{
"error": "Insufficient credits",
"code": "INSUFFICIENT_CREDITS",
"balance": 0,
"requiredCredits": 1
}
{
"error": "Readable article content was not found",
"code": "READABILITY_CONTENT_NOT_FOUND"
}
{
"error": "countryCode is not supported",
"code": "INVALID_COUNTRY_CODE"
}
{
"error": "Dynamic country/region routing is unavailable",
"code": "DYNAMIC_PROXY_NOT_CONFIGURED"
}
Use
POST /html to load any public URL in a real browser and retrieve the rendered output in the format your application needs. Choose "html" to get the full DOM, "markdown" to get a clean readable article, or "json" to get a structured Readability payload with title, author, excerpt, and body content. The request is routed through residential proxies with randomized browser fingerprints.
string
required
Target page URL. Only ports 80 and 443 are supported.
string
Controls the response format. Accepted values:
"html" (default), "markdown", "json". Both "markdown" and "json" extract readable article content using Readability.string
Wait for the first matching CSS element before extracting. When
contentMode is "html", only that element’s HTML is returned. When "markdown" or "json", Readability runs against that element. Returns 422 CONTENT_SELECTOR_NOT_FOUND if the selector is not found.string
Navigation event to wait for before extracting content. Defaults to
"load".| Value | Behaviour |
|---|---|
"domcontentloaded" | Waits for DOMContentLoaded. HTML is parsed without waiting for secondary resources such as images. Recommended for HTML extraction. |
"load" | Waits for window.load after the page and dependent resources (images, stylesheets) finish loading. |
"networkidle" | Waits until there are no network connections for at least 500 ms. Long polling, analytics, or lazy-loaded resources may cause a timeout. |
number
Maximum time to wait for the task to complete, in milliseconds. Must be a positive integer no greater than
3,600,000. Values outside this range fall back to the server default.object
string
Browser locale, for example
"en-US" or "zh-CN". Affects navigator.language and Accept-Language headers.string
IANA timezone identifier, for example
"Asia/Shanghai" or "America/New_York".object
object
Custom proxy configuration. Cannot be combined with
countryCode. Provide either server or the split form (protocol + host + port). Credentials must not be embedded in server.Show proxy fields
Show proxy fields
string
Full proxy URL such as
http://host:port or socks5://host:port. Cannot be combined with host.string
"http" or "socks5". Used in the split form.string
Proxy host. Used in the split form.
number | string
Port from 1 to 65535.
string
Proxy username. Must be supplied together with
password.string
Proxy password. Must be supplied together with
username.string
Managed residential proxy region. Cannot be combined with
proxy."GLOBAL": dynamic exit from 15 popular regions.- Two-letter country code (e.g.
"US","DE"): prefers a trusted proxy for that region with dynamic fallback. - Omitted: a random trusted proxy is selected automatically.
string
"random" lets the server pick a User-Agent from its library. Requests without an explicit userAgent already default to "random".string
Operating system used when
userAgentMode is "random". Accepted values: "windows" (default) or "macos".string
Explicit User-Agent string. Overrides the random selection.
object
Browser fingerprint settings. When omitted, every signal defaults to random while keeping OS, GPU, CPU, memory, fonts, and device signals coherent.
Show fingerprint fields
Show fingerprint fields
string
"forward" uses the proxy exit address. "real" or "disabled" also accepted.string
"random" or "real". Controls WebGL vendor and renderer metadata.string
"random", "real", or "disabled". Random mode follows the WebGL GPU setting.string
"random" or "real". Controls WebGL image noise.string
"random" or "real". Controls canvas noise.string
"random" or "real". Controls audio fingerprint noise.string
"random" or "real". Controls layout measurement noise.string
"random" or "real". Returns an OS-matched speech voice list.string
"random" or "real". Returns an OS-matched font list.string
"random" or "real". Generates a coherent CPU thread count and memory pair.string
"random", "enabled", or "disabled".array
Cookie list injected into the browser context before navigation. Each cookie object requires
name, value, and domain.Show cookie fields
Show cookie fields
string
required
Cookie name.
string
required
Cookie value.
string
required
Target domain such as
.example.com.string
Cookie path. Defaults to
/.boolean
Whether the cookie is sent only over HTTPS.
boolean
Whether the cookie is inaccessible to client-side JavaScript.
string
SameSite attribute.
boolean
Set
true for a session cookie.number
Unix expiry timestamp in seconds. Also accepted as
expires or expiry.Response
string
Article title extracted from the page.
string
Author name or byline, if present.
string
A short summary or description of the article.
string
Name of the site, if available.
string
Language code of the article, e.g.
"en".string
Text direction, e.g.
"ltr" or "rtl". null if not detected.string
Cleaned HTML of the article body.
string
Plain-text version of the article body with whitespace normalised.
number
Character count of
textContent.string
ISO 8601 publication timestamp, or
null if not found.| Code | Meaning |
|---|---|
200 | Success. Returns text/html, text/markdown, or application/json depending on contentMode. |
400 | Invalid JSON, URL, contentMode, cookies, proxy, region, or User-Agent. Body over 1 MiB. |
401 | Missing or invalid x-api-key. |
402 | Insufficient balance. Returns INSUFFICIENT_CREDITS, balance, and requiredCredits. |
422 | Selector not found (CONTENT_SELECTOR_NOT_FOUND) or readability missing (READABILITY_CONTENT_NOT_FOUND). |
429 | Task rate limited. |
502 | Proxy unreachable or target HTTP failure. |
503 | Queue, Worker, managed proxy, or User-Agent resources unavailable. |
504 | Task, navigation, or proxy connection timed out. |
500 | Unclassified task execution failure. |
One credit is consumed after request validation but before the task is enqueued. Request bodies are limited to 1 MiB.
More examples
curl -sS -X POST "https://api.adscrawl.net/html" \
-H "content-type: application/json" \
-H "x-api-key: YOUR_API_KEY" \
-d '{
"url": "https://example.com",
"contentMode": "html",
"selector": "main",
"waitUntil": "domcontentloaded",
"countryCode": "US"
}'
const response = await fetch("https://api.adscrawl.net/html", {
method: "POST",
headers: {
"content-type": "application/json",
"x-api-key": "YOUR_API_KEY",
},
body: JSON.stringify({
url: "https://example.com",
contentMode: "html",
selector: "main",
waitUntil: "domcontentloaded",
countryCode: "US",
}),
});
const html = await response.text();
console.log(html);
import httpx
response = httpx.post(
"https://api.adscrawl.net/html",
headers={
"content-type": "application/json",
"x-api-key": "YOUR_API_KEY",
},
json={
"url": "https://example.com",
"contentMode": "html",
"selector": "main",
"waitUntil": "domcontentloaded",
"countryCode": "US",
},
)
response.raise_for_status()
print(response.text)
curl -sS -X POST "https://api.adscrawl.net/html" \
-H "content-type: application/json" \
-H "x-api-key: YOUR_API_KEY" \
-d '{
"url": "https://example.com/article",
"contentMode": "json",
"waitUntil": "domcontentloaded",
"viewport": { "width": 1280, "height": 720 },
"locale": "en-US",
"countryCode": "GLOBAL",
"userAgentMode": "random",
"userAgentOs": "windows"
}'
const response = await fetch("https://api.adscrawl.net/html", {
method: "POST",
headers: {
"content-type": "application/json",
"x-api-key": "YOUR_API_KEY",
},
body: JSON.stringify({
url: "https://example.com/article",
contentMode: "json",
waitUntil: "domcontentloaded",
viewport: { width: 1280, height: 720 },
locale: "en-US",
countryCode: "GLOBAL",
userAgentMode: "random",
userAgentOs: "windows",
}),
});
if (!response.ok) {
const err = await response.json();
throw new Error(`${response.status} ${err.code}: ${err.error}`);
}
const article = await response.json();
console.log(article.title, article.byline);
import httpx, json
response = httpx.post(
"https://api.adscrawl.net/html",
headers={
"content-type": "application/json",
"x-api-key": "YOUR_API_KEY",
},
json={
"url": "https://example.com/article",
"contentMode": "json",
"waitUntil": "domcontentloaded",
"viewport": {"width": 1280, "height": 720},
"locale": "en-US",
"countryCode": "GLOBAL",
"userAgentMode": "random",
"userAgentOs": "windows",
},
)
response.raise_for_status()
article = response.json()
print(article["title"], article["byline"])
{
"title": "Example Article",
"byline": "OpenAI",
"excerpt": "A concise article summary.",
"siteName": "Example",
"lang": "en",
"dir": null,
"content": "<div><p>Readable body...</p></div>",
"textContent": "Readable body...",
"length": 2487,
"publishedTime": null
}
# Example Article
Readable body...
- key point one
- key point two
{
"error": "Insufficient credits",
"code": "INSUFFICIENT_CREDITS",
"balance": 0,
"requiredCredits": 1
}
{
"error": "Readable article content was not found",
"code": "READABILITY_CONTENT_NOT_FOUND"
}
{
"error": "countryCode is not supported",
"code": "INVALID_COUNTRY_CODE"
}
{
"error": "Dynamic country/region routing is unavailable",
"code": "DYNAMIC_PROXY_NOT_CONFIGURED"
}