Skip to content

DoCurious API Reference / types / Challenge

Interface: Challenge ​

Defined in: types/challenge.types.ts:340

The central challenge entity -- a real-world activity users discover, complete, and document.

Remarks ​

Challenges are the core content unit of DoCurious. They are created by vendors, staff, or community users, then pass through a moderation workflow before appearing in Explore. Each challenge can have multiple ChallengeInstance offerings and optional ChallengeMilestone steps for structured completion.

Example ​

ts
const challenge: Challenge = {
  id: 'ch-042',
  createdAt: '2025-05-10T00:00:00Z',
  updatedAt: '2025-05-15T00:00:00Z',
  title: 'Build a Birdhouse',
  description: 'Design and construct a weatherproof birdhouse from reclaimed wood.',
  specificMission: 'Complete a functional birdhouse that can be mounted outdoors.',
  source: 'vendor',
  vendorId: 'vnd-007',
  categoryIds: ['cat-craft', 'cat-outdoor'],
  difficulty: 'intermediate',
  estimatedDuration: '3-4 hours',
  soloGroup: 'both',
  isFree: false,
  costAmount: 35,
  costCurrency: 'USD',
  fulfillmentType: 'kit',
  coverImageUrl: '/images/birdhouse-cover.jpg',
  hasMilestones: true,
  baseXp: 100,
  status: 'approved',
  completionCount: 214,
  trackRecordCount: 189,
  isFeatured: true,
}

Extends ​

Properties ​

optional accessoryLinks: ExternalLink[]

Defined in: types/challenge.types.ts:397

Optional related equipment or add-on links


affiliateButton? ​

optional affiliateButton: string

Defined in: types/challenge.types.ts:456

Label text for the affiliate CTA button


affiliateOptions? ​

optional affiliateOptions: string

Defined in: types/challenge.types.ts:454


affiliateUrl? ​

optional affiliateUrl: string

Defined in: types/challenge.types.ts:453


ageMax? ​

optional ageMax: number

Defined in: types/challenge.types.ts:377


ageMin? ​

optional ageMin: number

Defined in: types/challenge.types.ts:376


ageRange? ​

optional ageRange: AgeRange

Defined in: types/challenge.types.ts:378


approvedAt? ​

optional approvedAt: string

Defined in: types/challenge.types.ts:437


averageRating? ​

optional averageRating: number

Defined in: types/challenge.types.ts:441


baseXp ​

baseXp: number

Defined in: types/challenge.types.ts:431

Base experience points awarded on completion (before multipliers)


categories? ​

optional categories: ChallengeCategory[]

Defined in: types/challenge.types.ts:363

Populated category objects (loaded on detail views)


categoryIds ​

categoryIds: string[]

Defined in: types/challenge.types.ts:361

Primary and subcategory IDs from the DoCurious taxonomy


commissionPolicy? ​

optional commissionPolicy: boolean

Defined in: types/challenge.types.ts:457


completionCount ​

completionCount: number

Defined in: types/challenge.types.ts:440


costAmount? ​

optional costAmount: number

Defined in: types/challenge.types.ts:387

Numeric cost in the specified currency


costCurrency? ​

optional costCurrency: string

Defined in: types/challenge.types.ts:388


costDisplay? ​

optional costDisplay: string

Defined in: types/challenge.types.ts:390

Human-readable price display for ranges (e.g., "$25-$40")


coverImageUrl ​

coverImageUrl: string

Defined in: types/challenge.types.ts:402


createdAt ​

createdAt: string

Defined in: types/common.types.ts:154

ISO 8601 datetime when the entity was created

Inherited from ​

BaseEntity.createdAt


creatorUserId? ​

optional creatorUserId: string

Defined in: types/challenge.types.ts:357


description ​

description: string

Defined in: types/challenge.types.ts:347

Detailed description covering context, history, relevance, and benefits (max 1000 chars)


destinationDomain? ​

optional destinationDomain: string

Defined in: types/challenge.types.ts:461

Domain of the final redirect target


difficulty ​

difficulty: DifficultyLevel

Defined in: types/challenge.types.ts:366


durationRange? ​

optional durationRange: DurationRange

Defined in: types/challenge.types.ts:371


estimatedActiveHours? ​

optional estimatedActiveHours: number

Defined in: types/challenge.types.ts:370

Machine-readable duration in hours (e.g., 1.3)


estimatedDuration ​

estimatedDuration: string

