API documentation
One API, four products. Every endpoint lives under https://mareelearth.com/v1 and is served from Mareel's own pre-computed data: tides are synthesized on demand from harmonic constants; the marine forecast and the global weather are read from pre-baked global grids. Responses are JSON.
Products
| Product | Status | Endpoints | What it serves |
|---|---|---|---|
| Tides | Live | /v1/tides/*, /v1/stations | Tide heights, high/low extremes, current level, tidal datums - any ocean coordinate |
| Waters | Live | /v1/waters | Marine forecast: waves incl. swell partitions, wind, currents, SST, depth - 10-day horizon |
| Heavens | Live | /v1/heavens | Global weather: temperature, wind, clouds, precipitation, CAPE - land & sea, finest over cities |
| Lands | Coming soon | /v1/lands/* | Land & terrain data |
Coming-soon products return 503 coming_soon on their keyed endpoints until launch.
Authentication
Create an API key from your dashboard (sign in → API keys → Create key). Keys look like mk_live_… and are shown once at creation. Pass the key on every request, preferably as a Bearer token:
curl -H "Authorization: Bearer mk_live_YOUR_KEY" \ "https://mareelearth.com/v1/tides/current?lat=58.0&lon=11.0"
Also accepted: an X-Api-Key header, or ?key= as a query parameter (avoid in logs). All endpoints are GET and CORS-open, so browser use works - but treat keys as secrets and prefer calling from your server.
Quickstart
# Current tide at a Swedish west-coast point curl -H "Authorization: Bearer mk_live_YOUR_KEY" \ "https://mareelearth.com/v1/tides/current?lat=58.0&lon=11.0" # 10-day marine forecast (waves, wind, currents, SST) at the same point curl -H "Authorization: Bearer mk_live_YOUR_KEY" \ "https://mareelearth.com/v1/waters?lat=58.0&lon=11.0" # 10-day weather (temperature, wind, clouds, precipitation) for a city curl -H "Authorization: Bearer mk_live_YOUR_KEY" \ "https://mareelearth.com/v1/heavens?lat=59.27&lon=15.21"
Batch requests
Every point product has a /batch variant that takes up to 100 coordinates in one call as equal-length comma lists, and returns a per-point results array in input order. A point with no data carries a per-point error and never fails the whole call. One 100-point sweep replaces 100 single calls: the monthly quota is metered in points (only points that return data are billed), while the per-minute rate limit counts the whole batch as one request.
# Marine forecast at three points in one call
curl -H "Authorization: Bearer mk_live_YOUR_KEY" \
"https://mareelearth.com/v1/waters/batch?lat=59.3,58.9,57.7&lon=18.1,17.6,11.9"
# -> { "count": 3, "covered": 3, "results": [ {…}, {…}, {…} ] }| Endpoint | Per point |
|---|---|
/v1/tides/batch | Heights AND extremes together - the complete tide answer |
/v1/waters/batch | The full marine-forecast body |
/v1/heavens/batch | The full weather body |
The same query params as the single-point routes (e.g. vars=, or the tide window + datum) apply to every point. Max 100 points per call; a transient point failure is retryable and sets a top-level Retry-After.
Plans & limits
Every tier includes every product (Tides, Waters, Heavens - and Lands when it launches) on one key. Tiers differ only by monthly quota (metered in points - one single-point call = 1 point, an N-point batch = N) and the per-minute rate limit.
| Plan | Points / month | Rate limit | API keys | Price |
|---|---|---|---|---|
| Free | 25,000 | 60 / min | 1 | $0 |
| Seedling | 150,000 | 120 / min | 2 | $7 / mo |
| Grove | 1,000,000 | 300 / min | 5 | $19 / mo |
| Colossal | 5,000,000 | 600 / min | 20 | $79 / mo |
The rate limit is per key, per product - a burst on one product never eats another's budget. Every response that reaches the handler (and every 429) carries X-RateLimit-Limit, X-RateLimit-Remaining and X-RateLimit-Reset (seconds to a full bucket) so you can pace yourself before hitting a 429; a 429 also includes Retry-After. Metered plans additionally get X-Quota-Limit / X-Quota-Used.
Errors
All errors share one envelope:
{ "error": { "code": "unauthorized", "message": "Missing or invalid API key. ..." } }| HTTP | Code | Meaning |
|---|---|---|
| 400 | bad_request | Missing or invalid parameters |
| 401 | unauthorized | Missing or invalid API key |
| 402 | quota_exceeded | Monthly quota used up - upgrade to continue |
| 403 | product_not_enabled | Your account does not include this product |
| 422 | no_ocean_tide / no_ocean_cell / no_cell | No data at this point (Tides/Waters: point is inland; Heavens: >60 km from any cell) |
| 429 | rate_limited | Too many requests - respect Retry-After |
| 503 | coming_soon | Product not launched yet (Lands) |
Attribution & use
Tide data is derived from the FES2022 model (CNES/LEGOS/NOVELTIS/CLS, via AVISO); forecast data blends open model output from NOAA, ECMWF, DWD, ECCC and Copernicus. Keep the meta.attribution notices visible where you display the data - details on the attribution page. All values are modelled estimates provided as-is: not for navigation or safety-of-life decisions.