# Fetch

> One API call per URL.  Protected Web Access, Protected Network, Dynamic Page Support, Browser Sessions, all handled.  From your code to structured data in one request.

## Fetch clean web data from any page .

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

Formerly [Universal Scraper API](https://docs.zenrows.com/fetch/api-reference) , now Fetch.

## Any site. Every protection handled.

Run the command below with no account or key. Bot checks, dynamic rendering and geo-blocks are handled for you.

```
$ npx -y @zenrows/cli fetch \
    https://www.scrapingcourse.com/ecommerce/ \
    --output markdown
```

```
# Shop

Showing 1–16 of 188 results

- **Abominable Hoodie** $69.00
- **Adrienne Trek Jacket** $57.00
- **Aeon Capri** $48.00
- **Aero Daily Fitness Tee** $24.00
- **Aether Gym Pant** $74.00
…
```

- Cloudflare

- DataDome

- PerimeterX

- Akamai

- Dynamic Page Support

- Protected Network

- Sessions

- Auto-parsing

- Connecting to Protected Network 0.4s

- Resolving target URL 0.2s

- Protected Web Access 1.4s

- Dynamic Page Support 0.9s

- Returning page content 0.3s

## One command. Every option a flag.

Add a flag and the command and its cost change with it. With none, Fetch picks the cheapest setup that works.

- From the US --proxy-country us

- Same IP --session-id 42

- Screenshot --screenshot

- Render JavaScript --js-render

- Residential IP --premium-proxy

- 1 credit a request, 5 with JavaScript, 10 residential, 25 both.

- One URL per call. For many, [Batch](https://www.zenrows.com/products/batch)

- Logins and multi-step flows go to [Browser Sessions](https://www.zenrows.com/products/browser-sessions)

- Each request has 90 seconds to answer.

## Five output formats.

### 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.

### 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.

### 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.

### Screenshot

When you need to see, not just read.

### 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.

- HTML

- Markdown

- JSON

- Screenshot

- Plain text

On a supported site? Get it pre-mapped, no selectors to write. [See Extract](https://www.zenrows.com/products/extract)

## Built for blocked pages.

### Protected Web Access

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

### Protected Network

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

### Browser Sessions

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

## Wherever you scrape.

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

- E-commerce 8

- Real estate 6

- Travel 6

- Jobs & social 6

- SaaS & data 5

- Walmart Akamai

- Amazon PerimeterX

- eBay Akamai

- Etsy Cloudflare

- Target DataDome

- Best Buy Akamai

- Wayfair Cloudflare

- Newegg Cloudflare

- Zillow PerimeterX

- Realtor Cloudflare

- Redfin Cloudflare

- Trulia PerimeterX

- Idealista DataDome

- Rightmove DataDome

- Booking DataDome

- Airbnb PerimeterX

- Expedia Akamai

- Kayak Akamai

- TripAdvisor Cloudflare

- Hotels.com Akamai

- LinkedIn Anti-scrape

- Indeed Cloudflare

- Glassdoor Cloudflare

- Reddit Cloudflare

- X Anti-scrape

- Discord Cloudflare

- GitHub Anti-scrape

- Crunchbase Cloudflare

- G2 Cloudflare

- Shopify Akamai

- Medium Cloudflare

## Reachable from anywhere.

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

```
import requests

r = requests.get(
  "api.zenrows.com/v1/",
  params={"apikey": KEY, "url": URL},
)
```

```
const r = await fetch(
  `https://api.zenrows.com/v1/` +
  `?apikey=${KEY}&url=${URL}`
);
```

```
require "net/http"

uri = URI("api.zenrows.com/v1/")
uri.query = "apikey=#{KEY}&url=#{URL}"
Net::HTTP.get(uri)
```

```
$res = file_get_contents(
  "api.zenrows.com/v1/" .
  "?apikey=$KEY&url=$URL"
);
```

```
resp, _ := http.Get(
  "api.zenrows.com/v1/" +
  "?apikey=" + KEY +
  "&url=" + url.QueryEscape(URL),
)
```

```
HttpRequest req = HttpRequest
  .newBuilder(URI.create(
    "api.zenrows.com/v1/?…"
  )).build();
client.send(req, ofString());
```

```
var resp = await client.GetAsync(
  "api.zenrows.com/v1/" +
  $"?apikey={KEY}&url={URL}"
);
```

```
curl -G "api.zenrows.com/v1/" \
  -d "apikey=$KEY" \
  -d "url=$URL"
```

```
{
  "mcpServers": {
    "zenrows": {
      "command": "npx",
      "args": ["-y", "@zenrows/mcp"]
    }
  }
}
```

```
claude mcp add zenrows \
  -e ZENROWS_API_KEY=$KEY \
  -- npx -y @zenrows/mcp
```

```
// .cursor/mcp.json
{
  "zenrows": {
    "command": "npx",
    "args": ["-y", "@zenrows/mcp"]
  }
}
```

```
{
  "mcpServers": {
    "zenrows": {
      "command": "npx -y @zenrows/mcp"
    }
  }
}
```

```
// .vscode/mcp.json
{
  "servers": {
    "zenrows": {
      "command": "npx",
      "args": ["-y", "@zenrows/mcp"]
    }
  }
}
```

```
// settings.json
"context_servers": {
  "zenrows": {
    "command": { "path": "npx",
      "args": ["-y", "@zenrows/mcp"]}
  }
}
```

```
Settings → Tools → MCP
Add server:
  Command: npx -y @zenrows/mcp
  Env: ZENROWS_API_KEY=$KEY
```

```
# config.yaml
mcpServers:
  - name: zenrows
    command: npx
    args: ["-y", "@zenrows/mcp"]
```

```
Trigger → Webhooks by Zapier
Action  → Custom Request
  Method: GET
  URL: api.zenrows.com/v1/
  Query: apikey=$KEY, url=$URL
```

```
HTTP module → Make a request
  URL: api.zenrows.com/v1/
  Query string: apikey, url
  Method: GET
```

```
HTTP Request node
  Method: GET
  URL: api.zenrows.com/v1/
  Query Parameters:
    apikey, url
```

```
Column → HTTP API
  Endpoint: api.zenrows.com/v1/
  ?apikey=$KEY
  &url={{ row.url }}
```

```
Step → Send HTTP request
  URL: api.zenrows.com/v1/
  Query: apikey, url
  Method: GET
```

```
http request node
  Method: GET
  URL: api.zenrows.com/v1/?apikey=$KEY&url={{url}}
```

```
Resource → REST API
  Base URL: api.zenrows.com/v1/
  Method: GET
  URL params:
    apikey: {{ zenrows_key }}
    url: {{ urlInput.value }}
```

```
HTTP Connector → Request
  Method: GET
  Host: api.zenrows.com
  Path: /v1/
  Query: apikey, url
```

## Make the call.

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

_Canonical HTML: https://www.zenrows.com/products/fetch_

## Site Navigation

### Global Hub
- [Home](https://www.zenrows.com/index.md)
- [Pricing](https://www.zenrows.com/pricing.md)
- [Products](https://www.zenrows.com/products.md)
- [Agent Toolkit](https://www.zenrows.com/agents.md)
- [Compare](https://www.zenrows.com/compare.md)
- [Alternatives](https://www.zenrows.com/alternatives.md)
- [Blog](https://www.zenrows.com/blog)
- [Docs](https://docs.zenrows.com)
- [llms.txt](https://www.zenrows.com/llms.txt)
- [Agent skill](https://www.zenrows.com/SKILL.md)

### On This Topic
- [Products overview](https://www.zenrows.com/products.md)
- [Browser Sessions](https://www.zenrows.com/products/browser-sessions.md)
- [Extract](https://www.zenrows.com/products/extract.md)
- [Crawl](https://www.zenrows.com/products/crawl.md)
- [Search](https://www.zenrows.com/products/search.md)
- [Monitor](https://www.zenrows.com/products/monitor.md)
- [Batch](https://www.zenrows.com/products/batch.md)
- [API](https://www.zenrows.com/api.md)
- [SDK](https://www.zenrows.com/sdk.md)
- [MCP Server](https://www.zenrows.com/mcp.md)
- [CLI](https://www.zenrows.com/cli.md)
