{
  "openapi": "3.0.3",
  "info": {
    "title": "Trans IT API: transports",
    "version": "1.0.0",
    "description": "Read-only access to your own transports, their orders and waypoints, and the documents on them.\n\nSend `x-customer-id` and `x-api-key` on every request. Both come from the link we send you, and the\nAPI key is shown only once.\n\nA transport id contains `#`, which ends a URL path. Percent-encode it as `%23`.\n\nThe fields marked always in the tables below are the only ones you can count on. Everything else can\nbe absent on any row, so make it optional in your generated types. A field being present on every\ntransport you have seen so far is not a promise that it will be on the next one.\n\nEmpty fields are left out rather than returned as null, and never as an empty string. A field is\neither present with a real value or absent, and absent means we do not have it."
  },
  "servers": [
    {
      "url": "https://api.trans-it.be"
    }
  ],
  "security": [
    {
      "customerId": [],
      "apiKey": []
    }
  ],
  "tags": [
    {
      "name": "Transports",
      "description": "Transports with their orders and waypoints."
    },
    {
      "name": "Documents",
      "description": "The documents on a transport, and links to the files."
    }
  ],
  "paths": {
    "/transports/{id}": {
      "get": {
        "tags": [
          "Transports"
        ],
        "summary": "One transport by id, including its documents",
        "description": "Documents are always included here. Percent-encode the id.",
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            },
            "example": "%23TransportId%237f21c0%23CustomerCompanyName%23VanDijk"
          }
        ],
        "responses": {
          "200": {
            "description": "The transport.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "message": {
                      "type": "string",
                      "example": "OK"
                    },
                    "data": {
                      "$ref": "#/components/schemas/Transport"
                    }
                  }
                }
              }
            }
          },
          "400": {
            "description": "A parameter is missing or invalid. The message says which.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "message": {
                      "type": "string"
                    }
                  }
                }
              }
            }
          },
          "401": {
            "description": "Headers missing, unknown customer id, or wrong API key.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "message": {
                      "type": "string"
                    }
                  }
                }
              }
            }
          },
          "403": {
            "description": "Your access is suspended, or the item belongs to someone else.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "message": {
                      "type": "string"
                    }
                  }
                }
              }
            }
          },
          "404": {
            "description": "The transport does not exist.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "message": {
                      "type": "string"
                    }
                  }
                }
              }
            }
          },
          "429": {
            "description": "Too many requests.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "message": {
                      "type": "string"
                    }
                  }
                }
              }
            }
          }
        }
      }
    },
    "/transports/byDateRange": {
      "get": {
        "tags": [
          "Transports"
        ],
        "summary": "Transports within a planned date range",
        "description": "The range is inclusive and can cover at most 7 days.",
        "parameters": [
          {
            "name": "dateFrom",
            "in": "query",
            "required": true,
            "description": "Start of the planned date range, inclusive.",
            "schema": {
              "type": "string",
              "format": "date",
              "example": "2026-08-01"
            }
          },
          {
            "name": "dateTo",
            "in": "query",
            "required": true,
            "description": "End of the planned date range, inclusive. At most 7 days after dateFrom.",
            "schema": {
              "type": "string",
              "format": "date",
              "example": "2026-08-07"
            }
          },
          {
            "name": "limit",
            "in": "query",
            "required": false,
            "description": "Rows per page. Without includeDocuments: 1 to 100, 50 by default. With includeDocuments=true: 1 to 25, 25 by default.",
            "schema": {
              "type": "integer",
              "minimum": 1,
              "maximum": 100,
              "default": 50
            }
          },
          {
            "name": "includeDocuments",
            "in": "query",
            "required": false,
            "description": "Add the documents to every transport in the list. This makes the call noticeably slower, because the documents of each transport have to be looked up separately. Leave it off unless you really need them, and use GET /documents/byTransport/{transportId} for the one transport you are after.",
            "schema": {
              "type": "boolean",
              "default": false
            }
          },
          {
            "name": "nextToken",
            "in": "query",
            "required": false,
            "description": "Value from the previous response. A page can be empty and still carry one. A token belongs to the search that produced it: keep the endpoint, the search value and the date range the same while paging, otherwise you get a 400.",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Transports, most recent planned date first.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "message": {
                      "type": "string",
                      "example": "OK"
                    },
                    "data": {
                      "type": "object",
                      "properties": {
                        "items": {
                          "type": "array",
                          "items": {
                            "$ref": "#/components/schemas/Transport"
                          }
                        },
                        "nextToken": {
                          "type": "string"
                        }
                      }
                    }
                  }
                }
              }
            }
          },
          "400": {
            "description": "A parameter is missing or invalid. The message says which.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "message": {
                      "type": "string"
                    }
                  }
                }
              }
            }
          },
          "401": {
            "description": "Headers missing, unknown customer id, or wrong API key.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "message": {
                      "type": "string"
                    }
                  }
                }
              }
            }
          },
          "403": {
            "description": "Your access is suspended, or the item belongs to someone else.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "message": {
                      "type": "string"
                    }
                  }
                }
              }
            }
          },
          "429": {
            "description": "Too many requests.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "message": {
                      "type": "string"
                    }
                  }
                }
              }
            }
          }
        }
      }
    },
    "/transports/byContainerNumber/{containerNumber}": {
      "get": {
        "tags": [
          "Transports"
        ],
        "summary": "Transports for one container number",
        "description": "The number is normalised: uppercased, and anything that is not a letter or a digit is dropped, so `mscu 123456-7` matches `MSCU1234567`. A date range is optional and usually unnecessary, because the search goes straight to the container number.",
        "parameters": [
          {
            "name": "containerNumber",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            },
            "example": "MSCU1234567"
          },
          {
            "name": "dateFrom",
            "in": "query",
            "required": false,
            "description": "Start of the planned date range, inclusive.",
            "schema": {
              "type": "string",
              "format": "date",
              "example": "2026-08-01"
            }
          },
          {
            "name": "dateTo",
            "in": "query",
            "required": false,
            "description": "End of the planned date range, inclusive. At most 7 days after dateFrom.",
            "schema": {
              "type": "string",
              "format": "date",
              "example": "2026-08-07"
            }
          },
          {
            "name": "limit",
            "in": "query",
            "required": false,
            "description": "Rows per page. Without includeDocuments: 1 to 100, 50 by default. With includeDocuments=true: 1 to 25, 25 by default.",
            "schema": {
              "type": "integer",
              "minimum": 1,
              "maximum": 100,
              "default": 50
            }
          },
          {
            "name": "includeDocuments",
            "in": "query",
            "required": false,
            "description": "Add the documents to every transport in the list. This makes the call noticeably slower, because the documents of each transport have to be looked up separately. Leave it off unless you really need them, and use GET /documents/byTransport/{transportId} for the one transport you are after.",
            "schema": {
              "type": "boolean",
              "default": false
            }
          },
          {
            "name": "nextToken",
            "in": "query",
            "required": false,
            "description": "Value from the previous response. A page can be empty and still carry one. A token belongs to the search that produced it: keep the endpoint, the search value and the date range the same while paging, otherwise you get a 400.",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Transports, most recent planned date first.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "message": {
                      "type": "string",
                      "example": "OK"
                    },
                    "data": {
                      "type": "object",
                      "properties": {
                        "items": {
                          "type": "array",
                          "items": {
                            "$ref": "#/components/schemas/Transport"
                          }
                        },
                        "nextToken": {
                          "type": "string"
                        }
                      }
                    }
                  }
                }
              }
            }
          },
          "400": {
            "description": "A parameter is missing or invalid. The message says which.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "message": {
                      "type": "string"
                    }
                  }
                }
              }
            }
          },
          "401": {
            "description": "Headers missing, unknown customer id, or wrong API key.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "message": {
                      "type": "string"
                    }
                  }
                }
              }
            }
          },
          "403": {
            "description": "Your access is suspended, or the item belongs to someone else.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "message": {
                      "type": "string"
                    }
                  }
                }
              }
            }
          },
          "429": {
            "description": "Too many requests.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "message": {
                      "type": "string"
                    }
                  }
                }
              }
            }
          }
        }
      }
    },
    "/transports/byCustomerReference/{customerReference}": {
      "get": {
        "tags": [
          "Transports"
        ],
        "summary": "Transports for one of your own references",
        "description": "References are matched exactly, including case. A date range is optional and usually unnecessary.",
        "parameters": [
          {
            "name": "customerReference",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            },
            "example": "REF-2026-0912"
          },
          {
            "name": "dateFrom",
            "in": "query",
            "required": false,
            "description": "Start of the planned date range, inclusive.",
            "schema": {
              "type": "string",
              "format": "date",
              "example": "2026-08-01"
            }
          },
          {
            "name": "dateTo",
            "in": "query",
            "required": false,
            "description": "End of the planned date range, inclusive. At most 7 days after dateFrom.",
            "schema": {
              "type": "string",
              "format": "date",
              "example": "2026-08-07"
            }
          },
          {
            "name": "limit",
            "in": "query",
            "required": false,
            "description": "Rows per page. Without includeDocuments: 1 to 100, 50 by default. With includeDocuments=true: 1 to 25, 25 by default.",
            "schema": {
              "type": "integer",
              "minimum": 1,
              "maximum": 100,
              "default": 50
            }
          },
          {
            "name": "includeDocuments",
            "in": "query",
            "required": false,
            "description": "Add the documents to every transport in the list. This makes the call noticeably slower, because the documents of each transport have to be looked up separately. Leave it off unless you really need them, and use GET /documents/byTransport/{transportId} for the one transport you are after.",
            "schema": {
              "type": "boolean",
              "default": false
            }
          },
          {
            "name": "nextToken",
            "in": "query",
            "required": false,
            "description": "Value from the previous response. A page can be empty and still carry one. A token belongs to the search that produced it: keep the endpoint, the search value and the date range the same while paging, otherwise you get a 400.",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Transports, most recent planned date first.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "message": {
                      "type": "string",
                      "example": "OK"
                    },
                    "data": {
                      "type": "object",
                      "properties": {
                        "items": {
                          "type": "array",
                          "items": {
                            "$ref": "#/components/schemas/Transport"
                          }
                        },
                        "nextToken": {
                          "type": "string"
                        }
                      }
                    }
                  }
                }
              }
            }
          },
          "400": {
            "description": "A parameter is missing or invalid. The message says which.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "message": {
                      "type": "string"
                    }
                  }
                }
              }
            }
          },
          "401": {
            "description": "Headers missing, unknown customer id, or wrong API key.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "message": {
                      "type": "string"
                    }
                  }
                }
              }
            }
          },
          "403": {
            "description": "Your access is suspended, or the item belongs to someone else.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "message": {
                      "type": "string"
                    }
                  }
                }
              }
            }
          },
          "429": {
            "description": "Too many requests.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "message": {
                      "type": "string"
                    }
                  }
                }
              }
            }
          }
        }
      }
    },
    "/documents/byTransport/{transportId}": {
      "get": {
        "tags": [
          "Documents"
        ],
        "summary": "The documents on one transport",
        "description": "Not paged: every document on the transport comes back in one response.",
        "parameters": [
          {
            "name": "transportId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            },
            "example": "%23TransportId%237f21c0%23CustomerCompanyName%23VanDijk"
          }
        ],
        "responses": {
          "200": {
            "description": "The documents.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "message": {
                      "type": "string",
                      "example": "OK"
                    },
                    "data": {
                      "type": "object",
                      "properties": {
                        "items": {
                          "type": "array",
                          "items": {
                            "$ref": "#/components/schemas/Document"
                          }
                        }
                      }
                    }
                  }
                }
              }
            }
          },
          "400": {
            "description": "A parameter is missing or invalid. The message says which.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "message": {
                      "type": "string"
                    }
                  }
                }
              }
            }
          },
          "401": {
            "description": "Headers missing, unknown customer id, or wrong API key.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "message": {
                      "type": "string"
                    }
                  }
                }
              }
            }
          },
          "403": {
            "description": "Your access is suspended, or the item belongs to someone else.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "message": {
                      "type": "string"
                    }
                  }
                }
              }
            }
          },
          "404": {
            "description": "The transport does not exist.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "message": {
                      "type": "string"
                    }
                  }
                }
              }
            }
          },
          "429": {
            "description": "Too many requests.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "message": {
                      "type": "string"
                    }
                  }
                }
              }
            }
          }
        }
      }
    },
    "/documents/presignedUrl/{id}": {
      "get": {
        "tags": [
          "Documents"
        ],
        "summary": "A link to one document file",
        "description": "Download from the returned URL without your API headers: the link carries its own permission and is valid for 15 minutes. Do not store it, ask for a new one instead.",
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "The link.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "message": {
                      "type": "string",
                      "example": "OK"
                    },
                    "data": {
                      "$ref": "#/components/schemas/PresignedUrl"
                    }
                  }
                }
              }
            }
          },
          "400": {
            "description": "A parameter is missing or invalid. The message says which.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "message": {
                      "type": "string"
                    }
                  }
                }
              }
            }
          },
          "401": {
            "description": "Headers missing, unknown customer id, or wrong API key.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "message": {
                      "type": "string"
                    }
                  }
                }
              }
            }
          },
          "403": {
            "description": "Your access is suspended, or the item belongs to someone else.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "message": {
                      "type": "string"
                    }
                  }
                }
              }
            }
          },
          "404": {
            "description": "The document does not exist, or has no file.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "message": {
                      "type": "string"
                    }
                  }
                }
              }
            }
          },
          "429": {
            "description": "Too many requests.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "message": {
                      "type": "string"
                    }
                  }
                }
              }
            }
          }
        }
      }
    }
  },
  "components": {
    "securitySchemes": {
      "customerId": {
        "type": "apiKey",
        "in": "header",
        "name": "x-customer-id"
      },
      "apiKey": {
        "type": "apiKey",
        "in": "header",
        "name": "x-api-key"
      }
    },
    "schemas": {
      "Transport": {
        "type": "object",
        "required": [
          "id",
          "transportCategory",
          "type",
          "plannedDate",
          "orders"
        ],
        "description": "Only the fields marked always are guaranteed. Everything else can be absent, including createdAt and version. The container fields appear on container transports only.",
        "properties": {
          "id": {
            "type": "string",
            "example": "#TransportId#7f21c0#CustomerCompanyName#VanDijk"
          },
          "transportCategory": {
            "type": "string",
            "enum": [
              "CONTAINER_TRANSPORT",
              "CURTAIN_TRANSPORT",
              "SEMI_TRAILER_TRANSPORT",
              "COURIER_SERVICE"
            ]
          },
          "type": {
            "type": "string",
            "enum": [
              "LOAD",
              "UNLOAD",
              "SHUNT",
              "OTHER",
              "STANDARD"
            ],
            "description": "Worked out from the stops, in the order they happen and across all orders together, because the planned value is not always right. A load before an unload is STANDARD; a pickup before the last dropoff without either is SHUNT. A transport without waypoints keeps the planned value."
          },
          "status": {
            "type": "string",
            "enum": [
              "CREATED",
              "INPROGRESS",
              "COMPLETE"
            ]
          },
          "transportNumber": {
            "type": "string",
            "description": "The transport number as it is shown in the portal, prefixed with TR-.",
            "example": "TR-10482"
          },
          "tautlinerNumber": {
            "type": "string"
          },
          "plannedDate": {
            "type": "string",
            "format": "date",
            "example": "2026-08-03"
          },
          "customerReference": {
            "type": "string",
            "description": "Your own reference."
          },
          "containerNumber": {
            "type": "string",
            "description": "Always uppercase.",
            "example": "MSCU1234567"
          },
          "sealNumber": {
            "type": "string"
          },
          "containerType": {
            "type": "string"
          },
          "containerLinerName": {
            "type": "string"
          },
          "containerLinerCode": {
            "type": "string"
          },
          "containerBoat": {
            "type": "string"
          },
          "ship": {
            "type": "string"
          },
          "containerTarWeight": {
            "type": "number"
          },
          "containerTarWeightUnit": {
            "type": "string",
            "enum": [
              "TON",
              "KG"
            ]
          },
          "cargoWeight": {
            "type": "number"
          },
          "cargoWeightUnit": {
            "type": "string",
            "enum": [
              "TON",
              "KG"
            ]
          },
          "goods": {
            "type": "string"
          },
          "customsInfo": {
            "type": "string"
          },
          "isAdr": {
            "type": "boolean"
          },
          "unNumbers": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/UnNumber"
            }
          },
          "isPharma": {
            "type": "boolean"
          },
          "isGenset": {
            "type": "boolean"
          },
          "gensetTemperature": {
            "type": "number"
          },
          "isCocContainer": {
            "type": "boolean"
          },
          "isSocContainer": {
            "type": "boolean"
          },
          "isTiltingChassis": {
            "type": "boolean"
          },
          "isGarbageTransport": {
            "type": "boolean"
          },
          "isLateCancellation": {
            "type": "boolean"
          },
          "isDeadFreight": {
            "type": "boolean"
          },
          "version": {
            "type": "integer",
            "description": "Goes up on every real change. Useful for deduplication."
          },
          "createdAt": {
            "type": "string",
            "format": "date-time"
          },
          "updatedAt": {
            "type": "string",
            "format": "date-time"
          },
          "orders": {
            "type": "array",
            "description": "Always ordered by index.",
            "items": {
              "$ref": "#/components/schemas/Order"
            }
          },
          "documents": {
            "type": "array",
            "description": "Always on GET /transports/{id}. On a list only with includeDocuments=true.",
            "items": {
              "$ref": "#/components/schemas/Document"
            }
          }
        }
      },
      "Order": {
        "type": "object",
        "required": [
          "id",
          "plannedDate"
        ],
        "description": "Only the fields marked always are guaranteed. index and waypoints are nullable in our source data, so check them. The number plates appear once a truck has been assigned.",
        "properties": {
          "id": {
            "type": "string"
          },
          "index": {
            "type": "integer",
            "description": "Position within the transport, and the order we return them in."
          },
          "type": {
            "type": "string",
            "enum": [
              "LOAD",
              "UNLOAD",
              "SHUNT",
              "OTHER",
              "STANDARD"
            ]
          },
          "status": {
            "type": "string",
            "enum": [
              "CREATED",
              "INPROGRESS",
              "COMPLETE"
            ]
          },
          "plannedDate": {
            "type": "string",
            "format": "date"
          },
          "truckNumberPlate": {
            "type": "string"
          },
          "trailerNumberPlate": {
            "type": "string"
          },
          "waypoints": {
            "type": "array",
            "description": "Always ordered by index.",
            "items": {
              "$ref": "#/components/schemas/Waypoint"
            }
          }
        }
      },
      "Waypoint": {
        "type": "object",
        "required": [
          "id",
          "index"
        ],
        "description": "Only the fields marked always are guaranteed. type and status are almost always there but are nullable in our source data. The driver and waiting timestamps fill up as the transport runs.",
        "properties": {
          "id": {
            "type": "string"
          },
          "index": {
            "type": "integer"
          },
          "type": {
            "type": "string",
            "enum": [
              "PICKUP",
              "DROPOFF",
              "DEPOT",
              "LOAD",
              "UNLOAD",
              "WEIGH",
              "CUSTOMS",
              "SCAN",
              "OTHER"
            ]
          },
          "status": {
            "type": "string",
            "enum": [
              "NOTVISITED",
              "ONSITE",
              "INPROGRESS",
              "COMPLETE"
            ]
          },
          "isScheduled": {
            "type": "boolean"
          },
          "isMainWaypoint": {
            "type": "boolean"
          },
          "plannedDate": {
            "type": "string",
            "format": "date"
          },
          "appointmentDate": {
            "type": "string",
            "format": "date",
            "example": "2026-08-03"
          },
          "appointmentTime": {
            "type": "string",
            "description": "Belgian local time. Absent when a date was agreed but no time.",
            "example": "08:30:00"
          },
          "portAppointmentTimeSlot": {
            "$ref": "#/components/schemas/TimeSlot"
          },
          "planInfoUpdatedAt": {
            "type": "string",
            "format": "date-time"
          },
          "closing": {
            "type": "string",
            "format": "date-time"
          },
          "reference": {
            "type": "string"
          },
          "tarTasReference": {
            "type": "string",
            "description": "The pre-announcement reference."
          },
          "paNumber": {
            "type": "string"
          },
          "location": {
            "allOf": [
              {
                "$ref": "#/components/schemas/Location"
              }
            ],
            "description": "Your supplier can agree with you that this is shared only for CUSTOMS, WEIGH, SCAN, LOAD and UNLOAD stops. It is then absent on the others. A shunt keeps all of its locations."
          },
          "eta": {
            "type": "string",
            "format": "date-time"
          },
          "driverHasArrivedTimestamp": {
            "type": "string",
            "format": "date-time",
            "description": "The corrected time when a planner corrected it afterwards."
          },
          "driverHasExitedTimestamp": {
            "type": "string",
            "format": "date-time"
          },
          "waypointInProgressTimestamp": {
            "type": "string",
            "format": "date-time"
          },
          "waypointCompleteTimestamp": {
            "type": "string",
            "format": "date-time"
          },
          "totalWaitingHours": {
            "type": "number"
          }
        }
      },
      "TimeSlot": {
        "type": "object",
        "description": "Both ends as full timestamps. A slot that runs past midnight ends on the next day.",
        "properties": {
          "start": {
            "type": "string",
            "format": "date-time",
            "example": "2026-09-02T03:00:00.000+02:00"
          },
          "end": {
            "type": "string",
            "format": "date-time",
            "example": "2026-09-02T04:00:00.000+02:00"
          }
        }
      },
      "Location": {
        "type": "object",
        "description": "Nothing here is guaranteed. When a waypoint has no location on file but does have an address, the same object is built from that address, and id, name, shortName and postalCode are absent.",
        "properties": {
          "id": {
            "type": "string"
          },
          "name": {
            "type": "string"
          },
          "shortName": {
            "type": "string"
          },
          "addressLine": {
            "type": "string"
          },
          "postalCode": {
            "type": "string"
          },
          "city": {
            "type": "string"
          },
          "locality": {
            "type": "string"
          },
          "latitude": {
            "type": "number"
          },
          "longitude": {
            "type": "number"
          }
        }
      },
      "UnNumber": {
        "type": "object",
        "properties": {
          "unnumber": {
            "type": "string",
            "example": "UN1234"
          },
          "description": {
            "type": "string"
          }
        }
      },
      "Document": {
        "type": "object",
        "required": [
          "id",
          "transportId",
          "name"
        ],
        "description": "Beyond the fields marked always, type and description can be absent.",
        "properties": {
          "id": {
            "type": "string",
            "description": "Use it for GET /documents/presignedUrl/{id}."
          },
          "transportId": {
            "type": "string",
            "description": "The transport this document hangs on. A document is only ever returned through it."
          },
          "name": {
            "type": "string",
            "example": "CMR.pdf"
          },
          "type": {
            "type": "string",
            "example": "CMR"
          },
          "description": {
            "type": "string"
          }
        }
      },
      "PresignedUrl": {
        "type": "object",
        "properties": {
          "url": {
            "type": "string",
            "format": "uri"
          },
          "expiresAt": {
            "type": "string",
            "format": "date-time"
          },
          "name": {
            "type": "string"
          }
        }
      }
    }
  }
}