Endpoints
List all 51 tracked ports with bbox, region, country, vessel count.
curl -H "Authorization: Bearer pf_xxxxxxxxxxxxxxx" \
https://portflow.uk/api/v1/ports
Exemple de réponse
{
"ports": [
{ "id": "rotterdam", "name": "Rotterdam", "country": "Netherlands",
"flag": "🇳🇱", "region": "northern-europe", "strategic": true,
"center": [51.95, 4.10], "bbox": [...], "vesselCount": 935 },
...
]
} GET/api/v1/ports/{id}/snapshotLive KPI snapshot for a port (anchored / underway / moored / inbound).
id (string) required — port id, e.g. rotterdam
curl -H "Authorization: Bearer pf_xxxxxxxxxxxxxxx" \
https://portflow.uk/api/v1/ports/rotterdam/snapshot
Exemple de réponse
{
"port": "rotterdam", "ts": 1777465634000,
"snapshot": { "totalVessels": 935, "anchored": 17, "underway": 150,
"moored": 736, "inboundLastHour": 588, ... }
} GET/api/v1/ports/{id}/vesselsLive vessels at a port (last position, SOG, COG, state, cargo class).
curl -H "Authorization: Bearer pf_xxxxxxxxxxxxxxx" \
https://portflow.uk/api/v1/ports/rotterdam/vessels
Exemple de réponse
{
"port": "rotterdam", "count": 935,
"vessels": [
{ "mmsi": 244690099, "name": "ELJA", "lat": 51.95, "lon": 4.10,
"sog": 0.0, "cog": 130, "state": "anchored",
"cargoClass": "container", "destination": "ROTTERDAM" },
...
]
} GET/api/v1/ports/{id}/voyages/activeOpen voyages with predicted ETA (model v2) and broadcast ETA.
tankersOnly (0|1) — filter to tanker cargo classes
curl -H "Authorization: Bearer pf_xxxxxxxxxxxxxxx" \
"https://portflow.uk/api/v1/ports/rotterdam/voyages/active?tankersOnly=1"
Exemple de réponse
{
"port": "rotterdam", "count": 211,
"voyages": [
{ "voyageId": "rotterdam_244690099_...", "mmsi": 244690099,
"name": "ELJA", "cargoClass": "container", "currentSog": 0.0,
"currentDistanceNm": 6.7, "predictedEta": 1777445400000,
"broadcastEta": null }
]
} GET/api/v1/ports/{id}/voyages/closedRecent closed voyages with arrival timestamp + RMSE benchmark.
days (int) — lookback window, default 30
curl -H "Authorization: Bearer pf_xxxxxxxxxxxxxxx" \
"https://portflow.uk/api/v1/ports/rotterdam/voyages/closed?days=30"
Exemple de réponse
{
"port": "rotterdam", "windowDays": 30,
"voyages": [...], "rmseHours": 4.01, "baselineRmseHours": null
} GET/api/v1/ports/{id}/anomaliesActive anomalies detected (AIS gap, sudden zone change, drift, etc.).
curl -H "Authorization: Bearer pf_xxxxxxxxxxxxxxx" \
https://portflow.uk/api/v1/ports/rotterdam/anomalies
OFAC SDN + UK OFSI screening for a vessel by MMSI or IMO.
mmsi (int) — 9-digit MMSIimo (int) — 7-digit IMO number
curl "https://portflow.uk/api/sanctions?mmsi=123456789"
Exemple de réponse
{
"mmsi": 123456789, "flagged": false, "matches": [],
"status": { "fetchedAt": ..., "count": 1987, "errors": [...] }
}Register a webhook for vessel events (subscribe to your watchlist).
curl -X POST -H "Authorization: Bearer pf_xxxxxxxxxxxxxxx" \
-H "Content-Type: application/json" \
-d '{"url": "https://your-server/hook", "event": "vessel.arrived",
"port": "rotterdam"}' \
https://portflow.uk/api/v1/webhooksWebhooks
Au-delà des appels REST pull, configure un webhook (Slack, Discord, Telegram, email, ou endpoint custom) directement sur /account → section Alertes. Les événements supportés : vessel.arrived, vessel.departed, vessel.anomaly. Filtres par watchlist + port disponibles.