Trusted by 50+ developers

Worldwide Tides, Weather & Ocean API

Tides, weather, waves, sun & moon for 3,000+ stations in 112 countries. 7 REST endpoints. One API key. Built on TICON-4, NOAA & FES2022 models.

Try it now
// Fetch today's tides in San Francisco
const res = await fetch(
  'https://tidesatlas.com/api/v1/tides?port=san-francisco&days=3',
  { headers: { 'X-API-Key': 'YOUR_KEY' } }
);
const { extremes } = await res.json();
// [{ datetime: "2026-03-27T05:12:00-07:00", height_m: 1.82, type: "high" }, ...]
3,000+
Tide stations
112
Countries
99.9%
Uptime
<200ms
Avg response

Built for every tide use case

From hobby weather apps to enterprise marine platforms.

Marine navigation

Port entry/exit planning, draft clearance calculations, and passage timing.

Fishing apps

Optimal fishing windows based on tide phase, height, and tidal flow.

Surf & water sports

Tide-aware surf reports, kayak trip planners, and beach activity guides.

Coastal real estate

Flood risk analysis, waterfront property insights, and insurance assessments.

Research & science

Oceanography datasets, marine biology fieldwork, and climate modeling.

Weather & travel

Integrate tides into weather dashboards, travel planners, and IoT devices.

9 endpoints, infinite possibilities

Clean JSON, CSV & GeoJSON responses. No XML, no SOAP, no headaches.

Tides Pack
GET /api/v1/tides Tide times & heights

Returns high and low water times with heights in meters for any station.

ParameterTypeDescription
portstringStation slug, e.g. aberdeen. Use /ports to search.
lat / lonfloatCoordinates — returns nearest station.
dateYYYY-MM-DDStart date (default: today).
daysint1-14 days (default: 1).
formatstringResponse format: json, csv, or geojson (default: json).

Try it

Status:

Response example

{ "port": { "name": "Aberdeen", "slug": "aberdeen", "lat": 57.14, "lon": -2.08, "timezone": "Europe/London" }, "date": "2026-03-27", "days": 3, "count": 12, "extremes": [ { "datetime": "2026-03-27T04:23:00+00:00", "height_m": 3.82, "type": "high" }, { "datetime": "2026-03-27T10:41:00+00:00", "height_m": 0.94, "type": "low" }, ... ] }
GET /api/v1/ports Search stations

Search and list available tide stations worldwide.

ParameterTypeDescription
searchstringSearch by name, e.g. aberdeen.
countrystringFilter by country slug, e.g. united-kingdom.
limitintMax results, 1-500 (default: 50).
formatstringResponse format: json, csv, or geojson (default: json).
# Find all stations in Japan GET /api/v1/ports?country=japan&limit=100 # Search by name GET /api/v1/ports?search=tokyo
GET /api/v1/countries List all countries

Returns all 112 countries with their station count.

{ "count": 112, "countries": [ { "name": "United Kingdom", "slug": "united-kingdom", "code_iso": "GB", "station_count": 238 }, { "name": "United States", "slug": "united-states", "code_iso": "US", "station_count": 156 }, ... ] }
Weather Pack
GET /api/v1/weather Weather forecast

Returns hourly and daily weather forecast including temperature, wind, precipitation, UV index, and conditions.

ParameterTypeDescription
portstringStation slug, e.g. brest-3-fra-refmar
lat / lonfloatCoordinates (alternative to port).
daysint1-7 days (default: 3).

Response example

{ "lat": 48.39, "lon": -4.49, "timezone": "Europe/Paris", "source": "NOAA GFS via Open-Meteo (CC BY 4.0)", "daily": [{ "date": "2026-03-27", "temperature_max_c": 12.3, "temperature_min_c": 7.3, "precipitation_mm": 1.5, "wind_max_kmh": 19.2, "uv_index_max": 3.35, "condition": "light_drizzle", "sunrise": "06:06", "sunset": "18:40" }], "hourly": [ { "datetime": "2026-03-27T00:00", "temperature_c": 7.3, "feels_like_c": 4.6, "humidity_pct": 78, "wind_speed_kmh": 4.5, "condition": "overcast", ... }, ... ] }
GET /api/v1/marine Ocean & wave forecast

Returns wave height, swell, wind waves, and sea state from Copernicus/ECMWF ocean models.

ParameterTypeDescription
portstringStation slug, e.g. brest-3-fra-refmar
lat / lonfloatCoordinates (alternative to port).
daysint1-7 days (default: 3).

Response example

{ "lat": 48.39, "lon": -4.49, "source": "Copernicus Marine / ECMWF via Open-Meteo (CC BY 4.0)", "daily": [{ "date": "2026-03-27", "wave_height_max_m": 1.04, "wave_period_max_s": 10.05, "wave_direction_dominant": 268, "swell_height_max_m": 0.98, "swell_period_max_s": 9.2, "sea_state": "smooth" }], "hourly": [ { "datetime": "2026-03-27T00:00", "wave_height_m": 1.02, "wave_direction_deg": 275, "swell_height_m": 0.98, ... }, ... ] }
GET /api/v1/astronomy Sun & moon data

