GraphQL API

Catalog

Query features, series, episodes, seasons, streams, and miniseries from the Rad TV GraphQL catalog using Relay connections.

Build browse and discovery experiences. The Rad TV catalog gives you access to all published content — features (standalone videos), series with episodes, streams, and more. Every item supports likes and comments out of the box.

List fields return Relay connections (edgesnode). See Pagination for the connection shape and arguments (first, after, last, before).

Content Type Hierarchy

Channel
├── Feature          (standalone feature-length content)
├── Serie
│   └── Season
│       └── Episode
├── Miniseries
│   └── Episode
└── Stream           (playable stream)

Queries

Every catalog type has a single-item query and a paginated connection query:

QueryReturnsAuth Required
feature(id: DID!)FeatureYes
features(first, after, last, before)FeatureConnection!Yes
serie(id: DID!)SerieYes
series(first, after, last, before)SerieConnection!Yes
season(id: DID!)SeasonYes
seasons(first, after, last, before)SeasonConnection!Yes
episode(id: DID!)EpisodeYes
episodes(first, after, last, before)EpisodeConnection!Yes
miniserie(id: DID!)MiniseriesYes
miniseries(first, after, last, before)MiniseriesConnection!Yes
stream(id: DID!)StreamYes
streams(first, after, last, before)StreamConnection!Yes

Single-item queries return null when the resource is not found or not accessible.

Features

The most common content type — standalone feature-length videos.

curl -X POST https://api.rad.live/graphql \
  -H "Content-Type: application/json" \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -d '{
    "query": "{ features(first: 10) { totalCount edges { node { id metadata { title summary keywords } assets { videos { url width height duration } images { url purpose } } likes { count isLiked } commentCount } } pageInfo { hasNextPage endCursor } } }"
  }'
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: `{
      features(first: 10) {
        totalCount
        edges {
          node {
            id
            metadata { title summary keywords }
            assets {
              videos { url width height duration }
              images { url purpose }
            }
            likes { count isLiked }
            commentCount
          }
        }
        pageInfo { hasNextPage endCursor }
      }
    }`,
  }),
});
response = requests.post(
    "https://api.rad.live/graphql",
    headers={
        "Content-Type": "application/json",
        "Authorization": "Bearer YOUR_API_KEY",
    },
    json={
        "query": """
        {
          features(first: 10) {
            totalCount
            edges {
              node {
                id
                metadata { title summary keywords }
                assets {
                  videos { url width height duration }
                  images { url purpose }
                }
                likes { count isLiked }
                commentCount
              }
            }
            pageInfo { hasNextPage endCursor }
          }
        }
        """
    },
)

Episodes

Episodes belong to a season or miniseries:

{
  episode(id: "did:rad.live:content/episode/789") {
    id
    metadata {
      title
      number
      duration
      rating { system code label }
      isPremiere
      isFinale
    }
    associatedSeason { id metadata { title } }
    associatedMiniseries { id metadata { title } }
    likes { count isLiked }
  }
}

Series and Seasons

{
  serie(id: "did:rad.live:content/serie/101") {
    id
    metadata { title summary }
    assets { images { url purpose } }
  }
}
{
  season(id: "did:rad.live:content/season/202") {
    id
    metadata { title number }
  }
}

Streams

{
  streams(first: 5) {
    edges {
      node {
        id
        metadata { title type acl }
        assets { videos { url } }
        likes { count }
      }
    }
  }
}

Channel Content

Query a channel's catalog using nested connection fields. Select fields on each node:

{
  channel(id: "did:rad.live:channel/abc") {
    features(first: 10) {
      edges { node { id metadata { title } } }
    }
    series(first: 5) {
      edges { node { id metadata { title } } }
    }
    episodes(first: 20) {
      edges { node { id metadata { title number } } }
    }
    streams(first: 5) {
      edges { node { id metadata { title } } }
    }
  }
}

Shared Fields

All catalog types share these fields via interfaces:

FieldTypeSourceDescription
idDID!Decentralized identifier
createdAtDateTimeCreation timestamp
metadata*MetadataType-specific metadata
assetsMediaAssets!Videos and images
likesContentLikes!LikeableLike count and user status
commentCountInt!CommentableNumber of comments
isCommentedBoolean!CommentableWhether user has commented
comments(first, after, last, before)CommentConnection!CommentablePaginated comments
structuredDataJSONSchema.org SEO markup

On this page