Passolution Passolution Travel Information Platform Zur Plattform

REST API

Dokumentation der Passolution Travel Information Platform

https://api.global-travel-monitor.de

Authentifizierung

Authorization: Bearer {API_TOKEN}

Den Token erhalten Sie von Ihrem Ansprechpartner bei Passolution.

Bearer Token (Kunde)

Events API

Für Kunden: Read-only Zugriff auf alle aktiven Events aller Anbieter. Mit dem source-Filter können Events nach Herkunft gefiltert werden (z.B. nur Events von einem bestimmten Partner). Benötigt einen Kunden-Token.

  • GET /v1/events
  • GET /v1/events/{uuid}
  • GET /v1/events/nearby
  • GET /v1/events/countries
  • GET /v1/continents
  • GET /v1/countries
  • GET /v1/countries/{code}
  • GET /v1/countries/{code}/boundary
  • GET /v1/boundaries
  • GET /v1/countries/{code}/regions
  • GET /v1/countries/{code}/cities
  • GET /v1/countries/{code}/sights
  • GET /v1/sights/{id}
  • GET /v1/places
  • GET /v1/countries/{code}/weather
  • GET /v1/weather
  • GET /v1/airports
  • GET /v1/airports/{code}
  • GET /v1/airlines
  • GET /v1/airlines/{code}
  • GET /v1/exchange-rates
  • GET /v1/regions
  • GET /v1/event-categories
Bearer Token (API-Partner)

Custom Event API

Für API-Partner: Eigene Sicherheits-Events erstellen, aktualisieren und löschen. Jeder Partner verwaltet nur seine eigenen Events. Benötigt einen API-Client-Token.

  • GET /v1/custom/events
  • GET /v1/custom/events/nearby
  • POST /v1/custom/events
  • GET /v1/custom/events/{uuid}
  • PUT /v1/custom/events/{uuid}
  • DEL /v1/custom/events/{uuid}
  • GET /v1/custom/event-categories
  • GET /v1/custom/countries
Bearer Token

Folder Import API

Import von Reisedaten mit Hotels, Flügen, Kreuzfahrten und Mietwagen. Queue-basierte Verarbeitung.

  • POST /v1/folders/import
  • GET /v1/folders
  • GET /v1/folders/{id}
Öffentlich

Feed API

RSS/Atom-Feeds für aktuelle Sicherheits- und Reiserisiko-Events. Keine Authentifizierung erforderlich.

  • GET https://platform.passolution.de/feed/events
  • GET https://platform.passolution.de/feed/countries
  • GET https://platform.passolution.de/feed/events/meta.json
Plugin-Key

Plugin Domain API

REST API zur programmatischen Verwaltung erlaubter Domains für das Plugin. Unterstützt Einzel- und Massenoperationen (bis 1.000 Domains pro Aufruf).

  • GET /v1/plugin/gtm/domains
  • POST /v1/plugin/gtm/domains
  • POST /v1/plugin/gtm/domains/bulk
  • GET /v1/plugin/gtm/domains/{uuid}
  • PUT /v1/plugin/gtm/domains/{uuid}
  • DEL /v1/plugin/gtm/domains/{uuid}
  • DEL /v1/plugin/gtm/domains/bulk

Global Travel Monitor Events API – Kundenanleitung

Übersicht

Die Events API bietet read-only Zugriff auf alle aktuell aktiven Sicherheits- und Reiserisiko-Events. Dies umfasst sowohl von Global Travel Monitor gepflegte Events als auch Events, die von API-Partnern eingestellt wurden. Es werden nur freigegebene, aktive und nicht archivierte Events angezeigt.

Die API ermöglicht die Abfrage aktueller Events gefiltert nach Risikostufe, Land, Event-Typ und Region sowie Länder-Übersichten mit Anzahl aktiver Events.


Authentifizierung

Alle API-Aufrufe erfordern einen Bearer-Token im HTTP-Header:

Authorization: Bearer {API_TOKEN}

Den Token erhalten Sie von Ihrem Ansprechpartner bei Passolution.


Base-URL

https://platform.passolution.de/api/v1

Die bisherigen Adressen https://api.global-travel-monitor.de/v1 und https://global-travel-monitor.eu/api/v1 bleiben weiterhin gültig; bestehende Integrationen müssen nicht umgestellt werden.


Rate Limit

Standardmäßig sind 60 Requests pro Minute erlaubt. Das Limit kann je Kunde höher eingestellt sein; den aktuellen Wert liefern die Antwort-Header X-RateLimit-Limit und X-RateLimit-Remaining. Bei Überschreitung erhalten Sie einen 429 Too Many Requests-Response. Prüfen Sie den Retry-After-Header für die Wartezeit in Sekunden.


Pagination

Der Events-Endpoint liefert alle aktiven Events (einschließlich zukünftiger Events), paginiert über die Query-Parameter page und per_page (Standard: 25, Maximum: 100 pro Seite). Pagination-Metadaten sind im meta-Objekt jeder Antwort enthalten.

Es werden nur Events zurückgegeben, die freigegeben (approved), aktiv und nicht archiviert sind. Mit den Parametern start_date und end_date kann der Zeitraum eingegrenzt werden.


Herkunft der Events (Source)

Jedes Event enthält ein source-Objekt, das die Herkunft anzeigt:

source.type Bedeutung
manual Manuell von Global Travel Monitor erstellt
api_client Von einem API-Partner über die Event API eingestellt
passolution_infosystem Automatisch aus dem Passolution Infosystem importiert

Bei Events vom Typ api_client enthält source.name den Namen des Partners (z.B. "Partner XY GmbH").

Mit dem source-Filter können Sie gezielt Events einer bestimmten Herkunft abfragen:

# Nur manuell erstellte Events
curl -H "Authorization: Bearer {TOKEN}" \
  "https://platform.passolution.de/api/v1/events?source=manual"

# Nur Events von einem bestimmten Partner (nach Name)
curl -H "Authorization: Bearer {TOKEN}" \
  "https://platform.passolution.de/api/v1/events?source=Partner%20XY%20GmbH"

Events

Events auflisten

GET /v1/events

Query-Parameter:

Parameter Typ Pflicht Beschreibung
risk_level string Nein Filter nach Risikostufe: high, medium, low, info
country string Nein Filter nach Ländercode – ISO alpha-2 (z.B. DE) oder alpha-3 (z.B. DEU)
event_category string Nein Filter nach Event-Kategorie-Code (z.B. safety, siehe Tabelle unten)
region integer Nein Filter nach Region-ID (numerische ID)
source string Nein Filter nach Event-Herkunft (z.B. manual, passolution_infosystem oder Name des API-Partners)
start_date date Nein Nur Events ab diesem Datum (z.B. 2026-03-01)
end_date date Nein Nur Events bis zu diesem Datum (z.B. 2026-04-30)
per_page integer Nein Einträge pro Seite (Standard: 25, Maximum: 100)
page integer Nein Seitennummer (Standard: 1)

Beispiele:

# Alle aktiven Events (paginiert)
curl -H "Authorization: Bearer {TOKEN}" \
  "https://platform.passolution.de/api/v1/events?per_page=25&page=1"

# Nur Events mit hoher Risikostufe
curl -H "Authorization: Bearer {TOKEN}" \
  "https://platform.passolution.de/api/v1/events?risk_level=high"

# Events für ein bestimmtes Land
curl -H "Authorization: Bearer {TOKEN}" \
  "https://platform.passolution.de/api/v1/events?country=TR"

# Events eines bestimmten Typs
curl -H "Authorization: Bearer {TOKEN}" \
  "https://platform.passolution.de/api/v1/events?event_category=safety"

# Nur manuell erstellte Events
curl -H "Authorization: Bearer {TOKEN}" \
  "https://platform.passolution.de/api/v1/events?source=manual"

# Events in einem Zeitraum
curl -H "Authorization: Bearer {TOKEN}" \
  "https://platform.passolution.de/api/v1/events?start_date=2026-03-01&end_date=2026-03-31"

# Filter kombinieren
curl -H "Authorization: Bearer {TOKEN}" \
  "https://platform.passolution.de/api/v1/events?risk_level=high&country=TR&source=manual&per_page=10"

Response (200 OK):

{
  "success": true,
  "data": [
    {
      "id": "550e8400-e29b-41d4-a716-446655440000",
      "title": "Earthquake in Turkey",
      "description": "A 6.2 magnitude earthquake struck southeastern Turkey.",
      "risk_level": "high",
      "start_date": "2025-03-15T08:30:00Z",
      "end_date": null,
      "latitude": 37.7749,
      "longitude": 35.3214,
      "is_nationwide": false,
      "event_categories": [
        {
          "code": "safety",
          "name": "Sicherheit"
        }
      ],
      "countries": [
        {
          "iso_code": "TR",
          "iso3_code": "TUR",
          "name_de": "Tuerkei",
          "name_en": "Turkey",
          "continent": "Asia",
          "latitude": 37.7749,
          "longitude": 35.3214
        }
      ],
      "source": {
        "type": "api_client",
        "name": "Partner XY GmbH"
      },
      "created_at": "2025-03-15T09:00:00Z",
      "updated_at": "2025-03-15T10:15:00Z"
    }
  ],
  "meta": {
    "current_page": 1,
    "per_page": 10,
    "total": 142,
    "last_page": 15
  }
}

Einzelnes Event anzeigen

GET /v1/events/{uuid}

Beispiel:

curl -H "Authorization: Bearer {TOKEN}" \
  "https://platform.passolution.de/api/v1/events/550e8400-e29b-41d4-a716-446655440000"

Response (200 OK):

{
  "success": true,
  "data": {
    "id": "550e8400-e29b-41d4-a716-446655440000",
    "title": "Earthquake in Turkey",
    "description": "A 6.2 magnitude earthquake struck southeastern Turkey.",
    "risk_level": "high",
    "start_date": "2025-03-15T08:30:00Z",
    "end_date": null,
    "latitude": 37.7749,
    "longitude": 35.3214,
    "is_nationwide": false,
    "event_categories": [
      {
        "code": "safety",
        "name": "Sicherheit"
      }
    ],
    "countries": [
      {
        "iso_code": "TR",
        "iso3_code": "TUR",
        "name_de": "Tuerkei",
        "name_en": "Turkey",
        "continent": "Asia",
        "latitude": 37.7749,
        "longitude": 35.3214
      }
    ],
    "source": {
      "type": "api_client",
      "name": "Partner XY GmbH"
    },
    "created_at": "2025-03-15T09:00:00Z",
    "updated_at": "2025-03-15T10:15:00Z"
  }
}

Events im Umkreis suchen (Nearby)

GET /v1/events/nearby

Sucht aktive Events im Umkreis eines Standorts. Der Standort kann entweder über einen 3-Letter IATA-Code (z.B. Flughafen) oder über Geokoordinaten angegeben werden. Events mit is_nationwide: true werden unabhängig vom Radius geliefert, sobald der Abfragepunkt in einem der betroffenen Länder liegt.

Query-Parameter:

Parameter Typ Pflicht Beschreibung
code string Ja* 3-Letter IATA-Code (z.B. FRA, MUC, JFK)
latitude numeric Ja* Breitengrad (-90 bis 90)
longitude numeric Ja* Längengrad (-180 bis 180)
radius numeric Ja Umkreis in Kilometern (1–20.000)
per_page integer Nein Ergebnisse pro Seite (1–100, Standard: 25)
page integer Nein Seitennummer (Standard: 1)

* Entweder code oder latitude + longitude muss angegeben werden.

Beispiele:

# Mit 3-Letter-Code
curl -H "Authorization: Bearer {TOKEN}" \
  "https://platform.passolution.de/api/v1/events/nearby?code=FRA&radius=500"

# Mit Geokoordinaten
curl -H "Authorization: Bearer {TOKEN}" \
  "https://platform.passolution.de/api/v1/events/nearby?latitude=50.0379&longitude=8.5622&radius=500"

Response (200 OK):

