Worldwide Tides, Weather & Ocean API

Tides, weather, waves, swell, sea temperature, sun & moon for 18,230+ stations in 188 countries. 12 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" }, ...]
18,230+
Tide stations
188
Countries
99.9%
Uptime
<200ms
Avg response

Smart routing

Calibrated stations when nearby, global FES2022 model when not. Automatic, transparent.

Tides anywhere at sea

NEW

Exact-coordinate predictions, no station required. Built for offshore navigation and research.

Live observations

Real-time REFMAR/SHOM gauges merged with predictions for French ports.

Production-ready

Aggressive caching, webhooks, rate limiting, 99.9% uptime.

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.

12 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 tide times with heights. Use a station slug for calibrated port predictions, or pass coordinates to let TidesAtlas pick the best source automatically.

ParameterTypeDescription
portstringStation slug, e.g. aberdeen. Use /ports to search.
lat / lonfloatSmart routing: if a calibrated station is within 50 km, returns its prediction (data_source: "ticon"). Otherwise uses the FES2022 global ocean model at your exact coordinates (data_source: "fes2022"). No silent snap to a far station.
dateYYYY-MM-DDStart date (default: today).
daysint1-14 days (default: 1).
formatstringResponse format: json, csv, or geojson (default: json).
French stations — tidal coefficients included. Responses for stations in France include a coefficients object (daily morning/afternoon/max, 2026-01-01 → 2035-12-29) plus a coefficient field on each high tide (French scale, 20 = neap → 120 = extreme spring). Not applicable outside France.

Try it

Status:

Response example

{ "port": { "name": "Aberdeen", "slug": "aberdeen", "lat": 57.14, "lon": -2.08, "timezone": "Europe/London" }, "data_source": "ticon", "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" }, ... ] }

France: tidal coefficients (French scale)

For stations in France, the response includes the French tidal coefficient — a dimensionless number from 20 (neap tide) to 120 (extreme spring tide), commonly used in French maritime contexts. The field appears in two places:

  • A coefficient field on each high tide in extremes (omitted on low tides).
  • A top-level coefficients object with daily morning/afternoon/max values for the requested date range.

Coverage: 2026-01-01 → 2035-12-29. Source: computed in-house from Brest harmonic constituents. Geography: French stations only — the fields are omitted for stations outside France.

Scale legend: < 45 = neap tide (mortes-eaux), 45-70 = average, 70-95 = above average, 95-110 = spring tide (vives-eaux), > 110 = exceptional spring tide.

# Get tides + coefficients for Dunkerque, France GET /api/v1/tides?port=dunkerque&days=3&date=2026-05-14
Example response (France-only fields shown):
{ "port": { "name": "Dunkerque", "country": "France", ... }, "data_source": "ticon", "extremes": [ { "datetime": "2026-05-14T05:49:00+02:00", "height_m": 0.81, "type": "low" }, { "datetime": "2026-05-14T11:49:00+02:00", "height_m": 5.56, "type": "high", "coefficient": 71 }, { "datetime": "2026-05-14T18:25:00+02:00", "height_m": 0.89, "type": "low" }, { "datetime": "2026-05-15T00:09:00+02:00", "height_m": 5.61, "type": "high", "coefficient": 77 }, ... ], "coefficients": { "available": true, "source": "Computed from Brest harmonic constituents (French tidal coefficient scale)", "scale": "20 (neap) to 120 (extreme spring)", "coverage": "2026-01-01 to 2035-12-29", "daily": [ { "date": "2026-05-14", "morning": 71, "afternoon": 77, "max": 77 }, { "date": "2026-05-15", "morning": 83, "afternoon": 88, "max": 88 }, ... ] } }
GET /api/v1/tides/point Explicit FES2022 model at exact coordinates NEW

Always uses the FES2022 global ocean tide model (34 harmonic constituents) at the exact coordinates you provide — never snaps to a station. Use this when you specifically need the model output (research, comparisons, offshore navigation). For most apps, /api/v1/tides?lat=&lon= is a better choice since it picks the best source automatically.

ParameterTypeDescription
latfloatLatitude, decimal degrees, -90 to 90. Required.
lonfloatLongitude, decimal degrees, -180 to 180. Required.
dateYYYY-MM-DDStart date UTC (default: today).
daysint1-14 days (default: 1).
datumstringVertical reference: LAT (default, like the /tides endpoint) or MSL.
intervalintMinutes between samples, 5-60 (default: 10). Sets the spacing of the optional heights series and the resolution of extremes detection.
heightsboolSet to 1 to also return an interval-sampled height series — ideal for plotting the tide curve (default: off). Each point is { datetime, height_m }.
How it differs from /api/v1/tides: the /tides endpoint snaps your coordinates to the nearest of 18,000+ predefined stations. /tides/point computes the prediction directly at the exact coordinates you provide, using the FES2022 grid (~7 km resolution). Returns a 404 if the point is on land or outside the ocean mask.

Response example

{ "query": { "lat": 48.383, "lon": -4.495, "date": "2026-05-13", "days": 1, "datum": "LAT" }, "model": "FES2022 (34 constituents) via pyfes", "datum": "LAT", "datum_offset_msl": -3.5268, "count": 4, "extremes": [ { "datetime": "2026-05-13T00:20:00+00:00", "height_m": 5.42, "type": "high" }, { "datetime": "2026-05-13T07:00:00+00:00", "height_m": 1.31, "type": "low" }, ... ], "attribution": { "source": "FES2022 by LEGOS/NOVELTIS/CLS, distributed by AVISO+ ..." } }
# Tides anywhere at sea — example: middle of Atlantic GET /api/v1/tides/point?lat=35&lon=-30&days=3 # Tide curve for plotting — sampled height every 30 min GET /api/v1/tides/point?lat=48.38&lon=-4.49&days=1&interval=30&heights=1 # → adds: "heights_count": 48, # "heights": [ { "datetime": "...", "height_m": 3.75 }, ... ]
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 188 countries with their station count.

