BIO.RE
Creator

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.

HeaderRequiredNotes
Authorization: Bearer <accessToken>JWT from POST /auth/login

Response

200 OKApiResponseOf<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

keyCompletion ruleSource
avatarUser.avatarUrl IS NOT NULLUser
bioBioPage.bio non-empty after .trim()BioPage
linkscount(BioLink where bioPage.creatorId) > 0BioLink
dm_configCreatorProfile.dmActive === trueCreatorProfile
kycCreatorProfile.kycStatus === 'APPROVED'CreatorProfile
socialcount(SocialAccount where userId) > 0SocialAccount

Top-level fields

FieldTypeNotes
itemsarray6 items in the order shown above (stable)
completedCountnumberNumber of items with completed: true
totalCountnumberAlways 6 today — render progress as completedCount / totalCount

Errors

HTTPcode / i18nKeyReason
401(guard)Missing / invalid bearer token
404creator.checklist.not_foundNo CreatorProfile for this user — call POST /creators/upgrade first

Side effects

  1. Lookup CreatorProfile (id, dmActive, kycStatus); throw not_found if missing.
  2. In parallel (Promise.all): read User.avatarUrl, read BioPage.bio, count BioLink, count SocialAccount.
  3. Build the items array using the rules above.
  4. completedCount = items.filter(i => i.completed).length.
  5. 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

GET
/api/v1/creators/dashboard/checklist
AuthorizationBearer <token>

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

SourcePathLines
Controllerapps/api-core/src/modules/creator/creator.controller.ts103–110 (getChecklist)
DTO (response)apps/api-core/src/modules/creator/dto/creator-client-response.dto.ts408–417 (ChecklistResponseDto), 397–406 (nested ChecklistItemDto)
Serviceapps/api-core/src/modules/creator/creator.service.ts936–976 (getChecklist)
Prisma modelspackages/prisma/prisma/schema.prismaCreatorProfile.dmActive, CreatorProfile.kycStatus, User.avatarUrl, BioPage.bio, BioLink, SocialAccount

On this page