# Render images into a video

> Multipart: 1 to 10 image files as repeated `images` fields plus optional form fields. With `wait=true` (default) the request holds until the video is ready (about 1 to 3 minutes) and answers 200; past the wait budget it answers 202 while the render continues. Needs the `renders` scope.

### POST /v1/renders

**Render images into a video**

Multipart: 1 to 10 image files as repeated `images` fields plus optional form fields. With `wait=true` (default) the request holds until the video is ready (about 1 to 3 minutes) and answers 200; past the wait budget it answers 202 while the render continues. Needs the `renders` scope.

Auth: `Authorization: Bearer rl_live_...` with the `renders` scope.

Request body (multipart/form-data):

| Field | Type | Required | Description |
| --- | --- | --- | --- |
| `resolution` | enum | no | One of: `480p`, `720p`, `1080p`, `4K`. Default `1080p`. |
| `background` | enum | no | One of: `black`, `white`. Default `black`. |
| `appName` | string | no |  |
| `accent` | string | no |  |
| `wait` | enum | no | One of: `true`, `false`. Default `true`. |
| `images` | file[] | yes |  |

Responses:

| Status | Meaning |
| --- | --- |
| 200 | The finished render with a signed video URL. |
| 202 | Still rendering; poll it. |
| 400 | Invalid request. |
| 401 | Missing, invalid or revoked key. |
| 403 | The key lacks the scope, or the key's owner has view-only access to the workspace (code `forbidden`). |
| 404 | Not found. |
| 429 | Rate limited, or a monthly cap reached. |

Response body (200):

| Field | Type | Required | Description |
| --- | --- | --- | --- |
| `render` | object | yes |  |
| `render.id` | uuid | yes |  |
| `render.status` | enum | yes | One of: `queued`, `rendering`, `done`, `failed`. |
| `render.progress` | number | yes |  |
| `render.projectId` | uuid \| null | yes |  |
| `render.resolution` | enum | yes | One of: `480p`, `720p`, `1080p`, `4K`. |
| `render.error` | string \| null | yes |  |
| `render.videoUrl` | url | no |  |

Response body (202):

| Field | Type | Required | Description |
| --- | --- | --- | --- |
| `render` | object | yes |  |
| `render.id` | uuid | yes |  |
| `render.status` | enum | yes | One of: `queued`, `rendering`, `done`, `failed`. |
| `render.progress` | number | yes |  |
| `render.projectId` | uuid \| null | yes |  |
| `render.resolution` | enum | yes | One of: `480p`, `720p`, `1080p`, `4K`. |
| `render.error` | string \| null | yes |  |
| `render.videoUrl` | url | no |  |

Example (curl):

```bash
curl -X POST https://api.raylight.app/v1/renders \
  -H "Authorization: Bearer $RAYLIGHT_API_KEY" \
  -F "images=@screenshots/home.png" \
  -F "images=@screenshots/editor.png" \
  -F "appName=Acme" \
  -F "resolution=1080p"
```

## More

- Previous: [Revoke the key making the call](https://www.raylight.app/docs/reference/delete-v1-keys-current.md)
- Next: [Read a render](https://www.raylight.app/docs/reference/get-v1-renders-id.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