{
  "success": true,
  "data": [
    {
      "id": "550e8400-e29b-41d4-a716-446655440000",
      "title": "Storm Warning Central Europe",
      "description": "Severe storm warning for the Frankfurt area.",
      "risk_level": "medium",
      "is_nationwide": false,
      "start_date": "2026-03-20T06:00:00+00:00",
      "end_date": "2026-03-21T18:00:00+00:00",
      "latitude": 50.1109,
      "longitude": 8.6821,
      "event_categories": [
        {
          "code": "environment",
          "name": "Umweltereignisse"
        }
      ],
      "countries": [
        {
          "iso_code": "DE",
          "iso3_code": "DEU",
          "name_de": "Deutschland",
          "name_en": "Germany",
          "continent": "Europe",
          "latitude": 50.1109,
          "longitude": 8.6821
        }
      ],
      "source": {
        "type": "manual",
        "name": null
      },
      "created_at": "2026-03-20T07:00:00+00:00",
      "updated_at": "2026-03-20T07:00:00+00:00"
    }
  ],
  "location": {
    "code": "FRA",
    "name": "Frankfurt Airport",
    "latitude": 50.030241,
    "longitude": 8.561096,
    "radius_km": 500
  },
  "meta": {
    "current_page": 1,
    "per_page": 25,
    "total": 3,
    "last_page": 1
  }
}

Länder mit aktiven Events

GET /v1/events/countries

Gibt eine Liste aller Länder zurück, die mindestens ein aktives Event haben, zusammen mit der Anzahl aktiver Events. Sortiert nach Anzahl (absteigend). Nicht paginiert.

Beispiel:

curl -H "Authorization: Bearer {TOKEN}" \
  "https://platform.passolution.de/api/v1/events/countries"

Response (200 OK):

{
  "success": true,
  "data": [
    {
      "iso_code": "DE",
      "iso3_code": "DEU",
      "name_de": "Deutschland",
      "name_en": "Germany",
      "continent": "Europe",
      "continent_de": "Europa",
      "lat": 51.1657,
      "lng": 10.4515,
      "is_eu_member": true,
      "is_schengen_member": true,
      "active_events_count": 3
    },
    {
      "iso_code": "TR",
      "iso3_code": "TUR",
      "name_de": "Tuerkei",
      "name_en": "Turkey",
      "continent": "Asia",
      "continent_de": "Asien",
      "lat": 38.9637,
      "lng": 35.2433,
      "is_eu_member": false,
      "is_schengen_member": false,
      "active_events_count": 7
    }
  ]
}

Basisdaten

Kontinente

GET /v1/continents

Gibt eine Liste aller Kontinente zurück.

Beispiel:

curl -H "Authorization: Bearer {TOKEN}" \
  "https://platform.passolution.de/api/v1/continents"

Response (200 OK):

{
  "success": true,
  "data": [
    {
      "code": "EU",
      "name_de": "Europa",
      "name_en": "Europe",
      "lat": 54.526,
      "lng": 15.2551
    },
    {
      "code": "AS",
      "name_de": "Asien",
      "name_en": "Asia",
      "lat": 34.0479,
      "lng": 100.6197
    }
  ]
}

Länder

GET /v1/countries

Gibt eine Liste aller Länder zurück. Optional nach Kontinent filterbar.

Query-Parameter:

Parameter Typ Pflicht Beschreibung
continent string Nein Filter nach Kontinent-Code (z.B. EU, AS)

Beispiele:

# Alle Länder
curl -H "Authorization: Bearer {TOKEN}" \
  "https://platform.passolution.de/api/v1/countries"

# Nur europäische Länder
curl -H "Authorization: Bearer {TOKEN}" \
  "https://platform.passolution.de/api/v1/countries?continent=EU"

Response (200 OK):

{
  "success": true,
  "data": [
    {
      "iso_code": "DE",
      "iso3_code": "DEU",
      "name_de": "Deutschland",
      "name_en": "Germany",
      "continent": "Europe",
      "continent_de": "Europa",
      "lat": 51.1657,
      "lng": 10.4515,
      "is_eu_member": true,
      "is_schengen_member": true,
      "flag_url": "https://flagcdn.com/de.svg",
      "hero_image_url": "https://global-travel-monitor.eu/images/countries/de.jpg"
    }
  ]
}

Länderinformationen

GET /v1/countries/{code}

Liefert alle Angaben eines Landes strukturiert: Grunddaten, Länderbeschreibung, Reiseinformationen, Strom, Trinkgeld, Taxi-Apps, Mobilfunkanbieter, Feiertage, Bilder und Risikoprofil. {code} ist der ISO-3166-1-Code mit zwei (DE) oder drei Buchstaben (DEU), Groß-/Kleinschreibung spielt keine Rolle.

Mehrsprachige Texte kommen als Objekt je Sprache ({"de": "…", "en": "…", "nl": "…"}). Mit lang wird daraus der Text in dieser Sprache; fehlt er, kommt die deutsche Fassung.

Query-Parameter:

Parameter Typ Pflicht Beschreibung
lang string Nein Nur diese Sprache (de, en, nl) statt aller Sprachen
year integer Nein Jahr der Feiertage (Standard: laufendes Jahr)

Beispiele:

# Alle Angaben zu Deutschland, alle Sprachen
curl -H "Authorization: Bearer {TOKEN}" \
  "https://platform.passolution.de/api/v1/countries/DE"

# Nur Englisch, Feiertage 2027
curl -H "Authorization: Bearer {TOKEN}" \
  "https://platform.passolution.de/api/v1/countries/DEU?lang=en&year=2027"

Response (200 OK, gekürzt):

{
  "success": true,
  "data": {
    "iso_code": "DE",
    "iso3_code": "DEU",
    "name": {"de": "Deutschland", "en": "Germany", "nl": "Duitsland"},
    "continent": {"code": "EU", "name": {"de": "Europa", "en": "Europe"}},
    "territory": {"type": "sovereign", "type_label": "Souveräner Staat", "parent_country": null},
    "membership": {"eu": true, "schengen": true},
    "currency": {"code": "EUR", "name": "Euro", "symbol": "€"},
    "phone_prefix": "+49",
    "timezone": "Europe/Berlin",
    "languages": ["de"],
    "population": 84000000,
    "area_km2": 357588,
    "coordinates": {"lat": 51.1657, "lng": 10.4515},
    "capital": {"id": 1380, "name": {"de": "Berlin", "en": "Berlin"}, "lat": 52.52, "lng": 13.405},
    "flag": {"svg_url": "https://flagcdn.com/de.svg", "emoji": "🇩🇪"},
    "description": {
      "short": {"de": "…", "en": "…", "nl": "…"},
      "long": {"de": "…", "en": "…", "nl": "…"},
      "known_for": {"de": ["Berlin", "Oktoberfest"], "en": ["Berlin", "Oktoberfest"]}
    },
    "travel_info": {
      "intro": {"de": "…"},
      "driving_side": "right",
      "driving_side_label": "Rechtsverkehr",
      "emergency": {"general": "112", "police": "110", "ambulance": "112", "fire": "112"},
      "religions": [{"key": "christianity", "name": {"de": "Christentum", "en": "Christianity"}}],
      "national_day": {"date": "1990-10-03", "day_month": "10-03", "name": {"de": "Tag der Deutschen Einheit"}}
    },
    "power": {
      "voltage": 230,
      "frequency": 50,
      "plug_types": [{"type": "F", "description": "Schuko (Deutschland)", "image": "https://…/images/plug-types/f.svg", "image_png": "https://…/images/plug-types/png/f.png"}],
      "notes": {}
    },
    "tipping": {
      "hotels": {"mode": "range", "from": 1, "to": 2, "unit": "amount", "currency": "EUR", "description": {"de": "…"}},
      "guides": null,
      "restaurants": {"mode": "range", "from": 5, "to": 10, "unit": "percent", "currency": null, "description": {"de": "…"}},
      "taxi": {"mode": "fixed", "from": 1, "to": null, "unit": "amount", "currency": "EUR", "description": {}}
    },
    "airlines": [{"name": "Lufthansa", "iata_code": "LH", "icao_code": "DLH", "headquarters": "Köln", "website_url": "https://www.lufthansa.com", "booking_url": "…"}],
    "airports": [{"iata_code": "FRA", "icao_code": "EDDF", "name": "Frankfurt Airport", "type": "international", "city": {"de": "Frankfurt am Main", "en": "Frankfurt"}}],
    "taxi_apps": [{"name": "FREENOW", "description": {"de": "…"}, "logo_url": "…", "website_url": "…", "app_store_url": "…", "play_store_url": "…"}],
    "mobile_operators": [{"name": "Telekom", "description": {}, "logo_url": "…", "website_url": "…", "prepaid_url": null, "offers_esim": true}],
    "holidays": {
      "year": 2026,
      "items": [{"id": 1, "date": "2026-10-03", "weekday": 6, "name": {"de": "Tag der Deutschen Einheit"}, "comment": {}, "is_national": true, "regions": []}]
    },
    "images": {"hero": null, "hero_url": "https://…/images/countries/de.jpg", "gallery": []},
    "risk_profile": {
      "overall": {"level": 2, "label": "Niedrig"},
      "categories": {
        "security": {"label": "Sicherheit", "fields": {"overall_risk_level": {"value": 2, "label": "Niedrig", "note": {}}, "...": "…"}},
        "...": "…"
      }
    },
    "updated_at": "2026-10-08T15:20:11+00:00"
  }
}

Hinweise zu einzelnen Feldern:


Landesgrenzen (GeoJSON)

GET /v1/countries/{code}/boundary
GET /v1/boundaries?codes=EG,DE,FR

Grenzen als GeoJSON für Karten – ein Land als Feature, mehrere Länder (bis zu 60 je Abruf) als FeatureCollection. Die Geometrie (Polygon oder MultiPolygon, Koordinaten als [lng, lat]) ist auf rund 5 km vereinfacht und damit für Landes- und Kontinentkarten gedacht; bbox ist [min_lng, min_lat, max_lng, max_lat]. Quelle: Natural Earth. Länder ohne Grenzdaten fehlen in der Sammlung bzw. liefern 404.

Query-Parameter:

Parameter Typ Pflicht Beschreibung
codes string Ja (nur /v1/boundaries) ISO-Codes, kommagetrennt
lang string Nein Sprache für properties.name (de, en, nl)

Beispiel:

curl -H "Authorization: Bearer {TOKEN}" \
  "https://platform.passolution.de/api/v1/boundaries?codes=EG,DE&lang=de"

Response (200 OK):

{
  "success": true,
  "data": {
    "type": "FeatureCollection",
    "features": [
      {
        "type": "Feature",
        "properties": {"iso_code": "EG", "iso3_code": "EGY", "name": "Ägypten"},
        "bbox": [24.7, 21.99, 36.87, 31.65],
        "geometry": {"type": "MultiPolygon", "coordinates": [[[[34.9, 29.49], [34.26, 31.22], "…"]]]}
      }
    ]
  },
  "meta": {"requested": 2, "found": 1}
}

Hinweis für Karten: Ringe, die den 180. Längengrad kreuzen (Russland, USA, Fidschi), sollten vor dem Zeichnen auf durchgehende Längen umgerechnet werden (negative Längen + 360).


Regionen eines Landes

GET /v1/countries/{code}/regions

Alle Regionen (Bundesländer, Provinzen, Kantone …) eines Landes, alphabetisch nach Name, mit der Anzahl der zugeordneten Städte. is_popular ist die Markierung „beliebt“ aus der Verwaltung.

Query-Parameter:

Parameter Typ Pflicht Beschreibung
lang string Nein Nur diese Sprache (de, en, nl) statt aller Sprachen

Beispiel:

curl -H "Authorization: Bearer {TOKEN}" \
  "https://platform.passolution.de/api/v1/countries/DE/regions?lang=de"

Response (200 OK):

{
  "success": true,
  "data": [
    {
      "id": 10,
      "code": "DE-BW",
      "name": "Baden-Württemberg",
      "description": null,
      "is_popular": false,
      "coordinates": {"lat": 48.6616, "lng": 9.3501},
      "cities_count": 8,
      "subregions_count": 0
    }
  ],
  "meta": {"total": 16}
}

Einzelne Region mit Infos und Teilgebieten

GET /v1/regions/{id}

Eine Region mit denselben Feldern wie in der Liste, dazu country (code, name), die Regionsinfos in info und die Teilgebiete in subregions. Die Regionsinfos enthalten nur, was für die Region eigen ist – Landesweites steht am Land. Fehlende Angaben sind null. Absätze in description sind durch eine Leerzeile getrennt.