Returns sunrise, sunset, dawn, dusk, moon phase, illumination, moonrise and moonset.

ParameterTypeDescription
portstringStation slug, e.g. brest-3-fra-refmar
lat / lonfloatCoordinates (alternative to port).
dateYYYY-MM-DDStart date (default: today).
daysint1-7 days (default: 1).

Response example

{ "lat": 48.39, "lon": -4.49, "data": [{ "date": "2026-03-27", "sun": { "sunrise": "06:06", "sunset": "18:41", "dawn": "05:35", "dusk": "19:12", "day_length": "12:35" }, "moon": { "phase": "first_quarter", "illumination_pct": 66.8, "age_days": 9, "moonrise": "13:45", "moonset": "03:12" } }] }
GET /api/v1/conditions All conditions (unified)

Returns weather, marine, and astronomy data in a single call. Use the include parameter to select specific datasets.

ParameterTypeDescription
portstringStation slug, e.g. brest-3-fra-refmar
lat / lonfloatCoordinates (alternative to port).
daysint1-7 days (default: 3).
includestringComma-separated: weather,marine,astronomy (default: all).

Response example

# All data in one call GET /api/v1/conditions?port=brest-3-fra-refmar&days=3 # Only weather + astronomy GET /api/v1/conditions?lat=48.39&lon=-4.49&include=weather,astronomy # Response contains: weather{}, marine{}, astronomy[]
GET /api/v1/radar Rain radar

Returns real-time rain radar tile URLs for animated precipitation maps. Data from RainViewer, updated every ~10 minutes.

ParameterTypeDescription
portstringStation slug, e.g. brest-3-fra-refmar
lat / lonfloatCoordinates (alternative to port).

Response example

{ "lat": 48.39, "lon": -4.49, "generated": 1774697424, "source": "RainViewer (rainviewer.com)", "tile_size": 256, "max_zoom": 7, "color_scheme": 1, "frames": { "past": [ { "time": "2026-03-28T14:30:00Z", "timestamp": 1774690200, "tile_url": "https://tilecache.rainviewer.com/v2/radar/.../256/{z}/{x}/{y}/1/1_1.png" } ], "nowcast": [ { "time": "2026-03-28T15:00:00Z", "timestamp": 1774692000, "tile_url": "https://tilecache.rainviewer.com/v2/radar/.../256/{z}/{x}/{y}/1/1_1.png" } ] } }

Real-time data with ~10 minute delay. Tile URLs are standard slippy map format compatible with Leaflet, Mapbox GL, etc.

GET /api/v1/observations Sea level observations LIVE

Returns real-time observed sea level heights from French REFMAR/SHOM tide gauges. Available for ~100 French stations.

ParameterTypeDescription
portstringStation slug (French REFMAR stations only), e.g. brest
dateYYYY-MM-DDStart date (default: today).
daysint1-7 days (default: 1).

Response example

{ "port": { "name": "Brest", "slug": "brest", "country": "France" }, "station_id": 3, "source": "REFMAR/SHOM (Licence Etalab 2.0)", "interval_minutes": 10, "data": [ { "date": "2026-03-28", "observations": [ { "datetime": "2026-03-28T00:00", "height_m": 9.15, "timestamp": 1774684800 }, ... ]} ] }

Only available for French REFMAR stations (~100 tide gauges). Observations are sub-sampled to 10-minute intervals. Heights are aligned with our prediction datum. The /api/v1/tides endpoint also includes an observations field for REFMAR stations.

Complete pack only
GET /api/v1/history Historical data

Returns historical tide predictions and weather data for past dates. Tides via TICON engine, weather via Open-Meteo Archive.

ParameterTypeDescription
portstringStation slug (required).
dateYYYY-MM-DDStart date in the past (required).
daysint1-365 for tides, 1-90 for weather (default: 7).
includestringComma-separated: tides,weather (default: tides).
formatstringResponse format: json, csv, or geojson (default: json).

Try it

Status:

Response example

# Get historical tides and weather for Brest GET /api/v1/history?port=brest&date=2025-06-01&days=7&include=tides,weather
POST /api/v1/webhooks Webhooks

Create, manage, and test webhooks for real-time alerts on spring tides and storm warnings.

ParameterTypeDescription
actionstringlist, create, update, delete, test
idintWebhook ID (for update/delete/test).

Supported events

  • spring_tide — Spring tide alert (high tide > 4m)
  • storm_warning — Storm warning (wind > 60km/h or waves > 4m)

All deliveries are signed with HMAC-SHA256. Verify the X-TidesAtlas-Signature header.

Webhooks are auto-disabled after 3 consecutive failures.

# Create a webhook POST /api/v1/webhooks?action=create { "url": "https://example.com/webhook", "events": ["spring_tide", "storm_warning"], "port_slug": "brest" } # Test delivery POST /api/v1/webhooks?action=test&id=1

Quick start in your favorite language

