Create Transcription
curl --request POST \
--url https://public.reap.video/api/v1/automation/create-transcription \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"sourceUrl": "<string>",
"uploadId": "<string>",
"language": "<string>",
"translationLanguage": "<string>",
"transcriptionScript": "native"
}
'import requests
url = "https://public.reap.video/api/v1/automation/create-transcription"
payload = {
"sourceUrl": "<string>",
"uploadId": "<string>",
"language": "<string>",
"translationLanguage": "<string>",
"transcriptionScript": "native"
}
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({
sourceUrl: '<string>',
uploadId: '<string>',
language: '<string>',
translationLanguage: '<string>',
transcriptionScript: 'native'
})
};
fetch('https://public.reap.video/api/v1/automation/create-transcription', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://public.reap.video/api/v1/automation/create-transcription",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => json_encode([
'sourceUrl' => '<string>',
'uploadId' => '<string>',
'language' => '<string>',
'translationLanguage' => '<string>',
'transcriptionScript' => 'native'
]),
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>",
"Content-Type: application/json"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://public.reap.video/api/v1/automation/create-transcription"
payload := strings.NewReader("{\n \"sourceUrl\": \"<string>\",\n \"uploadId\": \"<string>\",\n \"language\": \"<string>\",\n \"translationLanguage\": \"<string>\",\n \"transcriptionScript\": \"native\"\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("Authorization", "Bearer <token>")
req.Header.Add("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.post("https://public.reap.video/api/v1/automation/create-transcription")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"sourceUrl\": \"<string>\",\n \"uploadId\": \"<string>\",\n \"language\": \"<string>\",\n \"translationLanguage\": \"<string>\",\n \"transcriptionScript\": \"native\"\n}")
.asString();{
"id": "<string>",
"title": "<string>",
"thumbnail": "<string>",
"billedDuration": 123,
"status": "queued",
"projectType": "clipping",
"source": "Upload",
"genre": "talking",
"topics": [
"<string>"
],
"clipDurations": [
[
123
]
],
"selectedStart": 123,
"selectedEnd": 123,
"exportResolution": 123,
"exportOrientation": "landscape",
"captionsPreset": "<string>",
"enableCaptions": true,
"enableEmojis": true,
"enableHighlights": true,
"language": "<string>",
"dubbingLanguage": "<string>",
"translateTranscription": true,
"translationLanguages": [
"<string>"
],
"transcriptionScript": "native",
"metadata": {
"width": 123,
"height": 123,
"aspectRatio": "<string>",
"size": 123,
"bitrate": 123,
"fps": 123,
"duration": 123,
"rotation": 123,
"resolution": 123,
"codec": "<string>",
"codecFullName": "<string>",
"codecTag": "<string>",
"format": "<string>",
"formatFullName": "<string>"
},
"urls": {
"videoFile": "<string>",
"audioFile": "<string>",
"transcription": "<string>",
"transcription_srt": "<string>",
"transcription_vtt": "<string>",
"transcription_csv": "<string>",
"transcription_txt": "<string>"
},
"createdAt": 123,
"updatedAt": 123
}Create Projects
Create Transcription
Generate accurate transcriptions from video and audio content
POST
/
automation
/
create-transcription
Create Transcription
curl --request POST \
--url https://public.reap.video/api/v1/automation/create-transcription \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"sourceUrl": "<string>",
"uploadId": "<string>",
"language": "<string>",
"translationLanguage": "<string>",
"transcriptionScript": "native"
}
'import requests
url = "https://public.reap.video/api/v1/automation/create-transcription"
payload = {
"sourceUrl": "<string>",
"uploadId": "<string>",
"language": "<string>",
"translationLanguage": "<string>",
"transcriptionScript": "native"
}
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({
sourceUrl: '<string>',
uploadId: '<string>',
language: '<string>',
translationLanguage: '<string>',
transcriptionScript: 'native'
})
};
fetch('https://public.reap.video/api/v1/automation/create-transcription', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://public.reap.video/api/v1/automation/create-transcription",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => json_encode([
'sourceUrl' => '<string>',
'uploadId' => '<string>',
'language' => '<string>',
'translationLanguage' => '<string>',
'transcriptionScript' => 'native'
]),
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>",
"Content-Type: application/json"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://public.reap.video/api/v1/automation/create-transcription"
payload := strings.NewReader("{\n \"sourceUrl\": \"<string>\",\n \"uploadId\": \"<string>\",\n \"language\": \"<string>\",\n \"translationLanguage\": \"<string>\",\n \"transcriptionScript\": \"native\"\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("Authorization", "Bearer <token>")
req.Header.Add("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.post("https://public.reap.video/api/v1/automation/create-transcription")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"sourceUrl\": \"<string>\",\n \"uploadId\": \"<string>\",\n \"language\": \"<string>\",\n \"translationLanguage\": \"<string>\",\n \"transcriptionScript\": \"native\"\n}")
.asString();{
"id": "<string>",
"title": "<string>",
"thumbnail": "<string>",
"billedDuration": 123,
"status": "queued",
"projectType": "clipping",
"source": "Upload",
"genre": "talking",
"topics": [
"<string>"
],
"clipDurations": [
[
123
]
],
"selectedStart": 123,
"selectedEnd": 123,
"exportResolution": 123,
"exportOrientation": "landscape",
"captionsPreset": "<string>",
"enableCaptions": true,
"enableEmojis": true,
"enableHighlights": true,
"language": "<string>",
"dubbingLanguage": "<string>",
"translateTranscription": true,
"translationLanguages": [
"<string>"
],
"transcriptionScript": "native",
"metadata": {
"width": 123,
"height": 123,
"aspectRatio": "<string>",
"size": 123,
"bitrate": 123,
"fps": 123,
"duration": 123,
"rotation": 123,
"resolution": 123,
"codec": "<string>",
"codecFullName": "<string>",
"codecTag": "<string>",
"format": "<string>",
"formatFullName": "<string>"
},
"urls": {
"videoFile": "<string>",
"audioFile": "<string>",
"transcription": "<string>",
"transcription_srt": "<string>",
"transcription_vtt": "<string>",
"transcription_csv": "<string>",
"transcription_txt": "<string>"
},
"createdAt": 123,
"updatedAt": 123
}
For AI agents: a documentation index is at /llms.txt. Every page is also available as markdown, just append .md to the URL.
Overview
Extract accurate transcriptions from your videos using AI-powered speech recognition. This endpoint generates timestamped transcriptions with support for multiple languages, translation, and script format options. Transcription output is available in multiple formats including SRT, VTT, CSV, and TXT.Rate Limiting
This endpoint is rate limited to 10 requests per minute per API key.You must provide either
sourceUrl or uploadId, but not both.Video Requirements
Duration
Minimum: 3 seconds
Maximum: 2 hours
Maximum: 2 hours
File Size
Maximum: 5 GB
Format
MP4 or MOV with valid audio streams
Audio Quality
Clear speech produces best transcription results
Plan Limits
| Plan | Concurrent Projects |
|---|---|
| Creator | 3 |
| Studio | 10 |
The Automation API requires an active subscription. View pricing to compare plans.
Response
string
Unique project identifier
string
Project title (usually the filename)
string
Thumbnail URL for the project
number
Duration in seconds that will be billed to your account
string
Current processing status
processing- Audio is being transcribedcompleted- Transcription has been generated successfullyfailed- Processing failed due to an error
string
Type of project (always “transcription” for this endpoint)
string
Source of the video content
Upload- Uploaded fileYoutube- YouTube URLGeneric- External URL
string
Primary language of the video content
boolean
Whether transcription will be translated
array
Array of languages for translation
string
Script format for transcription (“native” or “roman”)
object
Video file metadata including duration, resolution, format, etc.
object
Project URLs and assets (populated when processing completes). Includes the word-level
transcription JSON plus transcription files in multiple formats: SRT, VTT, CSV, and TXT.integer
Unix timestamp when the project was created
integer
Unix timestamp when the project was last updated
Example Request
curl -X POST "https://public.reap.video/api/v1/automation/create-transcription" \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"uploadId": "65f1a2b3c4d5e6f7a8b9c0d1",
"language": "en",
"transcriptionScript": "native"
}'
curl -X POST "https://public.reap.video/api/v1/automation/create-transcription" \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"sourceUrl": "https://www.youtube.com/watch?v=dQw4w9WgXcQ",
"language": "en"
}'
const response = await fetch('https://public.reap.video/api/v1/automation/create-transcription', {
method: 'POST',
headers: {
'Authorization': 'Bearer YOUR_API_KEY',
'Content-Type': 'application/json'
},
body: JSON.stringify({
uploadId: '65f1a2b3c4d5e6f7a8b9c0d1',
language: 'en',
transcriptionScript: 'native'
})
});
const project = await response.json();
console.log('Transcription project created:', project.id);
import requests
headers = {
'Authorization': 'Bearer YOUR_API_KEY',
'Content-Type': 'application/json'
}
data = {
'uploadId': '65f1a2b3c4d5e6f7a8b9c0d1',
'language': 'en',
'transcriptionScript': 'native'
}
response = requests.post(
'https://public.reap.video/api/v1/automation/create-transcription',
headers=headers,
json=data
)
project = response.json()
print(f'Transcription project created: {project["id"]}')
<?php
$data = [
'uploadId' => '65f1a2b3c4d5e6f7a8b9c0d1',
'language' => 'en',
'transcriptionScript' => 'native'
];
$ch = curl_init('https://public.reap.video/api/v1/automation/create-transcription');
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($data));
curl_setopt($ch, CURLOPT_HTTPHEADER, [
'Authorization: Bearer YOUR_API_KEY',
'Content-Type: application/json'
]);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$response = curl_exec($ch);
curl_close($ch);
$project = json_decode($response, true);
echo 'Transcription project created: ' . $project['id'] . "\n";
?>
package main
import (
"bytes"
"encoding/json"
"fmt"
"io/ioutil"
"net/http"
)
func main() {
url := "https://public.reap.video/api/v1/automation/create-transcription"
data := map[string]interface{}{
"uploadId": "65f1a2b3c4d5e6f7a8b9c0d1",
"language": "en",
"transcriptionScript": "native",
}
payload, _ := json.Marshal(data)
req, _ := http.NewRequest("POST", url, bytes.NewBuffer(payload))
req.Header.Set("Authorization", "Bearer YOUR_API_KEY")
req.Header.Set("Content-Type", "application/json")
client := &http.Client{}
resp, _ := client.Do(req)
defer resp.Body.Close()
body, _ := ioutil.ReadAll(resp.Body)
fmt.Println(string(body))
}
import java.io.*;
import java.net.HttpURLConnection;
import java.net.URL;
public class CreateTranscriptionExample {
public static void main(String[] args) throws Exception {
URL url = new URL("https://public.reap.video/api/v1/automation/create-transcription");
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
conn.setRequestMethod("POST");
conn.setRequestProperty("Authorization", "Bearer YOUR_API_KEY");
conn.setRequestProperty("Content-Type", "application/json");
conn.setDoOutput(true);
String jsonInputString = "{" +
"\"uploadId\": \"65f1a2b3c4d5e6f7a8b9c0d1\"," +
"\"language\": \"en\"," +
"\"transcriptionScript\": \"native\"}";
try(OutputStream os = conn.getOutputStream()) {
byte[] input = jsonInputString.getBytes("utf-8");
os.write(input, 0, input.length);
}
BufferedReader br = new BufferedReader(new InputStreamReader(conn.getInputStream(), "utf-8"));
StringBuilder response = new StringBuilder();
String responseLine;
while ((responseLine = br.readLine()) != null) {
response.append(responseLine.trim());
}
System.out.println("Transcription project: " + response.toString());
}
}
Example Response
Processing Workflow
- Audio Extraction - Audio is extracted from the video file
- Speech Recognition - AI transcribes the speech with word-level timing
- Translation - If a translation language is specified, the transcription is translated
- Format Generation - Output is generated in multiple formats (SRT, VTT, CSV, TXT)
- Completion - Use Get Project Status to monitor progress
Output Formats
When transcription completes, theurls object in Get Project Details includes:
| Format | Field | Description |
|---|---|---|
| JSON | transcription | Word-level transcript with timestamps (the translated version when translation ran) |
| SRT | transcription_srt | SubRip subtitle format |
| VTT | transcription_vtt | WebVTT subtitle format |
| CSV | transcription_csv | Comma-separated values |
| TXT | transcription_txt | Plain text transcript |
| Audio | audioFile | Extracted audio file |
The
transcription_srt/vtt/csv/txt exports are only generated for transcription projects. The word-level transcription JSON is available on every project type.Best Practices
- Audio Quality: Clear audio with minimal background noise produces more accurate results
- Language Selection: Specify the language explicitly for better transcription accuracy
- Script Format: Use “roman” for romanized output of non-Latin script languages
- Translation: Combine with
translationLanguageto get translated transcriptions
Use Cases
Content Indexing
Generate searchable text from video libraries at scale
Subtitle Generation
Create SRT/VTT files for video players and platforms
Meeting Notes
Transcribe recorded meetings and webinars
Accessibility
Make video content accessible with accurate transcriptions
Next Steps
After creating a transcription project:- Monitor progress with Get Project Status
- Retrieve the full project with transcription URLs via Get Project Details
- Download transcription files in your preferred format
Authorizations
Bearer authentication header of the form Bearer <token>, where <token> is your auth token.
Body
application/json
URL to a video or audio file (alternative to uploadId)
Upload ID from a previously uploaded file (alternative to sourceUrl)
Primary language of the video content (auto-detected if not provided)
Language to translate the transcription to
Script format for transcription output
Available options:
native, roman Response
200 - application/json
Successful response
Available options:
queued, prepped, draft, processing, finalizing, completed, invalid, expired, failed, error Available options:
clipping, captions, reframe, dubbing, transcription Available options:
Upload, Youtube, Vimeo, TwitchVod, Twitter, RumbleEmbed, Generic Available options:
talking, screenshare, gaming Available options:
landscape, portrait, square Available options:
native, roman Show child attributes
Show child attributes
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.
Show child attributes
Show child attributes
Was this page helpful?