API

Alle Flotten- und Ereignisdaten stehen auch als offene, unauthentifizierte JSON-API zur Verfügung — kein Account, kein API-Key nötig. Gedacht für eigene Automatisierungen (Home Assistant, n8n, Node-RED, eigene Skripte). Um Missbrauch vorzubeugen gilt ein Rate-Limit von 60 Requests/Minute pro IP-Adresse; die Antwort enthält dazu die Header X-RateLimit-Limit und X-RateLimit-Remaining, bei Überschreitung 429 mit Retry-After.

GET /api/v1/ships

Aktueller Status aller 8 Schiffe der Flotte.

curl https://schiffstracker.example.de/api/v1/ships
[
  {
    "mmsi": "477116800",
    "slug": "hefei",
    "name": "BYD Hefei",
    "latitude": 53.55,
    "longitude": 8.58,
    "sog": 15.2,
    "cog": 41,
    "destination_name": "Hamburg",
    "destination_confidence": "gesichert",
    "heading_to_germany": 1,
    "eta": "2026-08-27T06:00:00.000Z",
    "position_updated_at": "2026-08-25T20:04:00.000Z",
    "...": "weitere Felder, siehe /api/v1/ships/{slug}"
  }
]

GET /api/v1/ships/{slug}

Status eines einzelnen Schiffs. Die Slugs entsprechen den URLs der Schiffsseiten (z. B. hefei für /schiff/hefei). Unbekannter Slug → 404.

curl https://schiffstracker.example.de/api/v1/ships/hefei
{
  "mmsi": "477116800",
  "slug": "hefei",
  "name": "BYD Hefei",
  "latitude": 53.55,
  "longitude": 8.58,
  "sog": 15.2,
  "cog": 41,
  "destination_name": "Hamburg",
  "destination_confidence": "gesichert",
  "heading_to_germany": 1,
  "eta": "2026-08-27T06:00:00.000Z",
  "position_updated_at": "2026-08-25T20:04:00.000Z",
  "approach": {
    "state": "approaching",
    "closingKm": 180.4,
    "windowHours": 22.5,
    "nearestPort": { "locode": "DEHAM", "name": "Hamburg", "distanceKm": 210.1 }
  }
}

Das Feld eta ist die voraussichtliche Ankunftszeit, wie die Besatzung sie im AIS meldet (ISO-Zeitstempel in UTC, oder null). Sie wird nicht geprüft und nach der Ankunft oft nicht zurückgesetzt.

Das Feld approach ist eine bewegungsbasierte Richtungsschätzung aus der Fahrtspur (unabhängig vom gemeldeten Ziel): state ist approaching, receding, steady oder unknown; closingKm ist die Netto-Annäherung an den nächsten deutschen Hafen im Zeitfenster. Es steht auch bei GET /api/v1/ships pro Schiff dabei.

Das Feld projection ist die voraussichtliche Route zum deutschen Zielhafen (oder null): kind ist to-port, points sind [lat, lng]-Paare von der aktuellen Position zum Hafen. Die aktuelle Fahrtrichtung eines Schiffs steckt separat im Feld cog (Kurs über Grund).

GET /api/v1/ships/{slug}/track

Die aufgezeichnete Fahrtspur eines Schiffs (ausgedünnte Positionspunkte, älteste zuerst). Optionaler Query-Parameter sinceHours (Standard 72, maximal 720 = 30 Tage Aufbewahrung).

curl "https://schiffstracker.example.de/api/v1/ships/hefei/track?sinceHours=48"
[
  {
    "id": 1024,
    "mmsi": "477116800",
    "latitude": 51.9,
    "longitude": 4.1,
    "sog": 12.4,
    "cog": 88,
    "recorded_at": "2026-08-25T18:02:00.000Z"
  }
]

GET /api/v1/events

Ereignisse zu Kurs auf Deutschland und Ankünften in deutschen Häfen (dieselben, die auch im RSS-Feed stehen; bei gesichertem Ziel und bei Ankunft zusätzlich als Discord-Benachrichtigung), als JSON statt XML.