Copy, paste, and start building in under 60 seconds.

cURL
JavaScript
Python
PHP
# Get 3-day tides for San Francisco curl -H "X-API-Key: YOUR_KEY" \ "https://tidesatlas.com/api/v1/tides?port=san-francisco&days=3"
const response = await fetch( 'https://tidesatlas.com/api/v1/tides?port=san-francisco&days=3', { headers: { 'X-API-Key': 'YOUR_KEY' } } ); const { extremes } = await response.json(); extremes.forEach(e => console.log(`${e.type}: ${e.datetime} — ${e.height_m}m`) );
import requests response = requests.get( 'https://tidesatlas.com/api/v1/tides', params={'port': 'san-francisco', 'days': 3}, headers={'X-API-Key': 'YOUR_KEY'} ) for e in response.json()['extremes']: print(f"{e['type']}: {e['datetime']} — {e['height_m']}m")
$ch = curl_init('https://tidesatlas.com/api/v1/tides?port=san-francisco&days=3'); curl_setopt($ch, CURLOPT_HTTPHEADER, ['X-API-Key: YOUR_KEY']); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); $data = json_decode(curl_exec($ch), true); curl_close($ch); foreach ($data['extremes'] as $e) { echo "{$e['type']}: {$e['datetime']} — {$e['height_m']}m\n"; }

Official SDKs

Get started faster with our official client libraries.

JavaScript / Node.js
npm install tidesatlas
const TidesAtlas = require('tidesatlas'); const api = new TidesAtlas('YOUR_KEY'); const data = await api.tides({ port: 'san-francisco', days: 3 }); console.log(data.extremes);
Python
pip install tidesatlas
from tidesatlas import TidesAtlas api = TidesAtlas("YOUR_KEY") data = api.tides(port="san-francisco", days=3) print(data["extremes"])

MCP Server for AI Agents

Connect TidesAtlas directly to Claude, Cursor, or any MCP-compatible AI assistant.

MCP endpoint

https://tidesatlas.com/mcp

8 tools available: tides, ports, countries, weather, marine, astronomy, conditions, history.

Claude Desktop configuration

{ "mcpServers": { "tidesatlas": { "url": "https://tidesatlas.com/mcp", "headers": { "X-API-Key": "YOUR_KEY" } } } }

Simple, transparent pricing

Start free. Scale when you need to. No hidden fees.

All 7 endpoints
Free
$0
50 one-time credits
Start free
Hobby
$7.99/mo
500 requests / day
Get started
Pro
$39/mo
10,000 requests / day
Get started
Business
$99/mo
50,000 requests / day
Contact us
Secure payment via Stripe
Cancel anytime
HTTPS encrypted
GDPR compliant

Authentication & rate limits

Authentication

Pass your API key via header (recommended) or query parameter:

# Header (recommended) curl -H "X-API-Key: YOUR_KEY" https://tidesatlas.com/api/v1/tides?port=aberdeen # Query parameter curl https://tidesatlas.com/api/v1/tides?port=aberdeen&api_key=YOUR_KEY

Rate limit headers

Every response includes your usage info:

X-RateLimit-LimitYour daily limit
X-RateLimit-RemainingRequests left today
X-RateLimit-ResetReset time (Unix)

Frequently asked questions

What powers TidesAtlas predictions?
We built a proprietary harmonic prediction engine that fuses three complementary datasets: TICON-4 (3,000+ reference stations, up to 60 tidal constituents), NOAA (1,075 US stations, 37 constituents), and the FES2022 global ocean model by LEGOS/CNES (13,000+ coastal points, 8 major constituents). Each source was individually calibrated, cross-validated, and integrated into a unified pipeline — a significant engineering effort that took months to build. The result: 17,400+ stations across 188 countries, all served through a single, consistent API. For ~100 French stations, we also provide real-time tide gauge observations from the REFMAR/SHOM network.
How accurate are the predictions?
Our algorithm performs harmonic analysis using up to 60 tidal constituents per station, with automatic datum alignment and nodal corrections. For primary stations (TICON-4, NOAA), accuracy is typically within 5-10 minutes and 10-15 cm. For model-derived stations (FES2022), accuracy is within 10-20 minutes and 15-25 cm. We continuously validate our outputs against real-time observations where available. Weather conditions (wind, atmospheric pressure) can cause additional deviations — that's why we also provide marine weather data to give you the full picture.
Do I need a credit card to start?
No. The free plan gives you 50 one-time credits with no credit card required. You only need payment details when upgrading to a paid plan.
Can I use it for commercial projects?
Yes! All plans (including Free) allow commercial use. While we leverage open datasets, our prediction engine, API infrastructure, and data pipeline are entirely built in-house. Just include an attribution to TidesAtlas somewhere in your app.
What happens if I exceed my daily limit?
You'll receive a 429 status code. Your limit resets at midnight UTC. You can upgrade your plan at any time from the dashboard to get more requests.

Start building with tides, weather & ocean data today

Free API key in 30 seconds. No credit card needed.

Get your free API key