Zum Hauptinhalt springen
WhatsApp-ChatMeine Buchungen

Entwickler-API

Zuletzt aktualisiert: 23. September 2026

Durchsuchen Sie unsere Flüge, leiten Sie Reisende direkt in eine Buchung weiter und verdienen Sie Provision auf alles, was Sie uns vermitteln. Alles Folgende wird von https://air-viva.com bereitgestellt.

Bereits Partner? Ihre Statistiken, Buchungen und monatlichen Abrechnungen finden Sie im Partnerportal. Partner-Anmeldung

Zugang erhalten

Das Partnerprogramm steht allen offen: Jeder kann teilnehmen. Füllen Sie das Formular unten aus, und wir senden Ihnen umgehend per E-Mail einen Link zu Ihren Testzugangsdaten. Beschreiben Sie uns dabei auch Ihr Projekt; darauf stützen wir eine geschäftliche Vereinbarung.

  • Einen Tracking-Code – den Wert, den Sie in jedem Link, den Sie uns schicken, im Parameter ref angeben.
  • Einen API-Token für die Such- und Feed-Endpunkte.
  • Provisionsbedingungen: einen Prozentsatz des Gesamtbetrags der Buchung, bis zu einem vereinbarten Höchstbetrag pro Buchung.

Ihr Token ist ein Inhaber-Token: Jeder, der ihn besitzt, kann in Ihrem Namen Abfragen stellen. Wir speichern nur einen Hash davon und können ihn Ihnen daher nicht erneut anzeigen – bewahren Sie ihn sicher auf, und teilen Sie uns sofort mit, wenn er in falsche Hände gerät; wir ersetzen ihn dann.

Ein Testkonto ist eingeschränkt, damit Ihr Test uns nie einen Vertrag mit einer Airline kostet:

  • Es endet nach 30 Tagen, sofern wir bis dahin keine Bedingungen vereinbart haben.
  • Bis zu 500 Suchanfragen pro Tag.
  • Suchanfragen werden aus unserem Preisspeicher beantwortet, den unsere eigenen Kunden und Partner im Livebetrieb gefüllt halten. Eine Strecke und ein Datum, die in letzter Zeit niemand gesucht hat, können leer zurückkommen; Produktivkonten lösen Live-Aktualisierungen aus.
  • Buchungen, die Sie während der Testphase vermitteln, werden Ihrem Code zugeordnet. Provision wird ab dem Datum Ihrer Vereinbarung gezahlt.

Testzugang anfordern

Daraus wird Ihr Tracking-Code, zum Beispiel acme-travel.

Hierhin senden wir den Link zu Ihren Zugangsdaten, und wir nutzen die Adresse für alles Weitere.

Optional. Wo unsere Flüge angezeigt werden.

Ein oder zwei Sätze: das Produkt, die Märkte und wo unsere Flüge erscheinen würden.

Wir verwenden diese Angaben nur, um Ihren Zugang einzurichten und Sie wegen einer Vereinbarung zu kontaktieren.

Authentifizierung

Senden Sie Ihren Token bei jeder Feed- und Suchanfrage mit, entweder als Authorization-Header mit dem reinen Token – ohne Präfix Bearer – oder als Query-Parameter accessToken. Die Redirect-Endpunkte sind öffentlich und benötigen keinen Token.

Beispiel

curl -H "Authorization: YOUR_TOKEN" \
  "https://air-viva.com/api/v2/data/routes.json"

Fehler

Beide Fälle liefern HTTP 401 mit dem Code ERROR_UNAUTHORIZED:

  • Gar kein Token: Authentication required
  • Ein Token, den wir nicht kennen, oder einer, der zu einem deaktivierten Konto gehört: Access Denied [1]

Endpunkte

Antworten sind JSON. Datumsangaben folgen ISO 8601 (YYYY-MM-DD). Flughäfen werden entweder per IATA-Code oder per numerischer ID aus dem Flughafen-Feed angegeben; beides wird überall akzeptiert, wo ein Flughafen genannt wird.

Gepäck und Tarifoptionen werden ausschließlich von den beiden Adressen mit der Endung -tcs geliefert: flights-tcs.json und flights-multi-tcs. Die übrigen Adressen ändern sich nie, sodass eine darauf aufgebaute Integration genau so weiterfunktioniert wie heute.

GET/api/v2/data/airports.jsonToken erforderlich

Alle Flughäfen, die wir bedienen, mit numerischer ID, IATA-Code, Stadt und Land.

Statische Referenzdaten. Speichern Sie sie im Cache – sie ändern sich selten, und die IDs sind stabil.

Beispielantwort · 200 OK

