Characters & Social

Quests

Access the full dataset of Stardew Valley quests with details on who provides each quest, what is required, and what rewards are earned, using the chainable QuestQuery API.

Quick Start

import { quests } from 'stardew-valley-data'

// Get all quests
const all = quests().get()

// Find a specific quest by name
const quest = quests().findByName('Crop Research')

// Get only story quests
const storyQuests = quests().byType('story').get()

// Get all repeatable special orders
const repeatables = quests().repeatable().get()

// Get all quests sorted alphabetically
const sorted = quests().sortByName().get()

Type Definition

Quest is a discriminated union — use the type field to narrow to a specific variant:

type Quest = StoryQuest | SpecialOrder | QiSpecialOrder
type QuestType = Quest['type'] // 'story' | 'special-order' | 'qi-special-order'

StoryQuest (type: 'story')

FieldTypeDescription
idstringUnique identifier for the quest.
type'story'Discriminant — always 'story'.
namestringDisplay name of the quest.
textstringThe quest description or story text.
providedBystringWho gives or triggers the quest (e.g., an NPC name or event).
requirementsstringWhat the player must do to complete the quest.
rewardsstringWhat the player receives upon completion.

SpecialOrder (type: 'special-order')

FieldTypeDescription
idstringUnique identifier for the quest.
type'special-order'Discriminant — always 'special-order'.
namestringDisplay name of the quest.
textstringThe quest description or story text.
providedBystringWho gives or triggers the quest.
prerequisitesstring | nullRequired quest ID that must be completed first, or null.
timeframenumberNumber of days to complete the quest.
requirementsstringWhat the player must do to complete the quest.
rewardsstringWhat the player receives upon completion.
repeatablebooleanWhether this special order can be accepted more than once.

QiSpecialOrder (type: 'qi-special-order')

FieldTypeDescription
idstringUnique identifier for the quest.
type'qi-special-order'Discriminant — always 'qi-special-order'.
namestringDisplay name of the quest.
textstringThe quest description or story text.
timeframenumberNumber of days to complete the quest.
requirementsstringWhat the player must do to complete the quest.
rewardsstringWhat the player receives upon completion.

Query Methods

QuestQuery extends QueryBase and inherits five terminal methods shared by all query builders:

MethodReturnsDescription
get()Quest[]Return all results as an array.
first()Quest | undefinedReturn the first result.
find(id)Quest | undefinedFind a quest by exact ID.
findByName(name)Quest | undefinedFind a quest by name (case-insensitive).
count()numberReturn the number of results.

Filter Methods

MethodReturnsDescription
byType(type)QuestQueryFilter to quests of a specific QuestType ('story', 'special-order', 'qi-special-order').
repeatable()QuestQueryFilter to repeatable special orders only (applies to type === 'special-order').

Sort Methods

MethodReturnsDescription
sortByName(order?)QuestQuerySort alphabetically by name. Pass 'asc' (default) or 'desc'.

Examples

Look up a story quest's details

import { quests } from 'stardew-valley-data'

const quest = quests().findByName('Initiation')

if (quest) {
  console.log(`Quest: ${quest.name}`)
  console.log(`Requires: ${quest.requirements}`)
  console.log(`Reward: ${quest.rewards}`)
}

Narrow by quest type

import { quests } from 'stardew-valley-data'

const all = quests().get()

all.forEach((q) => {
  if (q.type === 'special-order') {
    console.log(`${q.name}${q.timeframe} days, repeatable: ${q.repeatable}`)
  } else if (q.type === 'qi-special-order') {
    console.log(`Qi: ${q.name}${q.timeframe} days`)
  } else {
    console.log(`${q.name} — given by: ${q.providedBy}`)
  }
})

Get all repeatable special orders

import { quests } from 'stardew-valley-data'

const repeatables = quests().repeatable().get()
repeatables.forEach((q) => console.log(q.name))

List all quests in reverse alphabetical order

import { quests } from 'stardew-valley-data'

const sorted = quests().sortByName('desc').get()

sorted.forEach((q) => {
  console.log(q.name)
})

Find a quest by ID

import { quests } from 'stardew-valley-data'

const quest = quests().find('quest-1')

if (quest) {
  console.log(quest.name)
}

Wrap a pre-filtered array

You can pass an existing Quest[] array into the quests() function to create a new query from it:

import { quests } from 'stardew-valley-data'

const myList = quests().byType('story').get()
const sorted = quests(myList).sortByName().get()
Previous
Events