Skip to content

API: Curation

Controller: admin-curation.controllers.ts. Mount various curation resources.

Mount admin/collections.

MethodPathPerm
GET/admin/collectionscuration:read
GET/admin/collections/:idcuration:read
POST/admin/collectionscuration:write
PUT/admin/collections/:idcuration:write
DELETE/admin/collections/:idcuration:write
PUT/admin/collections/:id/itemscuration:write
{
"slug": "top-romance-ph",
"titleI18n": {
"en": "Top Romance in the Philippines",
"ar": "أفضل الرومانسية في الفلبين",
"id": "Romantis Teratas di Filipina"
},
"explanation": "Popular romance titles in the Philippines this week",
"type": "rule",
"rule": {
"genre": "romance",
"market": "PH",
"sort": "top_this_week",
"limit": 20,
"window_days": 7
}
}

For manual collections, set type: "manual" and omit rule; then use PUT /admin/collections/:id/items with { items: [{seriesId, sort}, ...] }.

Mount admin/rails.

MethodPathPerm
GET/admin/railscuration:read
POST/admin/railscuration:write
PUT/admin/rails/reordercuration:write
PUT/admin/rails/:idcuration:write
DELETE/admin/rails/:idcuration:write
{
"id": "0197...",
"surface": "for_you",
"collectionId": "0198...",
"sort": 3,
"status": "active"
}
{
"surface": "for_you",
"order": ["railId1", "railId2", "railId3"]
}

Mount admin/preview-reel.

MethodPathPerm
GET/admin/preview-reelcuration:read
PUT/admin/preview-reelcuration:write

PUT is a full-replace on the ordering. Body:

{
"entries": [
{ "seriesId": "0193a...", "editorialHeroScore": 95 },
{ "seriesId": "0193b...", "editorialHeroScore": 80 },
{ "seriesId": "0193c...", "editorialHeroScore": 65 }
]
}

Mount admin/free-series.

MethodPathPerm
GET/admin/free-seriescuration:read
PUT/admin/free-seriescuration:write
DELETE/admin/free-series/:datecuration:write
POST/admin/free-series/generate-autocuration:write
{
"date": "2026-08-01",
"seriesId": "0193...",
"marketCode": "PH",
"notes": "Filipino romance launch push"
}

date is UTC ISO-date. marketCode optional (null = all markets).

{
"days": 30,
"market": "PH"
}

Fills empty dates in the next N days using the heuristic. Non-empty dates are skipped.