> ## Documentation Index
> Fetch the complete documentation index at: https://docs.tipar.dev/llms.txt
> Use this file to discover all available pages before exploring further.

# POST /v1/playground/generate

> Anonymous, watermarked rendering for trying Tipar without an API key.

The same renderer as [`/generate`](/api-reference/generate), open to the public with no key — it powers the **“Try it”** widget on [tipar.dev](https://tipar.dev). Every result is watermarked, and it's tightly capped. It's for evaluating Tipar, not for production.

```
POST https://api.tipar.dev/v1/playground/generate
```

## How it differs from `/generate`

|                  | `/generate`                 | `/v1/playground/generate`               |
| ---------------- | --------------------------- | --------------------------------------- |
| Auth             | API key                     | **none**                                |
| Watermark        | never — clean on every plan | **always**                              |
| Rate limit       | 60/min per key              | **5 renders/day per IP**                |
| Max body         | 4 MB                        | **256 KB**                              |
| Quota / metering | counts against your plan    | **none** — nothing is stored or metered |

The request body is identical: `{ "template": …, "data": … }`. The response is a watermarked `application/pdf`.

## Response

<ResponseField name="200 OK" type="application/pdf">
  The rendered PDF, with a `tipar.dev` watermark across the page.
</ResponseField>

## Errors

| Status | `code`                | When                                                                                                                                                     |
| ------ | --------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `400`  | —                     | Malformed JSON, a missing/unknown node `type`, or a body that omits `template`. **Doesn't spend a daily render.**                                        |
| `413`  | —                     | Request body exceeds 256 KB.                                                                                                                             |
| `422`  | `template.*`          | Template reached the renderer but couldn't produce a document. Same codes as `/generate` — see [errors](/api-reference/errors#422-unprocessable-entity). |
| `429`  | `rate_limit.exceeded` | The 5-renders-per-day cap is reached for your IP. Carries `Retry-After`.                                                                                 |

The daily allowance is only spent on an actual render attempt — a malformed `400` request is free. The `429` message points you at signing up:

```json theme={"dark"}
{
  "title": "Too Many Requests",
  "status": 429,
  "detail": "Playground limit reached (5 renders/day). Sign up for a free API key to keep generating.",
  "errors": [
    { "code": "rate_limit.exceeded", "message": "Playground limit reached (5 renders/day). Sign up for a free API key to keep generating." }
  ]
}
```

<Note>
  The playground accepts cross-origin requests from `tipar.dev` only (a non-credentialed CORS policy). To render from your own code, use [`/generate`](/api-reference/generate) with an API key.
</Note>

<Tip>
  Building a template? Iterate in the playground until the structure is right, then move the same `template` to `/generate` with your key — the JSON is identical, and `/generate` output is **clean on every plan** (no watermark) with none of the playground's tight caps.
</Tip>
