Get Setup Checklist
Six-item creator onboarding checklist with completion flags. Static set today (avatar, bio, link, DM config, KYC, social) — drives the post-upgrade getting-started UI.
GET /api/v1/creators/dashboard/checklist — 🔑 Bearer
Returns the 6-item creator onboarding checklist with completed flags computed live across User, BioPage, BioLink, CreatorProfile, and SocialAccount. The set of items is static today — keys are stable, future items would be additions, never renames.
The checklist's key is the stable identifier — render UI / icons / deep-links by key, not by array index. The label is server-rendered English; localize on the client by mapping key to your i18n strings if needed.
Request
No body, no params.
| Header | Required | Notes |
|---|---|---|
Authorization: Bearer <accessToken> | ✓ | JWT from POST /auth/login |
Response
200 OK — ApiResponseOf<ChecklistResponseDto>
{
"success": true,
"data": {
"items": [
{ "key": "avatar", "completed": true, "label": "Upload profile photo" },
{ "key": "bio", "completed": true, "label": "Write your bio" },
{ "key": "links", "completed": false, "label": "Add at least one link" },
{ "key": "dm_config", "completed": true, "label": "Configure DM pricing" },
{ "key": "kyc", "completed": false, "label": "Complete identity verification" },
{ "key": "social", "completed": true, "label": "Connect a social account" }
],
"completedCount": 4,
"totalCount": 6
}
}Items
key | Completion rule | Source |
|---|---|---|
avatar | User.avatarUrl IS NOT NULL | User |
bio | BioPage.bio non-empty after .trim() | BioPage |
links | count(BioLink where bioPage.creatorId) > 0 | BioLink |
dm_config | CreatorProfile.dmActive === true | CreatorProfile |
kyc | CreatorProfile.kycStatus === 'APPROVED' | CreatorProfile |
social | count(SocialAccount where userId) > 0 | SocialAccount |
Top-level fields
| Field | Type | Notes |
|---|---|---|
items | array | 6 items in the order shown above (stable) |
completedCount | number | Number of items with completed: true |
totalCount | number | Always 6 today — render progress as completedCount / totalCount |
Errors
| HTTP | code / i18nKey | Reason |
|---|---|---|
401 | (guard) | Missing / invalid bearer token |
404 | creator.checklist.not_found | No CreatorProfile for this user — call POST /creators/upgrade first |
Side effects
- Lookup
CreatorProfile(id,dmActive,kycStatus); thrownot_foundif missing. - In parallel (
Promise.all): readUser.avatarUrl, readBioPage.bio, countBioLink, countSocialAccount. - Build the items array using the rules above.
completedCount = items.filter(i => i.completed).length.- Return
{ items, completedCount, totalCount: items.length }. No mutations.
Code samples
curl https://api.bio.re/api/v1/creators/dashboard/checklist \
-H "Authorization: Bearer $ACCESS_TOKEN"type ChecklistKey = 'avatar' | 'bio' | 'links' | 'dm_config' | 'kyc' | 'social';
type ChecklistItem = {
key: ChecklistKey;
completed: boolean;
label: string;
};
type Checklist = {
items: ChecklistItem[];
completedCount: number;
totalCount: number;
};
async function getChecklist(accessToken: string): Promise<Checklist> {
const res = await fetch('https://api.bio.re/api/v1/creators/dashboard/checklist', {
headers: { Authorization: `Bearer ${accessToken}` },
});
const json = await res.json();
if (!res.ok || !json.success) {
throw Object.assign(new Error(json?.error?.message ?? 'Checklist fetch failed'), {
code: json?.error?.code,
});
}
return json.data;
}import { useQuery } from '@tanstack/react-query';
export const creatorKeys = {
checklist: () => ['creators', 'dashboard', 'checklist'] as const,
};
export function useChecklist() {
return useQuery({
queryKey: creatorKeys.checklist(),
queryFn: async () => {
const res = await fetch('/api/v1/creators/dashboard/checklist');
const json = await res.json();
if (!res.ok || !json.success) {
throw Object.assign(new Error(json?.error?.message ?? 'Checklist fetch failed'), {
code: json?.error?.code,
i18nKey: json?.error?.i18nKey,
});
}
return json.data as Checklist;
},
staleTime: 30_000,
});
}Try it
Authorization
bearer In: header
Response Body
application/json
application/json
application/json
curl -X GET "https://loading/api/v1/creators/dashboard/checklist"{
"success": true,
"data": {
"items": [
{
"key": "complete_kyc",
"completed": true,
"label": "Complete identity verification"
}
],
"completedCount": 3,
"totalCount": 7
}
}{
"success": false,
"error": {
"code": "AUTH_UNAUTHORIZED",
"message": "Invalid credentials",
"i18nKey": "auth.login.invalid_credentials",
"i18nVars": {
"field": "email"
},
"details": [
{
"message": "email must be an email"
}
],
"correlationId": "a1b2c3d4-e5f6-7890-abcd-ef1234567890"
}
}{
"success": false,
"error": {
"code": "AUTH_UNAUTHORIZED",
"message": "Invalid credentials",
"i18nKey": "auth.login.invalid_credentials",
"i18nVars": {
"field": "email"
},
"details": [
{
"message": "email must be an email"
}
],
"correlationId": "a1b2c3d4-e5f6-7890-abcd-ef1234567890"
}
}Source
| Source | Path | Lines |
|---|---|---|
| Controller | apps/api-core/src/modules/creator/creator.controller.ts | 103–110 (getChecklist) |
| DTO (response) | apps/api-core/src/modules/creator/dto/creator-client-response.dto.ts | 408–417 (ChecklistResponseDto), 397–406 (nested ChecklistItemDto) |
| Service | apps/api-core/src/modules/creator/creator.service.ts | 936–976 (getChecklist) |
| Prisma models | packages/prisma/prisma/schema.prisma | CreatorProfile.dmActive, CreatorProfile.kycStatus, User.avatarUrl, BioPage.bio, BioLink, SocialAccount |
Get Creator Dashboard
Earnings + level + wallet + DM + response-rate summary in a single response. Computed from CreatorProfile, Wallet, PayoutRequest, Message, SocialAccount, and ConfigService thresholds.
Get Recent Activity
Merged feed of the creator's recent messages, processed payouts, and new bio-page subscribers. Three sources combined, sorted by timestamp DESC, sliced to limit.