{ "count": 188, "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.

Data freshness: Weather data is sourced from NOAA GFS (updated every 6 hours) and cached server-side. Responses may be up to 6 hours old for coastal stations and up to 24 hours for inland locations. If the upstream provider is temporarily unavailable, stale cached data (up to 48h) is served automatically — check the cached and stale fields in the response. A 502 response means no data is available at all for that location.
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", ... }, ... ] }

Possible condition values

The condition field always returns one of these values (map an icon to each, including unknown):

clearmostly_clearpartly_cloudyovercastfogfreezing_foglight_drizzledrizzleheavy_drizzlefreezing_drizzleheavy_freezing_drizzlelight_rainrainheavy_rainfreezing_rainheavy_freezing_rainlight_snowsnowheavy_snowsnow_grainslight_showersshowersheavy_showerssnow_showersheavy_snow_showersthunderstormthunderstorm_hailheavy_thunderstorm_hailunknown
GET /api/v1/marine Ocean, wave & water-temperature forecast

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

Data freshness: Marine data is sourced from Copernicus/ECMWF (updated every 6 hours) and cached server-side. Responses may be up to 6 hours old for coastal stations. If the upstream provider is temporarily unavailable, stale cached data (up to 48h) is served automatically — check the cached and stale fields. A 502 means no data is available for that location.
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, "sea_surface_temperature_c": 14.2, ... }, ... ] }

Each hourly entry also includes sea_surface_temperature_c — the sea-surface (water) temperature in °C, from satellite SST (MUR / GHRSST, ~1 km), accurate near coasts.

Possible sea_state values

The sea_state field is based on the Douglas sea scale (from wave height) and always returns one of these values:

calm_glassycalm_rippledsmoothslightmoderateroughvery_roughhighvery_highunknown
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

Data sources & attribution

TidesAtlas builds the routing, caching and integration layer on top of these open scientific datasets. Each source is listed with its license.

FES2022

Global finite-element ocean tide model. Used for the /api/v1/tides/point endpoint and for 13,360+ FES2022-derived stations.

Produced by LEGOS, NOVELTIS and CLS. Distributed by AVISO+ with support from CNES. Use requires citation per AVISO+ license. Product page →

TICON

Harmonic constants for 3,000+ tide gauges worldwide. Used for the /api/v1/tides endpoint.

Sourced from the GESLA/PANGAEA database. License: CC BY 4.0 — commercial use permitted. Dataset →

NOAA CO-OPS

Harmonic constants for 1,000+ US tide stations.

Public domain (US government work). NOAA CO-OPS →

REFMAR / SHOM

Live observations from ~100 French tide gauges. Used to enrich /tides responses for French ports.

License: Etalab 2.0. REFMAR →

Weather & marine

NOAA GFS (weather) and Copernicus Marine / ECMWF (waves, marine state) via Open-Meteo.

License: CC BY 4.0. Open-Meteo →

Rain radar

Live rain radar tiles via RainViewer.

Attribution required, commercial use permitted. RainViewer →

Citing TidesAtlas in your work? Link to tidesatlas.com and credit the upstream source (e.g. "FES2022 via TidesAtlas") when the tide model is the key dataset.

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 12 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)

Two limits apply — exceeding either returns HTTP 429 Too Many Requests:

Plan quotaFree 50 total · Hobby 500/day · Starter 1,000/day · Pro 10,000/day · Business 50,000/day
Per-IP rate10 requests/second per IP (short bursts up to 30), max 20 concurrent connections

On a 429, wait before retrying (see Retry-After / X-RateLimit-Reset). Exponential backoff is recommended.

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.
Can I get tide predictions at exact coordinates (not just predefined ports)?
Yes. Pass ?lat=&lon= to /api/v1/tides and TidesAtlas picks the best source automatically: if a calibrated station is within 50 km, it returns the station prediction; otherwise it uses the FES2022 global ocean tide model at your exact coordinates. For an explicit model-only response (no station snap), use /api/v1/tides/point. Both work anywhere on the world's oceans, no station required.
Are there SDKs or libraries for Python, Node.js, or other languages?
Yes. Install pip install tidesatlas (Python) or npm install tidesatlas (Node.js). We also publish an MCP server at tidesatlas.com/mcp for AI agents, and the API itself is plain REST — usable from any language with curl-style HTTP. Source code is available on GitHub under @TidesAtlas.
Does the API provide sea (water) temperature?
Yes. The /api/v1/marine endpoint returns hourly sea-surface (water) temperature in °C (sea_surface_temperature_c), alongside wave height, swell, wind waves and sea state. Data comes from the Copernicus/ECMWF marine model via Open-Meteo.
Can I get tide heights to plot a tide curve, not just high/low times?
Yes. Call /api/v1/tides/point with ?heights=1&interval=30 to get an interval-sampled height series ({ datetime, height_m } every 5–60 minutes) — everything you need to draw a smooth tide curve. Without the flag you get the high/low extremes only.
Do you provide wave and swell forecasts?
Yes. The /api/v1/marine endpoint returns hourly and daily wave height, period and direction, swell, wind waves, sea state (Douglas scale) and sea-surface temperature — from Copernicus/ECMWF ocean models.

Start building with tides, weather & ocean data today

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

Get your free API key