curl --request POST \
--url https://api.framelane.io/v1/tasks/transcribe \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"source_url": "<string>",
"metadata": {
"project_id": "proj_123"
},
"webhook_url": "https://app.example.com/hooks/framelane",
"language": "<string>",
"speech_model": "universal-2",
"word_timings": true,
"speaker_labels": false,
"speakers_expected": 5,
"sentiment_analysis": false,
"entity_detection": false,
"auto_highlights": false,
"content_safety": false,
"iab_categories": false,
"word_boost": [
"<string>"
]
}
'import requests
url = "https://api.framelane.io/v1/tasks/transcribe"
payload = {
"source_url": "<string>",
"metadata": { "project_id": "proj_123" },
"webhook_url": "https://app.example.com/hooks/framelane",
"language": "<string>",
"speech_model": "universal-2",
"word_timings": True,
"speaker_labels": False,
"speakers_expected": 5,
"sentiment_analysis": False,
"entity_detection": False,
"auto_highlights": False,
"content_safety": False,
"iab_categories": False,
"word_boost": ["<string>"]
}
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({
source_url: '<string>',
metadata: {project_id: 'proj_123'},
webhook_url: 'https://app.example.com/hooks/framelane',
language: '<string>',
speech_model: 'universal-2',
word_timings: true,
speaker_labels: false,
speakers_expected: 5,
sentiment_analysis: false,
entity_detection: false,
auto_highlights: false,
content_safety: false,
iab_categories: false,
word_boost: ['<string>']
})
};
fetch('https://api.framelane.io/v1/tasks/transcribe', 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://api.framelane.io/v1/tasks/transcribe",
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([
'source_url' => '<string>',
'metadata' => [
'project_id' => 'proj_123'
],
'webhook_url' => 'https://app.example.com/hooks/framelane',
'language' => '<string>',
'speech_model' => 'universal-2',
'word_timings' => true,
'speaker_labels' => false,
'speakers_expected' => 5,
'sentiment_analysis' => false,
'entity_detection' => false,
'auto_highlights' => false,
'content_safety' => false,
'iab_categories' => false,
'word_boost' => [
'<string>'
]
]),
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://api.framelane.io/v1/tasks/transcribe"
payload := strings.NewReader("{\n \"source_url\": \"<string>\",\n \"metadata\": {\n \"project_id\": \"proj_123\"\n },\n \"webhook_url\": \"https://app.example.com/hooks/framelane\",\n \"language\": \"<string>\",\n \"speech_model\": \"universal-2\",\n \"word_timings\": true,\n \"speaker_labels\": false,\n \"speakers_expected\": 5,\n \"sentiment_analysis\": false,\n \"entity_detection\": false,\n \"auto_highlights\": false,\n \"content_safety\": false,\n \"iab_categories\": false,\n \"word_boost\": [\n \"<string>\"\n ]\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://api.framelane.io/v1/tasks/transcribe")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"source_url\": \"<string>\",\n \"metadata\": {\n \"project_id\": \"proj_123\"\n },\n \"webhook_url\": \"https://app.example.com/hooks/framelane\",\n \"language\": \"<string>\",\n \"speech_model\": \"universal-2\",\n \"word_timings\": true,\n \"speaker_labels\": false,\n \"speakers_expected\": 5,\n \"sentiment_analysis\": false,\n \"entity_detection\": false,\n \"auto_highlights\": false,\n \"content_safety\": false,\n \"iab_categories\": false,\n \"word_boost\": [\n \"<string>\"\n ]\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.framelane.io/v1/tasks/transcribe")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"source_url\": \"<string>\",\n \"metadata\": {\n \"project_id\": \"proj_123\"\n },\n \"webhook_url\": \"https://app.example.com/hooks/framelane\",\n \"language\": \"<string>\",\n \"speech_model\": \"universal-2\",\n \"word_timings\": true,\n \"speaker_labels\": false,\n \"speakers_expected\": 5,\n \"sentiment_analysis\": false,\n \"entity_detection\": false,\n \"auto_highlights\": false,\n \"content_safety\": false,\n \"iab_categories\": false,\n \"word_boost\": [\n \"<string>\"\n ]\n}"
response = http.request(request)
puts response.read_body{
"id": "render_01J8QR2K5VKDGN2T4FBM3CZYX7",
"kind": "render",
"workspace_id": "ws_01J8QR2K5VKDGN2T4FBM3CZYX8",
"status": "queued",
"created_at": "2023-11-07T05:31:56Z",
"updated_at": "2023-11-07T05:31:56Z",
"is_preview": false,
"task_type": "transcribe",
"progress_percent": 0,
"progress_stage": "compositing",
"output": {
"url": "https://cdn-user.framelane.io/render_01J.../output.mp4",
"width": 1920,
"height": 1080,
"duration": 15.3,
"size_bytes": 12582912
},
"result": {
"language_code": "en",
"text": "Welcome back to the show."
},
"error": {
"code": "invalid_source",
"message": "Source URL returned 404."
},
"metadata": {
"project_id": "proj_123",
"user_ref": "usr_abc"
},
"completed_at": "2023-11-07T05:31:56Z"
}{
"id": "render_01J8QR2K5VKDGN2T4FBM3CZYX7",
"kind": "render",
"workspace_id": "ws_01J8QR2K5VKDGN2T4FBM3CZYX8",
"status": "queued",
"created_at": "2023-11-07T05:31:56Z",
"updated_at": "2023-11-07T05:31:56Z",
"is_preview": false,
"task_type": "transcribe",
"progress_percent": 0,
"progress_stage": "compositing",
"output": {
"url": "https://cdn-user.framelane.io/render_01J.../output.mp4",
"width": 1920,
"height": 1080,
"duration": 15.3,
"size_bytes": 12582912
},
"result": {
"language_code": "en",
"text": "Welcome back to the show."
},
"error": {
"code": "invalid_source",
"message": "Source URL returned 404."
},
"metadata": {
"project_id": "proj_123",
"user_ref": "usr_abc"
},
"completed_at": "2023-11-07T05:31:56Z"
}{
"error": {
"code": "invalid_request",
"message": "<string>",
"details": {}
}
}{
"error": {
"code": "invalid_request",
"message": "<string>",
"details": {}
}
}{
"error": {
"code": "invalid_request",
"message": "<string>",
"details": {}
}
}Transcribe task
curl --request POST \
--url https://api.framelane.io/v1/tasks/transcribe \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"source_url": "<string>",
"metadata": {
"project_id": "proj_123"
},
"webhook_url": "https://app.example.com/hooks/framelane",
"language": "<string>",
"speech_model": "universal-2",
"word_timings": true,
"speaker_labels": false,
"speakers_expected": 5,
"sentiment_analysis": false,
"entity_detection": false,
"auto_highlights": false,
"content_safety": false,
"iab_categories": false,
"word_boost": [
"<string>"
]
}
'import requests
url = "https://api.framelane.io/v1/tasks/transcribe"
payload = {
"source_url": "<string>",
"metadata": { "project_id": "proj_123" },
"webhook_url": "https://app.example.com/hooks/framelane",
"language": "<string>",
"speech_model": "universal-2",
"word_timings": True,
"speaker_labels": False,
"speakers_expected": 5,
"sentiment_analysis": False,
"entity_detection": False,
"auto_highlights": False,
"content_safety": False,
"iab_categories": False,
"word_boost": ["<string>"]
}
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({
source_url: '<string>',
metadata: {project_id: 'proj_123'},
webhook_url: 'https://app.example.com/hooks/framelane',
language: '<string>',
speech_model: 'universal-2',
word_timings: true,
speaker_labels: false,
speakers_expected: 5,
sentiment_analysis: false,
entity_detection: false,
auto_highlights: false,
content_safety: false,
iab_categories: false,
word_boost: ['<string>']
})
};
fetch('https://api.framelane.io/v1/tasks/transcribe', 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://api.framelane.io/v1/tasks/transcribe",
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([
'source_url' => '<string>',
'metadata' => [
'project_id' => 'proj_123'
],
'webhook_url' => 'https://app.example.com/hooks/framelane',
'language' => '<string>',
'speech_model' => 'universal-2',
'word_timings' => true,
'speaker_labels' => false,
'speakers_expected' => 5,
'sentiment_analysis' => false,
'entity_detection' => false,
'auto_highlights' => false,
'content_safety' => false,
'iab_categories' => false,
'word_boost' => [
'<string>'
]
]),
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://api.framelane.io/v1/tasks/transcribe"
payload := strings.NewReader("{\n \"source_url\": \"<string>\",\n \"metadata\": {\n \"project_id\": \"proj_123\"\n },\n \"webhook_url\": \"https://app.example.com/hooks/framelane\",\n \"language\": \"<string>\",\n \"speech_model\": \"universal-2\",\n \"word_timings\": true,\n \"speaker_labels\": false,\n \"speakers_expected\": 5,\n \"sentiment_analysis\": false,\n \"entity_detection\": false,\n \"auto_highlights\": false,\n \"content_safety\": false,\n \"iab_categories\": false,\n \"word_boost\": [\n \"<string>\"\n ]\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://api.framelane.io/v1/tasks/transcribe")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"source_url\": \"<string>\",\n \"metadata\": {\n \"project_id\": \"proj_123\"\n },\n \"webhook_url\": \"https://app.example.com/hooks/framelane\",\n \"language\": \"<string>\",\n \"speech_model\": \"universal-2\",\n \"word_timings\": true,\n \"speaker_labels\": false,\n \"speakers_expected\": 5,\n \"sentiment_analysis\": false,\n \"entity_detection\": false,\n \"auto_highlights\": false,\n \"content_safety\": false,\n \"iab_categories\": false,\n \"word_boost\": [\n \"<string>\"\n ]\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.framelane.io/v1/tasks/transcribe")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"source_url\": \"<string>\",\n \"metadata\": {\n \"project_id\": \"proj_123\"\n },\n \"webhook_url\": \"https://app.example.com/hooks/framelane\",\n \"language\": \"<string>\",\n \"speech_model\": \"universal-2\",\n \"word_timings\": true,\n \"speaker_labels\": false,\n \"speakers_expected\": 5,\n \"sentiment_analysis\": false,\n \"entity_detection\": false,\n \"auto_highlights\": false,\n \"content_safety\": false,\n \"iab_categories\": false,\n \"word_boost\": [\n \"<string>\"\n ]\n}"
response = http.request(request)
puts response.read_body{
"id": "render_01J8QR2K5VKDGN2T4FBM3CZYX7",
"kind": "render",
"workspace_id": "ws_01J8QR2K5VKDGN2T4FBM3CZYX8",
"status": "queued",
"created_at": "2023-11-07T05:31:56Z",
"updated_at": "2023-11-07T05:31:56Z",
"is_preview": false,
"task_type": "transcribe",
"progress_percent": 0,
"progress_stage": "compositing",
"output": {
"url": "https://cdn-user.framelane.io/render_01J.../output.mp4",
"width": 1920,
"height": 1080,
"duration": 15.3,
"size_bytes": 12582912
},
"result": {
"language_code": "en",
"text": "Welcome back to the show."
},
"error": {
"code": "invalid_source",
"message": "Source URL returned 404."
},
"metadata": {
"project_id": "proj_123",
"user_ref": "usr_abc"
},
"completed_at": "2023-11-07T05:31:56Z"
}{
"id": "render_01J8QR2K5VKDGN2T4FBM3CZYX7",
"kind": "render",
"workspace_id": "ws_01J8QR2K5VKDGN2T4FBM3CZYX8",
"status": "queued",
"created_at": "2023-11-07T05:31:56Z",
"updated_at": "2023-11-07T05:31:56Z",
"is_preview": false,
"task_type": "transcribe",
"progress_percent": 0,
"progress_stage": "compositing",
"output": {
"url": "https://cdn-user.framelane.io/render_01J.../output.mp4",
"width": 1920,
"height": 1080,
"duration": 15.3,
"size_bytes": 12582912
},
"result": {
"language_code": "en",
"text": "Welcome back to the show."
},
"error": {
"code": "invalid_source",
"message": "Source URL returned 404."
},
"metadata": {
"project_id": "proj_123",
"user_ref": "usr_abc"
},
"completed_at": "2023-11-07T05:31:56Z"
}{
"error": {
"code": "invalid_request",
"message": "<string>",
"details": {}
}
}{
"error": {
"code": "invalid_request",
"message": "<string>",
"details": {}
}
}{
"error": {
"code": "invalid_request",
"message": "<string>",
"details": {}
}
}Authorizations
Bearer authentication header of the form Bearer <token>, where <token> is your auth token.
Headers
Body
1 - 2083Arbitrary key-value pairs echoed back in all webhook payloads.
Show child attributes
Show child attributes
{ "project_id": "proj_123" }
Per-request webhook URL. Overrides workspace-level webhooks for this job only. Receives task.completed, task.failed, and progress events.
1 - 2083"https://app.example.com/hooks/framelane"
BCP-47 language code (e.g. 'en'). Auto-detected when omitted.
AssemblyAI speech model to use.
universal-2, universal-3-pro, nano Include word-level timestamps in the output.
Enable speaker diarisation (who spoke when).
Hint for the expected number of speakers (used when speaker_labels=true).
1 <= x <= 10Detect positive / neutral / negative sentiment per sentence.
Identify named entities (people, organisations, places, etc.).
Extract the most important phrases automatically.
Flag sensitive content categories.
Classify content into IAB taxonomy topics.
Domain-specific terms to boost recognition accuracy (max 200).
Response
Idempotent replay.
A render job or AI task.
Unique job ID. Prefix indicates type: render_ or task_.
"render_01J8QR2K5VKDGN2T4FBM3CZYX7"
Whether this is a render or a task.
render, task "render"
ID of the workspace that owns this job.
"ws_01J8QR2K5VKDGN2T4FBM3CZYX8"
Current lifecycle state: queued → processing → completed / failed / cancelled.
ingesting, queued, processing, completed, failed, cancelled "queued"
ISO-8601 UTC timestamp when the job was created.
ISO-8601 UTC timestamp of the last status change.
True for a cheap preview render. Previews are not billed and are excluded from the renders list.
false
For task jobs only — the specific AI operation.
transcribe "transcribe"
0–100 progress indicator updated by the render engine.
0 <= x <= 1000
Current processing phase within a job.
downloading, compositing, encoding, uploading "compositing"
Populated once status == completed. Contains the signed artifact URL.
Show child attributes
Show child attributes
Structured JSON result for tasks that return data rather than a file — transcribe returns the transcript here (text, words, utterances, and any requested analysis). Populated once status == completed; null for renders and for any job whose only artifact is the file at output.url.
{
"language_code": "en",
"text": "Welcome back to the show."
}
Populated when status == failed. Contains a structured error code.
Show child attributes
Show child attributes
Caller-supplied key-value pairs echoed back on every webhook and response.
{
"project_id": "proj_123",
"user_ref": "usr_abc"
}
ISO-8601 UTC timestamp when the job reached a terminal state.