Feld in info Inhalt
short_description, description Kurzbeschreibung und ausführliche Beschreibung
known_for Liste von Stichworten („Bekannt für“)
best_time, climate, getting_there, getting_around, cuisine, good_to_know Reiseinfos: beste Reisezeit, Klima, Anreise, Unterwegs vor Ort, Küche, Gut zu wissen
best_months Beste Reisemonate als Zahlen 1–12
population, area_km2 Einwohner und Fläche in km²
timezone IANA-Zeitzone, nur wenn sie von der des Landes abweicht
curl -H "Authorization: Bearer {TOKEN}" \
  "https://platform.passolution.de/api/v1/regions/33?lang=de"
{
  "success": true,
  "data": {
    "id": 33,
    "code": "ES-CN",
    "name": "Kanarische Inseln",
    "description": "Die Kanarischen Inseln liegen im Atlantik vor der Nordwestküste Afrikas …",
    "is_popular": false,
    "coordinates": {"lat": 28.2916, "lng": -16.6291},
    "cities_count": 7,
    "subregions_count": 8,
    "country": {"code": "ES", "name": "Spanien"},
    "info": {
      "short_description": "Die Kanarischen Inseln liegen im Atlantik …",
      "description": "Zum Archipel gehören sieben größere Inseln …\n\nTeneriffa wird vom Teide geprägt …",
      "known_for": ["Vulkanlandschaften", "Teide", "Atlantikstrände"],
      "best_time": "Die Kanaren sind ganzjährig bereisbar …",
      "climate": "Das subtropische, vom Atlantik und den Passatwinden geprägte Klima …",
      "getting_there": "…", "getting_around": "…", "cuisine": "…", "good_to_know": "…",
      "best_months": [3, 4, 5, 9, 10, 11],
      "population": 2258866,
      "area_km2": 7447,
      "timezone": "Atlantic/Canary"
    },
    "subregions": [
      {"id": 1, "region": {"id": 33, "code": "ES-CN", "name": "Kanarische Inseln"}, "kind": "island", "kind_name": "Insel", "group_name": "Inseln", "name": "Teneriffa", "description": "…", "coordinates": {"lat": 28.2936, "lng": -16.6214}, "cities_count": 3, "sights_count": 9}
    ]
  }
}

Teilgebiete (Inseln und Reisegebiete)

GET /v1/countries/{code}/subregions
GET /v1/subregions/{id}

Teilgebiete liegen zwischen Region und Stadt: Inseln (island), Inselgruppen (archipelago) und Reisegebiete (area) wie Teneriffa, die Liparischen Inseln oder die Costa Brava. Städte und Sehenswürdigkeiten können einem Teilgebiet zugeordnet sein (Feld subregion), müssen aber nicht. kind_name ist die Art als Text, group_name die passende Überschrift für Listen („Inseln“, „Reisegebiete“). Die Liste ist nach Region und der gepflegten Reihenfolge sortiert; mit region nur die Teilgebiete einer Region. Ein einzelnes Teilgebiet enthält zusätzlich country und info mit denselben Feldern wie bei der Region.

Parameter Typ Pflicht Beschreibung
region integer Nein Nur Teilgebiete dieser Region (nur Liste)
lang string Nein Nur diese Sprache (de, en, nl) statt aller Sprachen
curl -H "Authorization: Bearer {TOKEN}" \
  "https://platform.passolution.de/api/v1/countries/ES/subregions?lang=de&region=33"

curl -H "Authorization: Bearer {TOKEN}" \
  "https://platform.passolution.de/api/v1/subregions/1?lang=de"

Städte eines Landes

GET /v1/countries/{code}/cities

Alle Städte eines Landes, alphabetisch nach Name, mit Region, Teilgebiet (falls zugeordnet), Einwohnerzahl und Koordinaten. Mit region nur die Städte einer Region (ID aus /v1/countries/{code}/regions), mit subregion nur die eines Teilgebiets. is_popular ist die Markierung „beliebt“ aus der Verwaltung.

Query-Parameter:

Parameter Typ Pflicht Beschreibung
region integer Nein Nur Städte dieser Region
subregion integer Nein Nur Städte dieses Teilgebiets (Insel, Reisegebiet)
lang string Nein Nur diese Sprache (de, en, nl) statt aller Sprachen

Beispiele:

# Alle Städte
curl -H "Authorization: Bearer {TOKEN}" \
  "https://platform.passolution.de/api/v1/countries/DE/cities?lang=de"

# Nur Städte einer Region
curl -H "Authorization: Bearer {TOKEN}" \
  "https://platform.passolution.de/api/v1/countries/DE/cities?lang=de&region=10"

Response (200 OK):

{
  "success": true,
  "data": [
    {
      "id": 1382,
      "name": "Düsseldorf",
      "region": {"id": 12, "code": "DE-NW", "name": "Nordrhein-Westfalen"},
      "subregion": null,
      "population": 620000,
      "coordinates": {"lat": 51.2277, "lng": 6.7735},
      "is_capital": false,
      "is_regional_capital": true,
      "is_popular": true
    }
  ],
  "meta": {"total": 54}
}

Sehenswürdigkeiten eines Landes

GET /v1/countries/{code}/sights

Sehenswürdigkeiten und Unternehmungen eines Landes – Highlights zuerst, dann alphabetisch. Jede Sehenswürdigkeit gehört zu einem Land, meist zu einer Region, oft zu einer Stadt und manchmal zu einem Teilgebiet (Insel, Reisegebiet); Nationalparks und Naturgebiete hängen auch ohne Stadt an ihrer Region. Öffnungszeiten und Eintritt sind allgemeine Angaben ohne Gewähr. is_reviewed ist false, solange ein KI-Entwurf noch nicht redaktionell geprüft wurde.

Query-Parameter:

Parameter Typ Pflicht Beschreibung
region integer Nein Nur Sehenswürdigkeiten dieser Region (ID aus /v1/countries/{code}/regions)
subregion integer Nein Nur Sehenswürdigkeiten dieses Teilgebiets (ID aus /v1/countries/{code}/subregions)
city integer Nein Nur Sehenswürdigkeiten dieser Stadt (ID aus /v1/countries/{code}/cities)
category string Nein landmark, old_town, museum, religious, palace, archaeological, nature, national_park, beach, viewpoint, park, activity, theme_park, market, other
highlight boolean Nein 1 = nur die Highlights
lang string Nein Nur diese Sprache (de, en, nl) statt aller Sprachen

Beispiele:

# Alle Sehenswürdigkeiten Italiens
curl -H "Authorization: Bearer {TOKEN}" \
  "https://platform.passolution.de/api/v1/countries/IT/sights?lang=de"

# Nur die Highlights einer Region
curl -H "Authorization: Bearer {TOKEN}" \
  "https://platform.passolution.de/api/v1/countries/IT/sights?lang=de&region=56&highlight=1"

Response (200 OK):

{
  "success": true,
  "data": [
    {
      "id": 3,
      "name": "Aquarium Genua",
      "category": "theme_park",
      "category_name": "Freizeitpark & Zoo",
      "is_highlight": true,
      "region": {"id": 56, "code": "IT-42", "name": "Ligurien"},
      "subregion": null,
      "city": {"id": 1388, "name": "Genua"},
      "coordinates": {"lat": 44.410145, "lng": 8.926291},
      "address": "Ponte Spinola, Porto Antico, 16128 Genova",
      "website_url": "https://www.acquariodigenova.it/",
      "ticket_url": null,
      "visit_minutes": 180,
      "short_description": "Das Aquarium im alten Hafen zeigt Meeres- und Süßwasserlebensräume …",
      "description": "Das Aquarium wurde 1992 im Zuge der Neugestaltung des Porto Antico eröffnet …",
      "opening_hours": null,
      "admission": null,
      "best_time": "werktags direkt nach der Öffnung",
      "tips": "Tickets und gegebenenfalls ein Zeitfenster vorab online buchen.",
      "accessibility": "Der Rundgang ist mit Rollstuhl und Kinderwagen zugänglich.",
      "is_reviewed": false
    }
  ],
  "meta": {"total": 14}
}

Einzelne Sehenswürdigkeit

GET /v1/sights/{id}

Eine Sehenswürdigkeit mit denselben Feldern wie oben und zusätzlich country (code, name).

curl -H "Authorization: Bearer {TOKEN}" \
  "https://platform.passolution.de/api/v1/sights/3?lang=de"

Gemerkte Orte auflösen

GET /v1/places?keys=region:56,subregion:1,city:1388,sight:3

Für Apps, die Markierungen wie „besucht“ oder „Wunschliste“ nur als Schlüssel speichern: liefert zu bis zu 1000 Schlüsseln (region:ID, subregion:ID, city:ID, sight:ID, mit Komma getrennt) Art, Name, Land, Region, Stadt, Koordinaten und – bei Sehenswürdigkeiten – die Kategorie. Unbekannte Schlüssel fehlen in der Antwort. Texte kommen in der Sprache aus lang (Standard Deutsch).

curl -H "Authorization: Bearer {TOKEN}" \
  "https://platform.passolution.de/api/v1/places?keys=city:1388,sight:3&lang=de"
{
  "success": true,
  "data": [
    {"key": "city:1388", "kind": "city", "id": 1388, "name": "Genua", "country": {"code": "IT", "name": "Italien"}, "region": {"id": 56, "name": "Ligurien"}, "city": null, "coordinates": {"lat": 44.407, "lng": 8.9347}, "category": null, "category_name": null},
    {"key": "sight:3", "kind": "sight", "id": 3, "name": "Aquarium Genua", "country": {"code": "IT", "name": "Italien"}, "region": {"id": 56, "name": "Ligurien"}, "city": {"id": 1388, "name": "Genua"}, "coordinates": {"lat": 44.4101, "lng": 8.9263}, "category": "theme_park", "category_name": "Freizeitpark & Zoo"}
  ],
  "meta": {"total": 2}
}

Wetter

GET /v1/countries/{code}/weather
GET /v1/weather?lat=52.52&lng=13.405

Aktuelles Wetter, die nächsten 24 Stunden in 3-Stunden-Schritten und bis zu fünf Tage mit Tiefst- und Höchstwert – dieselbe Quelle wie auf der Plattform (OpenWeatherMap). Beim Länder-Endpoint gilt die Hauptstadt, sonst die Landesmitte. Zeiten sind ISO 8601 in der Ortszeit des Standorts, Temperaturen in °C, Wind in km/h, Sicht in km. icon ist der OpenWeatherMap-Symbolcode (z. B. 10d), icon_url das passende Bild. Die Daten werden 30 Minuten gecacht.

Query-Parameter:

Parameter Typ Pflicht Beschreibung
lat, lng number Ja (nur /v1/weather) Koordinaten des Standorts
lang string Nein Sprache der Beschreibungen (de, en, nl; Standard de)

Beispiel:

curl -H "Authorization: Bearer {TOKEN}" \
  "https://platform.passolution.de/api/v1/countries/DE/weather?lang=de"

Response (200 OK):

{
  "success": true,
  "data": {
    "location": {"name": "Berlin", "lat": 52.52, "lng": 13.405, "timezone_offset": 7200},
    "current": {
      "observed_at": "2026-10-09T19:11:45+02:00",
      "temperature": 10, "feels_like": 6, "temp_min": 10, "temp_max": 10,
      "humidity": 93, "pressure": 1008, "wind_speed": 30, "wind_direction": 220,
      "visibility": 6.9, "clouds": 100,
      "description": "Bedeckt", "condition": "Bewölkt",
      "icon": "04n", "icon_url": "https://openweathermap.org/img/wn/04n@2x.png",
      "sunrise": "2026-10-09T07:20:41+02:00", "sunset": "2026-10-09T18:26:26+02:00"
    },
    "hourly": [
      {"time": "2026-10-09T20:00:00+02:00", "temperature": 10, "icon": "10n", "description": "Leichter Regen", "precipitation_probability": 99, "wind_speed": 20}
    ],
    "daily": [
      {"date": "2026-10-10", "temp_min": 12, "temp_max": 17, "icon": "10d", "description": "Leichter Regen", "precipitation_probability": 37}
    ],
    "source": {"name": "OpenWeatherMap", "url": "https://openweathermap.org"}
  }
}

Antwortet die Wetterquelle nicht, kommt 503 mit "message": "Weather service unavailable.".


Flughäfen

GET /v1/airports
GET /v1/airports/{code}

Flughäfen aus der Plattform (Quelle OurAirports plus redaktionelle Pflege). Die Liste liefert Kurzdaten und Zähler, der Einzelabruf per IATA-Code (3 Zeichen) oder ICAO-Code (4 Zeichen) zusätzlich Lounges, Hotels in der Nähe, Mobilität und die dort fliegenden Airlines. Nur aktive Einträge.

