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

# Create Editor Project

> Open one video in the Reap editor as a new project, ready to edit

> **For AI agents:** a documentation index is at [/llms.txt](https://docs.reap.video/llms.txt). Every page is also available as markdown, just append `.md` to the URL.

## Overview

Create an editor project: one video opened in the Reap editor, with no clipping, captions, or reframing applied first. Use it when you want to edit a video by hand, or have your AI agent edit it, without going through the Reap app to set the project up.

When the project status becomes `completed`, the project is ready to edit. It holds one clip in draft. That clip has no rendered file yet, so its `clipUrl` is empty until the clip is exported from the editor.

## Rate Limiting

This endpoint allows **10 requests per minute per API key**. Each endpoint has its own budget, so this allowance is not shared with the rest of the API — see [Rate limiting](https://docs.reap.video/api-reference/2_authentication.md#rate-limiting).

> [!NOTE]
>
> You must provide either `sourceUrl` or `uploadId`.

## Video Requirements

> [card] Duration
>
> **Minimum:** 3 seconds\
> **Maximum:** 15 minutes, or 30 minutes on a monthly or yearly Studio plan

> [card] File Size
>
> **Maximum:** 2 GB, or 5 GB on a monthly or yearly Studio plan

## Plan Limits

| Plan | Max Resolution | Concurrent Projects |
| - | - | - |
| Creator | 1080p | 3 |
| Studio | 4K (2160p) | 10 |

> [!NOTE]
>
> Editor projects need a paid plan. On the Free plan the request is refused. [View pricing](https://reap.video/pricing) to compare plans.

## Credits

An editor project costs **2 media credits per minute of video**. The length is rounded to the nearest minute, with a minimum of 1 minute. The credits are charged when the project is created. Check your balance with [Get Plan Usage](https://docs.reap.video/api-reference/get-plan-usage.md).

## Response

The response is the same project object that [Create Captions](https://docs.reap.video/api-reference/create-captions.md) returns.

**id** `string`

Unique project identifier

**title** `string`

Project title (usually the filename)

**thumbnail** `string`

Thumbnail URL for the project

**billedDuration** `number`

Length that is billed to your account, in minutes (rounded to the nearest minute, minimum 1)

**status** `string`

Current processing status

* `processing` - The video is being prepared for the editor
* `completed` - The project is ready to edit. Nothing has been rendered yet
* `invalid` - The video could not be processed. The project cannot be edited
* `cancelled` - The project was cancelled before it was ready

**projectType** `string`

Type of project (always "editor" for this endpoint)

**source** `string`

Source of the video content

**exportResolution** `integer`

Resolution of the project. It starts as the `resolution` you sent, or 1080. Once the video is prepared it is the resolution of the prepared video, which is lower when the source is smaller

**language** `string`

Primary language of the video content

**metadata** `object`

Video file metadata including duration, resolution, format, etc.

**urls** `object`

Project URLs and assets

**createdAt** `integer`

Unix timestamp when the project was created

**updatedAt** `integer`

Unix timestamp when the project was last updated

## Example Request

```bash cURL with Upload theme={"system"}
curl -X POST "https://public.reap.video/api/v1/automation/create-editor" \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "uploadId": "65f1a2b3c4d5e6f7a8b9c0d1",
    "language": "en",
    "resolution": 1080
  }'
```

```bash cURL with URL theme={"system"}
curl -X POST "https://public.reap.video/api/v1/automation/create-editor" \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "sourceUrl": "https://example.com/video.mp4"
  }'
```

```javascript JavaScript theme={"system"}
const response = await fetch('https://public.reap.video/api/v1/automation/create-editor', {
  method: 'POST',
  headers: {
    'Authorization': 'Bearer YOUR_API_KEY',
    'Content-Type': 'application/json'
  },
  body: JSON.stringify({
    uploadId: '65f1a2b3c4d5e6f7a8b9c0d1',
    language: 'en',
    resolution: 1080
  })
});

const project = await response.json();
console.log('Editor project created:', project.id);
```

```python Python theme={"system"}
import requests

headers = {
    'Authorization': 'Bearer YOUR_API_KEY',
    'Content-Type': 'application/json'
}

data = {
    'uploadId': '65f1a2b3c4d5e6f7a8b9c0d1',
    'language': 'en',
    'resolution': 1080
}

response = requests.post(
    'https://public.reap.video/api/v1/automation/create-editor',
    headers=headers,
    json=data
)

project = response.json()
print(f'Editor project created: {project["id"]}')
```

## Example Response

**200 OK**

```json theme={"system"}
{
  "id": "65f1a2b3c4d5e6f7a8b9c0d2",
  "title": "my-video.mp4",
  "thumbnail": "https://cdn.reap.video/thumbnails/65f1a2b3c4d5e6f7a8b9c0d2.jpg",
  "billedDuration": 3,
  "status": "processing",
  "projectType": "editor",
  "source": "Upload",
  "genre": "talking",
  "topics": [],
  "clipDurations": [],
  "selectedStart": 0,
  "selectedEnd": 180.5,
  "exportResolution": 1080,
  "exportOrientation": "landscape",
  "captionsPreset": "system_beasty",
  "enableCaptions": false,
  "enableEmojis": false,
  "enableHighlights": false,
  "language": "en",
  "dubbingLanguage": null,
  "translateTranscription": false,
  "translationLanguages": [],
  "transcriptionScript": "native",
  "metadata": {
    "duration": 180.5,
    "width": 1920,
    "height": 1080,
    "fps": 30,
    "bitrate": 5000000,
    "size": 45000000,
    "codec": "h264"
  },
  "urls": {},
  "createdAt": 1710000000,
  "updatedAt": 1710000000
}
```

**400 Bad Request**

```json theme={"system"}
{
  "detail": "Missing source URL or upload ID."
}
```

**401 Unauthorized**

```json theme={"system"}
{
  "detail": "Unauthorized - Invalid or missing API key"
}
```

**403 Forbidden**

```json theme={"system"}
{
  "detail": "Please upgrade your plan to use higher resolution videos."
}
```

**429 Too Many Requests**

```json theme={"system"}
{
  "detail": "Maximum concurrent projects reached"
}
```

## Errors

| Status | When |
| - | - |
| `400` | Your workspace is on the Free plan: "Please upgrade your plan to use the editor." |
| `400` | Neither `sourceUrl` nor `uploadId` was sent |
| `400` | `language` is not a supported source language |
| `400` | The video is shorter than 3 seconds, or over your plan's maximum length or file size |
| `403` | `resolution` is above 1080 on a Creator plan |
| `429` | Your plan's concurrent project limit is reached. Wait for a project to finish, then try again |

## Next Steps

After creating an editor project:

1. Monitor progress with [Get Project Status](https://docs.reap.video/api-reference/get-project-status.md), or wait for the [webhook](https://docs.reap.video/api-reference/webhooks.md). For an editor project, `completed` means ready to edit, not rendered.
2. Open the project in the Reap editor and edit it, or have your AI agent do it. See [Open The Editor From Your AI Agent](https://docs.reap.video/help-center/open-the-editor-from-your-ai-agent.md).
3. After the clip is exported from the editor, retrieve it with [Get Project Clips](https://docs.reap.video/api-reference/get-project-clips.md).


## OpenAPI

````yaml POST /automation/create-editor
openapi: 3.1.0
info:
  title: Reap Automation API
  description: AI-powered video processing automation API
  version: 1.0.0
servers:
  - url: https://public.reap.video/api/v1
security:
  - bearerAuth: []
paths:
  /automation/create-editor:
    post:
      summary: Create Editor Project
      description: Open one video in the Reap editor as a new project, ready to edit
      operationId: createEditor
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/CreateEditorRequest'
      responses:
        '200':
          description: Successful response
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/AutomationProject'
components:
  schemas:
    CreateEditorRequest:
      type: object
      properties:
        sourceUrl:
          type: string
          description: URL of the video (alternative to uploadId)
        uploadId:
          type: string
          description: Upload ID from a previously uploaded file (alternative to sourceUrl)
        language:
          type: string
          nullable: true
          description: >-
            Primary language of the video content (auto-detected if not
            provided)
        resolution:
          type: integer
          enum:
            - 720
            - 1080
            - 1440
            - 2160
          default: 1080
          description: >-
            Resolution of the project. Resolutions above 1080 require a Studio
            plan.
    AutomationProject:
      type: object
      properties:
        id:
          type: string
        title:
          type: string
        thumbnail:
          type: string
        billedDuration:
          type: number
        status:
          type: string
          enum:
            - queued
            - prepped
            - draft
            - processing
            - finalizing
            - completed
            - invalid
            - expired
            - failed
            - error
        projectType:
          type: string
          enum:
            - clipping
            - captions
            - reframe
            - dubbing
            - transcription
            - editor
        source:
          type: string
          enum:
            - Upload
            - Youtube
            - Vimeo
            - TwitchVod
            - Twitter
            - RumbleEmbed
            - Generic
        genre:
          $ref: '#/components/schemas/VideoGenre'
        topics:
          type: array
          items:
            type: string
        clipDurations:
          type: array
          items:
            type: array
            items:
              type: integer
        selectedStart:
          type: number
          nullable: true
        selectedEnd:
          type: number
          nullable: true
        exportResolution:
          type: integer
        exportOrientation:
          $ref: '#/components/schemas/VideoOrientation'
        captionsPreset:
          type: string
          nullable: true
        enableCaptions:
          type: boolean
        enableEmojis:
          type: boolean
        enableHighlights:
          type: boolean
        language:
          type: string
          nullable: true
        dubbingLanguage:
          type: string
          nullable: true
        translateTranscription:
          type: boolean
        translationLanguages:
          type: array
          items:
            type: string
        transcriptionScript:
          $ref: '#/components/schemas/TranscriptionScript'
        metadata:
          $ref: '#/components/schemas/VideoFileMeta'
        urls:
          $ref: '#/components/schemas/ProjectUrls'
        createdAt:
          type: integer
        updatedAt:
          type: integer
    VideoGenre:
      type: string
      enum:
        - talking
        - screenshare
        - gaming
      default: talking
    VideoOrientation:
      type: string
      enum:
        - landscape
        - portrait
        - square
    TranscriptionScript:
      type: string
      enum:
        - native
        - roman
      default: native
    VideoFileMeta:
      type: object
      properties:
        width:
          type: integer
        height:
          type: integer
        aspectRatio:
          type: string
        size:
          type: number
        bitrate:
          type: number
        fps:
          type: number
        duration:
          type: number
        rotation:
          type: integer
        resolution:
          type: integer
        codec:
          type: string
        codecFullName:
          type: string
        codecTag:
          type: string
        format:
          type: string
        formatFullName:
          type: string
    ProjectUrls:
      type: object
      description: >-
        Presigned URLs for the project's assets. URLs expire — always use the
        most recent API response. The transcription_* subtitle/text exports are
        only present on transcription projects.
      properties:
        videoFile:
          type: string
          description: Presigned URL of the processed source video
        audioFile:
          type: string
          description: Presigned URL of the extracted audio track
        transcription:
          type: string
          description: >-
            Presigned URL of the word-level transcript JSON (the translated
            version when translation ran). Lets API consumers audit content
            without video playback.
        transcription_srt:
          type: string
          description: SRT subtitles — transcription projects only
        transcription_vtt:
          type: string
          description: WebVTT subtitles — transcription projects only
        transcription_csv:
          type: string
          description: CSV transcript — transcription projects only
        transcription_txt:
          type: string
          description: Plain-text transcript — transcription projects only
  securitySchemes:
    bearerAuth:
      type: http
      scheme: bearer

````

This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.