Transcoding
Submit content for processing and track transcode job status.
After uploading a video, submit it for transcoding to generate streaming manifests, downloads, thumbnails, and subtitles.
Submit for Processing
curl -X POST https://api.rad.live/graphql \
-H "Content-Type: application/json" \
-H "Authorization: Bearer YOUR_API_KEY" \
-d '{
"query": "mutation { submitContentForProcessing(id: \"did:rad.live:content/feature/123\", input: { assetName: \"video.mp4\", layout: LANDSCAPE, enhance: false }) { content { id } job { id status progress } } }"
}'const response = await fetch('https://api.rad.live/graphql', {
method: 'POST',
headers: {
'Content-Type': 'application/json',
'Authorization': 'Bearer YOUR_API_KEY',
},
body: JSON.stringify({
query: `
mutation {
submitContentForProcessing(
id: "did:rad.live:content/feature/123"
input: {
assetName: "video.mp4"
layout: LANDSCAPE
enhance: false
}
) {
content { id }
job { id status progress }
}
}
`,
}),
});
const { data } = await response.json();
console.log(data.submitContentForProcessing.job.status); // QUEUEDresponse = requests.post(
"https://api.rad.live/graphql",
headers={
"Content-Type": "application/json",
"Authorization": "Bearer YOUR_API_KEY",
},
json={
"query": """
mutation {
submitContentForProcessing(
id: "did:rad.live:content/feature/123"
input: {
assetName: "video.mp4"
layout: LANDSCAPE
enhance: false
}
) {
content { id }
job { id status progress }
}
}
"""
},
)
job = response.json()["data"]["submitContentForProcessing"]["job"]
print(job["status"]) # QUEUEDProcessingInput Fields
| Field | Type | Required | Description |
|---|---|---|---|
assetName | String! | Yes | Filename of the uploaded asset |
layout | ContentLayout | No | LANDSCAPE, PORTRAIT, or VR |
enhance | Boolean | No | Enable AI upscaling + audio upmixing (Creator+) |
TranscodeJob Status
| Status | Description |
|---|---|
IDLE | Created but not yet deployed |
QUEUED | Waiting in the processing queue |
TRANSCODING | Actively processing (check progress 0-100) |
COMPLETE | Finished — outputAssets available |
ERROR | Failed — check error details |
CANCELLED | Cancelled by user |
CANCELLING | Cancel in progress |
Status Lifecycle
IDLE → QUEUED → TRANSCODING → COMPLETE
→ ERROR
→ CANCELLEDPolling Job Status
transcodeJob and outputAssets live on the Content type, not on catalog Feature. Poll processing with channelDashboard (recent uploads include job status) or use waitForProcessing below for full Content fields when complete.
{
channelDashboard {
channel {
id
name
}
recentContent {
id
title
processingStatus
transcodeJob {
id
status
progress
}
}
}
}To list catalog titles with Relay pagination, use me { channel { features(first: 10) { edges { node { id metadata { title } convertJobId } } } } } } — convertJobId is the catalog link to processing; use dashboard or waitForProcessing for TranscodeJob and outputAssets.
Server-Side Waiting
Instead of client-side polling, use waitForProcessing:
mutation {
waitForProcessing(input: {
contentId: "did:rad.live:content/feature/123"
timeoutSeconds: 300
}) {
status
job { id status progress }
content { outputAssets { video { hls } } }
}
}This blocks server-side until the job completes, errors, or times out (default 300 seconds).
Encoder Types
| Encoder | When Used | Capabilities |
|---|---|---|
MEDIA_CONVERT | Standard processing | HLS, MP4, thumbnails, subtitles |
RAD_ENCODER | Creator+ or enhance: true | All standard outputs + AI upscaling + surround audio |
The encoder is selected automatically based on your subscription and the enhance flag.
transcodeJob and outputAssets on Content are null before processing starts. After submitContentForProcessing, transcodeJob becomes available. After processing completes, outputAssets becomes available.
Next steps
- Output Assets — What you get after transcoding
- AI Upscaling — Enhance with Real-ESRGAN
- Uploads — How to upload files before transcoding