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.
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 run in the late afternoon — six passes a day. The schedule is fixed to UTC, so that last run lands at 5pm Pacific in summer and 4pm 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:
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 date of the trip report, the species observed (blue whale, humpback, gray whale, fin whale, common dolphin, bottlenose dolphin, and others as reported), and the sighting count per species. Where an operator lists multiple trips per day, counts are summed across all trips for that date.
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.
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:
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.
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.
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, adds one point when a rare species is present in the currently aggregated sighting data, and then clamps the result to 0-10. Sighting counts do not affect it, and it does not predict whether whales will be seen.
Sighting counts are not an input to this score. Recent whale and dolphin counts are reported separately — see "How whale sighting counts are collected" above, plus the harbor comparison table and sightings pages on the homepage. The only sightings-adjacent input is the fixed rare-species point described below; the number of animals reported does not change 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:
Rare-species adjustment — the one sightings-adjacent term remains in the current code: if any rare species is present in the currently aggregated sighting data, +1 is added before the score is clamped. The same flag currently applies to every harbor's forecast; it is not harbor-specific and animal counts do not increase it beyond one point.
After forecast penalties and the disclosed rare-species point, the final score is clamped to 0–10 and mapped to three tiers:
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:
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.
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 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.
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.
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.