HTTP API
The public part of this API is read-only and disallowed in robots.txt, because crawling it spends
real forecast fetches against NOAA and ECMWF for results nobody reads. The
project endpoints below are not public and not read-only; they need a session.
All responses use one envelope:
{ "success": true, "data": {}, "error": null }GET /api/weather-routing/providers
The available forecast models, their coverage, and the recommended strategies. Public, cacheable, and the right place to start if you are building something against this.
GET /api/weather-routing/certificates?q=
ORC certificate search by sail number or name. Rate limited to 60 requests a minute.
POST /api/weather-routing/polar
Parse a pasted polar table and return the normalised curve set with any warnings. Nothing is stored.
GET /api/weather-routing/routes/{shareToken}
Reopen a shared route. Returns 410 rather than 404 when a route has passed its retention window, so a client can tell "this expired" from "this never existed".
Project endpoints
These are not read-only and not public: every one of them requires a session cookie, and every one scoped to a project answers 404 to a non-member rather than 403. Whether a given project id exists is not something a stranger is owed.
They are documented because they are the app's own interface and you may reasonably script against your own projects — not as a stable contract. Shapes here can change with the workspace.
| Endpoint | Method | What it does |
|---|---|---|
/api/weather-routing/projects |
GET, POST | List your projects; create one. Creating requires Pro and answers 402 otherwise. |
/api/weather-routing/projects/{id} |
GET, PATCH, DELETE | The full snapshot — project, members, courses, boats, recent runs. Deleting is owner-only. |
/api/weather-routing/projects/{id}/version |
GET | The polling cursor. Send If-None-Match and get 304 with an empty body until something changes. |
/api/weather-routing/projects/{id}/members |
POST | Invite an address. Owner only. The invitation token appears in the email and nowhere else. |
/api/weather-routing/projects/{id}/members/{memberId} |
DELETE | Remove a member. Owners remove anyone; editors may remove only themselves. The owner's own row is refused. |
/api/weather-routing/project-invites/{token} |
GET, POST | Preview an invitation without signing in; accept it signed in. Single use. |
/api/weather-routing/projects/{id}/courses |
POST | Save a course. |
/api/weather-routing/projects/{id}/courses/{courseId} |
PATCH, DELETE | Update or remove one. A PATCH carries expectedVersion; a stale one answers 409 with the current copy in data.current. |
/api/weather-routing/boats |
GET, POST | Your own boats. |
/api/weather-routing/boats/{id} |
PATCH, DELETE | Edit or delete one of yours. |
/api/weather-routing/projects/{id}/boats |
POST | Lend one of your boats to a project — which is what permits its other editors to run with it. |
/api/weather-routing/projects/{id}/boats/{boatId} |
DELETE | Withdraw it again. |
/api/weather-routing/grib/options |
GET | What can be exported for a project right now: models with a complete cycle, their layers, horizons and intervals, and a size estimate for a selection. |
/api/weather-routing/grib |
POST | Build (or reuse) a corridor GRIB2 and return a signed URL. Refusals — an antimeridian crossing, a model with no loaded cycle — come back as a code rather than a broken file. |
/api/weather-routing/projects/{id}/archive |
GET | The project's retained weather: model, cycle, size, and a download link per artifact. |
/api/weather-routing/projects/{id}/yellowbrick |
POST, DELETE | Attach a tracked race (and optionally import its course); detach it. |
/api/weather-routing/projects/{id}/fleet |
GET | Entries and positions for the attached race. since fetches only what is new; positions are [entryId, epochMs, lat, lon, dtf] tuples, ascending by time. |
A route is started inside a project by adding a project block to the ordinary
POST /api/weather-routing/client-sessions request rather than by calling a different endpoint. It
carries projectId and optionally courseId, boatId, kind (route or what-if) and label.
Everything else about the request — validation, limits, metering — is unchanged, which is the point.
Rate limits and fair use
Preparation is expensive and shared. Automated requests beyond what a person planning routes would generate degrade the service for everyone, and the terms ask you not to. If you have a use that needs more, ask — it is usually arrangeable.