Query-Parameter (Liste):

Parameter Typ Pflicht Beschreibung
country string Nein ISO-2- oder ISO-3-Code des Landes
q string Nein Suche in Name, IATA- oder ICAO-Code
type string Nein international, large_airport, medium_airport, small_airport
lang string Nein Sprache für Stadt- und Ländernamen (de, en, nl)

Beispiel:

curl -H "Authorization: Bearer {TOKEN}" \
  "https://platform.passolution.de/api/v1/airports/CAI?lang=de"

Response (200 OK, gekürzt):

{
  "success": true,
  "data": {
    "iata_code": "CAI", "icao_code": "HECA", "name": "Cairo International Airport",
    "type": "international", "type_label": "Internationaler Flughafen",
    "city": "Kairo", "country": {"iso_code": "EG", "name": "Ägypten"},
    "coordinates": {"lat": 30.1219, "lng": 31.4056}, "timezone": "Africa/Cairo", "altitude_m": 116,
    "operates_24h": true, "website_url": "…", "security_timeslot_url": null,
    "counts": {"lounges": 3, "nearby_hotels": 2, "airlines": 48},
    "lounges": [{"name": "Ahlan Lounge", "location": "Terminal 3", "access": "Alle Passagiere mit Bordkarte", "price_per_person": 40, "children_welcome": true, "url": "…"}],
    "nearby_hotels": [{"name": "Le Méridien Cairo Airport", "distance_km": 0.2, "shuttle": true, "booking_url": "…", "notes": null}],
    "mobility": {
      "taxi": {"available": true, "info": "Vor allen Terminals", "approx_cost": null},
      "parking": {"available": true, "options": [{"name": "P1", "url": "…", "distance": "100m"}]},
      "car_rental": {"available": true, "providers": [{"name": "Hertz", "url": "…"}]},
      "airport_shuttle": {"available": false, "info": null, "url": null},
      "public_transport": {"available": true, "types": [{"name": "Metro", "url": "…"}]}
    },
    "airlines": [{"iata_code": "MS", "icao_code": "MSR", "name": "EgyptAir", "terminal": "3", "direction": "both", "cabin_classes": [{"key": "economy", "label": "Economy"}]}],
    "updated_at": "2026-02-08T09:55:19+00:00"
  }
}

Die Liste (/v1/airports) enthält je Flughafen dieselben Felder bis einschließlich counts; meta.total ist die Trefferzahl.


Airlines

GET /v1/airlines
GET /v1/airlines/{code}

Fluggesellschaften aus der Plattform. Die Liste liefert Kurzdaten, der Einzelabruf per IATA-Code (2 Zeichen) oder ICAO-Code (3 Zeichen) zusätzlich Kontakt, Gepäckregeln je Kabinenklasse, Tierregelung und die angeflogenen Flughäfen. Nur aktive Einträge.

Query-Parameter:

Parameter Typ Pflicht Beschreibung
country string Nein Liste: nur Airlines mit Sitz in diesem Land (ISO-2 oder ISO-3)
q string Nein Liste: Suche in Name, IATA- oder ICAO-Code
include string Nein Einzelabruf: lounges, hotels (kommagetrennt) hängt Lounges bzw. Hotels an jeden Flughafen
lang string Nein Sprache für Stadt- und Ländernamen (de, en, nl)

Beispiel:

curl -H "Authorization: Bearer {TOKEN}" \
  "https://platform.passolution.de/api/v1/airlines/MS?lang=de&include=lounges,hotels"

Response (200 OK, gekürzt):

{
  "success": true,
  "data": {
    "iata_code": "MS", "icao_code": "MSR", "name": "EgyptAir",
    "home_country": {"iso_code": "EG", "name": "Ägypten"}, "headquarters": "Kairo",
    "website_url": "…", "booking_url": "…",
    "cabin_classes": [{"key": "economy", "label": "Economy"}, {"key": "business", "label": "Business Class"}],
    "counts": {"airports": 62},
    "contact": {"hotline": "+20 2 2696 6300", "email": null, "chat_url": null, "help_url": "…"},
    "baggage": {
      "classes": {
        "economy": {"hand": {"allowance": "1x8kg", "dimensions_cm": {"length": 55, "width": 40, "height": 20}}, "checked": {"allowance": "23kg"}},
        "premium_economy": {"hand": {"allowance": null, "dimensions_cm": null}, "checked": {"allowance": null}},
        "business": {"…": "…"}, "first": {"…": "…"}
      },
      "notes": null, "info_url": "…"
    },
    "pet_policy": {
      "allowed": true,
      "in_cabin": {"allowed": true, "max_weight": "8kg", "carrier_dimensions_cm": {"length": 55, "width": 40, "height": 26}, "weight_includes_bag": true, "advance_notice_required": true},
      "in_hold": {"allowed": true, "advance_notice_required": true, "notes": "…"},
      "restrictions": [{"key": "breed_restrictions", "label": "Rasseeinschränkungen"}],
      "info_url": "…", "notes": null
    },
    "airports": [
      {"iata_code": "CAI", "icao_code": "HECA", "name": "Cairo International Airport", "city": "Kairo", "country": "EG", "terminal": "3", "direction": "both",
       "lounges": [{"name": "Ahlan Lounge", "location": "Terminal 3", "access": "…", "price_per_person": 40, "children_welcome": true, "url": "…"}],
       "nearby_hotels": [{"name": "Le Méridien Cairo Airport", "distance_km": 0.2, "shuttle": true, "booking_url": "…", "notes": null}]}
    ],
    "updated_at": "2026-02-08T09:55:19+00:00"
  }
}

Gepäckangaben (allowance) sind Freitext, wie in der Plattform gepflegt (z. B. 1x8kg, 23kg); fehlende Werte sind null. Lounges hängen immer am Flughafen; /v1/countries/{code} liefert airlines[] und airports[] nur als Kurzliste mit Codes für den Absprung in diese Endpunkte.


Wechselkurse

GET /v1/exchange-rates

Aktuelle Wechselkurse für Umrechnungen in Apps. Die Plattform holt die Kurse stündlich beim Anbieter (ExchangeRate-API, Stand jeweils in updated_at) und liefert sie aus dem Cache; bei einem Ausfall des Anbieters bleiben die letzten Kurse bis zu einem Tag verfügbar. Basis ist der Euro, andere Basiswährungen werden als Kreuzkurs berechnet.

Query-Parameter:

Parameter Typ Pflicht Beschreibung
base string Nein Basiswährung (ISO 4217), Standard EUR
symbols string Nein Nur diese Währungen, kommagetrennt (z.B. EGP,THB)

Beispiel:

curl -H "Authorization: Bearer {TOKEN}" \
  "https://platform.passolution.de/api/v1/exchange-rates?base=EUR&symbols=EGP,USD"

Response (200 OK):

{
  "success": true,
  "data": {
    "base": "EUR",
    "rates": {"EGP": 54.21, "USD": 1.08},
    "updated_at": "2026-10-09T00:02:31+00:00",
    "next_update_at": "2026-10-10T00:02:31+00:00",
    "source": "Rates by ExchangeRate-API (https://www.exchangerate-api.com)"
  }
}

source ist bei Anzeige der Kurse zu nennen (Bedingung des Anbieters). Unbekannte Basiswährung: 422, Anbieter nicht erreichbar und kein Cache: 503.


Regionen

GET /v1/regions

Gibt eine Liste aller Regionen zurück. Optional nach Land filterbar. Nützlich um die gültigen Werte für den region-Filter zu ermitteln.

Query-Parameter:

Parameter Typ Pflicht Beschreibung
country string Nein Filter nach Ländercode – ISO alpha-2 (z.B. DE) oder alpha-3 (z.B. DEU)

Beispiele:

# Alle Regionen
curl -H "Authorization: Bearer {TOKEN}" \
  "https://platform.passolution.de/api/v1/regions"

# Nur Regionen in Deutschland
curl -H "Authorization: Bearer {TOKEN}" \
  "https://platform.passolution.de/api/v1/regions?country=DE"

Response (200 OK):

{
  "success": true,
  "data": [
    {
      "id": 42,
      "name_de": "Bayern",
      "name_en": "Bavaria",
      "code": "BY",
      "country_iso_code": "DE",
      "country_name_de": "Deutschland",
      "lat": 48.7904,
      "lng": 11.4979
    }
  ]
}

Event-Kategorien

GET /v1/event-categories

Gibt eine Liste aller verfügbaren Event-Kategorien zurück. Nützlich um die gültigen Werte für den event_category-Filter zu ermitteln.

Aktuell verfügbare Kategorien:

Code Name
environment Umweltereignisse
travel Reiseverkehr
safety Sicherheit
entry Einreisebestimmungen
general Allgemein
health Gesundheit
strike Streik

Hinweis: Diese Liste kann sich ändern. Nutzen Sie den Endpoint GET /v1/event-categories, um stets die aktuellen Kategorien abzurufen.

Beispiel:

curl -H "Authorization: Bearer {TOKEN}" \
  "https://platform.passolution.de/api/v1/event-categories"

Response (200 OK):

{
  "success": true,
  "data": [
    {
      "code": "environment",
      "name": "Umweltereignisse"
    },
    {
      "code": "safety",
      "name": "Sicherheit"
    }
  ]
}

Stand des Servers (App-Info)

GET /v1/app-info

Gibt an, welcher Stand der Plattform gerade läuft – für die App-Info in Apps, um zu erkennen, ob neue Inhalte schon deployt sind. deployed_at ist die Zeit des letzten Deployments (ISO 8601).

Beispiel:

curl -H "Authorization: Bearer {TOKEN}" \
  "https://platform.passolution.de/api/v1/app-info"

Response (200 OK):

{
  "success": true,
  "data": {
    "server": {
      "branch": "main",
      "commit": "6ab760bd870ab4f68a18ae569b459b79f377e4c2",
      "commit_short": "6ab760bd",
      "deployed_at": "2026-10-13T16:05:00+02:00",
      "environment": "production"
    }
  }
}

Datenmodelle

Event

Feld Typ Beschreibung
id string (UUID) Eindeutige ID des Events
title string Kurzer Titel des Events
description string / null Detaillierte Beschreibung
risk_level string Risikostufe: high, medium, low, info
start_date datetime / null Startdatum (ISO 8601)
end_date datetime / null Enddatum (null = andauernd)
latitude number / null Breitengrad
longitude number / null Längengrad
is_nationwide boolean Landesweite Geltung. Bei true liefert /events/nearby das Event unabhängig vom Radius, sobald der Abfragepunkt in einem der unter countries genannten Länder liegt
event_categories array Liste der zugewiesenen Event-Typen
countries array Liste betroffener Länder
locations array Alle Standorte des Events: je Eintrag country_name, iso_code, region_id, region_name, city_id, city_name, latitude, longitude, location_note, label
source object Herkunft des Events
source.type string Quelle: manual, api_client, passolution_infosystem, etc.
source.name string / null Name des API-Partners (bei API-Client-Events)
created_at datetime Erstellungszeitpunkt
updated_at datetime Letzter Änderungszeitpunkt

Event-Typ

Feld Typ Beschreibung
code string Maschinenlesbarer Code (z.B. safety)
name string Anzeigename

Land (Event-Kontext)

Feld Typ Beschreibung
iso_code string ISO 3166-1 alpha-2 Code (z.B. DE)
iso3_code string ISO 3166-1 alpha-3 Code (z.B. DEU)
name_de string Ländername (deutsch)
name_en string Ländername (englisch)
continent string Kontinent
latitude number / null Breitengrad (Event-Standort im Land)
longitude number / null Längengrad (Event-Standort im Land)
region object / null Betroffene Region: id, name_de, name_en
city object / null Betroffene Stadt: id, name_de, name_en
location_note string / null Freitext zum Standort

Land (Countries-Endpoint)

Feld Typ Beschreibung
iso_code string ISO 3166-1 alpha-2 Code
iso3_code string ISO 3166-1 alpha-3 Code
name_de string Ländername (deutsch)
name_en string Ländername (englisch)
continent string / null Kontinent (englisch)
continent_de string / null Kontinent (deutsch)
lat number / null Breitengrad (Zentroid)
lng number / null Längengrad (Zentroid)
is_eu_member boolean EU-Mitglied
is_schengen_member boolean Schengen-Mitglied
name_nl string / null Ländername (niederländisch)
flag_url string / null Flagge als SVG
hero_image_url string / null Titelbild für Listen
active_events_count integer Anzahl aktiver Events

