# Render
> The API integrations use to ask Jazui for a bot's page.
Source page: https://docs.jazui.com/api/render/en
You don't usually call it yourself: your integration does. Knowing it helps you debug, build your own integration or check what a bot gets from a specific page. **Each call counts as a served request in your plan**, and if the page wasn't cached, also as a render.
## Request
`GET https://api.jazui.com/Render`
| Parameter or header | Required | Description |
|---|---|---|
| `url` | Yes* | Full page address, encoded. *If you can't put it in the query, send it in the `X-Jazui-Url` header. |
| `botAgent` | No | The bot's user agent. If missing, the request's `User-Agent` is used. |
| `Authorization` | Yes | `Bearer` with the account or site token. |
| `X-Jazui-Client-IP` | No | The bot's IP. If a comma-separated list arrives, the first one is used. Used for metrics and to verify search engines. |
| `If-None-Match` | No | The bot's `ETag`, to get a `304` if it hasn't changed. |
```bash
curl -i "https://api.jazui.com/Render?url=https%3A%2F%2Fmisitio.com%2Fprecios&botAgent=integration-test" \
-H "Authorization: Bearer $JAZUI_TOKEN" \
-H "X-Jazui-Client-IP: 66.249.66.1"
```
## Response
The page's HTML with its **real status code**: `200`, `404` if your page is a 404, or the redirect (`301`, `302`…) with its `Location` and no body.
`Successful response`:
```http
HTTP/1.1 200 OK
Content-Type: text/html; charset=utf-8
X-Jazui: true
X-Jazui-Cache: HIT
ETag: "4812-638976215370000000"
Last-Modified: Mon, 02 Nov 2026 18:22:17 GMT
Precios | Mi sitio…
```
## Other codes
| Code | Header | Reason |
|---|---|---|
| `400` | — | `url` is missing or invalid, or a rule excludes that address from rendering. |
| `401` | — | No token or token no longer valid. |
| `403` | — | Token from another site, or the site isn't verified. |
| `403` | `X-Jazui-Blocked: ai-bot` | You blocked that AI bot in the site settings. |
| `403` | `X-Jazui-Blocked: rule` | A rule blocks that bot. |
| `429` | `X-Jazui-Limit: plan` | The free plan has used up its renders or requests for the month. |
| `429` | `X-Jazui-Limit: renders` | No renders left this month for a new page, or the required badge is missing past the grace period. |
| `429` | `X-Jazui-Limit: pages` | The cached page limit has been reached. |
| `429` | — | More than 120 requests per minute. |
| `502` | `Retry-After: 30` | Your website answered with a server error while rendering. |
| `503` | `Retry-After: 30` | Rendering didn't finish in time. |
## Conditional requests
Each page has an `ETag`. If you send the one you have in `If-None-Match` and the page hasn't changed, you get `304 Not Modified` with no body (also with `X-Jazui: true`). That way bots that store pages don't download them again.
```bash
curl -i "https://api.jazui.com/Render?url=https%3A%2F%2Fmisitio.com%2F&botAgent=integration-test" \
-H "Authorization: Bearer $JAZUI_TOKEN" \
-H 'If-None-Match: "4812-638976215370000000"'
# HTTP/1.1 304 Not Modified (sin cuerpo)
```
## Reporting an unknown bot
Code-based integrations report with `POST /Render/Seen` when they see a bot-like user agent that isn't on the list. It always answers `204`; each agent counts once a day, up to 500 different ones per account per day. If you build your own integration, you can use it the same way.
```bash
curl -X POST https://api.jazui.com/Render/Seen \
-H "Authorization: Bearer $JAZUI_TOKEN" \
-H "Content-Type: application/json" \
-d '{"userAgent":"NuevoBot/1.0 (+https://nuevobot.ai)","url":"https://misitio.com/"}'
# 204 No Content
```
## Your own integration
If your platform isn't listed, you can build one following the contract in [Integrations](https://docs.jazui.com/llms/en/integrations.txt): decide whether it's a bot with the `/v2/bots` list, call `/Render` with a maximum wait (20 s), pass the response on only if it has `X-Jazui` or is a `403` with `X-Jazui-Blocked`, and serve your website in any other case. Don't forward the bot's cookies or other headers.