Zenrows
Talk to sales Start building free

Fetch · Generally Available

Fetch clean web context from any page.

Get any website's data in the shape your team needs.

Retrieve HTML, Markdown, JSON, screenshots, and metadata from static, dynamic, and protected websites through one production API.

Every protection. One call.

What every site throws at you. Absorbed by the same endpoint.

$ curl -G "https://api.zenrows.com/v1/" \
    -d "apikey=ZR_••••••••" \
    -d "url=https://www.walmart.com/ip/123"
  1. Cloudflare
  2. DataDome
  3. PerimeterX
  4. Akamai
  5. Dynamic Page Support
  6. Protected Network
  7. Sessions
  8. Auto-parsing
  1. Connecting to Protected Network 0.4s
  2. Resolving target URL 0.2s
  3. Protected Web Access 1.4s
  4. Dynamic Page Support 0.9s
  5. Extracting structured content 0.3s

One URL.

Four outputs.

01 / Four

HTML

<article class="product">
  <h1>Apple iPhone 15 128GB</h1>
  <span class="price">$799.00</span>
  <div class="rating">4.7</div>
</article>

When you need every link, every tag, every attribute.

02 / Four

Markdown

# Apple iPhone 15 128GB

**Price:** $799.00
**Rating:** 4.7 / 5
**In stock:** yes

[Buy now](/cart/add/iphone-15)

When the LLM is the reader. Less noise, more signal.

03 / Four

Screenshot

When you need to see, not just read.

04 / Four

Plain text

Apple iPhone 15 128GB
Price: $799.00
Rating: 4.7 / 5
In stock: yes
Buy now: /cart/add/iphone-15

When tokens are expensive.

Need typed JSON, autoparse, or schemas that hold across runs? See Extract

Same call.

Three switches.

01 / Three

Protected Web Access

Retrieve AI-ready data from sites that block normal crawlers, fetch APIs, and browser agents.

02 / Three

Protected Network

Automatically routes requests through the right network and browser strategy for the target.

03 / Three

Browser Sessions

Run persistent browser workflows for pages that require interaction, sessions, or debugging.

Same call.

Wherever
you scrape.

100+ sites that break other scrapers. The same call gets through.

01 E-commerce 8 sites
  • WalmartAkamai
  • AmazonPerimeterX
  • eBayAkamai
  • EtsyCloudflare
  • TargetDataDome
  • Best BuyAkamai
  • WayfairCloudflare
  • NeweggCloudflare
02 Real estate 6 sites
  • ZillowPerimeterX
  • RealtorCloudflare
  • RedfinCloudflare
  • TruliaPerimeterX
  • IdealistaDataDome
  • RightmoveDataDome
03 Travel 6 sites
  • BookingDataDome
  • AirbnbPerimeterX
  • ExpediaAkamai
  • KayakAkamai
  • TripAdvisorCloudflare
  • Hotels.comAkamai
04 Jobs & social 6 sites
  • LinkedInAnti-scrape
  • IndeedCloudflare
  • GlassdoorCloudflare
  • RedditCloudflare
  • XAnti-scrape
  • DiscordCloudflare
05 SaaS & data 5 sites
  • GitHubAnti-scrape
  • CrunchbaseCloudflare
  • G2Cloudflare
  • ShopifyAkamai
  • MediumCloudflare

Same call.

Reachable from anywhere.

HTTP from your code. MCP from your AI editor. Webhook from any no-code tool. One endpoint, three doorways.

Python
import requests

r = requests.get(
  "api.zenrows.com/v1/",
  params={"apikey": KEY, "url": URL},
)
Node.js
const r = await fetch(
  `https://api.zenrows.com/v1/` +
  `?apikey=${KEY}&url=${URL}`
);
Ruby
require "net/http"

uri = URI("api.zenrows.com/v1/")
uri.query = "apikey=#{KEY}&url=#{URL}"
Net::HTTP.get(uri)
PHP
$res = file_get_contents(
  "api.zenrows.com/v1/" .
  "?apikey=$KEY&url=$URL"
);
Go
resp, _ := http.Get(
  "api.zenrows.com/v1/" +
  "?apikey=" + KEY +
  "&url=" + url.QueryEscape(URL),
)
Java
HttpRequest req = HttpRequest
  .newBuilder(URI.create(
    "api.zenrows.com/v1/?…"
  )).build();
client.send(req, ofString());
C#
var resp = await client.GetAsync(
  "api.zenrows.com/v1/" +
  $"?apikey={KEY}&url={URL}"
);
cURL
curl -G "api.zenrows.com/v1/" \
  -d "apikey=$KEY" \
  -d "url=$URL"
Claude Desktop
{
  "mcpServers": {
    "zenrows": {
      "command": "npx",
      "args": ["-y", "@zenrows/mcp"]
    }
  }
}
Claude Code
claude mcp add zenrows \
  -e ZENROWS_API_KEY=$KEY \
  -- npx -y @zenrows/mcp
Cursor
// .cursor/mcp.json
{
  "zenrows": {
    "command": "npx",
    "args": ["-y", "@zenrows/mcp"]
  }
}
Windsurf
{
  "mcpServers": {
    "zenrows": {
      "command": "npx -y @zenrows/mcp"
    }
  }
}
VS Code
// .vscode/mcp.json
{
  "servers": {
    "zenrows": {
      "command": "npx",
      "args": ["-y", "@zenrows/mcp"]
    }
  }
}
Zed
// settings.json
"context_servers": {
  "zenrows": {
    "command": { "path": "npx",
      "args": ["-y", "@zenrows/mcp"]}
  }
}
JetBrains
Settings → Tools → MCP
Add server:
  Command: npx -y @zenrows/mcp
  Env: ZENROWS_API_KEY=$KEY
Continue.dev
# config.yaml
mcpServers:
  - name: zenrows
    command: npx
    args: ["-y", "@zenrows/mcp"]
Zapier
Trigger → Webhooks by Zapier
Action  → Custom Request
  Method: GET
  URL: api.zenrows.com/v1/
  Query: apikey=$KEY, url=$URL
Make
HTTP module → Make a request
  URL: api.zenrows.com/v1/
  Query string: apikey, url
  Method: GET
n8n
HTTP Request node
  Method: GET
  URL: api.zenrows.com/v1/
  Query Parameters:
    apikey, url
Clay
Column → HTTP API
  Endpoint: api.zenrows.com/v1/
  ?apikey=$KEY
  &url={{ row.url }}
Pipedream
Step → Send HTTP request
  URL: api.zenrows.com/v1/
  Query: apikey, url
  Method: GET
Node-RED
http request node
  Method: GET
  URL: api.zenrows.com/v1/?apikey=$KEY&url={{url}}
LangChain
from langchain_community.tools \
  import RequestsGetTool

tool.run({
  "url": "api.zenrows.com/v1/" +
         f"?apikey={KEY}&url={URL}"
})
MuleSoft
HTTP Connector → Request
  Method: GET
  Host: api.zenrows.com
  Path: /v1/
  Query: apikey, url

You've seen it.

Make the call.

10,000 credits/month for free, always.
Plug it into your language. The API handles the rest.