[
  {
    "id": 51,
    "code": "DUS",
    "city": "Dusseldorf",
    "country": "Germany"
  },
  {
    "id": 242,
    "code": "DAR",
    "city": "Dar es salaam",
    "country": "Tanzania"
  }
]
GET/api/v2/data/routes.jsonToken erforderlich

Die Flughafenpaare, die wir tatsächlich fliegen, als Paare aus Abflug- und Zielflughafen.

Zwei Flughäfen, die wir bedienen, ergeben noch kein buchbares Paar. Nutzen Sie diesen Feed, um Ihre Suchen auf Strecken zu beschränken, die es gibt – ein Paar außerhalb davon kann immer nur leer antworten.

Beispielantwort · 200 OK

[
  {
    "departure": {
      "id": 242,
      "code": "DAR",
      "city": "Dar es salaam",
      "country": "Tanzania"
    },
    "destination": {
      "id": 267,
      "code": "ZNZ",
      "city": "Zanzibar",
      "country": "Tanzania"
    }
  }
]
GET/api/v2/data/routes/with-availability.jsonToken erforderlich

Dieselben Paare mit den Tagen, an denen die jeweilige Strecke geflogen wird.

Nutzen Sie dies, um eine Strecke nicht an einem Tag zu suchen, an dem sie nicht geflogen wird.

Beispielantwort · 200 OK

[
  {
    "dep": "DAR",
    "des": "ZNZ",
    "dow": "Mon,Tue,Wed,Thu,Fri,Sat,Sun",
    "from": "2026-01-01",
    "to": "2027-12-31"
  }
]
GET/api/v2/flights.jsonToken erforderlich

Suche auf einer Strecke an einem Datum, nur Hinflug oder Hin- und Rückflug.

Liefert ein Objekt mit den Arrays departure und return. Jeder Flug hat seine eigene ID – übergeben Sie diese ID an den Redirect-Endpunkt, um die Reisenden direkt zu diesem Flug zu führen.

Parameter

from erforderlich
Abflughafen, IATA-Code oder ID.
to erforderlich
Zielflughafen, IATA-Code oder ID.
departureDate erforderlich
Datum des Hinflugs, YYYY-MM-DD.
returnDate optional
Datum des Rückflugs bei Hin- und Rückflug. Bei einfacher Strecke weglassen.
adults optional
Anzahl Erwachsene. Standardwert: 1.
children optional
Anzahl Kinder. Standardwert: 0.
infants optional
Kleinkinder auf dem Schoß. Standardwert: 0.
  • Ein Paar, das wir nicht fliegen, liefert leere Arrays, keinen Fehler – eine leere Antwort ist nie ein Grund für einen erneuten Versuch.
  • Ein Datum in der Vergangenheit liefert eine leere Antwort statt eines Fehlers.
  • return ist nur vorhanden, wenn ein returnDate gesendet wurde.

Beispielantwort · 200 OK

{
  "departure": [
    {
      "from": {
        "id": 242,
        "code": "DAR",
        "city": "Dar es salaam",
        "country": "Tanzania"
      },
      "to": {
        "id": 267,
        "code": "ZNZ",
        "city": "Zanzibar",
        "country": "Tanzania"
      },
      "legs": [
        {
          "from": {
            "id": 242,
            "code": "DAR",
            "city": "Dar es salaam",
            "country": "Tanzania"
          },
          "to": {
            "id": 267,
            "code": "ZNZ",
            "city": "Zanzibar",
            "country": "Tanzania"
          },
          "number": "611",
          "dates": {
            "departure": "2026-10-27 07:15",
            "arrival": "2026-10-27 07:30"
          },
          "duration": 900,
          "airline": {
            "id": 173,
            "name": "Auric Air",
            "code": "UI"
          }
        }
      ],
      "dates": {
        "departure": "2026-10-27 07:15",
        "arrival": "2026-10-27 07:30"
      },
      "duration": 900,
      "airline": {
        "id": 173,
        "name": "Auric Air",
        "code": "UI"
      },
      "price": {
        "currency": "USD",
        "adult": "122.00",
        "child": "0.00",
        "infant": "0.00"
      },
      "priceUsd": {
        "adult": "122.00",
        "child": "0.00",
        "infant": "0.00"
      },
      "priceEur": {
        "adult": "106.05",
        "child": "0.00",
        "infant": "0.00"
      },
      "priceGbp": {
        "adult": "90.88",
        "child": "0.00",
        "infant": "0.00"
      },
      "requiredFields": {
        "phone": true,
        "nationality": true,
        "documentType": true,
        "documentNumber": true,
        "documentExpiry": false,
        "documentIssuer": false,
        "documentIssueDate": false,
        "birthDate": false,
        "birthDateForChildren": false,
        "birthDateForInfants": false,
        "placeOfBirth": false
      },
      "id": 1000000383705
    }
  ]
}
GET/api/v2/flights-tcs.jsonToken erforderlich

