# Rate limits & usage Two limits apply to your account, both based on your subscription plan: - A **monthly generation quota** that resets at the start of your billing period. - A **per-minute request limit** on how often you can call the rendering endpoints. | Plan | Generations/month | Requests/minute | | ------- | ------------------ | ---------------- | | Free | 50 | 15 | | Starter | 2,000 | 60 | | Pro | 5,000 | 150 | Both limits apply to every endpoint that renders an image: `POST /api/generate`, `POST /api/hooks/render`, and a fresh (uncached) `GET /api/render`. > **Note: What doesn't count toward your limit** > > Cached responses never count toward either limit, on any endpoint. A render is only billed and rate limited the first time it's produced; repeat requests for the same template, layers, dimensions, and format are served from cache for free. > **Note: GET /api/render is billed to the template owner** > > The public, unauthenticated `/api/render` endpoint is not exempt from rate limits. A fresh render on that endpoint counts against the monthly quota and per-minute limit of the **template's owner**, the account that created the template, not the caller. If you embed a template publicly and it gets popular, its owner's plan is what determines how much headroom you have. ## 429 responses When either limit is exceeded, the endpoint returns HTTP 429 with a JSON body and a `Retry-After` header: - **Per-minute limit exceeded**: the body includes `limit` and `retryAfter` (seconds until the current one-minute window frees up). - **Monthly quota exceeded**: the body includes `limit`, `used`, `remaining`, and `retryAfter` (seconds until your billing period resets). In both cases, the `Retry-After` header mirrors the body's `retryAfter` value in seconds.