Länderinformationen (Countries/{code}-Endpoint)

Feld Typ Beschreibung
iso_code, iso3_code string ISO-3166-1-Codes
name Text Ländername je Sprache
continent object / null code, name (Text)
territory object type (sovereign, dependent, disputed, special), type_label, parent_country (iso_code, name)
membership object eu, schengen (boolean)
currency object / null code, name, symbol
phone_prefix, timezone string / null Vorwahl, IANA-Zeitzone
languages string[] Sprachcodes
population, area_km2 number / null Einwohner, Fläche
coordinates object / null lat, lng (Mittelpunkt)
capital object / null id (Stadt-ID wie in /v1/countries/{code}/cities), name (Text), lat, lng der Hauptstadt
flag object svg_url, emoji
description object short (Text), long (Text, Absätze durch Leerzeilen), known_for (Liste je Sprache)
travel_info object intro (Text), driving_side (right/left), emergency (general, police, ambulance, fire), religions[] (key, name), national_day (date, day_month, name)
power object voltage, frequency, plug_types[] (type, description, image als SVG, image_png), notes (Text)
tipping object je hotels, guides, restaurants, taxi: mode, from, to, unit, currency, description oder null
airlines[] object Aktive Fluggesellschaften mit Sitz im Land, nach Name sortiert: name, iata_code, icao_code, headquarters, website_url, booking_url
airports[] object Aktive Flughäfen im Land, nach Name sortiert: iata_code, icao_code, name, type, city (Text) – Details über /v1/airports/{code}
taxi_apps[] object name, description, logo_url, website_url, app_store_url, play_store_url
mobile_operators[] object name, description, logo_url, website_url, prepaid_url, offers_esim
holidays object year, items[] (id, date, weekday, name, comment, is_national, regions[])
images object hero (Bild oder null), hero_url, gallery[] (Bilder mit url, thumb_url, width, height, focal, alt, caption, credit, license)
risk_profile object / null overall (level, label), categories je Bereich mit label und fields (value, bei Stufen label, note)
updated_at string Letzte Änderung (ISO 8601)

„Text“ steht für ein Objekt je Sprache, mit ?lang= für einen String.


Fehlercodes

HTTP-Code Bedeutung
200 Erfolgreich
401 Nicht authentifiziert (Token fehlt oder ungültig)
403 Zugriff verweigert
404 Ressource nicht gefunden
422 Validierungsfehler (ungültige Filter-Parameter)
429 Rate Limit überschritten

Beispiel Fehler-Response (401):

{
  "message": "Unauthenticated."
}

Beispiel Fehler-Response (404):

{
  "success": false,
  "message": "Event not found"
}

Beispiel Validierungsfehler (422):

{
  "success": false,
  "message": "The given data was invalid.",
  "errors": {
    "risk_level": ["The selected risk_level is invalid."],
    "per_page": ["The per page field must be between 1 and 100."]
  }
}

Support

Bei Fragen zur API wenden Sie sich an Ihren Ansprechpartner bei Passolution.

Custom Event API – Partneranleitung

Übersicht

Die Custom Event API ermöglicht es API-Partnern, eigene Sicherheits-Events auf dem Risk Management Dashboard zu erstellen, zu aktualisieren und zu löschen. Jeder Partner verwaltet ausschließlich seine eigenen Events.

Wichtig: Das Erstellen, Aktualisieren und Löschen von Events erfordert eine separate Freischaltung Ihres Accounts durch Global Travel Monitor. Ohne diese Freischaltung können Sie die API nur zum Lesen von Events nutzen. Bei einem Versuch ohne Freischaltung erhalten Sie einen 403 Forbidden Response.


Authentifizierung

Alle API-Aufrufe erfordern einen Bearer-Token im HTTP-Header:

Authorization: Bearer {API_TOKEN}

Den Token erhalten Sie von Ihrem Ansprechpartner bei Passolution. Er ist 1 Jahr gültig.


Base-URL

https://platform.passolution.de/api/v1/custom

Die bisherigen Adressen https://api.global-travel-monitor.de/v1/custom und https://global-travel-monitor.eu/api/v1/custom bleiben weiterhin gültig; bestehende Integrationen müssen nicht umgestellt werden.


Rate Limit

Standardmäßig sind 60 Requests pro Minute erlaubt. Bei Überschreitung erhalten Sie einen 429 Too Many Requests Response.


Referenzdaten

Bevor Sie Events erstellen, fragen Sie die gültigen Event-Kategorien und Ländercodes ab.

Event-Kategorien abrufen

GET /v1/custom/event-categories

Aktuell verfügbare Kategorien:

Code Name
environment Umweltereignisse
travel Reiseverkehr
safety Sicherheit
entry Einreisebestimmungen
general Allgemein
health Gesundheit
strike Streik

Hinweis: Diese Liste kann sich ändern. Nutzen Sie den Endpoint GET /v1/custom/event-categories, um stets die aktuellen Kategorien abzurufen.

Beispiel:

curl -H "Authorization: Bearer {TOKEN}" \
  https://platform.passolution.de/api/v1/custom/event-categories

Response:

{
  "success": true,
  "data": [
    {
      "code": "environment",
      "name": "Umweltereignisse",
      "color": "#059669",
      "icon": "fa-leaf"
    },
    {
      "code": "safety",
      "name": "Sicherheit",
      "color": "#DC2626",
      "icon": "fa-shield-alt"
    }
  ]
}

Länder abrufen

GET /v1/custom/countries

Beispiel:

curl -H "Authorization: Bearer {TOKEN}" \
  https://platform.passolution.de/api/v1/custom/countries

Response:

{
  "success": true,
  "data": [
    {
      "iso_code": "DE",
      "iso3_code": "DEU",
      "name_de": "Deutschland",
      "name_en": "Germany"
    },
    {
      "iso_code": "TH",
      "iso3_code": "THA",
      "name_de": "Thailand",
      "name_en": "Thailand"
    }
  ]
}

Events

Event erstellen

Erfordert Freischaltung der Event-Erstellung für Ihren Account.

POST /v1/custom/events

Request-Body (JSON):

Feld Typ Pflicht Beschreibung
title string Ja Titel des Events (max. 255 Zeichen)
description string Nein Beschreibung (max. 10.000 Zeichen, HTML erlaubt: p, br, strong, em, ul, ol, li, a)
risk_level string Nein Risikostufe: info, low, medium (Standard), high
start_date datetime Ja Startdatum (ISO 8601, z.B. 2026-02-11T08:00:00Z)
end_date datetime Nein Enddatum (muss gleich oder nach start_date liegen)
event_category_codes array Ja Event-Kategorie-Codes (mindestens 1, z.B. ["safety", "environment"], siehe Tabelle oben)
country_codes array Ja ISO-2-Ländercodes (mindestens 1, z.B. ["DE", "AT"])
latitude number Nein Breitengrad (-90 bis 90)
longitude number Nein Längengrad (-180 bis 180)
tags array Nein Schlagwörter (z.B. ["flooding", "bangkok"])
external_id string Nein Ihre interne Referenz-ID (max. 255 Zeichen)

Beispiel:

curl -X POST https://platform.passolution.de/api/v1/custom/events \
  -H "Authorization: Bearer {TOKEN}" \
  -H "Content-Type: application/json" \
  -d '{
    "title": "Überschwemmung Bangkok",
    "description": "<p>Schwere Überschwemmungen im Großraum Bangkok.</p>",
    "risk_level": "high",
    "start_date": "2026-02-11T08:00:00Z",
    "end_date": "2026-02-18T08:00:00Z",
    "event_category_codes": ["environment"],
    "country_codes": ["TH"],
    "latitude": 13.7563,
    "longitude": 100.5018,
    "tags": ["flooding", "bangkok"],
    "external_id": "EXT-2026-001"
  }'

Response (201 Created):

{
  "success": true,
  "message": "Event created and published successfully.",
  "data": {
    "id": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
    "title": "Überschwemmung Bangkok",
    "description": "Schwere Überschwemmungen im Großraum Bangkok.",
    "risk_level": "high",
    "start_date": "2026-02-11T08:00:00+00:00",
    "end_date": "2026-02-18T08:00:00+00:00",
    "latitude": 13.7563,
    "longitude": 100.5018,
    "review_status": "approved",
    "is_active": true,
    "tags": ["flooding", "bangkok"],
    "event_categories": [
      {
        "code": "environment",
        "name": "Umweltereignisse",
        "color": "#059669",
        "icon": "fa-leaf"
      }
    ],
    "countries": [
      {
        "iso_code": "TH",
        "name_de": "Thailand",
        "name_en": "Thailand"
      }
    ],
    "created_at": "2026-02-11T10:30:00+00:00",
    "updated_at": "2026-02-11T10:30:00+00:00"
  }
}

Hinweis: Wenn für Ihren Account die Auto-Freigabe nicht aktiviert ist, lautet der review_status pending_review und is_active ist false. Das Event wird erst nach manueller Freigabe durch das Global-Travel-Monitor-Team auf dem Dashboard sichtbar.


Eigene Events auflisten

GET /v1/custom/events

Standardmäßig werden nur eigene Events zurückgegeben — also Events, die über Ihren API-Token erstellt wurden. Mit dem Parameter scope können Sie zusätzlich Global-Travel-Monitor-Events und Events von Partner-Gruppen abrufen.

Der scope-Parameter unterstützt kommagetrennte Werte, um mehrere Quellen gleichzeitig abzufragen.

Query-Parameter:

Parameter Typ Beschreibung
scope string Kommagetrennte Liste von Scope-Werten (Standard: own)
per_page integer Einträge pro Seite (Standard: 25)
page integer Seitennummer

Scope-Werte:

Wert Beschreibung
own Nur Ihre eigenen Events (Standard)
passolution Nur von Global Travel Monitor bereitgestellte Events (aktiv und freigegeben)
all Ihre eigenen Events + Global-Travel-Monitor-Events zusammen
{gruppen-slug} Events der API-Kunden in der angegebenen Event-Gruppe (aktiv, freigegeben, nicht archiviert). Wenn die Gruppe include_passolution_events aktiviert hat, werden zusätzlich Global-Travel-Monitor-Events mitgeliefert.

Hinweis: Partner-Events (über Gruppen) und Global-Travel-Monitor-Events werden nur angezeigt, wenn sie aktiv, freigegeben und nicht archiviert sind.

Beispiele:

# Eigene Events (Standard)
curl -H "Authorization: Bearer {TOKEN}" \
  "https://platform.passolution.de/api/v1/custom/events?per_page=10&page=1"

# Nur Global-Travel-Monitor-Events
curl -H "Authorization: Bearer {TOKEN}" \
  "https://platform.passolution.de/api/v1/custom/events?scope=passolution"

# Alle Events (eigene + Global Travel Monitor)
curl -H "Authorization: Bearer {TOKEN}" \
  "https://platform.passolution.de/api/v1/custom/events?scope=all"

# Eigene + Global Travel Monitor (kommagetrennt, entspricht scope=all)
curl -H "Authorization: Bearer {TOKEN}" \
  "https://platform.passolution.de/api/v1/custom/events?scope=own,passolution"

# Events einer Partner-Gruppe
curl -H "Authorization: Bearer {TOKEN}" \
  "https://platform.passolution.de/api/v1/custom/events?scope=meine-partner-gruppe"

# Eigene Events + Partner-Gruppe kombiniert
curl -H "Authorization: Bearer {TOKEN}" \
  "https://platform.passolution.de/api/v1/custom/events?scope=own,meine-partner-gruppe"

Einzelnes Event anzeigen

GET /v1/custom/events/{uuid}

Beispiel:

curl -H "Authorization: Bearer {TOKEN}" \
  https://platform.passolution.de/api/v1/custom/events/a1b2c3d4-e5f6-7890-abcd-ef1234567890

Event aktualisieren

Erfordert Freischaltung der Event-Erstellung für Ihren Account.

PUT /v1/custom/events/{uuid}

Es müssen nur die zu ändernden Felder gesendet werden.

Beispiel:

curl -X PUT https://platform.passolution.de/api/v1/custom/events/a1b2c3d4-e5f6-7890-abcd-ef1234567890 \
  -H "Authorization: Bearer {TOKEN}" \
  -H "Content-Type: application/json" \
  -d '{
    "title": "Überschwemmung Bangkok - Entwarnung",
    "risk_level": "low"
  }'

Response (200 OK):

{
  "success": true,
  "message": "Event updated successfully.",
  "data": { ... }
}