Defined in: types/challenge.types.ts:368

Human-readable duration text (e.g., "2-3 hours", "1 weekend")


expirationDate? ​

optional expirationDate: string

Defined in: types/challenge.types.ts:428

ISO date after which this challenge is no longer available


fulfillmentType? ​

optional fulfillmentType: FulfillmentType

Defined in: types/challenge.types.ts:391


galleryImageUrls? ​

optional galleryImageUrls: string[]

Defined in: types/challenge.types.ts:404

Additional gallery images (max 4 total including cover)


hasMilestones ​

hasMilestones: boolean

Defined in: types/challenge.types.ts:421

Whether this challenge uses milestone-based structured completion


id ​

id: string

Defined in: types/common.types.ts:167

Inherited from ​

BaseEntity.id


importantInformation? ​

optional importantInformation: string

Defined in: types/challenge.types.ts:382

Safety info, materials, restrictions, and consent notes (max 1500 chars)


instanceCount? ​

optional instanceCount: number

Defined in: types/challenge.types.ts:450


instances? ​

optional instances: ChallengeInstance[]

Defined in: types/challenge.types.ts:449

Specific instance offerings (populated on detail view)


instructions? ​

optional instructions: string

Defined in: types/challenge.types.ts:410


isFeatured ​

isFeatured: boolean

Defined in: types/challenge.types.ts:446

Whether this challenge is editorially featured on the Explore page


isFree ​

isFree: boolean

Defined in: types/challenge.types.ts:385


locationType? ​

optional locationType: LocationType

Defined in: types/challenge.types.ts:416


materialsNeeded? ​

optional materialsNeeded: string

Defined in: types/challenge.types.ts:411


milestones? ​

optional milestones: ChallengeMilestone[]

Defined in: types/challenge.types.ts:422


pdfUrls? ​

optional pdfUrls: string[]

Defined in: types/challenge.types.ts:407

PDF uploads for supplementary materials


prerequisites? ​

optional prerequisites: string

Defined in: types/challenge.types.ts:373

Required skills, equipment, or characteristics (max 250 chars)


optional purchaseLinks: ExternalLink[]

Defined in: types/challenge.types.ts:395

Where to find, do, or purchase the challenge


redirectPreview? ​

optional redirectPreview: string

Defined in: types/challenge.types.ts:459

Preview of the redirect destination shown to the user


optional resourceLinks: ExternalLink[]

Defined in: types/challenge.types.ts:399

Useful information and resource links


reviewNotes? ​

optional reviewNotes: string

Defined in: types/challenge.types.ts:436

Staff notes from the moderation review


shortDescription? ​

optional shortDescription: string

Defined in: types/challenge.types.ts:349

Brief summary shown on challenge cards and list views


skills? ​

optional skills: string[]

Defined in: types/challenge.types.ts:375

Skills the user will develop by completing this challenge


soloGroup ​

soloGroup: SoloGroup

Defined in: types/challenge.types.ts:379


source ​

source: ChallengeSource

Defined in: types/challenge.types.ts:352


specificMission? ​

optional specificMission: string

Defined in: types/challenge.types.ts:345

Clear, quantifiable objective (max 1000 chars)


status ​

status: ChallengeStatus

Defined in: types/challenge.types.ts:434


teacherTips? ​

optional teacherTips: string

Defined in: types/challenge.types.ts:413

Teacher-only guidance for using this challenge in a classroom setting


title ​

title: string

Defined in: types/challenge.types.ts:343

Challenge display name


trackRecordCount ​

trackRecordCount: number

Defined in: types/challenge.types.ts:443

Total number of Track Records submitted for this challenge


updatedAt ​

updatedAt: string

Defined in: types/common.types.ts:156

ISO 8601 datetime when the entity was last modified

Inherited from ​

BaseEntity.updatedAt


vendorId? ​

optional vendorId: string

Defined in: types/challenge.types.ts:354

Vendor UUID if source is 'vendor'


vendorName? ​

optional vendorName: string

Defined in: types/challenge.types.ts:356

Display name of the challenge provider


venueAddress? ​

optional venueAddress: VenueAddress

Defined in: types/challenge.types.ts:417


verificationRequirements? ​

optional verificationRequirements: VerificationRequirement[]

Defined in: types/challenge.types.ts:425

Proof elements required in the Track Record (max 5)


videoUrl? ​

optional videoUrl: string

Defined in: types/challenge.types.ts:405

DoCurious Platform Documentation