Recommendations API
Request currently trending content, ranked from highest trending score to lowest. Send one ContentType per call: Story or Moment.
Endpoint
GET https://blazefeed.clipro.tv/v1/recommendations/trending
The token is sent as a query parameter. It's the Feed Key, which is different from the app API key. If you don't have one, ask your WSC Sports account manager.
https://blazefeed.clipro.tv/v1/recommendations/trending?ContentType=Moment&ApiKey={MyToken}
Treat feed URLs as credentials. The key travels in the URL, so it can appear in server logs, browser history, and CDN logs. Call the feed from your server, not from a browser.
Rate limit:
- Limit: 50 requests per 60 seconds per content type, per app
- Feed keys: all keys for the same app share the limit
- Successful responses: no quota headers.
Parameters
| Parameter | Type | Required | Description |
|---|---|---|---|
ApiKey | string | Yes | API token |
ContentType | string | Yes | The content type to return trending content for. One value per call. Story or Moment |
Geo | string | No | Return content trending in this country (ISO 3166 two-letter code). Send gb, not GB. Omit for globally trending content |
Trending isn't available for Videos. Requesting ContentType=Video returns 400 Bad Request.
This endpoint doesn't support paging. It returns the current trending set for the content type you request.
Response
The response has two fields.
| Field | Type | Description |
|---|---|---|
lastUpdated | string (datetime) | When the newest item in the trending set was created. null when recommendations is empty |
recommendations | array of objects | The trending content, ordered from the highest trending score to the lowest. Up to 100 items. Empty when there's nothing to return |
Each entry in recommendations uses the same content model as the rest of the API. For the field-by-field breakdown, see Response principles, Response: Stories, and Response: Moments.
Example JSON - doesn't contain all properties
{
"lastUpdated": "2026-09-03T09:02:41Z",
"recommendations": [
{
"type": "Moment",
"id": "6a92fa1ee363eba308515c63",
"title": "Late header seals the win",
"description": "",
"subtitle": "",
"version": 0,
"aspectRatios": [
"Vertical"
],
"status": "Active",
"duration": 14,
"createTime": "2026-08-29T15:26:22.95Z",
"updateTime": "2026-08-29T21:34:17.801Z",
"thumbnails": [
{
"url": "https://cdn.example.com/games/UUID_VerticalTwoByThree.jpg",
"aspectRatio": "TwoToThree"
},
{
"url": "https://cdn.example.com/games/UUID.gif",
"aspectRatio": "Vertical"
}
],
"metadata": {
"competition": {
"provider": null,
"providerId": null,
"wscId": 51282
}
},
"labels": [
{
"title": "Goals",
"identifier": "goals"
}
],
"defaultLanguage": "en",
"translatedTitles": {
"en": "Late header seals the win",
"es": "Un cabezazo tardío sella la victoria"
},
"competitionId": "51282"
}
]
}The recommendations array holds the content type you requested, so a Moment request returns Moment objects and a Story request returns Story objects.
The response order carries the ranking. Trending scores themselves aren't included, and no field marks an individual item as trending.
When an experiment is running, only the main active configuration counts toward trending status.
An empty response
A successful call can return nothing:
{
"lastUpdated": null,
"recommendations": []
}This is a 200, not an error, and it means either trending isn't enabled for what you asked for, or it is and there's no trending content at the moment. The response doesn't distinguish the two.
Trending is enabled per app and per content type, so an app can return Moments and nothing for Stories. Whether it's enabled at all also depends on how the app's recommendations are set up, which is configured on the WSC Sports side.
If you get an empty result and expect content, ask your WSC Sports account manager to confirm trending is enabled for that app and content type.
Example calls
Fetch trending Moments
const fetchTrending = async (apiKey, contentType) => {
const response = await fetch(`https://blazefeed.clipro.tv/v1/recommendations/trending?ContentType=${contentType}&ApiKey=${apiKey}`);
if (!response.ok) {
throw new Error(`HTTP error! Status: ${response.status}`);
}
return await response.json();
};Check whether specific content is trending
Because the ranking is the response order, one call tells you both whether content is trending and where it sits relative to everything else. Build your catalog from the content type endpoints, then check membership at the point where you use the result.
const getTrendingRank = async (apiKey, contentType, contentId) => {
const { recommendations } = await fetchTrending(apiKey, contentType);
const rank = recommendations.findIndex(item => item.id === contentId);
return rank === -1 ? null : rank + 1;
};Call the endpoint when you need the result, rather than caching the trending set alongside your catalog. Trending changes on its own schedule, and lastUpdated tells you when it last did.
HTTP return messages
| Status code | Meaning |
|---|---|
200 OK | Request successful |
400 Bad Request | Missing or unsupported ContentType, or an invalid Geo country code |
401 Unauthorized | Missing, invalid, or inactive API key |
429 Too Many Requests | Rate limit exceeded. Includes Retry-After (seconds) and a plain-text body |
500 Internal Server Error | Server error |
Updated about 1 month ago
