GraphQL API
Content Management
Create, update, publish, and unpublish content on the Rad TV platform.
These mutations manage the content lifecycle — from creation through publication.
Create Content
curl -X POST https://api.rad.live/graphql \
-H "Content-Type: application/json" \
-H "Authorization: Bearer YOUR_API_KEY" \
-d '{
"query": "mutation($input: ContentInput!) { createContent(input: $input) { id metadata { title summary } } }",
"variables": {
"input": {
"metadata": {
"title": "My New Video",
"summary": "A description of my video",
"keywords": ["tech", "tutorial"],
"categories": [{"name": "Technology"}]
},
"hints": { "type": "FEATURE" }
}
}
}'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($input: ContentInput!) {
createContent(input: $input) {
id
metadata { title summary }
}
}
`,
variables: {
input: {
metadata: {
title: 'My New Video',
summary: 'A description of my video',
keywords: ['tech', 'tutorial'],
categories: [{ name: 'Technology' }],
},
hints: { type: 'FEATURE' },
},
},
}),
});
const { data } = await response.json();
const contentId = data.createContent.id; // did:rad.live:content/feature/...response = requests.post(
"https://api.rad.live/graphql",
headers={
"Content-Type": "application/json",
"Authorization": "Bearer YOUR_API_KEY",
},
json={
"query": """
mutation($input: ContentInput!) {
createContent(input: $input) {
id
metadata { title summary }
}
}
""",
"variables": {
"input": {
"metadata": {
"title": "My New Video",
"summary": "A description of my video",
"keywords": ["tech", "tutorial"],
"categories": [{"name": "Technology"}],
},
"hints": {"type": "FEATURE"},
}
},
},
)
content_id = response.json()["data"]["createContent"]["id"]ContentInput Fields
| Field | Type | Description |
|---|---|---|
metadata | ContentMetadataInput | Title, summary, genre, rating, keywords, categories |
hints | ContentHintInput | Content type and ad status |
ContentHintInput
| Field | Type | Values |
|---|---|---|
type | ContentType | FEATURE, LIVE, SERIES, EPISODE, SHORT, ANY |
containsAds | ContentAdHint | YES, NO, MAYBE |
ContentMetadataInput
| Field | Type | Description |
|---|---|---|
title | String | Content title |
summary | String | Description |
shortSummary | String | Brief tagline |
genre | String | Genre name |
rating | String | Rating code |
keywords | [String] | Search keywords |
categories | [CategoryInput] | Content categories |
Update Content
mutation {
updateContent(
id: "did:rad.live:content/feature/123"
input: {
metadata: {
title: "Updated Title"
summary: "Updated description"
}
}
) {
id
metadata { title summary }
}
}Publish Content
Make content publicly visible:
mutation {
publishContent(
id: "did:rad.live:content/feature/123"
releaseDate: "2025-03-20"
) {
id
metadata { title }
}
}| Argument | Type | Description |
|---|---|---|
id | DID! | Content identifier |
releaseDate | String | Optional scheduled release (ISO 8601). Converted to noon UTC for timezone stability. |
Unpublish Content
Revert content to protected (not publicly visible):
mutation {
unpublishContent(id: "did:rad.live:content/feature/123") {
id
}
}For the complete end-to-end workflow (create → upload → transcode → publish), see Publish to Rad or use the publishVideo compound mutation.