Appearance
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
accessoryLinks?
optionalaccessoryLinks:ExternalLink[]
Defined in: types/challenge.types.ts:395
Optional related equipment or add-on links
affiliateButton?
optionalaffiliateButton:string
Defined in: types/challenge.types.ts:454
Label text for the affiliate CTA button
affiliateOptions?
optionalaffiliateOptions:string
Defined in: types/challenge.types.ts:452
affiliateUrl?
optionalaffiliateUrl:string
Defined in: types/challenge.types.ts:451
ageMax?
optionalageMax:number
Defined in: types/challenge.types.ts:375
ageMin?
optionalageMin:number
Defined in: types/challenge.types.ts:374
ageRange?
optionalageRange:AgeRange
Defined in: types/challenge.types.ts:376
approvedAt?
optionalapprovedAt:string
Defined in: types/challenge.types.ts:435
averageRating?
optionalaverageRating: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?
optionalcategories: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?
optionalcommissionPolicy:boolean
Defined in: types/challenge.types.ts:455
completionCount
completionCount:
number
Defined in: types/challenge.types.ts:438
costAmount?
optionalcostAmount:number
Defined in: types/challenge.types.ts:385
Numeric cost in the specified currency
costCurrency?
optionalcostCurrency:string
Defined in: types/challenge.types.ts:386
costDisplay?
optionalcostDisplay: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
creatorUserId?
optionalcreatorUserId: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?
optionaldestinationDomain: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?
optionaldurationRange:DurationRange
Defined in: types/challenge.types.ts:371
estimatedActiveHours?
optionalestimatedActiveHours: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?
optionalexpirationDate:string
Defined in: types/challenge.types.ts:426
ISO date after which this challenge is no longer available
fulfillmentType?
optionalfulfillmentType:FulfillmentType
Defined in: types/challenge.types.ts:389
galleryImageUrls?
optionalgalleryImageUrls: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
importantInformation?
optionalimportantInformation:string
Defined in: types/challenge.types.ts:380
Safety info, materials, restrictions, and consent notes (max 1500 chars)
instanceCount?
optionalinstanceCount:number
Defined in: types/challenge.types.ts:448
instances?
optionalinstances:ChallengeInstance[]
Defined in: types/challenge.types.ts:447
Specific instance offerings (populated on detail view)
instructions?
optionalinstructions: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?
optionallocationType:LocationType
Defined in: types/challenge.types.ts:414
materialsNeeded?
optionalmaterialsNeeded:string
Defined in: types/challenge.types.ts:409
milestones?
optionalmilestones:ChallengeMilestone[]
Defined in: types/challenge.types.ts:420
pdfUrls?
optionalpdfUrls:string[]
Defined in: types/challenge.types.ts:405
PDF uploads for supplementary materials
prerequisites?
optionalprerequisites:string
Defined in: types/challenge.types.ts:373
Required skills, equipment, or characteristics (max 250 chars)
purchaseLinks?
optionalpurchaseLinks:ExternalLink[]
Defined in: types/challenge.types.ts:393
Where to find, do, or purchase the challenge
redirectPreview?
optionalredirectPreview:string
Defined in: types/challenge.types.ts:457
Preview of the redirect destination shown to the user
resourceLinks?
optionalresourceLinks:ExternalLink[]
Defined in: types/challenge.types.ts:397
Useful information and resource links
reviewNotes?
optionalreviewNotes:string
Defined in: types/challenge.types.ts:434
Staff notes from the moderation review
shortDescription?
optionalshortDescription: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?
optionalspecificMission: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?
optionalteacherTips: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
vendorId?
optionalvendorId:string
Defined in: types/challenge.types.ts:354
Vendor UUID if source is 'vendor'
vendorName?
optionalvendorName:string
Defined in: types/challenge.types.ts:356
Display name of the challenge provider
venueAddress?
optionalvenueAddress:VenueAddress
Defined in: types/challenge.types.ts:415
verificationRequirements?
optionalverificationRequirements:VerificationRequirement[]
Defined in: types/challenge.types.ts:423
Proof elements required in the Track Record (max 5)
videoUrl?
optionalvideoUrl:string
Defined in: types/challenge.types.ts:403