{
  "openapi": "3.0.4",
  "info": {
    "title": "YolcuGo Partner API",
    "version": "v2 (2026-03)",
    "description": "Transfer tekliflerini sorgulayın ve rezervasyonları yönetin. Bu belge test ortamı içindir. Fiyatlarda sunucunun döndürdüğü toplamı ve para birimini kullanın; görüntüleme ve tahsilat tutarları farklı olabilir."
  },
  "paths": {
    "/api/user/login": {
      "post": {
        "tags": [
          "Kimlik doğrulama"
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/LoginRequest"
              },
              "examples": {
                "credentials": {
                  "summary": "Sentetik örnek — test hesabıyla giriş",
                  "description": "Gerçek müşteri, token, teklif veya fiyat içermez. Kimlikleri canlı yanıtlarla değiştirin. ",
                  "value": {
                    "userName": "partner@example.com",
                    "password": "<TEST_HESABI_SIFRESI>"
                  }
                }
              }
            },
            "text/json": {
              "schema": {
                "$ref": "#/components/schemas/LoginRequest"
              },
              "examples": {
                "credentials": {
                  "summary": "Sentetik örnek — test hesabıyla giriş",
                  "description": "Gerçek müşteri, token, teklif veya fiyat içermez. Kimlikleri canlı yanıtlarla değiştirin. ",
                  "value": {
                    "userName": "partner@example.com",
                    "password": "<TEST_HESABI_SIFRESI>"
                  }
                }
              }
            },
            "application/*+json": {
              "schema": {
                "$ref": "#/components/schemas/LoginRequest"
              },
              "examples": {
                "credentials": {
                  "summary": "Sentetik örnek — test hesabıyla giriş",
                  "description": "Gerçek müşteri, token, teklif veya fiyat içermez. Kimlikleri canlı yanıtlarla değiştirin. ",
                  "value": {
                    "userName": "partner@example.com",
                    "password": "<TEST_HESABI_SIFRESI>"
                  }
                }
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "description": "İşlem başarılı.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/TokenResponseApiResponse"
                },
                "examples": {
                  "token": {
                    "summary": "Sentetik örnek — erişim ve yenileme token'ı",
                    "description": "Gerçek müşteri, token, teklif veya fiyat içermez. Kimlikleri canlı yanıtlarla değiştirin. Örnek token'lar çalışmaz. Süreleri örnekten sabitlemeyin.",
                    "value": {
                      "success": true,
                      "message": "İşlem başarılı.",
                      "data": {
                        "accessToken": "DEMO_ACCESS_TOKEN",
                        "refreshToken": "DEMO_REFRESH_TOKEN",
                        "accessTokenExpiration": "2030-06-01T09:00:00Z",
                        "refreshTokenExpiration": "2030-06-08T08:00:00Z",
                        "tokenType": "Bearer",
                        "expiresIn": 3600
                      },
                      "errors": null,
                      "statusCode": 200
                    }
                  }
                }
              }
            }
          },
          "400": {
            "description": "İstek bilgileri geçerli değil. Hata yoluna göre gövde değişebilir; HTTP durumunu esas alın.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ObjectApiResponse"
                },
                "examples": {
                  "error": {
                    "summary": "Sentetik örnek — HTTP 400 hata zarfı",
                    "description": "Gerçek müşteri, token, teklif veya fiyat içermez. Kimlikleri canlı yanıtlarla değiştirin. Temsili hata yoludur; mesajlar yerelleştirilebilir ve her hatada errorCode bulunmayabilir.",
                    "value": {
                      "success": false,
                      "message": "İstek bilgileri geçerli değil.",
                      "data": null,
                      "errors": [
                        "Gönderilen alanları kontrol edin."
                      ],
                      "statusCode": 400
                    }
                  }
                }
              }
            }
          },
          "429": {
            "description": "Çok fazla istek gönderildi. Lütfen biraz sonra tekrar deneyin. Hata yoluna göre gövde değişebilir; HTTP durumunu esas alın.",
            "headers": {
              "Retry-After": {
                "description": "Döndüğünde yeniden denemeden önce beklenecek saniye. Her 429 yanıtında bulunmayabilir.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ObjectApiResponse"
                },
                "examples": {
                  "error": {
                    "summary": "Sentetik örnek — HTTP 429 hata zarfı",
                    "description": "Gerçek müşteri, token, teklif veya fiyat içermez. Kimlikleri canlı yanıtlarla değiştirin. Temsili hata yoludur; mesajlar yerelleştirilebilir ve her hatada errorCode bulunmayabilir.",
                    "value": {
                      "success": false,
                      "message": "Çok fazla istek gönderildi. Lütfen biraz sonra tekrar deneyin.",
                      "data": null,
                      "errors": [],
                      "statusCode": 429,
                      "errorCode": "RATE_LIMITED"
                    }
                  }
                }
              }
            }
          },
          "500": {
            "description": "İşlem sırasında bir sunucu hatası oluştu. Hata yoluna göre gövde değişebilir; HTTP durumunu esas alın.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ObjectApiResponse"
                },
                "examples": {
                  "error": {
                    "summary": "Sentetik örnek — HTTP 500 hata zarfı",
                    "description": "Gerçek müşteri, token, teklif veya fiyat içermez. Kimlikleri canlı yanıtlarla değiştirin. Temsili hata yoludur; mesajlar yerelleştirilebilir ve her hatada errorCode bulunmayabilir.",
                    "value": {
                      "success": false,
                      "message": "İşlem sırasında bir sunucu hatası oluştu.",
                      "data": null,
                      "errors": [],
                      "statusCode": 500,
                      "errorCode": "INTERNAL_SERVER_ERROR"
                    }
                  }
                }
              }
            }
          }
        },
        "operationId": "login",
        "summary": "Oturum aç",
        "description": "Partner hesabıyla erişim ve yenileme token'ı alın. Kullanıcı adı e-posta veya desteklenen telefon numarasıdır. Bearer token gerekmez.",
        "parameters": [
          {
            "name": "Accept-Language",
            "in": "header",
            "required": false,
            "description": "Yanıt dili ve X-Currency verilmediğinde varsayılan görüntüleme para birimi.",
            "schema": {
              "type": "string",
              "enum": [
                "tr-TR",
                "en-US",
                "de-DE",
                "ru-RU"
              ],
              "default": "tr-TR"
            }
          }
        ],
        "security": []
      }
    },
    "/api/user/refresh-token": {
      "post": {
        "tags": [
          "Kimlik doğrulama"
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/RefreshTokenRequest"
              },
              "examples": {
                "refresh": {
                  "summary": "Sentetik örnek — token yenileme",
                  "description": "Gerçek müşteri, token, teklif veya fiyat içermez. Kimlikleri canlı yanıtlarla değiştirin. ",
                  "value": {
                    "token": "DEMO_REFRESH_TOKEN"
                  }
                }
              }
            },
            "text/json": {
              "schema": {
                "$ref": "#/components/schemas/RefreshTokenRequest"
              },
              "examples": {
                "refresh": {
                  "summary": "Sentetik örnek — token yenileme",
                  "description": "Gerçek müşteri, token, teklif veya fiyat içermez. Kimlikleri canlı yanıtlarla değiştirin. ",
                  "value": {
                    "token": "DEMO_REFRESH_TOKEN"
                  }
                }
              }
            },
            "application/*+json": {
              "schema": {
                "$ref": "#/components/schemas/RefreshTokenRequest"
              },
              "examples": {
                "refresh": {
                  "summary": "Sentetik örnek — token yenileme",
                  "description": "Gerçek müşteri, token, teklif veya fiyat içermez. Kimlikleri canlı yanıtlarla değiştirin. ",
                  "value": {
                    "token": "DEMO_REFRESH_TOKEN"
                  }
                }
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "description": "İşlem başarılı.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/TokenResponseApiResponse"
                },
                "examples": {
                  "token": {
                    "summary": "Sentetik örnek — yenilenen oturum",
                    "description": "Gerçek müşteri, token, teklif veya fiyat içermez. Kimlikleri canlı yanıtlarla değiştirin. ",
                    "value": {
                      "success": true,
                      "message": "İşlem başarılı.",
                      "data": {
                        "accessToken": "DEMO_YENI_ACCESS_TOKEN",
                        "refreshToken": "DEMO_YENI_REFRESH_TOKEN",
                        "accessTokenExpiration": "2030-06-01T09:00:00Z",
                        "refreshTokenExpiration": "2030-06-08T08:00:00Z",
                        "tokenType": "Bearer",
                        "expiresIn": 3600
                      },
                      "errors": null,
                      "statusCode": 200
                    }
                  }
                }
              }
            }
          },
          "400": {
            "description": "İstek bilgileri geçerli değil. Hata yoluna göre gövde değişebilir; HTTP durumunu esas alın.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ObjectApiResponse"
                },
                "examples": {
                  "error": {
                    "summary": "Sentetik örnek — HTTP 400 hata zarfı",
                    "description": "Gerçek müşteri, token, teklif veya fiyat içermez. Kimlikleri canlı yanıtlarla değiştirin. Temsili hata yoludur; mesajlar yerelleştirilebilir ve her hatada errorCode bulunmayabilir.",
                    "value": {
                      "success": false,
                      "message": "İstek bilgileri geçerli değil.",
                      "data": null,
                      "errors": [
                        "Gönderilen alanları kontrol edin."
                      ],
                      "statusCode": 400
                    }
                  }
                }
              }
            }
          },
          "429": {
            "description": "Çok fazla istek gönderildi. Lütfen biraz sonra tekrar deneyin. Hata yoluna göre gövde değişebilir; HTTP durumunu esas alın.",
            "headers": {
              "Retry-After": {
                "description": "Döndüğünde yeniden denemeden önce beklenecek saniye. Her 429 yanıtında bulunmayabilir.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ObjectApiResponse"
                },
                "examples": {
                  "error": {
                    "summary": "Sentetik örnek — HTTP 429 hata zarfı",
                    "description": "Gerçek müşteri, token, teklif veya fiyat içermez. Kimlikleri canlı yanıtlarla değiştirin. Temsili hata yoludur; mesajlar yerelleştirilebilir ve her hatada errorCode bulunmayabilir.",
                    "value": {
                      "success": false,
                      "message": "Çok fazla istek gönderildi. Lütfen biraz sonra tekrar deneyin.",
                      "data": null,
                      "errors": [],
                      "statusCode": 429,
                      "errorCode": "RATE_LIMITED"
                    }
                  }
                }
              }
            }
          },
          "500": {
            "description": "İşlem sırasında bir sunucu hatası oluştu. Hata yoluna göre gövde değişebilir; HTTP durumunu esas alın.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ObjectApiResponse"
                },
                "examples": {
                  "error": {
                    "summary": "Sentetik örnek — HTTP 500 hata zarfı",
                    "description": "Gerçek müşteri, token, teklif veya fiyat içermez. Kimlikleri canlı yanıtlarla değiştirin. Temsili hata yoludur; mesajlar yerelleştirilebilir ve her hatada errorCode bulunmayabilir.",
                    "value": {
                      "success": false,
                      "message": "İşlem sırasında bir sunucu hatası oluştu.",
                      "data": null,
                      "errors": [],
                      "statusCode": 500,
                      "errorCode": "INTERNAL_SERVER_ERROR"
                    }
                  }
                }
              }
            }
          }
        },
        "operationId": "refreshToken",
        "summary": "Token yenile",
        "description": "Yenileme token'ını token alanında gönderin. Dönen erişim ve yenileme token'larını birlikte saklayın; aynı oturum için yenilemeyi eşzamanlı çalıştırmayın.",
        "parameters": [
          {
            "name": "Accept-Language",
            "in": "header",
            "required": false,
            "description": "Yanıt dili ve X-Currency verilmediğinde varsayılan görüntüleme para birimi.",
            "schema": {
              "type": "string",
              "enum": [
                "tr-TR",
                "en-US",
                "de-DE",
                "ru-RU"
              ],
              "default": "tr-TR"
            }
          }
        ],
        "security": []
      }
    },
    "/api/availability": {
      "post": {
        "tags": [
          "Müsaitlik"
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/AvailabilityRequest"
              },
              "examples": {
                "oneWay": {
                  "summary": "Sentetik örnek — tek yön transfer",
                  "description": "Gerçek müşteri, token, teklif veya fiyat içermez. Kimlikleri canlı yanıtlarla değiştirin. ",
                  "value": {
                    "requestId": "d90a6d8b-4717-4c50-b38c-9e81d06d952f",
                    "bestPrice": true,
                    "pickUpDateTime": "2030-06-15T12:00:00+03:00",
                    "pickUpLocation": {
                      "name": "İstanbul Havalimanı",
                      "latitude": 41.2611,
                      "longitude": 28.7419,
                      "isAirport": true
                    },
                    "dropOffLocation": {
                      "name": "Taksim Meydanı",
                      "latitude": 41.0369,
                      "longitude": 28.985,
                      "isAirport": false
                    },
                    "hour": 0
                  }
                },
                "waypoint": {
                  "summary": "Sentetik örnek — bir ara duraklı transfer",
                  "description": "Gerçek müşteri, token, teklif veya fiyat içermez. Kimlikleri canlı yanıtlarla değiştirin. ",
                  "value": {
                    "requestId": "d90a6d8b-4717-4c50-b38c-9e81d06d952f",
                    "bestPrice": true,
                    "pickUpDateTime": "2030-06-15T12:00:00+03:00",
                    "pickUpLocation": {
                      "name": "İstanbul Havalimanı",
                      "latitude": 41.2611,
                      "longitude": 28.7419,
                      "isAirport": true
                    },
                    "dropOffLocation": {
                      "name": "Taksim Meydanı",
                      "latitude": 41.0369,
                      "longitude": 28.985,
                      "isAirport": false
                    },
                    "hour": 0,
                    "waypoints": [
                      {
                        "name": "Örnek ara durak",
                        "latitude": 41.0763,
                        "longitude": 28.9896
                      }
                    ]
                  }
                }
              }
            },
            "text/json": {
              "schema": {
                "$ref": "#/components/schemas/AvailabilityRequest"
              },
              "examples": {
                "oneWay": {
                  "summary": "Sentetik örnek — tek yön transfer",
                  "description": "Gerçek müşteri, token, teklif veya fiyat içermez. Kimlikleri canlı yanıtlarla değiştirin. ",
                  "value": {
                    "requestId": "d90a6d8b-4717-4c50-b38c-9e81d06d952f",
                    "bestPrice": true,
                    "pickUpDateTime": "2030-06-15T12:00:00+03:00",
                    "pickUpLocation": {
                      "name": "İstanbul Havalimanı",
                      "latitude": 41.2611,
                      "longitude": 28.7419,
                      "isAirport": true
                    },
                    "dropOffLocation": {
                      "name": "Taksim Meydanı",
                      "latitude": 41.0369,
                      "longitude": 28.985,
                      "isAirport": false
                    },
                    "hour": 0
                  }
                },
                "waypoint": {
                  "summary": "Sentetik örnek — bir ara duraklı transfer",
                  "description": "Gerçek müşteri, token, teklif veya fiyat içermez. Kimlikleri canlı yanıtlarla değiştirin. ",
                  "value": {
                    "requestId": "d90a6d8b-4717-4c50-b38c-9e81d06d952f",
                    "bestPrice": true,
                    "pickUpDateTime": "2030-06-15T12:00:00+03:00",
                    "pickUpLocation": {
                      "name": "İstanbul Havalimanı",
                      "latitude": 41.2611,
                      "longitude": 28.7419,
                      "isAirport": true
                    },
                    "dropOffLocation": {
                      "name": "Taksim Meydanı",
                      "latitude": 41.0369,
                      "longitude": 28.985,
                      "isAirport": false
                    },
                    "hour": 0,
                    "waypoints": [
                      {
                        "name": "Örnek ara durak",
                        "latitude": 41.0763,
                        "longitude": 28.9896
                      }
                    ]
                  }
                }
              }
            },
            "application/*+json": {
              "schema": {
                "$ref": "#/components/schemas/AvailabilityRequest"
              },
              "examples": {
                "oneWay": {
                  "summary": "Sentetik örnek — tek yön transfer",
                  "description": "Gerçek müşteri, token, teklif veya fiyat içermez. Kimlikleri canlı yanıtlarla değiştirin. ",
                  "value": {
                    "requestId": "d90a6d8b-4717-4c50-b38c-9e81d06d952f",
                    "bestPrice": true,
                    "pickUpDateTime": "2030-06-15T12:00:00+03:00",
                    "pickUpLocation": {
                      "name": "İstanbul Havalimanı",
                      "latitude": 41.2611,
                      "longitude": 28.7419,
                      "isAirport": true
                    },
                    "dropOffLocation": {
                      "name": "Taksim Meydanı",
                      "latitude": 41.0369,
                      "longitude": 28.985,
                      "isAirport": false
                    },
                    "hour": 0
                  }
                },
                "waypoint": {
                  "summary": "Sentetik örnek — bir ara duraklı transfer",
                  "description": "Gerçek müşteri, token, teklif veya fiyat içermez. Kimlikleri canlı yanıtlarla değiştirin. ",
                  "value": {
                    "requestId": "d90a6d8b-4717-4c50-b38c-9e81d06d952f",
                    "bestPrice": true,
                    "pickUpDateTime": "2030-06-15T12:00:00+03:00",
                    "pickUpLocation": {
                      "name": "İstanbul Havalimanı",
                      "latitude": 41.2611,
                      "longitude": 28.7419,
                      "isAirport": true
                    },
                    "dropOffLocation": {
                      "name": "Taksim Meydanı",
                      "latitude": 41.0369,
                      "longitude": 28.985,
                      "isAirport": false
                    },
                    "hour": 0,
                    "waypoints": [
                      {
                        "name": "Örnek ara durak",
                        "latitude": 41.0763,
                        "longitude": 28.9896
                      }
                    ]
                  }
                }
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/AvailabilityResponseApiResponse"
                },
                "examples": {
                  "available": {
                    "summary": "Sentetik örnek — tek araç teklifi",
                    "description": "Gerçek müşteri, token, teklif veya fiyat içermez. Kimlikleri canlı yanıtlarla değiştirin. ",
                    "value": {
                      "success": true,
                      "message": "İşlem başarılı.",
                      "data": {
                        "requestId": "d90a6d8b-4717-4c50-b38c-9e81d06d952f",
                        "distance": "42 km",
                        "travelTime": "45 dakika",
                        "pickUpAddress": "İstanbul Havalimanı",
                        "dropOffAddress": "Taksim Meydanı",
                        "alternativeRoutes": "NormalYol",
                        "vehicles": [
                          {
                            "itemId": "DEMO_TEKLIF_ITEM_ID",
                            "vehicleTypeId": 100,
                            "vehicleType": "Standart Sedan",
                            "typeDescription": "3 yolcu, 2 bagaj",
                            "seat": 3,
                            "baggage": 2,
                            "supplierId": 100,
                            "supplierName": "Örnek Tedarikçi",
                            "supplierShortCode": null,
                            "isExternalSupplier": false,
                            "salesChannel": 0,
                            "externalExtras": [],
                            "selectedExternalExtras": [],
                            "netAmount": 1000,
                            "vatRate": 20,
                            "vatAmount": 200,
                            "grossAmount": 1200,
                            "tollRoadFee": 0,
                            "currency": "TRY",
                            "currencySymbol": "₺",
                            "chargeAmount": 1200,
                            "chargeCurrency": "TRY",
                            "roadName": "NormalYol",
                            "freeCancellationUntilUtc": null,
                            "hasRouteAlternative": false,
                            "policyMessage": null,
                            "policyViolations": [],
                            "isPolicyBlocked": false,
                            "waypointCount": 0,
                            "waypointNetAmount": 0,
                            "waypointVatAmount": 0,
                            "waypointGrossAmount": 0
                          }
                        ]
                      },
                      "errors": null,
                      "statusCode": 200
                    }
                  },
                  "empty": {
                    "summary": "Sentetik örnek — hizmet bölgesi dışında",
                    "description": "Gerçek müşteri, token, teklif veya fiyat içermez. Kimlikleri canlı yanıtlarla değiştirin. Bölgeler temsili; güncel kapsamı yanıttan okuyun.",
                    "value": {
                      "success": true,
                      "message": "İşlem başarılı.",
                      "data": {
                        "requestId": "d90a6d8b-4717-4c50-b38c-9e81d06d952f",
                        "vehicles": [],
                        "coverage": {
                          "status": "OutOfService",
                          "serviceableCities": [
                            "İstanbul"
                          ],
                          "serviceableDestinations": [
                            "İstanbul"
                          ]
                        }
                      },
                      "errors": null,
                      "statusCode": 200
                    }
                  }
                }
              }
            }
          },
          "400": {
            "description": "İstek bilgileri geçerli değil. Hata yoluna göre gövde değişebilir; HTTP durumunu esas alın.",
            "content": {
              "application/json": {
                "schema": {
                  "anyOf": [
                    {
                      "$ref": "#/components/schemas/AvailabilityResponseApiResponse"
                    },
                    {
                      "$ref": "#/components/schemas/ObjectApiResponse"
                    }
                  ]
                },
                "examples": {
                  "error": {
                    "summary": "Sentetik örnek — HTTP 400 hata zarfı",
                    "description": "Gerçek müşteri, token, teklif veya fiyat içermez. Kimlikleri canlı yanıtlarla değiştirin. Temsili hata yoludur; mesajlar yerelleştirilebilir ve her hatada errorCode bulunmayabilir.",
                    "value": {
                      "success": false,
                      "message": "İstek bilgileri geçerli değil.",
                      "data": null,
                      "errors": [
                        "Gönderilen alanları kontrol edin."
                      ],
                      "statusCode": 400
                    }
                  }
                }
              }
            }
          },
          "429": {
            "description": "Çok fazla istek gönderildi. Lütfen biraz sonra tekrar deneyin. Hata yoluna göre gövde değişebilir; HTTP durumunu esas alın.",
            "headers": {
              "Retry-After": {
                "description": "Döndüğünde yeniden denemeden önce beklenecek saniye. Her 429 yanıtında bulunmayabilir.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ObjectApiResponse"
                },
                "examples": {
                  "error": {
                    "summary": "Sentetik örnek — HTTP 429 hata zarfı",
                    "description": "Gerçek müşteri, token, teklif veya fiyat içermez. Kimlikleri canlı yanıtlarla değiştirin. Temsili hata yoludur; mesajlar yerelleştirilebilir ve her hatada errorCode bulunmayabilir.",
                    "value": {
                      "success": false,
                      "message": "Çok fazla istek gönderildi. Lütfen biraz sonra tekrar deneyin.",
                      "data": null,
                      "errors": [],
                      "statusCode": 429,
                      "errorCode": "RATE_LIMITED"
                    }
                  }
                }
              }
            }
          },
          "500": {
            "description": "İşlem sırasında bir sunucu hatası oluştu. Hata yoluna göre gövde değişebilir; HTTP durumunu esas alın.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ObjectApiResponse"
                },
                "examples": {
                  "error": {
                    "summary": "Sentetik örnek — HTTP 500 hata zarfı",
                    "description": "Gerçek müşteri, token, teklif veya fiyat içermez. Kimlikleri canlı yanıtlarla değiştirin. Temsili hata yoludur; mesajlar yerelleştirilebilir ve her hatada errorCode bulunmayabilir.",
                    "value": {
                      "success": false,
                      "message": "İşlem sırasında bir sunucu hatası oluştu.",
                      "data": null,
                      "errors": [],
                      "statusCode": 500,
                      "errorCode": "INTERNAL_SERVER_ERROR"
                    }
                  }
                }
              }
            }
          }
        },
        "operationId": "searchAvailability",
        "summary": "Transfer teklifi al",
        "description": "Rota ve tarih için araç tekliflerini getirir. Partner fiyatları için oturum açın. data.vehicles listesindeki itemId rezervasyonda kullanılır; boş liste uygun teklif bulunmadığını gösterir. Anonim kullanım da desteklenir; partner akışında bütün adımlarda aynı oturum kullanılmalıdır.",
        "parameters": [
          {
            "name": "Accept-Language",
            "in": "header",
            "required": false,
            "description": "Yanıt dili ve X-Currency verilmediğinde varsayılan görüntüleme para birimi.",
            "schema": {
              "type": "string",
              "enum": [
                "tr-TR",
                "en-US",
                "de-DE",
                "ru-RU"
              ],
              "default": "tr-TR"
            }
          },
          {
            "name": "X-Currency",
            "in": "header",
            "required": false,
            "description": "Görüntüleme para birimi. Desteklenen değerler dil varsayılanını geçersiz kılar.",
            "schema": {
              "type": "string",
              "enum": [
                "TRY",
                "EUR",
                "USD",
                "RUB"
              ]
            }
          }
        ],
        "security": [
          {
            "Bearer": []
          },
          {}
        ]
      }
    },
    "/api/availability/external-extras": {
      "post": {
        "tags": [
          "Müsaitlik"
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/ExternalExtrasRequoteRequest"
              },
              "examples": {
                "extras": {
                  "summary": "Sentetik örnek — bir dış ek hizmet seçimi",
                  "description": "Gerçek müşteri, token, teklif veya fiyat içermez. Kimlikleri canlı yanıtlarla değiştirin. ",
                  "value": {
                    "itemId": "DEMO_DIS_TEKLIF_ITEM_ID",
                    "extras": [
                      {
                        "code": "DEMO_CHILD_SEAT",
                        "quantity": 1
                      }
                    ]
                  }
                },
                "clear": {
                  "summary": "Sentetik örnek — dış ekstra seçimini kaldır",
                  "description": "Gerçek müşteri, token, teklif veya fiyat içermez. Kimlikleri canlı yanıtlarla değiştirin. ",
                  "value": {
                    "itemId": "DEMO_DIS_TEKLIF_ITEM_ID",
                    "extras": []
                  }
                }
              }
            },
            "text/json": {
              "schema": {
                "$ref": "#/components/schemas/ExternalExtrasRequoteRequest"
              },
              "examples": {
                "extras": {
                  "summary": "Sentetik örnek — bir dış ek hizmet seçimi",
                  "description": "Gerçek müşteri, token, teklif veya fiyat içermez. Kimlikleri canlı yanıtlarla değiştirin. ",
                  "value": {
                    "itemId": "DEMO_DIS_TEKLIF_ITEM_ID",
                    "extras": [
                      {
                        "code": "DEMO_CHILD_SEAT",
                        "quantity": 1
                      }
                    ]
                  }
                },
                "clear": {
                  "summary": "Sentetik örnek — dış ekstra seçimini kaldır",
                  "description": "Gerçek müşteri, token, teklif veya fiyat içermez. Kimlikleri canlı yanıtlarla değiştirin. ",
                  "value": {
                    "itemId": "DEMO_DIS_TEKLIF_ITEM_ID",
                    "extras": []
                  }
                }
              }
            },
            "application/*+json": {
              "schema": {
                "$ref": "#/components/schemas/ExternalExtrasRequoteRequest"
              },
              "examples": {
                "extras": {
                  "summary": "Sentetik örnek — bir dış ek hizmet seçimi",
                  "description": "Gerçek müşteri, token, teklif veya fiyat içermez. Kimlikleri canlı yanıtlarla değiştirin. ",
                  "value": {
                    "itemId": "DEMO_DIS_TEKLIF_ITEM_ID",
                    "extras": [
                      {
                        "code": "DEMO_CHILD_SEAT",
                        "quantity": 1
                      }
                    ]
                  }
                },
                "clear": {
                  "summary": "Sentetik örnek — dış ekstra seçimini kaldır",
                  "description": "Gerçek müşteri, token, teklif veya fiyat içermez. Kimlikleri canlı yanıtlarla değiştirin. ",
                  "value": {
                    "itemId": "DEMO_DIS_TEKLIF_ITEM_ID",
                    "extras": []
                  }
                }
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/VehicleResponseApiResponse"
                },
                "examples": {
                  "repriced": {
                    "summary": "Sentetik örnek — ek hizmetle yeniden fiyatlanan teklif",
                    "description": "Gerçek müşteri, token, teklif veya fiyat içermez. Kimlikleri canlı yanıtlarla değiştirin. Kod, koşul sürümü, bekleme ve iptal süresi yalnız bu örneğe aittir.",
                    "value": {
                      "success": true,
                      "message": "İşlem başarılı.",
                      "data": {
                        "itemId": "DEMO_DIS_TEKLIF_ITEM_ID",
                        "vehicleTypeId": 100,
                        "vehicleType": "Standart Sedan",
                        "typeDescription": "3 yolcu, 2 bagaj",
                        "seat": 3,
                        "baggage": 2,
                        "supplierId": 100,
                        "supplierName": "Örnek Tedarikçi",
                        "supplierShortCode": null,
                        "isExternalSupplier": true,
                        "salesChannel": 0,
                        "externalExtras": [
                          {
                            "code": "DEMO_CHILD_SEAT",
                            "name": "Örnek çocuk koltuğu",
                            "unitPrice": 120,
                            "currency": "TRY",
                            "maxQuantity": 1
                          }
                        ],
                        "selectedExternalExtras": [
                          {
                            "code": "DEMO_CHILD_SEAT",
                            "quantity": 1
                          }
                        ],
                        "netAmount": 1320,
                        "vatRate": 0,
                        "vatAmount": 0,
                        "grossAmount": 1320,
                        "tollRoadFee": 0,
                        "currency": "TRY",
                        "currencySymbol": "₺",
                        "chargeAmount": 1320,
                        "chargeCurrency": "TRY",
                        "roadName": "NormalYol",
                        "freeCancellationUntilUtc": "2030-06-14T09:00:00Z",
                        "hasRouteAlternative": false,
                        "policyMessage": null,
                        "policyViolations": [],
                        "isPolicyBlocked": false,
                        "waypointCount": 0,
                        "waypointNetAmount": 0,
                        "waypointVatAmount": 0,
                        "waypointGrossAmount": 0,
                        "pickUpTimeZoneId": "Europe/Istanbul",
                        "serviceConditions": {
                          "version": "DEMO_KOSUL_SURUMU",
                          "freeCancellationUntilUtc": "2030-06-14T09:00:00Z",
                          "pickUpTimeZoneId": "Europe/Istanbul",
                          "specialRequestsMinHours": 24,
                          "waitingMinutes": 90,
                          "waitingStartsAt": "landing",
                          "requiresFlightNumber": true,
                          "requiresSupportForSpecialRequests": true
                        }
                      },
                      "errors": null,
                      "statusCode": 200
                    }
                  }
                }
              }
            }
          },
          "400": {
            "description": "İstek bilgileri geçerli değil. Hata yoluna göre gövde değişebilir; HTTP durumunu esas alın.",
            "content": {
              "application/json": {
                "schema": {
                  "anyOf": [
                    {
                      "$ref": "#/components/schemas/VehicleResponseApiResponse"
                    },
                    {
                      "$ref": "#/components/schemas/ObjectApiResponse"
                    }
                  ]
                },
                "examples": {
                  "error": {
                    "summary": "Sentetik örnek — HTTP 400 hata zarfı",
                    "description": "Gerçek müşteri, token, teklif veya fiyat içermez. Kimlikleri canlı yanıtlarla değiştirin. Temsili hata yoludur; mesajlar yerelleştirilebilir ve her hatada errorCode bulunmayabilir.",
                    "value": {
                      "success": false,
                      "message": "İstek bilgileri geçerli değil.",
                      "data": null,
                      "errors": [
                        "Gönderilen alanları kontrol edin."
                      ],
                      "statusCode": 400
                    }
                  }
                }
              }
            }
          },
          "401": {
            "description": "Bu işlem için oturum doğrulanamadı. Hata yoluna göre gövde değişebilir; HTTP durumunu esas alın. Kimlik doğrulama katmanı gövdesiz yanıt da verebilir.",
            "content": {
              "application/json": {
                "schema": {
                  "anyOf": [
                    {
                      "$ref": "#/components/schemas/VehicleResponseApiResponse"
                    },
                    {
                      "$ref": "#/components/schemas/ObjectApiResponse"
                    }
                  ]
                },
                "examples": {
                  "error": {
                    "summary": "Sentetik örnek — HTTP 401 hata zarfı",
                    "description": "Gerçek müşteri, token, teklif veya fiyat içermez. Kimlikleri canlı yanıtlarla değiştirin. Temsili hata yoludur; mesajlar yerelleştirilebilir ve her hatada errorCode bulunmayabilir.",
                    "value": {
                      "success": false,
                      "message": "Bu işlem için oturum doğrulanamadı.",
                      "data": null,
                      "errors": [],
                      "statusCode": 401,
                      "errorCode": "UNAUTHORIZED"
                    }
                  }
                }
              }
            }
          },
          "410": {
            "description": "Teklif artık kullanılamıyor. Müsaitlik aramasını yenileyin. Hata yoluna göre gövde değişebilir; HTTP durumunu esas alın.",
            "content": {
              "application/json": {
                "schema": {
                  "anyOf": [
                    {
                      "$ref": "#/components/schemas/VehicleResponseApiResponse"
                    },
                    {
                      "$ref": "#/components/schemas/ObjectApiResponse"
                    }
                  ]
                },
                "examples": {
                  "error": {
                    "summary": "Sentetik örnek — HTTP 410 hata zarfı",
                    "description": "Gerçek müşteri, token, teklif veya fiyat içermez. Kimlikleri canlı yanıtlarla değiştirin. Temsili hata yoludur; mesajlar yerelleştirilebilir ve her hatada errorCode bulunmayabilir.",
                    "value": {
                      "success": false,
                      "message": "Teklif artık kullanılamıyor. Müsaitlik aramasını yenileyin.",
                      "data": null,
                      "errors": [],
                      "statusCode": 410,
                      "errorCode": "RESOURCE_GONE"
                    }
                  }
                }
              }
            }
          },
          "429": {
            "description": "Çok fazla istek gönderildi. Lütfen biraz sonra tekrar deneyin. Hata yoluna göre gövde değişebilir; HTTP durumunu esas alın.",
            "headers": {
              "Retry-After": {
                "description": "Döndüğünde yeniden denemeden önce beklenecek saniye. Her 429 yanıtında bulunmayabilir.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ObjectApiResponse"
                },
                "examples": {
                  "error": {
                    "summary": "Sentetik örnek — HTTP 429 hata zarfı",
                    "description": "Gerçek müşteri, token, teklif veya fiyat içermez. Kimlikleri canlı yanıtlarla değiştirin. Temsili hata yoludur; mesajlar yerelleştirilebilir ve her hatada errorCode bulunmayabilir.",
                    "value": {
                      "success": false,
                      "message": "Çok fazla istek gönderildi. Lütfen biraz sonra tekrar deneyin.",
                      "data": null,
                      "errors": [],
                      "statusCode": 429,
                      "errorCode": "RATE_LIMITED"
                    }
                  }
                }
              }
            }
          },
          "500": {
            "description": "İşlem sırasında bir sunucu hatası oluştu. Hata yoluna göre gövde değişebilir; HTTP durumunu esas alın.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ObjectApiResponse"
                },
                "examples": {
                  "error": {
                    "summary": "Sentetik örnek — HTTP 500 hata zarfı",
                    "description": "Gerçek müşteri, token, teklif veya fiyat içermez. Kimlikleri canlı yanıtlarla değiştirin. Temsili hata yoludur; mesajlar yerelleştirilebilir ve her hatada errorCode bulunmayabilir.",
                    "value": {
                      "success": false,
                      "message": "İşlem sırasında bir sunucu hatası oluştu.",
                      "data": null,
                      "errors": [],
                      "statusCode": 500,
                      "errorCode": "INTERNAL_SERVER_ERROR"
                    }
                  }
                }
              }
            }
          }
        },
        "operationId": "requoteExternalExtras",
        "summary": "Dış tedarikçi ekstralarını fiyatla",
        "description": "Seçilen dış tedarikçi ekstralarıyla teklifi yeniden fiyatlar. Dönen araç teklifinin itemId ve fiyatlarını sonraki işlemde kullanın. Anonim kullanım da desteklenir; partner akışında bütün adımlarda aynı oturum kullanılmalıdır.",
        "parameters": [
          {
            "name": "Accept-Language",
            "in": "header",
            "required": false,
            "description": "Yanıt dili ve X-Currency verilmediğinde varsayılan görüntüleme para birimi.",
            "schema": {
              "type": "string",
              "enum": [
                "tr-TR",
                "en-US",
                "de-DE",
                "ru-RU"
              ],
              "default": "tr-TR"
            }
          },
          {
            "name": "X-Currency",
            "in": "header",
            "required": false,
            "description": "Görüntüleme para birimi. Desteklenen değerler dil varsayılanını geçersiz kılar.",
            "schema": {
              "type": "string",
              "enum": [
                "TRY",
                "EUR",
                "USD",
                "RUB"
              ]
            }
          }
        ],
        "security": [
          {
            "Bearer": []
          },
          {}
        ]
      }
    },
    "/api/availability/route-options": {
      "post": {
        "tags": [
          "Müsaitlik"
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/RouteOptionsRequest"
              },
              "examples": {
                "selected": {
                  "summary": "Sentetik örnek — seçilen teklifin rotaları",
                  "description": "Gerçek müşteri, token, teklif veya fiyat içermez. Kimlikleri canlı yanıtlarla değiştirin. ",
                  "value": {
                    "itemId": "DEMO_TEKLIF_ITEM_ID"
                  }
                }
              }
            },
            "text/json": {
              "schema": {
                "$ref": "#/components/schemas/RouteOptionsRequest"
              },
              "examples": {
                "selected": {
                  "summary": "Sentetik örnek — seçilen teklifin rotaları",
                  "description": "Gerçek müşteri, token, teklif veya fiyat içermez. Kimlikleri canlı yanıtlarla değiştirin. ",
                  "value": {
                    "itemId": "DEMO_TEKLIF_ITEM_ID"
                  }
                }
              }
            },
            "application/*+json": {
              "schema": {
                "$ref": "#/components/schemas/RouteOptionsRequest"
              },
              "examples": {
                "selected": {
                  "summary": "Sentetik örnek — seçilen teklifin rotaları",
                  "description": "Gerçek müşteri, token, teklif veya fiyat içermez. Kimlikleri canlı yanıtlarla değiştirin. ",
                  "value": {
                    "itemId": "DEMO_TEKLIF_ITEM_ID"
                  }
                }
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/RouteOptionDtoIReadOnlyListApiResponse"
                },
                "examples": {
                  "routes": {
                    "summary": "Sentetik örnek — fiyatlanmış rota",
                    "description": "Gerçek müşteri, token, teklif veya fiyat içermez. Kimlikleri canlı yanıtlarla değiştirin. ",
                    "value": {
                      "success": true,
                      "message": "İşlem başarılı.",
                      "data": [
                        {
                          "itemId": "DEMO_ROTA_TEKLIF_ITEM_ID",
                          "crossing": "FSM",
                          "crossingName": "Fatih Sultan Mehmet Köprüsü",
                          "isDefault": true,
                          "distance": "55 km",
                          "travelTime": "60 dakika",
                          "tollFee": 120,
                          "totalPrice": 1320,
                          "netAmount": 1000,
                          "vatAmount": 220,
                          "chargeAmount": 1320,
                          "chargeCurrency": "TRY",
                          "priceDifference": 0,
                          "currency": "TRY",
                          "entryPlazaName": null,
                          "exitPlazaName": null,
                          "polyline": null
                        }
                      ],
                      "errors": null,
                      "statusCode": 200
                    }
                  },
                  "none": {
                    "summary": "Sentetik örnek — alternatif rota yok",
                    "description": "Gerçek müşteri, token, teklif veya fiyat içermez. Kimlikleri canlı yanıtlarla değiştirin. ",
                    "value": {
                      "success": true,
                      "message": "İşlem başarılı.",
                      "data": [],
                      "errors": null,
                      "statusCode": 200
                    }
                  }
                }
              }
            }
          },
          "400": {
            "description": "İstek bilgileri geçerli değil. Hata yoluna göre gövde değişebilir; HTTP durumunu esas alın.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ObjectApiResponse"
                },
                "examples": {
                  "error": {
                    "summary": "Sentetik örnek — HTTP 400 hata zarfı",
                    "description": "Gerçek müşteri, token, teklif veya fiyat içermez. Kimlikleri canlı yanıtlarla değiştirin. Temsili hata yoludur; mesajlar yerelleştirilebilir ve her hatada errorCode bulunmayabilir.",
                    "value": {
                      "success": false,
                      "message": "İstek bilgileri geçerli değil.",
                      "data": null,
                      "errors": [
                        "Gönderilen alanları kontrol edin."
                      ],
                      "statusCode": 400
                    }
                  }
                }
              }
            }
          },
          "401": {
            "description": "Bu işlem için oturum doğrulanamadı. Hata yoluna göre gövde değişebilir; HTTP durumunu esas alın. Kimlik doğrulama katmanı gövdesiz yanıt da verebilir.",
            "content": {
              "application/json": {
                "schema": {
                  "anyOf": [
                    {
                      "$ref": "#/components/schemas/RouteOptionDtoIReadOnlyListApiResponse"
                    },
                    {
                      "$ref": "#/components/schemas/ObjectApiResponse"
                    }
                  ]
                },
                "examples": {
                  "error": {
                    "summary": "Sentetik örnek — HTTP 401 hata zarfı",
                    "description": "Gerçek müşteri, token, teklif veya fiyat içermez. Kimlikleri canlı yanıtlarla değiştirin. Temsili hata yoludur; mesajlar yerelleştirilebilir ve her hatada errorCode bulunmayabilir.",
                    "value": {
                      "success": false,
                      "message": "Bu işlem için oturum doğrulanamadı.",
                      "data": null,
                      "errors": [],
                      "statusCode": 401,
                      "errorCode": "UNAUTHORIZED"
                    }
                  }
                }
              }
            }
          },
          "410": {
            "description": "Teklif artık kullanılamıyor. Müsaitlik aramasını yenileyin. Hata yoluna göre gövde değişebilir; HTTP durumunu esas alın.",
            "content": {
              "application/json": {
                "schema": {
                  "anyOf": [
                    {
                      "$ref": "#/components/schemas/RouteOptionDtoIReadOnlyListApiResponse"
                    },
                    {
                      "$ref": "#/components/schemas/ObjectApiResponse"
                    }
                  ]
                },
                "examples": {
                  "error": {
                    "summary": "Sentetik örnek — HTTP 410 hata zarfı",
                    "description": "Gerçek müşteri, token, teklif veya fiyat içermez. Kimlikleri canlı yanıtlarla değiştirin. Temsili hata yoludur; mesajlar yerelleştirilebilir ve her hatada errorCode bulunmayabilir.",
                    "value": {
                      "success": false,
                      "message": "Teklif artık kullanılamıyor. Müsaitlik aramasını yenileyin.",
                      "data": null,
                      "errors": [],
                      "statusCode": 410,
                      "errorCode": "RESOURCE_GONE"
                    }
                  }
                }
              }
            }
          },
          "429": {
            "description": "Çok fazla istek gönderildi. Lütfen biraz sonra tekrar deneyin. Hata yoluna göre gövde değişebilir; HTTP durumunu esas alın.",
            "headers": {
              "Retry-After": {
                "description": "Döndüğünde yeniden denemeden önce beklenecek saniye. Her 429 yanıtında bulunmayabilir.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ObjectApiResponse"
                },
                "examples": {
                  "error": {
                    "summary": "Sentetik örnek — HTTP 429 hata zarfı",
                    "description": "Gerçek müşteri, token, teklif veya fiyat içermez. Kimlikleri canlı yanıtlarla değiştirin. Temsili hata yoludur; mesajlar yerelleştirilebilir ve her hatada errorCode bulunmayabilir.",
                    "value": {
                      "success": false,
                      "message": "Çok fazla istek gönderildi. Lütfen biraz sonra tekrar deneyin.",
                      "data": null,
                      "errors": [],
                      "statusCode": 429,
                      "errorCode": "RATE_LIMITED"
                    }
                  }
                }
              }
            }
          },
          "500": {
            "description": "İşlem sırasında bir sunucu hatası oluştu. Hata yoluna göre gövde değişebilir; HTTP durumunu esas alın.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ObjectApiResponse"
                },
                "examples": {
                  "error": {
                    "summary": "Sentetik örnek — HTTP 500 hata zarfı",
                    "description": "Gerçek müşteri, token, teklif veya fiyat içermez. Kimlikleri canlı yanıtlarla değiştirin. Temsili hata yoludur; mesajlar yerelleştirilebilir ve her hatada errorCode bulunmayabilir.",
                    "value": {
                      "success": false,
                      "message": "İşlem sırasında bir sunucu hatası oluştu.",
                      "data": null,
                      "errors": [],
                      "statusCode": 500,
                      "errorCode": "INTERNAL_SERVER_ERROR"
                    }
                  }
                }
              }
            }
          }
        },
        "operationId": "getRouteOptions",
        "summary": "Rota seçeneklerini getir",
        "description": "Seçilen teklif için alternatif rotaları getirir. Rezervasyon için seçtiğiniz seçeneğin teklif anahtarını kullanın. 410 yanıtında müsaitlik aramasını yenileyin. Anonim kullanım da desteklenir; partner akışında bütün adımlarda aynı oturum kullanılmalıdır.",
        "parameters": [
          {
            "name": "Accept-Language",
            "in": "header",
            "required": false,
            "description": "Yanıt dili ve X-Currency verilmediğinde varsayılan görüntüleme para birimi.",
            "schema": {
              "type": "string",
              "enum": [
                "tr-TR",
                "en-US",
                "de-DE",
                "ru-RU"
              ],
              "default": "tr-TR"
            }
          },
          {
            "name": "X-Currency",
            "in": "header",
            "required": false,
            "description": "Görüntüleme para birimi. Desteklenen değerler dil varsayılanını geçersiz kılar.",
            "schema": {
              "type": "string",
              "enum": [
                "TRY",
                "EUR",
                "USD",
                "RUB"
              ]
            }
          }
        ],
        "security": [
          {
            "Bearer": []
          },
          {}
        ]
      }
    },
    "/api/availability/{supplierId}/extras": {
      "get": {
        "tags": [
          "Müsaitlik"
        ],
        "parameters": [
          {
            "name": "supplierId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "integer",
              "format": "int32"
            },
            "description": "Müsaitlik teklifindeki tedarikçi kimliği.",
            "example": 100
          },
          {
            "name": "Accept-Language",
            "in": "header",
            "required": false,
            "description": "Yanıt dili ve X-Currency verilmediğinde varsayılan görüntüleme para birimi.",
            "schema": {
              "type": "string",
              "enum": [
                "tr-TR",
                "en-US",
                "de-DE",
                "ru-RU"
              ],
              "default": "tr-TR"
            }
          },
          {
            "name": "X-Currency",
            "in": "header",
            "required": false,
            "description": "Görüntüleme para birimi. Desteklenen değerler dil varsayılanını geçersiz kılar.",
            "schema": {
              "type": "string",
              "enum": [
                "TRY",
                "EUR",
                "USD",
                "RUB"
              ]
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BookingExtraResponseListApiResponse"
                },
                "examples": {
                  "extras": {
                    "summary": "Sentetik örnek — tedarikçi ek hizmet listesi",
                    "description": "Gerçek müşteri, token, teklif veya fiyat içermez. Kimlikleri canlı yanıtlarla değiştirin. ",
                    "value": {
                      "success": true,
                      "message": "İşlem başarılı.",
                      "data": [
                        {
                          "id": 100,
                          "name": "Örnek çocuk koltuğu",
                          "description": "Örnek ek hizmet",
                          "type": 1,
                          "supplierId": 100,
                          "netAmount": 100,
                          "vatRate": 20,
                          "vatAmount": 20,
                          "grossAmount": 120,
                          "chargeAmount": 120,
                          "chargeCurrency": "TRY",
                          "currency": "TRY",
                          "currencySymbol": "₺"
                        }
                      ],
                      "errors": null,
                      "statusCode": 200
                    }
                  },
                  "none": {
                    "summary": "Sentetik örnek — ek hizmet yok",
                    "description": "Gerçek müşteri, token, teklif veya fiyat içermez. Kimlikleri canlı yanıtlarla değiştirin. ",
                    "value": {
                      "success": true,
                      "message": "İşlem başarılı.",
                      "data": [],
                      "errors": null,
                      "statusCode": 200
                    }
                  }
                }
              }
            }
          },
          "400": {
            "description": "İstek bilgileri geçerli değil. Hata yoluna göre gövde değişebilir; HTTP durumunu esas alın.",
            "content": {
              "application/json": {
                "schema": {
                  "anyOf": [
                    {
                      "$ref": "#/components/schemas/BookingExtraResponseApiResponse"
                    },
                    {
                      "$ref": "#/components/schemas/ObjectApiResponse"
                    }
                  ]
                },
                "examples": {
                  "error": {
                    "summary": "Sentetik örnek — HTTP 400 hata zarfı",
                    "description": "Gerçek müşteri, token, teklif veya fiyat içermez. Kimlikleri canlı yanıtlarla değiştirin. Temsili hata yoludur; mesajlar yerelleştirilebilir ve her hatada errorCode bulunmayabilir.",
                    "value": {
                      "success": false,
                      "message": "İstek bilgileri geçerli değil.",
                      "data": null,
                      "errors": [
                        "Gönderilen alanları kontrol edin."
                      ],
                      "statusCode": 400
                    }
                  }
                }
              }
            }
          },
          "401": {
            "description": "Bu işlem için oturum doğrulanamadı. Hata yoluna göre gövde değişebilir; HTTP durumunu esas alın. Kimlik doğrulama katmanı gövdesiz yanıt da verebilir.",
            "content": {
              "application/json": {
                "schema": {
                  "anyOf": [
                    {
                      "$ref": "#/components/schemas/BookingExtraResponseApiResponse"
                    },
                    {
                      "$ref": "#/components/schemas/ObjectApiResponse"
                    }
                  ]
                },
                "examples": {
                  "error": {
                    "summary": "Sentetik örnek — HTTP 401 hata zarfı",
                    "description": "Gerçek müşteri, token, teklif veya fiyat içermez. Kimlikleri canlı yanıtlarla değiştirin. Temsili hata yoludur; mesajlar yerelleştirilebilir ve her hatada errorCode bulunmayabilir.",
                    "value": {
                      "success": false,
                      "message": "Bu işlem için oturum doğrulanamadı.",
                      "data": null,
                      "errors": [],
                      "statusCode": 401,
                      "errorCode": "UNAUTHORIZED"
                    }
                  }
                }
              }
            }
          },
          "404": {
            "description": "Kaynak bulunamadı. Hata yoluna göre gövde değişebilir; HTTP durumunu esas alın.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ObjectApiResponse"
                },
                "examples": {
                  "error": {
                    "summary": "Sentetik örnek — HTTP 404 hata zarfı",
                    "description": "Gerçek müşteri, token, teklif veya fiyat içermez. Kimlikleri canlı yanıtlarla değiştirin. Temsili hata yoludur; mesajlar yerelleştirilebilir ve her hatada errorCode bulunmayabilir.",
                    "value": {
                      "success": false,
                      "message": "Kaynak bulunamadı.",
                      "data": null,
                      "errors": [],
                      "statusCode": 404,
                      "errorCode": "RESOURCE_NOT_FOUND"
                    }
                  }
                }
              }
            }
          },
          "429": {
            "description": "Çok fazla istek gönderildi. Lütfen biraz sonra tekrar deneyin. Hata yoluna göre gövde değişebilir; HTTP durumunu esas alın.",
            "headers": {
              "Retry-After": {
                "description": "Döndüğünde yeniden denemeden önce beklenecek saniye. Her 429 yanıtında bulunmayabilir.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ObjectApiResponse"
                },
                "examples": {
                  "error": {
                    "summary": "Sentetik örnek — HTTP 429 hata zarfı",
                    "description": "Gerçek müşteri, token, teklif veya fiyat içermez. Kimlikleri canlı yanıtlarla değiştirin. Temsili hata yoludur; mesajlar yerelleştirilebilir ve her hatada errorCode bulunmayabilir.",
                    "value": {
                      "success": false,
                      "message": "Çok fazla istek gönderildi. Lütfen biraz sonra tekrar deneyin.",
                      "data": null,
                      "errors": [],
                      "statusCode": 429,
                      "errorCode": "RATE_LIMITED"
                    }
                  }
                }
              }
            }
          },
          "500": {
            "description": "İşlem sırasında bir sunucu hatası oluştu. Hata yoluna göre gövde değişebilir; HTTP durumunu esas alın.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ObjectApiResponse"
                },
                "examples": {
                  "error": {
                    "summary": "Sentetik örnek — HTTP 500 hata zarfı",
                    "description": "Gerçek müşteri, token, teklif veya fiyat içermez. Kimlikleri canlı yanıtlarla değiştirin. Temsili hata yoludur; mesajlar yerelleştirilebilir ve her hatada errorCode bulunmayabilir.",
                    "value": {
                      "success": false,
                      "message": "İşlem sırasında bir sunucu hatası oluştu.",
                      "data": null,
                      "errors": [],
                      "statusCode": 500,
                      "errorCode": "INTERNAL_SERVER_ERROR"
                    }
                  }
                }
              }
            }
          }
        },
        "operationId": "getSupplierExtras",
        "summary": "Tedarikçi ekstralarını listele",
        "description": "Teklifteki supplierId için ek hizmetleri getirir. Seçilen kimlikleri rezervasyonun supplierExtraIds alanında gönderin. Dış tedarikçi ekstralarının yeniden fiyatlama akışı ayrıdır. Anonim erişim desteklenir; partner fiyat/KDV bağlamı için aramada kullandığınız token'ı gönderin.",
        "security": [
          {
            "Bearer": []
          },
          {}
        ]
      }
    },
    "/api/booking/user": {
      "get": {
        "tags": [
          "Rezervasyon"
        ],
        "parameters": [
          {
            "name": "year",
            "in": "query",
            "schema": {
              "type": "integer",
              "format": "int32"
            },
            "description": "Filtrelenecek yıl.",
            "example": 2030
          },
          {
            "name": "month",
            "in": "query",
            "schema": {
              "type": "integer",
              "format": "int32"
            },
            "description": "Filtrelenecek ay (1–12).",
            "example": 6
          },
          {
            "name": "dateFilter",
            "in": "query",
            "schema": {
              "type": "string",
              "default": "all",
              "enum": [
                "all",
                "upcoming",
                "past",
                "today",
                "active"
              ]
            },
            "description": "all: tümü; upcoming: yaklaşan; past: geçmiş; today: Türkiye yerel takvim günü; active: aktif durumlar."
          },
          {
            "name": "page",
            "in": "query",
            "schema": {
              "type": "integer",
              "format": "int32",
              "default": 1
            },
            "description": "Sayfa numarası; ilk sayfa 1.",
            "example": 1
          },
          {
            "name": "pageSize",
            "in": "query",
            "schema": {
              "type": "integer",
              "format": "int32",
              "default": 200
            },
            "description": "İstenen sayfa büyüklüğü; varsayılan 200.",
            "example": 20
          },
          {
            "name": "Accept-Language",
            "in": "header",
            "required": false,
            "description": "Yanıt dili ve X-Currency verilmediğinde varsayılan görüntüleme para birimi.",
            "schema": {
              "type": "string",
              "enum": [
                "tr-TR",
                "en-US",
                "de-DE",
                "ru-RU"
              ],
              "default": "tr-TR"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BookingResponseListApiResponse"
                },
                "examples": {
                  "bookings": {
                    "summary": "Sentetik örnek — kullanıcı rezervasyonları",
                    "description": "Gerçek müşteri, token, teklif veya fiyat içermez. Kimlikleri canlı yanıtlarla değiştirin. ",
                    "value": {
                      "success": true,
                      "message": "İşlem başarılı.",
                      "data": [
                        {
                          "transferReservationId": "f036ac14-4558-4bc5-8735-64e913d238a3",
                          "pnr": "DEMO01",
                          "userId": 100,
                          "firstName": "Demo",
                          "lastName": "Partner",
                          "userName": "partner@example.com",
                          "customerCompanyName": "Örnek Partner",
                          "isExternalSupplier": false,
                          "pickUpLocation": "İstanbul Havalimanı",
                          "pickUpLocationAddress": "İstanbul Havalimanı, Arnavutköy, İstanbul",
                          "pickUpLatitude": 41.2611,
                          "pickUpLongitude": 28.7419,
                          "dropOffLocation": "Taksim Meydanı",
                          "dropOffLocationAddress": "Taksim Meydanı, Beyoğlu, İstanbul",
                          "dropOffLatitude": 41.0369,
                          "dropOffLongitude": 28.985,
                          "pickUpTime": "2030-06-15T09:00:00Z",
                          "vehicleType": "Standart Sedan",
                          "vehicleId": null,
                          "driverUserId": null,
                          "driverFirstName": null,
                          "driverLastName": null,
                          "driverPhone": null,
                          "licensePlate": null,
                          "distanceKm": 42,
                          "duration": "45 dakika",
                          "totalNetAmount": 1000,
                          "totalVatAmount": 200,
                          "totalGrossAmount": 1200,
                          "totalExtraAmount": 0,
                          "currency": "TRY",
                          "currencySymbol": "₺",
                          "customerTotalNet": 1000,
                          "exchangeRate": 1,
                          "createdAt": "2030-06-01T08:00:00Z",
                          "flightNo": "TK1234",
                          "note": "Sentetik dokümantasyon örneği",
                          "status": 1,
                          "statusDisplay": "Yeni Transfer",
                          "isNoShow": false,
                          "operationalAttention": false,
                          "serviceIssueCode": null,
                          "passengerResponse": [
                            {
                              "firstName": "Demo",
                              "lastName": "Yolcu",
                              "phone": "+905000000000",
                              "email": "demo@example.com",
                              "isLeadPassenger": true,
                              "passengerId": 100
                            }
                          ],
                          "extraResponse": [],
                          "stops": [],
                          "paymentMethod": "OpenAccount",
                          "paymentStatus": null,
                          "paymentId": null,
                          "paymentAmount": null,
                          "paymentCurrency": null,
                          "linkedReservationId": null,
                          "linkedPnr": null,
                          "legOrder": null,
                          "transferGroupId": null
                        }
                      ],
                      "errors": null,
                      "statusCode": 200
                    }
                  },
                  "empty": {
                    "summary": "Sentetik örnek — bu sayfada kayıt yok",
                    "description": "Gerçek müşteri, token, teklif veya fiyat içermez. Kimlikleri canlı yanıtlarla değiştirin. ",
                    "value": {
                      "success": true,
                      "message": "İşlem başarılı.",
                      "data": [],
                      "errors": null,
                      "statusCode": 200
                    }
                  }
                }
              }
            }
          },
          "401": {
            "description": "Bu işlem için oturum doğrulanamadı. Hata yoluna göre gövde değişebilir; HTTP durumunu esas alın. Kimlik doğrulama katmanı gövdesiz yanıt da verebilir.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ObjectApiResponse"
                },
                "examples": {
                  "error": {
                    "summary": "Sentetik örnek — HTTP 401 hata zarfı",
                    "description": "Gerçek müşteri, token, teklif veya fiyat içermez. Kimlikleri canlı yanıtlarla değiştirin. Temsili hata yoludur; mesajlar yerelleştirilebilir ve her hatada errorCode bulunmayabilir.",
                    "value": {
                      "success": false,
                      "message": "Bu işlem için oturum doğrulanamadı.",
                      "data": null,
                      "errors": [],
                      "statusCode": 401,
                      "errorCode": "UNAUTHORIZED"
                    }
                  }
                }
              }
            }
          },
          "403": {
            "description": "Bu işlem için yetkiniz bulunmuyor. Hata yoluna göre gövde değişebilir; HTTP durumunu esas alın. Kimlik doğrulama katmanı gövdesiz yanıt da verebilir.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ObjectApiResponse"
                },
                "examples": {
                  "error": {
                    "summary": "Sentetik örnek — HTTP 403 hata zarfı",
                    "description": "Gerçek müşteri, token, teklif veya fiyat içermez. Kimlikleri canlı yanıtlarla değiştirin. Temsili hata yoludur; mesajlar yerelleştirilebilir ve her hatada errorCode bulunmayabilir.",
                    "value": {
                      "success": false,
                      "message": "Bu işlem için yetkiniz bulunmuyor.",
                      "data": null,
                      "errors": [],
                      "statusCode": 403,
                      "errorCode": "FORBIDDEN_ACCESS"
                    }
                  }
                }
              }
            }
          },
          "429": {
            "description": "Çok fazla istek gönderildi. Lütfen biraz sonra tekrar deneyin. Hata yoluna göre gövde değişebilir; HTTP durumunu esas alın.",
            "headers": {
              "Retry-After": {
                "description": "Döndüğünde yeniden denemeden önce beklenecek saniye. Her 429 yanıtında bulunmayabilir.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ObjectApiResponse"
                },
                "examples": {
                  "error": {
                    "summary": "Sentetik örnek — HTTP 429 hata zarfı",
                    "description": "Gerçek müşteri, token, teklif veya fiyat içermez. Kimlikleri canlı yanıtlarla değiştirin. Temsili hata yoludur; mesajlar yerelleştirilebilir ve her hatada errorCode bulunmayabilir.",
                    "value": {
                      "success": false,
                      "message": "Çok fazla istek gönderildi. Lütfen biraz sonra tekrar deneyin.",
                      "data": null,
                      "errors": [],
                      "statusCode": 429,
                      "errorCode": "RATE_LIMITED"
                    }
                  }
                }
              }
            }
          },
          "500": {
            "description": "İşlem sırasında bir sunucu hatası oluştu. Hata yoluna göre gövde değişebilir; HTTP durumunu esas alın.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ObjectApiResponse"
                },
                "examples": {
                  "error": {
                    "summary": "Sentetik örnek — HTTP 500 hata zarfı",
                    "description": "Gerçek müşteri, token, teklif veya fiyat içermez. Kimlikleri canlı yanıtlarla değiştirin. Temsili hata yoludur; mesajlar yerelleştirilebilir ve her hatada errorCode bulunmayabilir.",
                    "value": {
                      "success": false,
                      "message": "İşlem sırasında bir sunucu hatası oluştu.",
                      "data": null,
                      "errors": [],
                      "statusCode": 500,
                      "errorCode": "INTERNAL_SERVER_ERROR"
                    }
                  }
                }
              }
            }
          }
        },
        "operationId": "listUserBookings",
        "summary": "Kullanıcı rezervasyonlarını listele",
        "description": "Oturum açmış kullanıcıya ait rezervasyonları listeler. Yıl, ay ve tarih filtresiyle daraltılabilir. Sayfa numarası 1'den başlar; yanıtta toplam kayıt sayısı alanı bulunmaz."
      }
    },
    "/api/booking": {
      "post": {
        "tags": [
          "Rezervasyon"
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/BookingRequest"
              },
              "examples": {
                "oneWay": {
                  "summary": "Sentetik örnek — tek yön rezervasyon",
                  "description": "Gerçek müşteri, token, teklif veya fiyat içermez. Kimlikleri canlı yanıtlarla değiştirin. ",
                  "value": {
                    "itemId": "DEMO_TEKLIF_ITEM_ID",
                    "passengerCount": 1,
                    "passengerRequests": [
                      {
                        "firstName": "Demo",
                        "lastName": "Yolcu",
                        "phone": "+905000000000",
                        "email": "demo@example.com",
                        "isLeadPassenger": true
                      }
                    ],
                    "flightNo": "TK1234",
                    "note": "Sentetik dokümantasyon örneği"
                  }
                },
                "roundTrip": {
                  "summary": "Sentetik örnek — ayrı fiyatlanmış dönüş",
                  "description": "Gerçek müşteri, token, teklif veya fiyat içermez. Kimlikleri canlı yanıtlarla değiştirin. ",
                  "value": {
                    "itemId": "DEMO_TEKLIF_ITEM_ID",
                    "passengerCount": 1,
                    "passengerRequests": [
                      {
                        "firstName": "Demo",
                        "lastName": "Yolcu",
                        "phone": "+905000000000",
                        "email": "demo@example.com",
                        "isLeadPassenger": true
                      }
                    ],
                    "flightNo": "TK1234",
                    "note": "Sentetik dokümantasyon örneği",
                    "returnLeg": {
                      "itemId": "DEMO_DONUS_TEKLIF_ITEM_ID",
                      "flightNo": "TK4321",
                      "note": "Dönüş bacağı notu"
                    }
                  }
                },
                "external": {
                  "summary": "Sentetik örnek — dış teklif koşullarını kabul",
                  "description": "Gerçek müşteri, token, teklif veya fiyat içermez. Kimlikleri canlı yanıtlarla değiştirin. ",
                  "value": {
                    "itemId": "DEMO_DIS_TEKLIF_ITEM_ID",
                    "passengerCount": 1,
                    "passengerRequests": [
                      {
                        "firstName": "Demo",
                        "lastName": "Yolcu",
                        "phone": "+905000000000",
                        "email": "demo@example.com",
                        "isLeadPassenger": true
                      }
                    ],
                    "flightNo": "TK1234",
                    "note": "Sentetik dokümantasyon örneği",
                    "acceptedServiceConditionsVersion": "DEMO_KOSUL_SURUMU",
                    "externalRequirementsAcknowledged": true
                  }
                }
              }
            },
            "text/json": {
              "schema": {
                "$ref": "#/components/schemas/BookingRequest"
              },
              "examples": {
                "oneWay": {
                  "summary": "Sentetik örnek — tek yön rezervasyon",
                  "description": "Gerçek müşteri, token, teklif veya fiyat içermez. Kimlikleri canlı yanıtlarla değiştirin. ",
                  "value": {
                    "itemId": "DEMO_TEKLIF_ITEM_ID",
                    "passengerCount": 1,
                    "passengerRequests": [
                      {
                        "firstName": "Demo",
                        "lastName": "Yolcu",
                        "phone": "+905000000000",
                        "email": "demo@example.com",
                        "isLeadPassenger": true
                      }
                    ],
                    "flightNo": "TK1234",
                    "note": "Sentetik dokümantasyon örneği"
                  }
                },
                "roundTrip": {
                  "summary": "Sentetik örnek — ayrı fiyatlanmış dönüş",
                  "description": "Gerçek müşteri, token, teklif veya fiyat içermez. Kimlikleri canlı yanıtlarla değiştirin. ",
                  "value": {
                    "itemId": "DEMO_TEKLIF_ITEM_ID",
                    "passengerCount": 1,
                    "passengerRequests": [
                      {
                        "firstName": "Demo",
                        "lastName": "Yolcu",
                        "phone": "+905000000000",
                        "email": "demo@example.com",
                        "isLeadPassenger": true
                      }
                    ],
                    "flightNo": "TK1234",
                    "note": "Sentetik dokümantasyon örneği",
                    "returnLeg": {
                      "itemId": "DEMO_DONUS_TEKLIF_ITEM_ID",
                      "flightNo": "TK4321",
                      "note": "Dönüş bacağı notu"
                    }
                  }
                },
                "external": {
                  "summary": "Sentetik örnek — dış teklif koşullarını kabul",
                  "description": "Gerçek müşteri, token, teklif veya fiyat içermez. Kimlikleri canlı yanıtlarla değiştirin. ",
                  "value": {
                    "itemId": "DEMO_DIS_TEKLIF_ITEM_ID",
                    "passengerCount": 1,
                    "passengerRequests": [
                      {
                        "firstName": "Demo",
                        "lastName": "Yolcu",
                        "phone": "+905000000000",
                        "email": "demo@example.com",
                        "isLeadPassenger": true
                      }
                    ],
                    "flightNo": "TK1234",
                    "note": "Sentetik dokümantasyon örneği",
                    "acceptedServiceConditionsVersion": "DEMO_KOSUL_SURUMU",
                    "externalRequirementsAcknowledged": true
                  }
                }
              }
            },
            "application/*+json": {
              "schema": {
                "$ref": "#/components/schemas/BookingRequest"
              },
              "examples": {
                "oneWay": {
                  "summary": "Sentetik örnek — tek yön rezervasyon",
                  "description": "Gerçek müşteri, token, teklif veya fiyat içermez. Kimlikleri canlı yanıtlarla değiştirin. ",
                  "value": {
                    "itemId": "DEMO_TEKLIF_ITEM_ID",
                    "passengerCount": 1,
                    "passengerRequests": [
                      {
                        "firstName": "Demo",
                        "lastName": "Yolcu",
                        "phone": "+905000000000",
                        "email": "demo@example.com",
                        "isLeadPassenger": true
                      }
                    ],
                    "flightNo": "TK1234",
                    "note": "Sentetik dokümantasyon örneği"
                  }
                },
                "roundTrip": {
                  "summary": "Sentetik örnek — ayrı fiyatlanmış dönüş",
                  "description": "Gerçek müşteri, token, teklif veya fiyat içermez. Kimlikleri canlı yanıtlarla değiştirin. ",
                  "value": {
                    "itemId": "DEMO_TEKLIF_ITEM_ID",
                    "passengerCount": 1,
                    "passengerRequests": [
                      {
                        "firstName": "Demo",
                        "lastName": "Yolcu",
                        "phone": "+905000000000",
                        "email": "demo@example.com",
                        "isLeadPassenger": true
                      }
                    ],
                    "flightNo": "TK1234",
                    "note": "Sentetik dokümantasyon örneği",
                    "returnLeg": {
                      "itemId": "DEMO_DONUS_TEKLIF_ITEM_ID",
                      "flightNo": "TK4321",
                      "note": "Dönüş bacağı notu"
                    }
                  }
                },
                "external": {
                  "summary": "Sentetik örnek — dış teklif koşullarını kabul",
                  "description": "Gerçek müşteri, token, teklif veya fiyat içermez. Kimlikleri canlı yanıtlarla değiştirin. ",
                  "value": {
                    "itemId": "DEMO_DIS_TEKLIF_ITEM_ID",
                    "passengerCount": 1,
                    "passengerRequests": [
                      {
                        "firstName": "Demo",
                        "lastName": "Yolcu",
                        "phone": "+905000000000",
                        "email": "demo@example.com",
                        "isLeadPassenger": true
                      }
                    ],
                    "flightNo": "TK1234",
                    "note": "Sentetik dokümantasyon örneği",
                    "acceptedServiceConditionsVersion": "DEMO_KOSUL_SURUMU",
                    "externalRequirementsAcknowledged": true
                  }
                }
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "description": "İşlem başarılı.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BookingCreatedResponseApiResponse"
                },
                "examples": {
                  "oneWay": {
                    "summary": "Sentetik örnek — tek yön oluşturuldu",
                    "description": "Gerçek müşteri, token, teklif veya fiyat içermez. Kimlikleri canlı yanıtlarla değiştirin. ",
                    "value": {
                      "success": true,
                      "message": "İşlem başarılı.",
                      "data": {
                        "transferReservationId": "f036ac14-4558-4bc5-8735-64e913d238a3",
                        "pnr": "DEMO01",
                        "failedWaypoints": null,
                        "returnReservationId": null,
                        "returnPnr": null
                      },
                      "errors": null,
                      "statusCode": 200
                    }
                  },
                  "roundTrip": {
                    "summary": "Sentetik örnek — çift yön oluşturuldu",
                    "description": "Gerçek müşteri, token, teklif veya fiyat içermez. Kimlikleri canlı yanıtlarla değiştirin. ",
                    "value": {
                      "success": true,
                      "message": "İşlem başarılı.",
                      "data": {
                        "transferReservationId": "f036ac14-4558-4bc5-8735-64e913d238a3",
                        "pnr": "DEMO01",
                        "failedWaypoints": null,
                        "returnReservationId": "4a665abb-3ccf-49f5-85ce-6e9c4f4a92ed",
                        "returnPnr": "DEMO02"
                      },
                      "errors": null,
                      "statusCode": 200
                    }
                  }
                }
              }
            }
          },
          "400": {
            "description": "İstek bilgileri geçerli değil. Hata yoluna göre gövde değişebilir; HTTP durumunu esas alın.",
            "content": {
              "application/json": {
                "schema": {
                  "anyOf": [
                    {
                      "$ref": "#/components/schemas/ProblemDetails"
                    },
                    {
                      "$ref": "#/components/schemas/ObjectApiResponse"
                    }
                  ]
                },
                "examples": {
                  "error": {
                    "summary": "Sentetik örnek — HTTP 400 hata zarfı",
                    "description": "Gerçek müşteri, token, teklif veya fiyat içermez. Kimlikleri canlı yanıtlarla değiştirin. Temsili hata yoludur; mesajlar yerelleştirilebilir ve her hatada errorCode bulunmayabilir.",
                    "value": {
                      "success": false,
                      "message": "İstek bilgileri geçerli değil.",
                      "data": null,
                      "errors": [
                        "Gönderilen alanları kontrol edin."
                      ],
                      "statusCode": 400
                    }
                  }
                }
              }
            }
          },
          "401": {
            "description": "Bu işlem için oturum doğrulanamadı. Hata yoluna göre gövde değişebilir; HTTP durumunu esas alın. Kimlik doğrulama katmanı gövdesiz yanıt da verebilir.",
            "content": {
              "application/json": {
                "schema": {
                  "anyOf": [
                    {
                      "$ref": "#/components/schemas/ProblemDetails"
                    },
                    {
                      "$ref": "#/components/schemas/ObjectApiResponse"
                    }
                  ]
                },
                "examples": {
                  "error": {
                    "summary": "Sentetik örnek — HTTP 401 hata zarfı",
                    "description": "Gerçek müşteri, token, teklif veya fiyat içermez. Kimlikleri canlı yanıtlarla değiştirin. Temsili hata yoludur; mesajlar yerelleştirilebilir ve her hatada errorCode bulunmayabilir.",
                    "value": {
                      "success": false,
                      "message": "Bu işlem için oturum doğrulanamadı.",
                      "data": null,
                      "errors": [],
                      "statusCode": 401,
                      "errorCode": "UNAUTHORIZED"
                    }
                  }
                }
              }
            }
          },
          "403": {
            "description": "Bu işlem için yetkiniz bulunmuyor. Hata yoluna göre gövde değişebilir; HTTP durumunu esas alın. Kimlik doğrulama katmanı gövdesiz yanıt da verebilir.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ObjectApiResponse"
                },
                "examples": {
                  "error": {
                    "summary": "Sentetik örnek — HTTP 403 hata zarfı",
                    "description": "Gerçek müşteri, token, teklif veya fiyat içermez. Kimlikleri canlı yanıtlarla değiştirin. Temsili hata yoludur; mesajlar yerelleştirilebilir ve her hatada errorCode bulunmayabilir.",
                    "value": {
                      "success": false,
                      "message": "Bu işlem için yetkiniz bulunmuyor.",
                      "data": null,
                      "errors": [],
                      "statusCode": 403,
                      "errorCode": "FORBIDDEN_ACCESS"
                    }
                  }
                }
              }
            }
          },
          "410": {
            "description": "Teklif artık kullanılamıyor. Müsaitlik aramasını yenileyin. Hata yoluna göre gövde değişebilir; HTTP durumunu esas alın.",
            "content": {
              "application/json": {
                "schema": {
                  "anyOf": [
                    {
                      "$ref": "#/components/schemas/ProblemDetails"
                    },
                    {
                      "$ref": "#/components/schemas/ObjectApiResponse"
                    }
                  ]
                },
                "examples": {
                  "error": {
                    "summary": "Sentetik örnek — HTTP 410 hata zarfı",
                    "description": "Gerçek müşteri, token, teklif veya fiyat içermez. Kimlikleri canlı yanıtlarla değiştirin. Temsili hata yoludur; mesajlar yerelleştirilebilir ve her hatada errorCode bulunmayabilir.",
                    "value": {
                      "success": false,
                      "message": "Teklif artık kullanılamıyor. Müsaitlik aramasını yenileyin.",
                      "data": null,
                      "errors": [],
                      "statusCode": 410,
                      "errorCode": "RESOURCE_GONE"
                    }
                  }
                }
              }
            }
          },
          "429": {
            "description": "Çok fazla istek gönderildi. Lütfen biraz sonra tekrar deneyin. Hata yoluna göre gövde değişebilir; HTTP durumunu esas alın.",
            "headers": {
              "Retry-After": {
                "description": "Döndüğünde yeniden denemeden önce beklenecek saniye. Her 429 yanıtında bulunmayabilir.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ObjectApiResponse"
                },
                "examples": {
                  "error": {
                    "summary": "Sentetik örnek — HTTP 429 hata zarfı",
                    "description": "Gerçek müşteri, token, teklif veya fiyat içermez. Kimlikleri canlı yanıtlarla değiştirin. Temsili hata yoludur; mesajlar yerelleştirilebilir ve her hatada errorCode bulunmayabilir.",
                    "value": {
                      "success": false,
                      "message": "Çok fazla istek gönderildi. Lütfen biraz sonra tekrar deneyin.",
                      "data": null,
                      "errors": [],
                      "statusCode": 429,
                      "errorCode": "RATE_LIMITED"
                    }
                  }
                }
              }
            }
          },
          "500": {
            "description": "İşlem sırasında bir sunucu hatası oluştu. Hata yoluna göre gövde değişebilir; HTTP durumunu esas alın.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ObjectApiResponse"
                },
                "examples": {
                  "error": {
                    "summary": "Sentetik örnek — HTTP 500 hata zarfı",
                    "description": "Gerçek müşteri, token, teklif veya fiyat içermez. Kimlikleri canlı yanıtlarla değiştirin. Temsili hata yoludur; mesajlar yerelleştirilebilir ve her hatada errorCode bulunmayabilir.",
                    "value": {
                      "success": false,
                      "message": "İşlem sırasında bir sunucu hatası oluştu.",
                      "data": null,
                      "errors": [],
                      "statusCode": 500,
                      "errorCode": "INTERNAL_SERVER_ERROR"
                    }
                  }
                }
              }
            }
          }
        },
        "operationId": "createBooking",
        "summary": "Rezervasyon oluştur",
        "description": "Seçilen itemId ve yolcu bilgileriyle rezervasyon oluşturur. Her yeni rezervasyon niyeti için benzersiz Idempotency-Key gönderin; aynı isteğin tekrarında aynı anahtarı koruyun. Başarılı yanıt HTTP 200'dür.",
        "parameters": [
          {
            "name": "Accept-Language",
            "in": "header",
            "required": false,
            "description": "Yanıt dili ve X-Currency verilmediğinde varsayılan görüntüleme para birimi.",
            "schema": {
              "type": "string",
              "enum": [
                "tr-TR",
                "en-US",
                "de-DE",
                "ru-RU"
              ],
              "default": "tr-TR"
            }
          },
          {
            "name": "X-Currency",
            "in": "header",
            "required": false,
            "description": "Görüntüleme para birimi. Desteklenen değerler dil varsayılanını geçersiz kılar.",
            "schema": {
              "type": "string",
              "enum": [
                "TRY",
                "EUR",
                "USD",
                "RUB"
              ]
            }
          },
          {
            "name": "Idempotency-Key",
            "in": "header",
            "required": false,
            "description": "Yeni rezervasyon için benzersiz anahtar. Aynı isteğin ağ hatası sonrası tekrarında aynı anahtarı kullanın; başka rezervasyonda tekrar kullanmayın.",
            "schema": {
              "type": "string"
            },
            "example": "88709931-780b-4a11-ae3d-d1d370263de5"
          }
        ]
      },
      "get": {
        "tags": [
          "Rezervasyon"
        ],
        "parameters": [
          {
            "name": "year",
            "in": "query",
            "schema": {
              "type": "integer",
              "format": "int32"
            },
            "description": "Filtrelenecek yıl.",
            "example": 2030
          },
          {
            "name": "month",
            "in": "query",
            "schema": {
              "type": "integer",
              "format": "int32"
            },
            "description": "Filtrelenecek ay (1–12).",
            "example": 6
          },
          {
            "name": "dateFilter",
            "in": "query",
            "schema": {
              "type": "string",
              "default": "all",
              "enum": [
                "all",
                "upcoming",
                "past",
                "today",
                "active"
              ]
            },
            "description": "all: tümü; upcoming: yaklaşan; past: geçmiş; today: Türkiye yerel takvim günü; active: aktif durumlar."
          },
          {
            "name": "page",
            "in": "query",
            "schema": {
              "type": "integer",
              "format": "int32",
              "default": 1
            },
            "description": "Sayfa numarası; ilk sayfa 1.",
            "example": 1
          },
          {
            "name": "pageSize",
            "in": "query",
            "schema": {
              "type": "integer",
              "format": "int32",
              "default": 200
            },
            "description": "İstenen sayfa büyüklüğü; varsayılan 200.",
            "example": 20
          },
          {
            "name": "Accept-Language",
            "in": "header",
            "required": false,
            "description": "Yanıt dili ve X-Currency verilmediğinde varsayılan görüntüleme para birimi.",
            "schema": {
              "type": "string",
              "enum": [
                "tr-TR",
                "en-US",
                "de-DE",
                "ru-RU"
              ],
              "default": "tr-TR"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BookingResponseListApiResponse"
                },
                "examples": {
                  "bookings": {
                    "summary": "Sentetik örnek — kullanıcı kapsamındaki rezervasyonlar",
                    "description": "Gerçek müşteri, token, teklif veya fiyat içermez. Kimlikleri canlı yanıtlarla değiştirin. ",
                    "value": {
                      "success": true,
                      "message": "İşlem başarılı.",
                      "data": [
                        {
                          "transferReservationId": "f036ac14-4558-4bc5-8735-64e913d238a3",
                          "pnr": "DEMO01",
                          "userId": 100,
                          "firstName": "Demo",
                          "lastName": "Partner",
                          "userName": "partner@example.com",
                          "customerCompanyName": "Örnek Partner",
                          "isExternalSupplier": false,
                          "pickUpLocation": "İstanbul Havalimanı",
                          "pickUpLocationAddress": "İstanbul Havalimanı, Arnavutköy, İstanbul",
                          "pickUpLatitude": 41.2611,
                          "pickUpLongitude": 28.7419,
                          "dropOffLocation": "Taksim Meydanı",
                          "dropOffLocationAddress": "Taksim Meydanı, Beyoğlu, İstanbul",
                          "dropOffLatitude": 41.0369,
                          "dropOffLongitude": 28.985,
                          "pickUpTime": "2030-06-15T09:00:00Z",
                          "vehicleType": "Standart Sedan",
                          "vehicleId": null,
                          "driverUserId": null,
                          "driverFirstName": null,
                          "driverLastName": null,
                          "driverPhone": null,
                          "licensePlate": null,
                          "distanceKm": 42,
                          "duration": "45 dakika",
                          "totalNetAmount": 1000,
                          "totalVatAmount": 200,
                          "totalGrossAmount": 1200,
                          "totalExtraAmount": 0,
                          "currency": "TRY",
                          "currencySymbol": "₺",
                          "customerTotalNet": 1000,
                          "exchangeRate": 1,
                          "createdAt": "2030-06-01T08:00:00Z",
                          "flightNo": "TK1234",
                          "note": "Sentetik dokümantasyon örneği",
                          "status": 1,
                          "statusDisplay": "Yeni Transfer",
                          "isNoShow": false,
                          "operationalAttention": false,
                          "serviceIssueCode": null,
                          "passengerResponse": [
                            {
                              "firstName": "Demo",
                              "lastName": "Yolcu",
                              "phone": "+905000000000",
                              "email": "demo@example.com",
                              "isLeadPassenger": true,
                              "passengerId": 100
                            }
                          ],
                          "extraResponse": [],
                          "stops": [],
                          "paymentMethod": "OpenAccount",
                          "paymentStatus": null,
                          "paymentId": null,
                          "paymentAmount": null,
                          "paymentCurrency": null,
                          "linkedReservationId": null,
                          "linkedPnr": null,
                          "legOrder": null,
                          "transferGroupId": null
                        }
                      ],
                      "errors": null,
                      "statusCode": 200
                    }
                  },
                  "empty": {
                    "summary": "Sentetik örnek — bu sayfada kayıt yok",
                    "description": "Gerçek müşteri, token, teklif veya fiyat içermez. Kimlikleri canlı yanıtlarla değiştirin. ",
                    "value": {
                      "success": true,
                      "message": "İşlem başarılı.",
                      "data": [],
                      "errors": null,
                      "statusCode": 200
                    }
                  }
                }
              }
            }
          },
          "401": {
            "description": "Bu işlem için oturum doğrulanamadı. Hata yoluna göre gövde değişebilir; HTTP durumunu esas alın. Kimlik doğrulama katmanı gövdesiz yanıt da verebilir.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ObjectApiResponse"
                },
                "examples": {
                  "error": {
                    "summary": "Sentetik örnek — HTTP 401 hata zarfı",
                    "description": "Gerçek müşteri, token, teklif veya fiyat içermez. Kimlikleri canlı yanıtlarla değiştirin. Temsili hata yoludur; mesajlar yerelleştirilebilir ve her hatada errorCode bulunmayabilir.",
                    "value": {
                      "success": false,
                      "message": "Bu işlem için oturum doğrulanamadı.",
                      "data": null,
                      "errors": [],
                      "statusCode": 401,
                      "errorCode": "UNAUTHORIZED"
                    }
                  }
                }
              }
            }
          },
          "403": {
            "description": "Bu işlem için yetkiniz bulunmuyor. Hata yoluna göre gövde değişebilir; HTTP durumunu esas alın. Kimlik doğrulama katmanı gövdesiz yanıt da verebilir.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ObjectApiResponse"
                },
                "examples": {
                  "error": {
                    "summary": "Sentetik örnek — HTTP 403 hata zarfı",
                    "description": "Gerçek müşteri, token, teklif veya fiyat içermez. Kimlikleri canlı yanıtlarla değiştirin. Temsili hata yoludur; mesajlar yerelleştirilebilir ve her hatada errorCode bulunmayabilir.",
                    "value": {
                      "success": false,
                      "message": "Bu işlem için yetkiniz bulunmuyor.",
                      "data": null,
                      "errors": [],
                      "statusCode": 403,
                      "errorCode": "FORBIDDEN_ACCESS"
                    }
                  }
                }
              }
            }
          },
          "429": {
            "description": "Çok fazla istek gönderildi. Lütfen biraz sonra tekrar deneyin. Hata yoluna göre gövde değişebilir; HTTP durumunu esas alın.",
            "headers": {
              "Retry-After": {
                "description": "Döndüğünde yeniden denemeden önce beklenecek saniye. Her 429 yanıtında bulunmayabilir.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ObjectApiResponse"
                },
                "examples": {
                  "error": {
                    "summary": "Sentetik örnek — HTTP 429 hata zarfı",
                    "description": "Gerçek müşteri, token, teklif veya fiyat içermez. Kimlikleri canlı yanıtlarla değiştirin. Temsili hata yoludur; mesajlar yerelleştirilebilir ve her hatada errorCode bulunmayabilir.",
                    "value": {
                      "success": false,
                      "message": "Çok fazla istek gönderildi. Lütfen biraz sonra tekrar deneyin.",
                      "data": null,
                      "errors": [],
                      "statusCode": 429,
                      "errorCode": "RATE_LIMITED"
                    }
                  }
                }
              }
            }
          },
          "500": {
            "description": "İşlem sırasında bir sunucu hatası oluştu. Hata yoluna göre gövde değişebilir; HTTP durumunu esas alın.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ObjectApiResponse"
                },
                "examples": {
                  "error": {
                    "summary": "Sentetik örnek — HTTP 500 hata zarfı",
                    "description": "Gerçek müşteri, token, teklif veya fiyat içermez. Kimlikleri canlı yanıtlarla değiştirin. Temsili hata yoludur; mesajlar yerelleştirilebilir ve her hatada errorCode bulunmayabilir.",
                    "value": {
                      "success": false,
                      "message": "İşlem sırasında bir sunucu hatası oluştu.",
                      "data": null,
                      "errors": [],
                      "statusCode": 500,
                      "errorCode": "INTERNAL_SERVER_ERROR"
                    }
                  }
                }
              }
            }
          }
        },
        "operationId": "listBookings",
        "summary": "Rezervasyonları listele",
        "description": "Oturum açmış kullanıcının rezervasyonlarını getirir; /api/booking/user ile eşdeğer kullanıcı kapsamındadır. Şirketin bütün rezervasyonlarını döndürdüğü varsayılmamalıdır."
      }
    },
    "/api/booking/{id}": {
      "get": {
        "tags": [
          "Rezervasyon"
        ],
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            },
            "description": "Rezervasyonun GUID kimliği (transferReservationId).",
            "example": "f036ac14-4558-4bc5-8735-64e913d238a3"
          },
          {
            "name": "Accept-Language",
            "in": "header",
            "required": false,
            "description": "Yanıt dili ve X-Currency verilmediğinde varsayılan görüntüleme para birimi.",
            "schema": {
              "type": "string",
              "enum": [
                "tr-TR",
                "en-US",
                "de-DE",
                "ru-RU"
              ],
              "default": "tr-TR"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BookingResponseApiResponse"
                },
                "examples": {
                  "booking": {
                    "summary": "Sentetik örnek — henüz sürücü atanmamış rezervasyon",
                    "description": "Gerçek müşteri, token, teklif veya fiyat içermez. Kimlikleri canlı yanıtlarla değiştirin. ",
                    "value": {
                      "success": true,
                      "message": "İşlem başarılı.",
                      "data": {
                        "transferReservationId": "f036ac14-4558-4bc5-8735-64e913d238a3",
                        "pnr": "DEMO01",
                        "userId": 100,
                        "firstName": "Demo",
                        "lastName": "Partner",
                        "userName": "partner@example.com",
                        "customerCompanyName": "Örnek Partner",
                        "isExternalSupplier": false,
                        "pickUpLocation": "İstanbul Havalimanı",
                        "pickUpLocationAddress": "İstanbul Havalimanı, Arnavutköy, İstanbul",
                        "pickUpLatitude": 41.2611,
                        "pickUpLongitude": 28.7419,
                        "dropOffLocation": "Taksim Meydanı",
                        "dropOffLocationAddress": "Taksim Meydanı, Beyoğlu, İstanbul",
                        "dropOffLatitude": 41.0369,
                        "dropOffLongitude": 28.985,
                        "pickUpTime": "2030-06-15T09:00:00Z",
                        "vehicleType": "Standart Sedan",
                        "vehicleId": null,
                        "driverUserId": null,
                        "driverFirstName": null,
                        "driverLastName": null,
                        "driverPhone": null,
                        "licensePlate": null,
                        "distanceKm": 42,
                        "duration": "45 dakika",
                        "totalNetAmount": 1000,
                        "totalVatAmount": 200,
                        "totalGrossAmount": 1200,
                        "totalExtraAmount": 0,
                        "currency": "TRY",
                        "currencySymbol": "₺",
                        "customerTotalNet": 1000,
                        "exchangeRate": 1,
                        "createdAt": "2030-06-01T08:00:00Z",
                        "flightNo": "TK1234",
                        "note": "Sentetik dokümantasyon örneği",
                        "status": 1,
                        "statusDisplay": "Yeni Transfer",
                        "isNoShow": false,
                        "operationalAttention": false,
                        "serviceIssueCode": null,
                        "passengerResponse": [
                          {
                            "firstName": "Demo",
                            "lastName": "Yolcu",
                            "phone": "+905000000000",
                            "email": "demo@example.com",
                            "isLeadPassenger": true,
                            "passengerId": 100
                          }
                        ],
                        "extraResponse": [],
                        "stops": [],
                        "paymentMethod": "OpenAccount",
                        "paymentStatus": null,
                        "paymentId": null,
                        "paymentAmount": null,
                        "paymentCurrency": null,
                        "linkedReservationId": null,
                        "linkedPnr": null,
                        "legOrder": null,
                        "transferGroupId": null
                      },
                      "errors": null,
                      "statusCode": 200
                    }
                  }
                }
              }
            }
          },
          "401": {
            "description": "Bu işlem için oturum doğrulanamadı. Hata yoluna göre gövde değişebilir; HTTP durumunu esas alın. Kimlik doğrulama katmanı gövdesiz yanıt da verebilir.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ObjectApiResponse"
                },
                "examples": {
                  "error": {
                    "summary": "Sentetik örnek — HTTP 401 hata zarfı",
                    "description": "Gerçek müşteri, token, teklif veya fiyat içermez. Kimlikleri canlı yanıtlarla değiştirin. Temsili hata yoludur; mesajlar yerelleştirilebilir ve her hatada errorCode bulunmayabilir.",
                    "value": {
                      "success": false,
                      "message": "Bu işlem için oturum doğrulanamadı.",
                      "data": null,
                      "errors": [],
                      "statusCode": 401,
                      "errorCode": "UNAUTHORIZED"
                    }
                  }
                }
              }
            }
          },
          "403": {
            "description": "Bu işlem için yetkiniz bulunmuyor. Hata yoluna göre gövde değişebilir; HTTP durumunu esas alın. Kimlik doğrulama katmanı gövdesiz yanıt da verebilir.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ObjectApiResponse"
                },
                "examples": {
                  "error": {
                    "summary": "Sentetik örnek — HTTP 403 hata zarfı",
                    "description": "Gerçek müşteri, token, teklif veya fiyat içermez. Kimlikleri canlı yanıtlarla değiştirin. Temsili hata yoludur; mesajlar yerelleştirilebilir ve her hatada errorCode bulunmayabilir.",
                    "value": {
                      "success": false,
                      "message": "Bu işlem için yetkiniz bulunmuyor.",
                      "data": null,
                      "errors": [],
                      "statusCode": 403,
                      "errorCode": "FORBIDDEN_ACCESS"
                    }
                  }
                }
              }
            }
          },
          "404": {
            "description": "Kaynak bulunamadı. Hata yoluna göre gövde değişebilir; HTTP durumunu esas alın.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ObjectApiResponse"
                },
                "examples": {
                  "error": {
                    "summary": "Sentetik örnek — HTTP 404 hata zarfı",
                    "description": "Gerçek müşteri, token, teklif veya fiyat içermez. Kimlikleri canlı yanıtlarla değiştirin. Temsili hata yoludur; mesajlar yerelleştirilebilir ve her hatada errorCode bulunmayabilir.",
                    "value": {
                      "success": false,
                      "message": "Kaynak bulunamadı.",
                      "data": null,
                      "errors": [],
                      "statusCode": 404,
                      "errorCode": "RESOURCE_NOT_FOUND"
                    }
                  }
                }
              }
            }
          },
          "429": {
            "description": "Çok fazla istek gönderildi. Lütfen biraz sonra tekrar deneyin. Hata yoluna göre gövde değişebilir; HTTP durumunu esas alın.",
            "headers": {
              "Retry-After": {
                "description": "Döndüğünde yeniden denemeden önce beklenecek saniye. Her 429 yanıtında bulunmayabilir.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ObjectApiResponse"
                },
                "examples": {
                  "error": {
                    "summary": "Sentetik örnek — HTTP 429 hata zarfı",
                    "description": "Gerçek müşteri, token, teklif veya fiyat içermez. Kimlikleri canlı yanıtlarla değiştirin. Temsili hata yoludur; mesajlar yerelleştirilebilir ve her hatada errorCode bulunmayabilir.",
                    "value": {
                      "success": false,
                      "message": "Çok fazla istek gönderildi. Lütfen biraz sonra tekrar deneyin.",
                      "data": null,
                      "errors": [],
                      "statusCode": 429,
                      "errorCode": "RATE_LIMITED"
                    }
                  }
                }
              }
            }
          },
          "500": {
            "description": "İşlem sırasında bir sunucu hatası oluştu. Hata yoluna göre gövde değişebilir; HTTP durumunu esas alın.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ObjectApiResponse"
                },
                "examples": {
                  "error": {
                    "summary": "Sentetik örnek — HTTP 500 hata zarfı",
                    "description": "Gerçek müşteri, token, teklif veya fiyat içermez. Kimlikleri canlı yanıtlarla değiştirin. Temsili hata yoludur; mesajlar yerelleştirilebilir ve her hatada errorCode bulunmayabilir.",
                    "value": {
                      "success": false,
                      "message": "İşlem sırasında bir sunucu hatası oluştu.",
                      "data": null,
                      "errors": [],
                      "statusCode": 500,
                      "errorCode": "INTERNAL_SERVER_ERROR"
                    }
                  }
                }
              }
            }
          }
        },
        "operationId": "getBooking",
        "summary": "Rezervasyon detayını getir",
        "description": "Rezervasyon kimliğiyle detayları getirir. id alanında oluşturma yanıtındaki transferReservationId kullanılır; PNR kullanılmaz."
      },
      "put": {
        "tags": [
          "Rezervasyon"
        ],
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            },
            "description": "Rezervasyonun GUID kimliği (transferReservationId).",
            "example": "f036ac14-4558-4bc5-8735-64e913d238a3"
          },
          {
            "name": "Accept-Language",
            "in": "header",
            "required": false,
            "description": "Yanıt dili ve X-Currency verilmediğinde varsayılan görüntüleme para birimi.",
            "schema": {
              "type": "string",
              "enum": [
                "tr-TR",
                "en-US",
                "de-DE",
                "ru-RU"
              ],
              "default": "tr-TR"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/UpdateBookingRequest"
              },
              "examples": {
                "note": {
                  "summary": "Sentetik örnek — yalnız notu değiştir",
                  "description": "Gerçek müşteri, token, teklif veya fiyat içermez. Kimlikleri canlı yanıtlarla değiştirin. ",
                  "value": {
                    "note": "Karşılama tabelasında DEMO yazsın."
                  }
                },
                "clear": {
                  "summary": "Sentetik örnek — uçuş numarası ve notu sil",
                  "description": "Gerçek müşteri, token, teklif veya fiyat içermez. Kimlikleri canlı yanıtlarla değiştirin. ",
                  "value": {
                    "clearFlightNo": true,
                    "clearNote": true
                  }
                },
                "time": {
                  "summary": "Sentetik örnek — alış anını değiştir",
                  "description": "Gerçek müşteri, token, teklif veya fiyat içermez. Kimlikleri canlı yanıtlarla değiştirin. Rezervasyonun durum ve tedarikçi koşulları uygun olmalıdır.",
                  "value": {
                    "pickUpTime": "2030-06-15T10:00:00Z"
                  }
                }
              }
            },
            "text/json": {
              "schema": {
                "$ref": "#/components/schemas/UpdateBookingRequest"
              },
              "examples": {
                "note": {
                  "summary": "Sentetik örnek — yalnız notu değiştir",
                  "description": "Gerçek müşteri, token, teklif veya fiyat içermez. Kimlikleri canlı yanıtlarla değiştirin. ",
                  "value": {
                    "note": "Karşılama tabelasında DEMO yazsın."
                  }
                },
                "clear": {
                  "summary": "Sentetik örnek — uçuş numarası ve notu sil",
                  "description": "Gerçek müşteri, token, teklif veya fiyat içermez. Kimlikleri canlı yanıtlarla değiştirin. ",
                  "value": {
                    "clearFlightNo": true,
                    "clearNote": true
                  }
                },
                "time": {
                  "summary": "Sentetik örnek — alış anını değiştir",
                  "description": "Gerçek müşteri, token, teklif veya fiyat içermez. Kimlikleri canlı yanıtlarla değiştirin. Rezervasyonun durum ve tedarikçi koşulları uygun olmalıdır.",
                  "value": {
                    "pickUpTime": "2030-06-15T10:00:00Z"
                  }
                }
              }
            },
            "application/*+json": {
              "schema": {
                "$ref": "#/components/schemas/UpdateBookingRequest"
              },
              "examples": {
                "note": {
                  "summary": "Sentetik örnek — yalnız notu değiştir",
                  "description": "Gerçek müşteri, token, teklif veya fiyat içermez. Kimlikleri canlı yanıtlarla değiştirin. ",
                  "value": {
                    "note": "Karşılama tabelasında DEMO yazsın."
                  }
                },
                "clear": {
                  "summary": "Sentetik örnek — uçuş numarası ve notu sil",
                  "description": "Gerçek müşteri, token, teklif veya fiyat içermez. Kimlikleri canlı yanıtlarla değiştirin. ",
                  "value": {
                    "clearFlightNo": true,
                    "clearNote": true
                  }
                },
                "time": {
                  "summary": "Sentetik örnek — alış anını değiştir",
                  "description": "Gerçek müşteri, token, teklif veya fiyat içermez. Kimlikleri canlı yanıtlarla değiştirin. Rezervasyonun durum ve tedarikçi koşulları uygun olmalıdır.",
                  "value": {
                    "pickUpTime": "2030-06-15T10:00:00Z"
                  }
                }
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BookingResponseApiResponse"
                },
                "examples": {
                  "updated": {
                    "summary": "Sentetik örnek — notu güncellenmiş rezervasyon",
                    "description": "Gerçek müşteri, token, teklif veya fiyat içermez. Kimlikleri canlı yanıtlarla değiştirin. ",
                    "value": {
                      "success": true,
                      "message": "İşlem başarılı.",
                      "data": {
                        "transferReservationId": "f036ac14-4558-4bc5-8735-64e913d238a3",
                        "pnr": "DEMO01",
                        "userId": 100,
                        "firstName": "Demo",
                        "lastName": "Partner",
                        "userName": "partner@example.com",
                        "customerCompanyName": "Örnek Partner",
                        "isExternalSupplier": false,
                        "pickUpLocation": "İstanbul Havalimanı",
                        "pickUpLocationAddress": "İstanbul Havalimanı, Arnavutköy, İstanbul",
                        "pickUpLatitude": 41.2611,
                        "pickUpLongitude": 28.7419,
                        "dropOffLocation": "Taksim Meydanı",
                        "dropOffLocationAddress": "Taksim Meydanı, Beyoğlu, İstanbul",
                        "dropOffLatitude": 41.0369,
                        "dropOffLongitude": 28.985,
                        "pickUpTime": "2030-06-15T09:00:00Z",
                        "vehicleType": "Standart Sedan",
                        "vehicleId": null,
                        "driverUserId": null,
                        "driverFirstName": null,
                        "driverLastName": null,
                        "driverPhone": null,
                        "licensePlate": null,
                        "distanceKm": 42,
                        "duration": "45 dakika",
                        "totalNetAmount": 1000,
                        "totalVatAmount": 200,
                        "totalGrossAmount": 1200,
                        "totalExtraAmount": 0,
                        "currency": "TRY",
                        "currencySymbol": "₺",
                        "customerTotalNet": 1000,
                        "exchangeRate": 1,
                        "createdAt": "2030-06-01T08:00:00Z",
                        "flightNo": "TK1234",
                        "note": "Karşılama tabelasında DEMO yazsın.",
                        "status": 1,
                        "statusDisplay": "Yeni Transfer",
                        "isNoShow": false,
                        "operationalAttention": false,
                        "serviceIssueCode": null,
                        "passengerResponse": [
                          {
                            "firstName": "Demo",
                            "lastName": "Yolcu",
                            "phone": "+905000000000",
                            "email": "demo@example.com",
                            "isLeadPassenger": true,
                            "passengerId": 100
                          }
                        ],
                        "extraResponse": [],
                        "stops": [],
                        "paymentMethod": "OpenAccount",
                        "paymentStatus": null,
                        "paymentId": null,
                        "paymentAmount": null,
                        "paymentCurrency": null,
                        "linkedReservationId": null,
                        "linkedPnr": null,
                        "legOrder": null,
                        "transferGroupId": null
                      },
                      "errors": null,
                      "statusCode": 200
                    }
                  }
                }
              }
            }
          },
          "400": {
            "description": "İstek bilgileri geçerli değil. Hata yoluna göre gövde değişebilir; HTTP durumunu esas alın.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ObjectApiResponse"
                },
                "examples": {
                  "error": {
                    "summary": "Sentetik örnek — HTTP 400 hata zarfı",
                    "description": "Gerçek müşteri, token, teklif veya fiyat içermez. Kimlikleri canlı yanıtlarla değiştirin. Temsili hata yoludur; mesajlar yerelleştirilebilir ve her hatada errorCode bulunmayabilir.",
                    "value": {
                      "success": false,
                      "message": "İstek bilgileri geçerli değil.",
                      "data": null,
                      "errors": [
                        "Gönderilen alanları kontrol edin."
                      ],
                      "statusCode": 400
                    }
                  }
                }
              }
            }
          },
          "401": {
            "description": "Bu işlem için oturum doğrulanamadı. Hata yoluna göre gövde değişebilir; HTTP durumunu esas alın. Kimlik doğrulama katmanı gövdesiz yanıt da verebilir.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ObjectApiResponse"
                },
                "examples": {
                  "error": {
                    "summary": "Sentetik örnek — HTTP 401 hata zarfı",
                    "description": "Gerçek müşteri, token, teklif veya fiyat içermez. Kimlikleri canlı yanıtlarla değiştirin. Temsili hata yoludur; mesajlar yerelleştirilebilir ve her hatada errorCode bulunmayabilir.",
                    "value": {
                      "success": false,
                      "message": "Bu işlem için oturum doğrulanamadı.",
                      "data": null,
                      "errors": [],
                      "statusCode": 401,
                      "errorCode": "UNAUTHORIZED"
                    }
                  }
                }
              }
            }
          },
          "403": {
            "description": "Bu işlem için yetkiniz bulunmuyor. Hata yoluna göre gövde değişebilir; HTTP durumunu esas alın. Kimlik doğrulama katmanı gövdesiz yanıt da verebilir.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ObjectApiResponse"
                },
                "examples": {
                  "error": {
                    "summary": "Sentetik örnek — HTTP 403 hata zarfı",
                    "description": "Gerçek müşteri, token, teklif veya fiyat içermez. Kimlikleri canlı yanıtlarla değiştirin. Temsili hata yoludur; mesajlar yerelleştirilebilir ve her hatada errorCode bulunmayabilir.",
                    "value": {
                      "success": false,
                      "message": "Bu işlem için yetkiniz bulunmuyor.",
                      "data": null,
                      "errors": [],
                      "statusCode": 403,
                      "errorCode": "FORBIDDEN_ACCESS"
                    }
                  }
                }
              }
            }
          },
          "404": {
            "description": "Kaynak bulunamadı. Hata yoluna göre gövde değişebilir; HTTP durumunu esas alın.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ObjectApiResponse"
                },
                "examples": {
                  "error": {
                    "summary": "Sentetik örnek — HTTP 404 hata zarfı",
                    "description": "Gerçek müşteri, token, teklif veya fiyat içermez. Kimlikleri canlı yanıtlarla değiştirin. Temsili hata yoludur; mesajlar yerelleştirilebilir ve her hatada errorCode bulunmayabilir.",
                    "value": {
                      "success": false,
                      "message": "Kaynak bulunamadı.",
                      "data": null,
                      "errors": [],
                      "statusCode": 404,
                      "errorCode": "RESOURCE_NOT_FOUND"
                    }
                  }
                }
              }
            }
          },
          "429": {
            "description": "Çok fazla istek gönderildi. Lütfen biraz sonra tekrar deneyin. Hata yoluna göre gövde değişebilir; HTTP durumunu esas alın.",
            "headers": {
              "Retry-After": {
                "description": "Döndüğünde yeniden denemeden önce beklenecek saniye. Her 429 yanıtında bulunmayabilir.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ObjectApiResponse"
                },
                "examples": {
                  "error": {
                    "summary": "Sentetik örnek — HTTP 429 hata zarfı",
                    "description": "Gerçek müşteri, token, teklif veya fiyat içermez. Kimlikleri canlı yanıtlarla değiştirin. Temsili hata yoludur; mesajlar yerelleştirilebilir ve her hatada errorCode bulunmayabilir.",
                    "value": {
                      "success": false,
                      "message": "Çok fazla istek gönderildi. Lütfen biraz sonra tekrar deneyin.",
                      "data": null,
                      "errors": [],
                      "statusCode": 429,
                      "errorCode": "RATE_LIMITED"
                    }
                  }
                }
              }
            }
          },
          "500": {
            "description": "İşlem sırasında bir sunucu hatası oluştu. Hata yoluna göre gövde değişebilir; HTTP durumunu esas alın.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ObjectApiResponse"
                },
                "examples": {
                  "error": {
                    "summary": "Sentetik örnek — HTTP 500 hata zarfı",
                    "description": "Gerçek müşteri, token, teklif veya fiyat içermez. Kimlikleri canlı yanıtlarla değiştirin. Temsili hata yoludur; mesajlar yerelleştirilebilir ve her hatada errorCode bulunmayabilir.",
                    "value": {
                      "success": false,
                      "message": "İşlem sırasında bir sunucu hatası oluştu.",
                      "data": null,
                      "errors": [],
                      "statusCode": 500,
                      "errorCode": "INTERNAL_SERVER_ERROR"
                    }
                  }
                }
              }
            }
          }
        },
        "operationId": "updateBooking",
        "summary": "Rezervasyonu güncelle",
        "description": "Yetkili olduğunuz rezervasyonu UpdateBookingRequest alanlarıyla günceller. Gönderilebilen alanlar ve işlem uygunluğu rezervasyonun mevcut durumuna bağlıdır."
      }
    },
    "/api/booking/{id}/cancel": {
      "post": {
        "tags": [
          "Rezervasyon"
        ],
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            },
            "description": "Rezervasyonun GUID kimliği (transferReservationId).",
            "example": "f036ac14-4558-4bc5-8735-64e913d238a3"
          },
          {
            "name": "Accept-Language",
            "in": "header",
            "required": false,
            "description": "Yanıt dili ve X-Currency verilmediğinde varsayılan görüntüleme para birimi.",
            "schema": {
              "type": "string",
              "enum": [
                "tr-TR",
                "en-US",
                "de-DE",
                "ru-RU"
              ],
              "default": "tr-TR"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/DecimalApiResponse"
                },
                "examples": {
                  "noFee": {
                    "summary": "Sentetik örnek — kesintisiz iptal",
                    "description": "Gerçek müşteri, token, teklif veya fiyat içermez. Kimlikleri canlı yanıtlarla değiştirin. ",
                    "value": {
                      "success": true,
                      "message": "İşlem başarılı.",
                      "data": 0,
                      "errors": null,
                      "statusCode": 200
                    }
                  },
                  "withFee": {
                    "summary": "Sentetik örnek — yüzde 25 kesinti ile iptal",
                    "description": "Gerçek müşteri, token, teklif veya fiyat içermez. Kimlikleri canlı yanıtlarla değiştirin. 25 bir para tutarı değildir. İptal koşulu veya sabit kesinti taahhüdü değildir.",
                    "value": {
                      "success": true,
                      "message": "İşlem başarılı.",
                      "data": 25,
                      "errors": null,
                      "statusCode": 200
                    }
                  }
                }
              }
            }
          },
          "400": {
            "description": "İstek bilgileri geçerli değil. Hata yoluna göre gövde değişebilir; HTTP durumunu esas alın.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ObjectApiResponse"
                },
                "examples": {
                  "error": {
                    "summary": "Sentetik örnek — HTTP 400 hata zarfı",
                    "description": "Gerçek müşteri, token, teklif veya fiyat içermez. Kimlikleri canlı yanıtlarla değiştirin. Temsili hata yoludur; mesajlar yerelleştirilebilir ve her hatada errorCode bulunmayabilir.",
                    "value": {
                      "success": false,
                      "message": "İstek bilgileri geçerli değil.",
                      "data": null,
                      "errors": [
                        "Gönderilen alanları kontrol edin."
                      ],
                      "statusCode": 400
                    }
                  }
                }
              }
            }
          },
          "401": {
            "description": "Bu işlem için oturum doğrulanamadı. Hata yoluna göre gövde değişebilir; HTTP durumunu esas alın. Kimlik doğrulama katmanı gövdesiz yanıt da verebilir.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ObjectApiResponse"
                },
                "examples": {
                  "error": {
                    "summary": "Sentetik örnek — HTTP 401 hata zarfı",
                    "description": "Gerçek müşteri, token, teklif veya fiyat içermez. Kimlikleri canlı yanıtlarla değiştirin. Temsili hata yoludur; mesajlar yerelleştirilebilir ve her hatada errorCode bulunmayabilir.",
                    "value": {
                      "success": false,
                      "message": "Bu işlem için oturum doğrulanamadı.",
                      "data": null,
                      "errors": [],
                      "statusCode": 401,
                      "errorCode": "UNAUTHORIZED"
                    }
                  }
                }
              }
            }
          },
          "403": {
            "description": "Bu işlem için yetkiniz bulunmuyor. Hata yoluna göre gövde değişebilir; HTTP durumunu esas alın. Kimlik doğrulama katmanı gövdesiz yanıt da verebilir.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ObjectApiResponse"
                },
                "examples": {
                  "error": {
                    "summary": "Sentetik örnek — HTTP 403 hata zarfı",
                    "description": "Gerçek müşteri, token, teklif veya fiyat içermez. Kimlikleri canlı yanıtlarla değiştirin. Temsili hata yoludur; mesajlar yerelleştirilebilir ve her hatada errorCode bulunmayabilir.",
                    "value": {
                      "success": false,
                      "message": "Bu işlem için yetkiniz bulunmuyor.",
                      "data": null,
                      "errors": [],
                      "statusCode": 403,
                      "errorCode": "FORBIDDEN_ACCESS"
                    }
                  }
                }
              }
            }
          },
          "404": {
            "description": "Kaynak bulunamadı. Hata yoluna göre gövde değişebilir; HTTP durumunu esas alın.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ObjectApiResponse"
                },
                "examples": {
                  "error": {
                    "summary": "Sentetik örnek — HTTP 404 hata zarfı",
                    "description": "Gerçek müşteri, token, teklif veya fiyat içermez. Kimlikleri canlı yanıtlarla değiştirin. Temsili hata yoludur; mesajlar yerelleştirilebilir ve her hatada errorCode bulunmayabilir.",
                    "value": {
                      "success": false,
                      "message": "Kaynak bulunamadı.",
                      "data": null,
                      "errors": [],
                      "statusCode": 404,
                      "errorCode": "RESOURCE_NOT_FOUND"
                    }
                  }
                }
              }
            }
          },
          "429": {
            "description": "Çok fazla istek gönderildi. Lütfen biraz sonra tekrar deneyin. Hata yoluna göre gövde değişebilir; HTTP durumunu esas alın.",
            "headers": {
              "Retry-After": {
                "description": "Döndüğünde yeniden denemeden önce beklenecek saniye. Her 429 yanıtında bulunmayabilir.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ObjectApiResponse"
                },
                "examples": {
                  "error": {
                    "summary": "Sentetik örnek — HTTP 429 hata zarfı",
                    "description": "Gerçek müşteri, token, teklif veya fiyat içermez. Kimlikleri canlı yanıtlarla değiştirin. Temsili hata yoludur; mesajlar yerelleştirilebilir ve her hatada errorCode bulunmayabilir.",
                    "value": {
                      "success": false,
                      "message": "Çok fazla istek gönderildi. Lütfen biraz sonra tekrar deneyin.",
                      "data": null,
                      "errors": [],
                      "statusCode": 429,
                      "errorCode": "RATE_LIMITED"
                    }
                  }
                }
              }
            }
          },
          "500": {
            "description": "İşlem sırasında bir sunucu hatası oluştu. Hata yoluna göre gövde değişebilir; HTTP durumunu esas alın.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ObjectApiResponse"
                },
                "examples": {
                  "error": {
                    "summary": "Sentetik örnek — HTTP 500 hata zarfı",
                    "description": "Gerçek müşteri, token, teklif veya fiyat içermez. Kimlikleri canlı yanıtlarla değiştirin. Temsili hata yoludur; mesajlar yerelleştirilebilir ve her hatada errorCode bulunmayabilir.",
                    "value": {
                      "success": false,
                      "message": "İşlem sırasında bir sunucu hatası oluştu.",
                      "data": null,
                      "errors": [],
                      "statusCode": 500,
                      "errorCode": "INTERNAL_SERVER_ERROR"
                    }
                  }
                }
              }
            }
          }
        },
        "operationId": "cancelBooking",
        "summary": "Rezervasyonu iptal et",
        "description": "Rezervasyonu iptal eder. Başarılı yanıttaki data uygulanacak iptal kesinti yüzdesidir; para tutarı değildir. İptal koşullarını işlemden önce kullanıcıya gösterin."
      }
    },
    "/api/transfer-statuses": {
      "get": {
        "tags": [
          "Rezervasyon"
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/TransferStatusDtoListApiResponse"
                },
                "examples": {
                  "statuses": {
                    "summary": "Sentetik örnek — durum kataloğundan iki örnek",
                    "description": "Gerçek müşteri, token, teklif veya fiyat içermez. Kimlikleri canlı yanıtlarla değiştirin. Kısaltılmış örnektir; canlı endpoint tüm durumları döndürür.",
                    "value": {
                      "success": true,
                      "message": "İşlem başarılı.",
                      "data": [
                        {
                          "id": 1,
                          "labelTr": "Yeni Transfer",
                          "labelEn": "New Transfer",
                          "variant": "secondary",
                          "color": "#6B7280",
                          "isCancellable": true,
                          "isEditable": true,
                          "isTerminal": false,
                          "isLive": false,
                          "sortOrder": 1,
                          "allowedOpsActions": []
                        },
                        {
                          "id": 11,
                          "labelTr": "İptal Edildi",
                          "labelEn": "Cancelled",
                          "variant": "destructive",
                          "color": "#F43F5E",
                          "isCancellable": false,
                          "isEditable": false,
                          "isTerminal": true,
                          "isLive": false,
                          "sortOrder": 11,
                          "allowedOpsActions": []
                        }
                      ],
                      "errors": null,
                      "statusCode": 200
                    }
                  }
                }
              }
            }
          },
          "429": {
            "description": "Çok fazla istek gönderildi. Lütfen biraz sonra tekrar deneyin. Hata yoluna göre gövde değişebilir; HTTP durumunu esas alın.",
            "headers": {
              "Retry-After": {
                "description": "Döndüğünde yeniden denemeden önce beklenecek saniye. Her 429 yanıtında bulunmayabilir.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ObjectApiResponse"
                },
                "examples": {
                  "error": {
                    "summary": "Sentetik örnek — HTTP 429 hata zarfı",
                    "description": "Gerçek müşteri, token, teklif veya fiyat içermez. Kimlikleri canlı yanıtlarla değiştirin. Temsili hata yoludur; mesajlar yerelleştirilebilir ve her hatada errorCode bulunmayabilir.",
                    "value": {
                      "success": false,
                      "message": "Çok fazla istek gönderildi. Lütfen biraz sonra tekrar deneyin.",
                      "data": null,
                      "errors": [],
                      "statusCode": 429,
                      "errorCode": "RATE_LIMITED"
                    }
                  }
                }
              }
            }
          },
          "500": {
            "description": "İşlem sırasında bir sunucu hatası oluştu. Hata yoluna göre gövde değişebilir; HTTP durumunu esas alın.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ObjectApiResponse"
                },
                "examples": {
                  "error": {
                    "summary": "Sentetik örnek — HTTP 500 hata zarfı",
                    "description": "Gerçek müşteri, token, teklif veya fiyat içermez. Kimlikleri canlı yanıtlarla değiştirin. Temsili hata yoludur; mesajlar yerelleştirilebilir ve her hatada errorCode bulunmayabilir.",
                    "value": {
                      "success": false,
                      "message": "İşlem sırasında bir sunucu hatası oluştu.",
                      "data": null,
                      "errors": [],
                      "statusCode": 500,
                      "errorCode": "INTERNAL_SERVER_ERROR"
                    }
                  }
                }
              }
            }
          }
        },
        "operationId": "listTransferStatuses",
        "summary": "Transfer durumlarını listele",
        "description": "Transfer durumlarının kimlik ve etiketlerini getirir. Durum adlarını uygulamada sabitlemek yerine bu referansı kullanın.",
        "parameters": [
          {
            "name": "Accept-Language",
            "in": "header",
            "required": false,
            "description": "Yanıt dili ve X-Currency verilmediğinde varsayılan görüntüleme para birimi.",
            "schema": {
              "type": "string",
              "enum": [
                "tr-TR",
                "en-US",
                "de-DE",
                "ru-RU"
              ],
              "default": "tr-TR"
            }
          }
        ],
        "security": []
      }
    },
    "/api/user/me": {
      "get": {
        "tags": [
          "Profil"
        ],
        "responses": {
          "200": {
            "description": "İşlem başarılı.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UserResponseApiResponse"
                },
                "examples": {
                  "profile": {
                    "summary": "Sentetik örnek — partner profili",
                    "description": "Gerçek müşteri, token, teklif veya fiyat içermez. Kimlikleri canlı yanıtlarla değiştirin. ",
                    "value": {
                      "success": true,
                      "message": "İşlem başarılı.",
                      "data": {
                        "id": 100,
                        "userName": "partner@example.com",
                        "firstName": "Demo",
                        "lastName": "Partner",
                        "fullName": "Demo Partner",
                        "email": "partner@example.com",
                        "phoneNumber": "+905000000000",
                        "companyId": 100,
                        "userTypeLookupId": null,
                        "userTitleLookupId": null
                      },
                      "errors": null,
                      "statusCode": 200
                    }
                  }
                }
              }
            }
          },
          "401": {
            "description": "Bu işlem için oturum doğrulanamadı. Hata yoluna göre gövde değişebilir; HTTP durumunu esas alın. Kimlik doğrulama katmanı gövdesiz yanıt da verebilir.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ObjectApiResponse"
                },
                "examples": {
                  "error": {
                    "summary": "Sentetik örnek — HTTP 401 hata zarfı",
                    "description": "Gerçek müşteri, token, teklif veya fiyat içermez. Kimlikleri canlı yanıtlarla değiştirin. Temsili hata yoludur; mesajlar yerelleştirilebilir ve her hatada errorCode bulunmayabilir.",
                    "value": {
                      "success": false,
                      "message": "Bu işlem için oturum doğrulanamadı.",
                      "data": null,
                      "errors": [],
                      "statusCode": 401,
                      "errorCode": "UNAUTHORIZED"
                    }
                  }
                }
              }
            }
          },
          "403": {
            "description": "Bu işlem için yetkiniz bulunmuyor. Hata yoluna göre gövde değişebilir; HTTP durumunu esas alın. Kimlik doğrulama katmanı gövdesiz yanıt da verebilir.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ObjectApiResponse"
                },
                "examples": {
                  "error": {
                    "summary": "Sentetik örnek — HTTP 403 hata zarfı",
                    "description": "Gerçek müşteri, token, teklif veya fiyat içermez. Kimlikleri canlı yanıtlarla değiştirin. Temsili hata yoludur; mesajlar yerelleştirilebilir ve her hatada errorCode bulunmayabilir.",
                    "value": {
                      "success": false,
                      "message": "Bu işlem için yetkiniz bulunmuyor.",
                      "data": null,
                      "errors": [],
                      "statusCode": 403,
                      "errorCode": "FORBIDDEN_ACCESS"
                    }
                  }
                }
              }
            }
          },
          "429": {
            "description": "Çok fazla istek gönderildi. Lütfen biraz sonra tekrar deneyin. Hata yoluna göre gövde değişebilir; HTTP durumunu esas alın.",
            "headers": {
              "Retry-After": {
                "description": "Döndüğünde yeniden denemeden önce beklenecek saniye. Her 429 yanıtında bulunmayabilir.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ObjectApiResponse"
                },
                "examples": {
                  "error": {
                    "summary": "Sentetik örnek — HTTP 429 hata zarfı",
                    "description": "Gerçek müşteri, token, teklif veya fiyat içermez. Kimlikleri canlı yanıtlarla değiştirin. Temsili hata yoludur; mesajlar yerelleştirilebilir ve her hatada errorCode bulunmayabilir.",
                    "value": {
                      "success": false,
                      "message": "Çok fazla istek gönderildi. Lütfen biraz sonra tekrar deneyin.",
                      "data": null,
                      "errors": [],
                      "statusCode": 429,
                      "errorCode": "RATE_LIMITED"
                    }
                  }
                }
              }
            }
          },
          "500": {
            "description": "İşlem sırasında bir sunucu hatası oluştu. Hata yoluna göre gövde değişebilir; HTTP durumunu esas alın.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ObjectApiResponse"
                },
                "examples": {
                  "error": {
                    "summary": "Sentetik örnek — HTTP 500 hata zarfı",
                    "description": "Gerçek müşteri, token, teklif veya fiyat içermez. Kimlikleri canlı yanıtlarla değiştirin. Temsili hata yoludur; mesajlar yerelleştirilebilir ve her hatada errorCode bulunmayabilir.",
                    "value": {
                      "success": false,
                      "message": "İşlem sırasında bir sunucu hatası oluştu.",
                      "data": null,
                      "errors": [],
                      "statusCode": 500,
                      "errorCode": "INTERNAL_SERVER_ERROR"
                    }
                  }
                }
              }
            }
          }
        },
        "operationId": "getMyProfile",
        "summary": "Profilimi getir",
        "description": "Bearer token'ın ait olduğu kullanıcının profilini ve şirket kimliğini getirir.",
        "parameters": [
          {
            "name": "Accept-Language",
            "in": "header",
            "required": false,
            "description": "Yanıt dili ve X-Currency verilmediğinde varsayılan görüntüleme para birimi.",
            "schema": {
              "type": "string",
              "enum": [
                "tr-TR",
                "en-US",
                "de-DE",
                "ru-RU"
              ],
              "default": "tr-TR"
            }
          }
        ]
      }
    }
  },
  "components": {
    "schemas": {
      "AvailabilityRequest": {
        "type": "object",
        "properties": {
          "requestId": {
            "type": "string",
            "format": "uuid",
            "description": "Arama isteğini izlemek için istemcinin ürettiği UUID."
          },
          "bestPrice": {
            "type": "boolean",
            "description": "true ise iç tedarikçiler araç tipi başına en uygun teklif için süzülür; dış teklifler bu süzgeçten muaftır. Kapasiteyi ayrıca kontrol edin."
          },
          "pickUpDateTime": {
            "type": "string",
            "format": "date-time",
            "description": "Alış zamanı. UTC Z veya açık saat dilimi farkıyla gönderin."
          },
          "pickUpLocation": {
            "allOf": [
              {
                "$ref": "#/components/schemas/GeoLocation"
              }
            ],
            "description": "Transferin başlangıç noktası. Koordinat, yer adı ve varsa placeId aynı yeri göstermelidir."
          },
          "dropOffLocation": {
            "allOf": [
              {
                "$ref": "#/components/schemas/GeoLocation"
              }
            ],
            "description": "Transferin varış noktası. Koordinat, yer adı ve varsa placeId aynı yeri göstermelidir."
          },
          "hour": {
            "type": "integer",
            "format": "int32",
            "description": "Saatlik tahsis süresi. Noktadan noktaya transfer örneğinde 0."
          },
          "waypoints": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/BookingWaypointRequest"
            },
            "nullable": true,
            "description": "Alış ve varış arasındaki sıralı ara duraklar; rezervasyonda aynı duraklar korunmalıdır. Null olabilir; değerin varlığını kontrol edin."
          }
        },
        "additionalProperties": false
      },
      "AvailabilityResponse": {
        "type": "object",
        "properties": {
          "requestId": {
            "type": "string",
            "format": "uuid",
            "description": "Yanıtın ait olduğu aramanın UUID kimliği."
          },
          "distance": {
            "type": "string",
            "nullable": true,
            "description": "Hesaplanan rota mesafesinin gösterim metni. Sayısal hesaplama için metni ayrıştırmayın. Null olabilir; değerin varlığını kontrol edin."
          },
          "travelTime": {
            "type": "string",
            "nullable": true,
            "description": "Tahmini yolculuk süresinin gösterim metni; gerçek varış zamanı garantisi değildir. Null olabilir; değerin varlığını kontrol edin."
          },
          "pickUpAddress": {
            "type": "string",
            "nullable": true,
            "description": "Alış noktası için çözümlenen adres. Null olabilir; değerin varlığını kontrol edin."
          },
          "dropOffAddress": {
            "type": "string",
            "nullable": true,
            "description": "Varış noktası için çözümlenen adres. Null olabilir; değerin varlığını kontrol edin."
          },
          "alternativeRoutes": {
            "allOf": [
              {
                "$ref": "#/components/schemas/TollRoadType"
              }
            ],
            "description": "Arama rotasıyla ilişkili geçiş türü. Seçilebilir alternatifler için route-options işlemini kullanın."
          },
          "routePolyline": {
            "type": "string",
            "nullable": true,
            "description": "Fiyatlanan rotanın Google encoded polyline geometrisi. Boşsa bu yanıttan harita çizilemez. Null olabilir; değerin varlığını kontrol edin."
          },
          "vehicles": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/VehicleResponse"
            },
            "nullable": true,
            "description": "Araç teklifleri. Boş veya null ise rezerve edilecek teklif yoktur; coverage bilgisini kontrol edin."
          },
          "coverage": {
            "allOf": [
              {
                "$ref": "#/components/schemas/CoverageInfo"
              }
            ],
            "description": "Hizmet bölgesi sonucu; özellikle araç bulunamadığında değerlendirin. Teklif bulunan yanıtta null olabilir."
          }
        },
        "additionalProperties": false
      },
      "AvailabilityResponseApiResponse": {
        "type": "object",
        "properties": {
          "success": {
            "type": "boolean",
            "description": "İşlem sonucu. HTTP durumuyla birlikte kontrol edin; true başarılı sonucu gösterir."
          },
          "message": {
            "type": "string",
            "nullable": true,
            "description": "İnsan tarafından okunabilen sonuç mesajı. İş akışını bu metni eşleştirerek yönetmeyin. Null olabilir; değerin varlığını kontrol edin."
          },
          "data": {
            "allOf": [
              {
                "$ref": "#/components/schemas/AvailabilityResponse"
              }
            ],
            "description": "İşleme özgü sonuç. Hata yanıtında null olabilir; success kontrol edilmeden kullanılmamalıdır."
          },
          "errors": {
            "type": "array",
            "items": {
              "type": "string"
            },
            "nullable": true,
            "description": "Doğrulama veya işlem hatalarının metin listesi. Başarıda null veya boş olabilir."
          },
          "statusCode": {
            "type": "integer",
            "format": "int32",
            "description": "Yanıt gövdesindeki durum kodu. Ağ katmanındaki HTTP durumunu ayrıca kontrol edin."
          },
          "errorCode": {
            "type": "string",
            "nullable": true,
            "description": "Makine tarafından işlenebilen hata kodu. Başarılı yanıtta veya bazı hata yollarında bulunmayabilir. Null olabilir; değerin varlığını kontrol edin."
          },
          "developerInfo": {
            "nullable": true,
            "description": "Ortama ve hata yoluna bağlı ek tanılama verisi. Varlığına veya yapısına bağımlı entegrasyon kurmayın. Null olabilir; değerin varlığını kontrol edin."
          },
          "correlationId": {
            "type": "string",
            "nullable": true,
            "description": "Destek incelemesi için istek takip kimliği; her yanıtta bulunması garanti edilmez. Null olabilir; değerin varlığını kontrol edin."
          }
        },
        "additionalProperties": false
      },
      "BookingExtraResponse": {
        "type": "object",
        "properties": {
          "id": {
            "type": "integer",
            "format": "int32",
            "description": "Ekstra kataloğunda seçim kimliği; BookingRequest.supplierExtraIds listesinde kullanılır. Rezervasyon detayındaki extraResponse satırlarında 0 olabilir; yeni seçim için katalogdan alın."
          },
          "name": {
            "type": "string",
            "nullable": true,
            "description": "Ek hizmetin adı. Null olabilir; değerin varlığını kontrol edin."
          },
          "description": {
            "type": "string",
            "nullable": true,
            "description": "Ek hizmetin kapsamını açıklayan metin. Null olabilir; değerin varlığını kontrol edin."
          },
          "netAmount": {
            "type": "number",
            "format": "double",
            "description": "Görüntüleme para birimindeki KDV hariç hizmet bedeli."
          },
          "type": {
            "type": "integer",
            "format": "int32",
            "description": "Sunucunun ek hizmet türü kimliği; rezervasyonda hizmeti seçmek için id alanını kullanın."
          },
          "supplierId": {
            "type": "integer",
            "format": "int32",
            "description": "Ekstra kataloğunda hizmeti sunan tedarikçinin kimliği. Rezervasyon detayındaki ekstra satırında doldurulmayıp 0 olabilir."
          },
          "vatRate": {
            "type": "number",
            "format": "double",
            "description": "KDV oranı, yüzde (örneğin 20)."
          },
          "vatAmount": {
            "type": "number",
            "format": "double",
            "description": "Görüntüleme para birimindeki KDV tutarı."
          },
          "grossAmount": {
            "type": "number",
            "format": "double",
            "description": "Görüntüleme para birimindeki KDV dahil ek hizmet bedeli."
          },
          "chargeAmount": {
            "type": "number",
            "format": "double",
            "description": "Ekstra kataloğunda chargeCurrency cinsinden tahsilat bedeli. Rezervasyon detayındaki ekstra satırında doldurulmayıp 0 olabilir; 0 değerinden hizmetin ücretsiz olduğunu çıkarmayın."
          },
          "chargeCurrency": {
            "type": "string",
            "nullable": true,
            "description": "Tahsilat para birimi; mevcut uygulamada TRY. Null olabilir; değerin varlığını kontrol edin."
          },
          "currency": {
            "type": "string",
            "nullable": true,
            "example": "EUR",
            "description": "netAmount, vatAmount ve grossAmount alanlarının görüntüleme para birimi. Null olabilir; değerin varlığını kontrol edin."
          },
          "currencySymbol": {
            "type": "string",
            "nullable": true,
            "example": "€",
            "description": "Görüntüleme para birimi sembolü. Null olabilir; değerin varlığını kontrol edin."
          }
        },
        "additionalProperties": false
      },
      "BookingExtraResponseApiResponse": {
        "type": "object",
        "properties": {
          "success": {
            "type": "boolean",
            "description": "İşlem sonucu. HTTP durumuyla birlikte kontrol edin; true başarılı sonucu gösterir."
          },
          "message": {
            "type": "string",
            "nullable": true,
            "description": "İnsan tarafından okunabilen sonuç mesajı. İş akışını bu metni eşleştirerek yönetmeyin. Null olabilir; değerin varlığını kontrol edin."
          },
          "data": {
            "allOf": [
              {
                "$ref": "#/components/schemas/BookingExtraResponse"
              }
            ],
            "description": "İşleme özgü sonuç. Hata yanıtında null olabilir; success kontrol edilmeden kullanılmamalıdır."
          },
          "errors": {
            "type": "array",
            "items": {
              "type": "string"
            },
            "nullable": true,
            "description": "Doğrulama veya işlem hatalarının metin listesi. Başarıda null veya boş olabilir."
          },
          "statusCode": {
            "type": "integer",
            "format": "int32",
            "description": "Yanıt gövdesindeki durum kodu. Ağ katmanındaki HTTP durumunu ayrıca kontrol edin."
          },
          "errorCode": {
            "type": "string",
            "nullable": true,
            "description": "Makine tarafından işlenebilen hata kodu. Başarılı yanıtta veya bazı hata yollarında bulunmayabilir. Null olabilir; değerin varlığını kontrol edin."
          },
          "developerInfo": {
            "nullable": true,
            "description": "Ortama ve hata yoluna bağlı ek tanılama verisi. Varlığına veya yapısına bağımlı entegrasyon kurmayın. Null olabilir; değerin varlığını kontrol edin."
          },
          "correlationId": {
            "type": "string",
            "nullable": true,
            "description": "Destek incelemesi için istek takip kimliği; her yanıtta bulunması garanti edilmez. Null olabilir; değerin varlığını kontrol edin."
          }
        },
        "additionalProperties": false
      },
      "BookingExtraResponseListApiResponse": {
        "type": "object",
        "properties": {
          "success": {
            "type": "boolean",
            "description": "İşlem sonucu. HTTP durumuyla birlikte kontrol edin; true başarılı sonucu gösterir."
          },
          "message": {
            "type": "string",
            "nullable": true,
            "description": "İnsan tarafından okunabilen sonuç mesajı. İş akışını bu metni eşleştirerek yönetmeyin. Null olabilir; değerin varlığını kontrol edin."
          },
          "data": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/BookingExtraResponse"
            },
            "nullable": true,
            "description": "İşleme özgü sonuç. Hata yanıtında null olabilir; success kontrol edilmeden kullanılmamalıdır."
          },
          "errors": {
            "type": "array",
            "items": {
              "type": "string"
            },
            "nullable": true,
            "description": "Doğrulama veya işlem hatalarının metin listesi. Başarıda null veya boş olabilir."
          },
          "statusCode": {
            "type": "integer",
            "format": "int32",
            "description": "Yanıt gövdesindeki durum kodu. Ağ katmanındaki HTTP durumunu ayrıca kontrol edin."
          },
          "errorCode": {
            "type": "string",
            "nullable": true,
            "description": "Makine tarafından işlenebilen hata kodu. Başarılı yanıtta veya bazı hata yollarında bulunmayabilir. Null olabilir; değerin varlığını kontrol edin."
          },
          "developerInfo": {
            "nullable": true,
            "description": "Ortama ve hata yoluna bağlı ek tanılama verisi. Varlığına veya yapısına bağımlı entegrasyon kurmayın. Null olabilir; değerin varlığını kontrol edin."
          },
          "correlationId": {
            "type": "string",
            "nullable": true,
            "description": "Destek incelemesi için istek takip kimliği; her yanıtta bulunması garanti edilmez. Null olabilir; değerin varlığını kontrol edin."
          }
        },
        "additionalProperties": false
      },
      "BookingPassengerRequest": {
        "type": "object",
        "properties": {
          "passengerId": {
            "type": "integer",
            "format": "int32",
            "nullable": true,
            "description": "Kayıtlı yolcunun kimliği. Yeni yolcu için göndermeyin; güncellemede mevcut yolcuyla eşleştirmek için kullanılır. Null olabilir; değerin varlığını kontrol edin."
          },
          "firstName": {
            "type": "string",
            "nullable": false,
            "minLength": 1,
            "maxLength": 50,
            "description": "Yolcunun adı; boş olamaz, en çok 50 karakter."
          },
          "lastName": {
            "type": "string",
            "nullable": false,
            "minLength": 1,
            "maxLength": 50,
            "description": "Yolcunun soyadı; boş olamaz, en çok 50 karakter."
          },
          "phone": {
            "type": "string",
            "nullable": true,
            "description": "Lider yolcu için zorunlu telefon numarası. Null olabilir; değerin varlığını kontrol edin."
          },
          "email": {
            "type": "string",
            "nullable": true,
            "description": "Verildiğinde geçerli e-posta olmalıdır. Mevcut rezervasyon doğrulamasında zorunlu değildir. Null olabilir; değerin varlığını kontrol edin."
          },
          "idNo": {
            "type": "string",
            "nullable": true,
            "description": "Yolcunun kimlik numarası. Yalnız gerekli olduğu durumda gönderin; loglara ve destek mesajlarına eklemeyin. Null olabilir; değerin varlığını kontrol edin."
          },
          "nationality": {
            "type": "string",
            "nullable": true,
            "description": "Yolcunun uyruk adı; uyruk kodundan ayrı açıklama alanı. Null olabilir; değerin varlığını kontrol edin."
          },
          "nationalityCode": {
            "type": "string",
            "nullable": true,
            "description": "Yolcunun uyruk ülke kodu (örneğin TR). Null olabilir; değerin varlığını kontrol edin."
          },
          "isLeadPassenger": {
            "type": "boolean",
            "description": "Rezervasyonda tam olarak bir yolcu için true."
          }
        },
        "additionalProperties": false,
        "required": [
          "firstName",
          "lastName"
        ]
      },
      "BookingPassengerResponse": {
        "type": "object",
        "properties": {
          "passengerId": {
            "type": "integer",
            "format": "int32",
            "description": "Rezervasyona bağlı yolcu kaydının kimliği."
          },
          "firstName": {
            "type": "string",
            "nullable": true,
            "description": "Yolcunun adı; boş olamaz, en çok 50 karakter. Null olabilir; değerin varlığını kontrol edin."
          },
          "lastName": {
            "type": "string",
            "nullable": true,
            "description": "Yolcunun soyadı; boş olamaz, en çok 50 karakter. Null olabilir; değerin varlığını kontrol edin."
          },
          "phone": {
            "type": "string",
            "nullable": true,
            "description": "Yolcu telefonu. Lider yolcu için gereklidir; ülke koduyla gönderin. Null olabilir; değerin varlığını kontrol edin."
          },
          "email": {
            "type": "string",
            "nullable": true,
            "description": "Yolcunun isteğe bağlı e-posta adresi; gönderilirse geçerli bir adres olmalıdır. Null olabilir; değerin varlığını kontrol edin."
          },
          "idNo": {
            "type": "string",
            "nullable": true,
            "description": "Yolcunun kimlik numarası. Yalnız gerekli olduğu durumda gönderin; loglara ve destek mesajlarına eklemeyin. Null olabilir; değerin varlığını kontrol edin."
          },
          "nationality": {
            "type": "string",
            "nullable": true,
            "description": "Yolcunun uyruk adı; uyruk kodundan ayrı açıklama alanı. Null olabilir; değerin varlığını kontrol edin."
          },
          "nationalityCode": {
            "type": "string",
            "nullable": true,
            "description": "Yolcunun uyruk ülke kodu (örneğin TR). Null olabilir; değerin varlığını kontrol edin."
          },
          "note": {
            "type": "string",
            "nullable": true,
            "description": "Yolcuya ait ek not. Null olabilir; değerin varlığını kontrol edin."
          },
          "isLeadPassenger": {
            "type": "boolean",
            "description": "İletişim kurulacak lider yolcu. Rezervasyonda tam olarak bir yolcu için true olmalıdır."
          }
        },
        "additionalProperties": false
      },
      "BookingRequest": {
        "type": "object",
        "properties": {
          "passengerCount": {
            "type": "integer",
            "format": "int32",
            "nullable": true,
            "description": "Toplam yolcu sayısı (1–100). Verilmezse liste sayısı kullanılır; listedeki kişi sayısından az, araç kapasitesinden fazla olamaz. Null olabilir; değerin varlığını kontrol edin."
          },
          "acceptedServiceConditionsVersion": {
            "type": "string",
            "nullable": true,
            "description": "Seçilen teklifin hizmet koşullarının kabul edilen sürümü. Null olabilir; değerin varlığını kontrol edin."
          },
          "returnAcceptedServiceConditionsVersion": {
            "type": "string",
            "nullable": true,
            "description": "Dönüş dış teklifinin serviceConditions.version değeri; gidiş sürümünden bağımsızdır. Null olabilir; değerin varlığını kontrol edin."
          },
          "externalRequirementsAcknowledged": {
            "type": "boolean",
            "nullable": true,
            "description": "Dış tedarikçinin gerekli hizmet koşullarının kabul edildiğini bildirir. Null olabilir; değerin varlığını kontrol edin."
          },
          "itemId": {
            "type": "string",
            "nullable": false,
            "description": "Seçilen güncel teklif anahtarı. Araç, rota ve fiyat bilgileri bu tekliften alınır.",
            "minLength": 1
          },
          "note": {
            "type": "string",
            "nullable": true,
            "description": "Transferle ilgili isteğe bağlı not. Dış tedarikçide özel talep kabulü ayrıca koşullara tabidir. Null olabilir; değerin varlığını kontrol edin."
          },
          "flightNo": {
            "type": "string",
            "nullable": true,
            "description": "Uçuş numarası. serviceConditions.requiresFlightNumber true ise gereklidir. Null olabilir; değerin varlığını kontrol edin."
          },
          "costCenterId": {
            "type": "integer",
            "format": "int32",
            "nullable": true,
            "description": "Hesabınız için tanımlı maliyet merkezinin kimliği; isteğe bağlı. Null olabilir; değerin varlığını kontrol edin."
          },
          "supplierExtraIds": {
            "type": "array",
            "items": {
              "type": "integer",
              "format": "int32"
            },
            "nullable": true,
            "description": "Tedarikçi ekstra listesinden seçilen hizmet kimlikleri. Null olabilir; değerin varlığını kontrol edin."
          },
          "passengerRequests": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/BookingPassengerRequest"
            },
            "nullable": false,
            "description": "1–20 yolcu; tam olarak birinin isLeadPassenger alanı true olmalıdır.",
            "minItems": 1,
            "maxItems": 20
          },
          "waypoints": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/BookingWaypointRequest"
            },
            "nullable": true,
            "description": "Müsaitlik aramasında fiyatlanan sıralı ara duraklar. Farklı durak için yeniden teklif alın. Null olabilir; değerin varlığını kontrol edin."
          },
          "returnLeg": {
            "allOf": [
              {
                "$ref": "#/components/schemas/ReturnLegRequest"
              }
            ],
            "description": "Çift yön rezervasyonun dönüş teklifi ve dönüşe özel alanları; tek yön için göndermeyin. Yolcu listesi gidişle paylaşılır."
          },
          "partnerSubAccountCode": {
            "type": "string",
            "nullable": true,
            "description": "Yetkili hesap için tanımlı alt hesap kodu; hesabınızın kapsamını entegrasyon ekibiyle doğrulayın. Null olabilir; değerin varlığını kontrol edin."
          },
          "overrideNetAmount": {
            "type": "number",
            "format": "double",
            "nullable": true,
            "description": "Yalnız yetkili tedarikçi kullanımında özel net fiyat; müşteri entegrasyonunda göndermeyin. Null olabilir; değerin varlığını kontrol edin."
          }
        },
        "additionalProperties": false,
        "required": [
          "itemId",
          "passengerRequests"
        ]
      },
      "BookingResponse": {
        "type": "object",
        "properties": {
          "isExternalSupplier": {
            "type": "boolean",
            "description": "Rezervasyonun dış tedarikçi hizmeti olup olmadığı."
          },
          "pickUpTimeZoneId": {
            "type": "string",
            "nullable": true,
            "description": "Alış noktasının saat dilimi kimliği; yerel gösterim için kullanılabilir. Null olabilir; değerin varlığını kontrol edin."
          },
          "operationalAttention": {
            "type": "boolean",
            "description": "Rezervasyonun operasyon ekibi takibi gerektirdiğini gösterir; tek başına iptal veya başarısızlık anlamına gelmez."
          },
          "serviceIssueCode": {
            "type": "string",
            "nullable": true,
            "description": "Varsa hizmetle ilgili takip sorununun kodu; destekle paylaşılabilir. Null olabilir; değerin varlığını kontrol edin."
          },
          "userId": {
            "type": "integer",
            "format": "int32",
            "description": "Rezervasyonu oluşturan kullanıcının kimliği."
          },
          "driverUserId": {
            "type": "integer",
            "format": "int32",
            "nullable": true,
            "description": "Atanan sürücü kullanıcısının kimliği; henüz atanmadıysa null."
          },
          "transferReservationId": {
            "type": "string",
            "format": "uuid",
            "description": "Rezervasyonun UUID kimliği; detay, güncelleme ve iptal isteklerinin id parametresidir."
          },
          "pnr": {
            "type": "string",
            "nullable": true,
            "description": "İnsan tarafından okunabilen rezervasyon takip kodu; id yerine kullanılmaz. Null olabilir; değerin varlığını kontrol edin."
          },
          "firstName": {
            "type": "string",
            "nullable": true,
            "description": "Rezervasyonu oluşturan kullanıcının adı; yolcular passengerResponse alanındadır. Null olabilir; değerin varlığını kontrol edin."
          },
          "lastName": {
            "type": "string",
            "nullable": true,
            "description": "Rezervasyonu oluşturan kullanıcının soyadı; yolcu soyadıyla karıştırmayın. Null olabilir; değerin varlığını kontrol edin."
          },
          "driverFirstName": {
            "type": "string",
            "nullable": true,
            "description": "Atanan sürücünün adı. Null olabilir; değerin varlığını kontrol edin."
          },
          "driverLastName": {
            "type": "string",
            "nullable": true,
            "description": "Atanan sürücünün soyadı. Null olabilir; değerin varlığını kontrol edin."
          },
          "userName": {
            "type": "string",
            "nullable": true,
            "description": "Rezervasyonu oluşturan kullanıcının kullanıcı adı/e-postası. Null olabilir; değerin varlığını kontrol edin."
          },
          "customerCompanyName": {
            "type": "string",
            "nullable": true,
            "description": "Rezervasyonun müşteri şirketi adı. Null olabilir; değerin varlığını kontrol edin."
          },
          "pickUpLocation": {
            "type": "string",
            "nullable": true,
            "description": "Alış noktasının adı. Null olabilir; değerin varlığını kontrol edin."
          },
          "pickUpLocationAddress": {
            "type": "string",
            "nullable": true,
            "description": "Alış noktasının açık adresi. Null olabilir; değerin varlığını kontrol edin."
          },
          "pickUpLatitude": {
            "type": "number",
            "format": "double",
            "nullable": true,
            "description": "Alış noktasının WGS84 enlemi, ondalık derece. Null olabilir; değerin varlığını kontrol edin."
          },
          "pickUpLongitude": {
            "type": "number",
            "format": "double",
            "nullable": true,
            "description": "Alış noktasının WGS84 boylamı, ondalık derece. Null olabilir; değerin varlığını kontrol edin."
          },
          "dropOffLocation": {
            "type": "string",
            "nullable": true,
            "description": "Varış noktasının adı. Null olabilir; değerin varlığını kontrol edin."
          },
          "dropOffLocationAddress": {
            "type": "string",
            "nullable": true,
            "description": "Varış noktasının açık adresi. Null olabilir; değerin varlığını kontrol edin."
          },
          "dropOffLatitude": {
            "type": "number",
            "format": "double",
            "nullable": true,
            "description": "Varış noktasının WGS84 enlemi, ondalık derece. Null olabilir; değerin varlığını kontrol edin."
          },
          "dropOffLongitude": {
            "type": "number",
            "format": "double",
            "nullable": true,
            "description": "Varış noktasının WGS84 boylamı, ondalık derece. Null olabilir; değerin varlığını kontrol edin."
          },
          "vehicleType": {
            "type": "string",
            "nullable": true,
            "description": "Rezerve edilen araç sınıfının adı. Null olabilir; değerin varlığını kontrol edin."
          },
          "vehicleId": {
            "type": "integer",
            "format": "int32",
            "nullable": true,
            "description": "Atanan aracın kimliği; araç ataması yapılmadıysa null olabilir."
          },
          "vehicleYear": {
            "type": "integer",
            "format": "int32",
            "nullable": true,
            "description": "Atanan aracın model yılı. Null olabilir; değerin varlığını kontrol edin."
          },
          "licensePlate": {
            "type": "string",
            "nullable": true,
            "description": "Atanan aracın plakası. Null olabilir; değerin varlığını kontrol edin."
          },
          "vehicleBrand": {
            "type": "string",
            "nullable": true,
            "description": "Atanan aracın markası. Null olabilir; değerin varlığını kontrol edin."
          },
          "vehicleModel": {
            "type": "string",
            "nullable": true,
            "description": "Atanan aracın modeli. Null olabilir; değerin varlığını kontrol edin."
          },
          "distanceKm": {
            "type": "number",
            "format": "double",
            "description": "Rezervasyon rota mesafesi, kilometre."
          },
          "duration": {
            "type": "string",
            "nullable": true,
            "description": "Tahmini yolculuk süresinin gösterim metni. Null olabilir; değerin varlığını kontrol edin."
          },
          "driverPhone": {
            "type": "string",
            "nullable": true,
            "description": "Atanan sürücünün iletişim telefonu. Null olabilir; değerin varlığını kontrol edin."
          },
          "pickUpTime": {
            "type": "string",
            "format": "date-time",
            "description": "Planlanan alış anı; ISO 8601 tarih-saat. Gösterimde alış noktasının saat dilimini dikkate alın."
          },
          "totalNetAmount": {
            "type": "number",
            "format": "double",
            "description": "TRY cinsinden toplam net tutar; customerTotalNet ile para birimi farklı olabilir."
          },
          "totalVatAmount": {
            "type": "number",
            "format": "double",
            "description": "TRY cinsinden toplam KDV tutarı."
          },
          "totalGrossAmount": {
            "type": "number",
            "format": "double",
            "description": "TRY cinsinden toplam brüt tutar."
          },
          "totalExtraAmount": {
            "type": "number",
            "format": "double",
            "description": "Rezervasyondaki ek hizmetlerin kayıtlı TRY bedelleri toplamı; toplam brütü yeniden hesaplamak için kullanmayın."
          },
          "createdAt": {
            "type": "string",
            "format": "date-time",
            "description": "Rezervasyonun oluşturulma anı, ISO 8601 tarih-saat."
          },
          "flightNo": {
            "type": "string",
            "nullable": true,
            "description": "Rezervasyona kaydedilen uçuş numarası. Null olabilir; değerin varlığını kontrol edin."
          },
          "note": {
            "type": "string",
            "nullable": true,
            "description": "Rezervasyona kaydedilen transfer notu. Null olabilir; değerin varlığını kontrol edin."
          },
          "status": {
            "type": "integer",
            "format": "int32",
            "description": "Transfer durum kimliği; güncel anlam ve bayraklar GET /api/transfer-statuses yanıtındadır."
          },
          "isNoShow": {
            "type": "boolean",
            "description": "Yolcunun gelmediği olarak işaretlenip işaretlenmediği."
          },
          "statusDisplay": {
            "type": "string",
            "nullable": true,
            "readOnly": true,
            "description": "Durumun sunucunun ürettiği görünen adı; iş akışında status kimliğini kullanın. Null olabilir; değerin varlığını kontrol edin."
          },
          "extraResponse": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/BookingExtraResponse"
            },
            "nullable": true,
            "description": "Rezervasyona kaydedilen ek hizmetler. Null olabilir; değerin varlığını kontrol edin."
          },
          "passengerResponse": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/BookingPassengerResponse"
            },
            "nullable": true,
            "description": "Rezervasyonun yolcu kayıtları. Null olabilir; değerin varlığını kontrol edin."
          },
          "currency": {
            "type": "string",
            "nullable": true,
            "description": "Rezervasyonun müşteri para birimi; customerTotalNet bu birimdedir. Null olabilir; değerin varlığını kontrol edin."
          },
          "currencySymbol": {
            "type": "string",
            "nullable": true,
            "description": "Müşteri para biriminin sembolü. Null olabilir; değerin varlığını kontrol edin."
          },
          "customerTotalNet": {
            "type": "number",
            "format": "double",
            "description": "Müşteri para birimindeki net tutar. TRY net toplamı ile exchangeRate çarpılarak hesaplanır."
          },
          "exchangeRate": {
            "type": "number",
            "format": "double",
            "description": "Rezervasyonda kullanılan kur: 1 TRY karşılığındaki müşteri para birimi tutarı."
          },
          "paymentStatus": {
            "type": "string",
            "nullable": true,
            "description": "Ödeme durumu: Pending, Completed, Failed, Refunded veya PartiallyRefunded. Açık hesapta null olabilir."
          },
          "paymentId": {
            "type": "integer",
            "format": "int32",
            "nullable": true,
            "description": "İlişkili ödeme kaydının kimliği. Null olabilir; değerin varlığını kontrol edin."
          },
          "paymentAmount": {
            "type": "number",
            "format": "double",
            "nullable": true,
            "description": "paymentCurrency cinsinden ödeme tutarı. Null olabilir; değerin varlığını kontrol edin."
          },
          "paymentCurrency": {
            "type": "string",
            "nullable": true,
            "description": "Ödeme ve iade tutarlarının para birimi. Null olabilir; değerin varlığını kontrol edin."
          },
          "refundedAmount": {
            "type": "number",
            "format": "double",
            "nullable": true,
            "description": "paymentCurrency cinsinden iade edilen ödeme tutarı. Null olabilir; değerin varlığını kontrol edin."
          },
          "paymentReservationId": {
            "type": "string",
            "format": "uuid",
            "nullable": true,
            "description": "Ödemenin bağlı olduğu rezervasyonun UUID kimliği. Null olabilir; değerin varlığını kontrol edin."
          },
          "paymentMethod": {
            "type": "string",
            "nullable": true,
            "description": "Ödeme yöntemi: CreditCard veya OpenAccount. Null olabilir; değerin varlığını kontrol edin."
          },
          "paidAt": {
            "type": "string",
            "format": "date-time",
            "nullable": true,
            "description": "Ödemenin tamamlandığı an; tamamlanmamış ödemede null olabilir."
          },
          "lastFourDigits": {
            "type": "string",
            "nullable": true,
            "description": "Kullanılan kartın yalnız son dört hanesi; tam kart numarası değildir. Null olabilir; değerin varlığını kontrol edin."
          },
          "cardBrand": {
            "type": "string",
            "nullable": true,
            "description": "Kart markası (örneğin Visa, Mastercard, Troy veya Amex). Null olabilir; değerin varlığını kontrol edin."
          },
          "installmentCount": {
            "type": "integer",
            "format": "int32",
            "nullable": true,
            "description": "Taksit sayısı; 1 tek çekim demektir. Null olabilir; değerin varlığını kontrol edin."
          },
          "stops": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/BookingStopResponse"
            },
            "nullable": true,
            "description": "Alış → ara duraklar → varış sırasındaki duraklar. Ara durak yoksa null veya boş olabilir."
          },
          "linkedReservationId": {
            "type": "string",
            "format": "uuid",
            "nullable": true,
            "description": "Çift yönde diğer bacağın rezervasyon kimliği; tek yönde null."
          },
          "linkedPnr": {
            "type": "string",
            "nullable": true,
            "description": "Çift yönde diğer bacağın PNR kodu; tek yönde null."
          },
          "legOrder": {
            "type": "integer",
            "format": "int32",
            "nullable": true,
            "description": "Çift yön sırası: 1 gidiş, 2 dönüş; tek yönde null."
          },
          "transferGroupId": {
            "type": "string",
            "format": "uuid",
            "nullable": true,
            "description": "Varsa transfer grubunun UUID kimliği. Null olabilir; değerin varlığını kontrol edin."
          },
          "groupInfo": {
            "allOf": [
              {
                "$ref": "#/components/schemas/TransferGroupInfoResponse"
              }
            ],
            "description": "Varsa birleşik transfer grubunun yolcu ve durak bilgisi; grup yoksa null olabilir."
          },
          "selectedCrossing": {
            "type": "string",
            "nullable": true,
            "description": "Seçilen geçişin kodu (örneğin Avrasya); görünen ad selectedCrossingName alanındadır. Null olabilir; değerin varlığını kontrol edin."
          },
          "selectedCrossingName": {
            "type": "string",
            "nullable": true,
            "description": "Seçilen geçişin görünen adı. Yalnız tekil detayda doldurulur; listede veya seçim yoksa null olabilir."
          },
          "tollEntryPlazaName": {
            "type": "string",
            "nullable": true,
            "description": "Ücretlendirilen giriş gişesi adı; yalnız uygun tarife ve tekil detayda doldurulur. Null olabilir; değerin varlığını kontrol edin."
          },
          "tollExitPlazaName": {
            "type": "string",
            "nullable": true,
            "description": "Ücretlendirilen çıkış gişesi adı; yalnız uygun tarife ve tekil detayda doldurulur. Null olabilir; değerin varlığını kontrol edin."
          }
        },
        "additionalProperties": false
      },
      "BookingResponseApiResponse": {
        "type": "object",
        "properties": {
          "success": {
            "type": "boolean",
            "description": "İşlem sonucu. HTTP durumuyla birlikte kontrol edin; true başarılı sonucu gösterir."
          },
          "message": {
            "type": "string",
            "nullable": true,
            "description": "İnsan tarafından okunabilen sonuç mesajı. İş akışını bu metni eşleştirerek yönetmeyin. Null olabilir; değerin varlığını kontrol edin."
          },
          "data": {
            "allOf": [
              {
                "$ref": "#/components/schemas/BookingResponse"
              }
            ],
            "description": "İşleme özgü sonuç. Hata yanıtında null olabilir; success kontrol edilmeden kullanılmamalıdır."
          },
          "errors": {
            "type": "array",
            "items": {
              "type": "string"
            },
            "nullable": true,
            "description": "Doğrulama veya işlem hatalarının metin listesi. Başarıda null veya boş olabilir."
          },
          "statusCode": {
            "type": "integer",
            "format": "int32",
            "description": "Yanıt gövdesindeki durum kodu. Ağ katmanındaki HTTP durumunu ayrıca kontrol edin."
          },
          "errorCode": {
            "type": "string",
            "nullable": true,
            "description": "Makine tarafından işlenebilen hata kodu. Başarılı yanıtta veya bazı hata yollarında bulunmayabilir. Null olabilir; değerin varlığını kontrol edin."
          },
          "developerInfo": {
            "nullable": true,
            "description": "Ortama ve hata yoluna bağlı ek tanılama verisi. Varlığına veya yapısına bağımlı entegrasyon kurmayın. Null olabilir; değerin varlığını kontrol edin."
          },
          "correlationId": {
            "type": "string",
            "nullable": true,
            "description": "Destek incelemesi için istek takip kimliği; her yanıtta bulunması garanti edilmez. Null olabilir; değerin varlığını kontrol edin."
          }
        },
        "additionalProperties": false
      },
      "BookingResponseListApiResponse": {
        "type": "object",
        "properties": {
          "success": {
            "type": "boolean",
            "description": "İşlem sonucu. HTTP durumuyla birlikte kontrol edin; true başarılı sonucu gösterir."
          },
          "message": {
            "type": "string",
            "nullable": true,
            "description": "İnsan tarafından okunabilen sonuç mesajı. İş akışını bu metni eşleştirerek yönetmeyin. Null olabilir; değerin varlığını kontrol edin."
          },
          "data": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/BookingResponse"
            },
            "nullable": true,
            "description": "İşleme özgü sonuç. Hata yanıtında null olabilir; success kontrol edilmeden kullanılmamalıdır."
          },
          "errors": {
            "type": "array",
            "items": {
              "type": "string"
            },
            "nullable": true,
            "description": "Doğrulama veya işlem hatalarının metin listesi. Başarıda null veya boş olabilir."
          },
          "statusCode": {
            "type": "integer",
            "format": "int32",
            "description": "Yanıt gövdesindeki durum kodu. Ağ katmanındaki HTTP durumunu ayrıca kontrol edin."
          },
          "errorCode": {
            "type": "string",
            "nullable": true,
            "description": "Makine tarafından işlenebilen hata kodu. Başarılı yanıtta veya bazı hata yollarında bulunmayabilir. Null olabilir; değerin varlığını kontrol edin."
          },
          "developerInfo": {
            "nullable": true,
            "description": "Ortama ve hata yoluna bağlı ek tanılama verisi. Varlığına veya yapısına bağımlı entegrasyon kurmayın. Null olabilir; değerin varlığını kontrol edin."
          },
          "correlationId": {
            "type": "string",
            "nullable": true,
            "description": "Destek incelemesi için istek takip kimliği; her yanıtta bulunması garanti edilmez. Null olabilir; değerin varlığını kontrol edin."
          }
        },
        "additionalProperties": false
      },
      "BookingStopResponse": {
        "type": "object",
        "properties": {
          "id": {
            "type": "integer",
            "format": "int32",
            "description": "Rezervasyondaki durağın kimliği."
          },
          "order": {
            "type": "integer",
            "format": "int32",
            "description": "Rotadaki durak sırası; gösterimde bu alana göre sıralayın."
          },
          "type": {
            "type": "string",
            "nullable": true,
            "description": "Durak türü: Pickup (alış), Waypoint (ara durak), Dropoff (varış). Null olabilir; değerin varlığını kontrol edin."
          },
          "location": {
            "type": "string",
            "nullable": true,
            "description": "Durak adı. Null olabilir; değerin varlığını kontrol edin."
          },
          "locationAddress": {
            "type": "string",
            "nullable": true,
            "description": "Durağın açık adresi. Null olabilir; değerin varlığını kontrol edin."
          },
          "latitude": {
            "type": "number",
            "format": "double",
            "nullable": true,
            "description": "WGS84 enlemi, ondalık derece; kuzey pozitif (-90 ile 90). Null olabilir; değerin varlığını kontrol edin."
          },
          "longitude": {
            "type": "number",
            "format": "double",
            "nullable": true,
            "description": "WGS84 boylamı, ondalık derece; doğu pozitif (-180 ile 180). Null olabilir; değerin varlığını kontrol edin."
          },
          "note": {
            "type": "string",
            "nullable": true,
            "description": "Durağa ilişkin not. Null olabilir; değerin varlığını kontrol edin."
          },
          "estimatedArrival": {
            "type": "string",
            "format": "date-time",
            "nullable": true,
            "description": "Durağa tahmini varış anı; kesin saat garantisi değildir. Null olabilir; değerin varlığını kontrol edin."
          }
        },
        "additionalProperties": false
      },
      "BookingWaypointRequest": {
        "type": "object",
        "properties": {
          "name": {
            "type": "string",
            "nullable": true,
            "description": "Ara durağın görünen adı. Null olabilir; değerin varlığını kontrol edin."
          },
          "latitude": {
            "type": "number",
            "format": "double",
            "description": "WGS84 enlemi, ondalık derece; kuzey pozitif (-90 ile 90)."
          },
          "longitude": {
            "type": "number",
            "format": "double",
            "description": "WGS84 boylamı, ondalık derece; doğu pozitif (-180 ile 180)."
          },
          "placeId": {
            "type": "string",
            "nullable": true,
            "description": "Varsa konum sağlayıcısının yer kimliği; koordinatla aynı yeri göstermelidir. Null olabilir; değerin varlığını kontrol edin."
          }
        },
        "additionalProperties": false
      },
      "CoverageInfo": {
        "type": "object",
        "properties": {
          "status": {
            "type": "string",
            "nullable": true,
            "description": "QuoteEligible: hizmet kapsamında teklif değerlendirmesine uygun; OutOfService: hizmet kapsamı dışında. QuoteEligible araç bulunacağını garanti etmez. Null olabilir; değerin varlığını kontrol edin."
          },
          "serviceableCities": {
            "type": "array",
            "items": {
              "type": "string"
            },
            "nullable": true,
            "description": "Eski istemciler için il düzeyinde kapsam listesi. Kısmen hizmet verilen illerde yanıltıcı olabilir; yeni entegrasyonda serviceableDestinations kullanın. Null olabilir; değerin varlığını kontrol edin."
          },
          "serviceableDestinations": {
            "type": "array",
            "items": {
              "type": "string"
            },
            "nullable": true,
            "description": "Kullanıcıya gösterilecek hizmet bölgeleri: tam açık illerin adları, kısmen açık illerin yalnız açık ilçeleri. Listeyi sabitlemeyin. Null olabilir; değerin varlığını kontrol edin."
          }
        },
        "additionalProperties": false
      },
      "DecimalApiResponse": {
        "type": "object",
        "properties": {
          "success": {
            "type": "boolean",
            "description": "İşlem sonucu. HTTP durumuyla birlikte kontrol edin; true başarılı sonucu gösterir."
          },
          "message": {
            "type": "string",
            "nullable": true,
            "description": "İnsan tarafından okunabilen sonuç mesajı. İş akışını bu metni eşleştirerek yönetmeyin. Null olabilir; değerin varlığını kontrol edin."
          },
          "data": {
            "type": "number",
            "format": "double",
            "description": "Uygulanan iptal kesinti yüzdesi. Örneğin 25, yüzde 25 kesinti anlamındadır; para tutarı değildir."
          },
          "errors": {
            "type": "array",
            "items": {
              "type": "string"
            },
            "nullable": true,
            "description": "Doğrulama veya işlem hatalarının metin listesi. Başarıda null veya boş olabilir."
          },
          "statusCode": {
            "type": "integer",
            "format": "int32",
            "description": "Yanıt gövdesindeki durum kodu. Ağ katmanındaki HTTP durumunu ayrıca kontrol edin."
          },
          "errorCode": {
            "type": "string",
            "nullable": true,
            "description": "Makine tarafından işlenebilen hata kodu. Başarılı yanıtta veya bazı hata yollarında bulunmayabilir. Null olabilir; değerin varlığını kontrol edin."
          },
          "developerInfo": {
            "nullable": true,
            "description": "Ortama ve hata yoluna bağlı ek tanılama verisi. Varlığına veya yapısına bağımlı entegrasyon kurmayın. Null olabilir; değerin varlığını kontrol edin."
          },
          "correlationId": {
            "type": "string",
            "nullable": true,
            "description": "Destek incelemesi için istek takip kimliği; her yanıtta bulunması garanti edilmez. Null olabilir; değerin varlığını kontrol edin."
          }
        },
        "additionalProperties": false
      },
      "ExternalExtraOption": {
        "required": [
          "code",
          "currency",
          "name"
        ],
        "type": "object",
        "properties": {
          "code": {
            "type": "string",
            "nullable": true,
            "description": "Dış tedarikçinin ek hizmet kodu; yeniden fiyatlamada aynen gönderilir. Null olabilir; değerin varlığını kontrol edin."
          },
          "name": {
            "type": "string",
            "nullable": true,
            "description": "Ek hizmetin görünen adı. Null olabilir; değerin varlığını kontrol edin."
          },
          "unitPrice": {
            "type": "number",
            "format": "double",
            "description": "currency para birimindeki birim gösterim bedeli. Kesin toplam için seçimi external-extras ile yeniden fiyatlayın."
          },
          "currency": {
            "type": "string",
            "nullable": true,
            "description": "Birim ek hizmet bedelinin para birimi. Null olabilir; değerin varlığını kontrol edin."
          },
          "maxQuantity": {
            "type": "integer",
            "format": "int32",
            "description": "Bu teklifte seçilebilecek en yüksek adet."
          }
        },
        "additionalProperties": false
      },
      "ExternalExtraSelection": {
        "required": [
          "code"
        ],
        "type": "object",
        "properties": {
          "code": {
            "type": "string",
            "nullable": true,
            "description": "Seçilen teklifin externalExtras listesindeki hizmet kodu. Null olabilir; değerin varlığını kontrol edin."
          },
          "quantity": {
            "type": "integer",
            "format": "int32",
            "description": "Seçilen adet; teklifin maxQuantity sınırını aşmayın."
          }
        },
        "additionalProperties": false
      },
      "ExternalExtrasRequoteRequest": {
        "required": [
          "itemId"
        ],
        "type": "object",
        "properties": {
          "itemId": {
            "type": "string",
            "nullable": true,
            "description": "Dış tedarikçi teklifinin anahtarı; aynı oturum ve müşteri bağlamını koruyun. Null olabilir; değerin varlığını kontrol edin."
          },
          "extras": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/ExternalExtraSelection"
            },
            "nullable": true,
            "description": "Seçilen dış hizmetlerin code ve quantity listesi. Dönen yeni teklif ve koşulları kullanın. Null olabilir; değerin varlığını kontrol edin."
          }
        },
        "additionalProperties": false
      },
      "ExternalServiceConditions": {
        "required": [
          "version"
        ],
        "type": "object",
        "properties": {
          "version": {
            "type": "string",
            "nullable": true,
            "description": "Bu teklifin kabul edilecek koşul sürümü. Yeniden fiyatlamadan sonra değişebilir; rezervasyonda son sürümü aynen gönderin. Null olabilir; değerin varlığını kontrol edin."
          },
          "freeCancellationUntilUtc": {
            "type": "string",
            "format": "date-time",
            "nullable": true,
            "description": "Cezasız iptalin son anı, UTC. Null ise ücretsiz iptal süresi varsaymayın."
          },
          "pickUpTimeZoneId": {
            "type": "string",
            "nullable": true,
            "description": "Alış noktasının saat dilimi kimliği. Null olabilir; değerin varlığını kontrol edin."
          },
          "specialRequestsMinHours": {
            "type": "integer",
            "format": "int32",
            "description": "Özel talepler için alıştan önce gereken asgari süre, saat."
          },
          "waitingMinutes": {
            "type": "integer",
            "format": "int32",
            "nullable": true,
            "description": "Sağlayıcının bildirdiği bekleme süresi, dakika. Null ise bir süre bildirilmemiştir."
          },
          "waitingStartsAt": {
            "type": "string",
            "nullable": true,
            "description": "Beklemenin başlangıç esası: landing uçuş inişi, scheduledPickup planlanan alış saati. Tarih-saat alanı değildir; null ise esas bildirilmemiştir."
          },
          "requiresFlightNumber": {
            "type": "boolean",
            "description": "true ise ilgili bacağın flightNo alanı gereklidir."
          },
          "requiresSupportForSpecialRequests": {
            "type": "boolean",
            "description": "true ise özel talepler için destek ekibiyle iletişim kurulmalıdır; not yazmak tek başına kabul değildir."
          }
        },
        "additionalProperties": false
      },
      "GeoLocation": {
        "type": "object",
        "properties": {
          "name": {
            "type": "string",
            "nullable": true,
            "description": "Konumun görünen adı. Null olabilir; değerin varlığını kontrol edin."
          },
          "latitude": {
            "type": "number",
            "format": "double",
            "description": "WGS84 enlemi, ondalık derece; kuzey pozitif (-90 ile 90)."
          },
          "longitude": {
            "type": "number",
            "format": "double",
            "description": "WGS84 boylamı, ondalık derece; doğu pozitif (-180 ile 180)."
          },
          "district": {
            "type": "string",
            "nullable": true,
            "description": "Varsa konumun ilçe adı. Null olabilir; değerin varlığını kontrol edin."
          },
          "placeId": {
            "type": "string",
            "nullable": true,
            "description": "Varsa konum sağlayıcısının yer kimliği. Null olabilir; değerin varlığını kontrol edin."
          },
          "isAirport": {
            "type": "boolean",
            "nullable": true,
            "description": "Konumun havalimanı olduğuna dair ipucu. true ise havalimanı eşleşmesine öncelik verilir. Null olabilir; değerin varlığını kontrol edin."
          }
        },
        "additionalProperties": false
      },
      "GroupPassengerResponse": {
        "type": "object",
        "properties": {
          "pnr": {
            "type": "string",
            "nullable": true,
            "description": "Yolcunun kaynak rezervasyonunun PNR kodu. Null olabilir; değerin varlığını kontrol edin."
          },
          "name": {
            "type": "string",
            "nullable": true,
            "description": "Grup yolcusunun adı. Null olabilir; değerin varlığını kontrol edin."
          },
          "phone": {
            "type": "string",
            "nullable": true,
            "description": "Grup yolcusunun iletişim telefonu. Null olabilir; değerin varlığını kontrol edin."
          },
          "dropOffLocation": {
            "type": "string",
            "nullable": true,
            "description": "Yolcunun varış noktası adı. Null olabilir; değerin varlığını kontrol edin."
          }
        },
        "additionalProperties": false
      },
      "GroupStopResponse": {
        "type": "object",
        "properties": {
          "order": {
            "type": "integer",
            "format": "int32",
            "description": "Birleşik rotada durağın sırası."
          },
          "type": {
            "type": "string",
            "nullable": true,
            "description": "Birleşik rotadaki durak türü. Null olabilir; değerin varlığını kontrol edin."
          },
          "location": {
            "type": "string",
            "nullable": true,
            "description": "Durak adı. Null olabilir; değerin varlığını kontrol edin."
          },
          "locationAddress": {
            "type": "string",
            "nullable": true,
            "description": "Durağın açık adresi. Null olabilir; değerin varlığını kontrol edin."
          },
          "latitude": {
            "type": "number",
            "format": "double",
            "nullable": true,
            "description": "WGS84 enlemi, ondalık derece; kuzey pozitif (-90 ile 90). Null olabilir; değerin varlığını kontrol edin."
          },
          "longitude": {
            "type": "number",
            "format": "double",
            "nullable": true,
            "description": "WGS84 boylamı, ondalık derece; doğu pozitif (-180 ile 180). Null olabilir; değerin varlığını kontrol edin."
          },
          "pnrs": {
            "type": "array",
            "items": {
              "type": "string"
            },
            "nullable": true,
            "description": "Bu durakla ilişkili rezervasyonların PNR kodları. Null olabilir; değerin varlığını kontrol edin."
          }
        },
        "additionalProperties": false
      },
      "LoginRequest": {
        "type": "object",
        "properties": {
          "userName": {
            "type": "string",
            "nullable": false,
            "minLength": 1,
            "description": "Partner hesabının e-postası veya desteklenen telefon numarası."
          },
          "password": {
            "type": "string",
            "nullable": false,
            "minLength": 6,
            "maxLength": 100,
            "format": "password",
            "writeOnly": true,
            "description": "Partner hesabının şifresi; 6–100 karakter. Token veya destek mesajı olarak paylaşmayın."
          }
        },
        "additionalProperties": false,
        "required": [
          "userName",
          "password"
        ]
      },
      "ObjectApiResponse": {
        "type": "object",
        "properties": {
          "success": {
            "type": "boolean",
            "description": "İşlem sonucu. HTTP durumuyla birlikte kontrol edin; true başarılı sonucu gösterir."
          },
          "message": {
            "type": "string",
            "nullable": true,
            "description": "İnsan tarafından okunabilen sonuç mesajı. İş akışını bu metni eşleştirerek yönetmeyin. Null olabilir; değerin varlığını kontrol edin."
          },
          "data": {
            "nullable": true,
            "description": "İşleme özgü sonuç. Hata yanıtında null olabilir; success kontrol edilmeden kullanılmamalıdır."
          },
          "errors": {
            "type": "array",
            "items": {
              "type": "string"
            },
            "nullable": true,
            "description": "Doğrulama veya işlem hatalarının metin listesi. Başarıda null veya boş olabilir."
          },
          "statusCode": {
            "type": "integer",
            "format": "int32",
            "description": "Yanıt gövdesindeki durum kodu. Ağ katmanındaki HTTP durumunu ayrıca kontrol edin."
          },
          "errorCode": {
            "type": "string",
            "nullable": true,
            "description": "Makine tarafından işlenebilen hata kodu. Başarılı yanıtta veya bazı hata yollarında bulunmayabilir. Null olabilir; değerin varlığını kontrol edin."
          },
          "developerInfo": {
            "nullable": true,
            "description": "Ortama ve hata yoluna bağlı ek tanılama verisi. Varlığına veya yapısına bağımlı entegrasyon kurmayın. Null olabilir; değerin varlığını kontrol edin."
          },
          "correlationId": {
            "type": "string",
            "nullable": true,
            "description": "Destek incelemesi için istek takip kimliği; her yanıtta bulunması garanti edilmez. Null olabilir; değerin varlığını kontrol edin."
          }
        },
        "additionalProperties": false
      },
      "PolicyViolationResponse": {
        "type": "object",
        "properties": {
          "policyDetailId": {
            "type": "integer",
            "format": "int32",
            "description": "Uygulanan politika kuralının detay kimliği."
          },
          "policyTypeId": {
            "type": "integer",
            "format": "int32",
            "description": "Politika türü kimliği."
          },
          "code": {
            "type": "string",
            "nullable": true,
            "description": "İstemcinin değerlendirebileceği politika ihlali kodu. Null olabilir; değerin varlığını kontrol edin."
          },
          "scope": {
            "type": "string",
            "nullable": true,
            "description": "İhlalin uygulandığı kapsam. Null olabilir; değerin varlığını kontrol edin."
          },
          "message": {
            "type": "string",
            "nullable": true,
            "description": "Kullanıcıya gösterilebilen politika açıklaması. Null olabilir; değerin varlığını kontrol edin."
          },
          "isBlocking": {
            "type": "boolean",
            "description": "true ise ihlal bu teklifle rezervasyon yapılmasını engeller."
          }
        },
        "additionalProperties": false
      },
      "ProblemDetails": {
        "type": "object",
        "properties": {
          "type": {
            "type": "string",
            "nullable": true,
            "description": "Sorun türünü tanımlayan URI. Null olabilir; değerin varlığını kontrol edin."
          },
          "title": {
            "type": "string",
            "nullable": true,
            "description": "Sorunun kısa, insan tarafından okunabilen başlığı. Null olabilir; değerin varlığını kontrol edin."
          },
          "status": {
            "type": "integer",
            "format": "int32",
            "nullable": true,
            "description": "HTTP durum kodu. Null olabilir; değerin varlığını kontrol edin."
          },
          "detail": {
            "type": "string",
            "nullable": true,
            "description": "Bu istekteki sorunun açıklaması. Null olabilir; değerin varlığını kontrol edin."
          },
          "instance": {
            "type": "string",
            "nullable": true,
            "description": "Sorun oluşan isteği tanımlayan URI. Null olabilir; değerin varlığını kontrol edin."
          }
        },
        "additionalProperties": {}
      },
      "RefreshTokenRequest": {
        "type": "object",
        "properties": {
          "token": {
            "type": "string",
            "nullable": true,
            "description": "Önceki login veya refresh yanıtındaki refreshToken. accessToken göndermeyin. Null olabilir; değerin varlığını kontrol edin."
          },
          "whiteLabelSupplierId": {
            "type": "integer",
            "format": "int32",
            "nullable": true,
            "description": "Yalnız white-label oturumunda ilişkili tedarikçi kimliği; oturum kapsamını korumak için kullanılır. Null olabilir; değerin varlığını kontrol edin."
          }
        },
        "additionalProperties": false
      },
      "ReturnLegRequest": {
        "type": "object",
        "properties": {
          "itemId": {
            "type": "string",
            "nullable": true,
            "description": "Dönüş yönü için ayrı müsaitlik aramasından alınan güncel teklif anahtarı. Null olabilir; değerin varlığını kontrol edin."
          },
          "note": {
            "type": "string",
            "nullable": true,
            "description": "Yalnız dönüş bacağının transfer notu. Null olabilir; değerin varlığını kontrol edin."
          },
          "flightNo": {
            "type": "string",
            "nullable": true,
            "description": "Yalnız dönüş bacağının uçuş numarası; dönüş hizmet koşullarına göre zorunlu olabilir. Null olabilir; değerin varlığını kontrol edin."
          },
          "costCenterId": {
            "type": "integer",
            "format": "int32",
            "nullable": true,
            "description": "Dönüş bacağı için tanımlı maliyet merkezi kimliği. Null olabilir; değerin varlığını kontrol edin."
          },
          "supplierExtraIds": {
            "type": "array",
            "items": {
              "type": "integer",
              "format": "int32"
            },
            "nullable": true,
            "description": "Dönüş teklifinin tedarikçisinden seçilen ek hizmet kimlikleri. Null olabilir; değerin varlığını kontrol edin."
          },
          "waypoints": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/BookingWaypointRequest"
            },
            "nullable": true,
            "description": "Dönüş aramasında fiyatlanan sıralı ara duraklar. Null olabilir; değerin varlığını kontrol edin."
          },
          "overrideNetAmount": {
            "type": "number",
            "format": "double",
            "nullable": true,
            "description": "Yalnız yetkili tedarikçi için dönüşe özel net TRY fiyatı, en az 0. Partner müşteri entegrasyonunda göndermeyin. Null olabilir; değerin varlığını kontrol edin."
          }
        },
        "additionalProperties": false
      },
      "RouteOptionDto": {
        "required": [
          "crossing",
          "crossingName",
          "distance",
          "isDefault",
          "itemId",
          "priceDifference",
          "tollFee",
          "totalPrice",
          "travelTime"
        ],
        "type": "object",
        "properties": {
          "itemId": {
            "type": "string",
            "nullable": true,
            "description": "Bu rota seçilirse rezervasyonda kullanılacak teklif anahtarı; ilk aramadaki anahtardan farklı olabilir. Null olabilir; değerin varlığını kontrol edin."
          },
          "crossing": {
            "allOf": [
              {
                "$ref": "#/components/schemas/TollRoadType"
              }
            ],
            "description": "Geçiş türünün kodu."
          },
          "crossingName": {
            "type": "string",
            "nullable": true,
            "description": "Geçişin görünen adı. Null olabilir; değerin varlığını kontrol edin."
          },
          "isDefault": {
            "type": "boolean",
            "description": "İlk teklifle eşleşen varsayılan rota olup olmadığı."
          },
          "distance": {
            "type": "string",
            "nullable": true,
            "description": "Bu seçeneğin rota mesafesi gösterim metni. Null olabilir; değerin varlığını kontrol edin."
          },
          "travelTime": {
            "type": "string",
            "nullable": true,
            "description": "Bu seçeneğin tahmini yolculuk süresi gösterim metni. Null olabilir; değerin varlığını kontrol edin."
          },
          "tollFee": {
            "type": "number",
            "format": "double",
            "description": "currency cinsinden geçiş ücreti; totalPrice üzerine tekrar eklenmez."
          },
          "totalPrice": {
            "type": "number",
            "format": "double",
            "description": "currency cinsinden sunucunun hesapladığı toplam KDV dahil fiyat."
          },
          "netAmount": {
            "type": "number",
            "format": "double",
            "description": "currency cinsinden net tutar."
          },
          "vatAmount": {
            "type": "number",
            "format": "double",
            "description": "currency cinsinden KDV tutarı."
          },
          "chargeAmount": {
            "type": "number",
            "format": "double",
            "description": "chargeCurrency cinsinden tahsil edilecek KDV dahil toplam."
          },
          "chargeCurrency": {
            "type": "string",
            "nullable": true,
            "description": "Tahsilat para birimi; mevcut akışta TRY. Null olabilir; değerin varlığını kontrol edin."
          },
          "priceDifference": {
            "type": "number",
            "format": "double",
            "description": "currency cinsinden varsayılan rota toplamına göre fiyat farkı; negatif değer daha ucuz seçeneği gösterir."
          },
          "currency": {
            "type": "string",
            "nullable": true,
            "description": "Rota seçeneğinin görüntüleme para birimi. Null olabilir; değerin varlığını kontrol edin."
          },
          "entryPlazaName": {
            "type": "string",
            "nullable": true,
            "description": "Geçiş ücretinin hesaplandığı giriş gişesi adı. Null olabilir; değerin varlığını kontrol edin."
          },
          "exitPlazaName": {
            "type": "string",
            "nullable": true,
            "description": "Geçiş ücretinin hesaplandığı çıkış gişesi adı. Null olabilir; değerin varlığını kontrol edin."
          },
          "polyline": {
            "type": "string",
            "nullable": true,
            "description": "Fiyatlanan seçeneğin Google encoded polyline geometrisi; boşsa harita çizimi için veri yoktur. Null olabilir; değerin varlığını kontrol edin."
          }
        },
        "additionalProperties": false
      },
      "RouteOptionDtoIReadOnlyListApiResponse": {
        "type": "object",
        "properties": {
          "success": {
            "type": "boolean",
            "description": "İşlem sonucu. HTTP durumuyla birlikte kontrol edin; true başarılı sonucu gösterir."
          },
          "message": {
            "type": "string",
            "nullable": true,
            "description": "İnsan tarafından okunabilen sonuç mesajı. İş akışını bu metni eşleştirerek yönetmeyin. Null olabilir; değerin varlığını kontrol edin."
          },
          "data": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/RouteOptionDto"
            },
            "nullable": true,
            "description": "İşleme özgü sonuç. Hata yanıtında null olabilir; success kontrol edilmeden kullanılmamalıdır."
          },
          "errors": {
            "type": "array",
            "items": {
              "type": "string"
            },
            "nullable": true,
            "description": "Doğrulama veya işlem hatalarının metin listesi. Başarıda null veya boş olabilir."
          },
          "statusCode": {
            "type": "integer",
            "format": "int32",
            "description": "Yanıt gövdesindeki durum kodu. Ağ katmanındaki HTTP durumunu ayrıca kontrol edin."
          },
          "errorCode": {
            "type": "string",
            "nullable": true,
            "description": "Makine tarafından işlenebilen hata kodu. Başarılı yanıtta veya bazı hata yollarında bulunmayabilir. Null olabilir; değerin varlığını kontrol edin."
          },
          "developerInfo": {
            "nullable": true,
            "description": "Ortama ve hata yoluna bağlı ek tanılama verisi. Varlığına veya yapısına bağımlı entegrasyon kurmayın. Null olabilir; değerin varlığını kontrol edin."
          },
          "correlationId": {
            "type": "string",
            "nullable": true,
            "description": "Destek incelemesi için istek takip kimliği; her yanıtta bulunması garanti edilmez. Null olabilir; değerin varlığını kontrol edin."
          }
        },
        "additionalProperties": false
      },
      "RouteOptionsRequest": {
        "type": "object",
        "properties": {
          "itemId": {
            "type": "string",
            "nullable": true,
            "description": "Müsaitlik yanıtında seçilen aracın teklif anahtarı; aynı oturum ve müşteri bağlamını koruyun. Null olabilir; değerin varlığını kontrol edin."
          }
        },
        "additionalProperties": false
      },
      "SalesChannel": {
        "enum": [
          0,
          1
        ],
        "type": "integer",
        "format": "int32",
        "description": "0: mevcut standart satış kanalı; 1: anonim white-label satış. Sunucu tarafından belirlenir."
      },
      "TollRoadType": {
        "enum": [
          "NormalYol",
          "FSM",
          "Temmuz15",
          "YSS",
          "Avrasya",
          "Osmangazi",
          "Canakkale1915"
        ],
        "type": "string",
        "description": "NormalYol: ücretli geçiş yok; FSM: Fatih Sultan Mehmet; Temmuz15: 15 Temmuz Şehitler; YSS: Yavuz Sultan Selim; Avrasya: Avrasya Tüneli; Osmangazi: Osmangazi; Canakkale1915: 1915 Çanakkale geçişi."
      },
      "TransferGroupInfoResponse": {
        "type": "object",
        "properties": {
          "transferGroupId": {
            "type": "string",
            "format": "uuid",
            "description": "Birleşik transfer grubunun UUID kimliği."
          },
          "totalTransfers": {
            "type": "integer",
            "format": "int32",
            "description": "Gruba bağlı transfer sayısı."
          },
          "allPnrs": {
            "type": "array",
            "items": {
              "type": "string"
            },
            "nullable": true,
            "description": "Gruba bağlı rezervasyonların PNR kodları. Null olabilir; değerin varlığını kontrol edin."
          },
          "allPassengers": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/GroupPassengerResponse"
            },
            "nullable": true,
            "description": "Grubun yolcu ve kaynak rezervasyon bilgileri. Null olabilir; değerin varlığını kontrol edin."
          },
          "combinedStops": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/GroupStopResponse"
            },
            "nullable": true,
            "description": "Grup için birleştirilmiş sıralı rota durakları. Null olabilir; değerin varlığını kontrol edin."
          }
        },
        "additionalProperties": false
      },
      "TransferStatusDto": {
        "type": "object",
        "properties": {
          "id": {
            "type": "integer",
            "format": "int32",
            "description": "BookingResponse.status ile eşleşen durum kimliği."
          },
          "labelTr": {
            "type": "string",
            "nullable": true,
            "description": "Durumun Türkçe etiketi. Null olabilir; değerin varlığını kontrol edin."
          },
          "labelEn": {
            "type": "string",
            "nullable": true,
            "description": "Durumun İngilizce etiketi. Null olabilir; değerin varlığını kontrol edin."
          },
          "variant": {
            "type": "string",
            "nullable": true,
            "description": "Görsel durum rozeti için stil ipucu; iş kuralı değildir. Null olabilir; değerin varlığını kontrol edin."
          },
          "color": {
            "type": "string",
            "nullable": true,
            "description": "Görsel durum rozeti için renk kodu; iş kuralı değildir. Null olabilir; değerin varlığını kontrol edin."
          },
          "isCancellable": {
            "type": "boolean",
            "description": "Bu durumda iptal genel olarak desteklenir. Rezervasyona özgü koşullar ve yetki ayrıca uygulanır."
          },
          "isEditable": {
            "type": "boolean",
            "description": "Bu durumda düzenleme genel olarak desteklenir. Rezervasyona özgü koşullar ve yetki ayrıca uygulanır."
          },
          "isTerminal": {
            "type": "boolean",
            "description": "Durum akışın son durumlarından biriyse true."
          },
          "isLive": {
            "type": "boolean",
            "description": "Transferin canlı operasyon aşamasında olduğunu gösterir."
          },
          "sortOrder": {
            "type": "integer",
            "format": "int32",
            "description": "Durumların gösterim sırası."
          },
          "allowedOpsActions": {
            "type": "array",
            "items": {
              "type": "string"
            },
            "nullable": true,
            "description": "Operasyon arayüzünün aksiyon adları; partner hesabına işlem yetkisi vermez ve bu portalda ek endpoint tanımlamaz. Null olabilir; değerin varlığını kontrol edin."
          }
        },
        "additionalProperties": false
      },
      "TransferStatusDtoListApiResponse": {
        "type": "object",
        "properties": {
          "success": {
            "type": "boolean",
            "description": "İşlem sonucu. HTTP durumuyla birlikte kontrol edin; true başarılı sonucu gösterir."
          },
          "message": {
            "type": "string",
            "nullable": true,
            "description": "İnsan tarafından okunabilen sonuç mesajı. İş akışını bu metni eşleştirerek yönetmeyin. Null olabilir; değerin varlığını kontrol edin."
          },
          "data": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/TransferStatusDto"
            },
            "nullable": true,
            "description": "İşleme özgü sonuç. Hata yanıtında null olabilir; success kontrol edilmeden kullanılmamalıdır."
          },
          "errors": {
            "type": "array",
            "items": {
              "type": "string"
            },
            "nullable": true,
            "description": "Doğrulama veya işlem hatalarının metin listesi. Başarıda null veya boş olabilir."
          },
          "statusCode": {
            "type": "integer",
            "format": "int32",
            "description": "Yanıt gövdesindeki durum kodu. Ağ katmanındaki HTTP durumunu ayrıca kontrol edin."
          },
          "errorCode": {
            "type": "string",
            "nullable": true,
            "description": "Makine tarafından işlenebilen hata kodu. Başarılı yanıtta veya bazı hata yollarında bulunmayabilir. Null olabilir; değerin varlığını kontrol edin."
          },
          "developerInfo": {
            "nullable": true,
            "description": "Ortama ve hata yoluna bağlı ek tanılama verisi. Varlığına veya yapısına bağımlı entegrasyon kurmayın. Null olabilir; değerin varlığını kontrol edin."
          },
          "correlationId": {
            "type": "string",
            "nullable": true,
            "description": "Destek incelemesi için istek takip kimliği; her yanıtta bulunması garanti edilmez. Null olabilir; değerin varlığını kontrol edin."
          }
        },
        "additionalProperties": false
      },
      "UpdateBookingRequest": {
        "type": "object",
        "properties": {
          "pickUpTime": {
            "type": "string",
            "nullable": true,
            "description": "Yeni alış anı. Yeni entegrasyonlar tam ISO 8601 tarih-saat göndermelidir. Eski HH:mm biçimi mevcut rezervasyonun Türkiye takvim gününe uygulanır; gün değiştirmez. Gönderilmezse korunur. Null olabilir; değerin varlığını kontrol edin."
          },
          "flightNo": {
            "type": "string",
            "nullable": true,
            "description": "Yeni uçuş numarası; boş veya gönderilmemişse mevcut değer korunur. Silmek için clearFlightNo kullanın. Null olabilir; değerin varlığını kontrol edin."
          },
          "clearFlightNo": {
            "type": "boolean",
            "description": "true ise uçuş numarasını siler; flightNo değerinden önceliklidir."
          },
          "note": {
            "type": "string",
            "nullable": true,
            "description": "Yeni transfer notu; boş veya gönderilmemişse mevcut değer korunur. Silmek için clearNote kullanın. Null olabilir; değerin varlığını kontrol edin."
          },
          "clearNote": {
            "type": "boolean",
            "description": "true ise notu siler; note değerinden önceliklidir."
          },
          "passengerRequests": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/BookingPassengerRequest"
            },
            "nullable": true,
            "description": "Dolu liste tüm yolcu koleksiyonunun yerini alır; listede bulunmayan mevcut yolcular kaldırılır. Kalacak yolcuların passengerId değerlerini koruyun. Gönderilmeyen/boş liste mevcut yolcuları korur. Null olabilir; değerin varlığını kontrol edin."
          }
        },
        "additionalProperties": false
      },
      "VehicleResponse": {
        "type": "object",
        "properties": {
          "salesChannel": {
            "allOf": [
              {
                "$ref": "#/components/schemas/SalesChannel"
              }
            ],
            "description": "Teklifin satış kanalı; istemcinin seçtiği bir rezervasyon yetkisi değildir."
          },
          "commercePublicationVersion": {
            "type": "integer",
            "format": "int32",
            "nullable": true,
            "readOnly": true,
            "description": "Teklifin bağlı olduğu satış yayını sürümü; varsa gösterilen koşulların izlenmesi içindir. Null olabilir; değerin varlığını kontrol edin."
          },
          "financialPolicyVersion": {
            "type": "integer",
            "format": "int32",
            "nullable": true,
            "readOnly": true,
            "description": "Teklifin bağlı olduğu finansal koşul sürümü; istemci fiyat üretmek için kullanmaz. Null olabilir; değerin varlığını kontrol edin."
          },
          "itemId": {
            "type": "string",
            "nullable": true,
            "description": "Rezervasyonda kullanılacak teklif anahtarı. Teklif ve oturum bağlamıyla birlikte değerlendirilir. Null olabilir; değerin varlığını kontrol edin."
          },
          "vehicleTypeId": {
            "type": "integer",
            "format": "int32",
            "description": "Araç sınıfının kimliği; tekil araç kimliği değildir."
          },
          "vehicleType": {
            "type": "string",
            "nullable": true,
            "description": "Araç sınıfının görünen adı. Null olabilir; değerin varlığını kontrol edin."
          },
          "typeDescription": {
            "type": "string",
            "nullable": true,
            "description": "Araç sınıfı açıklaması. Null olabilir; değerin varlığını kontrol edin."
          },
          "baseRate": {
            "type": "number",
            "format": "double",
            "description": "currency cinsinden tarife başlangıç katsayısı. Bilgilendirme içindir; toplam fiyatı yeniden hesaplamayın."
          },
          "perKilometerRate": {
            "type": "number",
            "format": "double",
            "description": "currency/kilometre cinsinden tarife katsayısı. Bilgilendirme içindir."
          },
          "minimumKilometers": {
            "type": "integer",
            "format": "int32",
            "description": "Mesafe tarifesinde kullanılan asgari kilometre değeri."
          },
          "seat": {
            "type": "integer",
            "format": "int32",
            "nullable": true,
            "description": "Bildirilen yolcu/koltuk kapasitesi; teklifleri seçerken yolcu sayısıyla karşılaştırın. Null olabilir; değerin varlığını kontrol edin."
          },
          "baggage": {
            "type": "integer",
            "format": "int32",
            "nullable": true,
            "description": "Bildirilen bagaj kapasitesi, adet; özel boyutlar için hizmet koşullarını kontrol edin. Null olabilir; değerin varlığını kontrol edin."
          },
          "vehicleTypePhoto": {
            "type": "string",
            "nullable": true,
            "description": "Araç sınıfını temsil eden görselin adresi; atanacak gerçek aracı garanti etmez. Null olabilir; değerin varlığını kontrol edin."
          },
          "baseFee": {
            "type": "number",
            "format": "double",
            "nullable": true,
            "description": "currency cinsinden tarife taban bedeli; müşteri toplamı grossAmount alanıdır. Null olabilir; değerin varlığını kontrol edin."
          },
          "netAmount": {
            "type": "number",
            "format": "double",
            "description": "Görüntüleme para birimindeki net tutar."
          },
          "roadName": {
            "allOf": [
              {
                "$ref": "#/components/schemas/TollRoadType"
              }
            ],
            "description": "Fiyatlanan rotanın geçiş türü."
          },
          "tollRoadFee": {
            "type": "number",
            "format": "double",
            "description": "Görüntüleme para birimindeki geçiş ücreti. Toplama ikinci kez eklemeyin."
          },
          "tollEntryPlazaId": {
            "type": "integer",
            "format": "int32",
            "nullable": true,
            "description": "Ücretlendirilen giriş gişesinin kimliği; uygun tarifede doldurulur. Null olabilir; değerin varlığını kontrol edin."
          },
          "tollEntryPlazaName": {
            "type": "string",
            "nullable": true,
            "description": "Ücretlendirilen giriş gişesinin adı. Null olabilir; değerin varlığını kontrol edin."
          },
          "tollExitPlazaId": {
            "type": "integer",
            "format": "int32",
            "nullable": true,
            "description": "Ücretlendirilen çıkış gişesinin kimliği. Null olabilir; değerin varlığını kontrol edin."
          },
          "tollExitPlazaName": {
            "type": "string",
            "nullable": true,
            "description": "Ücretlendirilen çıkış gişesinin adı. Null olabilir; değerin varlığını kontrol edin."
          },
          "supplierName": {
            "type": "string",
            "nullable": true,
            "description": "Teklifi sağlayan tedarikçinin adı. Null olabilir; değerin varlığını kontrol edin."
          },
          "supplierId": {
            "type": "integer",
            "format": "int32",
            "description": "Teklif tedarikçisinin kimliği; iç ek hizmetleri sorgulamak için kullanılır."
          },
          "supplierShortCode": {
            "type": "string",
            "nullable": true,
            "description": "Müşterinin bu tedarikçi için tanımladığı eşleştirme kısa kodu; tedarikçi oturumunda null olabilir."
          },
          "isExternalSupplier": {
            "type": "boolean",
            "description": "Teklif dış tedarikçiden geliyor. Hizmet koşullarını ayrıca kontrol edin."
          },
          "serviceConditions": {
            "allOf": [
              {
                "$ref": "#/components/schemas/ExternalServiceConditions"
              }
            ],
            "description": "Dış teklifin kullanıcıya gösterilip kabul ettirilecek hizmet koşulları; iç tekliflerde null olabilir."
          },
          "externalExtras": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/ExternalExtraOption"
            },
            "nullable": true,
            "description": "Bu dış teklif için seçilebilir code/adet tabanlı ek hizmetler. Null olabilir; değerin varlığını kontrol edin."
          },
          "selectedExternalExtras": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/ExternalExtraSelection"
            },
            "nullable": true,
            "description": "Teklifte fiyatlanmış dış ek hizmet seçimleri; son yeniden fiyatlama yanıtı esastır. Null olabilir; değerin varlığını kontrol edin."
          },
          "pickUpTimeZoneId": {
            "type": "string",
            "nullable": true,
            "description": "Alış noktasının saat dilimi kimliği. Null olabilir; değerin varlığını kontrol edin."
          },
          "freeCancellationUntilUtc": {
            "type": "string",
            "format": "date-time",
            "nullable": true,
            "description": "Teklifte bildirilen cezasız iptal son zamanı (UTC). Null ise bu alandan bir süre garantisi çıkarılamaz."
          },
          "policyMessage": {
            "type": "string",
            "nullable": true,
            "description": "Teklife ilişkin politika açıklaması. Yeni entegrasyonlarda policyViolations ve isPolicyBlocked da değerlendirilmelidir. Null olabilir; değerin varlığını kontrol edin."
          },
          "policyViolations": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/PolicyViolationResponse"
            },
            "nullable": true,
            "description": "Sunucunun belirlediği politika ihlalleri ve engelleme bilgileri. Null olabilir; değerin varlığını kontrol edin."
          },
          "isPolicyBlocked": {
            "type": "boolean",
            "readOnly": true,
            "description": "true ise bu teklif politikalar nedeniyle rezerve edilemez."
          },
          "fixedPrice": {
            "type": "number",
            "format": "double",
            "nullable": true,
            "description": "Varsa currency cinsinden sabit tarife bedeli; kullanıcıya gösterilecek son toplam grossAmount alanıdır. Null olabilir; değerin varlığını kontrol edin."
          },
          "supplierRouteId": {
            "type": "integer",
            "format": "int32",
            "nullable": true,
            "description": "Varsa eşleşen tedarikçi rota tarifesinin kimliği; rezervasyonda itemId kullanılır. Null olabilir; değerin varlığını kontrol edin."
          },
          "hourlyRate": {
            "type": "number",
            "format": "double",
            "description": "currency/saat cinsinden tahsis tarife katsayısı; nihai teklif tutarı değildir."
          },
          "isBandedAllocation": {
            "type": "boolean",
            "description": "Fiyatın saat/kilometre tahsis bandından gelip gelmediği."
          },
          "allocationKmLimit": {
            "type": "integer",
            "format": "int32",
            "nullable": true,
            "description": "Eşleşen tahsis bandının kilometre sınırı; bilgilendirme içindir. Null olabilir; değerin varlığını kontrol edin."
          },
          "allocationKmOverageFeePerKm": {
            "type": "number",
            "format": "double",
            "nullable": true,
            "description": "Eşleşen tahsis bandının currency/kilometre cinsinden aşım bedeli; bilgilendirme içindir. Null olabilir; değerin varlığını kontrol edin."
          },
          "tollCrossingUnverified": {
            "type": "boolean",
            "description": "Ücretlendirilen gişe ile etiketlenen geçişin eşleşmediğini gösterir; müşteriye kesin geçiş vaadi üretmeyin."
          },
          "tollForeignCrossingMatched": {
            "type": "boolean",
            "description": "Rota geometrisinde etiketlenen geçiş dışında ek bir Boğaz geçişi bulunduğunu gösterir."
          },
          "hasRouteAlternative": {
            "type": "boolean",
            "description": "Alternatif rota sorgulanabilir; seçeneklerin mutlaka döneceğini garanti etmez."
          },
          "isFromFixedPrice": {
            "type": "boolean",
            "description": "Teklifin sabit fiyatlı tarifeden gelip gelmediği."
          },
          "currency": {
            "type": "string",
            "nullable": true,
            "example": "EUR",
            "description": "Görüntüleme para birimi. Null olabilir; değerin varlığını kontrol edin."
          },
          "currencySymbol": {
            "type": "string",
            "nullable": true,
            "example": "€",
            "description": "Görüntüleme para biriminin sembolü. Null olabilir; değerin varlığını kontrol edin."
          },
          "vatRate": {
            "type": "number",
            "format": "double",
            "description": "KDV oranı, yüzde olarak (örneğin 20)."
          },
          "vatAmount": {
            "type": "number",
            "format": "double",
            "description": "Görüntüleme para birimindeki KDV tutarı."
          },
          "grossAmount": {
            "type": "number",
            "format": "double",
            "description": "Gösterilecek KDV dahil toplam. Sunucu değerini kullanın; geçiş ücreti ve KDV ayrıştırması nedeniyle netAmount + vatAmount her teklifte aynı sonucu vermez."
          },
          "chargeAmount": {
            "type": "number",
            "format": "double",
            "description": "Tahsilat tutarı; para birimi chargeCurrency alanındadır."
          },
          "waypointCount": {
            "type": "integer",
            "format": "int32",
            "description": "Teklifte fiyatlanan ara durak sayısı."
          },
          "waypointNetAmount": {
            "type": "number",
            "format": "double",
            "description": "currency cinsinden ara durak net bedeli; toplamın içindedir."
          },
          "waypointVatAmount": {
            "type": "number",
            "format": "double",
            "description": "currency cinsinden ara durak KDV tutarı; toplamın içindedir."
          },
          "waypointGrossAmount": {
            "type": "number",
            "format": "double",
            "description": "currency cinsinden ara durak KDV dahil bedeli; toplamın içindedir."
          },
          "chargeCurrency": {
            "type": "string",
            "nullable": true,
            "description": "Tahsilat para birimi; mevcut akışta TRY. Null olabilir; değerin varlığını kontrol edin."
          }
        },
        "additionalProperties": false
      },
      "VehicleResponseApiResponse": {
        "type": "object",
        "properties": {
          "success": {
            "type": "boolean",
            "description": "İşlem sonucu. HTTP durumuyla birlikte kontrol edin; true başarılı sonucu gösterir."
          },
          "message": {
            "type": "string",
            "nullable": true,
            "description": "İnsan tarafından okunabilen sonuç mesajı. İş akışını bu metni eşleştirerek yönetmeyin. Null olabilir; değerin varlığını kontrol edin."
          },
          "data": {
            "allOf": [
              {
                "$ref": "#/components/schemas/VehicleResponse"
              }
            ],
            "description": "İşleme özgü sonuç. Hata yanıtında null olabilir; success kontrol edilmeden kullanılmamalıdır."
          },
          "errors": {
            "type": "array",
            "items": {
              "type": "string"
            },
            "nullable": true,
            "description": "Doğrulama veya işlem hatalarının metin listesi. Başarıda null veya boş olabilir."
          },
          "statusCode": {
            "type": "integer",
            "format": "int32",
            "description": "Yanıt gövdesindeki durum kodu. Ağ katmanındaki HTTP durumunu ayrıca kontrol edin."
          },
          "errorCode": {
            "type": "string",
            "nullable": true,
            "description": "Makine tarafından işlenebilen hata kodu. Başarılı yanıtta veya bazı hata yollarında bulunmayabilir. Null olabilir; değerin varlığını kontrol edin."
          },
          "developerInfo": {
            "nullable": true,
            "description": "Ortama ve hata yoluna bağlı ek tanılama verisi. Varlığına veya yapısına bağımlı entegrasyon kurmayın. Null olabilir; değerin varlığını kontrol edin."
          },
          "correlationId": {
            "type": "string",
            "nullable": true,
            "description": "Destek incelemesi için istek takip kimliği; her yanıtta bulunması garanti edilmez. Null olabilir; değerin varlığını kontrol edin."
          }
        },
        "additionalProperties": false
      },
      "TokenResponse": {
        "type": "object",
        "properties": {
          "accessToken": {
            "type": "string",
            "description": "Bearer erişim token'ı."
          },
          "refreshToken": {
            "type": "string",
            "description": "Token yenileme isteğinde token alanına gönderilecek değer."
          },
          "accessTokenExpiration": {
            "type": "string",
            "description": "Erişim token'ının bitiş zamanı.",
            "format": "date-time"
          },
          "refreshTokenExpiration": {
            "type": "string",
            "description": "Yenileme token'ının bitiş zamanı.",
            "format": "date-time"
          },
          "tokenType": {
            "type": "string",
            "description": "Erişim token türü; Bearer.",
            "example": "Bearer"
          },
          "expiresIn": {
            "type": "integer",
            "format": "int32",
            "description": "Erişim token'ının kalan ömrü, saniye.",
            "readOnly": true
          }
        },
        "additionalProperties": false
      },
      "FailedWaypointInfo": {
        "type": "object",
        "properties": {
          "name": {
            "type": "string",
            "description": "Çözümlenemeyen ara durağın adı. Null olabilir; değerin varlığını kontrol edin.",
            "nullable": true
          },
          "placeId": {
            "type": "string",
            "description": "Ara durağın yer kimliği. Null olabilir; değerin varlığını kontrol edin.",
            "nullable": true
          },
          "reason": {
            "type": "string",
            "description": "Ara durağın eklenememe nedeni."
          }
        },
        "additionalProperties": false
      },
      "BookingCreatedResponse": {
        "type": "object",
        "properties": {
          "transferReservationId": {
            "type": "string",
            "description": "Oluşturulan rezervasyonun kimliği.",
            "format": "uuid"
          },
          "pnr": {
            "type": "string",
            "description": "Rezervasyon takip kodu."
          },
          "failedWaypoints": {
            "type": "array",
            "nullable": true,
            "items": {
              "$ref": "#/components/schemas/FailedWaypointInfo"
            },
            "description": "Eklenemeyen ara duraklar. Null veya boş liste, hata olmadığını gösterir."
          },
          "returnReservationId": {
            "type": "string",
            "description": "Dönüş rezervasyonu kimliği; tek yönde null.",
            "format": "uuid",
            "nullable": true
          },
          "returnPnr": {
            "type": "string",
            "description": "Dönüş rezervasyonu takip kodu; tek yönde null.",
            "nullable": true
          }
        },
        "additionalProperties": false
      },
      "UserResponse": {
        "type": "object",
        "properties": {
          "id": {
            "type": "integer",
            "format": "int32",
            "description": "Kullanıcı kimliği."
          },
          "userName": {
            "type": "string",
            "description": "Kullanıcı adı."
          },
          "firstName": {
            "type": "string",
            "description": "Kullanıcının adı."
          },
          "lastName": {
            "type": "string",
            "description": "Kullanıcının soyadı."
          },
          "fullName": {
            "type": "string",
            "description": "Kullanıcının tam adı."
          },
          "email": {
            "type": "string",
            "description": "Kullanıcının e-posta adresi."
          },
          "phoneNumber": {
            "type": "string",
            "description": "Telefon numarası."
          },
          "companyId": {
            "type": "integer",
            "format": "int32",
            "description": "Şirket kimliği."
          },
          "userTypeLookupId": {
            "type": "integer",
            "format": "int32",
            "description": "Kullanıcı tipi kimliği. Null olabilir; değerin varlığını kontrol edin.",
            "nullable": true
          },
          "userTitleLookupId": {
            "type": "integer",
            "format": "int32",
            "description": "Kullanıcı rolü kimliği. Null olabilir; değerin varlığını kontrol edin.",
            "nullable": true
          }
        },
        "additionalProperties": false
      },
      "TokenResponseApiResponse": {
        "type": "object",
        "properties": {
          "success": {
            "type": "boolean",
            "description": "İşlem sonucu. HTTP durumuyla birlikte kontrol edin; true başarılı sonucu gösterir."
          },
          "message": {
            "type": "string",
            "nullable": true,
            "description": "İnsan tarafından okunabilen sonuç mesajı. İş akışını bu metni eşleştirerek yönetmeyin. Null olabilir; değerin varlığını kontrol edin."
          },
          "data": {
            "allOf": [
              {
                "$ref": "#/components/schemas/TokenResponse"
              }
            ],
            "description": "İşleme özgü sonuç. Hata yanıtında null olabilir; success kontrol edilmeden kullanılmamalıdır."
          },
          "errors": {
            "type": "array",
            "items": {
              "type": "string"
            },
            "nullable": true,
            "description": "Doğrulama veya işlem hatalarının metin listesi. Başarıda null veya boş olabilir."
          },
          "statusCode": {
            "type": "integer",
            "format": "int32",
            "description": "Yanıt gövdesindeki durum kodu. Ağ katmanındaki HTTP durumunu ayrıca kontrol edin."
          },
          "errorCode": {
            "type": "string",
            "nullable": true,
            "description": "Makine tarafından işlenebilen hata kodu. Başarılı yanıtta veya bazı hata yollarında bulunmayabilir. Null olabilir; değerin varlığını kontrol edin."
          },
          "developerInfo": {
            "nullable": true,
            "description": "Ortama ve hata yoluna bağlı ek tanılama verisi. Varlığına veya yapısına bağımlı entegrasyon kurmayın. Null olabilir; değerin varlığını kontrol edin."
          },
          "correlationId": {
            "type": "string",
            "nullable": true,
            "description": "Destek incelemesi için istek takip kimliği; her yanıtta bulunması garanti edilmez. Null olabilir; değerin varlığını kontrol edin."
          }
        },
        "additionalProperties": false
      },
      "BookingCreatedResponseApiResponse": {
        "type": "object",
        "properties": {
          "success": {
            "type": "boolean",
            "description": "İşlem sonucu. HTTP durumuyla birlikte kontrol edin; true başarılı sonucu gösterir."
          },
          "message": {
            "type": "string",
            "nullable": true,
            "description": "İnsan tarafından okunabilen sonuç mesajı. İş akışını bu metni eşleştirerek yönetmeyin. Null olabilir; değerin varlığını kontrol edin."
          },
          "data": {
            "allOf": [
              {
                "$ref": "#/components/schemas/BookingCreatedResponse"
              }
            ],
            "description": "İşleme özgü sonuç. Hata yanıtında null olabilir; success kontrol edilmeden kullanılmamalıdır."
          },
          "errors": {
            "type": "array",
            "items": {
              "type": "string"
            },
            "nullable": true,
            "description": "Doğrulama veya işlem hatalarının metin listesi. Başarıda null veya boş olabilir."
          },
          "statusCode": {
            "type": "integer",
            "format": "int32",
            "description": "Yanıt gövdesindeki durum kodu. Ağ katmanındaki HTTP durumunu ayrıca kontrol edin."
          },
          "errorCode": {
            "type": "string",
            "nullable": true,
            "description": "Makine tarafından işlenebilen hata kodu. Başarılı yanıtta veya bazı hata yollarında bulunmayabilir. Null olabilir; değerin varlığını kontrol edin."
          },
          "developerInfo": {
            "nullable": true,
            "description": "Ortama ve hata yoluna bağlı ek tanılama verisi. Varlığına veya yapısına bağımlı entegrasyon kurmayın. Null olabilir; değerin varlığını kontrol edin."
          },
          "correlationId": {
            "type": "string",
            "nullable": true,
            "description": "Destek incelemesi için istek takip kimliği; her yanıtta bulunması garanti edilmez. Null olabilir; değerin varlığını kontrol edin."
          }
        },
        "additionalProperties": false
      },
      "UserResponseApiResponse": {
        "type": "object",
        "properties": {
          "success": {
            "type": "boolean",
            "description": "İşlem sonucu. HTTP durumuyla birlikte kontrol edin; true başarılı sonucu gösterir."
          },
          "message": {
            "type": "string",
            "nullable": true,
            "description": "İnsan tarafından okunabilen sonuç mesajı. İş akışını bu metni eşleştirerek yönetmeyin. Null olabilir; değerin varlığını kontrol edin."
          },
          "data": {
            "allOf": [
              {
                "$ref": "#/components/schemas/UserResponse"
              }
            ],
            "description": "İşleme özgü sonuç. Hata yanıtında null olabilir; success kontrol edilmeden kullanılmamalıdır."
          },
          "errors": {
            "type": "array",
            "items": {
              "type": "string"
            },
            "nullable": true,
            "description": "Doğrulama veya işlem hatalarının metin listesi. Başarıda null veya boş olabilir."
          },
          "statusCode": {
            "type": "integer",
            "format": "int32",
            "description": "Yanıt gövdesindeki durum kodu. Ağ katmanındaki HTTP durumunu ayrıca kontrol edin."
          },
          "errorCode": {
            "type": "string",
            "nullable": true,
            "description": "Makine tarafından işlenebilen hata kodu. Başarılı yanıtta veya bazı hata yollarında bulunmayabilir. Null olabilir; değerin varlığını kontrol edin."
          },
          "developerInfo": {
            "nullable": true,
            "description": "Ortama ve hata yoluna bağlı ek tanılama verisi. Varlığına veya yapısına bağımlı entegrasyon kurmayın. Null olabilir; değerin varlığını kontrol edin."
          },
          "correlationId": {
            "type": "string",
            "nullable": true,
            "description": "Destek incelemesi için istek takip kimliği; her yanıtta bulunması garanti edilmez. Null olabilir; değerin varlığını kontrol edin."
          }
        },
        "additionalProperties": false
      }
    },
    "securitySchemes": {
      "Bearer": {
        "type": "http",
        "description": "Login yanıtındaki data.accessToken. Authorization başlığında Bearer ile gönderilir.",
        "scheme": "bearer",
        "bearerFormat": "JWT"
      }
    }
  },
  "security": [
    {
      "Bearer": []
    }
  ],
  "tags": [
    {
      "name": "Kimlik doğrulama",
      "description": "Oturum açma ve token yenileme."
    },
    {
      "name": "Müsaitlik",
      "description": "Teklif, alternatif rota ve ek hizmetler."
    },
    {
      "name": "Rezervasyon",
      "description": "Oluşturma, sorgulama, güncelleme ve iptal."
    },
    {
      "name": "Profil",
      "description": "Oturum açmış kullanıcı."
    }
  ],
  "servers": [
    {
      "url": "https://test-api.yolcugo.com",
      "description": "Test ortamı"
    }
  ]
}
