API: Catalog
Series
Section titled “Series”Controller: admin-series.controller.ts: mount admin/series.
| Method | Path | Perm | Purpose |
|---|---|---|---|
| GET | /admin/series | catalog:read | List series (paginated, filterable). |
| GET | /admin/series/:id | catalog:read | Series detail incl. episodes count, media links. |
| POST | /admin/series | catalog:write | Create a series (draft). |
| PUT | /admin/series/:id | catalog:write | Update metadata / localization / pricing. |
| DELETE | /admin/series/:id | catalog:delete | Delete (two-person via approvals). |
| PUT | /admin/series/:id/media | catalog:write | Attach poster / hero / trailer asset ids. |
List query params
Section titled “List query params”| Param | Type | Notes |
|---|---|---|
q | string | Search title/slug/synopsis. |
status | draft / in_review / scheduled / published / archived | |
genre | string (slug) | |
language | en / ar / id | |
market | ISO-2 | |
sort, order, cursor, limit | standard |
Create request (partial)
Section titled “Create request (partial)”{ "titleEn": "The Villain's Wife", "slug": "the-villains-wife", "synopsisEn": "A woman marries the empire's most feared general...", "genres": ["romance", "historical"], "tropes": ["arranged-marriage", "enemies-to-lovers"], "maturity": "teen", "marketAvailability": ["EG", "SA", "AE"], "priceCoins": 30, "freeEpisodeCount": 3}Episodes (nested under series)
Section titled “Episodes (nested under series)”Controller: admin-episodes.controller.ts: mount admin/series/:seriesId/episodes.
| Method | Path | Perm |
|---|---|---|
| GET | /admin/series/:seriesId/episodes | catalog:read |
| GET | /admin/series/:seriesId/episodes/:epId | catalog:read |
| POST | /admin/series/:seriesId/episodes | catalog:write |
| PUT | /admin/series/:seriesId/episodes/:epId | catalog:write |
| DELETE | /admin/series/:seriesId/episodes/:epId | catalog:delete |
Body includes: episodeNumber, titleI18n, synopsisI18n, cliffhangerScore, priceCoinsOverride, mediaAssetId, thumbAssetId.
Genres
Section titled “Genres”Controller: admin-catalog.controllers.ts: mount admin/genres.
| Method | Path | Perm |
|---|---|---|
| GET | /admin/genres | catalog:read |
| POST | /admin/genres | catalog:write |
| PUT | /admin/genres/:id | catalog:write |
| DELETE | /admin/genres/:id | catalog:delete |
Tropes
Section titled “Tropes”Mount admin/tropes. Same shape as genres.
| Method | Path | Perm |
|---|---|---|
| GET | /admin/tropes | catalog:read |
| POST | /admin/tropes | catalog:write |
| PUT | /admin/tropes/:id | catalog:write |
| DELETE | /admin/tropes/:id | catalog:delete |
Mount admin/cast.
| Method | Path | Perm |
|---|---|---|
| GET | /admin/cast | catalog:read |
| GET | /admin/cast/:id | catalog:read |
| POST | /admin/cast | catalog:write |
| PUT | /admin/cast/:id | catalog:write |
| DELETE | /admin/cast/:id | catalog:delete |
Series cast (join)
Section titled “Series cast (join)”Mount admin/series/:seriesId/cast.
| Method | Path | Perm | Notes |
|---|---|---|---|
| GET | /admin/series/:seriesId/cast | catalog:read | List cast attached to series. |
| PUT | /admin/series/:seriesId/cast | catalog:write | Full replace: pass complete array of {castId, role, characterName, sort}. |