How we get our data
What this site is
findsurfcamp.com is an independent comparison of surf camps. It sells nothing and takes no bookings: every "Visit website" button sends you to the camp's own site. We count those clicks per camp, page and language - without storing your IP address - so we can show each camp how many visitors we send it. To tell how many different people that is, each click carries an anonymous code that changes every day and can't be traced back to you; nothing is stored on your device.
A rule runs through everything below: we only publish a figure we can trace to a source. When we do not know something, the page says nothing about it; "unknown" is never shown as "no".
Prices
Every price is read on the camp's own website, never on a booking platform or a review site, and stored with the page address, the date it was checked and the exact sentence it came from. Before it is published, that sentence is found again on the live page.
The price we compare camps on is the "surf week": the lowest price per person for 6 to 8 nights that includes accommodation and surf lessons. If a camp also sells a cheaper stay without lessons, its page shows it separately, labelled as such, and it is never ranked against surf weeks.
A price is only published if the page says it is per person and what it buys (a week, a package of so many nights, or a night); only a week of 6-8 nights with surf lessons is compared as a surf week. We do not work prices out: a nightly rate is not multiplied by seven, and a room price is not divided between guests. There is one sum: where a camp sells the stay and its own surf course separately, each with a published price, the surf week is the two added together, and the page shows it as "stay + surf course" with both figures. Where a camp publishes a table of prices by season, we take the lowest regular price in it, not a "from" figure that no row of the table shows. Where a camp runs a time-limited discount we publish its regular price. Prices appear in the currency the camp uses (euros, US or Australian dollars, British pounds or Indonesian rupiah). You can choose to see every price in one currency: a price in another currency is then converted at the European Central Bank reference rate of the date shown and marked ≈, and the camp page keeps the figure as the camp publishes it. Sorting by price compares currencies the same way.
Where no camp in a destination publishes a surf week but at least three publish a price per person by the night or the trip, as in Mentawai, the destination page shows "Published prices": every such figure as the camp writes it, grouped by unit, never multiplied into a week and never ranked against another unit.
"What a surf week costs" on a destination page is the range and median of those surf weeks, and only appears when at least three camps there publish one. Prices change with the season: check the date next to each one and confirm on the camp's site.
What a camp includes
Meals, yoga, video analysis and who a camp takes (adults only, families) come from the camp's own site, each with a quote and a link to the page it came from, shown next to the value. If a camp's site does not say, we show nothing for it.
Google ratings
Ratings and review counts come from Google (Places API) and only for camps with their own Google listing. We refresh them about once a month and never edit, average or estimate them. A camp without its own listing shows no rating.
Waves, season and swell
Wave figures come from the Copernicus Marine Service global wave reanalysis (GLOBAL_MULTIYEAR_WAV_001_032, known as WAVERYS): the swell height, period and direction every three hours for October 1995 to September 2025, thirty years. We read it at sea off each surf town, in the nearest cell of its 0.2° grid on the side the town's breaks face, within 40 km, whose centre is at sea and whose waves the coast does not damp. For every town we list the surf spots within 6 km from surf-forecast.com, with the type of break and the swell direction each one works best with, and estimate how much of the swell reaches each spot.
A day counts as good for first lessons when a learner spot in the town gets waves of 0.5 to 2 m: a beach break, a beach the town's camps say they teach on, or, in a town with no beach, a reef or point that Wannasurf rates for "All surfers". Beginners start in the whitewater, the broken wave rolling in, not on green waves. The lower limit and the idea of whitewater come from Boqué Ciurana et al. 2022 (Sustainability, a study of the surf schools at Somo): whitewater of 0.9 to 1.5 m for beginners, green waves of 0.5 to 0.9 m, and under 0.5 m nothing to surf; no coaching body publishes a number. The upper limit, 2 m, is calibrated rather than sourced: our height at a spot is the offshore swell scaled by the spot's exposure and its angle to the swell, which overstates the height in the foam zone of a sandy beach. We set it against what camps say about their own towns (below). Read on the yearly mean, 8 of 13 checkable claims agree at 1.5 m, 11 of 13 at 2 m and 11 of 13 at 2.5 m; reading claims that say "always" month by month, as we do below, 7, 8 and 10 of 13. At 2.5 m nearly every town reads 90-100%, so the figure stops telling towns apart: 2 m is the limit that improves agreement under both readings while keeping towns apart. The claims that still disagree (Taghazout, Seminyak, Mirissa, Santa Teresa, Famara) are quoted beside their tables. The camp check below uses these same claims, so their agreement with the 2 m band is partly by construction.
The other three levels are named as schools and camps name them (what each can do is on our Surf levels page, /surf-levels) and read on the face of the wave at its peak, the height surfers name by the body. We convert our height at a spot with the day's mean period of the primary swell (forecasts usually quote the peak period, which is longer) using Komar & Gaughan (1972), Hb = 0.39 g^(1/5) (T H²)^(2/5), times 0.7. That multiplier runs from 0.7 for an ordinary beach to 1.0 for an exposed peak, 0.85 in the middle; we use the ordinary-beach end because our height at a spot overstates what breaks, as the first-lessons calibration showed (carried into the formula it gives 0.68), and because with 0.85, 38 of the 79 towns with learner spots never had a month of green waves on most days, the sheltered bays where beginners are taught among them; with 0.7, 13. A face is uncertain by about 30% on a given beach and day. Body terms follow Surfline's scale (knee 0.6 m, waist 0.9, chest 1.2, head 1.5, overhead 1.8). Beginner (green waves): a face of 0.6 to 1.2 m, knee to chest high, at a beach, a school beach or a spot Wannasurf rates for all surfers, and not at a beach Wannasurf rates for experienced surfers or pros only. Intermediate: 1.2 to 2 m, chest high to just overhead, at any spot. Advanced: 1.5 m and up, head high and up, at any spot. A month tile reads "most days" at 50% of its days or more, "some days" from 25%, "few days" below; first lessons are said in words, "almost every day" from 85%. Where no month has green waves on most days, the table says why when one reason covers most days of the year: the wave is bigger than chest high at every green-wave spot (and, if none of them is sheltered, that smaller waves may break inside or in sheltered corners the model cannot see), or under knee high at every one.
"In season" means that on most days of the month (at least half) the town has waves for first lessons; towns with no month like that are judged on waves for intermediate or advanced surfers (most days for either). A town with no beach break and no such reef on its spot list gets no learner figure: we write "no data" rather than 0%. Days that miss first lessons are counted as too small (every learner spot under 0.5 m) or too big (none between 0.5 and 2 m and one above). The "typical swell offshore" is the usual range of the open-sea swell over the year - not the height of a wave breaking on the beach.
School beaches are the beaches where a camp's surf school, in its own words on its own website, teaches beginners. One enters our figures only with such a quote and its page, and only when it has a surf-forecast.com page that gives its position, exposure and ideal swell direction; beaches whose shelter we could only estimate are recorded but not used. A school beach counts as a learner spot whatever its type, and even beyond the 6 km of the spot list, because that is where the camps say they teach. Where a camp states how often beginners can have lessons, when the beginner season is or how rarely the surf gets too big, we quote it beside the figures and check them against it: they agree when our figure falls no more than 10 points short of the camp's (a figure the camp gives for the year is read against our yearly average; a claim that beginners can always, or every day, have lessons is about every month, so it is read against our worst month; for how rarely the surf gets too big, when ours is no more than 10 points above it), and, for a season, when they read at least as many first-lessons days in those months as in the rest of the year. A camp's word is not a measurement, so where the two differ we say so and leave the reader to weigh both. Wind and tide are not measured: an onshore wind or a high tide can spoil waves the swell alone would allow.
Wave figures: Generated using E.U. Copernicus Marine Service Information; https://doi.org/10.48670/moi-00022. Water figures: NOAA Coral Reef Watch CoralTemp (public domain).
Checked against buoys
We check the wave figures of 30 towns against the buoys within 50 km: a deep-water buoy (300 m or more) where there is one, since it measures the open sea the model reads, and otherwise an exposed coastal buoy on the same coast. A coastal buoy near a headland or a harbour measures a sea the coast has already sheltered, which the spot model accounts for itself, so it is left out where a deep buoy exists. Over 2022-2025, the buoy's hourly readings and the reanalysis go through the same spot model on the days both have data, and we compare the share of days for first lessons, for beginners on green waves and for intermediates month by month. Both take the model's period: buoys report the peak period and the model the mean one, and the face of a wave grows with the period, so the check compares heights and directions. A town is flagged when the difference averages more than 10 points a month or exceeds 25 in one month, or when the buoy's and the model's daily wave heights correlate below 0.8. A verdict needs 10 calendar months and a year of days in common. 23 towns agree, 3 are flagged and 4 have too few months of buoy records yet. Towns with no suitable buoy within 50 km carry a model estimate, unchecked.
Buoy data: Generated using E.U. Copernicus Marine Service Information; https://doi.org/10.48670/moi-00043, from Puertos del Estado, Euskalmet, Instituto Hidrográfico, IEO-CSIC and Cerema (CANDHIS). CDIP 271 via NOAA NDBC: Data courtesy of CDIP (https://cdip.ucsd.edu).
| Town | Buoy | Distance | Days | First lessons, points | Green waves, points | Intermediate, points | Worst month, points | Daily r | Result |
|---|---|---|---|---|---|---|---|---|---|
| Ajo | Santander offshore | 37 km | 0 | - | - | - | - | - | too few months |
| Ajo | Bilbao-Vizcaya | 49 km | 1083 | 10 | 5 | 5 | 17 | 0.98 | agrees |
| Berria (Santoña) | Bilbao-Vizcaya | 39 km | 1083 | 5 | 6 | 4 | 12 | 0.98 | agrees |
| Berria (Santoña) | Santander offshore | 46 km | 0 | - | - | - | - | - | too few months |
| Biarritz | Donostia | 37 km | 1065 | 3 | 4 | 4 | 9 | 0.99 | agrees |
| Biscarrosse | Cap Ferret | 27 km | 1059 | 2 | 3 | 3 | 7 | 0.99 | agrees |
| Caión | Langosteira II | 6 km | 1076 | 10 | 10 | 9 | 20 | 0.94 | agrees |
| Capbreton | Donostia | 46 km | 1065 | 5 | 3 | 4 | 9 | 0.99 | agrees |
| Costa Adeje | Tenerife Sur | 16 km | 937 | 18 | 12 | 35 | 82 | 0.4 | flagged |
| El Médano | Tenerife Sur | 9 km | 937 | 6 | 6 | 2 | 21 | 0.65 | flagged |
| Gijón | Cabo de Peñas | 47 km | 883 | 1 | 2 | 4 | 8 | 0.98 | agrees |
| Hossegor | Donostia | 46 km | 1065 | 5 | 3 | 4 | 9 | 0.99 | agrees |
| Lacanau | Cap Ferret | 44 km | 1059 | 3 | 2 | 2 | 8 | 0.99 | agrees |
| Laga (Urdaibai) | Bilbao-Vizcaya | 41 km | 1083 | 7 | 5 | 4 | 15 | 0.99 | agrees |
| Las Palmas | Gran Canaria | 37 km | 884 | 1 | 5 | 4 | 11 | 0.95 | agrees |
| Moliets | Anglet | 39 km | 759 | 4 | 4 | 4 | 10 | 0.98 | agrees |
| Moya (Gran Canaria north coast) | Gran Canaria | 24 km | 884 | 4 | 6 | 6 | 13 | 0.95 | agrees |
| Peniche | Monican01 | 30 km | 1007 | 1 | 5 | 3 | 11 | 0.99 | agrees |
| Porto Covo | Sines coastal | 14 km | 203 | - | - | - | - | - | too few months |
| Razo | Villano-Sisargas | 47 km | 1023 | 9 | 4 | 8 | 19 | 0.97 | agrees |
| Salinas | Cabo de Peñas | 25 km | 883 | 4 | 3 | 4 | 10 | 0.99 | agrees |
| San Clemente | CDIP 271 Green Beach | 9 km | 804 | 1 | 3 | 4 | 8 | 0.92 | agrees |
| San Juan de la Arena | Cabo de Peñas | 22 km | 883 | 3 | 3 | 4 | 10 | 0.99 | agrees |
| Santa Cruz | Monican01 | 48 km | 1007 | 3 | 1 | 2 | 6 | 0.99 | agrees |
| Seignosse | Donostia | 47 km | 1065 | 5 | 3 | 4 | 9 | 0.99 | agrees |
| Somo | Santander offshore | 40 km | 0 | - | - | - | - | - | too few months |
| Sopela | Bilbao-Vizcaya | 28 km | 1083 | 4 | 6 | 4 | 12 | 0.98 | agrees |
| Suances | Santander offshore | 47 km | 0 | - | - | - | - | - | too few months |
| Valdoviño | Langosteira II | 43 km | 1076 | 11 | 10 | 9 | 24 | 0.93 | flagged |
| Vieux-Boucau | Anglet | 33 km | 759 | 4 | 4 | 4 | 10 | 0.98 | agrees |
| Vila Nova de Milfontes | Sines coastal | 25 km | 203 | - | - | - | - | - | too few months |
| Zarautz | Donostia | 34 km | 1065 | 4 | 3 | 5 | 9 | 0.99 | agrees |
Live forecast
"Waves today", the wave period and the weather on the cards, and the next days on each camp, are model forecasts: wave height and period from Météo-France's MFWAM wave model (a 1/12° grid) and air temperature and the weather symbol from ECMWF's IFS model (0.25°). Our server reads them from Open-Meteo's open data each time a new model run is published (MFWAM twice a day, IFS four times). The waves are read at sea off each surf town, in the grid cell nearest the one the wave figures above use, and the weather in the cell nearest the town.
The models give a value every three hours. "Today" is the step nearest the current time; each of the next days is the average of its morning steps, from 6 to 12 o'clock local time. The weather symbol is worked out from cloud cover, rain, snow and how unstable the air is, the way Open-Meteo does it. These are forecasts for the open sea, not a surf report: a sheltered beach can be much smaller.
Forecast data: Météo-France, ECMWF, via Open-Meteo.com (CC BY 4.0).
Water temperature
The water temperature is the sea surface temperature off each surf town from NOAA Coral Reef Watch CoralTemp (a daily satellite analysis at 5 km) for October 2015 to September 2025: the median of every seventh day in each month, read about 12 km out from the town on the side its breaks face. Each camp card shows the figure for the month it is now; the pages also give the range from the coldest month to the warmest. We use the last ten years because the sea is warming, so an older average would read colder than the water you will find. It is open water, so a sheltered bay or a river mouth can be a degree or two off.
Airports and driving times
The nearest airport is the closest one with scheduled flights, from OurAirports. The driving time and distance are calculated on OpenStreetMap roads (OSRM) without traffic and rounded to 5 minutes, so allow extra time at busy hours. Where our catalogue records a transfer time to that same airport (in Bali, for example, where traffic doubles the free-flow time), that time is used instead; the filter and the airport sort use the same minutes the page shows.
Photos
Photos come from each camp's own website and promotional videos, and every gallery names its source. If a photo is yours and you want it removed or replaced, see the Photos page.
Pages we ask search engines to index
A camp page is offered to search engines only when it holds at least one fact of its own: a Google rating from its own listing, a verified price or verified details of what it includes. The others stay on the site and in every list, and return to the index as soon as they gain one.
Found a mistake?
Write to contact@findsurfcamp.com with the page address. Camps can also send us their prices, packages and photos; we publish them with the same rules as everything else.