Event löschen

Erfordert Freischaltung der Event-Erstellung für Ihren Account.

DELETE /v1/custom/events/{uuid}

Beispiel:

curl -X DELETE https://platform.passolution.de/api/v1/custom/events/a1b2c3d4-e5f6-7890-abcd-ef1234567890 \
  -H "Authorization: Bearer {TOKEN}"

Response (200 OK):

{
  "success": true,
  "message": "Event deleted successfully."
}

Fehlercodes

HTTP-Code Bedeutung
200 Erfolgreich
201 Erfolgreich erstellt
401 Nicht authentifiziert (Token fehlt oder ungültig)
403 Zugriff verweigert (Token hat keine Berechtigung oder Account deaktiviert)
404 Event nicht gefunden
422 Validierungsfehler (ungültige Daten)
429 Rate Limit überschritten
500 Serverfehler

Beispiel Validierungsfehler (422):

{
  "message": "The title field is required.",
  "errors": {
    "title": ["The title field is required."],
    "event_category_codes": ["At least one event type code is required."]
  }
}

Review-Workflow

Je nach Konfiguration Ihres Accounts gibt es zwei Modi:

  1. Auto-Freigabe aktiviert: Events werden sofort veröffentlicht (review_status: approved, is_active: true)
  2. Auto-Freigabe deaktiviert: Events werden zur Prüfung eingereicht (review_status: pending_review, is_active: false) und erst nach Freigabe durch das Global-Travel-Monitor-Team sichtbar

Logo auf dem Dashboard

Wenn ein Firmenlogo in Ihrem API-Account hinterlegt ist, wird dieses als Quellen-Logo neben Ihren Events auf dem Dashboard angezeigt. Ohne Logo erscheint Ihr Firmenname als Text.


Support

Bei Fragen zur API wenden Sie sich an Ihren Ansprechpartner bei Passolution.

Folder Import API – Kundenanleitung

Übersicht

Die Folder Import API ermöglicht den Import von Reisedaten (Folders) mit Hotels, Flügen, Kreuzfahrten und Mietwagen. Der Import läuft queue-basiert im Hintergrund und bietet automatisches Airport-Matching, Country-Matching, Timeline-Generierung und Geocoding.


Authentifizierung

Alle API-Aufrufe erfordern einen Bearer-Token im HTTP-Header:

Authorization: Bearer {API_TOKEN}

Token generieren

Der Token wird über die Web-Oberfläche generiert (erfordert eine aktive Session):

POST /customer/api-tokens/generate

Response:

{
  "success": true,
  "token": "2|RHej0fNgjGSzvPrEcSuY7nMGI7fldCnOMoBrpl2T173373b5",
  "message": "API Token erfolgreich generiert"
}

Wichtig: Speichern Sie den Token sicher ab. Er wird nur einmal im Klartext angezeigt.


Base-URL

https://platform.passolution.de/api

Die bisherigen Adressen https://api.global-travel-monitor.de und https://global-travel-monitor.eu/api bleiben weiterhin gültig; bestehende Integrationen müssen nicht umgestellt werden.


Folder importieren

POST /v1/folders/import

Importiert einen kompletten Folder mit allen zugehörigen Daten. Der Import wird in eine Queue eingereiht und im Hintergrund verarbeitet. Die Response enthält eine log_id zum Status-Tracking.

Request-Struktur

Feld Typ Pflicht Beschreibung
source string Ja Import-Quelle: api, file, manual
provider string Ja Name des Datenlieferanten (max. 128 Zeichen)
data object Ja Die eigentlichen Reisedaten (siehe unten)
mapping_config object Nein Optionale Mapping-Konfiguration

Daten-Struktur (data)

Feld Typ Pflicht Beschreibung
folder object Ja Vorgangsdaten
customer object Nein Kundendaten
participants array Nein Reiseteilnehmer
itineraries array Ja Reiseleistungen (Hotels, Flüge, etc.)

Folder (Vorgangsdaten)

Feld Typ Pflicht Beschreibung
folder_number string Nein Eindeutige Vorgangsnummer (wird automatisch generiert)
folder_name string Nein Name der Reise (max. 255 Zeichen)
travel_start_date date Nein Reisebeginn (YYYY-MM-DD)
travel_end_date date Nein Reiseende (YYYY-MM-DD)
primary_destination string Nein Hauptreiseziel
status string Nein draft, confirmed, active, completed, cancelled (Standard: draft)
travel_type string Nein business, leisure, mixed (Standard: leisure)
agent_name string Nein Name des Bearbeiters
notes string Nein Notizen
currency string Nein Währung als ISO-Code (Standard: EUR)
custom_field_1_label string Nein Label für eigenes Feld 1 (max. 100 Zeichen)
custom_field_1_value string Nein Wert für eigenes Feld 1
custom_field_2_label string Nein Label für eigenes Feld 2
custom_field_2_value string Nein Wert für eigenes Feld 2
custom_field_3_label string Nein Label für eigenes Feld 3
custom_field_3_value string Nein Wert für eigenes Feld 3
custom_field_4_label string Nein Label für eigenes Feld 4
custom_field_4_value string Nein Wert für eigenes Feld 4
custom_field_5_label string Nein Label für eigenes Feld 5
custom_field_5_value string Nein Wert für eigenes Feld 5

Customer (Kundendaten)

Feld Typ Pflicht Beschreibung
salutation string Nein Anrede: mr, mrs, diverse (auch Herr, Frau, Divers wird gemappt)
title string Nein Titel (max. 64 Zeichen)
first_name string Ja Vorname (max. 128 Zeichen)
last_name string Ja Nachname (max. 128 Zeichen)
email string Nein E-Mail-Adresse
phone string Nein Telefonnummer
mobile string Nein Mobilnummer
street string Nein Straße
house_number string Nein Hausnummer
postal_code string Nein Postleitzahl
city string Nein Stadt
country_code string Nein Ländercode (ISO alpha-2, z.B. DE)
birth_date date Nein Geburtsdatum (YYYY-MM-DD)
nationality string Nein Staatsangehörigkeit (ISO alpha-2)
notes string Nein Notizen

Participant (Reiseteilnehmer)

Feld Typ Pflicht Beschreibung
salutation string Nein mr, mrs, child, infant, diverse
title string Nein Titel
first_name string Ja Vorname
last_name string Ja Nachname
birth_date date Nein Geburtsdatum
nationality string Nein Staatsangehörigkeit (ISO alpha-2)
passport_number string Nein Reisepassnummer
passport_issue_date date Nein Ausstellungsdatum Pass
passport_expiry_date date Nein Ablaufdatum Pass
passport_issuing_country string Nein Ausstellungsland Pass (ISO alpha-2)
email string Nein E-Mail-Adresse
phone string Nein Telefonnummer
dietary_requirements string Nein Ernährungsanforderungen
medical_conditions string Nein Medizinische Hinweise
notes string Nein Notizen
is_main_contact boolean Nein Hauptansprechpartner (Standard: false)
participant_type string Nein adult, child, infant (Standard: adult)

Itinerary (Reiseleistung)

Feld Typ Pflicht Beschreibung
booking_reference string Nein Buchungsreferenz
itinerary_name string Nein Name der Leistung
start_date date Nein Startdatum
end_date date Nein Enddatum
status string Nein pending, confirmed, cancelled, completed (Standard: pending)
provider_name string Nein Anbietername
provider_reference string Nein Anbieterreferenz
currency string Nein Währung (Standard: EUR)
notes string Nein Notizen
hotels array Nein Hotels (siehe unten)
flights array Nein Flüge (siehe unten)
ships array Nein Kreuzfahrten (siehe unten)
car_rentals array Nein Mietwagen (siehe unten)

Hotel

Feld Typ Pflicht Beschreibung
hotel_name string Ja Hotelname
hotel_code string Nein Hotel-Code
hotel_code_type string Nein Typ des Hotel-Codes
street string Nein Straße
postal_code string Nein Postleitzahl
city string Nein Stadt
country_code string Nein Ländercode (ISO alpha-2)
lat number Nein Breitengrad (-90 bis 90)
lng number Nein Längengrad (-180 bis 180)
check_in_date date Ja Check-in-Datum
check_out_date date Ja Check-out-Datum
nights integer Nein Anzahl Nächte
room_type string Nein Zimmertyp
room_count integer Nein Zimmeranzahl (Standard: 1)
board_type string Nein Verpflegung (z.B. "All Inclusive")
booking_reference string Nein Buchungsreferenz
total_amount number Nein Gesamtbetrag
currency string Nein Währung (Standard: EUR)
status string Nein pending, confirmed, cancelled (Standard: pending)
notes string Nein Notizen

Flight (Flug)

Feld Typ Pflicht Beschreibung
booking_reference string Nein Buchungsreferenz
service_type string Nein outbound, return, multi_leg (Standard: outbound)
airline_pnr string Nein Airline PNR
ticket_numbers array Nein Ticketnummern
total_amount number Nein Gesamtbetrag
currency string Nein Währung (Standard: EUR)
status string Nein pending, ticketed, cancelled (Standard: pending)
segments array Ja Flugsegmente (mindestens 1)

Flight Segment

Feld Typ Pflicht Beschreibung
segment_number integer Nein Segmentnummer (Standard: 1)
departure_airport_code string Ja IATA-Code Abflughafen (z.B. MUC) – automatisches Matching
departure_time datetime Ja Abflugzeit
departure_terminal string Nein Terminal
arrival_airport_code string Ja IATA-Code Zielflughafen (z.B. PMI) – automatisches Matching
arrival_time datetime Ja Ankunftszeit
arrival_terminal string Nein Terminal
airline_code string Nein Airline-Code (z.B. LH)
flight_number string Nein Flugnummer
aircraft_type string Nein Flugzeugtyp (z.B. A320)
duration_minutes integer Nein Flugdauer in Minuten
booking_class string Nein Buchungsklasse
cabin_class string Nein economy, premium_economy, business, first (Standard: economy)

Hinweis: departure_country_code, departure_lat, departure_lng, arrival_country_code, arrival_lat, arrival_lng werden automatisch aus den IATA-Codes ermittelt.


Ship (Kreuzfahrt)

Feld Typ Pflicht Beschreibung
ship_name string Ja Schiffsname
cruise_line string Nein Reederei
ship_code string Nein Schiffs-Code
embarkation_date date Ja Einschiffungsdatum
disembarkation_date date Ja Ausschiffungsdatum
nights integer Nein Anzahl Nächte
embarkation_port string Nein Einschiffungshafen
embarkation_country_code string Nein Ländercode Einschiffung (ISO alpha-2)
embarkation_lat number Nein Breitengrad Einschiffung
embarkation_lng number Nein Längengrad Einschiffung
disembarkation_port string Nein Ausschiffungshafen
disembarkation_country_code string Nein Ländercode Ausschiffung
disembarkation_lat number Nein Breitengrad Ausschiffung
disembarkation_lng number Nein Längengrad Ausschiffung
cabin_number string Nein Kabinennummer
cabin_type string Nein Kabinentyp
cabin_category string Nein Kabinenkategorie
deck string Nein Deck
booking_reference string Nein Buchungsreferenz
total_amount number Nein Gesamtbetrag
currency string Nein Währung (Standard: EUR)
status string Nein pending, confirmed, cancelled (Standard: pending)
port_calls array Nein Hafenstopps (siehe unten)
notes string Nein Notizen

Port Call (Hafenstopp)

Feld Typ Pflicht Beschreibung
port string Nein Hafenname
country string Nein Ländercode (ISO alpha-2)
arrival date Nein Ankunftsdatum
departure date Nein Abreisedatum

Car Rental (Mietwagen)

Feld Typ Pflicht Beschreibung
rental_company string Nein Mietwagenfirma
booking_reference string Nein Buchungsreferenz
pickup_location string Ja Abholort
pickup_country_code string Nein Ländercode Abholung (ISO alpha-2)
pickup_lat number Nein Breitengrad Abholung
pickup_lng number Nein Längengrad Abholung
pickup_datetime datetime Ja Abholdatum/-zeit
return_location string Ja Rückgabeort
return_country_code string Nein Ländercode Rückgabe
return_lat number Nein Breitengrad Rückgabe
return_lng number Nein Längengrad Rückgabe
return_datetime datetime Ja Rückgabedatum/-zeit
vehicle_category string Nein Fahrzeugkategorie
vehicle_type string Nein Fahrzeugtyp
vehicle_make_model string Nein Marke/Modell
transmission string Nein manual, automatic
fuel_type string Nein petrol, diesel, electric, hybrid
rental_days integer Nein Mietdauer in Tagen
total_amount number Nein Gesamtbetrag
currency string Nein Währung (Standard: EUR)
insurance_options array Nein Versicherungsoptionen
extras array Nein Zusatzleistungen
status string Nein pending, confirmed, picked_up, returned, cancelled (Standard: pending)
notes string Nein Notizen