Dieselbe Suche, mit Gepäck und bis zu vier Tarifoptionen pro Flug.

Liefert genau das, was flights.json liefert, und jedes Flugobjekt erhält zusätzlich ein Array fareOptions: die Tarife, die Sie auf diesem Flug verkaufen können, der günstigste zuerst, höchstens vier. Jede Option hat ihre eigene ID für den Redirect-Endpunkt, eigene Preisblöcke, einen fareFamilyName und das enthaltene Gepäck – cabinBag und checkedBag, jeweils mit pieces, status (FREE oder NOT_INCLUDED) und, sofern die Airline es angibt, einem Gewicht pro Gepäckstück in Kilogramm. Entwickelt für Gesamtkostenvergleiche wie Skyscanner Total Cost Search.

Parameter

from erforderlich
Abflughafen, IATA-Code oder ID.
to erforderlich
Zielflughafen, IATA-Code oder ID.
departureDate erforderlich
Datum des Hinflugs, YYYY-MM-DD.
returnDate optional
Datum des Rückflugs bei Hin- und Rückflug. Bei einfacher Strecke weglassen.
adults optional
Anzahl Erwachsene. Standardwert: 1.
children optional
Anzahl Kinder. Standardwert: 0.
infants optional
Kleinkinder auf dem Schoß. Standardwert: 0.
  • Die erste Tarifoption ist das eigene Angebot des Flugs: dieselbe ID, derselbe Preis wie im Flugobjekt.
  • Ein Feld, das die Airline nicht angegeben hat, wird weggelassen und nie als Null gesendet – behandeln Sie ein fehlendes cabinBag oder checkedBag als unbekannt.
  • cancellation und flightChange erscheinen nur als FREE und nur dort, wo die Airline dies angibt; ihr Fehlen sagt nichts aus.
  • Zwei Tarife mit identischen Merkmalen sind ein Produkt: Nur der günstigere wird aufgeführt.
  • Wir verkaufen kein kostenpflichtiges Gepäck, daher wird nie ein Gepäckpreis gesendet.
  • flights.json bleibt unverändert und weiterhin verfügbar; verwenden Sie, was zu Ihrer Integration passt.

Beispielantwort · 200 OK

{
  "departure": [
    {
      "from": {
        "id": 242,
        "code": "DAR",
        "city": "Dar es salaam",
        "country": "Tanzania"
      },
      "to": {
        "id": 267,
        "code": "ZNZ",
        "city": "Zanzibar",
        "country": "Tanzania"
      },
      "legs": [
        {
          "from": {
            "id": 242,
            "code": "DAR",
            "city": "Dar es salaam",
            "country": "Tanzania"
          },
          "to": {
            "id": 267,
            "code": "ZNZ",
            "city": "Zanzibar",
            "country": "Tanzania"
          },
          "number": "611",
          "dates": {
            "departure": "2026-10-27 07:15",
            "arrival": "2026-10-27 07:30"
          },
          "duration": 900,
          "airline": {
            "id": 173,
            "name": "Auric Air",
            "code": "UI"
          }
        }
      ],
      "dates": {
        "departure": "2026-10-27 07:15",
        "arrival": "2026-10-27 07:30"
      },
      "duration": 900,
      "airline": {
        "id": 173,
        "name": "Auric Air",
        "code": "UI"
      },
      "price": {
        "currency": "USD",
        "adult": "122.00",
        "child": "0.00",
        "infant": "0.00"
      },
      "priceUsd": {
        "adult": "122.00",
        "child": "0.00",
        "infant": "0.00"
      },
      "priceEur": {
        "adult": "106.05",
        "child": "0.00",
        "infant": "0.00"
      },
      "priceGbp": {
        "adult": "90.88",
        "child": "0.00",
        "infant": "0.00"
      },
      "requiredFields": {
        "phone": true,
        "nationality": true,
        "documentType": true,
        "documentNumber": true,
        "documentExpiry": false,
        "documentIssuer": false,
        "documentIssueDate": false,
        "birthDate": false,
        "birthDateForChildren": false,
        "birthDateForInfants": false,
        "placeOfBirth": false
      },
      "id": 1000000383705,
      "fareOptions": [
        {
          "id": 1000000383705,
          "fareFamilyName": "NR",
          "price": {
            "currency": "USD",
            "adult": "122.00",
            "child": "0.00",
            "infant": "0.00"
          },
          "priceUsd": {
            "adult": "122.00",
            "child": "0.00",
            "infant": "0.00"
          },
          "priceEur": {
            "adult": "106.05",
            "child": "0.00",
            "infant": "0.00"
          },
          "priceGbp": {
            "adult": "90.88",
            "child": "0.00",
            "infant": "0.00"
          },
          "cabinBag": {
            "pieces": 1,
            "status": "FREE",
            "weight": {
              "value": 5,
              "unit": "KG"
            }
          },
          "checkedBag": {
            "pieces": 1,
            "status": "FREE",
            "weight": {
              "value": 20,
              "unit": "KG"
            }
          }
        },
        {
          "id": 1000000383706,
          "fareFamilyName": "Y",
          "price": {
            "currency": "USD",
            "adult": "168.00",
            "child": "0.00",
            "infant": "0.00"
          },
          "priceUsd": {
            "adult": "168.00",
            "child": "0.00",
            "infant": "0.00"
          },
          "priceEur": {
            "adult": "146.04",
            "child": "0.00",
            "infant": "0.00"
          },
          "priceGbp": {
            "adult": "125.15",
            "child": "0.00",
            "infant": "0.00"
          },
          "checkedBag": {
            "pieces": 2,
            "status": "FREE",
            "weight": {
              "value": 23,
              "unit": "KG"
            }
          },
          "flightChange": "FREE"
        }
      ]
    }
  ]
}
POST/api/v2/flights-multiToken erforderlich

