Data Shapes
This page summarizes common structures so endpoint pages can stay focused.
Profile object
Section titled “Profile object”Returned by /profile.
Key fields:
username,displayUsername,nameimage,avatarUrl,bio,locationfavoriteGenres[],themeId,createdAtstatswithentryCount,reviewCount,filmCount,listCount,followerCount,followingCount
Top 4 payload
Section titled “Top 4 payload”Returned by /top4.
categoriesarray with category objects (id,key,supported,items)- Category keys are currently
cinemaandserial - Each item has
slot,mediaType,mediaSource,mediaSourceId,entityId,tmdbId,title,posterPath,releaseYear
Feed item (recent, activity)
Section titled “Feed item (recent, activity)”Both endpoints return FeedItem[].
{ "id": "activity-id", "type": "review", "kind": "review", "createdAt": "2026-01-10T12:00:00.000Z", "actor": { "id": "user-id", "username": "your_username", "displayUsername": null, "image": null, "avatarUrl": null }, "movie": null, "post": null, "review": null, "metadata": { "action": null, "excerpt": null, "targetUsername": null, "rating": null, "rewatch": null, "hasReview": null, "mediaType": null, "containsSpoilers": null, "reviewId": null, "commentId": null, "movieId": null, "postId": null, "postMediaId": null, "postMediaType": null, "seasonNumber": null, "episodeNumber": null, "listId": null, "listTitle": null }, "engagement": { "likeCount": 0, "commentCount": 0, "viewerHasLiked": null }}Feed item notes
Section titled “Feed item notes”viewerHasLikedis currentlynullin public feed responses (no viewer context is passed).- Depending on activity type,
movie,post, orreviewcan benull. kindmay be a derived value (for exampleliked_comment,liked_post,commented_post).seasonNumberandepisodeNumberare populated for season/episode interactions (liked_movie,review). Both arenullfor movie/series-level activities.- For
liked_movieactivities on seasons/episodes,metadata.ratingwill be non-null when the action was a rating (not a like);metadata.ratingisnullfor pure like actions. listIdandlistTitleare populated forcreated_listactivities; both arenullfor all other activity types.
Review row (/reviews)
Section titled “Review row (/reviews)”Key fields:
id,content,containsSpoilers,createdAt,updatedAt- media fields:
tmdbId,title,posterPath,releaseYear,mediaType - score field:
rating(0.5–10, ornull)
Interaction rows (/likes, /watchlist)
Section titled “Interaction rows (/likes, /watchlist)”Key fields:
tmdbId,title,posterPath,releaseYearruntime,genres,mediaTypelastInteractionAt
Note: /likes and /watchlist mix both movie and tv rows. /movies/watched uses this exact same row shape but is film-only. /serials/watched has a different, series-specific shape — see the Watched Serials payload section below.
List row (/lists)
Section titled “List row (/lists)”Key fields:
- list fields:
id,title,description,isRanked,createdAt,updatedAt,itemCount items[]entries:position,note,tmdbId,title,posterPath,releaseYear
Diary row (/diary)
Section titled “Diary row (/diary)”Key fields:
- diary fields:
id,mediaType,watchedDate,rewatch,createdAt,updatedAt - rating:
rating(0.5–10, ornull) mediaobject (tmdbId,title,posterPath,releaseYear)- optional
reviewobject (id,content,containsSpoilers,createdAt) ornull
Serials Progress payload (/serials/:tmdbId)
Section titled “Serials Progress payload (/serials/:tmdbId)”Key fields:
seriesbasic info:id,tmdbId,title,posterPath,numberOfSeasons,numberOfEpisodesnumberOfEpisodesexcludes season 0 (Specials) — only regular aired seasons are counted.
viewerTrackingprogress:watchedEpisodesCount: total count of watched episodes.watchedEpisodes[]list:{ seasonNumber, episodeNumber }mappings.currentEpisode(Up Next):{ seasonNumber, episodeNumber, name }ornullif series completed.- interaction aggregations:
ratingsCount,likesCount,reviewsCount.
seasons[]array list:seasonNumber,name,episodeCount, and season-levelviewerInteractionobject (watched,liked,rating,hasReview).
Currently Watching payload (/serials/currently-watching)
Section titled “Currently Watching payload (/serials/currently-watching)”An array of in-progress series, most recently watched first. Key fields per item:
- series info:
tmdbId,title,posterPath,backdropPath,firstAirYear,numberOfSeasons,numberOfEpisodesnumberOfEpisodesexcludes season 0 (Specials).
- progress:
watchedEpisodesCount,progressPercent(0–100, rounded) lastWatchedAt: timestamp of the most recently watched episode.currentEpisode(Up Next):{ seasonNumber, episodeNumber, name }, ornullif the cached episode total is behind TMDB’s true count.
Watched Movies payload (/movies/watched)
Section titled “Watched Movies payload (/movies/watched)”Same row shape as Interaction rows above, but film-only (mediaType is always "movie") and filtered to the movie interaction’s isWatched flag rather than liked/watchlisted.
Watched Serials payload (/serials/watched)
Section titled “Watched Serials payload (/serials/watched)”An array of fully watched series (mediaType always "tv"). Key fields per item:
- series info:
tmdbId,title,posterPath,backdropPath,firstAirYear,numberOfSeasons,numberOfEpisodes lastInteractionAt: when the series was marked watched (or last touched since).
No episode-level progress fields — this reflects the series-level isWatched flag only, not derived from per-episode completion. For per-episode detail on one series, use Serials Progress.