Zenrows
Talk to sales Start free

Fetch

Fetch clean web data 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.

Formerly Universal Scraper API, now Fetch.

Any site. Every protection handled.

Whatever the site throws at you, Fetch handles it automatically. Bot checks, dynamic rendering, geo-blocks. No configuration needed.

$ 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. Returning page content 0.3s

One URL.

Five output formats.

01 / Five

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 / Five

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 / Five

JSON

{
  "title": "Apple iPhone 15 128GB",
  "price": "$799.00",
  "rating": "4.7",
  "availability": "In stock"
}

When you need fields without a schema. Extract's autoparse mode adapts to any site's layout.

04 / Five

Screenshot

When you need to see, not just read.

05 / Five

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.

On a supported site? Get it pre-mapped, no selectors to write. See Extract

Same call.

Built for blocked pages.

01 / 03

Protected Web Access

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

02 / 03

Protected Network

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

03 / 03

Browser Sessions

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

Same call.

Wherever
you scrape.

10,000+ sites that break other scrapers. The same call gets through, via Zenrows.

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.

API for your code. MCP for Cursor or Claude. Webhooks for n8n, Zapier, or Make.

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}}
Retool
Resource → REST API
  Base URL: api.zenrows.com/v1/
  Method: GET
  URL params:
    apikey: {{ zenrows_key }}
    url: {{ urlInput.value }}
MuleSoft
HTTP Connector → Request
  Method: GET
  Host: api.zenrows.com
  Path: /v1/
  Query: apikey, url

You've seen it.

Make the call.

Free, always. 5,000 credits every month.
Plug it into your codebase. The API handles the rest.