Bis zu fünf Strecken und Daten in einer Anfrage suchen, ohne Gepäck.

Die Anfrage ist ein JSON-Body. Jeder Eintrag in destinations ist eine Strecke an einem Datum; ein Hin- und Rückflug sind zwei Einträge, Hinflug und Rückflug. Die Antwort ist ein Objekt namens result mit Schlüsseln der Form FROM-TO-DATE (zum Beispiel MGA-RNI-2026-10-27); jeder Schlüssel enthält die Flüge dieses Eintrags im selben Format wie flights.json. Diese Antwort ändert sich nie: Für Gepäck und Tarifoptionen senden Sie dieselbe Anfrage an flights-multi-tcs.

Parameter

passengers.adults optional
Anzahl Erwachsene. Standardwert: 1.
passengers.children optional
Anzahl Kinder. Standardwert: 0.
passengers.infants optional
Kleinkinder auf dem Schoß. Standardwert: 0.
destinations[N].from erforderlich
Abflughafen, IATA-Code oder ID.
destinations[N].to erforderlich
Zielflughafen, IATA-Code oder ID.
destinations[N].date erforderlich
Datum, YYYY-MM-DD.
  • Es werden höchstens fünf Einträge in destinations gelesen; alle weiteren werden ignoriert.
  • Um einen Hin- und Rückflug zu verlinken, übergeben Sie die ID des Hinflugs und die des Rückflugs an redirect-multi.
  • Ein Paar außerhalb des Strecken-Feeds wird mit HTTP 400 und dem Code ERROR_DATA_VALIDATION (Route X-Y is not supported) abgelehnt, während flights.json dasselbe Paar mit leeren Arrays beantwortet.
  • Ein Eintrag an einem Tag, an dem wir nicht fliegen, oder an einem Datum in der Vergangenheit liefert eine leere Liste. Eine Anfrage ohne destinations liefert ein leeres Array.

Beispielanfrage

{
  "passengers": {
    "adults": 1,
    "children": 0,
    "infants": 0
  },
  "destinations": [
    {
      "from": "MGA",
      "to": "RNI",
      "date": "2026-10-27"
    }
  ]
}

Beispielantwort · 200 OK

{
  "result": {
    "MGA-RNI-2026-10-27": [
      {
        "from": {
          "id": 5217,
          "code": "MGA",
          "city": "Managua",
          "country": "Nicaragua"
        },
        "to": {
          "id": 5219,
          "code": "RNI",
          "city": "Corn Island",
          "country": "Nicaragua"
        },
        "legs": [
          {
            "from": {
              "id": 5217,
              "code": "MGA",
              "city": "Managua",
              "country": "Nicaragua"
            },
            "to": {
              "id": 5219,
              "code": "RNI",
              "city": "Corn Island",
              "country": "Nicaragua"
            },
            "number": "142",
            "dates": {
              "departure": "2026-10-27 07:00",
              "arrival": "2026-10-27 08:30"
            },
            "duration": 5400,
            "airline": {
              "id": 1320,
              "name": "LAC",
              "code": "6Y"
            }
          }
        ],
        "dates": {
          "departure": "2026-10-27 07:00",
          "arrival": "2026-10-27 08:30"
        },
        "duration": 5400,
        "airline": {
          "id": 1320,
          "name": "LAC",
          "code": "6Y"
        },
        "price": {
          "currency": "USD",
          "adult": "161.74",
          "child": "0.00",
          "infant": "0.00"
        },
        "priceUsd": {
          "adult": "161.74",
          "child": "0.00",
          "infant": "0.00"
        },
        "priceEur": {
          "adult": "140.60",
          "child": "0.00",
          "infant": "0.00"
        },
        "priceGbp": {
          "adult": "120.48",
          "child": "0.00",
          "infant": "0.00"
        },
        "requiredFields": {
          "phone": false,
          "nationality": true,
          "documentType": false,
          "documentNumber": true,
          "documentExpiry": false,
          "documentIssuer": false,
          "documentIssueDate": false,
          "birthDate": false,
          "birthDateForChildren": false,
          "birthDateForInfants": false,
          "placeOfBirth": false
        },
        "id": 1000000384088
      }
    ]
  }
}
POST/api/v2/flights-multi-tcsToken erforderlich

