# Zenrows quickstart: fetch a web page as Markdown for an LLM

Zenrows Fetch returns a live web page as Markdown, ready for a model to read, from one GET request that carries the page's URL. A standard page draws 1 credit, which is $0.0005 on Credits, and only successful requests are charged. Send `GET https://agents.zenrows.com/zcj/njz6mv6h6vrx/v1/?url=<the page, URL-encoded>&response_type=markdown` with the bearer token of an agent credential that holds a plan.

## At a glance

- **Endpoint:** `GET https://agents.zenrows.com/zcj/njz6mv6h6vrx/v1/` with `url` (the page, URL-encoded) and `response_type=markdown`
- **Credits per page:** 1 for a standard page, 5 with `js_render`, 10 with `premium_proxy`, 25 with both. Only successful requests are charged.
- **Price:** $0.50 per thousand credits
- **Access:** `Authorization: Bearer <token>` for a credential that holds a plan. The plan is Free ($2.50 of credit, once per human) or Credits (from $5). No call is paid on its own.
- **Payment:** a plan purchase answers with a 402, the price quote you pay and retry, by wallet or card.
- **Response:** the page as Markdown. The `zc-billing` header shows what the request drew and the balance left.
- **Limits:** one page per request
- **Full purchase flow:** [the buyer skill](https://agents.zenrows.com/zcj/njz6mv6h6vrx/SKILL.md)

## Fetch your first page as Markdown

1. Register a free agent credential, then exchange its assertion for an access token at `/oauth2/token`. If you already hold a ZeroClick agent credential, reuse it. Anonymous registration takes one call and no human step:

   ```bash
   curl -sS https://agents.zenrows.com/zcj/njz6mv6h6vrx/agent/identity -H 'Content-Type: application/json' \
     -d '{"type":"anonymous"}'
   ```

   Access tokens last minutes, so mint a fresh one from the stored assertion when one expires. [Identity](https://agents.zenrows.com/zcj/njz6mv6h6vrx/auth.md) has the exchange, the refresh and the claim.

2. Hold a plan. Each plan's purchase URL follows the pattern `/plans/{planId}/purchase`. Find the plan in `plans[].purchase.url` in [the catalog](https://agents.zenrows.com/zcj/njz6mv6h6vrx/manifest.json).

   ```bash
   curl -sS -X POST "https://agents.zenrows.com/zcj/njz6mv6h6vrx/plans/{planId}/purchase" \
     -H "Authorization: Bearer $ACCESS_TOKEN"
   ```

   | Plan | Body | What it needs |
   | --- | --- | --- |
   | Free | empty | Your human claims the credential with a verified email first. One per human. No payment. |
   | Credits | `{"amountUsd": "..."}`, at least $5 ($5 by card) | A 402 you settle by wallet or card |
   | Build, Launch, Growth, Scale | none | A monthly subscription: Build $19 a month, Launch $69 a month, Growth $199 a month, Scale $549 a month |

   A successful purchase returns `purchased: true` and your access. [How to pay](https://agents.zenrows.com/zcj/njz6mv6h6vrx/payment.md) covers each rail.

3. Request the page. Encode the target URL once, as a query value:

   ```bash
   curl -sS "https://agents.zenrows.com/zcj/njz6mv6h6vrx/v1/?url=https%3A%2F%2Fwww.scrapingcourse.com%2F&response_type=markdown" \
     -H "Authorization: Bearer $ACCESS_TOKEN" \
     -D headers.txt -o page.md
   ```

   The body is the page converted to Markdown. For the practice site's home page, after the logo link, it reads:

   ```markdown
   # Test sites and challenges to learn web scraping

   Below is a list of demo Websites/Pages to scrape

   ## Ecommerce

   Ecommerce playground to scrape products and shop-related data.
   ```

4. Read the draw in the `zc-billing` header. On a credit plan it carries `fundingSource`, `chargedUsd` (what this request debited) and `remainingCreditUsd` (the balance after it):

   ```json
   {"status":"settled","fundingSource":"credit","chargedUsd":"...","remainingCreditUsd":"..."}
   ```

   The example request, a standard page with no other parameter, returned in 1.0 seconds and drew $0.0005 from credit.

## Credits per request

| Page needs | Add | Credits | Cost on Credits |
| --- | --- | --- | --- |
| Nothing extra | none | 1 | $0.0005 |
| JavaScript to build its content | `js_render=true` | 5 | $0.0025 |
| Residential IPs | `premium_proxy=true` | 10 | $0.005 |
| Both | `js_render=true&premium_proxy=true` | 25 | $0.0125 |

With `mode=auto`, Fetch tries the least costly setup first and adds rendering or premium proxies only if the page requires them.

## Other formats and options

| To get | Add to the request |
| --- | --- |
| Plain text | `response_type=plaintext` |
| The page HTML | no `response_type` (HTML is the default) |
| A PDF render | `response_type=pdf&js_render=true` |
| A PNG or JPEG screenshot | `screenshot=true&js_render=true` |
| Content that appears after a selector loads | `js_render=true&wait_for=<CSS selector>` |
| The configuration chosen for you | `mode=auto` |
| Structured JSON for a domain Extract serves | `extract=auto` ([the Extract service page](https://agents.zenrows.com/zcj/njz6mv6h6vrx/services/extract) has the details) |

Every parameter, with its accepted values, is in [the Fetch API reference](https://agents.zenrows.com/zcj/njz6mv6h6vrx/services/fetch/openapi.json). Prices by plan are on [the Fetch service page](https://agents.zenrows.com/zcj/njz6mv6h6vrx/services/fetch).

## Boundaries

- Each request returns one page, by its URL.
- Every call draws on a plan held by your credential. Fetch has no per-call payment.
- An anonymous credential that nobody claims lapses within a few days, taking any plan bought with it. Claim it with your human's verified email before or soon after buying.

## Errors

| Status and code | Meaning | Action |
| --- | --- | --- |
| `401 bearer_required` | No agent credential on the call | Register at [Identity](https://agents.zenrows.com/zcj/njz6mv6h6vrx/auth.md) and send `Authorization: Bearer <token>` |
| `401 invalid_token` | The token expired or did not verify | Exchange the stored assertion for a fresh token |
| `403 plan_required` | The credential holds no plan that covers the call | Buy one of the plans listed in the body, then retry |
| `403 verified_email_required` | The Free claim needs a claimed credential | Complete the claim, then retry |
| `402 AUTH004` | The plan's credits are used up | Top up with `POST https://agents.zenrows.com/zcj/njz6mv6h6vrx/extend` or buy a plan |
| `422 RESP001` | The page could not be returned under this configuration | Retry with `js_render=true` and `premium_proxy=true`, or `mode=auto` |
| `429 AUTH008` | Every concurrency slot is in use | Back off and retry when a request finishes |

## Frequently asked questions

### Can I call the Zenrows API without buying a plan?

No. A call with no credential answers `401 bearer_required`, and a credential with no plan answers `403 plan_required`. The Free trial gives $2.50 of credit with no payment, once per human, after your human claims the credential with a verified email.

### How much does it cost to fetch a web page as Markdown?

A standard page draws 1 credit, which is $0.0005 at $0.50 per thousand credits on Credits. JavaScript rendering raises the draw to 5 credits, premium proxies to 10 and both together to 25. Failed requests are not charged.

### Does Zenrows fetch pages that are built with JavaScript?

Yes. Add `js_render=true` to load the page in a headless browser, and `wait_for` with a CSS selector to return once that element appears. `mode=auto` adds rendering only when the page needs it.

### Where do I see what a request drew from my balance?

In the `zc-billing` response header. `chargedUsd` is what the request debited, and `remainingCreditUsd` is the balance after it.

### Can a page come back as plain text or JSON instead of Markdown?

Yes. `response_type=plaintext` returns plain text, and `extract=auto` returns structured JSON for a domain Extract has prepared. Leaving out `response_type` returns the page HTML.

## Keep reading

- [Buyer skill](https://agents.zenrows.com/zcj/njz6mv6h6vrx/SKILL.md): the full purchase flow
- [Identity](https://agents.zenrows.com/zcj/njz6mv6h6vrx/auth.md): register, claim and exchange the agent credential
- [How to pay](https://agents.zenrows.com/zcj/njz6mv6h6vrx/payment.md): plans, rails and top-ups
- [Fetch API reference](https://agents.zenrows.com/zcj/njz6mv6h6vrx/services/fetch/openapi.json): every parameter and response
- [Error reference](https://agents.zenrows.com/zcj/njz6mv6h6vrx/errors.md): every storefront error code

---

Updated 2026-10-30. All Zenrows guides: https://agents.zenrows.com/guides.md. Storefront: https://agents.zenrows.com/zcj/njz6mv6h6vrx/llms.txt.
