Content catalog API
Call the Catalog pull API with the base URL, authentication, endpoints, paging, rate limits, and HTTP status codes below. Filtering is on Filters. Response fields are on Response principles.
API facts
| Item | Value |
|---|---|
| Base URL | https://blazefeed.clipro.tv/v1/{endpoint} |
| Authentication | API key sent as a query parameter: ?ApiKey={YourToken}. If you don't have a token, ask your WSC Sports account manager. This token is different from the Experiences app API key |
| Method | GET |
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.
Endpoints
Content types are segregated by endpoint.
| Content type | Filtered content list | Content by ID |
|---|---|---|
| Stories | /stories | /stories/ids |
| Moments | /moments | /moments/ids |
| Videos | /videos | /videos/ids |
Recommendations is a separate option. You request currently trending content with ContentType (Story or Moment), not from your catalog. See Recommendations.
Example URL
https://blazefeed.clipro.tv/v1/stories?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.
Paging
| Parameter | Type | Required | Description |
|---|---|---|---|
PageNum | integer | No | Page index, starting at 0. Defaults to 0 |
PageSize | integer | No | Number of results per page. Defaults to 50. PageSize=0 returns no items and totalItems: 0, so you cannot use it to obtain a count. |
ContentIds | array of strings | Yes for /ids endpoints | IDs to fetch on the /ids endpoints. Send one or many, separated by commas. |
Results are sorted most-recently-updated first. A deep walk can repeat or miss items if content updates mid-walk. Pull incrementally with UpdateTime.From and deduplicate by id. totalItems is the total matching your query, not the size of the current page.
Fetching by ID
The /ids endpoints take ContentIds and paging only. Any content filter you send with them is accepted and then ignored: you receive a 200 with unfiltered results, not an error. Filter on the list endpoints, then fetch by ID.
Example calls
Fetch all Stories
const fetchStories = async (apiKey, pageNum = 0, pageSize = 50) => {
const response = await fetch(`https://blazefeed.clipro.tv/v1/stories?PageNum=${pageNum}&PageSize=${pageSize}&ApiKey=${apiKey}`);
if (!response.ok) {
throw new Error(`HTTP error! Status: ${response.status}`);
}
return await response.json();
};Fetch videos by ID
const fetchVideosByIds = async (apiKey, contentIds) => {
const idsParam = contentIds.map(id => `ContentIds=${encodeURIComponent(id)}`).join('&');
const url = `https://blazefeed.clipro.tv/v1/videos/ids?${idsParam}&ApiKey=${apiKey}`;
const response = await fetch(url);
if (!response.ok) {
throw new Error(`HTTP error! Status: ${response.status}`);
}
return await response.json();
};HTTP return messages
The API returns the following codes.
| Status code | Meaning |
|---|---|
200 OK | Request successful |
400 Bad Request | Invalid request parameters |
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 15 days ago
