Get Featured Creators
Public admin-curated featured creator list. Filtered by current time window (startsAt/endsAt) + creator active status. Ordered by admin-set position. CDN-cached 5min.
GET /api/v1/discover/featured โ ๐ Public ยท Rate limit: 60 req / minute ยท Kill-switched
Returns the admin-curated featured creator list. Reads FeaturedCreator rows where the current time falls inside the startsAt/endsAt window (open-ended on either side is allowed), then loads the matching CreatorProfile rows and filters out inactive / suspended / vacationing creators. Ordered by position ASC.
Admin-managed catalog. The featured list is curated via admin endpoints โ clients can't add/remove. Empty list = no current featured slots (or all currently-featured creators are inactive). Cap is 100 (server-side take: 100 on both queries).
Request
No body, no params, no headers required.
Response headers
| Header | Value |
|---|---|
Cache-Control | public, s-maxage=300, stale-while-revalidate=600 |
Response
200 OK โ ApiResponseOf<CreatorListDto>
{
"success": true,
"data": {
"creators": [
{
"id": "c1a2b3c4-d5e6-7890-abcd-ef1234567890",
"userId": "u1a2b3c4-d5e6-7890-abcd-ef1234567890",
"username": "featured-creator",
"displayName": "Featured Creator",
"avatarUrl": "https://cdn.bio.re/avatars/abc.webp",
"level": "PLATINUM",
"dmActive": true,
"totalFollowers": 100000
}
]
}
}| Field | Type | Notes |
|---|---|---|
creators | CreatorCardDto[] | Currently-featured + currently-active creators, ordered by admin-set position ASC |
See Search for the full CreatorCardDto field reference.
Errors
| HTTP | code / i18nKey | Reason |
|---|---|---|
429 | (throttle) | Rate limit exceeded (60 req/min) |
503 | features.discover_disabled | Admin kill switch DISCOVER is active |
Side effects
featuredCreator.findMany({ where: { startsAt <= now (or null), endsAt >= now (or null) }, orderBy: position asc, take: 100 }).- Empty list โ return
{ creators: [] }(no second query). creatorProfile.findMany({ where: id IN featured.ids AND active filter (status ACTIVE, creatorStatus ACTIVE, vacationMode false) })with the user join.- Map rows โ
toCard()and return.
Code samples
curl https://api.bio.re/api/v1/discover/featuredasync function getFeaturedCreators(): Promise<CreatorCard[]> {
const res = await fetch('https://api.bio.re/api/v1/discover/featured');
const json = await res.json();
if (!res.ok || !json.success) {
throw Object.assign(new Error(json?.error?.message ?? 'Featured fetch failed'), {
code: json?.error?.code,
});
}
return json.data.creators;
}import { useQuery } from '@tanstack/react-query';
export const discoverKeys = {
featured: () => ['discover', 'featured'] as const,
};
export function useFeatured() {
return useQuery({
queryKey: discoverKeys.featured(),
queryFn: async () => {
const res = await fetch('/api/v1/discover/featured');
const json = await res.json();
if (!res.ok || !json.success) {
throw Object.assign(new Error(json?.error?.message ?? 'Featured fetch failed'), {
code: json?.error?.code,
i18nKey: json?.error?.i18nKey,
});
}
return json.data.creators as CreatorCard[];
},
staleTime: 5 * 60_000,
});
}Try it
Response Body
application/json
curl -X GET "https://loading/api/v1/discover/featured"{
"success": true,
"data": {
"creators": [
{
"id": "cuid_creator_123",
"userId": "2c4a230c-5085-4924-a3e1-25fb4fc5965b",
"username": "johndoe",
"displayName": "John Doe",
"avatarUrl": "https://cdn.bio.re/avatars/abc.jpg",
"level": "BRONZE",
"dmActive": false,
"totalFollowers": 0
}
]
}
}Source
| Source | Path | Lines |
|---|---|---|
| Controller | apps/api-core/src/modules/discover/discover.controller.ts | 51โ55 (featured) |
| DTO (response) | apps/api-core/src/modules/discover/dto/discover-response.dto.ts | 52โ55 (CreatorListDto) |
| Service | apps/api-core/src/modules/discover/discover.service.ts | 277โ296 (getFeatured) |
| Prisma models | packages/prisma/prisma/schema.prisma | FeaturedCreator (admin-managed: startsAt, endsAt, position), CreatorProfile (active filter) |
Get Trending Creators
Public trending creator list. Multi-factor scoring (7-day window) cached in Redis 15min. Falls back to totalMessages sort if scoring fails. CDN-cached 5min.
Browse by Category / Platform
Public creator browse by platform (Instagram / X / etc) AND optional content category. Three sort modes (recent / popular / rating). DM-type filter. Cursor pagination.