Dieselbe Suche über mehrere Strecken, mit Gepäck und bis zu vier Tarifoptionen pro Flug.

Nimmt genau die Anfrage entgegen, die flights-multi entgegennimmt, und liefert genau das, was flights-multi liefert; zusätzlich erhält jedes Flugobjekt ein Array fareOptions, wie bei flights-tcs.json beschrieben: die Tarife, die Sie auf diesem Flug verkaufen können, der günstigste zuerst, höchstens vier, jeweils mit eigener ID für die Redirect-Endpunkte, eigenen Preisblöcken, einem fareFamilyName und dem enthaltenen Gepäck. Entwickelt für Gesamtkostenvergleiche wie Skyscanner Total Cost Search.

Parameter

passengers.adults optional
Anzahl Erwachsene. Standardwert: 1.
passengers.children optional
Anzahl Kinder. Standardwert: 0.
passengers.infants optional
Kleinkinder auf dem Schoß. Standardwert: 0.
destinations[N].from erforderlich
Abflughafen, IATA-Code oder ID.
destinations[N].to erforderlich
Zielflughafen, IATA-Code oder ID.
destinations[N].date erforderlich
Datum, YYYY-MM-DD.
  • Die erste Tarifoption ist das eigene Angebot des Flugs: dieselbe ID, derselbe Preis wie im Flugobjekt.
  • Ein Feld, das die Airline nicht angegeben hat, wird weggelassen und nie als Null gesendet – behandeln Sie ein fehlendes cabinBag oder checkedBag als unbekannt.
  • cancellation und flightChange erscheinen nur als FREE und nur dort, wo die Airline dies angibt; ihr Fehlen sagt nichts aus.
  • Wir verkaufen kein kostenpflichtiges Gepäck, daher wird nie ein Gepäckpreis gesendet.
  • flights-multi bleibt unverändert und weiterhin verfügbar; für den Wechsel ändern Sie nur die Adresse.

Beispielanfrage

{
  "passengers": {
    "adults": 1,
    "children": 0,
    "infants": 0
  },
  "destinations": [
    {
      "from": "MGA",
      "to": "RNI",
      "date": "2026-10-27"
    }
  ]
}

Beispielantwort · 200 OK

