Open data · CC BY 4.0

Open dive data

The dive sites and stays behind every ReefHop page, as CSV and JSON. 102 dive sites and 64 stays across 8 destinations, each with the page we read it from, plus each destination's sea temperature by month from NOAA. Sources read between and .

Use it, credit us

Everything here is free under CC BY 4.0 (creativecommons.org/licenses/by/4.0/). Copy it, change it, put it in an app or a paper, commercial use included. Credit ReefHop with a link to this page. A line like this works:

Data: ReefHop (https://reefhop.com/data/), CC BY 4.0

Dive sites

Every dive site on our destination maps with its position, depth range, level, shore or boat entry, the town it is measured from and the closest stay we list.

102 rows · 22 fields · one row per dive site

Sources and method

Names, positions, depths, levels and entry come from one source per site, named in source: a marine park, regulator, tourism board or Wikipedia where one covers the site, otherwise a local dive operator or dive directory, which we name only by kind and do not link. Where two sources disagree on entry, both are kept ("shore or boat"). Distances are great-circle straight lines between two mapped points, rounded to 10 m, so the walk or drive is longer. A site or stay placed only to its town (coord_confidence "medium") gets no distance.

Fields

hub string
Destination slug, as in the page address.
destination string
Destination name.
country string
Country or territory.
site string
Dive site name.
lat number, decimal degrees (WGS 84)
Latitude.
lng number, decimal degrees (WGS 84)
Longitude.
coord_confidence string
"high" when the point is the place itself; "medium" when it is only placed to the town. Medium points get no distances.
depth_m string, metres
Depth as the source states it, e.g. "3-40".
depth_min_m number, metres
Shallowest depth, read from depth_m. Empty when the source gives only a maximum.
depth_max_m number, metres
Deepest depth, read from depth_m.
level string
beginner, intermediate or advanced, as the source rates it.
entry string
"shore", "boat" or "shore or boat".
shore boolean
Reachable from shore.
boat boolean
Reachable by boat.
base_town string
The town divers base from that is closest to the site.
base_km number, km
Straight-line distance from base_town.
nearest_stay string
The closest stay on the destination page. Empty for a medium-confidence site.
nearest_stay_km number, km
Straight-line distance to nearest_stay.
hub_url url
Our page for the destination.
source string
Who the source is: an authority by name, otherwise its kind, e.g. "local dive operator".
source_url url
Where the name, position and details were read. Empty when that was a commercial source, which we cite only by kind.
checked_at date, ISO 8601 date
The day our research last read the source.

Stays near dive sites

Every hotel, dive resort and rental on our destination pages with its position, town, dive amenities, how many dive sites sit within walking range and the closest one.

64 rows · 19 fields · one row per stay

Sources and method

Names, positions and amenities come from the page in source_url: the stay's own site, its OpenStreetMap entry or a listing page. stay_url is the stay's own site, with no affiliate tag; it is empty when the only listing is a booking site. sites_within_radius counts dive sites within 1.5 km in a straight line, the same radius as the badges on our pages. A stay placed only to its town (coord_confidence "medium") gets no counts or distances.

Fields

hub string
Destination slug, as in the page address.
destination string
Destination name.
country string
Country or territory.
stay string
Stay name.
type string
Kind of stay, e.g. dive-resort, hotel, guesthouse, condo.
lat number, decimal degrees (WGS 84)
Latitude.
lng number, decimal degrees (WGS 84)
Longitude.
coord_confidence string
"high" when the point is the place itself; "medium" when it is only placed to the town. Medium points get no distances.
town string
The base town and distance line the destination page prints.
amenities list
Dive amenity tags, e.g. shore-diving, house-reef. Separated by "; " in the CSV.
sites_within_radius number
Dive sites within radius_km.
radius_km number, km
The radius sites_within_radius counts within.
nearest_site string
The closest dive site on the destination page.
nearest_site_km number, km
Straight-line distance to nearest_site.
note string
Our one-line note on the stay.
stay_url url
The stay's own site or listing, with no affiliate tag.
hub_url url
Our page for the destination.
source_url url
Where the name, position and details were read. Empty when that was a commercial source, which we cite only by kind.
checked_at date, ISO 8601 date
The day our research last read the source.

Sea temperature by month

Average, coolest and warmest monthly sea surface temperature at each destination, 2011 to 2025, from NOAA satellite data.

96 rows · 14 fields · one row per destination and month

Sources and method

Sea surface temperature: NOAA Daily Optimum Interpolation Sea Surface Temperature (OISST) v2.1, monthly means, NOAA National Centers for Environmental Information (NCEI). For each destination we use the 0.25 degree ocean cell nearest the middle of its dive sites (grid_lat, grid_lng); for Tulum and the cenotes, whose dives are in fresh water, the sea nearest Tulum. mean_c averages that cell's monthly means over 2011 to 2025; min_c and max_c are the coolest and warmest of those years. OISST describes the sea surface, not the water at dive depth. Retrieved from NOAA on 2026-10-08; https://doi.org/10.25921/RE9P-PT57

Fields

hub string
Destination slug, as in the page address.
destination string
Destination name.
month number
Calendar month, 1 to 12.
month_name string
Calendar month name.
mean_c number, °C
Mean of the monthly means over the years.
min_c number, °C
Coolest monthly mean among the years.
max_c number, °C
Warmest monthly mean among the years.
mean_f number, °F
mean_c in Fahrenheit.
min_f number, °F
min_c in Fahrenheit.
max_f number, °F
max_c in Fahrenheit.
grid_lat number, decimal degrees
Centre of the 0.25 degree OISST cell used.
grid_lng number, decimal degrees
Centre of the 0.25 degree OISST cell used.
years string
First and last year averaged.
dive_water string
"sea", or "fresh" where the dives are cenotes and the row is the nearby sea.

Formats

CSV files are UTF-8 with a header row, comma separated, quoted only where a value holds a comma or quote. An empty cell means we have no value. Lists are joined with "; ". JSON files carry the same rows plus the field list, the licence and the credit line. Every file is rebuilt from our site data each time the site is published, so it always matches what the pages show.

Every published fact, including water temperature, visibility and park rules for each destination, is also in one file at /facts.json.

New dive hubs, straight to your inbox

We add destinations as we map them. One email when a new hub goes live, nothing else.

No deals blasts, no sharing. One click to leave.