{"openapi":"3.1.0","info":{"title":"Diver Atlas API","version":"1.0.0","license":{"name":"Diver Atlas terms","url":"https://www.diveratlas.com/developers"},"contact":{"url":"https://www.diveratlas.com/about"},"description":"Read-only dive-site plates. Plate verification is verified or editorial-unverified. Condition-report verification is self_declared or centre_verified. Nulls stay null."},"servers":[{"url":"https://www.diveratlas.com"}],"tags":[{"name":"sites","description":"Dive site plates."},{"name":"centres","description":"Public centre records."},{"name":"atlas","description":"Country and area coverage."}],"security":[],"x-enums":{"plate_verification":["verified","editorial-unverified"],"level":["beginner","intermediate","advanced"],"entry":["boat","shore","liveaboard","boat-or-shore"],"type":["reef","wall","pinnacle","wreck","drift","muck","cave","cavern","channel","bommie","slope","shore"],"current":["none","mild","moderate","strong","variable"],"cert":["none","discover","scuba_diver","open_water","advanced_open_water","rescue","divemaster","instructor","technical"]},"paths":{"/api/v1/sites":{"get":{"operationId":"searchSites","summary":"Search plate summaries. Example slugs: the-wall, ss-thistlegorm, maaya-thila.","security":[],"parameters":[{"name":"country","in":"query","required":false,"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"string"},"description":"Allowed values are enforced by the same zod schema used at runtime."},{"name":"area","in":"query","required":false,"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"string"},"description":"Allowed values are enforced by the same zod schema used at runtime."},{"name":"locality","in":"query","required":false,"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"string"},"description":"Allowed values are enforced by the same zod schema used at runtime."},{"name":"level","in":"query","required":false,"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"string","enum":["beginner","intermediate","advanced"]},"description":"Allowed values are enforced by the same zod schema used at runtime."},{"name":"entry","in":"query","required":false,"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"string","enum":["boat","shore","liveaboard","boat-or-shore"]},"description":"Allowed values are enforced by the same zod schema used at runtime."},{"name":"type","in":"query","required":false,"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema"},"description":"Allowed values are enforced by the same zod schema used at runtime."},{"name":"max_depth_lte","in":"query","required":false,"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"number","exclusiveMinimum":0},"description":"Allowed values are enforced by the same zod schema used at runtime."},{"name":"min_depth_gte","in":"query","required":false,"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"number","minimum":0},"description":"Allowed values are enforced by the same zod schema used at runtime."},{"name":"current","in":"query","required":false,"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"string","enum":["none","mild","moderate","strong","variable"]},"description":"Allowed values are enforced by the same zod schema used at runtime."},{"name":"verification","in":"query","required":false,"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema"},"description":"Allowed values are enforced by the same zod schema used at runtime."},{"name":"q","in":"query","required":false,"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"string"},"description":"Allowed values are enforced by the same zod schema used at runtime."},{"name":"cursor","in":"query","required":false,"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"string"},"description":"Allowed values are enforced by the same zod schema used at runtime."},{"name":"limit","in":"query","required":false,"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"integer","minimum":1,"maximum":100},"description":"Allowed values are enforced by the same zod schema used at runtime."}],"responses":{"200":{"description":"Envelope. List items carry verification inline. Single plates put verification and sources in meta.","content":{"application/json":{"example":{"data":[{"slug":"ss-thistlegorm","name":"SS Thistlegorm","country_code":"EG","country_slug":"egypt","area":"red-sea-sharm-el-sheikh","locality":"shaab-ali-strait-of-gubal","level":"advanced","entry":"boat","type":["wreck"],"depth_min_m":15,"depth_max_m":33,"current":"strong","verification":"editorial-unverified","canonical":"https://www.diveratlas.com/sites/ss-thistlegorm"},{"slug":"maaya-thila","name":"Maaya Thila","country_code":"MV","country_slug":"maldives","area":"maldives-north-ari-atoll","locality":"maayafushi","level":"intermediate","entry":"boat","type":["pinnacle"],"depth_min_m":6,"depth_max_m":30,"current":"variable","verification":"editorial-unverified","canonical":"https://www.diveratlas.com/sites/maaya-thila"},{"slug":"the-wall","name":"The Wall","country_code":"IN","country_slug":"india","area":"andaman-islands","locality":"havelock","level":"intermediate","entry":"boat","type":[],"depth_min_m":10,"depth_max_m":55,"current":"moderate","verification":"verified","canonical":"https://www.diveratlas.com/sites/the-wall"}]}}}},"304":{"description":"Not modified. Honour If-None-Match."},"400":{"description":"Unknown or invalid query.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Unknown slug.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limited. 120 requests per minute per IP.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/api/v1/sites/{slug}":{"get":{"operationId":"getSite","summary":"Full plate for a slug such as the-wall, ss-thistlegorm, or maaya-thila.","security":[],"parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Envelope. List items carry verification inline. Single plates put verification and sources in meta.","content":{"application/json":{"example":{"data":{"slug":"the-wall","name":"The Wall","aliases":[],"region":{"country":"India","country_code":"IN","country_slug":"india","area":"andaman-islands","area_name":"Andaman Islands","locality":"havelock","locality_name":"Channel between Havelock Lighthouse and Peel Island, Swaraj Dweep"},"geo":{"lat":12.05968,"lng":92.96043,"precision":"approx","note":"Surface/known-site approximation at the mooring in the Havelock–Peel channel. No GPS underwater."},"depth":{"min_m":10,"max_m":55,"typical_m":24},"visibility_m":[12,30],"water_temp_c":[27,30],"current":"moderate","surge":"mild","level":"intermediate","min_cert":"Open Water (deep sections need Advanced / Deep)","best_season":"October–May (peak December–April). Monsoon June–September.","hazards":[{"name":"Shipping channel","severity":"high","notes":"Ferry and cargo traffic; stay with the boat and respect timed windows."},{"name":"Depth","severity":"high","notes":"Wall drops past 40–55 m. Narcosis and no-deco limits are real."},{"name":"Current","severity":"moderate","notes":"Mild to moderate east-flowing current; drift technique useful."}],"marine_life":{"typical":["Napoleon wrasse","giant grouper","moray eel","octopus","gorgonian fans","sweetlips","parrotfish"],"seasonal":["trevally","barracuda","tuna"],"notable":["Crocodilefish on the sand","scorpionfish on the wall","occasional octopus mating displays"]},"entry":"boat","type":[],"access":"Boat dive, 10–15 minutes from Govind Nagar jetty. Fixed mooring buoy; backward-roll entry. Dive windows are timed around ferry traffic in the shipping channel.","scores":{"visibility":4,"current_surge":3,"water_temperature":5,"marine_life_richness":4,"coral_reef_health":3,"difficulty":4,"crowding":3},"summary":"Havelock's namesake wall: a sloping-to-vertical drop from about 10 m into the channel, scattered with fan corals, coral rock and sand pockets. Among the deepest regularly dived sites in the Andamans.","notes":null,"listed_by":[],"verification":"verified","sources":[],"conflicts":null,"confidence":"high","reviewed_at":null,"reviewed_by":null,"updated_at":"2026-08-10T06:30:00.000Z","latest_conditions":{"count":2,"avg_visibility_m":16,"avg_water_temp_c":28.5,"avg_crowding":2.5,"latest":{"observed_at":"2026-08-08T04:30:00.000Z","visibility_m":18,"current":"moderate","surge":"mild","water_temp_c":28,"crowding":2,"marine_life":4,"reef_health":3,"difficulty":4,"something_changed":false,"verification":"centre_verified","dive_verification":"operator","is_verified_report":true,"user_text":{"content":"Channel green, 18 m on the wall. Current picked up on the last third; still a clean fun-dive profile.","source":"diver-report","flagged":false}}},"canonical":"https://www.diveratlas.com/sites/the-wall"}}}}},"304":{"description":"Not modified. Honour If-None-Match."},"400":{"description":"Unknown or invalid query.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Unknown slug.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limited. 120 requests per minute per IP.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/api/v1/sites/{slug}/conditions":{"get":{"operationId":"getConditions","summary":"Condition reports, personal data stripped. Empty array when none.","security":[],"parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string"}},{"name":"limit","in":"query","required":false,"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"integer","minimum":1,"maximum":50},"description":"Allowed values are enforced by the same zod schema used at runtime."},{"name":"since","in":"query","required":false,"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"string","pattern":"^\\d{4}-\\d{2}-\\d{2}$"},"description":"Allowed values are enforced by the same zod schema used at runtime."},{"name":"until","in":"query","required":false,"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"string","pattern":"^\\d{4}-\\d{2}-\\d{2}$"},"description":"Allowed values are enforced by the same zod schema used at runtime."}],"responses":{"200":{"description":"Envelope. List items carry verification inline. Single plates put verification and sources in meta.","content":{"application/json":{"example":{"data":[{"observed_at":"2026-08-08T04:30:00.000Z","visibility_m":18,"current":"moderate","surge":"mild","water_temp_c":28,"crowding":2,"marine_life":4,"reef_health":3,"difficulty":4,"something_changed":false,"verification":"centre_verified","dive_verification":"operator","is_verified_report":true,"user_text":{"content":"Channel green, 18 m on the wall. Current picked up on the last third; still a clean fun-dive profile.","source":"diver-report","flagged":false}},{"observed_at":"2026-07-21T05:00:00.000Z","visibility_m":14,"current":"mild","surge":"mild","water_temp_c":29,"crowding":3,"marine_life":4,"reef_health":3,"difficulty":3,"something_changed":true,"verification":"centre_verified","dive_verification":"operator","is_verified_report":true,"user_text":{"content":"Slightly milkier than last month. Soft coral still dense; one new line on the 18 m gorgonian. New fishing line on the 18 m gorgonian. Cut and recovered.","source":"diver-report","flagged":false}}]}}}},"304":{"description":"Not modified. Honour If-None-Match."},"400":{"description":"Unknown or invalid query.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Unknown slug.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limited. 120 requests per minute per IP.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/api/v1/centres":{"get":{"operationId":"listCentres","summary":"Public centre fields.","security":[],"parameters":[{"name":"country","in":"query","required":false,"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"string"},"description":"Allowed values are enforced by the same zod schema used at runtime."},{"name":"area","in":"query","required":false,"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"string"},"description":"Allowed values are enforced by the same zod schema used at runtime."},{"name":"locality","in":"query","required":false,"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"string"},"description":"Allowed values are enforced by the same zod schema used at runtime."},{"name":"agency","in":"query","required":false,"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"string"},"description":"Allowed values are enforced by the same zod schema used at runtime."},{"name":"cursor","in":"query","required":false,"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"string"},"description":"Allowed values are enforced by the same zod schema used at runtime."},{"name":"limit","in":"query","required":false,"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"integer","minimum":1,"maximum":100},"description":"Allowed values are enforced by the same zod schema used at runtime."}],"responses":{"200":{"description":"Envelope. List items carry verification inline. Single plates put verification and sources in meta.","content":{"application/json":{"example":{"data":[{"slug":"diveindia-havelock","name":"DIVEIndia Havelock"}]}}}},"304":{"description":"Not modified. Honour If-None-Match."},"400":{"description":"Unknown or invalid query.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Unknown slug.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limited. 120 requests per minute per IP.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/api/v1/centres/{slug}":{"get":{"operationId":"getCentre","summary":"One centre and the sites it runs.","security":[],"parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Envelope. List items carry verification inline. Single plates put verification and sources in meta.","content":{"application/json":{"example":{"data":{"slug":"diveindia-havelock"}}}}},"304":{"description":"Not modified. Honour If-None-Match."},"400":{"description":"Unknown or invalid query.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Unknown slug.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limited. 120 requests per minute per IP.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/api/v1/atlas":{"get":{"operationId":"getAtlas","summary":"Countries, areas, site counts, verification breakdown.","security":[],"parameters":[],"responses":{"200":{"description":"Envelope. List items carry verification inline. Single plates put verification and sources in meta.","content":{"application/json":{"example":{"data":[{"slug":"egypt","verification":{"verified":0,"editorial-unverified":18}}]}}}},"304":{"description":"Not modified. Honour If-None-Match."},"400":{"description":"Unknown or invalid query.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Unknown slug.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limited. 120 requests per minute per IP.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/api/v1/atlas/{country}":{"get":{"operationId":"getAtlasCountry","summary":"One country hub, for example egypt or india.","security":[],"parameters":[{"name":"country","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Envelope. List items carry verification inline. Single plates put verification and sources in meta.","content":{"application/json":{"example":{"data":{"slug":"egypt","hub":"https://www.diveratlas.com/atlas/egypt"}}}}},"304":{"description":"Not modified. Honour If-None-Match."},"400":{"description":"Unknown or invalid query.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Unknown slug.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limited. 120 requests per minute per IP.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/api/v1/suitability":{"get":{"operationId":"checkSuitability","summary":"Rule-based suitability. Does not recommend a centre.","security":[],"parameters":[{"name":"site","in":"query","required":true,"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"string","minLength":1},"description":"Allowed values are enforced by the same zod schema used at runtime."},{"name":"cert","in":"query","required":true,"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"string","enum":["none","discover","scuba_diver","open_water","advanced_open_water","rescue","divemaster","instructor","technical"]},"description":"Allowed values are enforced by the same zod schema used at runtime."},{"name":"dives","in":"query","required":true,"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"integer","minimum":0,"maximum":9007199254740991},"description":"Allowed values are enforced by the same zod schema used at runtime."},{"name":"deep_specialty","in":"query","required":false,"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema"},"description":"Allowed values are enforced by the same zod schema used at runtime."},{"name":"last_dive_months","in":"query","required":false,"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"integer","minimum":0,"maximum":9007199254740991},"description":"Allowed values are enforced by the same zod schema used at runtime."}],"responses":{"200":{"description":"Envelope. List items carry verification inline. Single plates put verification and sources in meta.","content":{"application/json":{"example":{"data":{"status":"not_suitable","reasons":["Dive must be planned to stay above 18 m; site goes to 33 m (depth.max).","level is advanced; certification is below Advanced Open Water.","current is strong and logged dives are under 30.","Hazard \"Strong current on the wreck\" has severity high.","Editorial plate: compiled from published sources, not yet confirmed by a verified diver."],"site":"ss-thistlegorm","verification":"editorial-unverified","canonical":"https://www.diveratlas.com/sites/ss-thistlegorm","sources":[{"title":"SS Thistlegorm","url":"https://en.wikipedia.org/wiki/SS_Thistlegorm","publisher":"Wikipedia"},{"title":"Thistlegorm dive site","url":"https://dive-the-world.com/diving-sites-egypt-thistlegorm.php","publisher":"Dive The World"},{"title":"SS Thistlegorm - Sharm El Sheikh","url":"https://www.circledivers.com/diving-in-dahab/dive-sites/ss-thistlegorm-wreck-sha'ab-ali","publisher":"Circle Divers"}],"disclaimer":"General guidance from published training limits and plate data. Your dive centre's briefing and your own training decide."}}}}},"304":{"description":"Not modified. Honour If-None-Match."},"400":{"description":"Unknown or invalid query.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Unknown slug.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limited. 120 requests per minute per IP.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}}},"components":{"schemas":{"Error":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string","enum":["not_found","bad_request","rate_limited"]},"message":{"type":"string"}},"required":["code","message"],"additionalProperties":false}},"required":["error"],"additionalProperties":false}}}}