{
  "result": {
    "MGA-RNI-2026-10-27": [
      {
        "from": {
          "id": 5217,
          "code": "MGA",
          "city": "Managua",
          "country": "Nicaragua"
        },
        "to": {
          "id": 5219,
          "code": "RNI",
          "city": "Corn Island",
          "country": "Nicaragua"
        },
        "legs": [
          {
            "from": {
              "id": 5217,
              "code": "MGA",
              "city": "Managua",
              "country": "Nicaragua"
            },
            "to": {
              "id": 5219,
              "code": "RNI",
              "city": "Corn Island",
              "country": "Nicaragua"
            },
            "number": "142",
            "dates": {
              "departure": "2026-10-27 07:00",
              "arrival": "2026-10-27 08:30"
            },
            "duration": 5400,
            "airline": {
              "id": 1320,
              "name": "LAC",
              "code": "6Y"
            }
          }
        ],
        "dates": {
          "departure": "2026-10-27 07:00",
          "arrival": "2026-10-27 08:30"
        },
        "duration": 5400,
        "airline": {
          "id": 1320,
          "name": "LAC",
          "code": "6Y"
        },
        "price": {
          "currency": "USD",
          "adult": "161.74",
          "child": "0.00",
          "infant": "0.00"
        },
        "priceUsd": {
          "adult": "161.74",
          "child": "0.00",
          "infant": "0.00"
        },
        "priceEur": {
          "adult": "140.60",
          "child": "0.00",
          "infant": "0.00"
        },
        "priceGbp": {
          "adult": "120.48",
          "child": "0.00",
          "infant": "0.00"
        },
        "requiredFields": {
          "phone": false,
          "nationality": true,
          "documentType": false,
          "documentNumber": true,
          "documentExpiry": false,
          "documentIssuer": false,
          "documentIssueDate": false,
          "birthDate": false,
          "birthDateForChildren": false,
          "birthDateForInfants": false,
          "placeOfBirth": false
        },
        "id": 1000000384088,
        "fareOptions": [
          {
            "id": 1000000384088,
            "fareFamilyName": "Light",
            "price": {
              "currency": "USD",
              "adult": "161.74",
              "child": "0.00",
              "infant": "0.00"
            },
            "priceUsd": {
              "adult": "161.74",
              "child": "0.00",
              "infant": "0.00"
            },
            "priceEur": {
              "adult": "140.60",
              "child": "0.00",
              "infant": "0.00"
            },
            "priceGbp": {
              "adult": "120.48",
              "child": "0.00",
              "infant": "0.00"
            },
            "cabinBag": {
              "pieces": 1,
              "status": "FREE",
              "weight": {
                "value": 9.5,
                "unit": "KG"
              }
            },
            "checkedBag": {
              "pieces": 0,
              "status": "NOT_INCLUDED"
            }
          },
          {
            "id": 1000000384091,
            "fareFamilyName": "Standard",
            "price": {
              "currency": "USD",
              "adult": "172.74",
              "child": "0.00",
              "infant": "0.00"
            },
            "priceUsd": {
              "adult": "172.74",
              "child": "0.00",
              "infant": "0.00"
            },
            "priceEur": {
              "adult": "150.16",
              "child": "0.00",
              "infant": "0.00"
            },
            "priceGbp": {
              "adult": "128.68",
              "child": "0.00",
              "infant": "0.00"
            },
            "checkedBag": {
              "pieces": 1,
              "status": "FREE",
              "weight": {
                "value": 14,
                "unit": "KG"
              }
            }
          },
          {
            "id": 1000000384092,
            "fareFamilyName": "Essential",
            "price": {
              "currency": "USD",
              "adult": "194.74",
              "child": "0.00",
              "infant": "0.00"
            },
            "priceUsd": {
              "adult": "194.74",
              "child": "0.00",
              "infant": "0.00"
            },
            "priceEur": {
              "adult": "169.29",
              "child": "0.00",
              "infant": "0.00"
            },
            "priceGbp": {
              "adult": "145.07",
              "child": "0.00",
              "infant": "0.00"
            },
            "cabinBag": {
              "pieces": 1,
              "status": "FREE",
              "weight": {
                "value": 9.5,
                "unit": "KG"
              }
            },
            "checkedBag": {
              "pieces": 1,
              "status": "FREE",
              "weight": {
                "value": 14,
                "unit": "KG"
              }
            }
          }
        ]
      }
    ]
  }
}
GET/api/v2/redirectÖffentlich

Der Deeplink. Leiten Sie Reisende hierher, damit sie direkt auf dem Flug landen, den sie angeklickt haben.

Leitet auf unsere Ergebnisseite weiter, mit bereits ausgefüllter Reise, und speichert die Zuordnung zu Ihnen. Dieser Endpunkt liefert nie einen Fehler: Auch eine ID, die wir nicht auflösen können, führt die Reisenden auf eine nutzbare Seite statt in eine Sackgasse.

Parameter

flightId erforderlich
Die ID des Hinflugs aus einer Suchantwort.
returnFlightId optional
Die ID des Rückflugs, bei Hin- und Rückflug.
ref erforderlich
Ihr Tracking-Code. Ohne ihn bringt Ihnen der Besuch nichts ein.
subAffiliate optional
Ihre eigene Bezeichnung für einen Unterkanal, die Sie in den Auswertungen zurückerhalten.
campaign optional
Ihre eigene Kampagnenbezeichnung.
partnerClickId optional
Ihre Klick-ID, damit Sie eine Buchung mit Ihren eigenen Logs abgleichen können.
currency optional
Währung, in der Preise angezeigt werden. Ändert nichts an der Währung, in der bezahlt wird.

Beispielantwort · 301 Moved Permanently

Location: https://air-viva.com/search?from=DAR&to=ZNZ&depart=2026-10-27&adults=1&children=0&infants=0#results
GET/api/v2/redirect-multiÖffentlich

Der Deeplink für einen Hin- und Rückflug, der beide Flüge als Liste entgegennimmt.

Liest flightIds als Liste: Der erste Eintrag ist der Hinflug, der zweite der Rückflug. Nimmt dieselben Zuordnungsparameter entgegen wie der einfache Redirect.

Parameter

flightIds[] erforderlich
Flug-IDs in dieser Reihenfolge: zuerst der Hinflug, dann der Rückflug.
ref erforderlich
Ihr Tracking-Code.

