{
  "openapi": "3.0.1",
  "info": {
    "title": "TranigoNew Mobile API",
    "description": "Tranigo mobil uygulaması (müşteri): üyelik, arama, rezervasyon. Kimlik: `/mobile/v1/auth/login` ile alınan `Authorization: Bearer cttm_…` erişim token'ı (60 dk); süresi dolunca `/mobile/v1/auth/refresh` ile yenileyin.",
    "version": "mobile-v1"
  },
  "paths": {
    "/mobile/v1/app/config": {
      "get": {
        "tags": [
          "MobileApp"
        ],
        "summary": "Açılış ayarları: bu sürüm güncellenmeli mi, mağaza linki, destek telefonu / WhatsApp / e-posta.",
        "parameters": [
          {
            "name": "platform",
            "in": "query",
            "description": "`ios` / `android`.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "version",
            "in": "query",
            "description": "Uygulama sürümü, ör. `1.4.0`.",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "429": {
            "description": "Too Many Requests",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ProblemDetails"
                }
              }
            }
          },
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/AppConfigResponse"
                }
              }
            }
          }
        }
      }
    },
    "/mobile/v1/app/installations": {
      "post": {
        "tags": [
          "MobileApp"
        ],
        "summary": "Kurulum bilgisi (sürüm, platform, dil, push token). Her açılışta, girişten sonra ve push token değişince çağrılır.\r\nMüşteri token'ı varsa kurulum o müşteriye bağlanır; yoksa mevcut bağ korunur (çıkış için `sign-out`).",
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/InstallationReportRequest"
              }
            },
            "text/json": {
              "schema": {
                "$ref": "#/components/schemas/InstallationReportRequest"
              }
            },
            "application/*+json": {
              "schema": {
                "$ref": "#/components/schemas/InstallationReportRequest"
              }
            }
          }
        },
        "responses": {
          "429": {
            "description": "Too Many Requests",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ProblemDetails"
                }
              }
            }
          },
          "204": {
            "description": "No Content"
          },
          "400": {
            "description": "Bad Request",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ValidationProblemDetails"
                }
              }
            }
          }
        }
      }
    },
    "/mobile/v1/app/installations/{installationId}/sign-out": {
      "post": {
        "tags": [
          "MobileApp"
        ],
        "summary": "Çıkıştan önce çağrılır: kurulumun müşteri bağı kaldırılır (kişisel bildirimler bu telefona artık gitmez).",
        "parameters": [
          {
            "name": "installationId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          }
        ],
        "responses": {
          "429": {
            "description": "Too Many Requests",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ProblemDetails"
                }
              }
            }
          },
          "204": {
            "description": "No Content"
          },
          "401": {
            "description": "Unauthorized",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ProblemDetails"
                }
              }
            }
          }
        }
      }
    },
    "/mobile/v1/app/campaigns/{campaignId}/opened": {
      "post": {
        "tags": [
          "MobileApp"
        ],
        "summary": "Kampanya bildirimine dokunulup uygulama açıldı (Admin → Mobil Uygulama → Bildirimler'deki \"Açılma\"). Aynı kurulumdan tekrarlar\r\nsayılmaz (uygulama da bir kez gönderir). Bilinmeyen kampanya sessizce yok sayılır.",
        "parameters": [
          {
            "name": "campaignId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/CampaignOpenedRequest"
              }
            },
            "text/json": {
              "schema": {
                "$ref": "#/components/schemas/CampaignOpenedRequest"
              }
            },
            "application/*+json": {
              "schema": {
                "$ref": "#/components/schemas/CampaignOpenedRequest"
              }
            }
          }
        },
        "responses": {
          "429": {
            "description": "Too Many Requests",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ProblemDetails"
                }
              }
            }
          },
          "204": {
            "description": "No Content"
          }
        }
      }
    },
    "/mobile/v1/auth/register": {
      "post": {
        "tags": [
          "MobileAuth"
        ],
        "summary": "Yeni hesap. E-posta kayıtlıysa 409.",
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/RegisterRequest"
              }
            },
            "text/json": {
              "schema": {
                "$ref": "#/components/schemas/RegisterRequest"
              }
            },
            "application/*+json": {
              "schema": {
                "$ref": "#/components/schemas/RegisterRequest"
              }
            }
          }
        },
        "responses": {
          "201": {
            "description": "Created",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/TokenResponse"
                }
              }
            }
          },
          "409": {
            "description": "Conflict",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ProblemDetails"
                }
              }
            }
          }
        }
      }
    },
    "/mobile/v1/auth/login": {
      "post": {
        "tags": [
          "MobileAuth"
        ],
        "summary": "Giriş. Yanlış bilgi 401 (nedeni söylenmez).",
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/LoginRequest"
              }
            },
            "text/json": {
              "schema": {
                "$ref": "#/components/schemas/LoginRequest"
              }
            },
            "application/*+json": {
              "schema": {
                "$ref": "#/components/schemas/LoginRequest"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/TokenResponse"
                }
              }
            }
          },
          "401": {
            "description": "Unauthorized",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ProblemDetails"
                }
              }
            }
          }
        }
      }
    },
    "/mobile/v1/auth/apple": {
      "post": {
        "tags": [
          "MobileAuth"
        ],
        "summary": "Sign in with Apple (iOS). Token sunucuda doğrulanır; hesap Apple kimliğiyle ya da Apple'ın doğruladığı e-postayla eşleşir, yoksa\r\naçılır (telefon ilk rezervasyonda sorulur). Geçersiz token 401; Apple e-posta vermediyse ve bağlı hesap yoksa 422;\r\nApple ile giriş ayarlı değilse 503.",
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/AppleSignInBody"
              }
            },
            "text/json": {
              "schema": {
                "$ref": "#/components/schemas/AppleSignInBody"
              }
            },
            "application/*+json": {
              "schema": {
                "$ref": "#/components/schemas/AppleSignInBody"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/TokenResponse"
                }
              }
            }
          },
          "401": {
            "description": "Unauthorized",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ProblemDetails"
                }
              }
            }
          },
          "422": {
            "description": "Unprocessable Content",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ProblemDetails"
                }
              }
            }
          },
          "503": {
            "description": "Service Unavailable",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ProblemDetails"
                }
              }
            }
          }
        }
      }
    },
    "/mobile/v1/auth/google": {
      "post": {
        "tags": [
          "MobileAuth"
        ],
        "summary": "Google ile giriş (iOS / Android). Sitedeki Google girişiyle aynı hesap kuralları: bağlı Google hesabı ya da Google'ın doğruladığı\r\ne-postayla hesap; yoksa açılır. Geçersiz token 401; Google e-postası doğrulanmamışsa 422; kapalıysa 503.",
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/GoogleSignInBody"
              }
            },
            "text/json": {
              "schema": {
                "$ref": "#/components/schemas/GoogleSignInBody"
              }
            },
            "application/*+json": {
              "schema": {
                "$ref": "#/components/schemas/GoogleSignInBody"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/TokenResponse"
                }
              }
            }
          },
          "401": {
            "description": "Unauthorized",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ProblemDetails"
                }
              }
            }
          },
          "422": {
            "description": "Unprocessable Content",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ProblemDetails"
                }
              }
            }
          },
          "503": {
            "description": "Service Unavailable",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ProblemDetails"
                }
              }
            }
          }
        }
      }
    },
    "/mobile/v1/auth/refresh": {
      "post": {
        "tags": [
          "MobileAuth"
        ],
        "summary": "Erişim token'ını yeniler. Yenileme token'ı tek kullanımlıktır; aynı token ikinci kez gelirse oturum kapanır.",
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/RefreshRequest"
              }
            },
            "text/json": {
              "schema": {
                "$ref": "#/components/schemas/RefreshRequest"
              }
            },
            "application/*+json": {
              "schema": {
                "$ref": "#/components/schemas/RefreshRequest"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/TokenResponse"
                }
              }
            }
          },
          "401": {
            "description": "Unauthorized",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ProblemDetails"
                }
              }
            }
          }
        }
      }
    },
    "/mobile/v1/auth/logout": {
      "post": {
        "tags": [
          "MobileAuth"
        ],
        "summary": "Çıkış: oturumun yenileme token'ları iptal edilir.",
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/RefreshRequest"
              }
            },
            "text/json": {
              "schema": {
                "$ref": "#/components/schemas/RefreshRequest"
              }
            },
            "application/*+json": {
              "schema": {
                "$ref": "#/components/schemas/RefreshRequest"
              }
            }
          }
        },
        "responses": {
          "204": {
            "description": "No Content"
          }
        }
      }
    },
    "/mobile/v1/auth/forgot-password": {
      "post": {
        "tags": [
          "MobileAuth"
        ],
        "summary": "Şifre sıfırlama kodu e-postayla gönderilir. Hesap olup olmadığı söylenmez — her zaman 202.",
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/ForgotPasswordRequest"
              }
            },
            "text/json": {
              "schema": {
                "$ref": "#/components/schemas/ForgotPasswordRequest"
              }
            },
            "application/*+json": {
              "schema": {
                "$ref": "#/components/schemas/ForgotPasswordRequest"
              }
            }
          }
        },
        "responses": {
          "202": {
            "description": "Accepted"
          }
        }
      }
    },
    "/mobile/v1/auth/reset-password": {
      "post": {
        "tags": [
          "MobileAuth"
        ],
        "summary": "Kodla yeni şifre. Kod hatalı/süresi dolmuş/çok deneme: 422 (`reason` alanında).",
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/ResetPasswordRequest"
              }
            },
            "text/json": {
              "schema": {
                "$ref": "#/components/schemas/ResetPasswordRequest"
              }
            },
            "application/*+json": {
              "schema": {
                "$ref": "#/components/schemas/ResetPasswordRequest"
              }
            }
          }
        },
        "responses": {
          "204": {
            "description": "No Content"
          },
          "422": {
            "description": "Unprocessable Content",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ProblemDetails"
                }
              }
            }
          }
        }
      }
    },
    "/mobile/v1/bookings/{code}/manage": {
      "get": {
        "tags": [
          "MobileBookingManage"
        ],
        "summary": "İptal / değişiklik yapılabilir mi, iptal ücreti ve tahmini iade.",
        "parameters": [
          {
            "name": "code",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "401": {
            "description": "Unauthorized",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ProblemDetails"
                }
              }
            }
          },
          "429": {
            "description": "Too Many Requests",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ProblemDetails"
                }
              }
            }
          },
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ManageBookingResponse"
                }
              }
            }
          },
          "404": {
            "description": "Not Found",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ProblemDetails"
                }
              }
            }
          }
        }
      }
    },
    "/mobile/v1/bookings/{code}/cancel": {
      "post": {
        "tags": [
          "MobileBookingManage"
        ],
        "summary": "Rezervasyonu iptal eder (gidiş-dönüşte kalan bacaklarla). Kartla ödenmişse iptal ücreti düşülerek karta iade edilir; iade\r\nyapılamazsa iptal yine geçerlidir (`refundPending`). İptal edilemiyorsa 422 `reason` (manage'deki cancelBlock).",
        "parameters": [
          {
            "name": "code",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "401": {
            "description": "Unauthorized",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ProblemDetails"
                }
              }
            }
          },
          "429": {
            "description": "Too Many Requests",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ProblemDetails"
                }
              }
            }
          },
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/CancelBookingResponse"
                }
              }
            }
          },
          "422": {
            "description": "Unprocessable Content",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ProblemDetails"
                }
              }
            }
          },
          "404": {
            "description": "Not Found",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ProblemDetails"
                }
              }
            }
          }
        }
      }
    },
    "/mobile/v1/bookings/{code}/details": {
      "put": {
        "tags": [
          "MobileBookingManage"
        ],
        "summary": "Yolcu, tarih-saat ve uçuş / otel bilgisini günceller (iptal süresiyle aynı pencerede). Değişen alanlar admine bildirilir.\r\nPencere kapandıysa 422 `reason=TooLate`; geçersiz bilgi 422 `reason=Invalid`.",
        "parameters": [
          {
            "name": "code",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/EditBookingBody"
              }
            },
            "text/json": {
              "schema": {
                "$ref": "#/components/schemas/EditBookingBody"
              }
            },
            "application/*+json": {
              "schema": {
                "$ref": "#/components/schemas/EditBookingBody"
              }
            }
          }
        },
        "responses": {
          "401": {
            "description": "Unauthorized",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ProblemDetails"
                }
              }
            }
          },
          "429": {
            "description": "Too Many Requests",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ProblemDetails"
                }
              }
            }
          },
          "204": {
            "description": "No Content"
          },
          "422": {
            "description": "Unprocessable Content",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ProblemDetails"
                }
              }
            }
          },
          "404": {
            "description": "Not Found",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ProblemDetails"
                }
              }
            }
          }
        }
      }
    },
    "/mobile/v1/bookings": {
      "post": {
        "tags": [
          "MobileBookings"
        ],
        "summary": "Rezervasyon açar; dönen `payment.url` ödeme sayfasıdır. Kapalı gün / süre / kapasite kuralları 422.\r\nGiriş yapmadan da açılır (web sitesindeki gibi misafir rezervasyonu): o zaman `passenger` zorunludur, rezervasyon bir hesaba\r\nbağlanmaz ve yanıttaki `accessToken` ile görüntülenir (cüzdan kullanılamaz). Misafir rezervasyonunun istek sınırı daha sıkıdır.",
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/CreateMobileBookingRequest"
              }
            },
            "text/json": {
              "schema": {
                "$ref": "#/components/schemas/CreateMobileBookingRequest"
              }
            },
            "application/*+json": {
              "schema": {
                "$ref": "#/components/schemas/CreateMobileBookingRequest"
              }
            }
          }
        },
        "responses": {
          "401": {
            "description": "Unauthorized",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ProblemDetails"
                }
              }
            }
          },
          "429": {
            "description": "Too Many Requests",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ProblemDetails"
                }
              }
            }
          },
          "201": {
            "description": "Created",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/MobileBookingResponse"
                }
              }
            }
          },
          "422": {
            "description": "Unprocessable Content",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ProblemDetails"
                }
              }
            }
          }
        }
      },
      "get": {
        "tags": [
          "MobileBookings"
        ],
        "summary": "Rezervasyonlarım (en yeni önce). Dönüşlü rezervasyonlar tek kayıt olarak gelir.",
        "parameters": [
          {
            "name": "language",
            "in": "query",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "401": {
            "description": "Unauthorized",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ProblemDetails"
                }
              }
            }
          },
          "429": {
            "description": "Too Many Requests",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ProblemDetails"
                }
              }
            }
          },
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/MobileBookingResponse"
                  }
                }
              }
            }
          }
        }
      }
    },
    "/mobile/v1/bookings/guest/{token}": {
      "get": {
        "tags": [
          "MobileBookings"
        ],
        "summary": "Misafir rezervasyonu, rezervasyon anahtarıyla (girişsiz): oluştururken dönen `accessToken` ya da sitedeki /my-booking\r\nbağlantısındaki anahtar. Geçersiz / süresi dolmuş anahtar 404.",
        "parameters": [
          {
            "name": "token",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "language",
            "in": "query",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "401": {
            "description": "Unauthorized",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ProblemDetails"
                }
              }
            }
          },
          "429": {
            "description": "Too Many Requests",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ProblemDetails"
                }
              }
            }
          },
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/MobileBookingResponse"
                }
              }
            }
          },
          "404": {
            "description": "Not Found",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ProblemDetails"
                }
              }
            }
          }
        }
      }
    },
    "/mobile/v1/bookings/{code}/payment": {
      "get": {
        "tags": [
          "MobileBookings"
        ],
        "parameters": [
          {
            "name": "code",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "language",
            "in": "query",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "401": {
            "description": "Unauthorized",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ProblemDetails"
                }
              }
            }
          },
          "429": {
            "description": "Too Many Requests",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ProblemDetails"
                }
              }
            }
          },
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/MobilePaymentOptionsResponse"
                }
              }
            }
          }
        }
      }
    },
    "/mobile/v1/bookings/guest/{token}/payment": {
      "get": {
        "tags": [
          "MobileBookings"
        ],
        "parameters": [
          {
            "name": "token",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "language",
            "in": "query",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "401": {
            "description": "Unauthorized",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ProblemDetails"
                }
              }
            }
          },
          "429": {
            "description": "Too Many Requests",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ProblemDetails"
                }
              }
            }
          },
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/MobilePaymentOptionsResponse"
                }
              }
            }
          }
        }
      }
    },
    "/mobile/v1/bookings/{code}/payment/discount": {
      "post": {
        "tags": [
          "MobileBookings"
        ],
        "summary": "Kupon ve/veya cüzdan (sitedeki Step3 ile aynı kural). Geçersiz kupon 422 (`errors.couponCode` = red nedeni).",
        "parameters": [
          {
            "name": "code",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "language",
            "in": "query",
            "schema": {
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/MobileDiscountRequest"
              }
            },
            "text/json": {
              "schema": {
                "$ref": "#/components/schemas/MobileDiscountRequest"
              }
            },
            "application/*+json": {
              "schema": {
                "$ref": "#/components/schemas/MobileDiscountRequest"
              }
            }
          }
        },
        "responses": {
          "401": {
            "description": "Unauthorized",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ProblemDetails"
                }
              }
            }
          },
          "429": {
            "description": "Too Many Requests",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ProblemDetails"
                }
              }
            }
          },
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/MobilePaymentOptionsResponse"
                }
              }
            }
          }
        }
      }
    },
    "/mobile/v1/bookings/guest/{token}/payment/discount": {
      "post": {
        "tags": [
          "MobileBookings"
        ],
        "parameters": [
          {
            "name": "token",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "language",
            "in": "query",
            "schema": {
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/MobileDiscountRequest"
              }
            },
            "text/json": {
              "schema": {
                "$ref": "#/components/schemas/MobileDiscountRequest"
              }
            },
            "application/*+json": {
              "schema": {
                "$ref": "#/components/schemas/MobileDiscountRequest"
              }
            }
          }
        },
        "responses": {
          "401": {
            "description": "Unauthorized",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ProblemDetails"
                }
              }
            }
          },
          "429": {
            "description": "Too Many Requests",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ProblemDetails"
                }
              }
            }
          },
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/MobilePaymentOptionsResponse"
                }
              }
            }
          }
        }
      }
    },
    "/mobile/v1/bookings/{code}/payment/cash": {
      "post": {
        "tags": [
          "MobileBookings"
        ],
        "summary": "Nakit (şoföre ödeme) ile tamamla — firma nakit kabul ediyorsa (sitedeki Step3 ile aynı).",
        "parameters": [
          {
            "name": "code",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "language",
            "in": "query",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "401": {
            "description": "Unauthorized",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ProblemDetails"
                }
              }
            }
          },
          "429": {
            "description": "Too Many Requests",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ProblemDetails"
                }
              }
            }
          },
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/MobileBookingResponse"
                }
              }
            }
          }
        }
      }
    },
    "/mobile/v1/bookings/guest/{token}/payment/cash": {
      "post": {
        "tags": [
          "MobileBookings"
        ],
        "parameters": [
          {
            "name": "token",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "language",
            "in": "query",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "401": {
            "description": "Unauthorized",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ProblemDetails"
                }
              }
            }
          },
          "429": {
            "description": "Too Many Requests",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ProblemDetails"
                }
              }
            }
          },
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/MobileBookingResponse"
                }
              }
            }
          }
        }
      }
    },
    "/mobile/v1/bookings/{code}/payment/card": {
      "post": {
        "tags": [
          "MobileBookings"
        ],
        "summary": "Kart ile öde (iyzico; tamamı ya da ön ödeme). 3DS'te bankanın sayfası döner, uygulama içinde açılır.",
        "parameters": [
          {
            "name": "code",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/MobileCardPaymentRequest"
              }
            },
            "text/json": {
              "schema": {
                "$ref": "#/components/schemas/MobileCardPaymentRequest"
              }
            },
            "application/*+json": {
              "schema": {
                "$ref": "#/components/schemas/MobileCardPaymentRequest"
              }
            }
          }
        },
        "responses": {
          "401": {
            "description": "Unauthorized",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ProblemDetails"
                }
              }
            }
          },
          "429": {
            "description": "Too Many Requests",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ProblemDetails"
                }
              }
            }
          },
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/MobileCardPaymentResult"
                }
              }
            }
          }
        }
      }
    },
    "/mobile/v1/bookings/guest/{token}/payment/card": {
      "post": {
        "tags": [
          "MobileBookings"
        ],
        "parameters": [
          {
            "name": "token",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/MobileCardPaymentRequest"
              }
            },
            "text/json": {
              "schema": {
                "$ref": "#/components/schemas/MobileCardPaymentRequest"
              }
            },
            "application/*+json": {
              "schema": {
                "$ref": "#/components/schemas/MobileCardPaymentRequest"
              }
            }
          }
        },
        "responses": {
          "401": {
            "description": "Unauthorized",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ProblemDetails"
                }
              }
            }
          },
          "429": {
            "description": "Too Many Requests",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ProblemDetails"
                }
              }
            }
          },
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/MobileCardPaymentResult"
                }
              }
            }
          }
        }
      }
    },
    "/mobile/v1/bookings/{code}/confirmation": {
      "get": {
        "tags": [
          "MobileBookings"
        ],
        "parameters": [
          {
            "name": "code",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "language",
            "in": "query",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "401": {
            "description": "Unauthorized",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ProblemDetails"
                }
              }
            }
          },
          "429": {
            "description": "Too Many Requests",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ProblemDetails"
                }
              }
            }
          },
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/MobileConfirmationResponse"
                }
              }
            }
          }
        }
      }
    },
    "/mobile/v1/bookings/guest/{token}/confirmation": {
      "get": {
        "tags": [
          "MobileBookings"
        ],
        "parameters": [
          {
            "name": "token",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "language",
            "in": "query",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "401": {
            "description": "Unauthorized",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ProblemDetails"
                }
              }
            }
          },
          "429": {
            "description": "Too Many Requests",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ProblemDetails"
                }
              }
            }
          },
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/MobileConfirmationResponse"
                }
              }
            }
          }
        }
      }
    },
    "/mobile/v1/bookings/guest/{token}/account": {
      "post": {
        "tags": [
          "MobileBookings"
        ],
        "summary": "Misafir rezervasyonundan hesap — sitedeki onay sayfasındaki \"hızlı üyelik\" ile aynı kural: bu e-postayla şifreli hesap varsa\r\naçılmaz (`exists`, giriş yapınca rezervasyon hesaba eklenir); yoksa rastgele şifre YALNIZCA rezervasyondaki e-postaya gider,\r\notomatik giriş yok, rezervasyon (iki bacağı) yeni hesaba bağlanır. Yalnızca rezervasyon \"Yeni\" iken.",
        "parameters": [
          {
            "name": "token",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "language",
            "in": "query",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "401": {
            "description": "Unauthorized",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ProblemDetails"
                }
              }
            }
          },
          "429": {
            "description": "Too Many Requests",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ProblemDetails"
                }
              }
            }
          },
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/MobileQuickAccountResult"
                }
              }
            }
          },
          "409": {
            "description": "Conflict",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ProblemDetails"
                }
              }
            }
          }
        }
      }
    },
    "/mobile/v1/bookings/{code}": {
      "get": {
        "tags": [
          "MobileBookings"
        ],
        "summary": "Tek rezervasyon (gidiş ya da dönüş koduyla). Başkasının rezervasyonu 404.",
        "parameters": [
          {
            "name": "code",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "language",
            "in": "query",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "401": {
            "description": "Unauthorized",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ProblemDetails"
                }
              }
            }
          },
          "429": {
            "description": "Too Many Requests",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ProblemDetails"
                }
              }
            }
          },
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/MobileBookingResponse"
                }
              }
            }
          },
          "404": {
            "description": "Not Found",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ProblemDetails"
                }
              }
            }
          }
        }
      }
    },
    "/mobile/v1/locations": {
      "get": {
        "tags": [
          "MobileCatalog"
        ],
        "summary": "Havalimanı / bölge arama (en az 2 karakter).",
        "parameters": [
          {
            "name": "q",
            "in": "query",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "401": {
            "description": "Unauthorized",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ProblemDetails"
                }
              }
            }
          },
          "429": {
            "description": "Too Many Requests",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ProblemDetails"
                }
              }
            }
          },
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/LocationResponse"
                  }
                }
              }
            }
          }
        }
      }
    },
    "/mobile/v1/locations/{regionId}/destinations": {
      "get": {
        "tags": [
          "MobileCatalog"
        ],
        "summary": "Bu bölgeden transfer yapılabilen varış bölgeleri.",
        "parameters": [
          {
            "name": "regionId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          }
        ],
        "responses": {
          "401": {
            "description": "Unauthorized",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ProblemDetails"
                }
              }
            }
          },
          "429": {
            "description": "Too Many Requests",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ProblemDetails"
                }
              }
            }
          },
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/LocationResponse"
                  }
                }
              }
            }
          }
        }
      }
    },
    "/mobile/v1/search": {
      "get": {
        "tags": [
          "MobileCatalog"
        ],
        "summary": "Fiyatlı araç seçenekleri (en ucuzdan pahalıya). Rezervasyonda `priceId` kullanılır. `paymentMethods`:\r\no firmanın kabul ettiği ödeme yöntemleri (CreditCard, PartialPayment, Cash).\r\n`time` (HH:mm, Türkiye saati) verilirse web sitesiyle aynı saat kontrolü uygulanır: geçmiş saat, firmanın en az\r\nrezervasyon süresi ve kapalı günler (dönüş için `returnDate` + `returnTime`). Verilmezse yalnızca gün bazında.",
        "parameters": [
          {
            "name": "fromRegionId",
            "in": "query",
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          },
          {
            "name": "toRegionId",
            "in": "query",
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          },
          {
            "name": "date",
            "in": "query",
            "schema": {
              "type": "string",
              "format": "date"
            }
          },
          {
            "name": "passengers",
            "in": "query",
            "schema": {
              "type": "integer",
              "format": "int32",
              "default": 1
            }
          },
          {
            "name": "currency",
            "in": "query",
            "schema": {
              "$ref": "#/components/schemas/CurrencyType"
            }
          },
          {
            "name": "time",
            "in": "query",
            "schema": {
              "type": "string",
              "format": "time"
            }
          },
          {
            "name": "returnDate",
            "in": "query",
            "schema": {
              "type": "string",
              "format": "date"
            }
          },
          {
            "name": "returnTime",
            "in": "query",
            "schema": {
              "type": "string",
              "format": "time"
            }
          }
        ],
        "responses": {
          "401": {
            "description": "Unauthorized",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ProblemDetails"
                }
              }
            }
          },
          "429": {
            "description": "Too Many Requests",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ProblemDetails"
                }
              }
            }
          },
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/TransferOffersResult"
                }
              }
            }
          }
        }
      }
    },
    "/mobile/v1/home": {
      "get": {
        "tags": [
          "MobileHome"
        ],
        "parameters": [
          {
            "name": "language",
            "in": "query",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "currency",
            "in": "query",
            "schema": {
              "$ref": "#/components/schemas/CurrencyType"
            }
          }
        ],
        "responses": {
          "401": {
            "description": "Unauthorized",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ProblemDetails"
                }
              }
            }
          },
          "429": {
            "description": "Too Many Requests",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ProblemDetails"
                }
              }
            }
          },
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/MobileHomeResponse"
                }
              }
            }
          }
        }
      }
    },
    "/mobile/v1/links/reservation/{token}": {
      "get": {
        "tags": [
          "MobileLinks"
        ],
        "summary": "Rezervasyon bağlantısı (/{dil}/my-booking/{token}).",
        "parameters": [
          {
            "name": "token",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/LinkTargetResponse"
                }
              }
            }
          },
          "404": {
            "description": "Not Found",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ProblemDetails"
                }
              }
            }
          }
        }
      }
    },
    "/mobile/v1/links/review/{token}": {
      "get": {
        "tags": [
          "MobileLinks"
        ],
        "summary": "Değerlendirme bağlantısı (/{dil}/review/{token}).",
        "parameters": [
          {
            "name": "token",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/LinkTargetResponse"
                }
              }
            }
          },
          "404": {
            "description": "Not Found",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ProblemDetails"
                }
              }
            }
          }
        }
      }
    },
    "/mobile/v1/me": {
      "get": {
        "tags": [
          "MobileMe"
        ],
        "responses": {
          "401": {
            "description": "Unauthorized",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ProblemDetails"
                }
              }
            }
          },
          "429": {
            "description": "Too Many Requests",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ProblemDetails"
                }
              }
            }
          },
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ProfileResponse"
                }
              }
            }
          }
        }
      },
      "put": {
        "tags": [
          "MobileMe"
        ],
        "summary": "Profil güncelleme. Yeni e-posta başka hesapta kayıtlıysa 409.",
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/UpdateProfileBody"
              }
            },
            "text/json": {
              "schema": {
                "$ref": "#/components/schemas/UpdateProfileBody"
              }
            },
            "application/*+json": {
              "schema": {
                "$ref": "#/components/schemas/UpdateProfileBody"
              }
            }
          }
        },
        "responses": {
          "401": {
            "description": "Unauthorized",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ProblemDetails"
                }
              }
            }
          },
          "429": {
            "description": "Too Many Requests",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ProblemDetails"
                }
              }
            }
          },
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ProfileResponse"
                }
              }
            }
          },
          "409": {
            "description": "Conflict",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ProblemDetails"
                }
              }
            }
          }
        }
      }
    },
    "/mobile/v1/me/password": {
      "post": {
        "tags": [
          "MobileMe"
        ],
        "summary": "Şifre değiştirme. Mevcut şifre yanlışsa 422.",
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/ChangePasswordBody"
              }
            },
            "text/json": {
              "schema": {
                "$ref": "#/components/schemas/ChangePasswordBody"
              }
            },
            "application/*+json": {
              "schema": {
                "$ref": "#/components/schemas/ChangePasswordBody"
              }
            }
          }
        },
        "responses": {
          "401": {
            "description": "Unauthorized",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ProblemDetails"
                }
              }
            }
          },
          "429": {
            "description": "Too Many Requests",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ProblemDetails"
                }
              }
            }
          },
          "204": {
            "description": "No Content"
          },
          "422": {
            "description": "Unprocessable Content",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ProblemDetails"
                }
              }
            }
          }
        }
      }
    },
    "/mobile/v1/me/email/verify": {
      "post": {
        "tags": [
          "MobileMe"
        ],
        "summary": "E-posta doğrulama kodu: kayıttan sonra hesabın e-postası ya da profilden istenen yeni e-posta (`pendingEmail`). Başarılı\r\ndoğrulamada aynı e-postayla yapılmış misafir rezervasyonları hesaba bağlanır. 422 `reason`: InvalidCode, Expired, TooManyAttempts.",
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/VerifyEmailBody"
              }
            },
            "text/json": {
              "schema": {
                "$ref": "#/components/schemas/VerifyEmailBody"
              }
            },
            "application/*+json": {
              "schema": {
                "$ref": "#/components/schemas/VerifyEmailBody"
              }
            }
          }
        },
        "responses": {
          "401": {
            "description": "Unauthorized",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ProblemDetails"
                }
              }
            }
          },
          "429": {
            "description": "Too Many Requests",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ProblemDetails"
                }
              }
            }
          },
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ProfileResponse"
                }
              }
            }
          },
          "422": {
            "description": "Unprocessable Content",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ProblemDetails"
                }
              }
            }
          }
        }
      }
    },
    "/mobile/v1/me/email/resend": {
      "post": {
        "tags": [
          "MobileMe"
        ],
        "summary": "Doğrulama kodunu yeniden gönderir (bekleyen e-posta değişikliği varsa yeni adrese). Doğrulanmışsa bir şey yapmaz.",
        "responses": {
          "401": {
            "description": "Unauthorized",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ProblemDetails"
                }
              }
            }
          },
          "429": {
            "description": "Too Many Requests",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ProblemDetails"
                }
              }
            }
          },
          "202": {
            "description": "Accepted"
          }
        }
      }
    },
    "/mobile/v1/me/delete": {
      "post": {
        "tags": [
          "MobileMe"
        ],
        "summary": "Hesabı siler (App Store zorunluluğu). Kişisel bilgiler silinir, tüm oturumlar kapanır; rezervasyon kayıtları yasal saklama için kalır,\r\ncüzdan bakiyesi kullanılamaz olur. Şifreli hesapta şifre zorunlu. 422 `reason`: `WrongPassword`,\r\n`ActiveReservations` (yaklaşan onaylı / ödenmiş rezervasyon var).",
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/DeleteAccountBody"
              }
            },
            "text/json": {
              "schema": {
                "$ref": "#/components/schemas/DeleteAccountBody"
              }
            },
            "application/*+json": {
              "schema": {
                "$ref": "#/components/schemas/DeleteAccountBody"
              }
            }
          }
        },
        "responses": {
          "401": {
            "description": "Unauthorized",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ProblemDetails"
                }
              }
            }
          },
          "429": {
            "description": "Too Many Requests",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ProblemDetails"
                }
              }
            }
          },
          "204": {
            "description": "No Content"
          },
          "422": {
            "description": "Unprocessable Content",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ProblemDetails"
                }
              }
            }
          }
        }
      }
    },
    "/mobile/v1/messages/{kind}/{code}": {
      "get": {
        "tags": [
          "MobileMessages"
        ],
        "summary": "Yazışma (açınca ekibin mesajları okundu sayılır).",
        "parameters": [
          {
            "name": "kind",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "code",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "401": {
            "description": "Unauthorized",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ProblemDetails"
                }
              }
            }
          },
          "429": {
            "description": "Too Many Requests",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ProblemDetails"
                }
              }
            }
          },
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/MobileMessageResponse"
                  }
                }
              }
            }
          },
          "404": {
            "description": "Not Found",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ProblemDetails"
                }
              }
            }
          }
        }
      },
      "post": {
        "tags": [
          "MobileMessages"
        ],
        "summary": "Mesaj gönderir. 422 `reason`: Empty, TooLong, TooManyLinks, RateLimited.",
        "parameters": [
          {
            "name": "kind",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "code",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/PostMessageBody"
              }
            },
            "text/json": {
              "schema": {
                "$ref": "#/components/schemas/PostMessageBody"
              }
            },
            "application/*+json": {
              "schema": {
                "$ref": "#/components/schemas/PostMessageBody"
              }
            }
          }
        },
        "responses": {
          "401": {
            "description": "Unauthorized",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ProblemDetails"
                }
              }
            }
          },
          "429": {
            "description": "Too Many Requests",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ProblemDetails"
                }
              }
            }
          },
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/MobileMessageResponse"
                  }
                }
              }
            }
          },
          "422": {
            "description": "Unprocessable Content",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ProblemDetails"
                }
              }
            }
          },
          "404": {
            "description": "Not Found",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ProblemDetails"
                }
              }
            }
          }
        }
      }
    },
    "/mobile/v1/messages": {
      "get": {
        "tags": [
          "MobileMessages"
        ],
        "summary": "Mesajlarım (gelen kutusu, 2026-10-18): üyenin tüm yazışmaları — okunmamış ekip mesajı olanlar önce, sonra son mesaja göre.\r\nSatıra basınca `{kind}/{code}` yazışması açılır.",
        "responses": {
          "401": {
            "description": "Unauthorized",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ProblemDetails"
                }
              }
            }
          },
          "429": {
            "description": "Too Many Requests",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ProblemDetails"
                }
              }
            }
          },
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/MobileMessageThreadResponse"
                  }
                }
              }
            }
          }
        }
      }
    },
    "/mobile/v1/messages/unread": {
      "get": {
        "tags": [
          "MobileMessages"
        ],
        "summary": "Okunmamış ekip mesajı olan rezervasyonlar (Seyahatlerim rozetleri).",
        "responses": {
          "401": {
            "description": "Unauthorized",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ProblemDetails"
                }
              }
            }
          },
          "429": {
            "description": "Too Many Requests",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ProblemDetails"
                }
              }
            }
          },
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/UnreadMessagesResponse"
                  }
                }
              }
            }
          }
        }
      }
    },
    "/mobile/v1/offers/{priceId}/extras": {
      "get": {
        "tags": [
          "MobilePricing"
        ],
        "summary": "Seçilen fiyatın (aracın) firmasının sunduğu ekstra hizmetler — sitedeki Step2 ile aynı. Giriş gerekmez.",
        "parameters": [
          {
            "name": "priceId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          },
          {
            "name": "currency",
            "in": "query",
            "schema": {
              "$ref": "#/components/schemas/CurrencyType"
            }
          }
        ],
        "responses": {
          "401": {
            "description": "Unauthorized",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ProblemDetails"
                }
              }
            }
          },
          "429": {
            "description": "Too Many Requests",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ProblemDetails"
                }
              }
            }
          },
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/MobileOfferedExtra"
                  }
                }
              }
            }
          }
        }
      }
    },
    "/mobile/v1/bookings/quote": {
      "post": {
        "tags": [
          "MobilePricing"
        ],
        "summary": "Ödenecek tutar (ekstralar, kupon, cüzdan dahil) — rezervasyonla aynı hesap. Fiyat geçersizse (süresi doldu) 422.\r\n            Giriş yapmadan da çağrılır (misafir: cüzdan yok).",
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/BookingQuoteBody"
              }
            },
            "text/json": {
              "schema": {
                "$ref": "#/components/schemas/BookingQuoteBody"
              }
            },
            "application/*+json": {
              "schema": {
                "$ref": "#/components/schemas/BookingQuoteBody"
              }
            }
          }
        },
        "responses": {
          "401": {
            "description": "Unauthorized",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ProblemDetails"
                }
              }
            }
          },
          "429": {
            "description": "Too Many Requests",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ProblemDetails"
                }
              }
            }
          },
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BookingQuoteResponse"
                }
              }
            }
          },
          "422": {
            "description": "Unprocessable Content",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ProblemDetails"
                }
              }
            }
          }
        }
      }
    },
    "/mobile/v1/me/wallet": {
      "get": {
        "tags": [
          "MobilePricing"
        ],
        "summary": "Cüzdan: bakiye (EUR) ve son hareketler.",
        "responses": {
          "401": {
            "description": "Unauthorized",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ProblemDetails"
                }
              }
            }
          },
          "429": {
            "description": "Too Many Requests",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ProblemDetails"
                }
              }
            }
          },
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/WalletResponse"
                }
              }
            }
          }
        }
      }
    },
    "/mobile/v1/providers/{providerId}/summary": {
      "get": {
        "tags": [
          "MobileProviders"
        ],
        "parameters": [
          {
            "name": "providerId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          },
          {
            "name": "language",
            "in": "query",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "401": {
            "description": "Unauthorized",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ProblemDetails"
                }
              }
            }
          },
          "429": {
            "description": "Too Many Requests",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ProblemDetails"
                }
              }
            }
          },
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/MobileProviderSummary"
                }
              }
            }
          },
          "404": {
            "description": "Not Found",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ProblemDetails"
                }
              }
            }
          }
        }
      }
    },
    "/mobile/v1/providers/{providerId}/reviews": {
      "get": {
        "tags": [
          "MobileProviders"
        ],
        "parameters": [
          {
            "name": "providerId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          },
          {
            "name": "page",
            "in": "query",
            "schema": {
              "type": "integer",
              "format": "int32"
            }
          },
          {
            "name": "language",
            "in": "query",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "401": {
            "description": "Unauthorized",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ProblemDetails"
                }
              }
            }
          },
          "429": {
            "description": "Too Many Requests",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ProblemDetails"
                }
              }
            }
          },
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/MobileProviderReviews"
                }
              }
            }
          },
          "404": {
            "description": "Not Found",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ProblemDetails"
                }
              }
            }
          }
        }
      }
    },
    "/mobile/v1/reviews/{kind}/{code}": {
      "get": {
        "tags": [
          "MobileReviews"
        ],
        "summary": "Değerlendirme formu: kriterler (uygulamanın dilinde) ve varsa mevcut yorum.",
        "parameters": [
          {
            "name": "kind",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "code",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "language",
            "in": "query",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "401": {
            "description": "Unauthorized",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ProblemDetails"
                }
              }
            }
          },
          "429": {
            "description": "Too Many Requests",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ProblemDetails"
                }
              }
            }
          },
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ReviewFormResponse"
                }
              }
            }
          },
          "404": {
            "description": "Not Found",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ProblemDetails"
                }
              }
            }
          }
        }
      },
      "post": {
        "tags": [
          "MobileReviews"
        ],
        "summary": "Değerlendirmeyi kaydeder (varsa günceller). Yazılamıyorsa 422 `reason=NotAllowed`.",
        "parameters": [
          {
            "name": "kind",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "code",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/SubmitReviewBody"
              }
            },
            "text/json": {
              "schema": {
                "$ref": "#/components/schemas/SubmitReviewBody"
              }
            },
            "application/*+json": {
              "schema": {
                "$ref": "#/components/schemas/SubmitReviewBody"
              }
            }
          }
        },
        "responses": {
          "401": {
            "description": "Unauthorized",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ProblemDetails"
                }
              }
            }
          },
          "429": {
            "description": "Too Many Requests",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ProblemDetails"
                }
              }
            }
          },
          "204": {
            "description": "No Content"
          },
          "422": {
            "description": "Unprocessable Content",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ProblemDetails"
                }
              }
            }
          },
          "404": {
            "description": "Not Found",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ProblemDetails"
                }
              }
            }
          }
        }
      }
    },
    "/mobile/v1/tour-bookings": {
      "post": {
        "tags": [
          "MobileTourBookings"
        ],
        "summary": "Tur rezervasyonu açar. Kural ihlalinde 422, nedeni `reason` alanında:\r\nNotAvailable, InvalidPax, Closed, OverCapacity (`remainingCapacity`), TooLate, NoPrice, InvalidName, InvalidEmail,\r\nInvalidPhone, InvalidStartTime, InvalidGuideLanguage, InvalidPickup, TooLong, Busy (aynı anda başka rezervasyon — tekrar deneyin),\r\nTooManyPending. Giriş yapmadan da açılır: o zaman `passenger` zorunludur ve yanıtta `accessToken` döner.",
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/CreateMobileTourBookingRequest"
              }
            },
            "text/json": {
              "schema": {
                "$ref": "#/components/schemas/CreateMobileTourBookingRequest"
              }
            },
            "application/*+json": {
              "schema": {
                "$ref": "#/components/schemas/CreateMobileTourBookingRequest"
              }
            }
          }
        },
        "responses": {
          "401": {
            "description": "Unauthorized",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ProblemDetails"
                }
              }
            }
          },
          "429": {
            "description": "Too Many Requests",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ProblemDetails"
                }
              }
            }
          },
          "201": {
            "description": "Created",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/MobileTourBookingResponse"
                }
              }
            }
          },
          "422": {
            "description": "Unprocessable Content",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ProblemDetails"
                }
              }
            }
          }
        }
      },
      "get": {
        "tags": [
          "MobileTourBookings"
        ],
        "summary": "Tur rezervasyonlarım (tur tarihine göre en yeni önce).",
        "parameters": [
          {
            "name": "language",
            "in": "query",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "401": {
            "description": "Unauthorized",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ProblemDetails"
                }
              }
            }
          },
          "429": {
            "description": "Too Many Requests",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ProblemDetails"
                }
              }
            }
          },
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/MobileTourBookingResponse"
                  }
                }
              }
            }
          }
        }
      }
    },
    "/mobile/v1/tour-bookings/{code}": {
      "get": {
        "tags": [
          "MobileTourBookings"
        ],
        "summary": "Tek tur rezervasyonu. Başkasının rezervasyonu 404.",
        "parameters": [
          {
            "name": "code",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "language",
            "in": "query",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "401": {
            "description": "Unauthorized",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ProblemDetails"
                }
              }
            }
          },
          "429": {
            "description": "Too Many Requests",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ProblemDetails"
                }
              }
            }
          },
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/MobileTourBookingResponse"
                }
              }
            }
          },
          "404": {
            "description": "Not Found",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ProblemDetails"
                }
              }
            }
          }
        }
      }
    },
    "/mobile/v1/tour-bookings/guest/{token}": {
      "get": {
        "tags": [
          "MobileTourBookings"
        ],
        "summary": "Misafir tur rezervasyonu, rezervasyon anahtarıyla (girişsiz). Geçersiz / süresi dolmuş anahtar ya da transfer anahtarı 404.",
        "parameters": [
          {
            "name": "token",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "language",
            "in": "query",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "401": {
            "description": "Unauthorized",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ProblemDetails"
                }
              }
            }
          },
          "429": {
            "description": "Too Many Requests",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ProblemDetails"
                }
              }
            }
          },
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/MobileTourBookingResponse"
                }
              }
            }
          },
          "404": {
            "description": "Not Found",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ProblemDetails"
                }
              }
            }
          }
        }
      }
    },
    "/mobile/v1/tour-bookings/{code}/payment": {
      "get": {
        "tags": [
          "MobileTourBookings"
        ],
        "parameters": [
          {
            "name": "code",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "language",
            "in": "query",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "401": {
            "description": "Unauthorized",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ProblemDetails"
                }
              }
            }
          },
          "429": {
            "description": "Too Many Requests",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ProblemDetails"
                }
              }
            }
          },
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/MobilePaymentOptionsResponse"
                }
              }
            }
          }
        }
      }
    },
    "/mobile/v1/tour-bookings/guest/{token}/payment": {
      "get": {
        "tags": [
          "MobileTourBookings"
        ],
        "parameters": [
          {
            "name": "token",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "language",
            "in": "query",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "401": {
            "description": "Unauthorized",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ProblemDetails"
                }
              }
            }
          },
          "429": {
            "description": "Too Many Requests",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ProblemDetails"
                }
              }
            }
          },
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/MobilePaymentOptionsResponse"
                }
              }
            }
          }
        }
      }
    },
    "/mobile/v1/tour-bookings/{code}/payment/discount": {
      "post": {
        "tags": [
          "MobileTourBookings"
        ],
        "summary": "Kupon (sitedeki tur ödeme sayfasıyla aynı kural). Geçersiz kupon 422 (`errors.couponCode` = red nedeni).",
        "parameters": [
          {
            "name": "code",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "language",
            "in": "query",
            "schema": {
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/MobileDiscountRequest"
              }
            },
            "text/json": {
              "schema": {
                "$ref": "#/components/schemas/MobileDiscountRequest"
              }
            },
            "application/*+json": {
              "schema": {
                "$ref": "#/components/schemas/MobileDiscountRequest"
              }
            }
          }
        },
        "responses": {
          "401": {
            "description": "Unauthorized",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ProblemDetails"
                }
              }
            }
          },
          "429": {
            "description": "Too Many Requests",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ProblemDetails"
                }
              }
            }
          },
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/MobilePaymentOptionsResponse"
                }
              }
            }
          }
        }
      }
    },
    "/mobile/v1/tour-bookings/guest/{token}/payment/discount": {
      "post": {
        "tags": [
          "MobileTourBookings"
        ],
        "parameters": [
          {
            "name": "token",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "language",
            "in": "query",
            "schema": {
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/MobileDiscountRequest"
              }
            },
            "text/json": {
              "schema": {
                "$ref": "#/components/schemas/MobileDiscountRequest"
              }
            },
            "application/*+json": {
              "schema": {
                "$ref": "#/components/schemas/MobileDiscountRequest"
              }
            }
          }
        },
        "responses": {
          "401": {
            "description": "Unauthorized",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ProblemDetails"
                }
              }
            }
          },
          "429": {
            "description": "Too Many Requests",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ProblemDetails"
                }
              }
            }
          },
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/MobilePaymentOptionsResponse"
                }
              }
            }
          }
        }
      }
    },
    "/mobile/v1/tour-bookings/{code}/payment/cash": {
      "post": {
        "tags": [
          "MobileTourBookings"
        ],
        "summary": "Nakit (turda rehbere / firmaya ödeme) ile tamamla — tur nakit kabul ediyorsa. Tekrar çağrılırsa aynı sonuç.",
        "parameters": [
          {
            "name": "code",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "language",
            "in": "query",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "401": {
            "description": "Unauthorized",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ProblemDetails"
                }
              }
            }
          },
          "429": {
            "description": "Too Many Requests",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ProblemDetails"
                }
              }
            }
          },
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/MobileTourBookingResponse"
                }
              }
            }
          }
        }
      }
    },
    "/mobile/v1/tour-bookings/guest/{token}/payment/cash": {
      "post": {
        "tags": [
          "MobileTourBookings"
        ],
        "parameters": [
          {
            "name": "token",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "language",
            "in": "query",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "401": {
            "description": "Unauthorized",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ProblemDetails"
                }
              }
            }
          },
          "429": {
            "description": "Too Many Requests",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ProblemDetails"
                }
              }
            }
          },
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/MobileTourBookingResponse"
                }
              }
            }
          }
        }
      }
    },
    "/mobile/v1/tour-bookings/{code}/payment/card": {
      "post": {
        "tags": [
          "MobileTourBookings"
        ],
        "summary": "Kart ile öde (iyzico; tamamı ya da ön ödeme). 3DS'te bankanın sayfası döner, uygulama içinde açılır.",
        "parameters": [
          {
            "name": "code",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/MobileCardPaymentRequest"
              }
            },
            "text/json": {
              "schema": {
                "$ref": "#/components/schemas/MobileCardPaymentRequest"
              }
            },
            "application/*+json": {
              "schema": {
                "$ref": "#/components/schemas/MobileCardPaymentRequest"
              }
            }
          }
        },
        "responses": {
          "401": {
            "description": "Unauthorized",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ProblemDetails"
                }
              }
            }
          },
          "429": {
            "description": "Too Many Requests",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ProblemDetails"
                }
              }
            }
          },
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/MobileCardPaymentResult"
                }
              }
            }
          }
        }
      }
    },
    "/mobile/v1/tour-bookings/guest/{token}/payment/card": {
      "post": {
        "tags": [
          "MobileTourBookings"
        ],
        "parameters": [
          {
            "name": "token",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/MobileCardPaymentRequest"
              }
            },
            "text/json": {
              "schema": {
                "$ref": "#/components/schemas/MobileCardPaymentRequest"
              }
            },
            "application/*+json": {
              "schema": {
                "$ref": "#/components/schemas/MobileCardPaymentRequest"
              }
            }
          }
        },
        "responses": {
          "401": {
            "description": "Unauthorized",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ProblemDetails"
                }
              }
            }
          },
          "429": {
            "description": "Too Many Requests",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ProblemDetails"
                }
              }
            }
          },
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/MobileCardPaymentResult"
                }
              }
            }
          }
        }
      }
    },
    "/mobile/v1/tour-bookings/{code}/confirmation": {
      "get": {
        "tags": [
          "MobileTourBookings"
        ],
        "summary": "Onay ekranı: sitedeki tur onay sayfasıyla aynı içerik.",
        "parameters": [
          {
            "name": "code",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "language",
            "in": "query",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "401": {
            "description": "Unauthorized",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ProblemDetails"
                }
              }
            }
          },
          "429": {
            "description": "Too Many Requests",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ProblemDetails"
                }
              }
            }
          },
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/MobileTourConfirmationResponse"
                }
              }
            }
          }
        }
      }
    },
    "/mobile/v1/tour-bookings/guest/{token}/confirmation": {
      "get": {
        "tags": [
          "MobileTourBookings"
        ],
        "parameters": [
          {
            "name": "token",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "language",
            "in": "query",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "401": {
            "description": "Unauthorized",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ProblemDetails"
                }
              }
            }
          },
          "429": {
            "description": "Too Many Requests",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ProblemDetails"
                }
              }
            }
          },
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/MobileTourConfirmationResponse"
                }
              }
            }
          }
        }
      }
    },
    "/mobile/v1/tours/{tourId}/request-availability": {
      "get": {
        "tags": [
          "MobileTourRequests"
        ],
        "summary": "Bu tarih / kişi sayısı için talep gönderilebilir mi.",
        "parameters": [
          {
            "name": "tourId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          },
          {
            "name": "date",
            "in": "query",
            "schema": {
              "type": "string",
              "format": "date"
            }
          },
          {
            "name": "adults",
            "in": "query",
            "schema": {
              "type": "integer",
              "format": "int32",
              "default": 1
            }
          },
          {
            "name": "childAges",
            "in": "query",
            "schema": {
              "type": "array",
              "items": {
                "type": "integer",
                "format": "int32"
              }
            }
          }
        ],
        "responses": {
          "401": {
            "description": "Unauthorized",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ProblemDetails"
                }
              }
            }
          },
          "429": {
            "description": "Too Many Requests",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ProblemDetails"
                }
              }
            }
          },
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/TourRequestAvailabilityResponse"
                }
              }
            }
          }
        }
      }
    },
    "/mobile/v1/tour-requests": {
      "post": {
        "tags": [
          "MobileTourRequests"
        ],
        "summary": "Talep gönderir. 422 `reason`: InvalidName, InvalidEmail, InvalidPhone, TooLong, BookableOnline, TooLate, NotAvailable.",
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/CreateTourRequestBody"
              }
            },
            "text/json": {
              "schema": {
                "$ref": "#/components/schemas/CreateTourRequestBody"
              }
            },
            "application/*+json": {
              "schema": {
                "$ref": "#/components/schemas/CreateTourRequestBody"
              }
            }
          }
        },
        "responses": {
          "401": {
            "description": "Unauthorized",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ProblemDetails"
                }
              }
            }
          },
          "429": {
            "description": "Too Many Requests",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ProblemDetails"
                }
              }
            }
          },
          "201": {
            "description": "Created",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/TourRequestCreatedResponse"
                }
              }
            }
          },
          "422": {
            "description": "Unprocessable Content",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ProblemDetails"
                }
              }
            }
          }
        }
      }
    },
    "/mobile/v1/tours/suggest": {
      "get": {
        "tags": [
          "MobileTours"
        ],
        "summary": "Tur araması (en az 3 harf): turu olan şehirler, kategoriler (tur bölgeleri) ve turlar.",
        "parameters": [
          {
            "name": "q",
            "in": "query",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "language",
            "in": "query",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "401": {
            "description": "Unauthorized",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ProblemDetails"
                }
              }
            }
          },
          "429": {
            "description": "Too Many Requests",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ProblemDetails"
                }
              }
            }
          },
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/TourSuggestionResult"
                }
              }
            }
          }
        }
      }
    },
    "/mobile/v1/tours": {
      "get": {
        "tags": [
          "MobileTours"
        ],
        "summary": "Şehrin turları (filtreli, sıralı, sayfalı). `areaId`: kategori (tur bölgesi). Filtre değerleri yanıttaki\r\n`durations[].key`, `themes[].key` ve `guideLanguages[].key`; birden çok değer için parametre tekrarlanır.\r\nKartlardaki `price` seçilen tarihteki başlangıç fiyatıdır; null = online fiyat yok.",
        "parameters": [
          {
            "name": "cityId",
            "in": "query",
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          },
          {
            "name": "areaId",
            "in": "query",
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          },
          {
            "name": "date",
            "in": "query",
            "schema": {
              "type": "string",
              "format": "date"
            }
          },
          {
            "name": "currency",
            "in": "query",
            "schema": {
              "$ref": "#/components/schemas/CurrencyType"
            }
          },
          {
            "name": "language",
            "in": "query",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "sort",
            "in": "query",
            "schema": {
              "$ref": "#/components/schemas/TourSortOrder"
            }
          },
          {
            "name": "page",
            "in": "query",
            "schema": {
              "type": "integer",
              "format": "int32",
              "default": 1
            }
          },
          {
            "name": "pageSize",
            "in": "query",
            "schema": {
              "type": "integer",
              "format": "int32",
              "default": 20
            }
          },
          {
            "name": "priceMin",
            "in": "query",
            "schema": {
              "type": "number",
              "format": "double"
            }
          },
          {
            "name": "priceMax",
            "in": "query",
            "schema": {
              "type": "number",
              "format": "double"
            }
          },
          {
            "name": "durations",
            "in": "query",
            "schema": {
              "type": "array",
              "items": {
                "$ref": "#/components/schemas/TourDurationType"
              }
            }
          },
          {
            "name": "themes",
            "in": "query",
            "schema": {
              "type": "array",
              "items": {
                "type": "string",
                "format": "uuid"
              }
            }
          },
          {
            "name": "guideLanguages",
            "in": "query",
            "schema": {
              "type": "array",
              "items": {
                "type": "string"
              }
            }
          }
        ],
        "responses": {
          "401": {
            "description": "Unauthorized",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ProblemDetails"
                }
              }
            }
          },
          "429": {
            "description": "Too Many Requests",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ProblemDetails"
                }
              }
            }
          },
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/TourSearchResult"
                }
              }
            }
          }
        }
      }
    },
    "/mobile/v1/tours/{tourId}": {
      "get": {
        "tags": [
          "MobileTours"
        ],
        "summary": "Tur detayı ve rezervasyon seçenekleri (kalkış saatleri, rehber dilleri, alış noktaları). Tur istenen dilde yayında değilse\r\nİngilizcesi döner (`fallbackCulture` = \"en\"). Satışta olmayan tur 404.",
        "parameters": [
          {
            "name": "tourId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          },
          {
            "name": "date",
            "in": "query",
            "schema": {
              "type": "string",
              "format": "date"
            }
          },
          {
            "name": "currency",
            "in": "query",
            "schema": {
              "$ref": "#/components/schemas/CurrencyType"
            }
          },
          {
            "name": "language",
            "in": "query",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "401": {
            "description": "Unauthorized",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ProblemDetails"
                }
              }
            }
          },
          "429": {
            "description": "Too Many Requests",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ProblemDetails"
                }
              }
            }
          },
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/MobileTourDetailResponse"
                }
              }
            }
          },
          "404": {
            "description": "Not Found",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ProblemDetails"
                }
              }
            }
          }
        }
      }
    },
    "/mobile/v1/tours/{tourId}/quote": {
      "get": {
        "tags": [
          "MobileTours"
        ],
        "summary": "Kesin fiyat: tarih + yetişkin + çocuk yaşları → kalem kalem tutar ve toplam. `status` Ok değilse rezervasyon açılamaz:\r\nNoPrice (online fiyat yok), Closed (kapalı gün), OverCapacity (`capacity` = kalan yer), TooLate (son rezervasyon saati\r\ngeçti), InvalidPax, NotAvailable. Çocuk yaşları için parametre tekrarlanır: `childAges=5&childAges=9`.",
        "parameters": [
          {
            "name": "tourId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          },
          {
            "name": "date",
            "in": "query",
            "schema": {
              "type": "string",
              "format": "date"
            }
          },
          {
            "name": "adults",
            "in": "query",
            "schema": {
              "type": "integer",
              "format": "int32",
              "default": 1
            }
          },
          {
            "name": "childAges",
            "in": "query",
            "schema": {
              "type": "array",
              "items": {
                "type": "integer",
                "format": "int32"
              }
            }
          },
          {
            "name": "currency",
            "in": "query",
            "schema": {
              "$ref": "#/components/schemas/CurrencyType"
            }
          }
        ],
        "responses": {
          "401": {
            "description": "Unauthorized",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ProblemDetails"
                }
              }
            }
          },
          "429": {
            "description": "Too Many Requests",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ProblemDetails"
                }
              }
            }
          },
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PublicTourQuoteDto"
                }
              }
            }
          }
        }
      }
    },
    "/mobile/v1/vouchers/{kind}/{code}": {
      "get": {
        "tags": [
          "MobileVoucher"
        ],
        "parameters": [
          {
            "name": "kind",
            "in": "path",
            "description": "`transfer` / `tour`.",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "code",
            "in": "path",
            "description": "Rezervasyon kodu.",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "language",
            "in": "query",
            "description": "PDF dili (tr, en, de, es, fr).",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "401": {
            "description": "Unauthorized",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ProblemDetails"
                }
              }
            }
          },
          "429": {
            "description": "Too Many Requests",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ProblemDetails"
                }
              }
            }
          },
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/VoucherLinkResponse"
                }
              }
            }
          },
          "404": {
            "description": "Not Found",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ProblemDetails"
                }
              }
            }
          }
        }
      }
    }
  },
  "components": {
    "schemas": {
      "AppConfigResponse": {
        "type": "object",
        "properties": {
          "updateRequired": {
            "type": "boolean",
            "description": "true → uygulama yalnızca \"Güncelle\" ekranı gösterir (bu sürüm artık desteklenmiyor)."
          },
          "updateAvailable": {
            "type": "boolean",
            "description": "true → mağazada daha yeni sürüm var (kapatılabilir uyarı)."
          },
          "minVersion": {
            "type": "string",
            "description": "Platformun en düşük desteklenen sürümü.",
            "nullable": true
          },
          "latestVersion": {
            "type": "string",
            "description": "Mağazadaki güncel sürüm.",
            "nullable": true
          },
          "storeUrl": {
            "type": "string",
            "description": "Platformun mağaza adresi.",
            "nullable": true
          },
          "supportPhone": {
            "type": "string",
            "description": "Destek telefonu.",
            "nullable": true
          },
          "supportEmail": {
            "type": "string",
            "description": "Destek e-postası.",
            "nullable": true
          },
          "whatsAppNumber": {
            "type": "string",
            "description": "Ülke koduyla, yalnız rakam (ör. 905xxxxxxxxx) — wa.me bağlantısı için.",
            "nullable": true
          },
          "siteUrl": {
            "type": "string",
            "description": "Web sitesi kökü.",
            "nullable": true
          },
          "appleSignInEnabled": {
            "type": "boolean",
            "description": "\"Apple ile giriş\" düğmesi gösterilsin mi (Admin → Ayarlar → Apple ile Giriş)."
          },
          "googleSignInEnabled": {
            "type": "boolean",
            "description": "\"Google ile giriş\" düğmesi gösterilsin mi (Admin → Ayarlar → Google ile Giriş)."
          }
        },
        "additionalProperties": false,
        "description": "Uygulama açılış ayarları."
      },
      "AppleSignInBody": {
        "required": [
          "identityToken"
        ],
        "type": "object",
        "properties": {
          "identityToken": {
            "maxLength": 4000,
            "minLength": 1,
            "type": "string",
            "description": "Apple kimlik token'ı (identityToken, JWT)."
          },
          "authorizationCode": {
            "maxLength": 1000,
            "type": "string",
            "description": "Apple yetki kodu (authorizationCode) — hesap silmede Apple token'ını iptal edebilmek için gönderin.",
            "nullable": true
          },
          "nonce": {
            "maxLength": 200,
            "type": "string",
            "description": "İsteğe konan nonce (ham değer); token'daki nonce ile eşleşmeli.",
            "nullable": true
          },
          "firstName": {
            "maxLength": 100,
            "type": "string",
            "description": "Apple adı yalnızca ilk girişte verir — o an iletin.",
            "nullable": true
          },
          "lastName": {
            "maxLength": 100,
            "type": "string",
            "nullable": true
          },
          "deviceName": {
            "maxLength": 100,
            "type": "string",
            "nullable": true
          }
        },
        "additionalProperties": false,
        "description": "Sign in with Apple (iOS): uygulamanın Apple'dan aldığı bilgiler."
      },
      "BookingQuoteBody": {
        "type": "object",
        "properties": {
          "priceId": {
            "type": "string",
            "format": "uuid"
          },
          "currency": {
            "$ref": "#/components/schemas/CurrencyType"
          },
          "hasReturn": {
            "type": "boolean"
          },
          "passengerCount": {
            "type": "integer",
            "format": "int32"
          },
          "couponCode": {
            "type": "string",
            "nullable": true
          },
          "useWallet": {
            "type": "boolean"
          },
          "extras": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/MobileExtraSelection"
            },
            "description": "Seçilen ekstralar (çocuk koltuğu vb.; firmanın sunduğu ekstralar `offers/{priceId}/extras`).",
            "nullable": true
          }
        },
        "additionalProperties": false
      },
      "BookingQuoteResponse": {
        "type": "object",
        "properties": {
          "currency": {
            "$ref": "#/components/schemas/CurrencyType"
          },
          "subtotal": {
            "type": "number",
            "format": "double"
          },
          "couponDiscount": {
            "type": "number",
            "format": "double"
          },
          "walletAmount": {
            "type": "number",
            "format": "double"
          },
          "total": {
            "type": "number",
            "description": "Ödenecek toplam (rezervasyon da tam bu tutarla açılır).",
            "format": "double"
          },
          "couponApplied": {
            "type": "boolean",
            "description": "Kupon geçerli ve uygulandı."
          },
          "couponRejection": {
            "type": "string",
            "description": "Kupon geçersizse nedeni (`NotFound`, `Expired`, `MinOrderNotMet`, …).",
            "nullable": true
          },
          "walletBalanceEur": {
            "type": "number",
            "description": "Müşterinin cüzdan bakiyesi (EUR).",
            "format": "double"
          },
          "extrasTotal": {
            "type": "number",
            "description": "Seçilen ekstraların toplamı (Total'e dahil; gidiş-dönüşte iki bacak).",
            "format": "double"
          }
        },
        "additionalProperties": false
      },
      "BookingStatus": {
        "enum": [
          "Pending",
          "Confirmed",
          "Completed",
          "Cancelled"
        ],
        "type": "string"
      },
      "CampaignOpenedRequest": {
        "type": "object",
        "properties": {
          "installationId": {
            "type": "string",
            "format": "uuid"
          }
        },
        "additionalProperties": false
      },
      "CancelBookingResponse": {
        "type": "object",
        "properties": {
          "refundedAmount": {
            "type": "number",
            "description": "Karta iade edilen tutar.",
            "format": "double"
          },
          "refundCurrency": {
            "$ref": "#/components/schemas/CurrencyType"
          },
          "refundPending": {
            "type": "boolean",
            "description": "Otomatik iade yapılamadı; ekibimiz elle iade edecek (iptal yine de geçerli)."
          }
        },
        "additionalProperties": false
      },
      "ChangePasswordBody": {
        "required": [
          "currentPassword",
          "newPassword"
        ],
        "type": "object",
        "properties": {
          "currentPassword": {
            "maxLength": 200,
            "minLength": 1,
            "type": "string"
          },
          "newPassword": {
            "maxLength": 200,
            "minLength": 8,
            "type": "string"
          }
        },
        "additionalProperties": false
      },
      "CreateMobileBookingRequest": {
        "required": [
          "fromRegionId",
          "pickupDate",
          "pickupTime",
          "priceId",
          "toRegionId"
        ],
        "type": "object",
        "properties": {
          "priceId": {
            "type": "string",
            "description": "Aramadaki `priceId`.",
            "format": "uuid"
          },
          "fromRegionId": {
            "type": "string",
            "format": "uuid"
          },
          "toRegionId": {
            "type": "string",
            "format": "uuid"
          },
          "pickupDate": {
            "type": "string",
            "format": "date"
          },
          "pickupTime": {
            "minLength": 1,
            "pattern": "^([01]\\d|2[0-3]):[0-5]\\d$",
            "type": "string",
            "description": "Türkiye yerel saati (HH:mm)."
          },
          "passengerCount": {
            "maximum": 50,
            "minimum": 1,
            "type": "integer",
            "format": "int32"
          },
          "passenger": {
            "$ref": "#/components/schemas/MobilePassenger"
          },
          "flightCode": {
            "maxLength": 20,
            "type": "string",
            "nullable": true
          },
          "hotelAddress": {
            "maxLength": 500,
            "type": "string",
            "nullable": true
          },
          "notes": {
            "maxLength": 2000,
            "type": "string",
            "nullable": true
          },
          "return": {
            "$ref": "#/components/schemas/MobileReturnLeg"
          },
          "currency": {
            "$ref": "#/components/schemas/CurrencyType"
          },
          "language": {
            "maxLength": 5,
            "type": "string",
            "description": "Ödeme sayfasının dili: \"en\" | \"tr\" (varsayılan en).",
            "nullable": true
          },
          "couponCode": {
            "maxLength": 30,
            "type": "string",
            "description": "İndirim kuponu (isteğe bağlı). Geçersizse 422 döner, rezervasyon açılmaz.",
            "nullable": true
          },
          "useWallet": {
            "type": "boolean",
            "description": "true: müşterinin sadakat cüzdanı bakiyesi indirim olarak kullanılır (komisyon marjı kadar)."
          },
          "extras": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/MobileExtraSelection"
            },
            "description": "Seçilen ekstra hizmetler (sitedeki Step2 ile aynı; fiyat ve adet sunucuda kontrol edilir).",
            "nullable": true
          }
        },
        "additionalProperties": false,
        "description": "Aramadan seçilen teklifle rezervasyon. TranigoNew.Api.Contracts.Mobile.CreateMobileBookingRequest.Passenger boşsa hesap sahibinin bilgileri kullanılır.\r\nFiyat rezervasyon anında yeniden hesaplanır (aramayla aynı yöntem). Ödeme yanıttaki `payment.url` sayfasında yapılır."
      },
      "CreateMobileTourBookingRequest": {
        "required": [
          "date",
          "tourId"
        ],
        "type": "object",
        "properties": {
          "tourId": {
            "type": "string",
            "format": "uuid"
          },
          "date": {
            "type": "string",
            "format": "date"
          },
          "adults": {
            "maximum": 50,
            "minimum": 1,
            "type": "integer",
            "format": "int32"
          },
          "childAges": {
            "maxItems": 20,
            "type": "array",
            "items": {
              "type": "integer",
              "format": "int32"
            },
            "description": "Her çocuk için yaşı (0–17).",
            "nullable": true
          },
          "startTime": {
            "pattern": "^([01]\\d|2[0-3]):[0-5]\\d$",
            "type": "string",
            "description": "Kalkış saati (HH:mm); turda birden çok kalkış saati varsa zorunlu.",
            "nullable": true
          },
          "guideLanguage": {
            "maxLength": 10,
            "type": "string",
            "description": "Rehber dili (ör. \"en\"); turda birden çok dil varsa zorunlu.",
            "nullable": true
          },
          "pickupRegionId": {
            "type": "string",
            "description": "Detaydaki `pickupPoints[].regionId`.",
            "format": "uuid",
            "nullable": true
          },
          "pickupAddress": {
            "maxLength": 500,
            "type": "string",
            "nullable": true
          },
          "notes": {
            "maxLength": 2000,
            "type": "string",
            "nullable": true
          },
          "passenger": {
            "$ref": "#/components/schemas/MobilePassenger"
          },
          "currency": {
            "$ref": "#/components/schemas/CurrencyType"
          },
          "language": {
            "maxLength": 5,
            "type": "string",
            "description": "Tur metni ve ödeme sayfasının dili: \"en\" | \"tr\" | \"de\" | \"fr\" | \"es\" (varsayılan en).",
            "nullable": true
          }
        },
        "additionalProperties": false,
        "description": "Tur rezervasyonu. Fiyat istemciden alınmaz, sunucuda hesaplanır (`quote` ile aynı hesap). TranigoNew.Api.Contracts.Mobile.CreateMobileTourBookingRequest.Passenger boşsa hesap\r\nsahibinin bilgileri kullanılır. Ödeme yanıttaki `payment.url` sayfasında yapılır; ödenmemiş rezervasyon kontenjanda 10 dakika\r\nyer tutar."
      },
      "CreateTourRequestBody": {
        "required": [
          "date",
          "tourId"
        ],
        "type": "object",
        "properties": {
          "tourId": {
            "type": "string",
            "format": "uuid"
          },
          "date": {
            "type": "string",
            "format": "date"
          },
          "adults": {
            "maximum": 50,
            "minimum": 1,
            "type": "integer",
            "format": "int32"
          },
          "childAges": {
            "type": "array",
            "items": {
              "type": "integer",
              "format": "int32"
            },
            "nullable": true
          },
          "passenger": {
            "$ref": "#/components/schemas/MobilePassenger"
          },
          "notes": {
            "maxLength": 2000,
            "type": "string",
            "nullable": true
          }
        },
        "additionalProperties": false
      },
      "CurrencyType": {
        "enum": [
          "TRY",
          "EUR",
          "USD",
          "GBP",
          "RUB",
          "DKK",
          "SEK",
          "CHF",
          "NOK"
        ],
        "type": "string"
      },
      "DeleteAccountBody": {
        "type": "object",
        "properties": {
          "password": {
            "maxLength": 200,
            "type": "string",
            "nullable": true
          }
        },
        "additionalProperties": false,
        "description": "Hesap silme. Şifreli hesapta şifre zorunlu; Apple/Google ile açılmış (şifresiz) hesapta boş bırakılır."
      },
      "EditBookingBody": {
        "required": [
          "email",
          "firstName",
          "lastName",
          "phone",
          "pickupDate",
          "pickupTime"
        ],
        "type": "object",
        "properties": {
          "firstName": {
            "maxLength": 100,
            "minLength": 1,
            "type": "string"
          },
          "lastName": {
            "maxLength": 100,
            "minLength": 1,
            "type": "string"
          },
          "phoneCode": {
            "maxLength": 8,
            "type": "string",
            "nullable": true
          },
          "phone": {
            "maxLength": 32,
            "minLength": 1,
            "type": "string"
          },
          "email": {
            "maxLength": 256,
            "minLength": 1,
            "type": "string",
            "format": "email"
          },
          "passengerCount": {
            "maximum": 60,
            "minimum": 1,
            "type": "integer",
            "format": "int32"
          },
          "pickupDate": {
            "type": "string",
            "format": "date"
          },
          "pickupTime": {
            "minLength": 1,
            "pattern": "^\\d{2}:\\d{2}$",
            "type": "string",
            "description": "HH:mm"
          },
          "flightCode": {
            "maxLength": 20,
            "type": "string",
            "nullable": true
          },
          "hotelAddress": {
            "maxLength": 500,
            "type": "string",
            "nullable": true
          }
        },
        "additionalProperties": false,
        "description": "Değiştirilebilir bilgiler (tamamı gönderilir; uygulama mevcut değerlerle doldurur)."
      },
      "EditableBookingDetails": {
        "type": "object",
        "properties": {
          "firstName": {
            "type": "string",
            "nullable": true
          },
          "lastName": {
            "type": "string",
            "nullable": true
          },
          "phoneCode": {
            "type": "string",
            "nullable": true
          },
          "phone": {
            "type": "string",
            "nullable": true
          },
          "email": {
            "type": "string",
            "nullable": true
          },
          "passengerCount": {
            "type": "integer",
            "format": "int32"
          },
          "pickupDate": {
            "type": "string",
            "format": "date"
          },
          "pickupTime": {
            "type": "string",
            "nullable": true
          },
          "flightCode": {
            "type": "string",
            "nullable": true
          },
          "hotelAddress": {
            "type": "string",
            "nullable": true
          }
        },
        "additionalProperties": false
      },
      "ForgotPasswordRequest": {
        "required": [
          "email"
        ],
        "type": "object",
        "properties": {
          "email": {
            "maxLength": 256,
            "minLength": 1,
            "type": "string",
            "format": "email"
          }
        },
        "additionalProperties": false
      },
      "GoogleSignInBody": {
        "required": [
          "idToken"
        ],
        "type": "object",
        "properties": {
          "idToken": {
            "maxLength": 4000,
            "minLength": 1,
            "type": "string"
          },
          "deviceName": {
            "maxLength": 100,
            "type": "string",
            "nullable": true
          }
        },
        "additionalProperties": false,
        "description": "Google ile giriş: uygulamanın Google'dan aldığı kimlik token'ı."
      },
      "InstallationReportRequest": {
        "required": [
          "appVersion",
          "installationId",
          "platform"
        ],
        "type": "object",
        "properties": {
          "installationId": {
            "type": "string",
            "description": "Uygulamanın ilk açılışta ürettiği ve güvenli depoda sakladığı kimlik.",
            "format": "uuid"
          },
          "platform": {
            "maxLength": 20,
            "minLength": 1,
            "type": "string",
            "description": "`ios` / `android`."
          },
          "appVersion": {
            "maxLength": 20,
            "minLength": 1,
            "type": "string",
            "description": "Mağaza sürümü, ör. `1.4.0`."
          },
          "buildNumber": {
            "maxLength": 20,
            "type": "string",
            "nullable": true
          },
          "osVersion": {
            "maxLength": 40,
            "type": "string",
            "nullable": true
          },
          "deviceModel": {
            "maxLength": 100,
            "type": "string",
            "nullable": true
          },
          "culture": {
            "maxLength": 10,
            "type": "string",
            "description": "Uygulamada seçili dil (ör. `tr`).",
            "nullable": true
          },
          "pushToken": {
            "maxLength": 512,
            "type": "string",
            "description": "Firebase (FCM) token; izin yoksa boş.",
            "nullable": true
          },
          "pushPermission": {
            "type": "boolean",
            "description": "Kullanıcı telefonda bildirim izni verdi mi."
          }
        },
        "additionalProperties": false,
        "description": "Uygulama her açılışta / ön plana geldiğinde / girişten sonra / push token değişince gönderir."
      },
      "LinkTargetResponse": {
        "type": "object",
        "properties": {
          "kind": {
            "type": "string",
            "description": "`transfer` / `tour`.",
            "nullable": true
          },
          "code": {
            "type": "string",
            "description": "Rezervasyon kodu — giriş yapmış ve rezervasyon kendisininse uygulama detayı açar, değilse bağlantıyı tarayıcıda.",
            "nullable": true
          }
        },
        "additionalProperties": false
      },
      "LocationResponse": {
        "type": "object",
        "properties": {
          "regionId": {
            "type": "string",
            "format": "uuid"
          },
          "name": {
            "type": "string",
            "nullable": true
          },
          "isAirport": {
            "type": "boolean"
          },
          "cityId": {
            "type": "string",
            "format": "uuid"
          },
          "cityName": {
            "type": "string",
            "nullable": true
          },
          "country": {
            "type": "string",
            "nullable": true
          }
        },
        "additionalProperties": false
      },
      "LoginRequest": {
        "required": [
          "email",
          "password"
        ],
        "type": "object",
        "properties": {
          "email": {
            "maxLength": 256,
            "minLength": 1,
            "type": "string",
            "format": "email"
          },
          "password": {
            "maxLength": 200,
            "minLength": 1,
            "type": "string"
          },
          "deviceName": {
            "maxLength": 100,
            "type": "string",
            "description": "İsteğe bağlı cihaz adı (ör. \"iPhone 15\") — oturum listesinde görünür.",
            "nullable": true
          }
        },
        "additionalProperties": false
      },
      "ManageBookingResponse": {
        "type": "object",
        "properties": {
          "canCancel": {
            "type": "boolean",
            "description": "Kendi kendine iptal edilebilir mi (iptal süresi, ayar, partner rezervasyonu…)."
          },
          "cancelBlock": {
            "type": "string",
            "description": "İptal edilemiyorsa nedeni: `Disabled`, `TooLate`, `NotCancellable`, `PartnerBooking`.",
            "nullable": true
          },
          "cancelDeadline": {
            "type": "string",
            "description": "Son iptal anı.",
            "format": "date-time",
            "nullable": true
          },
          "feePercent": {
            "type": "integer",
            "description": "Kartla ödenmişse kesilecek iptal ücreti (%).",
            "format": "int32"
          },
          "refundEstimate": {
            "type": "number",
            "description": "Karta iade edilecek tahmini tutar (ödeme yoksa null).",
            "format": "double",
            "nullable": true
          },
          "refundCurrency": {
            "$ref": "#/components/schemas/CurrencyType"
          },
          "walletRefundAmount": {
            "type": "number",
            "description": "Cüzdana geri yüklenecek tutar (EUR).",
            "format": "double"
          },
          "canEdit": {
            "type": "boolean",
            "description": "Yolcu / tarih-saat / uçuş-otel bilgisi değiştirilebilir mi (iptal süresiyle aynı pencere)."
          },
          "current": {
            "$ref": "#/components/schemas/EditableBookingDetails"
          }
        },
        "additionalProperties": false,
        "description": "Rezervasyonda müşterinin yapabilecekleri."
      },
      "MobileBookingResponse": {
        "type": "object",
        "properties": {
          "booking": {
            "$ref": "#/components/schemas/MobileLegResponse"
          },
          "return": {
            "$ref": "#/components/schemas/MobileLegResponse"
          },
          "totalPrice": {
            "type": "number",
            "format": "double"
          },
          "currency": {
            "$ref": "#/components/schemas/CurrencyType"
          },
          "payment": {
            "$ref": "#/components/schemas/MobilePaymentResponse"
          },
          "accessToken": {
            "type": "string",
            "nullable": true
          }
        },
        "additionalProperties": false
      },
      "MobileCardPaymentRequest": {
        "required": [
          "cardCvc",
          "cardExpiry",
          "cardHolder",
          "cardNumber",
          "method"
        ],
        "type": "object",
        "properties": {
          "method": {
            "$ref": "#/components/schemas/PaymentMethodType"
          },
          "cardHolder": {
            "maxLength": 100,
            "minLength": 1,
            "type": "string"
          },
          "cardNumber": {
            "maxLength": 23,
            "minLength": 1,
            "type": "string"
          },
          "cardExpiry": {
            "maxLength": 7,
            "minLength": 1,
            "type": "string",
            "description": "AA/YY"
          },
          "cardCvc": {
            "maxLength": 4,
            "minLength": 1,
            "type": "string"
          },
          "useThreeDSecure": {
            "type": "boolean"
          },
          "language": {
            "maxLength": 5,
            "type": "string",
            "description": "Hata metinlerinin dili: \"en\" | \"tr\".",
            "nullable": true
          }
        },
        "additionalProperties": false,
        "description": "Kart ödemesi (iyzico). GÜVENLİK: kart alanları loglanmaz / saklanmaz."
      },
      "MobileCardPaymentResult": {
        "type": "object",
        "properties": {
          "status": {
            "type": "string",
            "nullable": true
          },
          "threeDsHtml": {
            "type": "string",
            "nullable": true
          },
          "errorKey": {
            "type": "string",
            "nullable": true
          },
          "message": {
            "type": "string",
            "nullable": true
          }
        },
        "additionalProperties": false,
        "description": "Kart ödemesi sonucu: `succeeded` (onay ekranı), `threeDs` (bankanın 3DS sayfası `threeDsHtml` uygulama içinde açılır;\r\nbitince site /Booking/Confirmation/ ya da /Booking/Step3/ adresine döner), `failed` (`errorKey`: Pay.Error.*)."
      },
      "MobileConfirmationResponse": {
        "type": "object",
        "properties": {
          "booking": {
            "$ref": "#/components/schemas/MobileBookingResponse"
          },
          "customerName": {
            "type": "string",
            "nullable": true
          },
          "customerEmail": {
            "type": "string",
            "nullable": true
          },
          "customerPhone": {
            "type": "string",
            "nullable": true
          },
          "providerName": {
            "type": "string",
            "nullable": true
          },
          "notes": {
            "type": "string",
            "nullable": true
          },
          "returnNotes": {
            "type": "string",
            "nullable": true
          },
          "pageHtml": {
            "type": "string",
            "nullable": true
          },
          "voucherUrl": {
            "type": "string",
            "nullable": true
          },
          "canCreateAccount": {
            "type": "boolean"
          }
        },
        "additionalProperties": false,
        "description": "Onay ekranı (Step4, 2026-10-18) — sitedeki /Booking/Confirmation sayfasıyla aynı içerik: rezervasyon, müşteri bilgileri, firma,\r\nbacak notları, yönetimin düzenlediği onay sayfası metni (`pageHtml`), PDF voucher (sitedeki gibi yalnızca rezervasyon \"Yeni\" iken)\r\nve misafir için \"hesabımı oluştur\" (`canCreateAccount`)."
      },
      "MobileCriterionAverage": {
        "type": "object",
        "properties": {
          "name": {
            "type": "string",
            "description": "Kriter adı (istenen dilde).",
            "nullable": true
          },
          "average": {
            "type": "number",
            "description": "Ortalama puan (1–5, bir ondalık).",
            "format": "double"
          }
        },
        "additionalProperties": false
      },
      "MobileDiscountRequest": {
        "type": "object",
        "properties": {
          "couponCode": {
            "maxLength": 30,
            "type": "string",
            "nullable": true
          },
          "useWallet": {
            "type": "boolean"
          }
        },
        "additionalProperties": false
      },
      "MobileExtraSelection": {
        "type": "object",
        "properties": {
          "extraServiceId": {
            "type": "string",
            "format": "uuid"
          },
          "quantity": {
            "type": "integer",
            "format": "int32"
          }
        },
        "additionalProperties": false,
        "description": "Seçilen ekstra hizmet ve adedi (adet en fazla ekstranın `maxQuantity`'si; sunucu yeniden kontrol eder)."
      },
      "MobileHomeResponse": {
        "type": "object",
        "properties": {
          "cities": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/TourSuggestionCity"
            },
            "description": "Turu olan şehirler (tur sayısına göre).",
            "nullable": true
          },
          "tours": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/TourCardDto"
            },
            "description": "Öne çıkan turlar: en çok turu olan şehirlerin popüler turları, bugünün başlangıç fiyatıyla (null = online fiyat yok).",
            "nullable": true
          }
        },
        "additionalProperties": false
      },
      "MobileLegResponse": {
        "type": "object",
        "properties": {
          "code": {
            "type": "string",
            "nullable": true
          },
          "status": {
            "$ref": "#/components/schemas/BookingStatus"
          },
          "pickupDate": {
            "type": "string",
            "format": "date"
          },
          "pickupTime": {
            "type": "string",
            "nullable": true
          },
          "fromRegion": {
            "type": "string",
            "nullable": true
          },
          "toRegion": {
            "type": "string",
            "nullable": true
          },
          "vehicleType": {
            "type": "string",
            "nullable": true
          },
          "passengerCount": {
            "type": "integer",
            "format": "int32"
          },
          "passengerName": {
            "type": "string",
            "nullable": true
          },
          "price": {
            "type": "number",
            "format": "double"
          },
          "currency": {
            "$ref": "#/components/schemas/CurrencyType"
          },
          "flightCode": {
            "type": "string",
            "nullable": true
          },
          "hotelAddress": {
            "type": "string",
            "nullable": true
          },
          "cancellationReason": {
            "type": "string",
            "nullable": true
          }
        },
        "additionalProperties": false
      },
      "MobileMessageResponse": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string",
            "format": "uuid"
          },
          "fromCustomer": {
            "type": "boolean",
            "description": "true = müşterinin kendi mesajı; false = ekibimizin cevabı."
          },
          "authorName": {
            "type": "string",
            "nullable": true
          },
          "body": {
            "type": "string",
            "nullable": true
          },
          "createdAt": {
            "type": "string",
            "format": "date-time"
          },
          "readAt": {
            "type": "string",
            "format": "date-time",
            "nullable": true
          }
        },
        "additionalProperties": false
      },
      "MobileMessageThreadResponse": {
        "type": "object",
        "properties": {
          "kind": {
            "type": "string",
            "description": "`transfer` / `tour`.",
            "nullable": true
          },
          "code": {
            "type": "string",
            "nullable": true
          },
          "title": {
            "type": "string",
            "nullable": true
          },
          "date": {
            "type": "string",
            "format": "date"
          },
          "lastBody": {
            "type": "string",
            "nullable": true
          },
          "lastFromCustomer": {
            "type": "boolean"
          },
          "lastMessageAt": {
            "type": "string",
            "format": "date-time"
          },
          "unreadCount": {
            "type": "integer",
            "format": "int32"
          }
        },
        "additionalProperties": false,
        "description": "Mesajlarım satırı: rezervasyon (tür + kod), başlık (güzergâh ya da tur adı), hizmet tarihi, son mesaj ve okunmamış ekip mesajı sayısı."
      },
      "MobileOfferedExtra": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string",
            "format": "uuid"
          },
          "name": {
            "type": "string",
            "nullable": true
          },
          "description": {
            "type": "string",
            "nullable": true
          },
          "icon": {
            "type": "string",
            "nullable": true
          },
          "maxQuantity": {
            "type": "integer",
            "format": "int32"
          },
          "unitPrice": {
            "type": "number",
            "format": "double"
          },
          "currency": {
            "$ref": "#/components/schemas/CurrencyType"
          }
        },
        "additionalProperties": false,
        "description": "Firmanın sunduğu ekstra hizmet (sitedeki Step2 \"Ekstra hizmetler\" ile aynı kaynak; fiyat istenen dövizde, adet başına)."
      },
      "MobilePassenger": {
        "required": [
          "email",
          "firstName",
          "lastName",
          "phone"
        ],
        "type": "object",
        "properties": {
          "firstName": {
            "maxLength": 100,
            "minLength": 1,
            "type": "string"
          },
          "lastName": {
            "maxLength": 100,
            "minLength": 1,
            "type": "string"
          },
          "phoneCode": {
            "maxLength": 8,
            "type": "string",
            "nullable": true
          },
          "phone": {
            "maxLength": 32,
            "minLength": 1,
            "type": "string"
          },
          "email": {
            "maxLength": 256,
            "minLength": 1,
            "type": "string",
            "format": "email"
          }
        },
        "additionalProperties": false
      },
      "MobilePaymentDiscount": {
        "type": "object",
        "properties": {
          "allowed": {
            "type": "boolean"
          },
          "couponDiscount": {
            "type": "number",
            "format": "double"
          },
          "couponCode": {
            "type": "string",
            "nullable": true
          },
          "walletDiscount": {
            "type": "number",
            "format": "double"
          },
          "walletBalanceEur": {
            "type": "number",
            "format": "double"
          }
        },
        "additionalProperties": false,
        "description": "İndirim durumu: uygulanabilir mi, uygulanmış kupon / cüzdan tutarı, cüzdan bakiyesi (EUR)."
      },
      "MobilePaymentOption": {
        "type": "object",
        "properties": {
          "method": {
            "$ref": "#/components/schemas/PaymentMethodType"
          },
          "payNow": {
            "type": "number",
            "format": "double"
          },
          "payDriver": {
            "type": "number",
            "format": "double"
          },
          "iyzico": {
            "type": "boolean"
          },
          "payPal": {
            "type": "boolean"
          }
        },
        "additionalProperties": false,
        "description": "Ödeme ekranında bir yöntem: şimdi ödenecek, şoföre ödenecek; kart yöntemlerinde hangi altyapılar açık."
      },
      "MobilePaymentOptionsResponse": {
        "type": "object",
        "properties": {
          "code": {
            "type": "string",
            "nullable": true
          },
          "status": {
            "$ref": "#/components/schemas/BookingStatus"
          },
          "paid": {
            "type": "boolean"
          },
          "total": {
            "type": "number",
            "format": "double"
          },
          "currency": {
            "$ref": "#/components/schemas/CurrencyType"
          },
          "options": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/MobilePaymentOption"
            },
            "nullable": true
          },
          "discount": {
            "$ref": "#/components/schemas/MobilePaymentDiscount"
          },
          "payPalUrl": {
            "type": "string",
            "nullable": true
          },
          "rulesHtml": {
            "type": "string",
            "nullable": true
          },
          "freeCancellationHours": {
            "type": "integer",
            "format": "int32",
            "nullable": true
          }
        },
        "additionalProperties": false,
        "description": "Uygulamanın ödeme ekranı (Step3; 2026-10-18) — sitedeki Step3 ile aynı tutarlar ve kurallar. `paid` true ise ödeme alınmış\r\n(onay ekranına geçilir). `payPalUrl`: PayPal yalnızca kendi sayfasında onaylanır — sitedeki sade PayPal sayfası.\r\n`rulesHtml`: rezervasyon kuralları (onay kutusunun bağlantısı)."
      },
      "MobilePaymentResponse": {
        "type": "object",
        "properties": {
          "status": {
            "type": "string",
            "nullable": true
          },
          "method": {
            "$ref": "#/components/schemas/PaymentMethodType"
          },
          "url": {
            "type": "string",
            "nullable": true
          }
        },
        "additionalProperties": false,
        "description": "TranigoNew.Api.Contracts.Mobile.MobilePaymentResponse.Status: \"awaiting_payment\" (ödeme yöntemi henüz seçilmedi — TranigoNew.Api.Contracts.Mobile.MobilePaymentResponse.Url sayfasında kart, ön ödeme\r\n            ya da nakit seçilir), \"paid\" (kartla ödendi), \"deposit_paid\" (ön ödeme alındı, kalanı sürücüye), \"pay_driver\"\r\n            (tamamı sürücüye nakit), \"refunded\", \"none\" (ödemesiz iptal)."
      },
      "MobileProviderReview": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string",
            "format": "uuid"
          },
          "reviewerName": {
            "type": "string",
            "description": "Yolcunun adı, soyadı baş harfiyle (ör. \"John D.\").",
            "nullable": true
          },
          "rating": {
            "type": "number",
            "format": "double"
          },
          "comment": {
            "type": "string",
            "nullable": true
          },
          "fromRegion": {
            "type": "string",
            "nullable": true
          },
          "toRegion": {
            "type": "string",
            "nullable": true
          },
          "travelDate": {
            "type": "string",
            "format": "date"
          },
          "createdAt": {
            "type": "string",
            "format": "date-time"
          }
        },
        "additionalProperties": false
      },
      "MobileProviderReviews": {
        "type": "object",
        "properties": {
          "providerName": {
            "type": "string",
            "nullable": true
          },
          "averageRating": {
            "type": "number",
            "format": "double"
          },
          "reviewCount": {
            "type": "integer",
            "format": "int32"
          },
          "reviews": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/MobileProviderReview"
            },
            "nullable": true
          },
          "page": {
            "type": "integer",
            "format": "int32"
          },
          "totalPages": {
            "type": "integer",
            "format": "int32"
          }
        },
        "additionalProperties": false,
        "description": "Firmanın tüm yorumları (sitedeki firma yorum sayfasıyla aynı: en yeniden eskiye, sayfalı)."
      },
      "MobileProviderSummary": {
        "type": "object",
        "properties": {
          "providerId": {
            "type": "string",
            "format": "uuid"
          },
          "providerName": {
            "type": "string",
            "nullable": true
          },
          "averageRating": {
            "type": "number",
            "format": "double"
          },
          "reviewCount": {
            "type": "integer",
            "format": "int32"
          },
          "reviewSummary": {
            "type": "string",
            "nullable": true
          },
          "criteria": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/MobileCriterionAverage"
            },
            "nullable": true
          },
          "hasReviewPage": {
            "type": "boolean"
          }
        },
        "additionalProperties": false,
        "description": "Araç listesindeki firma özeti penceresi — sitedeki Step1 \"provider özeti\" ile aynı kaynak (BookingController.ProviderSummary):\r\nortalama puan, yorum sayısı, yazılı özet (AI), kriter ortalamaları. `HasReviewPage`: firmanın yorum sayfası var (tüm yorumlar)."
      },
      "MobileQuickAccountResult": {
        "type": "object",
        "properties": {
          "status": {
            "type": "string",
            "nullable": true
          },
          "email": {
            "type": "string",
            "nullable": true
          }
        },
        "additionalProperties": false,
        "description": "Misafir rezervasyonundan hesap: `created` (şifre e-postaya gitti) ya da `exists` (bu e-postayla hesap var → giriş yapsın)."
      },
      "MobileReturnLeg": {
        "required": [
          "date",
          "time"
        ],
        "type": "object",
        "properties": {
          "date": {
            "type": "string",
            "format": "date"
          },
          "time": {
            "minLength": 1,
            "pattern": "^([01]\\d|2[0-3]):[0-5]\\d$",
            "type": "string",
            "description": "Türkiye yerel saati (HH:mm)."
          },
          "flightCode": {
            "maxLength": 20,
            "type": "string",
            "nullable": true
          },
          "hotelAddress": {
            "maxLength": 500,
            "type": "string",
            "nullable": true
          },
          "notes": {
            "maxLength": 2000,
            "type": "string",
            "nullable": true
          }
        },
        "additionalProperties": false
      },
      "MobileTourBookingResponse": {
        "type": "object",
        "properties": {
          "code": {
            "type": "string",
            "nullable": true
          },
          "status": {
            "$ref": "#/components/schemas/BookingStatus"
          },
          "tourId": {
            "type": "string",
            "format": "uuid"
          },
          "tourName": {
            "type": "string",
            "nullable": true
          },
          "tourDate": {
            "type": "string",
            "format": "date"
          },
          "startTime": {
            "type": "string",
            "nullable": true
          },
          "adults": {
            "type": "integer",
            "format": "int32"
          },
          "childCount": {
            "type": "integer",
            "format": "int32"
          },
          "guideLanguage": {
            "type": "string",
            "nullable": true
          },
          "pickupPoint": {
            "type": "string",
            "nullable": true
          },
          "pickupAddress": {
            "type": "string",
            "nullable": true
          },
          "passengerName": {
            "type": "string",
            "nullable": true
          },
          "price": {
            "type": "number",
            "format": "double"
          },
          "currency": {
            "$ref": "#/components/schemas/CurrencyType"
          },
          "payment": {
            "$ref": "#/components/schemas/MobilePaymentResponse"
          },
          "accessToken": {
            "type": "string",
            "nullable": true
          }
        },
        "additionalProperties": false,
        "description": "Müşterinin tur rezervasyonu. TranigoNew.Api.Contracts.Mobile.MobileTourBookingResponse.Payment durumları transferle aynıdır; nakit seçilmiş ve henüz ödenmemiş turda\r\n\"pay_on_tour\" (ücret turda rehbere/firmaya ödenir)."
      },
      "MobileTourConfirmationResponse": {
        "type": "object",
        "properties": {
          "booking": {
            "$ref": "#/components/schemas/MobileTourBookingResponse"
          },
          "customerName": {
            "type": "string",
            "nullable": true
          },
          "customerEmail": {
            "type": "string",
            "nullable": true
          },
          "customerPhone": {
            "type": "string",
            "nullable": true
          },
          "pickupTime": {
            "type": "string",
            "nullable": true
          },
          "notes": {
            "type": "string",
            "nullable": true
          },
          "paymentMethod": {
            "$ref": "#/components/schemas/PaymentMethodType"
          },
          "depositAmount": {
            "type": "number",
            "format": "double"
          },
          "guideCollectAmount": {
            "type": "number",
            "format": "double"
          },
          "pageHtml": {
            "type": "string",
            "nullable": true
          }
        },
        "additionalProperties": false,
        "description": "Tur onay ekranı (Step4, 2026-10-18) — sitedeki /TourBooking/Confirmation sayfasıyla aynı içerik: rezervasyon, müşteri bilgileri,\r\nalış saati, not, ödeme yöntemi (kısmi ödemede şimdi ödenen / turda ödenecek) ve yönetimin düzenlediği onay metni."
      },
      "MobileTourContent": {
        "type": "object",
        "properties": {
          "name": {
            "type": "string",
            "nullable": true
          },
          "summary": {
            "type": "string",
            "nullable": true
          },
          "bodyHtml": {
            "type": "string",
            "nullable": true
          },
          "durationText": {
            "type": "string",
            "nullable": true
          },
          "priceDescription": {
            "type": "string",
            "nullable": true
          },
          "childPolicy": {
            "type": "string",
            "nullable": true
          },
          "inclusions": {
            "type": "string",
            "nullable": true
          },
          "exclusions": {
            "type": "string",
            "nullable": true
          },
          "pickupInfo": {
            "type": "string",
            "nullable": true
          },
          "additionalInfo": {
            "type": "string",
            "nullable": true
          },
          "cancellationPolicy": {
            "type": "string",
            "nullable": true
          },
          "healthSafety": {
            "type": "string",
            "nullable": true
          }
        },
        "additionalProperties": false,
        "description": "Tur metinleri (turun o dildeki çevirisi). HTML alanları sitede gösterilen temizlenmiş HTML'dir."
      },
      "MobileTourDetailResponse": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string",
            "format": "uuid"
          },
          "cityId": {
            "type": "string",
            "format": "uuid"
          },
          "culture": {
            "type": "string",
            "nullable": true
          },
          "fallbackCulture": {
            "type": "string",
            "nullable": true
          },
          "content": {
            "$ref": "#/components/schemas/MobileTourContent"
          },
          "images": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/PublicTourImageDto"
            },
            "nullable": true
          },
          "kind": {
            "$ref": "#/components/schemas/TourKind"
          },
          "durationType": {
            "$ref": "#/components/schemas/TourDurationType"
          },
          "startTime": {
            "type": "string",
            "nullable": true
          },
          "endTime": {
            "type": "string",
            "nullable": true
          },
          "departureTimes": {
            "type": "array",
            "items": {
              "type": "string"
            },
            "nullable": true
          },
          "startingPoint": {
            "type": "string",
            "nullable": true
          },
          "latitude": {
            "type": "number",
            "format": "double",
            "nullable": true
          },
          "longitude": {
            "type": "number",
            "format": "double",
            "nullable": true
          },
          "pricingUnit": {
            "$ref": "#/components/schemas/TourPricingUnit"
          },
          "price": {
            "type": "number",
            "format": "double",
            "nullable": true
          },
          "currency": {
            "$ref": "#/components/schemas/CurrencyType"
          },
          "isClosedOnDate": {
            "type": "boolean"
          },
          "freeCancellationHours": {
            "type": "integer",
            "format": "int32",
            "nullable": true
          },
          "guideLanguages": {
            "type": "array",
            "items": {
              "type": "string"
            },
            "nullable": true
          },
          "pickupPoints": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/MobileTourPickupPoint"
            },
            "nullable": true
          },
          "featureGroups": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/PublicTourFeatureGroupDto"
            },
            "nullable": true
          },
          "relatedTours": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/TourCardDto"
            },
            "nullable": true
          },
          "questions": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/PublicTourQuestionDto"
            },
            "nullable": true
          },
          "reviews": {
            "$ref": "#/components/schemas/PublicTourReviewSummaryDto"
          }
        },
        "additionalProperties": false,
        "description": "Tur detayı. TranigoNew.Api.Contracts.Mobile.MobileTourDetailResponse.Price seçilen tarihteki başlangıç fiyatıdır (kişi başı turda 1 yetişkin, grup turunda en küçük grup);\r\nnull = o tarih için online fiyat yok. Kesin tutar için `GET /mobile/v1/tours/{id}/quote`.\r\nTranigoNew.Api.Contracts.Mobile.MobileTourDetailResponse.FallbackCulture: tur istenen dilde yayında değilse İngilizce gösterilir (\"en\"); aksi halde null.\r\nRezervasyon seçenekleri: TranigoNew.Api.Contracts.Mobile.MobileTourDetailResponse.DepartureTimes birden çoksa `startTime`, TranigoNew.Api.Contracts.Mobile.MobileTourDetailResponse.GuideLanguages birden çoksa\r\n`guideLanguage` zorunludur; TranigoNew.Api.Contracts.Mobile.MobileTourDetailResponse.PickupPoints doluysa `pickupRegionId` ya da `pickupAddress` verilmelidir."
      },
      "MobileTourPickupPoint": {
        "type": "object",
        "properties": {
          "regionId": {
            "type": "string",
            "format": "uuid"
          },
          "name": {
            "type": "string",
            "nullable": true
          },
          "from": {
            "type": "string",
            "nullable": true
          },
          "to": {
            "type": "string",
            "nullable": true
          }
        },
        "additionalProperties": false,
        "description": "Alış noktası (otel bölgesi). TranigoNew.Api.Contracts.Mobile.MobileTourPickupPoint.From/TranigoNew.Api.Contracts.Mobile.MobileTourPickupPoint.To: alış saati aralığı (HH:mm, Türkiye saati)."
      },
      "PaymentMethodType": {
        "enum": [
          "CreditCard",
          "PartialPayment",
          "Cash",
          "OnAccount"
        ],
        "type": "string"
      },
      "PostMessageBody": {
        "required": [
          "text"
        ],
        "type": "object",
        "properties": {
          "text": {
            "maxLength": 4000,
            "minLength": 1,
            "type": "string"
          }
        },
        "additionalProperties": false
      },
      "PricedTransferOfferDto": {
        "type": "object",
        "properties": {
          "priceId": {
            "type": "string",
            "format": "uuid"
          },
          "providerId": {
            "type": "string",
            "format": "uuid"
          },
          "providerName": {
            "type": "string",
            "nullable": true
          },
          "vehicleTypeId": {
            "type": "string",
            "format": "uuid"
          },
          "vehicleTypeName": {
            "type": "string",
            "nullable": true
          },
          "passengerCapacity": {
            "type": "integer",
            "format": "int32"
          },
          "luggageCapacity": {
            "type": "integer",
            "format": "int32"
          },
          "imagePath": {
            "type": "string",
            "nullable": true
          },
          "transferMode": {
            "$ref": "#/components/schemas/TransferMode"
          },
          "averageRating": {
            "type": "number",
            "format": "double"
          },
          "reviewCount": {
            "type": "integer",
            "format": "int32"
          },
          "price": {
            "type": "number",
            "format": "double"
          },
          "currency": {
            "$ref": "#/components/schemas/CurrencyType"
          },
          "paymentMethods": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/PaymentMethodType"
            },
            "nullable": true
          }
        },
        "additionalProperties": false
      },
      "ProblemDetails": {
        "type": "object",
        "properties": {
          "type": {
            "type": "string",
            "nullable": true
          },
          "title": {
            "type": "string",
            "nullable": true
          },
          "status": {
            "type": "integer",
            "format": "int32",
            "nullable": true
          },
          "detail": {
            "type": "string",
            "nullable": true
          },
          "instance": {
            "type": "string",
            "nullable": true
          }
        },
        "additionalProperties": { }
      },
      "ProfileResponse": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string",
            "format": "uuid"
          },
          "firstName": {
            "type": "string",
            "nullable": true
          },
          "lastName": {
            "type": "string",
            "nullable": true
          },
          "email": {
            "type": "string",
            "nullable": true
          },
          "phoneCode": {
            "type": "string",
            "nullable": true
          },
          "phone": {
            "type": "string",
            "nullable": true
          },
          "hasPassword": {
            "type": "boolean",
            "description": "false = hesap Apple / Google ile açılmış, şifresi yok (hesap silmede şifre sorulmaz)."
          },
          "isEmailVerified": {
            "type": "boolean",
            "description": "false = kayıttan sonra e-postaya gelen kod henüz girilmedi (misafir rezervasyonları doğrulanınca hesaba bağlanır)."
          },
          "pendingEmail": {
            "type": "string",
            "description": "Profilden istenmiş, kodla onay bekleyen yeni e-posta (yoksa null).",
            "nullable": true
          }
        },
        "additionalProperties": false
      },
      "PublicTourAnswerDto": {
        "type": "object",
        "properties": {
          "text": {
            "type": "string",
            "nullable": true
          },
          "answeredAt": {
            "type": "string",
            "format": "date-time",
            "nullable": true
          }
        },
        "additionalProperties": false
      },
      "PublicTourCriterionAverageDto": {
        "type": "object",
        "properties": {
          "name": {
            "type": "string",
            "nullable": true
          },
          "average": {
            "type": "number",
            "format": "double"
          }
        },
        "additionalProperties": false
      },
      "PublicTourFeatureGroupDto": {
        "type": "object",
        "properties": {
          "name": {
            "type": "string",
            "nullable": true
          },
          "features": {
            "type": "array",
            "items": {
              "type": "string"
            },
            "nullable": true
          }
        },
        "additionalProperties": false
      },
      "PublicTourImageDto": {
        "type": "object",
        "properties": {
          "path": {
            "type": "string",
            "nullable": true
          },
          "altText": {
            "type": "string",
            "nullable": true
          }
        },
        "additionalProperties": false
      },
      "PublicTourQuestionDto": {
        "type": "object",
        "properties": {
          "text": {
            "type": "string",
            "nullable": true
          },
          "askerName": {
            "type": "string",
            "nullable": true
          },
          "askedAt": {
            "type": "string",
            "format": "date-time",
            "nullable": true
          },
          "answers": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/PublicTourAnswerDto"
            },
            "nullable": true
          }
        },
        "additionalProperties": false
      },
      "PublicTourQuoteDto": {
        "type": "object",
        "properties": {
          "status": {
            "$ref": "#/components/schemas/PublicTourQuoteStatus"
          },
          "lines": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/PublicTourQuoteLineDto"
            },
            "nullable": true
          },
          "total": {
            "type": "number",
            "format": "double"
          },
          "currency": {
            "$ref": "#/components/schemas/CurrencyType"
          },
          "pricingUnit": {
            "$ref": "#/components/schemas/TourPricingUnit"
          },
          "capacity": {
            "type": "integer",
            "format": "int32",
            "nullable": true
          }
        },
        "additionalProperties": false
      },
      "PublicTourQuoteLineDto": {
        "type": "object",
        "properties": {
          "kind": {
            "$ref": "#/components/schemas/TourQuoteLineKind"
          },
          "quantity": {
            "type": "integer",
            "format": "int32"
          },
          "unitPrice": {
            "type": "number",
            "format": "double"
          },
          "total": {
            "type": "number",
            "format": "double"
          },
          "rangeMin": {
            "type": "integer",
            "format": "int32",
            "nullable": true
          },
          "rangeMax": {
            "type": "integer",
            "format": "int32",
            "nullable": true
          }
        },
        "additionalProperties": false
      },
      "PublicTourQuoteStatus": {
        "enum": [
          "Ok",
          "NoPrice",
          "Closed",
          "OverCapacity",
          "TooLate",
          "InvalidPax",
          "NotAvailable"
        ],
        "type": "string"
      },
      "PublicTourReviewDto": {
        "type": "object",
        "properties": {
          "name": {
            "type": "string",
            "nullable": true
          },
          "rating": {
            "type": "number",
            "format": "double"
          },
          "comment": {
            "type": "string",
            "nullable": true
          },
          "createdAt": {
            "type": "string",
            "format": "date-time"
          }
        },
        "additionalProperties": false
      },
      "PublicTourReviewSummaryDto": {
        "type": "object",
        "properties": {
          "average": {
            "type": "number",
            "format": "double"
          },
          "count": {
            "type": "integer",
            "format": "int32"
          },
          "criteria": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/PublicTourCriterionAverageDto"
            },
            "nullable": true
          },
          "reviews": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/PublicTourReviewDto"
            },
            "nullable": true
          }
        },
        "additionalProperties": false
      },
      "RefreshRequest": {
        "required": [
          "refreshToken"
        ],
        "type": "object",
        "properties": {
          "refreshToken": {
            "maxLength": 200,
            "minLength": 1,
            "type": "string"
          }
        },
        "additionalProperties": false
      },
      "RegisterRequest": {
        "required": [
          "email",
          "firstName",
          "lastName",
          "password",
          "phone"
        ],
        "type": "object",
        "properties": {
          "firstName": {
            "maxLength": 100,
            "minLength": 1,
            "type": "string"
          },
          "lastName": {
            "maxLength": 100,
            "minLength": 1,
            "type": "string"
          },
          "email": {
            "maxLength": 256,
            "minLength": 1,
            "type": "string",
            "format": "email"
          },
          "phoneCode": {
            "maxLength": 8,
            "type": "string",
            "nullable": true
          },
          "phone": {
            "maxLength": 32,
            "minLength": 1,
            "type": "string"
          },
          "password": {
            "maxLength": 200,
            "minLength": 8,
            "type": "string",
            "description": "En az 8 karakter."
          },
          "deviceName": {
            "maxLength": 100,
            "type": "string",
            "nullable": true
          }
        },
        "additionalProperties": false
      },
      "ResetPasswordRequest": {
        "required": [
          "code",
          "email",
          "newPassword"
        ],
        "type": "object",
        "properties": {
          "email": {
            "maxLength": 256,
            "minLength": 1,
            "type": "string",
            "format": "email"
          },
          "code": {
            "maxLength": 6,
            "minLength": 6,
            "type": "string",
            "description": "E-postayla gelen 6 haneli kod (15 dk geçerli, en fazla 5 deneme)."
          },
          "newPassword": {
            "maxLength": 200,
            "minLength": 8,
            "type": "string"
          }
        },
        "additionalProperties": false
      },
      "ReviewCriterionResponse": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string",
            "format": "uuid"
          },
          "name": {
            "type": "string",
            "nullable": true
          }
        },
        "additionalProperties": false
      },
      "ReviewFormResponse": {
        "type": "object",
        "properties": {
          "canReview": {
            "type": "boolean",
            "description": "Yorum yazılabilir mi (tamamlanmış rezervasyon; eski sistemden aktarılmış yorum değiştirilemez)."
          },
          "criteria": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/ReviewCriterionResponse"
            },
            "nullable": true
          },
          "rating": {
            "type": "number",
            "description": "Varsa mevcut yorumun ortalama puanı.",
            "format": "double",
            "nullable": true
          },
          "comment": {
            "type": "string",
            "nullable": true
          },
          "scores": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/ReviewScoreResponse"
            },
            "nullable": true
          }
        },
        "additionalProperties": false
      },
      "ReviewScoreBody": {
        "required": [
          "criterionId"
        ],
        "type": "object",
        "properties": {
          "criterionId": {
            "type": "string",
            "format": "uuid"
          },
          "stars": {
            "maximum": 5,
            "minimum": 1,
            "type": "integer",
            "format": "int32"
          }
        },
        "additionalProperties": false
      },
      "ReviewScoreResponse": {
        "type": "object",
        "properties": {
          "criterionId": {
            "type": "string",
            "format": "uuid"
          },
          "stars": {
            "type": "integer",
            "format": "int32"
          }
        },
        "additionalProperties": false
      },
      "SubmitReviewBody": {
        "required": [
          "scores"
        ],
        "type": "object",
        "properties": {
          "comment": {
            "maxLength": 2000,
            "type": "string",
            "nullable": true
          },
          "scores": {
            "minItems": 1,
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/ReviewScoreBody"
            }
          }
        },
        "additionalProperties": false
      },
      "TokenResponse": {
        "type": "object",
        "properties": {
          "accessToken": {
            "type": "string",
            "nullable": true
          },
          "tokenType": {
            "type": "string",
            "nullable": true
          },
          "expiresAt": {
            "type": "string",
            "format": "date-time"
          },
          "refreshToken": {
            "type": "string",
            "nullable": true
          },
          "refreshTokenExpiresAt": {
            "type": "string",
            "format": "date-time"
          }
        },
        "additionalProperties": false,
        "description": "TranigoNew.Api.Contracts.TokenResponse.AccessToken: her istekte `Authorization: Bearer …` (60 dk). Süresi dolunca\r\n            TranigoNew.Api.Contracts.TokenResponse.RefreshToken ile yenileyin — yenileme token'ı her kullanımda değişir, eskisini saklamayın."
      },
      "TourCardDto": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string",
            "format": "uuid"
          },
          "name": {
            "type": "string",
            "nullable": true
          },
          "slug": {
            "type": "string",
            "nullable": true
          },
          "summary": {
            "type": "string",
            "nullable": true
          },
          "imagePath": {
            "type": "string",
            "nullable": true
          },
          "imageAlt": {
            "type": "string",
            "nullable": true
          },
          "startingPoint": {
            "type": "string",
            "nullable": true
          },
          "durationType": {
            "$ref": "#/components/schemas/TourDurationType"
          },
          "durationText": {
            "type": "string",
            "nullable": true
          },
          "pricingUnit": {
            "$ref": "#/components/schemas/TourPricingUnit"
          },
          "price": {
            "type": "number",
            "format": "double",
            "nullable": true
          },
          "currency": {
            "$ref": "#/components/schemas/CurrencyType"
          },
          "isClosedOnDate": {
            "type": "boolean"
          },
          "freeCancellationHours": {
            "type": "integer",
            "format": "int32",
            "nullable": true
          },
          "rating": {
            "type": "number",
            "format": "double",
            "nullable": true
          },
          "reviewCount": {
            "type": "integer",
            "format": "int32"
          },
          "guideLanguages": {
            "type": "array",
            "items": {
              "type": "string"
            },
            "nullable": true
          },
          "fallbackCulture": {
            "type": "string",
            "nullable": true
          }
        },
        "additionalProperties": false
      },
      "TourDurationType": {
        "enum": [
          "Hourly",
          "HalfDay",
          "FullDay"
        ],
        "type": "string"
      },
      "TourFilterOption": {
        "type": "object",
        "properties": {
          "key": {
            "type": "string",
            "nullable": true
          },
          "name": {
            "type": "string",
            "nullable": true
          },
          "count": {
            "type": "integer",
            "format": "int32"
          }
        },
        "additionalProperties": false
      },
      "TourKind": {
        "enum": [
          "Regular",
          "Private",
          "Package"
        ],
        "type": "string"
      },
      "TourPricingUnit": {
        "enum": [
          "PerPerson",
          "PerGroup"
        ],
        "type": "string"
      },
      "TourQuoteLineKind": {
        "enum": [
          "Adult",
          "Child",
          "ChildAsAdult",
          "Group"
        ],
        "type": "string"
      },
      "TourRequestAvailabilityResponse": {
        "type": "object",
        "properties": {
          "allowed": {
            "type": "boolean",
            "description": "Talep gönderilebilir."
          },
          "block": {
            "type": "string",
            "description": "`None`, `BookableOnline` (online rezervasyon yapılabiliyor), `TooLate`, `NotAvailable`.",
            "nullable": true
          },
          "leadHours": {
            "type": "integer",
            "description": "Talebin tur başlangıcından en geç kaç saat önce gönderilebileceği.",
            "format": "int32"
          }
        },
        "additionalProperties": false
      },
      "TourRequestCreatedResponse": {
        "type": "object",
        "properties": {
          "requestCode": {
            "type": "string",
            "description": "Talep kodu (ekibimiz teklif e-postasında bu kodla döner).",
            "nullable": true
          }
        },
        "additionalProperties": false
      },
      "TourSearchResult": {
        "type": "object",
        "properties": {
          "items": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/TourCardDto"
            },
            "nullable": true
          },
          "total": {
            "type": "integer",
            "format": "int32"
          },
          "page": {
            "type": "integer",
            "format": "int32"
          },
          "pageSize": {
            "type": "integer",
            "format": "int32"
          },
          "priceCeiling": {
            "type": "number",
            "format": "double"
          },
          "durations": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/TourFilterOption"
            },
            "nullable": true
          },
          "themes": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/TourFilterOption"
            },
            "nullable": true
          },
          "guideLanguages": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/TourFilterOption"
            },
            "nullable": true
          },
          "totalPages": {
            "type": "integer",
            "format": "int32",
            "readOnly": true
          }
        },
        "additionalProperties": false
      },
      "TourSortOrder": {
        "enum": [
          "Popular",
          "TopSelling",
          "BestRating",
          "LowPrice",
          "HighPrice"
        ],
        "type": "string"
      },
      "TourSuggestion": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string",
            "format": "uuid"
          },
          "cityId": {
            "type": "string",
            "format": "uuid"
          },
          "cityName": {
            "type": "string",
            "nullable": true
          },
          "name": {
            "type": "string",
            "nullable": true
          },
          "slug": {
            "type": "string",
            "nullable": true
          },
          "imagePath": {
            "type": "string",
            "nullable": true
          },
          "fallbackCulture": {
            "type": "string",
            "nullable": true
          }
        },
        "additionalProperties": false
      },
      "TourSuggestionCity": {
        "type": "object",
        "properties": {
          "cityId": {
            "type": "string",
            "format": "uuid"
          },
          "name": {
            "type": "string",
            "nullable": true
          },
          "country": {
            "type": "string",
            "nullable": true
          },
          "tourCount": {
            "type": "integer",
            "format": "int32"
          }
        },
        "additionalProperties": false
      },
      "TourSuggestionResult": {
        "type": "object",
        "properties": {
          "cities": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/TourSuggestionCity"
            },
            "nullable": true
          },
          "areas": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/TourSuggestion"
            },
            "nullable": true
          },
          "tours": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/TourSuggestion"
            },
            "nullable": true
          }
        },
        "additionalProperties": false
      },
      "TransferMode": {
        "enum": [
          "Private",
          "Shuttle"
        ],
        "type": "string"
      },
      "TransferOffersResult": {
        "type": "object",
        "properties": {
          "fromRegionName": {
            "type": "string",
            "nullable": true
          },
          "toRegionName": {
            "type": "string",
            "nullable": true
          },
          "fromRegionIsAirport": {
            "type": "boolean"
          },
          "toRegionIsAirport": {
            "type": "boolean"
          },
          "offers": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/PricedTransferOfferDto"
            },
            "nullable": true
          }
        },
        "additionalProperties": false
      },
      "UnreadMessagesResponse": {
        "type": "object",
        "properties": {
          "kind": {
            "type": "string",
            "description": "`transfer` / `tour`.",
            "nullable": true
          },
          "code": {
            "type": "string",
            "nullable": true
          },
          "count": {
            "type": "integer",
            "format": "int32"
          }
        },
        "additionalProperties": false
      },
      "UpdateProfileBody": {
        "required": [
          "email",
          "firstName",
          "lastName",
          "phone"
        ],
        "type": "object",
        "properties": {
          "firstName": {
            "maxLength": 100,
            "minLength": 1,
            "type": "string"
          },
          "lastName": {
            "maxLength": 100,
            "minLength": 1,
            "type": "string"
          },
          "email": {
            "maxLength": 256,
            "minLength": 1,
            "type": "string",
            "format": "email"
          },
          "phoneCode": {
            "maxLength": 8,
            "type": "string",
            "nullable": true
          },
          "phone": {
            "maxLength": 32,
            "minLength": 1,
            "type": "string"
          }
        },
        "additionalProperties": false
      },
      "ValidationProblemDetails": {
        "type": "object",
        "properties": {
          "type": {
            "type": "string",
            "nullable": true
          },
          "title": {
            "type": "string",
            "nullable": true
          },
          "status": {
            "type": "integer",
            "format": "int32",
            "nullable": true
          },
          "detail": {
            "type": "string",
            "nullable": true
          },
          "instance": {
            "type": "string",
            "nullable": true
          },
          "errors": {
            "type": "object",
            "additionalProperties": {
              "type": "array",
              "items": {
                "type": "string"
              }
            },
            "nullable": true
          }
        },
        "additionalProperties": { }
      },
      "VerifyEmailBody": {
        "required": [
          "code"
        ],
        "type": "object",
        "properties": {
          "code": {
            "maxLength": 6,
            "minLength": 6,
            "type": "string"
          }
        },
        "additionalProperties": false,
        "description": "E-postaya gelen 6 haneli kod (kayıt doğrulaması ya da profilden e-posta değişikliği)."
      },
      "VoucherLinkResponse": {
        "type": "object",
        "properties": {
          "url": {
            "type": "string",
            "description": "Voucher PDF'i (sitedeki rezervasyon bağlantısının /pdf adresi; QR'lı). Hizmet tarihinden 60 gün sonrasına kadar geçerli.",
            "nullable": true
          },
          "fileName": {
            "type": "string",
            "description": "Kaydederken önerilen dosya adı.",
            "nullable": true
          }
        },
        "additionalProperties": false
      },
      "WalletResponse": {
        "type": "object",
        "properties": {
          "balanceEur": {
            "type": "number",
            "format": "double"
          },
          "loyaltyEnabled": {
            "type": "boolean",
            "description": "Sadakat programı açık mı (tamamlanan transferlerden bakiye kazanılır)."
          },
          "ratePercent": {
            "type": "number",
            "description": "Kazanç oranı (%).",
            "format": "double"
          },
          "transactions": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/WalletTransactionResponse"
            },
            "nullable": true
          }
        },
        "additionalProperties": false
      },
      "WalletTransactionResponse": {
        "type": "object",
        "properties": {
          "type": {
            "type": "string",
            "nullable": true
          },
          "amount": {
            "type": "number",
            "format": "double"
          },
          "remainingAmount": {
            "type": "number",
            "format": "double"
          },
          "expiresAt": {
            "type": "string",
            "format": "date-time",
            "nullable": true
          },
          "description": {
            "type": "string",
            "nullable": true
          },
          "createdAt": {
            "type": "string",
            "format": "date-time"
          }
        },
        "additionalProperties": false
      }
    },
    "securitySchemes": {
      "ApiKey": {
        "type": "http",
        "description": "Partner API anahtarı (ctt_live_… / ctt_test_…), uygulama erişim token'ı (cttm_…) ya da Agency API anahtarı (ctta_…)",
        "scheme": "bearer"
      }
    }
  },
  "security": [
    {
      "ApiKey": [ ]
    }
  ]
}