Beispiele

Minimaler Import (nur Hotel)

curl -X POST https://platform.passolution.de/api/v1/folders/import \
  -H "Authorization: Bearer {TOKEN}" \
  -H "Content-Type: application/json" \
  -d '{
    "source": "api",
    "provider": "Test System",
    "data": {
      "folder": {
        "folder_name": "Test Reise",
        "travel_start_date": "2026-06-01",
        "travel_end_date": "2026-06-14"
      },
      "customer": {
        "first_name": "Max",
        "last_name": "Mustermann"
      },
      "participants": [
        {
          "first_name": "Max",
          "last_name": "Mustermann",
          "is_main_contact": true
        }
      ],
      "itineraries": [
        {
          "itinerary_name": "Hauptreise",
          "hotels": [
            {
              "hotel_name": "Test Hotel",
              "check_in_date": "2026-06-01",
              "check_out_date": "2026-06-14"
            }
          ]
        }
      ]
    }
  }'

Vollständiger Import (Hotel + Flug)

curl -X POST https://platform.passolution.de/api/v1/folders/import \
  -H "Authorization: Bearer {TOKEN}" \
  -H "Content-Type: application/json" \
  -d '{
    "source": "api",
    "provider": "TUI Reisebüro München",
    "data": {
      "folder": {
        "folder_name": "Mallorca Sommerurlaub 2026",
        "travel_start_date": "2026-07-15",
        "travel_end_date": "2026-07-29",
        "primary_destination": "Palma, Spanien",
        "travel_type": "leisure",
        "status": "confirmed",
        "currency": "EUR",
        "custom_field_1_label": "TUI Buchungsnummer",
        "custom_field_1_value": "TUI-2026-12345"
      },
      "customer": {
        "salutation": "Frau",
        "first_name": "Anna",
        "last_name": "Müller",
        "email": "anna.mueller@example.com",
        "phone": "+49 89 12345678",
        "city": "München",
        "country_code": "DE"
      },
      "participants": [
        {
          "salutation": "Frau",
          "first_name": "Anna",
          "last_name": "Müller",
          "birth_date": "1985-03-15",
          "nationality": "DE",
          "passport_number": "C01X12345",
          "is_main_contact": true,
          "participant_type": "adult"
        }
      ],
      "itineraries": [
        {
          "itinerary_name": "Mallorca Hauptreise",
          "start_date": "2026-07-15",
          "end_date": "2026-07-29",
          "status": "confirmed",
          "booking_reference": "MAL-2026-001",
          "currency": "EUR",
          "hotels": [
            {
              "hotel_name": "Hotel Paraíso del Mar",
              "city": "Palma",
              "country_code": "ES",
              "lat": 39.5699,
              "lng": 2.6509,
              "check_in_date": "2026-07-15",
              "check_out_date": "2026-07-29",
              "nights": 14,
              "room_type": "Superior Doppelzimmer",
              "board_type": "All Inclusive",
              "booking_reference": "HTL-001",
              "total_amount": 2450.00,
              "status": "confirmed"
            }
          ],
          "flights": [
            {
              "booking_reference": "LH-PMI-001",
              "service_type": "outbound",
              "status": "ticketed",
              "segments": [
                {
                  "segment_number": 1,
                  "departure_airport_code": "MUC",
                  "departure_time": "2026-07-15 10:00:00",
                  "arrival_airport_code": "PMI",
                  "arrival_time": "2026-07-15 12:15:00",
                  "airline_code": "LH",
                  "flight_number": "1802",
                  "cabin_class": "economy"
                }
              ]
            }
          ]
        }
      ]
    }
  }'

Response (202 Accepted):

{
  "success": true,
  "message": "Import queued successfully",
  "log_id": "019bef38-f2bc-73fc-bdbc-228ff5a8421e"
}

Import-Status abfragen

Status eines einzelnen Imports

GET /v1/folders/imports/{log_id}/status

Beispiel:

curl -H "Authorization: Bearer {TOKEN}" \
  "https://platform.passolution.de/api/v1/folders/imports/019bef38-f2bc-73fc-bdbc-228ff5a8421e/status"

Response (200 OK):

{
  "success": true,
  "data": {
    "id": "019bef38-f2bc-73fc-bdbc-228ff5a8421e",
    "status": "completed",
    "folder_id": "019bef39-a1b2-c3d4-e5f6-789012345678",
    "records_imported": 5,
    "records_failed": 0,
    "error_message": null,
    "started_at": "2026-06-01T10:00:01Z",
    "completed_at": "2026-06-01T10:00:03Z",
    "duration_seconds": 2
  }
}

Mögliche Status-Werte:

Status Beschreibung
pending Import wartet auf Verarbeitung
processing Import wird gerade verarbeitet
completed Import erfolgreich abgeschlossen
failed Import fehlgeschlagen (siehe error_message)

Liste aller Imports

GET /v1/folders/imports

Query-Parameter:

Parameter Typ Beschreibung
per_page integer Einträge pro Seite (Standard: 15, Maximum: 100)

Beispiel:

curl -H "Authorization: Bearer {TOKEN}" \
  "https://platform.passolution.de/api/v1/folders/imports?per_page=10"

Fehlercodes

HTTP-Code Bedeutung
202 Import erfolgreich in Queue eingereiht
200 Statusabfrage erfolgreich
401 Nicht authentifiziert (Token fehlt oder ungültig)
404 Import-Log nicht gefunden
422 Validierungsfehler (ungültige Daten)
500 Serverfehler

Beispiel Validierungsfehler (422):

{
  "success": false,
  "errors": {
    "source": ["The source field is required."],
    "data.folder.folder_name": ["The folder name must not exceed 255 characters."]
  }
}

Automatische Features


Support

Bei Fragen zur API wenden Sie sich an Ihren Ansprechpartner bei Passolution.

Feed API – Kundenanleitung

Übersicht

Die Feed API stellt aktuelle Sicherheits- und Reiserisiko-Events sowie Länderinformationen als RSS/Atom-Feeds bereit. Die Feeds können in Feed-Reader, CMS-Systeme oder eigene Anwendungen eingebunden werden.

Keine Authentifizierung erforderlich – alle Feed-Endpunkte sind öffentlich zugänglich.


Base-URL

https://platform.passolution.de/feed

Die bisherige Adresse https://global-travel-monitor.eu/feed bleibt weiterhin gültig; bestehende Feed-Abonnements müssen nicht umgestellt werden.


Caching

Feed-Antworten werden serverseitig gecacht. Die Cache-Dauer beträgt standardmäßig 1 Stunde (3600 Sekunden). Bei neuen oder geänderten Events wird der Cache automatisch invalidiert.


Metadaten

Verfügbare Priorities und Event-Typen

GET /feed/events/meta.json

Gibt die gültigen Werte für Priority-Filter und Event-Typ-Filter als JSON zurück.

Beispiel:

curl https://platform.passolution.de/feed/events/meta.json

Response:

{
  "priorities": [
    { "code": "high", "name_de": "Hoch", "name_en": "High" },
    { "code": "medium", "name_de": "Mittel", "name_en": "Medium" },
    { "code": "low", "name_de": "Niedrig", "name_en": "Low" },
    { "code": "info", "name_de": "Information", "name_en": "Info" }
  ],
  "event_categories": [
    {
      "code": "environment",
      "name": "Umweltereignisse",
      "description": "...",
      "icon": "fa-house-crack",
      "color": "#FF0000"
    }
  ]
}

Event-Feeds

Alle Event-Feeds liefern nur aktive, nicht-archivierte Events, deren Startdatum in der Vergangenheit liegt. Maximal 100 Events pro Feed, sortiert nach Startdatum (neueste zuerst).

Alle Events

Format URL
RSS 2.0 /feed/events/all.xml
Atom 1.0 /feed/events/all.atom

Beispiel:

curl https://platform.passolution.de/feed/events/all.xml

Events nach Priorität

GET /feed/events/priority/{priority}.xml
Parameter Gültige Werte
priority high, medium, low, info

Beispiel:

curl https://platform.passolution.de/feed/events/priority/high.xml

Events nach Land

GET /feed/events/countries/{code}.xml
Parameter Beschreibung
code ISO 3166-1 alpha-2 (z.B. de) oder alpha-3 (z.B. deu), case-insensitive

Beispiel:

curl https://platform.passolution.de/feed/events/countries/de.xml

Events nach Event-Typ

GET /feed/events/types/{type}.xml
Parameter Beschreibung
type Event-Typ-Code (aus meta.json), case-insensitive

Beispiel:

curl https://platform.passolution.de/feed/events/types/earthquake.xml

Events nach Region

GET /feed/events/regions/{region}.xml
Parameter Beschreibung
region Numerische Region-ID

Beispiel:

curl https://platform.passolution.de/feed/events/regions/3.xml

RSS-Struktur (Events)

Jedes Event-Item im Feed enthält folgende Elemente:

Standard-RSS-Elemente

Element Beschreibung
<title> Titel des Events
<link> URL zur Event-Detailseite
<guid> Permanenter Link (identisch mit <link>)
<description> Kurzübersicht: Typ, Zeitraum, Priorität, Länder
<content:encoded> Vollständige Beschreibung
<pubDate> Erstellungsdatum (RFC 2822)
<category> Priorität und Event-Typen
<dc:creator> Ersteller (falls vorhanden)
<source> Quellenangabe mit URL
<enclosure> Länderbild (JPEG, falls vorhanden)

Benutzerdefinierte Elemente: article:data

<article:data>
  <article:start_date>Mon, 11 Feb 2026 08:00:00 +0000</article:start_date>
  <article:end_date>Tue, 18 Feb 2026 08:00:00 +0000</article:end_date>
  <article:priority>high</article:priority>
  <article:event_type code="earthquake">Erdbeben</article:event_type>
</article:data>
Element Beschreibung
article:start_date Startdatum des Events
article:end_date Enddatum des Events
article:priority Prioritätsstufe: high, medium, low, info
article:event_type Event-Typ mit code-Attribut und Name als Inhalt (mehrere möglich)

Benutzerdefinierte Elemente: country:data

Pro betroffenem Land wird ein <country:data>-Block ausgegeben:

<country:data>
  <country:name_de>Thailand</country:name_de>
  <country:name_en>Thailand</country:name_en>
  <country:iso_code>TH</country:iso_code>
  <country:iso3_code>THA</country:iso3_code>
  <country:is_eu_member>false</country:is_eu_member>
  <country:is_schengen_member>false</country:is_schengen_member>
  <country:continent>Asien</country:continent>
  <country:currency_code>THB</country:currency_code>
  <country:phone_prefix>+66</country:phone_prefix>
  <country:capital>
    <country:capital_name>Bangkok</country:capital_name>
    <geo:lat>13.7563</geo:lat>
    <geo:long>100.5018</geo:long>
  </country:capital>
</country:data>
Element Beschreibung
country:name_de Ländername (deutsch)
country:name_en Ländername (englisch)
country:iso_code ISO 3166-1 alpha-2 Code
country:iso3_code ISO 3166-1 alpha-3 Code
country:is_eu_member true / false
country:is_schengen_member true / false
country:continent Kontinent (deutsch)
country:currency_code ISO 4217 Währungscode
country:phone_prefix Internationale Telefonvorwahl
country:capital_name Name der Hauptstadt
geo:lat Breitengrad der Hauptstadt
geo:long Längengrad der Hauptstadt

XML-Namespaces

<rss version="2.0"
  xmlns:atom="http://www.w3.org/2005/Atom"
  xmlns:dc="http://purl.org/dc/elements/1.1/"
  xmlns:content="http://purl.org/rss/1.0/modules/content/"
  xmlns:country="http://global-travel-monitor.eu/ns/country"
  xmlns:article="http://global-travel-monitor.eu/ns/article"
  xmlns:geo="http://www.w3.org/2003/01/geo/wgs84_pos#">

Länder-Feeds

Die Länder-Feeds liefern Verzeichnisse mit Länderdetails (Name, ISO-Codes, EU/Schengen-Status, Kontinent, Währung, Hauptstadt mit Koordinaten).

