Fishing & Mining

Fish

Access every fish in Stardew Valley with season, location, weather, catch type, difficulty, and sell price data.

Quick Start

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

// All fish
const allFish = fish().get()

// Summer fish sorted by sell price
const bestSummer = fish().bySeason('summer').sortBySellPrice().get()

// Find a specific fish
const catfish = fish().findByName('Catfish')

// Rod fish only, sorted by difficulty
const hardest = fish().byCatchType('rod').sortByDifficulty().get()

Type Definition

interface Fish {
  id: string
  name: string
  description: string
  catchType: FishCatchType
  seasons: Season[]
  location: string
  weather?: FishWeather
  time?: string
  difficulty?: number
  sellPrice: number
  fishTank: boolean
  usedIn: string[]
  image: string
}

type FishCatchType = 'rod' | 'crab-pot'
type FishWeather = 'sunny' | 'rainy' | 'both'

Field Reference

FieldTypeDescription
idstringUnique identifier.
namestringDisplay name (e.g. "Catfish").
descriptionstringIn-game description text.
catchTypeFishCatchTypeHow the fish is caught: 'rod' or 'crab-pot'.
seasonsSeason[]Seasons the fish is available.
locationstringWhere the fish can be found.
weatherFishWeather | undefinedRequired weather: 'sunny', 'rainy', or 'both'. Undefined for crab-pot fish.
timestring | undefinedTime range when the fish is available (e.g. "6am - 7pm").
difficultynumber | undefinedFishing difficulty rating (0-100). Undefined for crab-pot fish.
sellPricenumberBase sell price in gold.
fishTankbooleanWhether the fish can be placed in a fish tank.
usedInstring[]List of recipes or bundles that use this fish.
imagestringPath to the image asset.

Query Methods

The fish() function returns a FishQuery instance. All methods return a new FishQuery for chaining.

Inherited Methods

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

Filter Methods

MethodSignatureDescription
bySeasonbySeason(season: Season)Filter to fish available in the given season.
byCatchTypebyCatchType(type: FishCatchType)Filter by catch method ('rod' or 'crab-pot').
byWeatherbyWeather(weather: 'sunny' | 'rainy' | 'both')Filter by required weather condition.
byLocationbyLocation(location: string)Filter by location (case-insensitive substring match).

Sort Methods

MethodSignatureDefaultDescription
sortByNamesortByName(order?: 'asc' | 'desc')'asc'Sort alphabetically by name.
sortBySellPricesortBySellPrice(order?: 'asc' | 'desc')'desc'Sort by sell price (most valuable first).
sortByDifficultysortByDifficulty(order?: 'asc' | 'desc')'desc'Sort by fishing difficulty (hardest first). Crab-pot fish sort as 0.

Examples

Most valuable fish per season

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

const seasons = ['spring', 'summer', 'fall', 'winter']

seasons.forEach((season) => {
  const best = fish().bySeason(season).sortBySellPrice().first()
  if (best) {
    console.log(`Best ${season} fish: ${best.name} (${best.sellPrice}g)`)
  }
})

Rainy-day rod fish

const rainyFish = fish()
  .byCatchType('rod')
  .byWeather('rainy')
  .sortByDifficulty()
  .get()

rainyFish.forEach((f) => {
  console.log(`${f.name}: difficulty ${f.difficulty}, ${f.sellPrice}g`)
})

Fish found in the ocean

const oceanFish = fish().byLocation('ocean').sortByName().get()
oceanFish.forEach((f) => console.log(f.name))

Crab pot catches

const crabPot = fish().byCatchType('crab-pot').get()
console.log(`${crabPot.length} crab pot catches available`)

Hardest fish to catch

const top5 = fish().byCatchType('rod').sortByDifficulty().get().slice(0, 5)

top5.forEach((f) => {
  console.log(`${f.name}: difficulty ${f.difficulty}`)
})
Previous
Seasons & weather