Methodology
How socalwhales.org collects data and scores conditions
This page explains where the numbers on socalwhales.org come from, how they are collected, and how the "Good Day to Go" score is calculated. Transparency about data sourcing and scoring is especially important on a site that links out to commercial operators — you should be able to verify independently that the score is based on objective signals, not commercial arrangements.
How whale sighting counts are collected
Sighting counts come from the public trip-report pages published by Southern California whale-watching operators. Each operator posts a daily or per-trip summary on their website describing which species were spotted and in what numbers. An automated scraper reads these pages every two hours during daytime Pacific hours (7am–3pm PT), plus one further evening pass and two overnight runs — eight passes a day. The overnight runs exist because Davey's Locker batch-posts its report irregularly, sometimes after the last daytime pass; without them, a late report could sit unscraped for up to 14 hours, until the next morning's run. The schedule is fixed to UTC, so the exact Pacific clock times shift an hour with daylight saving: the evening pass lands around 5pm Pacific in summer and 4pm in winter, and the two overnight runs land around 8pm/11pm in summer and 7pm/10pm in winter. Five operator pages across four harbors are currently monitored — but they are not five independent sources. Newport Whales and Davey's Locker are affiliated sites publishing the same trip-report feed, so the five scraped pages carry four independent feeds across four harbors. The two mirrored rows are reconciled, never summed; treating them as independent confirmations would double-count every animal reported at Newport Beach.
Operators monitored:
- Newport Whales — Newport Beach
- Davey's Locker — Newport Beach (same feed as Newport Whales)
- Harbor Breeze Cruises — Long Beach
- Dana Wharf — Dana Point
- San Diego Whale Watch — San Diego
Coverage and endorsement
These five operators are not every operator running trips from these harbors — they publish public, dated, per-trip sighting reports, which is what the scraper needs. Other operators run trips from these same harbors without appearing here; that reflects reporting format, not their trips. Appearing here is not an endorsement; not appearing is not a judgment. As stated on the About page, this site is not currently affiliated with any booking platform or operator, listed or not.
One distinction worth knowing: under US Coast Guard rules, a vessel carrying seven or more passengers for hire must hold a Certificate of Inspection — an inspected hull, stability, and lifesaving and firefighting equipment, with a minimum crew set by the Coast Guard (46 CFR § 175.110). A vessel carrying six or fewer is an uninspected passenger vessel: it needs a licensed captain — an OUPV ("six-pack") or Master credential — but the vessel itself is not inspected (46 U.S.C. § 2101). A booking page advertising a licensed captain does not say which category the boat is in; ask if it matters to you.
For each operator, the scraper captures the trip report date, species observed, and any numerical count supplied. Where multiple trips are reported for a date, numerical counts are summed. A species reported without a number is shown as present, count unknown, never an inferred one or zero animals. Mixed reports retain both the numerical subtotal and additional uncounted sightings. These are operator-reported observations, not deduplicated individual animals.
Archive records are grouped by source report date, not collection day. In the JSON download, a species may have a presence map containing present_uncounted for a harbor. Its count includes numerical reports only: zero alongside presence does not mean no animals were seen. Historical records may be corrected after verification against source evidence; older count-only history cannot establish uncounted sightings.
Updates replace only the reporting harbor's contribution for that date, preserving other harbors. Explicit zero reports replace earlier counts. Quarantined and removed records cannot be restored from older history. When historical reports cannot be loaded, we show history as unavailable rather than inventing observations.
No private data or paid APIs are used. The scraper reads only information that is already publicly visible on each operator's website — the same trip reports a visitor would read manually. If a source page changes its format, the scraper may temporarily produce incomplete data until the extraction logic is updated.
Data is baked in at build time, not fetched on each page view. When the site is rebuilt, the latest available scrape is embedded directly into the static HTML. Scraping and rebuilding run on two different clocks: the scraper runs every two hours during scheduled daytime windows, while the site rebuild is scheduled daily. A count change can trigger an additional build, but publication still waits for that build and deployment to finish. The source footer separates operator report dates, the scrape timestamp represented by the page, and the page build timestamp; unavailable timestamps are labelled unavailable.
Species identification follows the operator's own report language. The scraper maps common variations ("blue whales", "blues", "BW") to a canonical species ID drawn from a fixed allowlist of 23 species — from common and bottlenose dolphins through gray, humpback, blue, fin and minke whales to genuine rarities like sei, Bryde's, sperm and false killer whales, Cuvier's and Baird's beaked whales, and the North Pacific right whale.
Anything outside that allowlist is captured for human review, not counted. If an operator writes a species string the scraper cannot resolve — an unfamiliar name, or a genuinely ambiguous one like "blackfish" (used for orca, false killer whale and pilot whale interchangeably) or "sei or Bryde's" (two species that often cannot be separated at sea) — the raw text is written to a review queue with its source and timestamp. It is never guessed at, never assigned to a species, and never added to any sighting total. Obvious non-cetacean noise (sea lions, sharks, sunfish, seabirds) is filtered out of that queue so what remains is worth a human's attention. The trade-off is deliberate: a novel or misspelled report is the most editorially interesting thing the scraper can encounter, so it is preserved for review rather than silently dropped — but until a person confirms it, it does not touch the published numbers.
For the evidence behind each species' rarity label, see How species rarity is judged.
How ocean and weather data is collected
Marine and wind forecast data comes from the Open-Meteo marine API. Open-Meteo is a free, open-source weather service that provides marine forecast data derived from the GFS and ICON global forecast models. No account, API key, or subscription is required to use it.
The scraper requests a 4-day hourly forecast separately for each of the four harbors, at these fixed grid points: Long Beach 33.77°N, 118.19°W; Newport Beach 33.61°N, 117.93°W; Dana Point 33.46°N, 117.70°W; San Diego 32.72°N, 117.16°W. The four points span roughly 93 miles of coast and sit behind genuinely different geography — Long Beach is inside a federal breakwater and in Catalina's swell shadow, San Diego is 74 miles south with a different swell window — so one point cannot stand in for all four. Each harbor's fetch is independent: if one fails, that harbor is shown as unavailable rather than being given another harbor's numbers.
Variables pulled from the marine forecast:
- Wave height — significant wave height, combined wind waves and swell. Returned in metres and converted to feet for display.
- Wave period — dominant wave period in seconds (time between successive wave crests)
- Wind speed — wind speed at 10 metres above sea level, requested and displayed in knots
The scraper calls two separate Open-Meteo endpoints: the marine API for wave height and wave period, and the standard weather API for wind speed. The hourly results from both calls are merged on the timestamp field to produce a single combined hourly dataset. Everything shown on the site is in knots, feet and seconds (e.g. "2.5 ft @ 9s SW"), derived from the midday hours of each forecast day.
A daily score requires valid wave height, wave period, and wind speed together for at least five of the nine hourly samples from 08:00 through 16:00. Missing or invalid measurements are not treated as zero wind or zero swell. Without sufficient coverage, that day's conditions are unavailable.
Wave period matters as much as wave height, and it carries real weight in the score. Peak seasickness sensitivity sits around a 3–6 second wave encounter, so short choppy periods are penalised heavily even when the swell is small: under 5 seconds costs 3 points, under 7 seconds costs 2, under 9 seconds costs 1. A 2 ft swell at 4 seconds is a worse ride than a 3 ft swell at 14 seconds.
How the Good Day to Go score works
The Good Day to Go score is a 0-10 scale estimate of comfort for offshore whale-watching boat trips. It starts at 10, subtracts forecast penalties for wind, waves, visibility, thunderstorms, and rain, and then clamps the result to 0-10. Sighting counts and rare-species observations are shown separately and do not affect it. It does not predict whether whales will be seen.
Sighting counts and wildlife rarity are not inputs to this score. Recent whale and dolphin counts, including rare-species observations, are reported separately — see "How whale sighting counts are collected" above, plus the harbor comparison table and sightings pages on the homepage. They describe reported wildlife interest, not sea comfort.
What lowers the score
The figures below are read directly from the scraper's scoring code, in the units it actually uses — knots, feet, seconds, and miles:
- Wind speed — sustained wind: −1 at 9 kt or more, −2 at 15 kt, −3 at 21 kt, −4 above 25 kt.
- Gusts — peak gust: −1 above 20 kt, −2 above 30 kt. An extra −1 applies when gusts run more than 10 kt above sustained wind and exceed 18 kt — inconsistent, lurching wind rather than a steady breeze.
- Onshore wind direction — a westerly at 12 kt or more, or a southwesterly/northwesterly at 15 kt or more, costs −1: onshore wind piles chop onto swell.
- Wave height — no penalty up to 2.0 ft; a smoothly rising penalty from 2.0 ft to 5.5 ft (roughly −1 at 3 ft, −2 at 4 ft); capped at −4 above 5.5 ft, around where operators typically turn back.
- Wave period — short, choppy periods cost more: −3 under 5s, −2 under 7s, −1 under 9s.
- Steep swell — once wave height reaches 3.5 ft or more, a low period-to-height ratio (steep, close-together swell) adds a further −1 or −2.
- Beam-sea swell direction — a west/northwest swell (roughly 240°–340°) at 2 ft or more with a 12s+ period costs −1: boats working the coastal drop-off can't always point into that swell.
- Visibility — −1 under 5 mi, −2 under 3 mi, −3 under 1 mi.
- Thunderstorms — −3 when the forecast weather code indicates thunderstorms.
- Rain probability — −1 at 50% or higher, −2 at 70% or higher.
Score tiers
After forecast penalties, the final score is clamped to 0–10 and mapped to three tiers:
- GO — score 7 or higher.
- MAYBE — score 4 up to (but under) 7.
- SKIP — score under 4.
Caveats and limitations
The score is an estimate based primarily on a weather forecast — it is not a guarantee, and it does not predict whether you'll see whales. Several factors can cause it to be misleading:
- It is a sea-state score, not a sightings prediction. A GO day can produce a blank trip; a SKIP day can produce an exceptional one, if anyone chooses to run it. To see what's actually been reported recently, check the harbor comparison table or the sightings pages — not this score.
- Forecast uncertainty. Weather forecasts beyond 48–72 hours carry increasing uncertainty. The score for days 3–7 of the forecast should be treated as directional guidance, not a precise prediction.
- Per-harbor grid point, not hyper-local. Each harbor is scored from its own forecast grid point (see above), but conditions can still vary within a harbor's fishing grounds — right at the harbor mouth versus several miles offshore, for instance.
- Booking links do not influence the score. This site is not currently affiliated with any booking platform or operator. The operators listed and the score algorithm were defined independently of any commercial relationship, and an operator appearing on this site does not affect the score.
If you notice the score behaving unexpectedly — for example, showing GO during conditions that are clearly rough — please get in touch so the scraper logic can be reviewed.
What's a citable claim vs. this site's own read
Each species page (e.g. Gray whale) mixes two kinds of content: facts traced to a named, linked source, and this site's own plain-language framing of those facts. The two are meant to stay visually and textually separable — a sentence should never assert something a source didn't actually say. Where population or trend figures carry real interpretive nuance (for example, whether a jump in a whale count reflects genuine recovery), this site states the cited figures plainly and leaves the reader to draw conclusions, rather than layering an uncited dramatic verdict on top of a source's own, usually more measured, language.
Population and trend figures
Population sizes, growth rates, and stock trends are sourced to NOAA Fisheries Stock Assessment Reports (SARs) — the same peer-reviewed federal assessments fisheries management is based on — or to a named NOAA feature story or peer-reviewed paper where a SAR doesn't cover the specific claim (for example, a published field-study finding). Every species page with this kind of claim links directly to the source next to the figure it supports, under "Why that rarity label" or the page's data-graphic section. See How species rarity is judged for the fuller reasoning behind that per-species evidence.
Bio-stat figures (length, weight, lifespan, diet)
The "At a glance" length/weight/lifespan/diet figures on each species page are sourced to that species' own NOAA Fisheries species page — NOAA's plain-language reference profile for the animal, distinct from the numbered stock assessment PDFs used for population figures above. As of 2026-08, the 10 species with a full redesigned page (common dolphin, bottlenose dolphin, gray whale, humpback whale, blue whale, fin whale, orca, minke whale, Risso's dolphin, and Pacific white-sided dolphin) carry a direct link to that source beneath their stats grid. Where NOAA states a figure as a range, that range is used as-is; where NOAA gives only a maximum, this site shows it as a maximum rather than inventing a lower bound. Species without a source link yet are still working from the same NOAA species-page figures — the citation link is being added page by page, not the underlying number.
Reporting an inaccuracy
If a figure or claim on a species page looks wrong — a stat that doesn't match its source, or site commentary that reads as if it were a direct quote — please get in touch. This is the same contact used for scoring issues above; species-page accuracy reports get the same priority.