← retourGérer mes clés API →

API publique Port Flow

API REST simple, JSON, authentification Bearer. Disponible à partir du plan Starter (5 k req/jour) jusqu'à Pro+ (600 req/min).

Authentification

Toutes les routes sous /api/v1/* requièrent un header Authorization: Bearer pf_xxxxx. Crée ta clé sur la page /account (section "Clés API"). Affichée une seule fois — copie-la dans ton gestionnaire de secrets immédiatement.

# Test rapide
curl -H "Authorization: Bearer pf_xxxxxxxxxxxxxxx" \
  https://portflow.uk/api/v1/ports

# 401 → token invalide ou révoqué
# 429 → rate limit dépassé (header X-RateLimit-Reset indique la prochaine fenêtre)

Rate limits

PlanReq / minReq / jour estimé
FreeAPI non disponible
Starter120~5 000 / jour
Professional300~18 000 / heure
Pro+600~36 000 / heure
Enterprise6 000illimité dans la pratique

Limites appliquées par token. Headers X-RateLimit-Limit, X-RateLimit-Remaining, X-RateLimit-Reset présents sur chaque réponse.

Endpoints

GET/api/v1/ports

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}/snapshot

Live KPI snapshot for a port (anchored / underway / moored / inbound).

  • id (string) requiredport 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}/vessels

Live 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/active

Open 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/closed

Recent 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}/anomalies

Active anomalies detected (AIS gap, sudden zone change, drift, etc.).

curl -H "Authorization: Bearer pf_xxxxxxxxxxxxxxx" \
  https://portflow.uk/api/v1/ports/rotterdam/anomalies
GET/api/sanctions

OFAC SDN + UK OFSI screening for a vessel by MMSI or IMO.

  • mmsi (int)9-digit MMSI
  • imo (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": [...] }
}
POST/api/v1/webhooks

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/webhooks

Webhooks

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.

Stabilité de l'API