# Limits and pricing

> What a video costs, the monthly pitch cap, and every rate and size limit.

Every plan can make productions, Free included. Pitches are free. A video costs 60 credits per second of video, charged once when it is greenlit. There is no monthly limit on videos. The plan only sets how many pitches a workspace can ask for a month, which stops a noisy trigger from piling up pitches nobody reads.

## Price and pitch caps

| Plan | Pitches a month |
| --- | --- |
| Free | 10 |
| Hobby | 20 |
| Pro | 60 |
| Max | 200 |
| Team | 200 |

- Pitch caps are per workspace per calendar month. A pitch counts when it is written.
- Each video costs 60 credits per second of video, so a 5 second video is 300 credits and a 15 second one 900 credits (1 credit is 1 cent at retail). The pitch quotes the exact number as `estimatedCredits` before anyone pays, and a revised pitch is priced again. Paid plans come with monthly credits that pay for videos too, and anyone can buy credit packs; see [pricing](https://www.raylight.app/pricing).
- 6 pitch versions per production, so 5 rounds of comments after the first pitch. Comments cost no credits, but each new version counts as one pitch against the monthly cap; once the cap is reached the current pitch stands.
- Skipped and declined pitches cost nothing. A production cancelled after the greenlight but before a render machine picks it up is refunded in full, and so is one that fails in production. If no render machine can start on a greenlit video within 30 minutes, the production fails and the credits are refunded.
- `GET /v1/productions/usage` returns `productionsThisMonth`, `pitchesThisMonth`, `pitchesCap` and `creditsCharged` for the month.

## Rate limits

| Surface | Limit | Counted per |
| --- | --- | --- |
| `/v1/productions` | 120 requests a minute | key |
| `/v1/webhooks` | 60 requests a minute | key |
| `/v1/renders` | 30 requests a minute | key |
| `/v1/keys` | 60 requests a minute | IP |
| `/production-links` | 30 requests a minute | IP |

Over a rate limit: 429 with `code: "rate_limited"` and `Retry-After` in seconds. Over the monthly pitch cap: 429 with `code: "cap"`.

## Brief limits

| Field | Limit |
| --- | --- |
| `intent` | 2,000 characters |
| `context` | 60,000 characters |
| `media` | 20 items |
| `code` | 40 files, 200,000 characters of source each |
| `code[].patch` | 20,000 characters |
| `code[].digest` | 1,500 characters |
| `format.durationMs` | 5,000 to 15,000 |
| Pitch shots | 1 to 24 |
| Comments on a pitch | 4,000 characters |
| `externalId` | 200 characters |

## Webhook limits

| What | Limit |
| --- | --- |
| Endpoints per workspace | 10 |
| Attempt timeout | 10 seconds |
| Attempts per delivery | 6 (immediate, then 30s, 2m, 10m, 1h, 6h) |
| Auto-disable | after 20 exhausted deliveries in a row; any success resets |
| Previous secret after a roll | valid 24 hours |
| Response body kept per delivery | first 2 KB |
| Delivery log retention | 30 days, or until the endpoint is deleted |
| URL | https only, public address, 2,000 characters |

## Keys and links

| What | Limit |
| --- | --- |
| Device-code request | 10 minutes to approve, then 10 minutes to claim |
| Poll interval | 3 seconds |
| Greenlight link lifetime | 30 days, or until the pitch changes |
| Comment through a link | 4,000 characters |

## Time to deliver

A pitch usually lands within a couple of minutes. Making the video takes longer and depends on how busy Raylight is. While a production is greenlit, in production or exporting, its `queue` object says what it is doing (`phase`, with `lastProgress` as the label to show, null while it waits to start), when work on it started, and whether an earlier try failed and Raylight is trying again (`retrying`), so your integration can show where it stands. If no render machine can start on a greenlit video within 30 minutes, the production fails and the credits are refunded.

## More

- Previous: [SDK](https://www.raylight.app/docs/sdk.md)
- Next: [Security](https://www.raylight.app/docs/security.md)
- All docs: https://www.raylight.app/llms.txt
- Everything in one file: https://www.raylight.app/llms-full.txt
- OpenAPI: https://api.raylight.app/v1/openapi.json