Beispielantwort · 301 Moved Permanently

Location: https://air-viva.com/search?from=DAR&to=ZNZ&depart=2026-10-27&adults=1&children=0&infants=0#results
GET/api/v2/results-multiÖffentlich

Ein Deeplink, der aus Flughäfen und Daten statt aus Flug-IDs gebildet wird.

Verwenden Sie diesen, wenn Sie keine Flug-ID zur Hand haben – etwa aus einer zwischengespeicherten oder abgelaufenen Suche. Liest destinations als indizierte Parameter: destinations[0][from], destinations[0][to], destinations[0][date].

Parameter

destinations[N][from] erforderlich
Abflughafen für Teilstrecke N.
destinations[N][to] erforderlich
Zielflughafen für Teilstrecke N.
destinations[N][date] erforderlich
Datum für Teilstrecke N.
ref erforderlich
Ihr Tracking-Code.
  • Ein Eintrag, den wir nicht auflösen können, wird übersprungen statt abgelehnt.

Beispielantwort · 301 Moved Permanently

Location: https://air-viva.com/search?from=DAR&to=ZNZ&depart=2026-10-27&adults=1&children=0&infants=0#results
GET/api/v2/partner/statistics.jsonToken erforderlich

Ihre Suchen, Klicks, Buchungen und Provisionen, nach Tag oder nach Strecke.

Die Zahlen der Seite „Statistik“ in Ihrem Partnerportal, für Ihre eigenen Systeme. Suchen sind die Suchanfragen, die Ihr Token gestellt hat; Klicks sind die Weiterleitungen, die Sie uns geschickt haben, und „Ohne Treffer“ ist ein Klick, den wir keinem Flug zuordnen konnten. Buchungen zählen an dem Tag, an dem sie bezahlt wurden, jeweils mit ihrer Provision – eine Provision wird nie zurückgenommen, was auch immer später mit der Buchung geschieht.

Parameter

from optional
Erster Tag, YYYY-MM-DD (UTC). Standardmäßig der Erste des Monats von to.
to optional
Letzter Tag, YYYY-MM-DD (UTC), einschließlich. Standardmäßig heute. Höchstens 366 Tage nach from.
groupBy optional
day (Standard) oder route. Bei route werden beide Richtungen zusammengezählt.
  • Immer nur Ihre eigenen Zahlen. Beantwortet aus unseren eigenen Daten: Es wird nie eine Airline abgefragt.
  • Die Provision ist eine Zahl in der Währung, die in der Antwort angegeben ist.

Beispielantwort · 200 OK

{
  "partner": {
    "code": "your-code",
    "id": 10001
  },
  "from": "2026-09-01",
  "to": "2026-09-26",
  "groupBy": "day",
  "currency": "USD",
  "totals": {
    "searches": 41280,
    "clicks": 312,
    "deadEnds": 4,
    "bookings": 9,
    "commission": 51.32
  },
  "days": [
    {
      "date": "2026-09-01",
      "searches": 1466,
      "clicks": 11,
      "deadEnds": 0,
      "bookings": 0,
      "commission": 0
    },
    {
      "date": "2026-09-02",
      "searches": 1655,
      "clicks": 13,
      "deadEnds": 0,
      "bookings": 0,
      "commission": 0
    },
    {
      "date": "2026-09-03",
      "searches": 1702,
      "clicks": 12,
      "deadEnds": 0,
      "bookings": 1,
      "commission": 3.05
    }
  ]
}
GET/api/v2/partner/bookings.jsonToken erforderlich

Ihre Buchungen eines Monats, mit Provision und Ihren eigenen Klick-IDs.

Die Zeilen der Seite „Buchungen“ in Ihrem Partnerportal. Eine Buchung gehört zu dem Monat, in dem sie bezahlt wurde, und behält ihre Provision; wird sie später storniert oder erstattet, bleibt sie mit ihrem Status aufgeführt.

Parameter

month optional
YYYY-MM. Standardmäßig der aktuelle Monat.
  • status ist confirmed, cancelled oder refunded; die Provision des Monats umfasst jede in diesem Monat bezahlte Buchung, unabhängig von ihrem Status.
  • clickId und subId sind die Werte, die Sie uns mit dem Klick geschickt haben.

Beispielantwort · 200 OK

{
  "partner": {
    "code": "your-code",
    "id": 10001
  },
  "month": "2026-09",
  "currency": "USD",
  "count": 9,
  "commission": 51.32,
  "bookings": [
    {
      "paidAt": "2026-09-25T10:14:03.000Z",
      "reference": "00GDSG",
      "route": "SAP-RTB-SAP",
      "travelFrom": "2026-12-20",
      "travelTo": "2027-01-03",
      "passengers": 1,
      "commission": 7.5,
      "currency": "USD",
      "status": "confirmed",
      "clickId": "c-B4C912",
      "subId": null
    }
  ]
}