Optionale Query-Parameter: limit (Standard 30, maximal 100), mmsi (auf ein Schiff filtern) und type (auf einen Ereignistyp filtern).

Ereignistypen im Feld event_type: heading_to_germany_possible (mögliches Ziel in Deutschland, unbestätigt), heading_to_germany (gesichertes Ziel in Deutschland) und arrived (am deutschen Zielhafen angekommen, also festgemacht, vor Anker oder nahezu gestoppt).

curl "https://schiffstracker.example.de/api/v1/events?limit=10&mmsi=477116800"
curl "https://schiffstracker.example.de/api/v1/events?type=arrived"
[
  {
    "id": 42,
    "mmsi": "477116800",
    "ship_name": "BYD Hefei",
    "ship_slug": "hefei",
    "event_type": "heading_to_germany",
    "destination_name": "Hamburg",
    "occurred_at": "2026-08-25T20:04:00.000Z"
  }
]

Beispiel: Home Assistant

„Benachrichtige mich bei Ankunft“: Ein REST-Sensor fragt den letzten arrived-Eintrag ab, sein Wert ist die Ereignis-id. Ändert sie sich, ist ein Schiff angekommen, und die Automation meldet es. Die Bedingung verhindert eine Meldung beim Neustart von Home Assistant. Mit type=heading_to_germany statt arrived geht dasselbe für „nimmt Kurs auf Deutschland“.

# configuration.yaml
rest:
  - resource: https://schiffstracker.example.de/api/v1/events?type=arrived&limit=1
    scan_interval: 300
    sensor:
      - name: "BYD letzte Ankunft"
        value_template: "{{ value_json[0].id if value_json | length > 0 else 0 }}"
        json_attributes_path: "$[0]"
        json_attributes:
          - ship_name
          - destination_name
          - occurred_at
# automations.yaml
- alias: "BYD-Schiff angekommen"
  trigger:
    - platform: state
      entity_id: sensor.byd_letzte_ankunft
  condition:
    - condition: template
      value_template: "{{ trigger.from_state.state not in ['unknown', 'unavailable'] }}"
  action:
    - service: notify.notify
      data:
        message: >-
          {{ state_attr('sensor.byd_letzte_ankunft', 'ship_name') }} ist in
          {{ state_attr('sensor.byd_letzte_ankunft', 'destination_name') }} angekommen
