API
Local, mock-friendly HTTP for the 1.0 truth layer. No keys required in this slice. Live coordinator or VTS feeds are out of scope.
GET
/api/marinas
Entire 1.0 ledger. Optional ?q=®ion=&focus=&minLoa=
GET
/api/marinas/:slug
One harbour dossier, including basins, piers, facts and maps.
GET
/api/search?q=monaco
Name, locality, UN/LOCODE and cruising-ground search.
POST
/api/feasibility
JSON body { loaM, beamM, draftM, airDraftM?, commercial?, date?, slug? }
GET
/api/marinas/:slug/live
Open-Meteo, marine, FX, OSM and NOAA observations for one harbour.
GET
/v1/harbors
Versioned Harbor list. UUID identity, identifiers, aliases, current location.
GET
/v1/harbors/:id
One Harbor by UUID, slug or internal key. Explicit public serializer.
GET
/v1/search?q=monaco
Search plus alias resolution to a canonical Harbor UUID.
POST
/v1/feasibility
Tier 3 derived feasibility. Same vessel body as /api/feasibility; verdict may be INSUFFICIENT_DATA.
GET
/v1/harbors/:id/infrastructure
Canonical basins, piers, berths, berth classes, moorings, anchorages, approaches. Requires DATABASE_URL.
GET
/v1/harbors/:id/basins
HarborBasin current versions. BerthClass is not included.
GET
/v1/harbors/:id/berths
Physical HarborBerth rows only. Empty when only classes are known.
GET
/v1/harbors/:id/moorings
HarborMooring rows. Separate from anchorages.
GET
/v1/harbors/:id/anchorages
HarborAnchorage rows. No anchoring recommendations.
GET
/v1/harbors/:id/approaches
HarborApproachChannel current versions. Not a safety determination.
GET
/v1/harbors/:id/hydrography
Governed depths, bathymetry, station links, observations and provider conflicts.
GET
/v1/harbors/:id/observations
Typed marine observations. Missing credentials stay graceful.
POST
/v1/compatibility
Static compatibility + dynamic arrival feasibility + reason graph. Direct dimensions remain supported.
GET
/v1/harbors/:id/arrival-brief
Machine-readable arrival projection. Query loaM, beamM, draftM.
GET
/v1/harbors/:id/warnings
Active / upcoming / expired notices with UNKNOWN coverage semantics.
GET
/v1/vessels/:id
Canonical vessel UUID, identifier history and current dimensions.
GET
/v1/vessels/resolve
IMO/MMSI/name resolution. Name-only is never an automatic merge.
GET
/v1/harbors/:id/formalities
Port-entry, customs, immigration, health and MSW applicability. Decision-support only.
GET
/v1/harbors/:id/pilotage
Governed pilotage state. Missing data is UNKNOWN / NOT_COVERED, not NOT_REQUIRED.
GET
/v1/harbors/:id/entry-requirements
Alias of formalities for a harbour. Port of Entry ≠ 24-hour clearance.
POST
/v1/arrival-requirements
Evaluate known requirements for a vessel profile. Never returns 'cleared' or 'NOAD submitted'.
GET
/v1/harbors/:id/services
Governed service graph. Missing records are UNKNOWN, not unavailable. OSM stays third-party.
GET
/v1/harbors/:id/fuel
Fuel facilities and bunkering providers. Not live stock. Not a price.
GET
/v1/harbors/:id/utilities
Shore power, freshwater and waste streams. Unknown amperage is not unlimited amperage.
GET
/v1/harbors/:id/refit
Shipyard, travel lift, crane and dry dock. A crane is not a haul-out system.
GET
/v1/harbors/:id/connectivity
Medical, airport and transit relationships. Airport Intelligence stays external.
POST
/v1/service-match
Deterministic vessel/mission service match. No collapsed score.
GET
/v1/harbors/:id/tariffs
Official publications and rules at factsAt. Compiled fee bands stay COMPILED_UNVERIFIED. Missing tariff ≠ zero.
POST
/v1/cost-estimate
Explainable cost estimate. Unknown charges stay outside TOTAL_KNOWN. FX is reference conversion only.
GET
/v1/harbors/:id/traffic
Explainable AIS approach counts and congestion drivers. Not berth availability.
GET
/v1/harbors/:id/calls
Derived VesselCalls from multi-ping sequences. One ping is never a call.
GET
/v1/harbors/:id/occupancy
Observed occupancy only where justified. Default INSUFFICIENT_DATA. Capacity ≠ occupancy.
GET
/v1/harbors/:id/seasonality
Derived climatology vs observed history. Forecast is DEFERRED without backtesting.
POST
/v1/mission
Integrated mission evaluation and Captain Arrival Brief. Same factsAt replays.
GET
/v1/harbors/:id/alternatives
Geographic neighbours only. Does not evaluate a sample vessel.
POST
/v1/harbors/:id/alternatives
Ranked alternatives. Explicit vessel dimensions or vesselId required.
GET
/v1/harbors/:id/freshness
Per-domain freshness: FRESH / STALE / CRITICAL_STALE / UNKNOWN / SOURCE_UNAVAILABLE / NOT_COVERED.
GET
/v1/coverage
Operational coverage dashboard. Identity coverage is not operational coverage.
GET
/v1/harbors/:id/readiness
Mission-evaluable vs mission-ready vs Gold Standard. Not a harbour quality score.
GET
/v1/changes
Governed ChangeEvents. Filter since, domain, severity, harbor.
GET
/v1/harbors/:id/changes
Harbor-scoped ChangeEvents. The 140 m LOA conflict stays OPEN.
POST
/v1/ai/answer
Grounded Q&A. The LLM is not a maritime data source. Unconfigured providers return AI_NOT_CONFIGURED.
POST
/v1/ai/explain
Explain a deterministic mission result with fact and evidence references.
POST
/v1/ai/captain-summary
Captain summary over the Arrival Brief. Assertions must map to EvidencePackage fact IDs.
GET
/v1/health
Non-secret application, database, PostGIS, schema, ingestion, AI and AIS status. No paid provider calls.
GET
/v1/ready
Readiness. 503 if a configured database is unavailable. Unconfigured AIS/AI do not fail the core site.
GET
/v1/openapi
OpenAPI 3 document for the public /v1 surface.