# Fetch a web page

> Scrape a page through a proxy that bypasses anti-bot protections, and get it back as markdown, plain text, or raw HTML.

Source: https://docs.generalinput.com/api/platform/proxy-scrape



<Endpoint method="POST" path="/v1/platform/proxy-scrape" />

<Access scope="platform:use" />

Use it when a direct fetch is blocked. Returns markdown by default, which is the friendliest shape for a model.

## Body [#body]

| Field            | Type    | Required | Notes                                                                                                                              |
| ---------------- | ------- | -------- | ---------------------------------------------------------------------------------------------------------------------------------- |
| `url`            | string  | yes      | The page to fetch.                                                                                                                 |
| `returnFormat`   | string  | no       | `markdown` (default), `text`, or `html`.                                                                                           |
| `shouldRenderJs` | boolean | no       | Render JavaScript first. Needed for single-page apps. Costs 5x. Default `false`.                                                   |
| `proxyMode`      | string  | no       | `default` (most sites), `premium` (10 to 25 credits, stronger anti-bot bypass), `stealth` (75 credits, the strongest protections). |
| `countryCode`    | string  | no       | Two-letter code (`us`, `de`) to route through a proxy in that country.                                                             |

## Response [#response]

```json
{ "content": "# Page title\n\nBody as markdown…", "statusCode": 200 }
```

`statusCode` is the upstream site's status. A response may also carry `isLikelyJsShell: true`, meaning the page came back as an empty app shell and is worth retrying with `shouldRenderJs`.

## Escalation [#escalation]

1. Try a plain fetch yourself first. It is free.
2. Blocked (403, captcha)? Call this route with the defaults.
3. Content missing (a single-page app)? Add `shouldRenderJs: true`.
4. Still blocked? Step `proxyMode` up to `stealth`. The `default` mode already retries through the premium tier on its own, so the manual escalation that adds anything is straight to `stealth`.

## Example [#example]

```sh
curl -s -X POST https://cloud.generalinput.com/v1/platform/proxy-scrape \
  -H "Authorization: Bearer $GI_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"url":"https://example.com/pricing","returnFormat":"markdown"}'
```
