When the scrape comes back 403, send it here.
POST the URL to /unblocker. Spider climbs an escalation ladder of geo proxies, real browser fingerprints, and challenge solving until the page returns. The unblock fee is 10 to 40 credits over base, charged only when it succeeds.
What happens after you hit send.
Four rungs, tried in order. Each one runs only when the response to the one before it was still a block. Escalation is also why the fee is a range and not a number.
A clean exit through a geo-targeted proxy
The request leaves from a residential or ISP address in the country you set with country_code, with coherent headers and TLS.
Escalates on a 403, a 429, or a block page where the content should be.
A real browser with a fingerprint that holds up
A full browser session whose WebGL, fonts, screen dimensions, and hardware profile agree with each other, running the site's JS detection the way a real machine would.
Escalates when a challenge or interstitial is served instead of the page.
Challenge solving
Detects and solves CAPTCHAs, puzzles, and interstitials, Cloudflare Turnstile included.
Escalates if the content still refuses to render after the challenge clears.
A different identity entirely
Retries with a fresh fingerprint, a different proxy path, and different timing patterns.
The page renders and the content is extracted, or the attempt is spent.
The further down the ladder the request had to go, the higher in that range it lands.
The fee is charged per success, never per attempt. A page that never comes back does not bill the premium.
Every rung is infrastructure you would otherwise run yourself: proxy pools, a browser fleet with fingerprints that hold up, challenge solvers, retry orchestration. Here the whole ladder is one POST.
Most requests do not need this.
The default is /scrape. Smart mode already clears common Cloudflare and CDN protection at base cost. Match the failure you are actually seeing before paying for the ladder.
The page needs JS rendering, not an unblock. Smart mode does that at base cost.
Rate limiting. Set proxy_enabled and spread the traffic across exits.
The site is fingerprinting clients and rejecting yours. This is the ladder's job.
Needs a real browser session and challenge solving.
The request body is the same on every endpoint. Moving from /scrape to /unblocker is a one-word change to the path, so trying the cheap route first costs you nothing to undo.
Your first unblock.
Same parameters as crawl and scrape, same response shape, costs itemized per page. Expect it to take longer than a plain scrape when the ladder has to climb.
from spider import Spider
client = Spider()
# The URL your scraper cannot reach
result = client.unblocker(
"https://protected-site.com/pricing",
params={
"return_format": "markdown",
"proxy_enabled": True,
"country_code": "us",
"session": True,
},
)
print(result[0]["content"])[
{
"url": "https://protected-site.com/pricing",
"status": 200,
"content": "# Pricing\n\n| Plan | Monthly | ...",
"error": null,
"costs": {
"total_cost": 0.0010292944
// itemized compute, file, and transfer costs per page
}
}
]The dials you keep
sessionKeep the browser session across requests. Once a site is unblocked, follow-up requests reuse that state instead of climbing the ladder again. This is what makes repeat pulls fast.
fingerprintStart with the full browser fingerprint on the first attempt instead of waiting for escalation.
proxy_enabledRoute through residential or ISP proxies. Pair with country_code so requests exit from the right country.
return_formatMarkdown for LLM pipelines, or raw HTML when you want the page untouched.
evaluate_on_new_documentRun your own JavaScript on the unblocked page. Expand content or trigger actions before extraction.
More from the API.
Send it the page that is beating you.
Escalation, challenge solving, and retries in one POST. 10 to 40 credits over base, charged only when the content comes back.