Fehler

Jeder Fehler hat dieselbe Struktur: success ist false, code benennt die Fehlerklasse, und errors listet auf, was falsch war – mit einem path, der den betroffenen Parameter nennt, sofern einer fehlerhaft ist. Ein fehlender oder unbekannter Token liefert 401; eine Suche, die nicht gelesen werden kann, liefert 400. Ein leeres Ergebnis ist nie ein Fehler.

401 Unauthorized

{
  "success": false,
  "code": "ERROR_UNAUTHORIZED",
  "errors": [
    {
      "message": "Authentication required"
    }
  ]
}

400 Bad Request

{
  "success": false,
  "code": "ERROR_GENERAL",
  "errors": [
    {
      "message": "To airport is required",
      "path": "to"
    },
    {
      "message": "Departure date is required",
      "path": "departureDate"
    }
  ]
}

Zuordnung

Geben Sie Ihren Tracking-Code in jedem Link im Parameter ref an. Wir setzen ein First-Party-Cookie, wenn Reisende auf unserer Seite ankommen, und lesen es wieder aus, wenn sie buchen – so zählt eine Buchung auch dann für Sie, wenn sie erst Tage nach dem Klick erfolgt.

https://air-viva.com/api/v2/redirect?flightId=1000000000123&ref=YOUR_CODE
  • Das Zuordnungsfenster beträgt 42 Tage ab dem Klick.
  • Der letzte Klick zählt: Kommen Reisende nach Ihnen über einen anderen Partner, gehört die Buchung diesem Partner.
  • Eine Buchung wird einmal zugeordnet, und zwar in dem Moment, in dem sie angelegt wird.

Provision

Sie erhalten einen vereinbarten Prozentsatz des Gesamtbetrags der Buchung, bis zu einem vereinbarten Höchstbetrag pro Buchung. Die genauen Zahlen stehen in Ihrer eigenen Vereinbarung – die folgenden Regeln gelten für alle.

  • Der Höchstbetrag gilt pro Buchung, nicht pro Person: Eine Buchung bringt eine gedeckelte Provision ein, ganz gleich, wie viele Reisende darauf gebucht sind.
  • Die Provision wird auf den tatsächlich bezahlten Gesamtbetrag berechnet, nicht auf einen zuvor genannten Preis.
  • Beträge werden auf den Cent abgerundet.
  • Provision wird mit bezahlten Buchungen verdient und nie zurückgenommen, wenn eine Buchung später storniert oder erstattet wird. Eine bloße Preissicherung oder ein abgebrochener Bezahlvorgang bringt nichts ein.
  • Eine Buchung, die in einer anderen Währung als Ihrer Auszahlungswährung verkauft wurde, wird Ihnen gemeldet, statt automatisch ausgezahlt zu werden – wir rechnen bei der Abrechnung nicht um, sondern vereinbaren den Kurs mit Ihnen.

Berichte

Melden Sie sich im Partnerportal an, um Ihre Statistiken, Buchungen und monatlichen Abrechnungen zu sehen, oder rufen Sie dieselben Zahlen über die beiden Partner-Endpunkte oben ab. Am 2. jedes Monats senden wir Ihnen per E-Mail Ihre Abrechnung für den Vormonat, mit allem, was Sie für eine Rechnung brauchen.

Faire Nutzung

Wir beziehen unsere Flüge von Airlines im Rahmen von Verträgen, die messen, wie viele Suchanfragen wir pro Buchung an sie senden. Dieses Budget teilen wir mit Ihnen, und ein paar Gewohnheiten halten die Verbindung für uns beide gesund.

  • Suchen Sie nur Paare aus dem Strecken-Feed, und zwar an Tagen, an denen sie laut Verfügbarkeits-Feed geflogen werden. Ein Paar, das wir nicht fliegen, kann nur leer antworten, und eine Anfrage danach verbraucht das Budget umsonst.
  • Speichern Sie den Flughafen- und den Strecken-Feed im Cache. Sie ändern sich selten.
  • Fragen Sie dieselbe Reise nicht wiederholt ab. Der Preis wird bei der Buchung festgehalten, nicht bei der Suche.
  • Sagen Sie uns Bescheid, bevor Sie Ihr Abfragevolumen deutlich erhöhen, damit wir zuerst unsere eigenen Limits anheben können.

Fragen

Ist etwas unklar, funktioniert etwas nicht, oder brauchen Sie einen Endpunkt, der hier fehlt? Melden Sie sich bei uns – wir ändern lieber die API, als dass Sie sie umgehen müssen.

Entwickler-API | air viva