{
  "openapi": "3.0.1",
  "info": {
    "version": "1.8.0",
    "title": "RPIS Cargo API",
    "description": "\n\n\n### Die RPIS Cargo-API ist eine HTTPS-REST-API. Es handelt sich um die Schnittstelle, die RheinPorts verwendet, um Cargo-Status-Updates von Terminal und Barge Operators zu empfangen.\n\n![Overview diagram](overview.svg \"Overvew Diagram\")\n\n\n#### Durch diese Schritte können Sie Ihre Zollanmeldungen effizient und systematisch über die RPIS Cargo API verwalten\n\n1. Der RPIS-Benutzer erstellt eine Reise<br/>\n- Die richtige Voyage-ID muss eingegeben werden, da sie zwischen allen Logistikpartnern geteilt wird.\n- Der Slot im Terminal muss vom Terminalbetreiber bestätigt werden, damit die Registrierung beim Zoll erfolgreich ist.\n<br/>\n\n2. Halten RPIS mit der Cargo-Planung auf dem neuesten Stand:\n\n<table>\n    <thead>\n        <tr>\n            <th>Update Type</th>\n            <th>API Endpoint</th>\n        </tr>\n    </thead>\n    <tbody>\n        <tr>\n            <td rowspan=1>Senden von Lade- und Löschlisten</td>\n            <td rowspan=1>\n                <div class=\"td-divider\">\n                    <span class=\"api-post\">POST</span>\n                    <span class=\"api-endpoint\">cargo-move-list</span>\n                </div>\n                <div class=\"td-divider\">\n                    <span>NB: <a href=\"#move-list-updates\">Move List Updates</a></span>\n                </div>\n            </td>\n        </tr>\n        <tr>\n            <td>Aktualisierung eines bestimmten Artikels</td>\n            <td>\n                <div class=\"td-divider\">\n                    <span class=\"api-put\">PUT</span>\n                    <span class=\"api-endpoint\">cargo-item-by-container-no</span>\n                </div>\n                <div class=\"td-divider\">\n                    <span class=\"api-put\">PUT</span>\n                    <span class=\"api-endpoint\">cargo-item-by-bulk-id</span>\n                </div>\n                <div class=\"td-divider\">\n                    <span>NB: <a href=\"#cargo-item-referenzoptionen\">Cargo-Item-Referenzoptionen</a></span>\n                </div>\n            </td>\n        </tr>\n    </tbody>\n</table>\n\n3. Teilen Sie uns den Fortschritt Ihres Umschlags mit.\n\n<table>\n    <thead>\n        <tr>\n            <th>Update Type</th>\n            <th>API Endpoint</th>\n        </tr>\n    </thead>\n    <tbody>\n        <tr>\n            <td>Ein Umschlagereignis übermitteln</td>\n            <td>\n                <div class=\"td-divider\">\n                    <span class=\"api-post\">POST</span>\n                    <span class=\"api-endpoint\">handling-event-by-container-no</span>\n                </div>\n                <div class=\"td-divider\">\n                    <span class=\"api-post\">POST</span>\n                    <span class=\"api-endpoint\">handling-event-by-bulk-id</span>\n                </div>\n                <div class=\"td-divider\">\n                    <span>NB: <a href=\"#zoll-risiko-analyze\">Zoll Risiko Analyze</a></span>\n                </div>\n            </td>\n        </tr>\n    </tbody>\n</table>\n\n4. Status-Updates zu Ihrem Cargo im Schweizer Zoll können über die folgenden Endpunkte abgerufen werden:\n\n<table>\n    <thead>\n        <tr>\n            <th>Request Type</th>\n            <th>API Endpoint</th>\n        </tr>\n    </thead>\n    <tbody>\n        <tr>\n            <td>Für Informationen zur gesamten Cargoliste</td>\n            <td>\n                <div class=\"td-divider\">\n                    <span class=\"api-get\">GET</span>\n                    <span class=\"api-endpoint\">ch-customs-list</span>\n                </div>\n            </td>\n        </tr>\n        <tr>\n            <td>Für Informationen zu einzelnen Artikeln</td>\n            <td>\n                <div class=\"td-divider\">\n                    <span class=\"api-get\">GET</span>\n                    <span class=\"api-endpoint\">ch-customs-item-by-container-no</span>\n                </div>\n                <div class=\"td-divider\">\n                    <span class=\"api-get\">GET</span>\n                    <span class=\"api-endpoint\">ch-customs-item-by-bulk-id</span>\n                </div>\n                <div class=\"td-divider\">\n                    <span>NB: <a href=\"#cargo-item-referenzoptionen\">Cargo-Item-Referenzoptionen</a></span>\n                </div>\n            </td>\n        </tr>\n    </tbody>\n</table>\n\n#### Richtlinien für die Nutzung der API\n\nDamit die RPIS Cargo API Ihre Cargo erfolgreich bei der Zoll-API registrieren kann, müssen die folgenden Richtlinien beachtet werden:\n\n- Das Schiff muss in RPIS existieren und die AIS-Verbindung aktiviert haben.\n- Die Reise müss in RPIS existieren, mit dem korrekten Schiff und ungefähr der richtigen ETA.\n- Wenn Sie Cargo laden und löschen, gibt es eine Importreise und eine Exportreise. Diese haben separate Reise-IDs und müssen beide separat in RPIS registriert werden.\n- Es muss eine **bestätigte** Slot-Buchung am Terminal vorliegen, das den Transport registriert.\n- Die Voyage-ID für den Voyage in RPIS muss mit der Voyage-ID übereinstimmen, die Sie in den API-Calls (z.B. Cargo-Move-List) verwenden.\n- Der Container muss in einer Cargo-Move-Liste definiert sein, die an RPIS gesendet wurde.\n- Eine MRN-Nummer muss in den Zollobjekten der Container in in der Cargo-Move-Liste korrekt konfiguriert sein.\n- Die endgültige Cargo-Move-Liste muss vor der Vorbeifahrt des Schiffes am Dreiländereck eingegangen sein.\n- Die Transportdeklaration muss im Status \"TRANSPORT_DECLARATION_ACCEPTED\" sein, bevor Handling-Events gesendet werden.\n\n#### Ablauf\n\nDie Registrierungsphasen mit Passar laufen folgendermaßen ab:\n- Initialanmeldung findet statt, sobald:\n  * ETA ist weniger als 21 Tage in der Zukunft\n  * eine richtige Cargo-Move-List wurde gemeldet\n- Aktivierung / Risiko Analyze findet statt, sobald:\n  * Das Handling-Event wird an RPIS gesendet (Export)\n  * Das Schiff fährt am Dreiländereck vorbei (Import)\n- Freigabe / Kontrolle\n\n#### Updates\n\n<table>\n    <thead>\n        <tr>\n            <th>Update Type</th>\n            <th>Möglich bis</th>\n        </tr>\n    </thead>\n    <tbody>\n        <tr>\n            <td rowspan=1>Aktualisierungen über die Cargo-Move-Liste</td>\n            <td>Können bis zur Initialanmeldung gesendet werden. Updates an cargo-move-list ERSETZEN die gesamte Liste. Zuvor gesendete Informationen zu bestimmten Containern oder Cargo-Artikeln in dieser Reise werden überschrieben.</td>\n        </tr>\n        <tr>\n            <td rowspan=1>Aktualisierungen über die Einzelcontainer-Endpunkte</td>\n            <td>Bis zur Aktivierung möglich.</td>\n        </tr>\n    </tbody>\n</table>\n\n#### Cargo-Item-Referenzoptionen\n\nFür die Nutzung der RPIS Cargo API gibt es drei Optionen, um auf einzelne Cargo-Items zu verweisen:\n\n1. Bulk-ID: Wenn Sie Ihre eigene interne Referenz verwenden möchten, müssen Sie das Attribut bulkId beim Senden der cargo-move-list ausfüllen. Wenn Sie eine leere Bulk-ID senden, wird eine für Sie erstellt. Um die Bulk-ID herauszufinden, müssen Sie den Endpunkt GET ch-customs-list mit der Voyage-ID aufrufen.\n2. Containernummer: Container-Umschläge müssen mit der Containernummer referenziert werden.\n\n",
    "license": {
      "name": "RPIS API License",
      "url": "https://rpis.eu/privacy"
    },
    "termsOfService": "https://rpis.eu/privacy"
  },
  "servers": [
    {
      "url": "https://test.partner-api.rpis.link"
    }
  ],
  "security": [
    {
      "OAuth2ClientCredentials": []
    }
  ],
  "paths": {
    "/cargo-move-list/v1/{voyage-id}": {
      "post": {
        "security": [
          {
            "OAuth2ClientCredentials": []
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "additionalProperties": false,
                "properties": {
                  "vehicle": {
                    "$ref": "#/components/schemas/vehicleRequest"
                  },
                  "handling": {
                    "$ref": "#/components/schemas/handlingRequest"
                  },
                  "cargo": {
                    "$ref": "#/components/schemas/cargoRequest"
                  }
                },
                "required": [
                  "vehicle",
                  "handling",
                  "cargo"
                ]
              }
            }
          },
          "required": true
        },
        "parameters": [
          {
            "$ref": "#/components/parameters/voyage-id"
          }
        ],
        "responses": {
          "200": {
            "$ref": "#/components/responses/Success"
          },
          "400": {
            "$ref": "#/components/responses/BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "404": {
            "$ref": "#/components/responses/NotFound"
          },
          "500": {
            "$ref": "#/components/responses/ServerError"
          }
        },
        "summary": "Ladeliste oder Löschliste",
        "description": "<img src=\"cargo-move-list.svg\"/><br/>Der /cargo-move-list -Endpunkt wird verwendet, um Lade- und Löschlisten, einschließlich des aktuellen Status, zu übermitteln.",
        "operationId": "post-cargo-move-list"
      }
    },
    "/ch-customs-list/v1/{voyage-id}/terminal-location/{terminal-location}": {
      "get": {
        "parameters": [
          {
            "$ref": "#/components/parameters/voyage-id"
          },
          {
            "$ref": "#/components/parameters/terminal-location"
          }
        ],
        "responses": {
          "200": {
            "description": "Success",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/chCustomsListResponse"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "500": {
            "$ref": "#/components/responses/ServerError"
          }
        },
        "summary": "Customs status von Ladelisten und Löschlisten",
        "description": "<img src=\"ch-customs-list.svg\"/><br/>Der /ch-customs-list -Endpunkt wird verwendet, um Lade- und Löschlisten, einschließlich des aktuellen Status, zu übermitteln.",
        "operationId": "get-ch-customs-list"
      }
    },
    "/cargo-item-by-container-no/v1/{voyage-id}/container/{container-no}": {
      "put": {
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "properties": {
                  "vehicle": {
                    "$ref": "#/components/schemas/vehicleRequest"
                  },
                  "handling": {
                    "$ref": "#/components/schemas/handlingRequest"
                  },
                  "container": {
                    "$ref": "#/components/schemas/containerRequest"
                  }
                },
                "required": [
                  "vehicle",
                  "handling",
                  "container"
                ]
              }
            }
          },
          "required": true
        },
        "parameters": [
          {
            "$ref": "#/components/parameters/voyage-id"
          },
          {
            "$ref": "#/components/parameters/container-no"
          }
        ],
        "responses": {
          "200": {
            "$ref": "#/components/responses/Success"
          },
          "400": {
            "$ref": "#/components/responses/BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "500": {
            "$ref": "#/components/responses/ServerError"
          }
        },
        "description": "<img src=\"cargo-update-item.svg\"/><br/>Der /cargo-item-by-container-no -Endpunkt wird verwendet, um RPIS über den geplanten Container zu aktualisieren.",
        "summary": "Container melden oder aktualisieren",
        "operationId": "put-cargo-item-by-container-no"
      }
    },
    "/cargo-item-by-container-no/v1/{voyage-id}/terminal-location/{terminal-location}/container/{container-no}": {
      "delete": {
        "parameters": [
          {
            "$ref": "#/components/parameters/voyage-id"
          },
          {
            "$ref": "#/components/parameters/terminal-location"
          },
          {
            "$ref": "#/components/parameters/container-no"
          }
        ],
        "responses": {
          "200": {
            "$ref": "#/components/responses/Success"
          },
          "400": {
            "$ref": "#/components/responses/BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "500": {
            "$ref": "#/components/responses/ServerError"
          }
        },
        "description": "<img src=\"cargo-update-item.svg\"/><br/>Der /cargo-item-by-container-no -Endpunkt wird mit dem DELETE-Befehl verwendet, um einen Container aus der Liste zu entfernen.",
        "summary": "Container abmelden",
        "operationId": "delete-cargo-item-by-container-no"
      }
    },
    "/cargo-item-by-bulk-id/v1/{voyage-id}/bulk-id/{bulk-id}": {
      "put": {
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "properties": {
                  "vehicle": {
                    "$ref": "#/components/schemas/vehicleRequest"
                  },
                  "handling": {
                    "$ref": "#/components/schemas/handlingRequest"
                  },
                  "bulk": {
                    "$ref": "#/components/schemas/bulkRequest"
                  }
                },
                "required": [
                  "vehicle",
                  "handling",
                  "bulk"
                ]
              }
            }
          },
          "required": true
        },
        "parameters": [
          {
            "$ref": "#/components/parameters/voyage-id"
          },
          {
            "$ref": "#/components/parameters/bulk-id"
          }
        ],
        "responses": {
          "200": {
            "$ref": "#/components/responses/Success"
          },
          "400": {
            "$ref": "#/components/responses/BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "500": {
            "$ref": "#/components/responses/ServerError"
          }
        },
        "summary": "Massengut melden oder aktualisieren",
        "description": "Der PUT cargo-item-by-bulk-id -Endpunkt wird verwendet, um RPIS mit dem Status eines Cargos zu aktualisieren",
        "operationId": "put-cargo-item-by-bulk-id"
      }
    },
    "/cargo-item-by-bulk-id/v1/{voyage-id}/terminal-location/{terminal-location}/bulk-id/{bulk-id}": {
      "delete": {
        "parameters": [
          {
            "$ref": "#/components/parameters/voyage-id"
          },
          {
            "$ref": "#/components/parameters/terminal-location"
          },
          {
            "$ref": "#/components/parameters/bulk-id"
          }
        ],
        "responses": {
          "200": {
            "$ref": "#/components/responses/Success"
          },
          "400": {
            "$ref": "#/components/responses/BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "500": {
            "$ref": "#/components/responses/ServerError"
          }
        },
        "summary": "Massengut abmelden",
        "description": "Der DELETE bulkcargoitem -Endpunkt wird verwendet, um Massengut aus der Liste zu entfernen.",
        "operationId": "delete-cargo-item-by-bulk-id"
      }
    },
    "/handling-event-by-container-no/v1/{voyage-id}/terminal-location/{terminal-location}/container/{container-no}": {
      "post": {
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "additionalProperties": false,
                "properties": {
                  "handlingEvent": {
                    "$ref": "#/components/schemas/handlingEventRequest"
                  }
                },
                "required": [
                  "handlingEvent"
                ]
              }
            }
          },
          "required": true
        },
        "parameters": [
          {
            "$ref": "#/components/parameters/voyage-id"
          },
          {
            "$ref": "#/components/parameters/terminal-location"
          },
          {
            "$ref": "#/components/parameters/container-no"
          }
        ],
        "responses": {
          "200": {
            "$ref": "#/components/responses/Success"
          },
          "400": {
            "$ref": "#/components/responses/BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "500": {
            "$ref": "#/components/responses/ServerError"
          }
        },
        "summary": "Container-Umschlag melden",
        "description": "<img src=\"ch-customs-item-notify.svg\"/><br/>Der /handling-event-by-container-no -Endpunkt wird genutzt, um RPIS darüber zu informieren, dass ein Umschlagereignis ist eingetreten.",
        "operationId": "post-handling-event-by-container-no"
      }
    },
    "/handling-event-by-bulk-id/v1/{voyage-id}/terminal-location/{terminal-location}/bulk-id/{bulk-id}": {
      "post": {
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "additionalProperties": false,
                "properties": {
                  "handlingEvent": {
                    "$ref": "#/components/schemas/handlingEventRequest"
                  }
                },
                "required": [
                  "handlingEvent"
                ]
              }
            }
          },
          "required": true
        },
        "parameters": [
          {
            "$ref": "#/components/parameters/voyage-id"
          },
          {
            "$ref": "#/components/parameters/terminal-location"
          },
          {
            "$ref": "#/components/parameters/bulk-id"
          }
        ],
        "responses": {
          "200": {
            "$ref": "#/components/responses/Success"
          },
          "400": {
            "$ref": "#/components/responses/BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "500": {
            "$ref": "#/components/responses/ServerError"
          }
        },
        "summary": "Massengut-Umschlag melden",
        "description": "<img src=\"ch-customs-item-notify.svg\"/><br/>Der /handling-event-by-bulk-id -Endpunkt wird genutzt, um RPIS darüber zu informieren, dass ein Umschlagereignis ist eingetreten.",
        "operationId": "post-handling-event-by-bulk-id"
      }
    },
    "/transport-event-by-terminal-location/v1/{voyage-id}/terminal-location/{terminal-location}": {
      "post": {
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "properties": {
                  "transportEvent": {
                    "$ref": "#/components/schemas/transportEventRequest"
                  }
                }
              }
            }
          },
          "required": true
        },
        "parameters": [
          {
            "$ref": "#/components/parameters/voyage-id"
          },
          {
            "$ref": "#/components/parameters/terminal-location"
          }
        ],
        "responses": {
          "200": {
            "$ref": "#/components/responses/Success"
          },
          "400": {
            "$ref": "#/components/responses/BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "500": {
            "$ref": "#/components/responses/ServerError"
          }
        },
        "summary": "Transportereignis melden",
        "description": "<img src=\"ch-customs-item-notify.svg\"/><br/>Der /transport-event-by-terminal-location -Endpunkt wird genutzt, um RPIS darüber zu informieren, dass ein Transportereignis ist eingetreten.",
        "operationId": "post-transport-event-by-terminal-location"
      }
    },
    "/ch-customs-item-by-container-no/v1/{voyage-id}/terminal-location/{terminal-location}/container/{container-no}": {
      "get": {
        "parameters": [
          {
            "$ref": "#/components/parameters/voyage-id"
          },
          {
            "$ref": "#/components/parameters/terminal-location"
          },
          {
            "$ref": "#/components/parameters/container-no"
          }
        ],
        "responses": {
          "200": {
            "description": "Success!",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/chCustomsItemResponse"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "500": {
            "$ref": "#/components/responses/ServerError"
          }
        },
        "summary": "Zollstatus eines Containers",
        "description": "<img src=\"ch-customs-item.svg\"/><br/>Der /ch-customs-item-by-container-no -Endpunkt werden verwendet, um den Status eines Cargos zu abzufragen",
        "operationId": "get-ch-customs-item-by-container-no"
      }
    },
    "/ch-customs-item-by-bulk-id/v1/{voyage-id}/terminal-location/{terminal-location}/bulk-id/{bulk-id}": {
      "get": {
        "parameters": [
          {
            "$ref": "#/components/parameters/voyage-id"
          },
          {
            "$ref": "#/components/parameters/terminal-location"
          },
          {
            "$ref": "#/components/parameters/bulk-id"
          }
        ],
        "responses": {
          "200": {
            "description": "Success!",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/chCustomsItemResponse"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "500": {
            "$ref": "#/components/responses/ServerError"
          }
        },
        "summary": "Zollstatus einer Bulk-Einheit",
        "description": "Der /ch-customs-item-by-bulk-id -Endpunkte werden verwendet, um den Status eines Cargos zu abzufragen",
        "operationId": "get-ch-customs-item-by-bulk-id"
      }
    },
    "/ch-customs-event-history/v1/{voyage-id}": {
      "get": {
        "parameters": [
          {
            "$ref": "#/components/parameters/voyage-id"
          },
          {
            "name": "containerNumber",
            "in": "query",
            "schema": {
              "$ref": "#/components/schemas/containerNumber"
            },
            "description": "Optionale Einschränkung anhand der Container-Nummer"
          },
          {
            "name": "terminalLocation",
            "in": "query",
            "schema": {
              "$ref": "#/components/schemas/terminalLocation"
            },
            "description": "Optionale Einschränkung anhand des Terminals"
          }
        ],
        "responses": {
          "200": {
            "description": "Die Ereignishistorie",
            "content": {
              "application/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "title": "TransportDeclarationEvent",
                    "description": "Eingetretenes Ereignis bei der Transportanmeldung für den Zoll",
                    "discriminator": {
                      "propertyName": "type"
                    },
                    "oneOf": [
                      {
                        "$ref": "#/components/schemas/TransportDeclarationCreated"
                      },
                      {
                        "$ref": "#/components/schemas/TransportDeclarationUpdated"
                      },
                      {
                        "$ref": "#/components/schemas/TransportDeclarationUpdatedFromSlotBooking"
                      },
                      {
                        "$ref": "#/components/schemas/TransportDeclarationAmendmentInitiatedFromSlotBooking"
                      },
                      {
                        "$ref": "#/components/schemas/TransportDeclarationDiscarded"
                      },
                      {
                        "$ref": "#/components/schemas/TransportDeclarationSent"
                      },
                      {
                        "$ref": "#/components/schemas/TransportDeclarationAmendmentInitiated"
                      },
                      {
                        "$ref": "#/components/schemas/TransportDeclarationAccepted"
                      },
                      {
                        "$ref": "#/components/schemas/TransportDeclarationBorderArrivalReported"
                      },
                      {
                        "$ref": "#/components/schemas/TransportDeclarationBorderArrivalAccepted"
                      },
                      {
                        "$ref": "#/components/schemas/TransportDeclarationSelectedForInspection"
                      },
                      {
                        "$ref": "#/components/schemas/TransportDeclarationReleased"
                      },
                      {
                        "$ref": "#/components/schemas/TransportDeclarationAmendmentAccepted"
                      },
                      {
                        "$ref": "#/components/schemas/TransportDeclarationAmendmentRejected"
                      },
                      {
                        "$ref": "#/components/schemas/TransportDeclarationWithdrawalInitiated"
                      },
                      {
                        "$ref": "#/components/schemas/TransportDeclarationWithdrawalAccepted"
                      },
                      {
                        "$ref": "#/components/schemas/TransportDeclarationSlotBookingCancelled"
                      },
                      {
                        "$ref": "#/components/schemas/TransportDeclarationError"
                      }
                    ]
                  }
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "500": {
            "$ref": "#/components/responses/ServerError"
          }
        },
        "summary": "Historie der Zollanmeldungen zu einer Voyage",
        "description": "Der /ch-customs-event-history -Endpunkt wird verwendet, um die Historie aller Zollereignisse für eine Voyage abzufragen",
        "operationId": "get-ch-customs-event-history-by-voyage"
      }
    },
    "/slot-bookings-by-terminal/v1/{terminal-location}/search": {
      "get": {
        "security": [
          {
            "OAuth2ClientCredentials": []
          }
        ],
        "parameters": [
          {
            "$ref": "#/components/parameters/terminal-location"
          },
          {
            "$ref": "#/components/parameters/eni"
          },
          {
            "$ref": "#/components/parameters/eta-from"
          },
          {
            "$ref": "#/components/parameters/eta-to"
          }
        ],
        "responses": {
          "200": {
            "description": "Success",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/stopsSearchResponse"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "500": {
            "$ref": "#/components/responses/ServerError"
          }
        },
        "summary": "Reisestopps suchen",
        "description": "Der /slot-bookings-by-terminal/v1/{terminal-location}/search -Endpunkt wird verwendet, um Reisestopps an einem Terminal zu suchen.\n\n**Autorisierung**: Das Terminal muss zum Unternehmen gehören (CompanyId wird aus dem Token ermittelt).",
        "operationId": "get-slot-bookings-by-terminal-id-search"
      }
    },
    "/Changelog": {
      "get": {
        "security": [
          {
            "OAuth2ClientCredentials": []
          }
        ],
        "summary": "Revision History",
        "description": "### Revision History\n- **1.0.0** (2025-01-10): Initial release\n- **1.0.1** (2025-01-28): Neue /transport-event-by-terminal-location endpoint\n- **1.0.2** (2025-02-12) Minor documentation improvements\n- **1.0.3** (2025-02-26) Review and update of mandatory fields in cargo-move-list. Improved error format with validation errors\n- **1.0.4** (2025-02-27) Added WAITING_FOR_CONSOLE enum to customs status. Stricter definition of voyage-id parameter\n- **1.0.5** (2025-03-11) Added 404 to cargo-move-list. Refined quantity rules to allow multiple weights and forbid un number 0000\n- **1.0.6** (2025-03-17) Changed WAITING_FOR_CONSOLE to WAIT_FOR_CONTROL\n- **1.0.7** (2025-03-25)\n  * Set maximum length of voyageId to 50\n  * Barge name (if present) cannot be pure whitespace or begin with a space\n  * Added invoiceRecipient to otherTransportDetails\n  * Added 30_FT to container type enums\n- **1.0.8** (2025-03-28) Weights can be accurate to 3dp\n- **1.0.9** (2025-04-02) Add terminal location parameter to ch-customs-list\n- **1.0.10** (2025-04-04)\n  * Correct MRN Number format\n  * MMSI or ENI must be present, name alone not sufficient\n- **1.0.11** (2025-04-08)\n  * New customs status enums / descriptions\n  * ISO date-time-string pattern\n  * Type definitions for types missing definitions\n- **1.0.12** (2025-04-30)\n  * Correct placement of array limits definitions\n- **1.0.13** (2025-05-08)\n  * Use date-time format instead of regex pattern\n  * Add enum also at property level for handling action\n  * Consolidate chCustomsList and chCustomsItem definition schemas\n  * Use additionalProperties: false to restrict schema to expected values\n- **1.0.14** (2025-05-15)\n  * Add type: object and disable additionalProperties for handlingEventRequests\n  * Make handlingEvent a required element for handlingEventRequest\n- **1.0.15** (2025-07-03)\n  * Add delete cargo item commands\n  * Add hazardNumber to dangerous goods\n  * Correct the regex for dangerousGoods.classification\n  * Now optional: handling.eta|etd in cargo-move-list\n  * Add FT_23, FT_25 container types\n  * Remove lowercase letters from terminal location regex\n- **1.2.0** (2025-11-18)\n  * Add new AMEND_INITIATED chCustomsStatus\n- **1.3.0** (2025-11-05)\n  * Add new required parameter terminalLocation to /ch-customs-item-by-container-no and /ch-customs-item-by-bulk-id endpoint\n  * Add new parameter terminalLocation to /handling-event-by-container-no and /handling-event-by-bulk-id endpoint\n  * Add new optional parameters container, terminalLocation to /ch-customs-event-history endpoint\n- **1.4.0** (2025-11-28)\n  * Added new event history event slot booking updates\n  * JourneyReferenceNumber is now only contained in the TransportDeclarationAccepted of the event-history\n- **1.5.0** (2026-01-15)\n  * Smallest length of contents array is 0 (empty)\n- **1.6.0** (2026-03-09)\n  * Added slot-booking query endpoint\n- **1.7.0** (2026-06-01)\n  * Skipped\n- **1.8.0** (2026-06-01)\n  * Dangerous Goods arrays instead of single objects\n  * No longer optional: borderClearanceRequired",
        "operationId": "revision-history",
        "responses": {
          "200": {
            "description": ""
          },
          "400": {
            "description": ""
          }
        }
      }
    }
  },
  "components": {
    "responses": {
      "Success": {
        "description": "Success!",
        "content": {
          "application/json": {
            "schema": {
              "$ref": "#/components/schemas/Empty"
            }
          }
        }
      },
      "BadRequest": {
        "description": "Bad Request - This could be a validation error, bad parameters, or missing parameters",
        "content": {
          "application/json": {
            "schema": {
              "$ref": "#/components/schemas/Error"
            }
          }
        }
      },
      "Unauthorized": {
        "description": "Unauthorized",
        "content": {
          "application/json": {
            "schema": {
              "$ref": "#/components/schemas/Error"
            }
          }
        }
      },
      "NotFound": {
        "description": "Not Found",
        "content": {
          "application/json": {
            "schema": {
              "$ref": "#/components/schemas/Error"
            }
          }
        }
      },
      "ServerError": {
        "description": "Server Error",
        "content": {
          "application/json": {
            "schema": {
              "$ref": "#/components/schemas/Error"
            }
          }
        }
      },
      "Forbidden": {
        "description": "Forbidden - Das Terminal gehört nicht zum Unternehmen",
        "content": {
          "application/json": {
            "schema": {
              "$ref": "#/components/schemas/Error"
            }
          }
        }
      }
    },
    "schemas": {
      "Empty": {
        "type": "object",
        "additionalProperties": false,
        "properties": {}
      },
      "Error": {
        "type": "object",
        "additionalProperties": false,
        "properties": {
          "message": {
            "type": "string",
            "description": "Error message describing the type of error"
          },
          "errors": {
            "type": "object"
          },
          "path": {
            "type": "string",
            "description": "Resource path where the error occurred"
          },
          "requestId": {
            "type": "string",
            "description": "Unique request identifier for troubleshooting"
          }
        }
      },
      "vehicleRequest": {
        "title": "vehicle",
        "type": "object",
        "additionalProperties": false,
        "properties": {
          "barge": {
            "title": "barge",
            "type": "array",
            "minItems": 1,
            "maxItems": 9,
            "items": {
              "type": "object",
              "additionalProperties": false,
              "properties": {
                "name": {
                  "title": "name",
                  "type": "string",
                  "pattern": "^\\S+.*$",
                  "minLength": 1,
                  "description": "Der Name des Barges"
                },
                "mmsi": {
                  "title": "mmsi",
                  "type": "string",
                  "pattern": "^\\d{9}$",
                  "description": "Die MMSI-Nummer des Barges"
                },
                "eni": {
                  "title": "eni",
                  "type": "string",
                  "pattern": "^\\d{8}$",
                  "description": "Die ENI-Nummer des Barges"
                }
              },
              "description": "Ein Barge",
              "anyOf": [
                {
                  "title": "mmsi",
                  "required": [
                    "mmsi"
                  ]
                },
                {
                  "title": "eni",
                  "required": [
                    "eni"
                  ]
                }
              ]
            },
            "description": "Details zur eine Barge"
          }
        },
        "required": [
          "barge"
        ],
        "description": "Dieses Objekt muss eine Barge definieren"
      },
      "handlingRequest": {
        "title": "handling",
        "type": "object",
        "additionalProperties": false,
        "properties": {
          "action": {
            "title": "action",
            "type": "string",
            "description": "Ob die Liste eine Lade- oder Löschliste ist",
            "enum": [
              "LOAD",
              "UNLOAD"
            ]
          },
          "location": {
            "$ref": "#/components/schemas/terminalLocation"
          },
          "eta": {
            "allOf": [
              {
                "$ref": "#/components/schemas/dateTimeString"
              },
              {
                "description": "Die ETA am Handling-Standort<br/><i>ISO 8601 Datum-Zeit-String mit Zeitzonenangabe"
              }
            ]
          },
          "etd": {
            "allOf": [
              {
                "$ref": "#/components/schemas/dateTimeString"
              },
              {
                "description": "Die ETD vom Handling-Standort<br/><i>ISO 8601 Datum-Zeit-String mit Zeitzonenangabe"
              }
            ]
          }
        },
        "required": [
          "action",
          "location"
        ],
        "description": "Das handling-Objekt enthält Details zu Zeit, Ort und Richtung des Handlings"
      },
      "cargoRequest": {
        "title": "cargo",
        "type": "object",
        "additionalProperties": false,
        "properties": {
          "bulk": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/bulkRequest"
            }
          },
          "containers": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/containerRequest"
            }
          }
        },
        "description": "Alle Details zum Cargo und seiner Verpackung"
      },
      "containerRequest": {
        "title": "container",
        "type": "object",
        "additionalProperties": false,
        "properties": {
          "grossWeight": {
            "title": "grossWeight",
            "type": "number",
            "multipleOf": 0.001,
            "description": "Das Gewicht des Containers und aller Inhalte"
          },
          "netWeight": {
            "title": "netWeight",
            "type": "number",
            "multipleOf": 0.001,
            "description": "Das Gewicht aller Containerinhalte"
          },
          "tareWeight": {
            "title": "tareWeight",
            "type": "number",
            "multipleOf": 0.001,
            "description": "Das Gewicht des leeren Containers"
          },
          "loadingUnit": {
            "title": "loadingUnit",
            "type": "object",
            "additionalProperties": false,
            "properties": {
              "owner": {
                "title": "owner",
                "type": "string",
                "description": "Der Eigentümer des Containers"
              },
              "containerNumber": {
                "$ref": "#/components/schemas/containerNumber"
              },
              "containerType": {
                "$ref": "#/components/schemas/containerType"
              },
              "loadingState": {
                "title": "loadingState",
                "type": "string",
                "description": "Der Ladezustand des Containers",
                "enum": [
                  "FULL",
                  "EMPTY"
                ]
              }
            },
            "required": [
              "containerNumber",
              "loadingState"
            ],
            "description": "Details, die speziell den physischen Container betreffen"
          },
          "contents": {
            "title": "contents",
            "type": "array",
            "minItems": 0,
            "maxItems": 999,
            "items": {
              "type": "object",
              "additionalProperties": false,
              "properties": {
                "description": {
                  "title": "description",
                  "type": "string",
                  "description": "Freitextbeschreibung des Cargo-Inhalts"
                },
                "grossWeight": {
                  "title": "grossWeight",
                  "type": "number",
                  "multipleOf": 0.001,
                  "description": "Das Gesamtgewicht dieses Artikels einschließlich Verpackung"
                },
                "netWeight": {
                  "title": "netWeight",
                  "type": "number",
                  "multipleOf": 0.001,
                  "description": "Das Gewicht der Waren ohne Verpackung"
                },
                "tareWeight": {
                  "title": "tareWeight",
                  "type": "number",
                  "multipleOf": 0.001,
                  "description": "Das Gewicht der Verpackung"
                },
                "customs": {
                  "$ref": "#/components/schemas/customs"
                },
                "dangerousGoods": {
                  "title": "dangerousGoods",
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/dangerousGoods"
                  }
                }
              },
              "description": ""
            },
            "description": "Detaillierte Informationen über den Inhalt des Containers"
          },
          "sealNumbers": {
            "title": "sealNumbers",
            "type": "array",
            "minItems": 0,
            "maxItems": 999,
            "items": {
              "maxLength": 64,
              "type": "string"
            }
          },
          "otherTransportDetails": {
            "$ref": "#/components/schemas/otherTransportDetails"
          }
        },
        "required": [
          "loadingUnit"
        ],
        "description": "Wenn Containers transportiert werden, sollten die Details in diesem Objekt eingetragen werden"
      },
      "bulkRequest": {
        "title": "bulk",
        "type": "object",
        "additionalProperties": false,
        "properties": {
          "description": {
            "title": "description",
            "type": "string",
            "description": "Freitextbeschreibung des Cargo-Inhalts"
          },
          "type": {
            "title": "type",
            "type": "string",
            "description": "Ob der Massengut-Cargo Schuttgut, Stückgut oder Flüssiggut ist",
            "enum": [
              "DRY",
              "BREAK",
              "LIQUID"
            ]
          },
          "bulkId": {
            "title": "bulkId",
            "type": "string",
            "description": "Die Massengut-Id muss Ihren Cargo-artikel eindeutig innerhalb der Cargo-Liste identifizieren"
          },
          "quantity": {
            "title": "quantity",
            "type": "object",
            "additionalProperties": false,
            "anyOf": [
              {
                "title": "count",
                "required": [
                  "count"
                ]
              },
              {
                "title": "grossWeight",
                "required": [
                  "grossWeight"
                ]
              },
              {
                "title": "netWeight",
                "required": [
                  "netWeight"
                ]
              },
              {
                "title": "volume",
                "required": [
                  "volume"
                ]
              },
              {
                "title": "tareWeight",
                "required": [
                  "tareWeight"
                ]
              }
            ],
            "properties": {
              "count": {
                "title": "count",
                "type": "integer",
                "minimum": 1,
                "description": "Wenn Stückgut transportiert wird, sollte die Anzahl der Artikel hier eingetragen werden"
              },
              "grossWeight": {
                "title": "grossWeight",
                "type": "number",
                "multipleOf": 0.001,
                "description": "Für Stückgut ist das grossWeight (Bruttogewicht) das Gewicht des Artikels zuzüglich Paletten und Verpackung<br/><b>Einheiten / Genauigkeit</b>: Kilogramm bis 3 Dezimalstellen (geringstes mögliches Gewicht 1 Gramm)<br/><b>Dezimalseparator</b>: Das Komma ist der Dezimalseparator"
              },
              "netWeight": {
                "title": "netWeight",
                "type": "number",
                "multipleOf": 0.001,
                "description": "Für Schuttgut, Flüssiggut oder Stückgut ist das netWeight(Nettogewicht) das Gewicht der Waren ohne Verpackung"
              },
              "volume": {
                "title": "volume",
                "type": "integer",
                "minimum": 1,
                "description": "Für Flüssiggut ist das Volumen das Volumen der Flüssigkeit in Litern"
              },
              "tareWeight": {
                "title": "tareWeight",
                "type": "number",
                "multipleOf": 0.001,
                "description": "Für Schuttgut, Flüssiggut oder Stückgut ist das tareWeight (Tara-Gewicht) das Gewicht der Verpackung"
              }
            }
          },
          "customs": {
            "$ref": "#/components/schemas/customs"
          },
          "dangerousGoods": {
            "title": "dangerousGoods",
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/dangerousGoods"
            }
          },
          "otherTransportDetails": {
            "$ref": "#/components/schemas/otherTransportDetails"
          }
        },
        "required": [
          "description",
          "type",
          "bulkId",
          "quantity"
        ],
        "description": "Wenn Massengut transportiert wird, sollten die Details in diesem Objekt eingetragen werden"
      },
      "customs": {
        "title": "customs",
        "type": "object",
        "additionalProperties": false,
        "properties": {
          "goodsDeclarationIdReference": {
            "$ref": "#/components/schemas/goodsDeclarationIdReference"
          },
          "borderClearanceRequired": {
            "title": "borderClearanceRequired",
            "type": "boolean",
            "description": "<p/>ZV / ZE - borderClearanceRequired wird auf 'false' gesetzt<p/>Alle anderen Umstände werden borderClearanceRequired 'true' setzen"
          }
        },
        "required": [
          "goodsDeclarationIdReference",
          "borderClearanceRequired"
        ],
        "description": "Das customs-Objekt enthält alle Details zur Zollabfertigung der Waren<p/>Zwingend erforderlich für die Zollanmeldung!"
      },
      "dangerousGoods": {
        "title": "dangerousGoods",
        "type": "object",
        "additionalProperties": false,
        "properties": {
          "unNumber": {
            "title": "unNumber",
            "type": "string",
            "pattern": "^(?!0000)\\d{4}$",
            "description": "Die UN-Nummer ist eine vierstellige Kennziffer zur Identifizierung gefährlicher Stoffe und Güter"
          },
          "hazardNumber": {
            "title": "hazard Identification Number",
            "type": "string",
            "pattern": "^X?[0-9]{1,3}$",
            "description": "Gefahrnummer (Kemler-Zahl) zur Kennzeichnung der Gefährdungsart bei Gefahrguttransporten"
          },
          "classification": {
            "title": "classification",
            "type": "string",
            "pattern": "^[1-9](\\.[1-6])?$",
            "description": "Die Gefahrenklasse kennzeichnet die Art der Gefahr, die von einem Stoff oder Gut ausgeht, z B „Klasse 3: Entzündlich"
          },
          "packagingGroup": {
            "title": "packagingGroup",
            "type": "string",
            "description": "Die Verpackungsgruppe gibt an, wie gefährlich ein Stoff ist, und teilt ihn in die Gruppen I (hohe Gefahr), II (mittlere Gefahr) oder III (geringe Gefahr) ein"
          }
        },
        "description": ""
      },
      "otherTransportDetails": {
        "title": "otherTransportDetails",
        "type": "object",
        "additionalProperties": false,
        "properties": {
          "previousModeOfTransport": {
            "title": "previousModeOfTransport",
            "type": "string",
            "description": "Die Transportart, die vor dem Umschlag verwendet wurde",
            "enum": [
              "TRUCK",
              "RAIL",
              "SHIP",
              "WAREHOUSE"
            ]
          },
          "nextModeOfTransport": {
            "title": "nextModeOfTransport",
            "type": "string",
            "description": "Die Transportart, die nach dem Umschlag verwendet wird",
            "enum": [
              "TRUCK",
              "RAIL",
              "SHIP",
              "WAREHOUSE"
            ]
          },
          "previousHandlingLocation": {
            "title": "previousHandlingLocation",
            "type": "string",
            "description": "Der Standort des vorherigen Umschlags"
          },
          "nextHandlingLocation": {
            "title": "nextHandlingLocation",
            "type": "string",
            "description": "Der Standort des nächsten Umschlags"
          },
          "origin": {
            "title": "origin",
            "type": "string",
            "description": "Der Ursprung der Waren"
          },
          "destination": {
            "title": "destination",
            "type": "string",
            "description": "Das Endziel der Waren"
          },
          "specialGroups": {
            "title": "specialGroups",
            "type": "string",
            "enum": [
              "NEW_GOODS",
              "RECYCLING"
            ],
            "description": "Ob ein Warenposten zu einer speziellen Gruppe gehört (Basel)"
          },
          "invoiceRecipient": {
            "title": "invoiceRecipient",
            "type": "string",
            "description": "Der vorgesehene Empfänger der Rechnung für die Hafenabrechnung"
          },
          "oceanVessel": {
            "title": "oceanVessel",
            "type": "string",
            "description": "Der Name des Schiffs für Waren, die per Hochseetransport exportiert werden sollen"
          },
          "cargoOpening": {
            "allOf": [
              {
                "$ref": "#/components/schemas/dateTimeString"
              },
              {
                "description": "Die früheste Ladezeit des Cargos für Waren, die per Hochseetransport exportiert werden soll<br/><i>ISO 8601 Datum-Zeit-String mit Zeitzonenangabe"
              }
            ]
          },
          "cargoClosing": {
            "allOf": [
              {
                "$ref": "#/components/schemas/dateTimeString"
              },
              {
                "description": "Die späteste Ladezeit des Cargos für Waren, die per Hochseetransport exportiert werden soll<br/><i>ISO 8601 Datum-Zeit-String mit Zeitzonenangabe"
              }
            ]
          }
        },
        "description": ""
      },
      "handlingEventRequest": {
        "title": "handlingEvent",
        "type": "string",
        "enum": [
          "PRELIMINARY_LOADING",
          "CONFIRMED_LOADING",
          "PRELIMINARY_DISCHARGE",
          "CONFIRMED_DISCHARGE",
          "CARGO_ON_SITE"
        ],
        "description": "Das Handling-Event informiert RPIS über den aktuellen Bearbeitungszustand des Cargo-Objekts"
      },
      "transportEventRequest": {
        "title": "transportEvent",
        "type": "string",
        "enum": [
          "VEHICLE_ARRIVAL",
          "HANDLING_START",
          "HANDLING_PAUSE",
          "HANDLING_COMPLETE",
          "VEHICLE_DEPARTURE"
        ],
        "description": "Das Transport-Event informiert RPIS über den aktuellen Bearbeitungszustand des Transportstopps einer Reise"
      },
      "chCustomsItem": {
        "type": "object",
        "description": "",
        "additionalProperties": false,
        "properties": {
          "chCustomsStatus": {
            "$ref": "#/components/schemas/chCustomsStatus"
          },
          "journeyReferenceNumber": {
            "$ref": "#/components/schemas/journeyReferenceNumber"
          },
          "goods": {
            "type": "array",
            "description": "Die Liste der Waren",
            "items": {
              "additionalProperties": false,
              "type": "object",
              "properties": {
                "description": {
                  "description": "Beschreibung der Waren",
                  "type": "string"
                },
                "goodsDeclarationIdReference": {
                  "$ref": "#/components/schemas/goodsDeclarationIdReference"
                }
              }
            }
          }
        }
      },
      "chCustomsListResponse": {
        "type": "array",
        "description": "",
        "items": {
          "$ref": "#/components/schemas/chCustomsItem"
        }
      },
      "chCustomsItemResponse": {
        "$ref": "#/components/schemas/chCustomsItem"
      },
      "goodsDeclarationIdReference": {
        "title": "goodsDeclarationIdReference",
        "type": "string",
        "pattern": "^[0-9]{2}[A-Z]{2}[A-Za-z0-9]{14}$",
        "description": "Zwingend erforderlich für die Zollanmeldung! Die goodsDeclarationIdReference enthält die MRN-Nummer"
      },
      "journeyReferenceNumber": {
        "pattern": "^[A-Za-z0-9]{9}$",
        "description": "Referenznummer der Fahrt für die Schweizer Zollbehörden – 9 alphanumerische Zeichen.",
        "type": "string"
      },
      "chCustomsStatus": {
        "type": "string",
        "enum": [
          "NEW",
          "DISCARDED",
          "TRANSPORT_DECLARATION_SENT",
          "TRANSPORT_DECLARATION_ACCEPTED",
          "TRANSPORT_DECLARATION_REJECTED",
          "AMEND_INITIATED",
          "AMENDMENT_REJECTED",
          "BORDER_ARRIVAL",
          "AWAITING_INSPECTION_DECISION",
          "SELECTED_FOR_INSPECTION",
          "RELEASED",
          "WITHDRAWAL_INITIATED",
          "WITHDRAWN"
        ],
        "description": "Der Zollstatus des Cargo-Items"
      },
      "dateTimeString": {
        "type": "string",
        "format": "date-time"
      },
      "terminalLocation": {
        "description": "UNLOCODE and Terminal Location Code",
        "type": "string",
        "pattern": "^[A-Z0-9]{5}\\+[A-Z0-9]{5}$"
      },
      "containerNumber": {
        "title": "containerNumber",
        "description": "Die Nummer des Containers nach ISO 6346 einschließlich der Prüfziffer (BIC code)",
        "type": "string",
        "pattern": "^[A-Z]{3}[UJZ][0-9]{7}$"
      },
      "containerType": {
        "title": "containerType",
        "type": "string",
        "description": "Der Containertyp",
        "enum": [
          "FT_10",
          "FT_20",
          "FT_23",
          "FT_25",
          "FT_30",
          "FT_40",
          "FT_45"
        ]
      },
      "countryCode": {
        "type": "string",
        "pattern": "^[A-Z]{2}$"
      },
      "voyageId": {
        "description": "Kennzeichnung der Reise. Kann alphanumerische Zeichen, bestimmte Symbole (-, _, ., $, !, (), *) oder URL-kodierte Zeichen enthalten.",
        "type": "string",
        "maxLength": 50,
        "pattern": "^([A-Za-z0-9_\\-\\.\\$\\!\\(\\)\\*]|(%[0-9A-Fa-f]{2}))+$"
      },
      "TransportDeclarationVessel": {
        "required": [
          "vesselFlag"
        ],
        "properties": {
          "vesselFlag": {
            "$ref": "#/components/schemas/countryCode"
          },
          "eni": {
            "type": "string",
            "pattern": "^\\d{8}$"
          },
          "mmsi": {
            "type": "string",
            "pattern": "^\\d{9}$"
          }
        }
      },
      "TransportDeclarationGood": {
        "required": [
          "goodsDeclarationId",
          "borderClearance"
        ],
        "properties": {
          "goodsDeclarationId": {
            "$ref": "#/components/schemas/goodsDeclarationIdReference"
          },
          "borderClearance": {
            "type": "boolean"
          },
          "description": {
            "type": "string"
          }
        }
      },
      "CommonTransportDeclarationEventProperties": {
        "required": [
          "type",
          "timestamp",
          "voyageId"
        ],
        "properties": {
          "type": {
            "type": "string"
          },
          "timestamp": {
            "$ref": "#/components/schemas/dateTimeString"
          },
          "voyageId": {
            "$ref": "#/components/schemas/voyageId"
          },
          "containerNumber": {
            "$ref": "#/components/schemas/containerNumber"
          }
        }
      },
      "CommonTransportDeclarationSlotBookingEventProperties": {
        "allOf": [
          {
            "$ref": "#/components/schemas/CommonTransportDeclarationEventProperties"
          },
          {
            "required": [
              "vesselName",
              "vesselFlag",
              "eta"
            ],
            "properties": {
              "vesselName": {
                "type": "string"
              },
              "vesselFlag": {
                "$ref": "#/components/schemas/countryCode"
              },
              "eni": {
                "type": "string",
                "pattern": "^\\d{8}$"
              },
              "eta": {
                "$ref": "#/components/schemas/dateTimeString"
              }
            }
          }
        ]
      },
      "TransportDeclarationCreated": {
        "description": "Die Transportanmeldung wurde initial angelegt, aber noch nicht an den Zoll übermittelt",
        "allOf": [
          {
            "$ref": "#/components/schemas/CommonTransportDeclarationEventProperties"
          },
          {
            "required": [
              "direction",
              "terminal",
              "loadingUnitType",
              "goods"
            ],
            "properties": {
              "direction": {
                "type": "string",
                "enum": [
                  "IMPORT",
                  "EXPORT"
                ]
              },
              "vessel": {
                "$ref": "#/components/schemas/TransportDeclarationVessel"
              },
              "terminal": {
                "$ref": "#/components/schemas/terminalLocation"
              },
              "eta": {
                "$ref": "#/components/schemas/dateTimeString"
              },
              "loadingUnitType": {
                "type": "string",
                "enum": [
                  "CONTAINER",
                  "BULK"
                ]
              },
              "container": {
                "required": [
                  "type",
                  "number"
                ],
                "properties": {
                  "type": {
                    "$ref": "#/components/schemas/containerType"
                  },
                  "number": {
                    "$ref": "#/components/schemas/containerNumber"
                  }
                }
              },
              "goods": {
                "type": "array",
                "items": {
                  "$ref": "#/components/schemas/TransportDeclarationGood"
                }
              }
            }
          }
        ]
      },
      "TransportDeclarationUpdated": {
        "description": "Die Transportanmeldung wurde aktualisiert",
        "allOf": [
          {
            "$ref": "#/components/schemas/CommonTransportDeclarationEventProperties"
          },
          {
            "required": [
              "terminal",
              "goods"
            ],
            "properties": {
              "vessel": {
                "$ref": "#/components/schemas/TransportDeclarationVessel"
              },
              "terminal": {
                "$ref": "#/components/schemas/terminalLocation"
              },
              "eta": {
                "$ref": "#/components/schemas/dateTimeString"
              },
              "goods": {
                "type": "array",
                "items": {
                  "$ref": "#/components/schemas/TransportDeclarationGood"
                }
              }
            }
          }
        ]
      },
      "TransportDeclarationAmendmentInitiated": {
        "description": "Eine Änderung an der Transportanmeldung wurde an den Zoll übermittelt",
        "allOf": [
          {
            "$ref": "#/components/schemas/CommonTransportDeclarationEventProperties"
          },
          {
            "required": [
              "terminal",
              "goods"
            ],
            "properties": {
              "vessel": {
                "$ref": "#/components/schemas/TransportDeclarationVessel"
              },
              "terminal": {
                "$ref": "#/components/schemas/terminalLocation"
              },
              "eta": {
                "$ref": "#/components/schemas/dateTimeString"
              },
              "goods": {
                "type": "array",
                "items": {
                  "$ref": "#/components/schemas/TransportDeclarationGood"
                }
              }
            }
          }
        ]
      },
      "TransportDeclarationUpdatedFromSlotBooking": {
        "description": "Die Transportanmeldung wurde durch eine Slot-Buchung aktualisiert",
        "allOf": [
          {
            "$ref": "#/components/schemas/CommonTransportDeclarationSlotBookingEventProperties"
          }
        ]
      },
      "TransportDeclarationAmendmentInitiatedFromSlotBooking": {
        "description": "Die Transportanmeldung wurde durch eine Slot-Buchung aktualisiert und Korrektur/Ergänzung wird an den Zoll übermittelt",
        "allOf": [
          {
            "$ref": "#/components/schemas/CommonTransportDeclarationSlotBookingEventProperties"
          }
        ]
      },
      "TransportDeclarationSent": {
        "description": "Die Transportanmeldung wurde an den Zoll übermittelt",
        "allOf": [
          {
            "$ref": "#/components/schemas/CommonTransportDeclarationEventProperties"
          }
        ]
      },
      "TransportDeclarationAccepted": {
        "description": "Die Transportanmeldung wurde vom Zoll akzeptiert",
        "allOf": [
          {
            "$ref": "#/components/schemas/CommonTransportDeclarationEventProperties"
          },
          {
            "required": [
              "journeyReferenceNumber"
            ]
          }
        ]
      },
      "TransportDeclarationBorderArrivalReported": {
        "description": "Für die Ladeeinheit wurde die Grenzankunft gemeldet",
        "allOf": [
          {
            "$ref": "#/components/schemas/CommonTransportDeclarationEventProperties"
          }
        ]
      },
      "TransportDeclarationDiscarded": {
        "description": "Die Transportanmeldung wurde verworfen",
        "allOf": [
          {
            "$ref": "#/components/schemas/CommonTransportDeclarationEventProperties"
          }
        ]
      },
      "TransportDeclarationBorderArrivalAccepted": {
        "description": "Für die Ladeeinheit wurde die Grenzankunft vom Zoll registriert",
        "allOf": [
          {
            "$ref": "#/components/schemas/CommonTransportDeclarationEventProperties"
          }
        ]
      },
      "TransportDeclarationSelectedForInspection": {
        "description": "Für die Ladeeinheit wird eine Kontrolle durchgeführt",
        "allOf": [
          {
            "$ref": "#/components/schemas/CommonTransportDeclarationEventProperties"
          }
        ]
      },
      "TransportDeclarationReleased": {
        "description": "Die Ladeeinheit wurde freigegeben",
        "allOf": [
          {
            "$ref": "#/components/schemas/CommonTransportDeclarationEventProperties"
          }
        ]
      },
      "TransportDeclarationWithdrawalInitiated": {
        "description": "Ein Rückzug der Transportanmeldung wurde an den Zoll übermittelt",
        "allOf": [
          {
            "$ref": "#/components/schemas/CommonTransportDeclarationEventProperties"
          }
        ]
      },
      "TransportDeclarationWithdrawalAccepted": {
        "description": "Ein Rückzug der Transportanmeldung wurde durch den Zoll akzeptiert",
        "allOf": [
          {
            "$ref": "#/components/schemas/CommonTransportDeclarationEventProperties"
          }
        ]
      },
      "TransportDeclarationAmendmentAccepted": {
        "description": "Die Änderung der Transportanmeldung wurde vom Zoll akzeptiert",
        "allOf": [
          {
            "$ref": "#/components/schemas/CommonTransportDeclarationEventProperties"
          }
        ]
      },
      "TransportDeclarationAmendmentRejected": {
        "description": "Die Korrektur/Ergänzung der Transportanmeldung wurde vom Zoll abgelehnt",
        "allOf": [
          {
            "$ref": "#/components/schemas/CommonTransportDeclarationEventProperties"
          }
        ]
      },
      "TransportDeclarationSlotBookingCancelled": {
        "description": "Die Slotbuchung der Reise wurde storniert",
        "allOf": [
          {
            "$ref": "#/components/schemas/CommonTransportDeclarationEventProperties"
          }
        ]
      },
      "stopsSearchResponse": {
        "type": "array",
        "description": "Liste der gefundenen Reisestopps",
        "items": {
          "$ref": "#/components/schemas/stopItem"
        }
      },
      "stopItem": {
        "type": "object",
        "additionalProperties": false,
        "properties": {
          "voyageId": {
            "type": "string",
            "description": "Die eindeutige Kennung der Reise"
          },
          "eni": {
            "type": "string",
            "pattern": "^\\d{8}$",
            "description": "Die ENI-Nummer des Schiffs"
          },
          "shipName": {
            "type": "string",
            "description": "Der Name des Schiffs"
          },
          "eta": {
            "type": "string",
            "format": "date-time",
            "description": "Die erwartete Ankunftszeit am Terminal (ISO 8601 Datum-Zeit-String)"
          },
          "bulkToDischarge": {
            "type": "integer",
            "minimum": 0,
            "description": "Anzahl der zu löschenden Massengut-Einheiten"
          },
          "bulkToLoad": {
            "type": "integer",
            "minimum": 0,
            "description": "Anzahl der zu ladenden Massengut-Einheiten"
          },
          "containersToDischarge": {
            "type": "integer",
            "minimum": 0,
            "description": "Anzahl der zu löschenden Container"
          },
          "containersToLoad": {
            "type": "integer",
            "minimum": 0,
            "description": "Anzahl der zu ladenden Container"
          }
        },
        "required": [
          "voyageId",
          "eta"
        ]
      },
      "TransportDeclarationError": {
        "description": "Ein Fehler ist aufgetreten",
        "allOf": [
          {
            "$ref": "#/components/schemas/CommonTransportDeclarationEventProperties"
          },
          {
            "required": [
              "errorType"
            ],
            "properties": {
              "errorType": {
                "type": "string"
              },
              "reasons": {
                "type": "array",
                "items": {
                  "title": "TransportDeclarationRejectionReason",
                  "required": [
                    "code",
                    "message",
                    "field"
                  ],
                  "properties": {
                    "code": {
                      "type": "string"
                    },
                    "message": {
                      "type": "string"
                    },
                    "field": {
                      "type": "string"
                    }
                  }
                }
              }
            }
          }
        ]
      }
    },
    "parameters": {
      "voyage-id": {
        "in": "path",
        "name": "voyage-id",
        "required": true,
        "schema": {
          "$ref": "#/components/schemas/voyageId"
        }
      },
      "container-no": {
        "in": "path",
        "name": "container-no",
        "required": true,
        "schema": {
          "$ref": "#/components/schemas/containerNumber"
        }
      },
      "bulk-id": {
        "in": "path",
        "name": "bulk-id",
        "schema": {
          "type": "string"
        },
        "required": true
      },
      "terminal-location": {
        "in": "path",
        "name": "terminal-location",
        "schema": {
          "$ref": "#/components/schemas/terminalLocation"
        },
        "required": true
      },
      "eni": {
        "in": "query",
        "name": "eni",
        "required": false,
        "schema": {
          "type": "string",
          "pattern": "^\\d{8}$"
        },
        "description": "Die ENI-Nummer des Schiffs (optional, zum Filtern)"
      },
      "eta-from": {
        "in": "query",
        "name": "etaFrom",
        "required": false,
        "schema": {
          "type": "string",
          "format": "date-time"
        },
        "description": "ETA-Startdatum für die Suche (ISO 8601 Datum-Zeit-String)"
      },
      "eta-to": {
        "in": "query",
        "name": "etaTo",
        "required": false,
        "schema": {
          "type": "string",
          "format": "date-time"
        },
        "description": "ETA-Enddatum für die Suche (ISO 8601 Datum-Zeit-String)"
      }
    },
    "securitySchemes": {
      "OAuth2ClientCredentials": {
        "type": "oauth2",
        "flows": {
          "clientCredentials": {
            "tokenUrl": "https://api.example.com/oauth2/token",
            "scopes": {}
          }
        }
      }
    }
  }
}