Skip to content

Documentation

HTTP API

The public read-only endpoints, and the rules for using them.


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.