Status unbekannt
Made with ❤️ by Softwareschmiede Lerch
v1.4.3
Changelog
  • v1.4.3 — 2026-10-22

    • Technische Wartung: interne Verbesserungen an Stabilität und Betrieb
  • v1.4.2 — 2026-10-22

    • Technische Wartung: kleinere Verbesserungen im Hintergrund
  • v1.4.1 — 2026-10-21

    • Weitere Zielangaben der Schiffe werden erkannt und lesbar angezeigt statt nur als Kürzel, z. B. die Durchfahrt durch den Suezkanal, Khor Fakkan (VAE), Port Said und Singapur
  • v1.4.0 — 2026-10-15

    • Countdown bis zur Ankunft: Im Kasten oben steht jetzt groß, in wie vielen Stunden oder Tagen das Schiff laut ETA ankommt
    • Die App lässt sich jetzt auf dem Startbildschirm installieren, mit eigenem Icon und Ladebildschirm (auch auf iPhone und iPad)
    • API-Doku: Beispiel für Home Assistant („benachrichtige mich bei Ankunft“)
  • v1.3.1 — 2026-10-15

    • Eine Ankunftszeit (ETA), die schon vorbei ist, wird nicht mehr angezeigt und steht auch nicht mehr in der Discord-Meldung – Besatzungen lassen sie oft nach der Ankunft oder einer Verspätung unverändert stehen
    • Zielangaben wie „CN NBG=>SG SIN“ (Pfeil als Trenner, Leerzeichen im Hafencode) werden jetzt erkannt
  • v1.3.0 — 2026-10-11

    • Voraussichtliche Ankunftszeit (ETA): Wenn die Besatzung eine meldet, steht sie jetzt bei den Schiffen, im Kasten oben, in der Linkvorschau und in der Discord-Meldung
    • Ankünfte werden erfasst: Kommt ein Schiff mit gesichertem Ziel in seinem deutschen Hafen an, gibt es dazu eine Discord-Meldung und einen Eintrag im RSS-Feed
    • Neue Seite „Ankünfte“ mit allen erfassten Ankünften, die letzten davon auch auf der Startseite. Ankünfte der letzten 30 Tage werden aus den gespeicherten Fahrtdaten nachgetragen
    • Öffentliche API: neues Feld eta bei den Schiffen, neuer Ereignistyp arrived und Filter type für die Ereignisse
  • v1.2.0 — 2026-10-11

    • Geteilte Schiffslinks zeigen jetzt eine eigene Vorschau mit Schiffsname, Status und Ziel, z. B. in Discord, WhatsApp oder Signal, statt nur des allgemeinen Logos
    • Die Discord-Meldung bei Kurs auf Deutschland kommt jetzt als übersichtliche Karte mit Ziel, Position und Geschwindigkeit
  • v1.1.3 — 2026-10-10

    • Technische Wartung: kleinere Verbesserungen im Hintergrund
  • v1.1.2 — 2026-10-10

    • Technische Wartung: interne Verbesserungen an Stabilität und Betrieb
  • v1.1.1 — 2026-10-10

    • Die Seite zieht sich zu bestimmten Zeiten im Jahr passend an, mit saisonalem Hinweis im Kopfbereich – einfach mal im Dezember vorbeischauen
    • Ein paar kleine Überraschungen für aufmerksame Besucher versteckt – mehr verraten wir nicht
    • Die Karte springt nicht mehr bei jeder Live-Aktualisierung zum ausgewählten Schiff zurück, wenn man sie gerade woanders hingeschoben hat
  • v1.1.0 — 2026-10-10

    • Push-Benachrichtigungen über ntfy.sh sind entfallen. Benachrichtigt wird jetzt ausschließlich über Discord, sobald ein Schiff mit gesichertem Ziel Kurs auf Deutschland nimmt. Das Ereignis steht weiterhin auch in der öffentlichen JSON-API und im RSS-Feed
    • In der Fußzeile steht der Discord-Link jetzt vor dem API-Link
  • v1.0.6 — 2026-09-26

    • Ein Schiff, das bereits in seinem deutschen Zielhafen vor Anker liegt bzw. festgemacht hat, wird jetzt als „angekommen" angezeigt statt weiterhin als „nimmt Kurs auf Deutschland"
  • v1.0.5 — 2026-09-24

    • Ein gemeldetes Ziel mit Leerzeichen zwischen Länder- und Ortscode (z. B. „DE WVN" für Wilhelmshaven) wurde nicht als Ziel in Deutschland erkannt — dadurch blieb mindestens eine echte Meldung unbemerkt. Behoben
  • v1.0.4 — 2026-09-23

    • Technische Wartung: robustere Verbindung zur Live-Datenquelle, damit veraltete Positionen schneller automatisch erkannt und behoben werden
  • v1.0.3 — 2026-09-18

    • Der Hinweiskasten zum Haftungsausschluss stand versehentlich zweimal auf der Startseite — jetzt nur noch einmal, in der Fußzeile
  • v1.0.2 — 2026-09-18

    • Flottenliste: Ziel und Zeitpunkt stehen jetzt auf einer eigenen Zeile unter dem Schiffsnamen, statt sich eine Zeile zu teilen — lange Zielnamen wurden dort vorher abgeschnitten
    • Flottenliste: das gemeldete Ziel trägt jetzt ein kleines „Ziel“-Label, damit klar ist, was dort steht
  • v1.0.1 — 2026-09-18

    • Die Startseite beantwortet jetzt ganz oben die eigentliche Frage: Fährt gerade ein Schiff nach Deutschland — und wenn nicht, wann es zuletzt eines tat
    • Die Karte ist deutlich größer geworden; die übrigen Schiffe stehen als kompakte, bündig ausgerichtete Liste daneben statt als acht gleich große Kacheln darunter
    • Rot ist jetzt ausschließlich dieser einen Meldung vorbehalten — Links, Buttons und Auswahl-Markierungen sind jetzt blau bzw. neutral
    • Klick auf ein Schiff scrollt die Karte jetzt in die Mitte des Bildschirms statt bündig unter die Kopfzeile
  • v0.6.2 — 2026-09-17

    • Die Seite aktualisiert sich jetzt im Hintergrund selbst, statt komplett neu zu laden — Kartenausschnitt und ausgewähltes Schiff bleiben dabei erhalten
    • Solange die Seite offen ist, kommen neue Positionen etwa jede Minute von allein an
  • v0.6.1 — 2026-09-17

    • Die Seite lädt sich jetzt selbst neu, wenn man sie nach längerer Zeit wieder in den Vordergrund holt — vorher zeigte ein lange offener Tab (besonders auf dem Handy) beliebig alte Positionen an, bis man von Hand neu geladen hat
  • v0.5.4 — 2026-09-17

    • iPhone/iPad: Schiffe wurden dort fälschlich alle als „veraltet" angezeigt und die Zeitangaben fehlten — unabhängig davon, wie frisch die Daten tatsächlich waren. Behoben; Safari konnte das Zeitformat der AIS-Daten nicht lesen
  • v0.5.3 — 2026-09-17

    • Technische Wartung: interne Verbesserungen an Sicherheit und Stabilität — an der Seite selbst ändert sich nichts Sichtbares
  • v0.5.2 — 2026-09-17

    • Mobile Ansicht: Kopf- und Fußzeile liefen auf schmalen Bildschirmen über den Rand hinaus, jetzt korrekt umbrochen
    • Barrierefreiheit: Sprung-Link zum Inhalt, sichtbarer Fokus-Rahmen für Tastaturnutzung, Schiffe auf der Karte jetzt auch per Tastatur auswählbar
  • v0.5.1 — 2026-09-14

    • Discord als zweiter, optionaler Benachrichtigungskanal: bei gesichertem Ziel Richtung Deutschland postet ein Bot zusätzlich zur ntfy-Push in unseren Discord-Server
    • Neuer „Discord beitreten"-Link in der Fußzeile für alle, die der Community-Server interessiert
  • v0.4.1 — 2026-09-02

    • Logo und Branding: neues Favicon, Logo im Header sowie ein Vorschaubild für geteilte Links (Open Graph)
    • Website jetzt zweisprachig: Deutsch (Standard) und Englisch über einen Sprachumschalter im Header
    • Live-Status-Punkt in der Statusleiste zeigt jetzt eine echte Ampel (grün/gelb/rot) statt der bisherigen Farben
  • v0.3.0 — 2026-08-26

    • Fahrtspur: die zuletzt gefahrene Route eines Schiffs wird auf der Karte angezeigt
    • Fahrtrichtungs-Pfeil am ausgewählten Schiff; zusätzlich eine Linie zum deutschen Zielhafen, wenn ein solches Ziel gemeldet ist
    • Karte zentriert auf ein Schiff, wenn man es anklickt
    • Neuer Hinweis „Bewegt sich Richtung Deutschland“ — aus der tatsächlichen Bewegung geschätzt, auch wenn das gemeldete Ziel noch veraltet ist
  • v0.2.1 — 2026-08-26

    • Klick auf ein Schiff scrollt jetzt sauber zur Karte, ohne hinter der Kopfzeile zu verschwinden
    • Changelog schließt beim Klick daneben oder mit Escape
    • Verständlichere Status-Anzeige in der Fußzeile („Datenempfang aktiv“ statt „Worker: Live“)
  • v0.2.0 — 2026-08-26

    • Zweistufige Benachrichtigungen: „Vorab“ (erstes, unbestätigtes Deutschland-Signal) zusätzlich zu „Bestätigt“
    • Push-Abo als ausklappbare Box mit Stufen-Auswahl statt zweier fester Blöcke
    • Neue Fußzeile mit Live-Status, Versionsnummer und Changelog
  • v0.1.0 — 2026-08-25

    • Erster Launch: Live-Dashboard der BYD-Flotte per AIS mit interaktiver Karte
    • Dunkles Design im Seekarten-Look, Schiffsauswahl per Klick
    • Öffentliche JSON-API für eigene Automatisierungen