REST + GraphQL API

api.silent.fish

The same data layer that powers the atlas, the MCP server, the A2A endpoint, and the editorial site. Built for machine consumers from day one. No auth needed for read. JSON-LD on every response.

OpenAPI 3.1 spec

Read endpoints

GET/api/sites

Search dive sites. Filter by query, depth, level, month, species, reserve.

GET/api/sites/{slug}

Full site profile for a single site.

GET/api/sites/{slug}/seasonality

12-month seasonality strip with water temps and observations.

GET/api/operators/chartered

Adeos-chartered operator directory.

POST/api/trips/recommend

Ranked trip recommendations given user constraints.

POST/api/subscribe

Subscribe to the weekly dispatch.

GET/api/openapi.json

OpenAPI 3.1 spec for this API.

Examples

cURL

curl https://silent.fish/api/sites?month=8&species=manta&certification_level=Advanced

curl https://silent.fish/api/sites/hanifaru-bay

curl -X POST https://silent.fish/api/trips/recommend \
  -H "Content-Type: application/json" \
  -d '{
    "month": 8,
    "certification_level": "Advanced",
    "species": "manta",
    "budget_eur": 5000,
    "limit": 3
  }'

TypeScript

const res = await fetch("https://silent.fish/api/sites?month=8&species=manta");
const { data, meta } = await res.json();
for (const site of data) {
  console.log(site.name, site.voice_line);
}

Python

import requests
r = requests.get("https://silent.fish/api/sites", params={"month": 8, "species": "manta"})
for site in r.json()["data"]:
    print(site["name"], "-", site["voice_line"])

Pricing

Free

$0
  • 1,000 requests / day
  • All read endpoints
  • JSON-LD responses
  • No authentication needed

Pro

$29/mo
  • 100,000 requests / day
  • All endpoints
  • Webhook subscriptions on operator updates
  • API key auth

Media + Agency

$199/mo
  • Unlimited requests
  • Commercial use license
  • Annual State of Silence report data export
  • Priority support from Adeos