Alle Länder

GET /feed/countries/names/all.xml

Länder nach Kontinent

GET /feed/countries/continent/{code}.xml
Parameter Gültige Werte
code EU (Europa), AS (Asien), AF (Afrika), NA (Nordamerika), SA (Südamerika), OC (Ozeanien), AN (Antarktis)

Beispiel:

curl https://platform.passolution.de/feed/countries/continent/EU.xml

EU-Mitgliedsstaaten

GET /feed/countries/eu.xml

Schengen-Staaten

GET /feed/countries/schengen.xml

Endpunkt-Übersicht

Endpunkt Format Beschreibung
/feed/events/meta.json JSON Verfügbare Priorities und Event-Typen
/feed/events/all.xml RSS 2.0 Alle aktiven Events
/feed/events/all.atom Atom 1.0 Alle aktiven Events
/feed/events/priority/{priority}.xml RSS 2.0 Events nach Priorität
/feed/events/countries/{code}.xml RSS 2.0 Events nach Land
/feed/events/types/{type}.xml RSS 2.0 Events nach Event-Typ
/feed/events/regions/{region}.xml RSS 2.0 Events nach Region
/feed/countries/names/all.xml RSS 2.0 Alle Länder
/feed/countries/continent/{code}.xml RSS 2.0 Länder nach Kontinent
/feed/countries/eu.xml RSS 2.0 EU-Mitgliedsstaaten
/feed/countries/schengen.xml RSS 2.0 Schengen-Staaten

Support

Bei Fragen zur Feed API wenden Sie sich an Ihren Ansprechpartner bei Passolution.

Plugin Domain API – Anleitung

Übersicht

Die Plugin Domain API ermöglicht es Plugin-Kunden, ihre erlaubten Domains programmatisch zu verwalten. Domains bestimmen, welche Websites das Global Travel Monitor Plugin per iframe einbetten dürfen.

Die API unterstützt das Anlegen, Abrufen, Aktualisieren und Löschen einzelner Domains sowie Massenoperationen für den Import und die Löschung von bis zu 1.000 Domains pro Aufruf.


Authentifizierung

Alle API-Aufrufe erfordern Ihren Plugin-Key als Bearer-Token im HTTP-Header:

Authorization: Bearer pk_live_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx

Den Key finden Sie in Ihrem Plugin-Dashboard unter https://global-travel-monitor.eu/plugin/dashboard.

Hinweis: Der Plugin-Key ist derselbe Key, den Sie auch für die iframe-Integration verwenden.


Base-URL

https://platform.passolution.de/api/v1/plugin

Die bisherigen Adressen https://api.global-travel-monitor.de/v1/plugin und https://global-travel-monitor.eu/api/v1/plugin bleiben weiterhin gültig; bestehende Integrationen müssen nicht umgestellt werden.


Rate Limit

Standardmäßig sind 120 Requests pro Minute erlaubt. Bei Überschreitung erhalten Sie einen 429 Too Many Requests-Response. Prüfen Sie den Retry-After-Header für die Wartezeit in Sekunden.


Domain-Normalisierung

Domains werden beim Speichern automatisch normalisiert:


Domain-Identifikation (UUID)

Jede Domain erhält eine eindeutige UUID. Alle Operationen auf einzelne Domains (Abrufen, Aktualisieren, Löschen) verwenden diese UUID als Identifikator.


Endpunkte

Domains auflisten

GET /v1/plugin/gtm/domains

Gibt eine paginierte Liste aller registrierten Domains zurück.

Query-Parameter:

Parameter Typ Standard Beschreibung
per_page integer 50 Einträge pro Seite (max. 200)
page integer 1 Seitennummer
search string – Volltextsuche im Domain-Namen
is_active boolean – Filter: nur aktive (true) oder inaktive (false) Domains

Beispiel:

curl -H "Authorization: Bearer pk_live_xxx" \
  "https://platform.passolution.de/api/v1/plugin/gtm/domains?per_page=100&search=example"

Response (200):

{
  "data": [
    {
      "uuid": "550e8400-e29b-41d4-a716-446655440000",
      "domain": "example.com",
      "is_active": true,
      "created_at": "2026-03-15T10:30:00+00:00",
      "updated_at": "2026-03-15T10:30:00+00:00"
    }
  ],
  "meta": {
    "current_page": 1,
    "last_page": 1,
    "per_page": 100,
    "total": 1
  }
}

Einzelne Domain abrufen

GET /v1/plugin/gtm/domains/{uuid}

Beispiel:

curl -H "Authorization: Bearer pk_live_xxx" \
  "https://platform.passolution.de/api/v1/plugin/gtm/domains/550e8400-e29b-41d4-a716-446655440000"

Response (200):

{
  "data": {
    "uuid": "550e8400-e29b-41d4-a716-446655440000",
    "domain": "example.com",
    "is_active": true,
    "created_at": "2026-03-15T10:30:00+00:00",
    "updated_at": "2026-03-15T10:30:00+00:00"
  }
}

Domain hinzufügen

POST /v1/plugin/gtm/domains

Request-Body (JSON):

Feld Typ Pflicht Beschreibung
domain string Ja Die Domain (z.B. example.com)
is_active boolean Nein Aktiv-Status (Standard: true)

Beispiel:

curl -X POST -H "Authorization: Bearer pk_live_xxx" \
  -H "Content-Type: application/json" \
  -d '{"domain": "neue-website.de"}' \
  "https://platform.passolution.de/api/v1/plugin/gtm/domains"

Response (201):

{
  "data": {
    "uuid": "660e8400-e29b-41d4-a716-446655440001",
    "domain": "neue-website.de",
    "is_active": true,
    "created_at": "2026-03-31T12:00:00+00:00",
    "updated_at": "2026-03-31T12:00:00+00:00"
  }
}

Fehler (409): Domain bereits registriert.


Domains im Bulk importieren

POST /v1/plugin/gtm/domains/bulk

Importiert bis zu 1.000 Domains in einem Aufruf. Bereits vorhandene Domains werden übersprungen, ungültige Domains werden gemeldet.

Request-Body (JSON):

Feld Typ Pflicht Beschreibung
domains string[] Ja Array von Domain-Strings (max. 1.000)

Beispiel:

curl -X POST -H "Authorization: Bearer pk_live_xxx" \
  -H "Content-Type: application/json" \
  -d '{
    "domains": [
      "website1.de",
      "website2.com",
      "app.website3.de",
      "ungültig..domain"
    ]
  }' \
  "https://platform.passolution.de/api/v1/plugin/gtm/domains/bulk"

Response (201):

{
  "data": {
    "created": [
      {
        "uuid": "770e8400-e29b-41d4-a716-446655440002",
        "domain": "website1.de",
        "is_active": true,
        "created_at": "2026-03-31T12:00:00+00:00",
        "updated_at": "2026-03-31T12:00:00+00:00"
      },
      {
        "uuid": "770e8400-e29b-41d4-a716-446655440003",
        "domain": "website2.com",
        "is_active": true,
        "created_at": "2026-03-31T12:00:00+00:00",
        "updated_at": "2026-03-31T12:00:00+00:00"
      },
      {
        "uuid": "770e8400-e29b-41d4-a716-446655440004",
        "domain": "app.website3.de",
        "is_active": true,
        "created_at": "2026-03-31T12:00:00+00:00",
        "updated_at": "2026-03-31T12:00:00+00:00"
      }
    ],
    "skipped": [],
    "invalid": ["ungültig..domain"]
  },
  "meta": {
    "created_count": 3,
    "skipped_count": 0,
    "invalid_count": 1
  }
}

Domain aktualisieren

PUT /v1/plugin/gtm/domains/{uuid}

Aktualisiert eine Domain. Kann zum Umbenennen oder Aktivieren/Deaktivieren verwendet werden.

Request-Body (JSON):

Feld Typ Pflicht Beschreibung
domain string Nein Neuer Domain-Name
is_active boolean Nein Aktiv-Status ändern

Beispiel – Domain deaktivieren:

curl -X PUT -H "Authorization: Bearer pk_live_xxx" \
  -H "Content-Type: application/json" \
  -d '{"is_active": false}' \
  "https://platform.passolution.de/api/v1/plugin/gtm/domains/550e8400-e29b-41d4-a716-446655440000"

Response (200):

{
  "data": {
    "uuid": "550e8400-e29b-41d4-a716-446655440000",
    "domain": "example.com",
    "is_active": false,
    "created_at": "2026-03-15T10:30:00+00:00",
    "updated_at": "2026-03-31T14:00:00+00:00"
  }
}

Domain löschen

DELETE /v1/plugin/gtm/domains/{uuid}

Löscht eine einzelne Domain. Es muss immer mindestens eine Domain verbleiben.

Beispiel:

curl -X DELETE -H "Authorization: Bearer pk_live_xxx" \
  "https://platform.passolution.de/api/v1/plugin/gtm/domains/550e8400-e29b-41d4-a716-446655440000"

Response: 204 No Content

Fehler (422): Mindestens eine Domain muss verbleiben.


Domains im Bulk löschen

DELETE /v1/plugin/gtm/domains/bulk

Löscht bis zu 1.000 Domains anhand ihrer UUIDs in einem Aufruf. Es muss mindestens eine Domain verbleiben.

Request-Body (JSON):

Feld Typ Pflicht Beschreibung
uuids string[] Ja Array von Domain-UUIDs (max. 1.000)

Beispiel:

curl -X DELETE -H "Authorization: Bearer pk_live_xxx" \
  -H "Content-Type: application/json" \
  -d '{
    "uuids": [
      "550e8400-e29b-41d4-a716-446655440000",
      "660e8400-e29b-41d4-a716-446655440001"
    ]
  }' \
  "https://platform.passolution.de/api/v1/plugin/gtm/domains/bulk"

Response (200):

{
  "data": {
    "deleted_count": 2
  }
}

Fehler (422): Mindestens eine Domain muss verbleiben.


Fehlercodes

HTTP-Code Bedeutung Typische Ursache
401 Nicht authentifiziert Fehlender oder ungültiger API-Key
403 Zugriff verweigert Plugin-Konto nicht aktiv
404 Nicht gefunden Domain-UUID existiert nicht
409 Konflikt Domain bereits registriert
422 Validierungsfehler Ungültiges Domain-Format oder Mindestanzahl unterschritten
429 Rate Limit Zu viele Requests – warten und erneut versuchen

Alle Fehler-Responses folgen dem Format:

{
  "error": "Beschreibung des Fehlers.",
  "details": {}
}

Das details-Feld ist nur bei Validierungsfehlern (422) vorhanden und enthält feldspezifische Fehlermeldungen.


Typische Anwendungsfälle

Initiale Einrichtung mit vielen Domains

# Alle Domains aus einer Textdatei importieren
DOMAINS=$(cat domains.txt | jq -R -s 'split("\n") | map(select(length > 0))')

curl -X POST -H "Authorization: Bearer pk_live_xxx" \
  -H "Content-Type: application/json" \
  -d "{\"domains\": $DOMAINS}" \
  "https://platform.passolution.de/api/v1/plugin/gtm/domains/bulk"

Domains synchronisieren (vollständiger Abgleich)

# 1. Alle bestehenden Domains abrufen
EXISTING=$(curl -s -H "Authorization: Bearer pk_live_xxx" \
  "https://platform.passolution.de/api/v1/plugin/gtm/domains?per_page=200")

# 2. Nicht mehr benötigte Domains löschen
curl -X DELETE -H "Authorization: Bearer pk_live_xxx" \
  -H "Content-Type: application/json" \
  -d '{"uuids": ["uuid1", "uuid2"]}' \
  "https://platform.passolution.de/api/v1/plugin/gtm/domains/bulk"

# 3. Neue Domains importieren
curl -X POST -H "Authorization: Bearer pk_live_xxx" \
  -H "Content-Type: application/json" \
  -d '{"domains": ["new1.com", "new2.com"]}' \
  "https://platform.passolution.de/api/v1/plugin/gtm/domains/bulk"

Domain vorübergehend deaktivieren

curl -X PUT -H "Authorization: Bearer pk_live_xxx" \
  -H "Content-Type: application/json" \
  -d '{"is_active": false}' \
  "https://platform.passolution.de/api/v1/plugin/gtm/domains/{uuid}"

Support & Kontakt

Bei Fragen oder Problemen:


Letzte Aktualisierung: März 2026