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 to block until the job finishes.
{
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 the dashboard or waitForProcessing for transcode job status, and read outputAssets from the Content returned by a content mutation (see Output Assets).
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 deployed }
error
}
}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