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:395

Optional related equipment or add-on links


affiliateButton?

optional affiliateButton: string

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

Label text for the affiliate CTA button


affiliateOptions?

optional affiliateOptions: string

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


affiliateUrl?

optional affiliateUrl: string

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


ageMax?

optional ageMax: number

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


ageMin?

optional ageMin: number

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


ageRange?

optional ageRange: AgeRange

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


approvedAt?

optional approvedAt: string

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


averageRating?

optional averageRating: number

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


baseXp

baseXp: number

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

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:455


completionCount

completionCount: number

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


costAmount?

optional costAmount: number

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

Numeric cost in the specified currency


costCurrency?

optional costCurrency: string

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


costDisplay?

optional costDisplay: string

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

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


coverImageUrl

coverImageUrl: string

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


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:459

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:426

ISO date after which this challenge is no longer available


fulfillmentType?

optional fulfillmentType: FulfillmentType

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


galleryImageUrls?

optional galleryImageUrls: string[]

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

Additional gallery images (max 4 total including cover)


hasMilestones

hasMilestones: boolean

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

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:380

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


instanceCount?

optional instanceCount: number

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


instances?

optional instances: ChallengeInstance[]

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

Specific instance offerings (populated on detail view)


instructions?

optional instructions: string

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


isFeatured

isFeatured: boolean

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

Whether this challenge is editorially featured on the Explore page


isFree

isFree: boolean

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


locationType?

optional locationType: LocationType

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


materialsNeeded?

optional materialsNeeded: string

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


milestones?

optional milestones: ChallengeMilestone[]

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


pdfUrls?

optional pdfUrls: string[]

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

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:393

Where to find, do, or purchase the challenge


redirectPreview?

optional redirectPreview: string

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

Preview of the redirect destination shown to the user


optional resourceLinks: ExternalLink[]

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

Useful information and resource links


reviewNotes?

optional reviewNotes: string

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

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


soloGroup

soloGroup: SoloGroup

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


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:432


teacherTips?

optional teacherTips: string

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

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:441

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:415


verificationRequirements?

optional verificationRequirements: VerificationRequirement[]

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

Proof elements required in the Track Record (max 5)


videoUrl?

optional videoUrl: string

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

DoCurious Platform Documentation