{
  "openapi": "3.0.1",
  "info": {
    "title": "CampNow API - Complete Collection",
    "description": "CampNow Camping Spot Dashboard - Full API Collection\n\nHEADERS ON EVERY REQUEST:\n  Accept-Language: de  - default German; change to 'en' for English\n  Content-Type: application/json  - only on POST/PUT/PATCH with JSON body\n  Authorization: Bearer {{token}}  - set via Auth Type tab\n\nAUTH TOKENS:\n  - {{adminToken}}     - admin user JWT\n  - {{authToken}}      - campsite owner JWT\n  - {{campsiteToken}}  - campsite JWT (from /api/auth/campsite/login)\n\nJira: https://vitecgmbh.atlassian.net/jira/software/c/projects/PCSDB/boards/523",
    "version": "2.0.0"
  },
  "tags": [
    {
      "name": "Auth - Owner Login"
    },
    {
      "name": "Auth - Campsite Login"
    },
    {
      "name": "Admin/Users"
    },
    {
      "name": "Admin/Dashboard"
    },
    {
      "name": "Admin/Super Categories"
    },
    {
      "name": "Admin/FAQs"
    },
    {
      "name": "Admin/CMS"
    },
    {
      "name": "Admin/Campsite Owners"
    },
    {
      "name": "Admin/Campsites"
    },
    {
      "name": "Notifications"
    },
    {
      "name": "Campground Detail"
    },
    {
      "name": "Step 1a Basic Info"
    },
    {
      "name": "Step 1b Media"
    },
    {
      "name": "Step 1c Links"
    },
    {
      "name": "Step 1d FAQs"
    },
    {
      "name": "Step 2 Availability"
    },
    {
      "name": "Step 2 Availability Rules"
    },
    {
      "name": "Step 3 Activate"
    },
    {
      "name": "Public Profile"
    },
    {
      "name": "Sub-Categories"
    },
    {
      "name": "CampingCare ERP"
    },
    {
      "name": "Campalot ERP"
    },
    {
      "name": "Public CMS & FAQ"
    }
  ],
  "components": {
    "schemas": {
      "SuccessResponse": {
        "type": "object",
        "properties": {
          "success": {
            "type": "boolean",
            "example": true
          },
          "message": {
            "type": "string"
          },
          "data": {}
        }
      },
      "ErrorResponse": {
        "type": "object",
        "properties": {
          "success": {
            "type": "boolean",
            "example": false
          },
          "message": {
            "type": "string"
          }
        }
      },
      "ValidationErrorResponse": {
        "type": "object",
        "properties": {
          "success": {
            "type": "boolean",
            "example": false
          },
          "message": {
            "type": "string",
            "example": "Validation failed"
          },
          "errors": {
            "type": "array",
            "items": {
              "type": "object",
              "properties": {
                "field": {
                  "type": "string"
                },
                "message": {
                  "type": "string"
                }
              }
            }
          }
        }
      },
      "PaginationMeta": {
        "type": "object",
        "properties": {
          "total": {
            "type": "integer"
          },
          "totalPages": {
            "type": "integer"
          },
          "currentPage": {
            "type": "integer"
          },
          "perPage": {
            "type": "integer"
          },
          "hasNextPage": {
            "type": "boolean"
          },
          "hasPrevPage": {
            "type": "boolean"
          }
        }
      },
      "Location": {
        "type": "object",
        "properties": {
          "latitude": {
            "type": "number",
            "example": 47.8095
          },
          "longitude": {
            "type": "number",
            "example": 13.055
          },
          "address": {
            "type": "string",
            "example": "Salzburg, Austria"
          }
        }
      },
      "SuperCategoryAdmin": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string"
          },
          "name_en": {
            "type": "string"
          },
          "name_de": {
            "type": "string"
          },
          "icon": {
            "type": "string",
            "nullable": true
          },
          "order": {
            "type": "integer"
          },
          "createdAt": {
            "type": "string",
            "format": "date-time"
          },
          "updatedAt": {
            "type": "string",
            "format": "date-time"
          }
        }
      }
    },
    "securitySchemes": {
      "bearer": {
        "type": "http",
        "scheme": "bearer"
      }
    }
  },
  "servers": [],
  "security": [],
  "paths": {
    "/api/auth/register": {
      "post": {
        "summary": "Register",
        "tags": [
          "Auth - Owner Login"
        ],
        "parameters": [
          {
            "name": "Accept-Language",
            "in": "header",
            "required": true,
            "example": "en",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "Content-Type",
            "in": "header",
            "required": true,
            "example": "application/json",
            "schema": {
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "required": [
                  "email",
                  "password",
                  "firstName",
                  "lastName"
                ],
                "properties": {
                  "email": {
                    "type": "string",
                    "example": "user@example.com"
                  },
                  "password": {
                    "type": "string",
                    "example": "Pass@1234"
                  },
                  "firstName": {
                    "type": "string",
                    "example": "Hans"
                  },
                  "lastName": {
                    "type": "string",
                    "example": "Müller"
                  }
                }
              },
              "example": {
                "email": "user@example.com",
                "password": "Pass@1234",
                "firstName": "Hans",
                "lastName": "Müller"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Success",
            "content": {
              "application/json": {
                "example": {
                  "success": true,
                  "message": "Registration successful",
                  "data": {
                    "user": {
                      "id": "664f...",
                      "email": "user@example.com",
                      "firstName": "Hans",
                      "lastName": "Müller"
                    },
                    "tokens": {
                      "accessToken": "<jwt>",
                      "refreshToken": "<jwt>"
                    }
                  }
                }
              }
            }
          },
          "409": {
            "description": "Email already exists"
          },
          "422": {
            "description": "Validation error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ValidationErrorResponse"
                }
              }
            }
          }
        },
        "security": []
      }
    },
    "/api/auth/login": {
      "post": {
        "summary": "Campsite owner login",
        "operationId": "campsiteOwnerLogin",
        "tags": [
          "Auth - Owner Login"
        ],
        "parameters": [
          {
            "name": "Content-Type",
            "in": "header",
            "required": true,
            "example": "application/json",
            "schema": {
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "required": [
                  "email",
                  "password"
                ],
                "properties": {
                  "email": {
                    "type": "string",
                    "example": "admin@mailinator.com"
                  },
                  "password": {
                    "type": "string",
                    "example": "Admin@12345"
                  }
                }
              },
              "example": {
                "email": "admin@mailinator.com",
                "password": "Admin@12345"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Success",
            "content": {
              "application/json": {
                "example": {
                  "success": true,
                  "message": "Login successful",
                  "data": {
                    "user": {
                      "id": "664f...",
                      "firstName": "Klaus",
                      "lastName": "Müller",
                      "email": "k.mueller@campsite.de",
                      "userType": "campsiteOwner",
                      "isPasswordReset": true
                    },
                    "tokens": {
                      "accessToken": "<jwt>",
                      "refreshToken": "<jwt>"
                    },
                    "requiresPasswordReset": false
                  }
                }
              }
            }
          },
          "400": {
            "description": "Invalid credentials"
          },
          "403": {
            "description": "Account not yet active"
          }
        },
        "security": []
      }
    },
    "/api/auth/forgot-password": {
      "post": {
        "summary": "Forgot Password",
        "tags": [
          "Auth - Owner Login"
        ],
        "parameters": [
          {
            "name": "Accept-Language",
            "in": "header",
            "required": true,
            "example": "en",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "Content-Type",
            "in": "header",
            "required": true,
            "example": "application/json",
            "schema": {
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "required": [
                  "email"
                ],
                "properties": {
                  "email": {
                    "type": "string"
                  }
                }
              },
              "example": {
                "email": "admin@mailinator.com"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Success",
            "content": {
              "application/json": {
                "example": {
                  "success": true,
                  "data": {
                    "message": "Reset link sent.",
                    "expiresInMinutes": 60,
                    "note": "Check spam folder."
                  }
                }
              }
            }
          },
          "400": {
            "description": "Validation error"
          },
          "404": {
            "description": "User not found"
          },
          "429": {
            "description": "Too many requests"
          }
        },
        "security": []
      }
    },
    "/api/auth/reset-password": {
      "post": {
        "summary": "Reset Password (via email token)",
        "tags": [
          "Auth - Owner Login"
        ],
        "parameters": [
          {
            "name": "Accept-Language",
            "in": "header",
            "required": true,
            "example": "en",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "Content-Type",
            "in": "header",
            "required": true,
            "example": "application/json",
            "schema": {
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "required": [
                  "token",
                  "newPassword",
                  "confirmPassword"
                ],
                "properties": {
                  "token": {
                    "type": "string"
                  },
                  "newPassword": {
                    "type": "string"
                  },
                  "confirmPassword": {
                    "type": "string"
                  }
                }
              },
              "example": {
                "token": "73mdyav0Qm14yEnuzYL8b9JXWehcsRvG",
                "newPassword": "Admin@123",
                "confirmPassword": "Admin@123"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Success",
            "content": {
              "application/json": {
                "example": {
                  "success": true,
                  "data": {
                    "message": "Password updated. Please log in with your new password.",
                    "redirectTo": "/login"
                  }
                }
              }
            }
          },
          "400": {
            "description": "Token expired or passwords do not match"
          }
        },
        "security": []
      }
    },
    "/api/auth/otp/send": {
      "post": {
        "summary": "Send OTP",
        "tags": [
          "Auth - Owner Login"
        ],
        "parameters": [
          {
            "name": "Accept-Language",
            "in": "header",
            "required": true,
            "example": "en",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "Content-Type",
            "in": "header",
            "required": true,
            "example": "application/json",
            "schema": {
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "required": [
                  "email"
                ],
                "properties": {
                  "email": {
                    "type": "string"
                  }
                }
              },
              "example": {
                "email": "user@example.com"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Success",
            "content": {
              "application/json": {
                "example": {
                  "success": true,
                  "message": "OTP sent successfully",
                  "data": {
                    "message": "OTP sent to your email."
                  }
                }
              }
            }
          },
          "404": {
            "description": "Not found"
          }
        },
        "security": []
      }
    },
    "/api/auth/otp/verify": {
      "post": {
        "summary": "Verify OTP",
        "tags": [
          "Auth - Owner Login"
        ],
        "parameters": [
          {
            "name": "Accept-Language",
            "in": "header",
            "required": true,
            "example": "en",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "Content-Type",
            "in": "header",
            "required": true,
            "example": "application/json",
            "schema": {
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "required": [
                  "email",
                  "otp"
                ],
                "properties": {
                  "email": {
                    "type": "string"
                  },
                  "otp": {
                    "type": "string",
                    "example": "123456"
                  }
                }
              },
              "example": {
                "email": "user@example.com",
                "otp": "123456"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Success",
            "content": {
              "application/json": {
                "example": {
                  "success": true,
                  "message": "OTP verified",
                  "data": {
                    "tokens": {
                      "accessToken": "<jwt>",
                      "refreshToken": "<jwt>"
                    },
                    "user": {
                      "id": "664f...",
                      "email": "user@example.com"
                    }
                  }
                }
              }
            }
          },
          "400": {
            "description": "Invalid or expired OTP"
          }
        },
        "security": []
      }
    },
    "/api/auth/logout": {
      "post": {
        "summary": "Logout",
        "tags": [
          "Auth - Owner Login"
        ],
        "parameters": [
          {
            "name": "Accept-Language",
            "in": "header",
            "required": true,
            "example": "en",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Success",
            "content": {
              "application/json": {
                "example": {
                  "success": true,
                  "data": null,
                  "message": "Successfully logged out. Token invalidated."
                }
              }
            }
          },
          "401": {
            "description": "Unauthorized"
          }
        },
        "security": [
          {
            "bearer": []
          }
        ]
      }
    },
    "/api/auth/tokens/refresh": {
      "post": {
        "summary": "Refresh Token (owner)",
        "tags": [
          "Auth - Owner Login"
        ],
        "parameters": [
          {
            "name": "Accept-Language",
            "in": "header",
            "required": true,
            "example": "en",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "Content-Type",
            "in": "header",
            "required": true,
            "example": "application/json",
            "schema": {
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "required": [
                  "refreshToken"
                ],
                "properties": {
                  "refreshToken": {
                    "type": "string"
                  }
                }
              },
              "example": {
                "refreshToken": "{{refreshToken}}"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Success",
            "content": {
              "application/json": {
                "example": {
                  "success": true,
                  "data": {
                    "accessToken": "<jwt>",
                    "expiresIn": 3600,
                    "tokenType": "Bearer"
                  }
                }
              }
            }
          },
          "401": {
            "description": "Invalid or expired refresh token"
          }
        },
        "security": []
      }
    },
    "/api/auth/profile": {
      "get": {
        "summary": "Get Profile",
        "tags": [
          "Auth - Owner Login"
        ],
        "parameters": [
          {
            "name": "Accept-Language",
            "in": "header",
            "required": true,
            "example": "en",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Success",
            "content": {
              "application/json": {
                "example": {
                  "success": true,
                  "data": {
                    "id": "{{userId}}",
                    "firstName": "Max",
                    "lastName": "Mustermann",
                    "email": "operator@campsite.com",
                    "phone": "+49 89 123456",
                    "emailVerified": true,
                    "role": "operator",
                    "createdAt": "2026-01-01T00:00:00Z"
                  }
                }
              }
            }
          },
          "401": {
            "description": "Unauthorized"
          }
        },
        "security": [
          {
            "bearer": []
          }
        ]
      },
      "put": {
        "summary": "Update Profile",
        "tags": [
          "Auth - Owner Login"
        ],
        "parameters": [
          {
            "name": "Accept-Language",
            "in": "header",
            "required": true,
            "example": "en",
            "schema": {
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "multipart/form-data": {
              "schema": {
                "type": "object",
                "properties": {
                  "firstName": {
                    "type": "string",
                    "example": "Max"
                  },
                  "lastName": {
                    "type": "string",
                    "example": "Mustermann"
                  },
                  "profile": {
                    "type": "string",
                    "format": "binary"
                  }
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Success",
            "content": {
              "application/json": {
                "example": {
                  "success": true,
                  "data": {
                    "firstName": "Max",
                    "lastName": "Mustermann",
                    "updatedAt": "2026-04-15T12:00:00Z"
                  }
                }
              }
            }
          },
          "401": {
            "description": "Unauthorized"
          },
          "422": {
            "description": "Validation error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ValidationErrorResponse"
                }
              }
            }
          }
        },
        "security": [
          {
            "bearer": []
          }
        ]
      },
      "patch": {
        "summary": "Update Profile (partial)",
        "tags": [
          "Auth - Owner Login"
        ],
        "parameters": [
          {
            "name": "Accept-Language",
            "in": "header",
            "required": true,
            "example": "en",
            "schema": {
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "multipart/form-data": {
              "schema": {
                "type": "object",
                "properties": {
                  "firstName": {
                    "type": "string",
                    "example": "Max"
                  },
                  "lastName": {
                    "type": "string",
                    "example": "Mustermann"
                  },
                  "profile": {
                    "type": "string",
                    "format": "binary"
                  }
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Success",
            "content": {
              "application/json": {
                "example": {
                  "success": true,
                  "data": {
                    "firstName": "Max",
                    "lastName": "Mustermann",
                    "updatedAt": "2026-04-15T12:00:00Z"
                  }
                }
              }
            }
          },
          "401": {
            "description": "Unauthorized"
          },
          "422": {
            "description": "Validation error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ValidationErrorResponse"
                }
              }
            }
          }
        },
        "security": [
          {
            "bearer": []
          }
        ]
      }
    },
    "/api/auth/change-password": {
      "post": {
        "summary": "Change Password",
        "tags": [
          "Auth - Owner Login"
        ],
        "parameters": [
          {
            "name": "Accept-Language",
            "in": "header",
            "required": true,
            "example": "en",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "Content-Type",
            "in": "header",
            "required": true,
            "example": "application/json",
            "schema": {
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "required": [
                  "currentPassword",
                  "newPassword",
                  "confirmPassword"
                ],
                "properties": {
                  "currentPassword": {
                    "type": "string"
                  },
                  "newPassword": {
                    "type": "string"
                  },
                  "confirmPassword": {
                    "type": "string"
                  }
                }
              },
              "example": {
                "currentPassword": "Admin@123",
                "newPassword": "Admin@12345",
                "confirmPassword": "Admin@12345"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Success",
            "content": {
              "application/json": {
                "example": {
                  "success": true,
                  "data": null,
                  "message": "Password updated successfully."
                }
              }
            }
          },
          "400": {
            "description": "Validation failed"
          },
          "401": {
            "description": "Current password incorrect"
          }
        },
        "security": [
          {
            "bearer": []
          }
        ]
      }
    },
    "/api/auth/campsite/login": {
      "post": {
        "summary": "Campsite Login",
        "operationId": "campsiteLogin",
        "tags": [
          "Auth - Campsite Login"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "required": [
                  "username",
                  "password"
                ],
                "properties": {
                  "username": {
                    "type": "string",
                    "example": "alpine_hut_x7k2"
                  },
                  "password": {
                    "type": "string",
                    "example": "TempPass@1234"
                  }
                }
              },
              "example": {
                "username": "dss_yms9",
                "password": "Site@123"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Success",
            "content": {
              "application/json": {
                "example": {
                  "success": true,
                  "message": "Login successful",
                  "data": {
                    "campsite": {
                      "id": "664f...",
                      "name": "Alpine Hut",
                      "username": "alpine_hut_x7k2",
                      "coverImageUrl": "http://localhost:3000/public/media/campsites/covers/cover.jpg"
                    },
                    "owner": {
                      "id": "664f...",
                      "firstName": "John",
                      "lastName": "Doe",
                      "email": "john@example.com",
                      "mobile": "+4366012345678"
                    },
                    "tokens": {
                      "accessToken": "<jwt>",
                      "refreshToken": "<jwt>"
                    },
                    "requiresPasswordReset": true,
                    "passwordResetToken": "a1b2c3d4e5f6a1b2c3d4e5f6a1b2c3d4"
                  }
                }
              }
            }
          },
          "400": {
            "description": "Invalid credentials"
          },
          "403": {
            "description": "Campsite inactive"
          }
        },
        "security": []
      }
    },
    "/api/auth/campsite/tokens/refresh": {
      "post": {
        "summary": "Refresh Token (campsite)",
        "tags": [
          "Auth - Campsite Login"
        ],
        "parameters": [
          {
            "name": "Content-Type",
            "in": "header",
            "required": true,
            "example": "application/json",
            "schema": {
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "required": [
                  "refreshToken"
                ],
                "properties": {
                  "refreshToken": {
                    "type": "string"
                  }
                }
              },
              "example": {
                "refreshToken": "{{campsiteRefreshToken}}"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Success",
            "content": {
              "application/json": {
                "example": {
                  "success": true,
                  "data": {
                    "accessToken": "<jwt>",
                    "expiresIn": 3600,
                    "tokenType": "Bearer"
                  }
                }
              }
            }
          },
          "401": {
            "description": "Invalid or expired refresh token"
          }
        },
        "security": []
      }
    },
    "/api/auth/campsite/forgot-password": {
      "post": {
        "summary": "Campsite Forgot Password",
        "operationId": "campsiteForgotPassword",
        "tags": [
          "Auth - Campsite Login"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "required": [
                  "username"
                ],
                "properties": {
                  "username": {
                    "type": "string",
                    "example": "alpine_hut_x7k2"
                  }
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Success",
            "content": {
              "application/json": {
                "example": {
                  "success": true,
                  "message": "Password reset instructions sent",
                  "data": {
                    "success": true
                  }
                }
              }
            }
          }
        },
        "security": []
      }
    },
    "/api/auth/campsite/reset-password": {
      "post": {
        "summary": "Campsite Reset Password",
        "operationId": "campsiteResetPassword",
        "tags": [
          "Auth - Campsite Login"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "required": [
                  "token",
                  "newPassword"
                ],
                "properties": {
                  "token": {
                    "type": "string",
                    "example": "a1b2c3d4e5f6a1b2c3d4e5f6a1b2c3d4"
                  },
                  "newPassword": {
                    "type": "string",
                    "minLength": 6,
                    "example": "NewSecure@99"
                  }
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Success",
            "content": {
              "application/json": {
                "example": {
                  "success": true,
                  "message": "Password reset successful",
                  "data": {
                    "success": true
                  }
                }
              }
            }
          },
          "400": {
            "description": "Invalid or expired token"
          }
        },
        "security": []
      }
    },
    "/api/auth/campsite/forgot-username": {
      "post": {
        "summary": "Campsite Forgot Username",
        "operationId": "campsiteForgotUsername",
        "tags": [
          "Auth - Campsite Login"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "required": [
                  "email",
                  "campsite_name"
                ],
                "properties": {
                  "email": {
                    "type": "string",
                    "format": "email",
                    "example": "owner@example.com"
                  },
                  "campsite_name": {
                    "type": "string",
                    "example": "Alpine Hut"
                  }
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Success",
            "content": {
              "application/json": {
                "example": {
                  "success": true,
                  "message": "If an account matches, the username has been sent to the registered email",
                  "data": {
                    "success": true
                  }
                }
              }
            }
          }
        },
        "security": []
      }
    },
    "/admin/users": {
      "get": {
        "summary": "List Admin Users",
        "tags": [
          "Admin/Users"
        ],
        "parameters": [
          {
            "name": "Authorization",
            "in": "header",
            "required": true,
            "example": "Bearer {{adminToken}}",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "Accept-Language",
            "in": "header",
            "required": true,
            "example": "en",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "page",
            "in": "query",
            "schema": {
              "type": "integer",
              "default": 1
            },
            "example": 1
          },
          {
            "name": "limit",
            "in": "query",
            "schema": {
              "type": "integer",
              "default": 10
            },
            "example": 10
          },
          {
            "name": "search",
            "in": "query",
            "schema": {
              "type": "string"
            },
            "example": ""
          },
          {
            "name": "userType",
            "in": "query",
            "schema": {
              "type": "string"
            },
            "example": "admin"
          },
          {
            "name": "isActive",
            "in": "query",
            "schema": {
              "type": "string"
            },
            "example": "true"
          }
        ],
        "responses": {
          "200": {
            "description": "Success",
            "content": {
              "application/json": {
                "example": {
                  "success": true,
                  "message": "Success",
                  "data": {
                    "data": [
                      {
                        "id": "664f1a2b3c4d5e6f7a8b9c0d",
                        "firstName": "Admin",
                        "lastName": "User",
                        "email": "admin@campnow.com",
                        "userType": "admin",
                        "isDisabled": false,
                        "createdAt": "2026-01-01T00:00:00Z"
                      }
                    ],
                    "meta": {
                      "total": 1,
                      "totalPages": 1,
                      "currentPage": 1,
                      "perPage": 10,
                      "hasNextPage": false,
                      "hasPrevPage": false
                    }
                  }
                }
              }
            }
          },
          "401": {
            "description": "Unauthorized"
          }
        },
        "security": [
          {
            "bearer": []
          }
        ]
      },
      "post": {
        "summary": "Create Admin User",
        "tags": [
          "Admin/Users"
        ],
        "parameters": [
          {
            "name": "Authorization",
            "in": "header",
            "required": true,
            "example": "Bearer {{adminToken}}",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "Accept-Language",
            "in": "header",
            "required": true,
            "example": "en",
            "schema": {
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "multipart/form-data": {
              "schema": {
                "type": "object",
                "required": [
                  "email",
                  "firstName",
                  "lastName",
                  "userType"
                ],
                "properties": {
                  "firstName": {
                    "type": "string",
                    "example": "Anna"
                  },
                  "lastName": {
                    "type": "string",
                    "example": "Schmidt"
                  },
                  "email": {
                    "type": "string",
                    "example": "anna.schmidt@campnow.com"
                  },
                  "userType": {
                    "type": "string",
                    "enum": [
                      "admin",
                      "superAdmin"
                    ],
                    "example": "admin"
                  },
                  "profile": {
                    "type": "string",
                    "format": "binary"
                  }
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Success",
            "content": {
              "application/json": {
                "example": {
                  "success": true,
                  "message": "User created successfully",
                  "data": {
                    "id": "664f1a2b3c4d5e6f7a8b9c0d",
                    "firstName": "Admin",
                    "lastName": "User",
                    "email": "admin@campnow.com",
                    "userType": "admin",
                    "isDisabled": false,
                    "createdAt": "2026-01-01T00:00:00Z"
                  }
                }
              }
            }
          },
          "409": {
            "description": "Conflict"
          },
          "422": {
            "description": "Validation error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ValidationErrorResponse"
                }
              }
            }
          }
        },
        "security": [
          {
            "bearer": []
          }
        ]
      }
    },
    "/admin/users/{id}": {
      "get": {
        "summary": "Get Admin User",
        "tags": [
          "Admin/Users"
        ],
        "parameters": [
          {
            "name": "Authorization",
            "in": "header",
            "required": true,
            "example": "Bearer {{adminToken}}",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "Accept-Language",
            "in": "header",
            "required": true,
            "example": "en",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "id",
            "in": "path",
            "required": true,
            "example": "664f1a2b3c4d5e6f7a8b9c0d",
            "description": "User ID",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Success",
            "content": {
              "application/json": {
                "example": {
                  "success": true,
                  "message": "User retrieved successfully",
                  "data": {
                    "id": "664f1a2b3c4d5e6f7a8b9c0d",
                    "firstName": "Admin",
                    "lastName": "User",
                    "email": "admin@campnow.com",
                    "userType": "admin",
                    "isDisabled": false,
                    "createdAt": "2026-01-01T00:00:00Z"
                  }
                }
              }
            }
          },
          "401": {
            "description": "Unauthorized"
          },
          "404": {
            "description": "Not found"
          }
        },
        "security": [
          {
            "bearer": []
          }
        ]
      },
      "put": {
        "summary": "Update Admin User",
        "tags": [
          "Admin/Users"
        ],
        "parameters": [
          {
            "name": "Authorization",
            "in": "header",
            "required": true,
            "example": "Bearer {{adminToken}}",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "Accept-Language",
            "in": "header",
            "required": true,
            "example": "en",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "id",
            "in": "path",
            "required": true,
            "example": "664f1a2b3c4d5e6f7a8b9c0d",
            "description": "User ID",
            "schema": {
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "multipart/form-data": {
              "schema": {
                "type": "object",
                "properties": {
                  "firstName": {
                    "type": "string"
                  },
                  "lastName": {
                    "type": "string"
                  },
                  "email": {
                    "type": "string"
                  },
                  "userType": {
                    "type": "string"
                  },
                  "profile": {
                    "type": "string",
                    "format": "binary"
                  }
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Success",
            "content": {
              "application/json": {
                "example": {
                  "success": true,
                  "message": "User updated successfully",
                  "data": {
                    "id": "664f1a2b3c4d5e6f7a8b9c0d",
                    "firstName": "Admin",
                    "lastName": "User",
                    "email": "admin@campnow.com",
                    "userType": "admin",
                    "isDisabled": false,
                    "createdAt": "2026-01-01T00:00:00Z"
                  }
                }
              }
            }
          },
          "401": {
            "description": "Unauthorized"
          },
          "404": {
            "description": "Not found"
          },
          "422": {
            "description": "Validation error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ValidationErrorResponse"
                }
              }
            }
          }
        },
        "security": [
          {
            "bearer": []
          }
        ]
      },
      "delete": {
        "summary": "Delete Admin User",
        "tags": [
          "Admin/Users"
        ],
        "parameters": [
          {
            "name": "Authorization",
            "in": "header",
            "required": true,
            "example": "Bearer {{adminToken}}",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "Accept-Language",
            "in": "header",
            "required": true,
            "example": "en",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "id",
            "in": "path",
            "required": true,
            "example": "664f1a2b3c4d5e6f7a8b9c0d",
            "description": "User ID",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Success",
            "content": {
              "application/json": {
                "example": {
                  "success": true,
                  "message": "User deleted successfully",
                  "data": {
                    "deletedId": "664f1a2b3c4d5e6f7a8b9c0d"
                  }
                }
              }
            }
          },
          "401": {
            "description": "Unauthorized"
          },
          "404": {
            "description": "Not found"
          }
        },
        "security": [
          {
            "bearer": []
          }
        ]
      }
    },
    "/admin/users/{id}/status": {
      "patch": {
        "summary": "Toggle Admin User Status",
        "tags": [
          "Admin/Users"
        ],
        "parameters": [
          {
            "name": "Authorization",
            "in": "header",
            "required": true,
            "example": "Bearer {{adminToken}}",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "Accept-Language",
            "in": "header",
            "required": true,
            "example": "en",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "Content-Type",
            "in": "header",
            "required": true,
            "example": "application/json",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "id",
            "in": "path",
            "required": true,
            "example": "664f1a2b3c4d5e6f7a8b9c0d",
            "description": "User ID",
            "schema": {
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "required": [
                  "isDisabled"
                ],
                "properties": {
                  "isDisabled": {
                    "type": "boolean"
                  }
                }
              },
              "example": {
                "isDisabled": true
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Success",
            "content": {
              "application/json": {
                "example": {
                  "success": true,
                  "message": "User status updated",
                  "data": {
                    "id": "664f1a2b3c4d5e6f7a8b9c0d",
                    "firstName": "Admin",
                    "lastName": "User",
                    "email": "admin@campnow.com",
                    "userType": "admin",
                    "isDisabled": true,
                    "createdAt": "2026-01-01T00:00:00Z"
                  }
                }
              }
            }
          },
          "401": {
            "description": "Unauthorized"
          },
          "404": {
            "description": "Not found"
          }
        },
        "security": [
          {
            "bearer": []
          }
        ]
      }
    },
    "/admin/dashboard/stats": {
      "get": {
        "summary": "Dashboard Stats",
        "tags": [
          "Admin/Dashboard"
        ],
        "parameters": [
          {
            "name": "Authorization",
            "in": "header",
            "required": true,
            "example": "Bearer {{adminToken}}",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "Accept-Language",
            "in": "header",
            "required": true,
            "example": "en",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "period",
            "in": "query",
            "description": "Number of days (default 30)",
            "schema": {
              "type": "integer",
              "default": 30
            },
            "example": 30
          }
        ],
        "responses": {
          "200": {
            "description": "Success",
            "content": {
              "application/json": {
                "example": {
                  "success": true,
                  "message": "Stats retrieved",
                  "data": {
                    "period": 30,
                    "totalCampsiteOwners": 120,
                    "newCampsiteOwners": 5,
                    "totalCampsites": 98,
                    "activeCampsites": 72,
                    "totalSuperCategories": 10,
                    "recentActivities": []
                  }
                }
              }
            }
          },
          "401": {
            "description": "Unauthorized"
          }
        },
        "security": [
          {
            "bearer": []
          }
        ]
      }
    },
    "/admin/dashboard/quick-stats": {
      "get": {
        "summary": "Quick Stats",
        "tags": [
          "Admin/Dashboard"
        ],
        "parameters": [
          {
            "name": "Authorization",
            "in": "header",
            "required": true,
            "example": "Bearer {{adminToken}}",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "Accept-Language",
            "in": "header",
            "required": true,
            "example": "en",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Success",
            "content": {
              "application/json": {
                "example": {
                  "success": true,
                  "message": "Quick stats retrieved",
                  "data": {
                    "totalCampsiteOwners": 120,
                    "newOwnersThisWeek": 3,
                    "totalCampsites": 98,
                    "activeCampsites": 72,
                    "totalFaqs": 45,
                    "totalCmsPages": 8,
                    "totalSuperCategories": 10
                  }
                }
              }
            }
          },
          "401": {
            "description": "Unauthorized"
          }
        },
        "security": [
          {
            "bearer": []
          }
        ]
      }
    },
    "/admin/dashboard/recent-activities": {
      "get": {
        "summary": "Recent Activities",
        "tags": [
          "Admin/Dashboard"
        ],
        "parameters": [
          {
            "name": "Authorization",
            "in": "header",
            "required": true,
            "example": "Bearer {{adminToken}}",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "Accept-Language",
            "in": "header",
            "required": true,
            "example": "en",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "limit",
            "in": "query",
            "schema": {
              "type": "integer",
              "default": 20
            },
            "example": 20
          },
          {
            "name": "type",
            "in": "query",
            "description": "Filter by type: owner | campsite | faq | cms",
            "schema": {
              "type": "string"
            },
            "example": ""
          }
        ],
        "responses": {
          "200": {
            "description": "Success",
            "content": {
              "application/json": {
                "example": {
                  "success": true,
                  "message": "Activities retrieved",
                  "data": [
                    {
                      "type": "owner",
                      "action": "created",
                      "title": "New owner registered",
                      "description": "Hans Müller joined as campsite owner",
                      "timestamp": "2026-04-30T10:00:00Z"
                    }
                  ]
                }
              }
            }
          },
          "401": {
            "description": "Unauthorized"
          }
        },
        "security": [
          {
            "bearer": []
          }
        ]
      }
    },
    "/admin/dashboard/analytics": {
      "get": {
        "summary": "Analytics",
        "tags": [
          "Admin/Dashboard"
        ],
        "parameters": [
          {
            "name": "Authorization",
            "in": "header",
            "required": true,
            "example": "Bearer {{adminToken}}",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "Accept-Language",
            "in": "header",
            "required": true,
            "example": "en",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "days",
            "in": "query",
            "schema": {
              "type": "integer",
              "default": 30
            },
            "example": 30
          }
        ],
        "responses": {
          "200": {
            "description": "Success",
            "content": {
              "application/json": {
                "example": {
                  "success": true,
                  "message": "Analytics retrieved",
                  "data": {
                    "period": 30,
                    "ownerGrowth": [
                      {
                        "date": "2026-04-01",
                        "count": 3
                      }
                    ],
                    "campsiteGrowth": [
                      {
                        "date": "2026-04-01",
                        "count": 2
                      }
                    ]
                  }
                }
              }
            }
          },
          "401": {
            "description": "Unauthorized"
          }
        },
        "security": [
          {
            "bearer": []
          }
        ]
      }
    },
    "/admin/super-categories": {
      "get": {
        "summary": "List Super Categories",
        "tags": [
          "Admin/Super Categories"
        ],
        "parameters": [
          {
            "name": "page",
            "in": "query",
            "schema": {
              "type": "integer",
              "default": 1
            },
            "example": 1
          },
          {
            "name": "limit",
            "in": "query",
            "schema": {
              "type": "integer",
              "default": 50
            },
            "example": 50
          },
          {
            "name": "search",
            "in": "query",
            "schema": {
              "type": "string"
            },
            "example": ""
          }
        ],
        "responses": {
          "200": {
            "description": "Success",
            "content": {
              "application/json": {
                "example": {
                  "success": true,
                  "message": "Success",
                  "data": {
                    "data": [
                      {
                        "id": "664f1a2b3c4d5e6f7a8b9c0d",
                        "name_en": "Tent",
                        "name_de": "Zelt",
                        "icon": "tent.svg",
                        "order": 1,
                        "createdAt": "2024-05-01T10:00:00Z",
                        "updatedAt": "2024-05-01T10:00:00Z"
                      }
                    ],
                    "meta": {
                      "total": 1,
                      "totalPages": 1,
                      "currentPage": 1,
                      "perPage": 10,
                      "hasNextPage": false,
                      "hasPrevPage": false
                    }
                  }
                }
              }
            }
          },
          "401": {
            "description": "Unauthorized"
          }
        },
        "security": [
          {
            "bearer": []
          }
        ]
      },
      "post": {
        "summary": "Create Super Category",
        "tags": [
          "Admin/Super Categories"
        ],
        "parameters": [
          {
            "name": "Content-Type",
            "in": "header",
            "example": "multipart/form-data",
            "schema": {
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "multipart/form-data": {
              "schema": {
                "type": "object",
                "required": [
                  "name_en",
                  "name_de"
                ],
                "properties": {
                  "name_en": {
                    "type": "string",
                    "example": "Tent"
                  },
                  "name_de": {
                    "type": "string",
                    "example": "Zelt"
                  },
                  "order": {
                    "type": "integer",
                    "example": 1
                  },
                  "icon": {
                    "type": "string",
                    "format": "binary"
                  }
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Success",
            "content": {
              "application/json": {
                "example": {
                  "success": true,
                  "message": "Super category created successfully",
                  "data": {
                    "id": "664f1a2b3c4d5e6f7a8b9c0d",
                    "name_en": "Tent",
                    "name_de": "Zelt",
                    "icon": "tent.svg",
                    "order": 1,
                    "createdAt": "2024-05-01T10:00:00Z",
                    "updatedAt": "2024-05-01T10:00:00Z"
                  }
                }
              }
            }
          },
          "401": {
            "description": "Unauthorized"
          },
          "422": {
            "description": "Validation error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ValidationErrorResponse"
                }
              }
            }
          }
        },
        "security": [
          {
            "bearer": []
          }
        ]
      }
    },
    "/admin/super-categories/reorder": {
      "patch": {
        "summary": "Bulk Reorder Super Categories",
        "tags": [
          "Admin/Super Categories"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "required": [
                  "orderedIds"
                ],
                "properties": {
                  "orderedIds": {
                    "type": "array",
                    "items": {
                      "type": "string"
                    },
                    "minItems": 1
                  }
                }
              },
              "example": {
                "orderedIds": [
                  "69e2127a9aaf8b56d297eb9a",
                  "69e212a29aaf8b56d297eba1"
                ]
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Success",
            "content": {
              "application/json": {
                "example": {
                  "success": true,
                  "message": "Super categories reordered successfully",
                  "data": {
                    "updated": 2
                  }
                }
              }
            }
          },
          "401": {
            "description": "Unauthorized"
          },
          "422": {
            "description": "Validation error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ValidationErrorResponse"
                }
              }
            }
          }
        },
        "security": [
          {
            "bearer": []
          }
        ]
      }
    },
    "/admin/super-categories/{id}": {
      "get": {
        "summary": "Get Super Category",
        "tags": [
          "Admin/Super Categories"
        ],
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "example": "664f1a2b3c4d5e6f7a8b9c0d",
            "description": "Super category ID",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Success",
            "content": {
              "application/json": {
                "example": {
                  "success": true,
                  "message": "Super category retrieved successfully",
                  "data": {
                    "id": "664f1a2b3c4d5e6f7a8b9c0d",
                    "name_en": "Tent",
                    "name_de": "Zelt",
                    "icon": "tent.svg",
                    "order": 1,
                    "createdAt": "2024-05-01T10:00:00Z",
                    "updatedAt": "2024-05-01T10:00:00Z"
                  }
                }
              }
            }
          },
          "401": {
            "description": "Unauthorized"
          },
          "404": {
            "description": "Not found"
          }
        },
        "security": [
          {
            "bearer": []
          }
        ]
      },
      "patch": {
        "summary": "Update Super Category",
        "tags": [
          "Admin/Super Categories"
        ],
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "example": "664f1a2b3c4d5e6f7a8b9c0d",
            "description": "Super category ID",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "Content-Type",
            "in": "header",
            "example": "multipart/form-data",
            "schema": {
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "multipart/form-data": {
              "schema": {
                "type": "object",
                "properties": {
                  "name_en": {
                    "type": "string"
                  },
                  "name_de": {
                    "type": "string"
                  },
                  "order": {
                    "type": "string",
                    "example": "1"
                  },
                  "icon": {
                    "type": "string",
                    "format": "binary"
                  }
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Success",
            "content": {
              "application/json": {
                "example": {
                  "success": true,
                  "message": "Super category updated successfully",
                  "data": {
                    "id": "664f1a2b3c4d5e6f7a8b9c0d",
                    "name_en": "Tent",
                    "name_de": "Zelt",
                    "icon": "tent.svg",
                    "order": 1,
                    "createdAt": "2024-05-01T10:00:00Z",
                    "updatedAt": "2024-05-01T10:00:00Z"
                  }
                }
              }
            }
          },
          "401": {
            "description": "Unauthorized"
          },
          "404": {
            "description": "Not found"
          },
          "422": {
            "description": "Validation error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ValidationErrorResponse"
                }
              }
            }
          }
        },
        "security": [
          {
            "bearer": []
          }
        ]
      },
      "delete": {
        "summary": "Delete Super Category (hard delete)",
        "tags": [
          "Admin/Super Categories"
        ],
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "example": "664f1a2b3c4d5e6f7a8b9c0d",
            "description": "Super category ID",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Success",
            "content": {
              "application/json": {
                "example": {
                  "success": true,
                  "message": "Super category deleted successfully",
                  "data": {
                    "deletedId": "664f..."
                  }
                }
              }
            }
          },
          "401": {
            "description": "Unauthorized"
          },
          "404": {
            "description": "Not found"
          },
          "409": {
            "description": "Linked campsite categories exist - cannot delete",
            "content": {
              "application/json": {
                "example": {
                  "success": false,
                  "message": "This super category is assigned to one or more campsite categories and cannot be deleted"
                }
              }
            }
          }
        },
        "security": [
          {
            "bearer": []
          }
        ]
      }
    },
    "/admin/super-categories/{id}/affected-categories": {
      "get": {
        "summary": "Get Count of Linked Campsite Categories",
        "description": "Call before DELETE to show the mandatory warning dialog.",
        "tags": [
          "Admin/Super Categories"
        ],
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "example": "664f1a2b3c4d5e6f7a8b9c0d",
            "description": "Super category ID",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Success",
            "content": {
              "application/json": {
                "example": {
                  "success": true,
                  "message": "Affected categories retrieved successfully",
                  "data": {
                    "superCategoryId": "664f...",
                    "name_en": "Tent",
                    "name_de": "Zelt",
                    "affectedCount": 3
                  }
                }
              }
            }
          },
          "401": {
            "description": "Unauthorized"
          },
          "404": {
            "description": "Not found"
          }
        },
        "security": [
          {
            "bearer": []
          }
        ]
      }
    },
    "/admin/faq": {
      "get": {
        "summary": "List FAQs",
        "tags": [
          "Admin/FAQs"
        ],
        "parameters": [
          {
            "name": "page",
            "in": "query",
            "schema": {
              "type": "string"
            },
            "example": "1"
          },
          {
            "name": "limit",
            "in": "query",
            "schema": {
              "type": "string"
            },
            "example": "50"
          },
          {
            "name": "audience",
            "in": "query",
            "description": "general | campingSpotOwners",
            "schema": {
              "type": "string"
            },
            "example": "general"
          },
          {
            "name": "search",
            "in": "query",
            "schema": {
              "type": "string"
            },
            "example": ""
          }
        ],
        "responses": {
          "200": {
            "description": "Success",
            "content": {
              "application/json": {
                "example": {
                  "success": true,
                  "message": "Success",
                  "data": {
                    "data": [
                      {
                        "id": "69e2079af3d5a84ff0add1b0",
                        "audience": "general",
                        "question_en": "How do I book?",
                        "question_de": "Wie buche ich?",
                        "answer_en": "Click the Book button.",
                        "answer_de": "Klicken Sie auf Buchen.",
                        "order": 1,
                        "campsiteId": null,
                        "isActive": true,
                        "createdAt": "2026-04-17T10:12:42.859Z",
                        "updatedAt": "2026-04-17T10:12:42.859Z"
                      }
                    ],
                    "meta": {
                      "total": 1,
                      "totalPages": 1,
                      "currentPage": 1,
                      "perPage": 10,
                      "hasNextPage": false,
                      "hasPrevPage": false
                    }
                  }
                }
              }
            }
          },
          "401": {
            "description": "Unauthorized"
          }
        },
        "security": [
          {
            "bearer": []
          }
        ]
      },
      "post": {
        "summary": "Create FAQ",
        "tags": [
          "Admin/FAQs"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "required": [
                  "audience",
                  "question_en",
                  "answer_en"
                ],
                "properties": {
                  "audience": {
                    "type": "string",
                    "enum": [
                      "general",
                      "campingSpotOwners"
                    ],
                    "example": "general"
                  },
                  "question_en": {
                    "type": "string"
                  },
                  "question_de": {
                    "type": "string"
                  },
                  "answer_en": {
                    "type": "string"
                  },
                  "answer_de": {
                    "type": "string"
                  },
                  "order": {
                    "type": "integer",
                    "example": 1
                  }
                }
              },
              "example": {
                "audience": "general",
                "question_en": "How do I book?",
                "question_de": "Wie buche ich?",
                "answer_en": "Click the Book button.",
                "answer_de": "Klicken Sie auf Buchen.",
                "order": 1
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Success",
            "content": {
              "application/json": {
                "example": {
                  "success": true,
                  "message": "FAQ created successfully",
                  "data": {
                    "id": "69e2079af3d5a84ff0add1b0",
                    "audience": "general",
                    "question_en": "How do I book?",
                    "question_de": "Wie buche ich?",
                    "answer_en": "Click the Book button.",
                    "answer_de": "Klicken Sie auf Buchen.",
                    "order": 1,
                    "campsiteId": null,
                    "isActive": true,
                    "createdAt": "2026-04-17T10:12:42.859Z",
                    "updatedAt": "2026-04-17T10:12:42.859Z"
                  }
                }
              }
            }
          },
          "422": {
            "description": "Validation error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ValidationErrorResponse"
                }
              }
            }
          }
        },
        "security": [
          {
            "bearer": []
          }
        ]
      }
    },
    "/admin/faq/{id}": {
      "get": {
        "summary": "Get Single FAQ",
        "tags": [
          "Admin/FAQs"
        ],
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "example": "664f1a2b3c4d5e6f7a8b9c0d",
            "description": "FAQ ID",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Success",
            "content": {
              "application/json": {
                "example": {
                  "success": true,
                  "message": "FAQ retrieved successfully",
                  "data": {
                    "id": "69e2079af3d5a84ff0add1b0",
                    "audience": "general",
                    "question_en": "How do I book?",
                    "question_de": "Wie buche ich?",
                    "answer_en": "Click the Book button.",
                    "answer_de": "Klicken Sie auf Buchen.",
                    "order": 1,
                    "campsiteId": null,
                    "isActive": true,
                    "createdAt": "2026-04-17T10:12:42.859Z",
                    "updatedAt": "2026-04-17T10:12:42.859Z"
                  }
                }
              }
            }
          },
          "404": {
            "description": "Not found"
          }
        },
        "security": [
          {
            "bearer": []
          }
        ]
      },
      "patch": {
        "summary": "Update FAQ (partial)",
        "tags": [
          "Admin/FAQs"
        ],
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "example": "664f1a2b3c4d5e6f7a8b9c0d",
            "description": "FAQ ID",
            "schema": {
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "example": {
                "question_en": "Updated question",
                "answer_en": "Updated answer"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Success",
            "content": {
              "application/json": {
                "example": {
                  "success": true,
                  "message": "FAQ updated successfully",
                  "data": {
                    "id": "69e2079af3d5a84ff0add1b0",
                    "audience": "general",
                    "question_en": "How do I book?",
                    "question_de": "Wie buche ich?",
                    "answer_en": "Click the Book button.",
                    "answer_de": "Klicken Sie auf Buchen.",
                    "order": 1,
                    "campsiteId": null,
                    "isActive": true,
                    "createdAt": "2026-04-17T10:12:42.859Z",
                    "updatedAt": "2026-04-17T10:12:42.859Z"
                  }
                }
              }
            }
          },
          "404": {
            "description": "Not found"
          },
          "422": {
            "description": "Validation error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ValidationErrorResponse"
                }
              }
            }
          }
        },
        "security": [
          {
            "bearer": []
          }
        ]
      },
      "delete": {
        "summary": "Delete FAQ",
        "tags": [
          "Admin/FAQs"
        ],
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "example": "664f1a2b3c4d5e6f7a8b9c0d",
            "description": "FAQ ID",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Success",
            "content": {
              "application/json": {
                "example": {
                  "success": true,
                  "message": "FAQ deleted successfully",
                  "data": {
                    "deletedId": "69e2079af3d5a84ff0add1b0"
                  }
                }
              }
            }
          },
          "404": {
            "description": "Not found"
          }
        },
        "security": [
          {
            "bearer": []
          }
        ]
      }
    },
    "/admin/faq/{id}/toggle-status": {
      "patch": {
        "summary": "Toggle FAQ Status",
        "tags": [
          "Admin/FAQs"
        ],
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "example": "664f1a2b3c4d5e6f7a8b9c0d",
            "description": "FAQ ID",
            "schema": {
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "example": {}
            }
          }
        },
        "responses": {
          "200": {
            "description": "Success",
            "content": {
              "application/json": {
                "example": {
                  "success": true,
                  "message": "FAQ deactivated successfully",
                  "data": {
                    "id": "69e2079af3d5a84ff0add1b0",
                    "audience": "general",
                    "question_en": "How do I book?",
                    "question_de": "Wie buche ich?",
                    "answer_en": "Click the Book button.",
                    "answer_de": "Klicken Sie auf Buchen.",
                    "order": 1,
                    "campsiteId": null,
                    "isActive": false,
                    "createdAt": "2026-04-17T10:12:42.859Z",
                    "updatedAt": "2026-04-17T10:12:42.859Z"
                  }
                }
              }
            }
          },
          "404": {
            "description": "Not found"
          }
        },
        "security": [
          {
            "bearer": []
          }
        ]
      }
    },
    "/admin/cms": {
      "get": {
        "summary": "List All CMS Pages",
        "tags": [
          "Admin/CMS"
        ],
        "responses": {
          "200": {
            "description": "Success",
            "content": {
              "application/json": {
                "example": {
                  "success": true,
                  "message": "CMS pages retrieved successfully",
                  "data": []
                }
              }
            }
          },
          "401": {
            "description": "Unauthorized"
          }
        },
        "security": [
          {
            "bearer": []
          }
        ]
      }
    },
    "/admin/cms/{id}": {
      "get": {
        "summary": "Get CMS Page",
        "tags": [
          "Admin/CMS"
        ],
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "example": "664f1a2b3c4d5e6f7a8b9c0d",
            "description": "CMS page ID",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Success",
            "content": {
              "application/json": {
                "example": {
                  "success": true,
                  "data": {
                    "id": "69e1d91b2a52c4ef44b3154e",
                    "slug": "imprint",
                    "title_en": "Imprint",
                    "title_de": "Impressum",
                    "content_en": "<p>English content</p>",
                    "content_de": "<p>Deutsches Inhalt</p>",
                    "isActive": true
                  }
                }
              }
            }
          },
          "404": {
            "description": "Not found"
          }
        },
        "security": [
          {
            "bearer": []
          }
        ]
      },
      "put": {
        "summary": "Update CMS Page",
        "tags": [
          "Admin/CMS"
        ],
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "example": "664f1a2b3c4d5e6f7a8b9c0d",
            "description": "CMS page ID",
            "schema": {
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "example": {
                "title_en": "Imprint",
                "title_de": "Impressum",
                "content_en": "<p>English content</p>",
                "content_de": "<p>Deutsches Inhalt</p>",
                "isActive": true
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Success",
            "content": {
              "application/json": {
                "example": {
                  "success": true,
                  "message": "CMS page updated",
                  "data": {}
                }
              }
            }
          },
          "404": {
            "description": "Not found"
          },
          "422": {
            "description": "Validation error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ValidationErrorResponse"
                }
              }
            }
          }
        },
        "security": [
          {
            "bearer": []
          }
        ]
      },
      "delete": {
        "summary": "Delete CMS Page",
        "tags": [
          "Admin/CMS"
        ],
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "example": "664f1a2b3c4d5e6f7a8b9c0d",
            "description": "CMS page ID",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Success",
            "content": {
              "application/json": {
                "example": {
                  "success": true,
                  "message": "CMS page deleted successfully",
                  "data": {
                    "deletedId": "69e1d91b2a52c4ef44b3154e"
                  }
                }
              }
            }
          },
          "404": {
            "description": "Not found"
          }
        },
        "security": [
          {
            "bearer": []
          }
        ]
      }
    },
    "/admin/campsite-owners": {
      "get": {
        "summary": "List Campsite Owners",
        "tags": [
          "Admin/Campsite Owners"
        ],
        "parameters": [
          {
            "name": "Authorization",
            "in": "header",
            "required": true,
            "example": "Bearer {{adminToken}}",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "Accept-Language",
            "in": "header",
            "required": true,
            "example": "en",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "page",
            "in": "query",
            "required": true,
            "example": "1",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "limit",
            "in": "query",
            "required": true,
            "example": "10",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "search",
            "in": "query",
            "required": true,
            "example": "",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Success",
            "content": {
              "application/json": {
                "example": {
                  "success": true,
                  "message": "Success",
                  "data": {
                    "data": [
                      {
                        "id": "664f1a2b3c4d5e6f7a8b9c0e",
                        "firstName": "Hans",
                        "lastName": "Müller",
                        "email": "hans.mueller@example.com",
                        "mobile": "+4915112345678",
                        "isDisabled": false,
                        "createdAt": "2026-01-01T00:00:00Z"
                      }
                    ],
                    "meta": {
                      "total": 1,
                      "totalPages": 1,
                      "currentPage": 1,
                      "perPage": 10,
                      "hasNextPage": false,
                      "hasPrevPage": false
                    }
                  }
                }
              }
            }
          },
          "401": {
            "description": "Unauthorized"
          }
        },
        "security": [
          {
            "bearer": []
          }
        ]
      },
      "post": {
        "summary": "Create Campsite Owner",
        "description": "Creates owner and sends welcome email with temporary password.",
        "tags": [
          "Admin/Campsite Owners"
        ],
        "parameters": [
          {
            "name": "Authorization",
            "in": "header",
            "required": true,
            "example": "Bearer {{adminToken}}",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "Accept-Language",
            "in": "header",
            "required": true,
            "example": "en",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "Content-Type",
            "in": "header",
            "required": true,
            "example": "application/json",
            "schema": {
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "required": [
                  "firstName",
                  "lastName",
                  "email"
                ],
                "properties": {
                  "firstName": {
                    "type": "string"
                  },
                  "lastName": {
                    "type": "string"
                  },
                  "email": {
                    "type": "string"
                  },
                  "mobile": {
                    "type": "string"
                  }
                }
              },
              "example": {
                "firstName": "Hans",
                "lastName": "Müller",
                "email": "hans.mueller@example.com",
                "mobile": "+4915112345678"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Success",
            "content": {
              "application/json": {
                "example": {
                  "success": true,
                  "message": "Owner created successfully",
                  "data": {
                    "id": "664f1a2b3c4d5e6f7a8b9c0e",
                    "firstName": "Hans",
                    "lastName": "Müller",
                    "email": "hans.mueller@example.com",
                    "mobile": "+4915112345678",
                    "isDisabled": false,
                    "createdAt": "2026-01-01T00:00:00Z"
                  }
                }
              }
            }
          },
          "409": {
            "description": "Conflict"
          },
          "422": {
            "description": "Validation error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ValidationErrorResponse"
                }
              }
            }
          }
        },
        "security": [
          {
            "bearer": []
          }
        ]
      }
    },
    "/admin/campsite-owners/{id}": {
      "get": {
        "summary": "Get Campsite Owner",
        "tags": [
          "Admin/Campsite Owners"
        ],
        "parameters": [
          {
            "name": "Authorization",
            "in": "header",
            "required": true,
            "example": "Bearer {{adminToken}}",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "Accept-Language",
            "in": "header",
            "required": true,
            "example": "en",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "id",
            "in": "path",
            "required": true,
            "example": "664f1a2b3c4d5e6f7a8b9c0d",
            "description": "Owner ID",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Success",
            "content": {
              "application/json": {
                "example": {
                  "success": true,
                  "message": "Owner retrieved successfully",
                  "data": {
                    "id": "664f1a2b3c4d5e6f7a8b9c0e",
                    "firstName": "Hans",
                    "lastName": "Müller",
                    "email": "hans.mueller@example.com",
                    "mobile": "+4915112345678",
                    "isDisabled": false,
                    "createdAt": "2026-01-01T00:00:00Z"
                  }
                }
              }
            }
          },
          "401": {
            "description": "Unauthorized"
          },
          "404": {
            "description": "Not found"
          }
        },
        "security": [
          {
            "bearer": []
          }
        ]
      },
      "put": {
        "summary": "Update Campsite Owner",
        "tags": [
          "Admin/Campsite Owners"
        ],
        "parameters": [
          {
            "name": "Authorization",
            "in": "header",
            "required": true,
            "example": "Bearer {{adminToken}}",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "Accept-Language",
            "in": "header",
            "required": true,
            "example": "en",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "Content-Type",
            "in": "header",
            "required": true,
            "example": "application/json",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "id",
            "in": "path",
            "required": true,
            "example": "664f1a2b3c4d5e6f7a8b9c0d",
            "description": "Owner ID",
            "schema": {
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "firstName": {
                    "type": "string"
                  },
                  "lastName": {
                    "type": "string"
                  },
                  "email": {
                    "type": "string"
                  },
                  "mobile": {
                    "type": "string"
                  }
                }
              },
              "example": {
                "firstName": "Hans",
                "lastName": "Schmidt"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Success",
            "content": {
              "application/json": {
                "example": {
                  "success": true,
                  "message": "Owner updated successfully",
                  "data": {
                    "id": "664f1a2b3c4d5e6f7a8b9c0e",
                    "firstName": "Hans",
                    "lastName": "Müller",
                    "email": "hans.mueller@example.com",
                    "mobile": "+4915112345678",
                    "isDisabled": false,
                    "createdAt": "2026-01-01T00:00:00Z"
                  }
                }
              }
            }
          },
          "401": {
            "description": "Unauthorized"
          },
          "404": {
            "description": "Not found"
          },
          "422": {
            "description": "Validation error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ValidationErrorResponse"
                }
              }
            }
          }
        },
        "security": [
          {
            "bearer": []
          }
        ]
      },
      "delete": {
        "summary": "Delete Campsite Owner",
        "tags": [
          "Admin/Campsite Owners"
        ],
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "example": "664f1a2b3c4d5e6f7a8b9c0d",
            "description": "Owner ID",
            "schema": {
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "example": {
                "confirmed": true
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Success",
            "content": {
              "application/json": {
                "example": {
                  "success": true,
                  "message": "Campsite owner deleted successfully",
                  "data": {
                    "deletedId": "664f1a2b3c4d5e6f7a8b9c0d"
                  }
                }
              }
            }
          },
          "404": {
            "description": "Not found"
          }
        },
        "security": [
          {
            "bearer": []
          }
        ]
      }
    },
    "/admin/campsite-owners/{id}/status": {
      "patch": {
        "summary": "Toggle Campsite Owner Status",
        "description": "isDisabled: true = disable, false = enable",
        "tags": [
          "Admin/Campsite Owners"
        ],
        "parameters": [
          {
            "name": "Authorization",
            "in": "header",
            "required": true,
            "example": "Bearer {{adminToken}}",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "Accept-Language",
            "in": "header",
            "required": true,
            "example": "en",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "Content-Type",
            "in": "header",
            "required": true,
            "example": "application/json",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "id",
            "in": "path",
            "required": true,
            "example": "664f1a2b3c4d5e6f7a8b9c0d",
            "description": "Owner ID",
            "schema": {
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "required": [
                  "isDisabled"
                ],
                "properties": {
                  "isDisabled": {
                    "type": "boolean"
                  }
                }
              },
              "example": {
                "isDisabled": true
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Success",
            "content": {
              "application/json": {
                "example": {
                  "success": true,
                  "message": "Owner status updated",
                  "data": {
                    "id": "664f1a2b3c4d5e6f7a8b9c0e",
                    "firstName": "Hans",
                    "lastName": "Müller",
                    "email": "hans.mueller@example.com",
                    "mobile": "+4915112345678",
                    "isDisabled": true,
                    "createdAt": "2026-01-01T00:00:00Z"
                  }
                }
              }
            }
          },
          "401": {
            "description": "Unauthorized"
          },
          "404": {
            "description": "Not found"
          }
        },
        "security": [
          {
            "bearer": []
          }
        ]
      }
    },
    "/admin/campsites": {
      "get": {
        "summary": "List Campsites",
        "tags": [
          "Admin/Campsites"
        ],
        "parameters": [
          {
            "name": "Authorization",
            "in": "header",
            "required": true,
            "example": "Bearer {{adminToken}}",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "Accept-Language",
            "in": "header",
            "required": true,
            "example": "en",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "page",
            "in": "query",
            "required": true,
            "example": "1",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "limit",
            "in": "query",
            "required": true,
            "example": "10",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "search",
            "in": "query",
            "required": true,
            "example": "",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "isActive",
            "in": "query",
            "description": "true | false (omit for all)",
            "example": "true",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "userId",
            "in": "query",
            "description": "Filter by owner userId",
            "example": "",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Success",
            "content": {
              "application/json": {
                "example": {
                  "success": true,
                  "message": "Success",
                  "data": {
                    "data": [
                      {
                        "id": "664f...",
                        "name": "Alpine Hut",
                        "isActive": true,
                        "owner": {
                          "id": "664f...",
                          "firstName": "John",
                          "lastName": "Doe",
                          "email": "john@example.com"
                        }
                      }
                    ],
                    "meta": {
                      "total": 1,
                      "totalPages": 1,
                      "currentPage": 1,
                      "perPage": 10,
                      "hasNextPage": false,
                      "hasPrevPage": false
                    }
                  }
                }
              }
            }
          },
          "401": {
            "description": "Unauthorized"
          }
        },
        "security": [
          {
            "bearer": []
          }
        ]
      },
      "post": {
        "summary": "Create Campsite",
        "description": "multipart/form-data required. First campsite for an owner auto-activates their account.",
        "tags": [
          "Admin/Campsites"
        ],
        "parameters": [
          {
            "name": "Authorization",
            "in": "header",
            "required": true,
            "example": "Bearer {{adminToken}}",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "Accept-Language",
            "in": "header",
            "required": true,
            "example": "en",
            "schema": {
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "multipart/form-data": {
              "schema": {
                "type": "object",
                "required": [
                  "userId",
                  "name"
                ],
                "properties": {
                  "userId": {
                    "type": "string",
                    "example": "{{ownerId}}"
                  },
                  "name": {
                    "type": "string",
                    "example": "Campingplatz am See"
                  },
                  "email": {
                    "type": "string",
                    "example": "info@campingplatzsee.de"
                  },
                  "description": {
                    "type": "string",
                    "example": "A beautiful lakeside campsite."
                  },
                  "location[latitude]": {
                    "type": "string",
                    "example": "48.137154"
                  },
                  "location[longitude]": {
                    "type": "string",
                    "example": "11.576124"
                  },
                  "location[address]": {
                    "type": "string",
                    "example": "Seestraße 12, 80538 München, Germany"
                  },
                  "websiteUrl": {
                    "type": "string",
                    "example": "https://www.campingplatzsee.de"
                  },
                  "bookingUrl": {
                    "type": "string",
                    "example": "https://www.campingplatzsee.de/booking"
                  },
                  "showOnMap": {
                    "type": "string",
                    "example": "true"
                  },
                  "isActive": {
                    "type": "string",
                    "example": "false"
                  },
                  "coverImage": {
                    "type": "string",
                    "format": "binary",
                    "description": "jpeg/png/webp, max 10 MB"
                  },
                  "membershipDoc": {
                    "type": "string",
                    "format": "binary",
                    "description": "PDF, max 10 MB"
                  }
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Success",
            "content": {
              "application/json": {
                "example": {
                  "success": true,
                  "message": "Campsite created successfully",
                  "data": {
                    "id": "664f...",
                    "name": "Campingplatz am See"
                  }
                }
              }
            }
          },
          "401": {
            "description": "Unauthorized"
          },
          "422": {
            "description": "Validation error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ValidationErrorResponse"
                }
              }
            }
          }
        },
        "security": [
          {
            "bearer": []
          }
        ]
      }
    },
    "/admin/campsites/{id}": {
      "get": {
        "summary": "Get Campsite",
        "tags": [
          "Admin/Campsites"
        ],
        "parameters": [
          {
            "name": "Authorization",
            "in": "header",
            "required": true,
            "example": "Bearer {{adminToken}}",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "Accept-Language",
            "in": "header",
            "required": true,
            "example": "en",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "id",
            "in": "path",
            "required": true,
            "example": "664f1a2b3c4d5e6f7a8b9c0d",
            "description": "Campsite ID",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Success",
            "content": {
              "application/json": {
                "example": {
                  "success": true,
                  "message": "Campsite retrieved successfully",
                  "data": {
                    "id": "664f...",
                    "name": "Alpine Hut",
                    "isActive": true,
                    "owner": {}
                  }
                }
              }
            }
          },
          "401": {
            "description": "Unauthorized"
          },
          "404": {
            "description": "Not found"
          }
        },
        "security": [
          {
            "bearer": []
          }
        ]
      },
      "put": {
        "summary": "Update Campsite",
        "description": "multipart/form-data. New files replace and delete old ones.",
        "tags": [
          "Admin/Campsites"
        ],
        "parameters": [
          {
            "name": "Authorization",
            "in": "header",
            "required": true,
            "example": "Bearer {{adminToken}}",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "Accept-Language",
            "in": "header",
            "required": true,
            "example": "en",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "id",
            "in": "path",
            "required": true,
            "example": "664f1a2b3c4d5e6f7a8b9c0d",
            "description": "Campsite ID",
            "schema": {
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "multipart/form-data": {
              "schema": {
                "type": "object",
                "properties": {
                  "name": {
                    "type": "string"
                  },
                  "email": {
                    "type": "string"
                  },
                  "description": {
                    "type": "string"
                  },
                  "location[latitude]": {
                    "type": "string"
                  },
                  "location[longitude]": {
                    "type": "string"
                  },
                  "location[address]": {
                    "type": "string"
                  },
                  "websiteUrl": {
                    "type": "string"
                  },
                  "bookingUrl": {
                    "type": "string"
                  },
                  "showOnMap": {
                    "type": "string"
                  },
                  "isActive": {
                    "type": "string"
                  },
                  "userId": {
                    "type": "string",
                    "description": "Reassign to different owner"
                  },
                  "coverImage": {
                    "type": "string",
                    "format": "binary"
                  },
                  "membershipDoc": {
                    "type": "string",
                    "format": "binary"
                  }
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Success",
            "content": {
              "application/json": {
                "example": {
                  "success": true,
                  "message": "Campsite updated successfully",
                  "data": {}
                }
              }
            }
          },
          "401": {
            "description": "Unauthorized"
          },
          "404": {
            "description": "Not found"
          },
          "422": {
            "description": "Validation error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ValidationErrorResponse"
                }
              }
            }
          }
        },
        "security": [
          {
            "bearer": []
          }
        ]
      },
      "delete": {
        "summary": "Delete Campsite",
        "description": "Soft-delete (isDeleted: true, isActive: false). confirmed: true is required.",
        "tags": [
          "Admin/Campsites"
        ],
        "parameters": [
          {
            "name": "Authorization",
            "in": "header",
            "required": true,
            "example": "Bearer {{adminToken}}",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "Accept-Language",
            "in": "header",
            "required": true,
            "example": "en",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "Content-Type",
            "in": "header",
            "required": true,
            "example": "application/json",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "id",
            "in": "path",
            "required": true,
            "example": "664f1a2b3c4d5e6f7a8b9c0d",
            "description": "Campsite ID",
            "schema": {
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "required": [
                  "confirmed"
                ],
                "properties": {
                  "confirmed": {
                    "type": "boolean"
                  }
                }
              },
              "example": {
                "confirmed": true
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Success",
            "content": {
              "application/json": {
                "example": {
                  "success": true,
                  "message": "Campsite deleted successfully",
                  "data": {
                    "deletedId": "664f..."
                  }
                }
              }
            }
          },
          "401": {
            "description": "Unauthorized"
          },
          "404": {
            "description": "Not found"
          }
        },
        "security": [
          {
            "bearer": []
          }
        ]
      }
    },
    "/admin/campsites/{id}/status": {
      "patch": {
        "summary": "Toggle Campsite Status",
        "tags": [
          "Admin/Campsites"
        ],
        "parameters": [
          {
            "name": "Authorization",
            "in": "header",
            "required": true,
            "example": "Bearer {{adminToken}}",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "Accept-Language",
            "in": "header",
            "required": true,
            "example": "en",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "Content-Type",
            "in": "header",
            "required": true,
            "example": "application/json",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "id",
            "in": "path",
            "required": true,
            "example": "664f1a2b3c4d5e6f7a8b9c0d",
            "description": "Campsite ID",
            "schema": {
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "required": [
                  "isActive"
                ],
                "properties": {
                  "isActive": {
                    "type": "boolean"
                  }
                }
              },
              "example": {
                "isActive": true
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Success",
            "content": {
              "application/json": {
                "example": {
                  "success": true,
                  "message": "Campsite status updated",
                  "data": {
                    "isActive": true
                  }
                }
              }
            }
          },
          "401": {
            "description": "Unauthorized"
          },
          "404": {
            "description": "Not found"
          }
        },
        "security": [
          {
            "bearer": []
          }
        ]
      }
    },
    "/api/notifications": {
      "get": {
        "summary": "List Notifications",
        "tags": [
          "Notifications"
        ],
        "parameters": [
          {
            "name": "Authorization",
            "in": "header",
            "required": true,
            "example": "Bearer {{authToken}}",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "Accept-Language",
            "in": "header",
            "required": true,
            "example": "en",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "page",
            "in": "query",
            "schema": {
              "type": "integer",
              "default": 1
            },
            "example": 1
          },
          {
            "name": "limit",
            "in": "query",
            "schema": {
              "type": "integer",
              "default": 10
            },
            "example": 10
          },
          {
            "name": "isRead",
            "in": "query",
            "description": "'true' or 'false' to filter by read status",
            "schema": {
              "type": "string"
            },
            "example": "false"
          }
        ],
        "responses": {
          "200": {
            "description": "Success",
            "content": {
              "application/json": {
                "example": {
                  "success": true,
                  "message": "Success",
                  "data": {
                    "data": [
                      {
                        "id": "664f1a2b3c4d5e6f7a8b9c0d",
                        "title": "Welcome!",
                        "description": "Your account is ready.",
                        "notificationType": "info",
                        "isRead": false,
                        "createdAt": "2026-04-30T10:00:00Z"
                      }
                    ],
                    "meta": {
                      "total": 1,
                      "totalPages": 1,
                      "currentPage": 1,
                      "perPage": 10,
                      "hasNextPage": false,
                      "hasPrevPage": false
                    }
                  }
                }
              }
            }
          },
          "401": {
            "description": "Unauthorized"
          }
        },
        "security": [
          {
            "bearer": []
          }
        ]
      },
      "post": {
        "summary": "Create Notification",
        "tags": [
          "Notifications"
        ],
        "parameters": [
          {
            "name": "Authorization",
            "in": "header",
            "required": true,
            "example": "Bearer {{authToken}}",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "Accept-Language",
            "in": "header",
            "required": true,
            "example": "en",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "Content-Type",
            "in": "header",
            "required": true,
            "example": "application/json",
            "schema": {
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "required": [
                  "title",
                  "description"
                ],
                "properties": {
                  "title": {
                    "type": "string",
                    "example": "New message"
                  },
                  "description": {
                    "type": "string",
                    "example": "You have a new message."
                  },
                  "notificationType": {
                    "type": "string",
                    "example": "info"
                  },
                  "receiverId": {
                    "type": "string",
                    "description": "Target user ID (omit to send to self)"
                  }
                }
              },
              "example": {
                "title": "New message",
                "description": "You have a new message.",
                "notificationType": "info"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Success",
            "content": {
              "application/json": {
                "example": {
                  "success": true,
                  "message": "Notification created",
                  "data": {
                    "id": "664f1a2b3c4d5e6f7a8b9c0d",
                    "title": "Welcome!",
                    "description": "Your account is ready.",
                    "notificationType": "info",
                    "isRead": false,
                    "createdAt": "2026-04-30T10:00:00Z"
                  }
                }
              }
            }
          },
          "401": {
            "description": "Unauthorized"
          },
          "422": {
            "description": "Validation error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ValidationErrorResponse"
                }
              }
            }
          }
        },
        "security": [
          {
            "bearer": []
          }
        ]
      }
    },
    "/api/notifications/unread/count": {
      "get": {
        "summary": "Get Unread Count",
        "tags": [
          "Notifications"
        ],
        "parameters": [
          {
            "name": "Authorization",
            "in": "header",
            "required": true,
            "example": "Bearer {{authToken}}",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "Accept-Language",
            "in": "header",
            "required": true,
            "example": "en",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Success",
            "content": {
              "application/json": {
                "example": {
                  "success": true,
                  "message": "Unread count retrieved",
                  "data": {
                    "count": 5
                  }
                }
              }
            }
          },
          "401": {
            "description": "Unauthorized"
          }
        },
        "security": [
          {
            "bearer": []
          }
        ]
      }
    },
    "/api/notifications/read-all": {
      "patch": {
        "summary": "Mark All as Read",
        "tags": [
          "Notifications"
        ],
        "parameters": [
          {
            "name": "Authorization",
            "in": "header",
            "required": true,
            "example": "Bearer {{authToken}}",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "Accept-Language",
            "in": "header",
            "required": true,
            "example": "en",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Success",
            "content": {
              "application/json": {
                "example": {
                  "success": true,
                  "message": "All notifications marked as read",
                  "data": null
                }
              }
            }
          },
          "401": {
            "description": "Unauthorized"
          }
        },
        "security": [
          {
            "bearer": []
          }
        ]
      }
    },
    "/api/notifications/send": {
      "post": {
        "summary": "Send Notification (broadcast)",
        "tags": [
          "Notifications"
        ],
        "parameters": [
          {
            "name": "Authorization",
            "in": "header",
            "required": true,
            "example": "Bearer {{authToken}}",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "Accept-Language",
            "in": "header",
            "required": true,
            "example": "en",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "Content-Type",
            "in": "header",
            "required": true,
            "example": "application/json",
            "schema": {
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "required": [
                  "title",
                  "description"
                ],
                "properties": {
                  "title": {
                    "type": "string"
                  },
                  "description": {
                    "type": "string"
                  },
                  "notificationType": {
                    "type": "string"
                  },
                  "receiverId": {
                    "type": "string",
                    "description": "Specific user ID, omit to broadcast"
                  }
                }
              },
              "example": {
                "title": "System maintenance",
                "description": "Scheduled maintenance on Sunday 02:00 UTC.",
                "notificationType": "warning"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Success",
            "content": {
              "application/json": {
                "example": {
                  "success": true,
                  "message": "Notification sent",
                  "data": {
                    "id": "664f1a2b3c4d5e6f7a8b9c0d",
                    "title": "Welcome!",
                    "description": "Your account is ready.",
                    "notificationType": "info",
                    "isRead": false,
                    "createdAt": "2026-04-30T10:00:00Z"
                  }
                }
              }
            }
          },
          "401": {
            "description": "Unauthorized"
          },
          "422": {
            "description": "Validation error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ValidationErrorResponse"
                }
              }
            }
          }
        },
        "security": [
          {
            "bearer": []
          }
        ]
      }
    },
    "/api/notifications/{id}": {
      "get": {
        "summary": "Get Notification",
        "tags": [
          "Notifications"
        ],
        "parameters": [
          {
            "name": "Authorization",
            "in": "header",
            "required": true,
            "example": "Bearer {{authToken}}",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "Accept-Language",
            "in": "header",
            "required": true,
            "example": "en",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "id",
            "in": "path",
            "required": true,
            "example": "664f1a2b3c4d5e6f7a8b9c0d",
            "description": "Notification ID",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Success",
            "content": {
              "application/json": {
                "example": {
                  "success": true,
                  "data": {
                    "id": "664f1a2b3c4d5e6f7a8b9c0d",
                    "title": "Welcome!",
                    "description": "Your account is ready.",
                    "notificationType": "info",
                    "isRead": false,
                    "createdAt": "2026-04-30T10:00:00Z"
                  }
                }
              }
            }
          },
          "401": {
            "description": "Unauthorized"
          },
          "404": {
            "description": "Not found"
          }
        },
        "security": [
          {
            "bearer": []
          }
        ]
      },
      "patch": {
        "summary": "Mark Notification as Read",
        "tags": [
          "Notifications"
        ],
        "parameters": [
          {
            "name": "Authorization",
            "in": "header",
            "required": true,
            "example": "Bearer {{authToken}}",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "Accept-Language",
            "in": "header",
            "required": true,
            "example": "en",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "id",
            "in": "path",
            "required": true,
            "example": "664f1a2b3c4d5e6f7a8b9c0d",
            "description": "Notification ID",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Success",
            "content": {
              "application/json": {
                "example": {
                  "success": true,
                  "message": "Notification marked as read",
                  "data": {
                    "id": "664f1a2b3c4d5e6f7a8b9c0d",
                    "title": "Welcome!",
                    "description": "Your account is ready.",
                    "notificationType": "info",
                    "isRead": true,
                    "createdAt": "2026-04-30T10:00:00Z"
                  }
                }
              }
            }
          },
          "401": {
            "description": "Unauthorized"
          },
          "404": {
            "description": "Not found"
          }
        },
        "security": [
          {
            "bearer": []
          }
        ]
      },
      "delete": {
        "summary": "Delete Notification",
        "tags": [
          "Notifications"
        ],
        "parameters": [
          {
            "name": "Authorization",
            "in": "header",
            "required": true,
            "example": "Bearer {{authToken}}",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "Accept-Language",
            "in": "header",
            "required": true,
            "example": "en",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "id",
            "in": "path",
            "required": true,
            "example": "664f1a2b3c4d5e6f7a8b9c0d",
            "description": "Notification ID",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Success",
            "content": {
              "application/json": {
                "example": {
                  "success": true,
                  "message": "Notification deleted",
                  "data": {
                    "deletedId": "664f..."
                  }
                }
              }
            }
          },
          "401": {
            "description": "Unauthorized"
          },
          "404": {
            "description": "Not found"
          }
        },
        "security": [
          {
            "bearer": []
          }
        ]
      }
    },
    "/api/cms": {
      "get": {
        "summary": "List CMS Pages (public)",
        "tags": [
          "Public CMS & FAQ"
        ],
        "parameters": [
          {
            "name": "lang",
            "in": "query",
            "required": true,
            "example": "de",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "Accept-Language",
            "in": "header",
            "required": true,
            "example": "en",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Success",
            "content": {
              "application/json": {
                "example": {
                  "success": true,
                  "data": [
                    {
                      "slug": "imprint",
                      "title": "Imprint",
                      "lang": "en"
                    }
                  ]
                }
              }
            }
          }
        },
        "security": []
      }
    },
    "/api/cms/{slug}": {
      "get": {
        "summary": "Get CMS Page by Slug (public)",
        "tags": [
          "Public CMS & FAQ"
        ],
        "parameters": [
          {
            "name": "slug",
            "in": "path",
            "required": true,
            "example": "terms-of-service",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "lang",
            "in": "query",
            "required": true,
            "example": "en",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "Accept-Language",
            "in": "header",
            "required": true,
            "example": "en",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Success",
            "content": {
              "application/json": {
                "example": {
                  "success": true,
                  "data": {
                    "lang": "en",
                    "title": "Imprint",
                    "content": "Company Name GmbH\nMusterstraße 1\n80331 München"
                  }
                }
              }
            }
          }
        },
        "security": []
      }
    },
    "/api/faq": {
      "get": {
        "summary": "List FAQs (public)",
        "tags": [
          "Public CMS & FAQ"
        ],
        "parameters": [
          {
            "name": "audience",
            "in": "query",
            "schema": {
              "type": "string"
            },
            "example": ""
          },
          {
            "name": "lang",
            "in": "query",
            "schema": {
              "type": "string"
            },
            "example": "en"
          },
          {
            "name": "campsiteId",
            "in": "query",
            "schema": {
              "type": "string"
            },
            "example": ""
          }
        ],
        "responses": {
          "200": {
            "description": "Success",
            "content": {
              "application/json": {
                "example": {
                  "success": true,
                  "message": "Success",
                  "data": {
                    "data": [],
                    "meta": {
                      "totalPages": 0,
                      "currentPage": 1,
                      "perPage": 10,
                      "hasNextPage": false,
                      "hasPrevPage": false
                    }
                  }
                }
              }
            }
          }
        },
        "security": []
      }
    },
    "/api/super-categories": {
      "get": {
        "summary": "List Super Categories (public)",
        "tags": [
          "Public CMS & FAQ"
        ],
        "parameters": [
          {
            "name": "page",
            "in": "query",
            "schema": {
              "type": "integer",
              "default": 1
            },
            "example": 1
          },
          {
            "name": "limit",
            "in": "query",
            "schema": {
              "type": "integer",
              "default": 50
            },
            "example": 50
          },
          {
            "name": "search",
            "in": "query",
            "schema": {
              "type": "string"
            },
            "example": ""
          }
        ],
        "responses": {
          "200": {
            "description": "Success",
            "content": {
              "application/json": {
                "example": {
                  "success": true,
                  "message": "Success",
                  "data": {
                    "data": [
                      {
                        "id": "664f...",
                        "name_en": "Tent",
                        "name_de": "Zelt",
                        "order": 1
                      }
                    ],
                    "meta": {
                      "total": 1,
                      "totalPages": 1,
                      "currentPage": 1,
                      "perPage": 10,
                      "hasNextPage": false,
                      "hasPrevPage": false
                    }
                  }
                }
              }
            }
          }
        },
        "security": []
      }
    },
    "/api/campground/{id}/detail": {
      "get": {
        "summary": "Get Full Campground Detail",
        "description": "Single endpoint returning everything: basic info, media, links, FAQs, availability config, step statuses, completion percentage.",
        "operationId": "getCampgroundDetail",
        "tags": [
          "Campground Detail"
        ],
        "parameters": [
          {
            "name": "Authorization",
            "in": "header",
            "required": true,
            "example": "Bearer {{campsiteToken}}",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "Accept-Language",
            "in": "header",
            "required": true,
            "example": "en",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "id",
            "in": "path",
            "required": true,
            "example": "664f1a2b3c4d5e6f7a8b9c0d",
            "description": "Campsite ID",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Success",
            "content": {
              "application/json": {
                "example": {
                  "success": true,
                  "message": "Campground detail retrieved successfully",
                  "data": {
                    "id": "664f...",
                    "campground_name": "Alpine Hut",
                    "location": {
                      "latitude": 47.8095,
                      "longitude": 13.055,
                      "address": "Salzburg, Austria"
                    },
                    "short_description": "<p>A beautiful alpine campsite.</p>",
                    "cover_image_url": null,
                    "is_active": false,
                    "is_visible": false,
                    "slug": null,
                    "setup_status": "in_progress",
                    "step1_status": "in_progress",
                    "step2_status": "pending",
                    "completion_percentage": 25,
                    "links": {
                      "website_url": null,
                      "instagram_url": null,
                      "facebook_url": null,
                      "youtube_url": null,
                      "twitter_url": null,
                      "booking_url": null,
                      "contact_url": null
                    },
                    "media": {
                      "cover": null,
                      "gallery": []
                    },
                    "faqs": [],
                    "availability": null
                  }
                }
              }
            }
          },
          "401": {
            "description": "Unauthorized"
          },
          "404": {
            "description": "Not found"
          }
        },
        "security": [
          {
            "bearer": []
          }
        ]
      }
    },
    "/api/campground/{id}": {
      "get": {
        "summary": "Get Basic Info",
        "operationId": "getBasicInfo",
        "tags": [
          "Step 1a Basic Info"
        ],
        "parameters": [
          {
            "name": "Authorization",
            "in": "header",
            "required": true,
            "example": "Bearer {{campsiteToken}}",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "Accept-Language",
            "in": "header",
            "required": true,
            "example": "en",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "id",
            "in": "path",
            "required": true,
            "example": "664f1a2b3c4d5e6f7a8b9c0d",
            "description": "Campsite ID",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Success",
            "content": {
              "application/json": {
                "example": {
                  "success": true,
                  "message": "Campground basic info retrieved successfully",
                  "data": {
                    "id": "664f...",
                    "campground_name": "Alpine Hut",
                    "location": {
                      "latitude": 47.8095,
                      "longitude": 13.055,
                      "address": "Salzburg, Austria"
                    },
                    "short_description": "<p>A beautiful alpine campsite...</p>",
                    "setup_status": "in_progress",
                    "step1_status": "in_progress"
                  }
                }
              }
            }
          },
          "401": {
            "description": "Unauthorized"
          },
          "403": {
            "description": "Forbidden"
          },
          "404": {
            "description": "Not found"
          }
        },
        "security": [
          {
            "bearer": []
          }
        ]
      },
      "patch": {
        "summary": "Update Basic Info",
        "description": "Partial update. Send only changed fields. setup_status is computed by server - do NOT send it.",
        "operationId": "updateBasicInfo",
        "tags": [
          "Step 1a Basic Info"
        ],
        "parameters": [
          {
            "name": "Authorization",
            "in": "header",
            "required": true,
            "example": "Bearer {{campsiteToken}}",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "Accept-Language",
            "in": "header",
            "required": true,
            "example": "en",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "Content-Type",
            "in": "header",
            "required": true,
            "example": "application/json",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "id",
            "in": "path",
            "required": true,
            "example": "664f1a2b3c4d5e6f7a8b9c0d",
            "description": "Campsite ID",
            "schema": {
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "campground_name": {
                    "type": "string",
                    "maxLength": 200,
                    "example": "Alpine Hut"
                  },
                  "location": {
                    "$ref": "#/components/schemas/Location"
                  },
                  "short_description": {
                    "type": "string",
                    "maxLength": 10000,
                    "example": "<p>A beautiful alpine campsite...</p>"
                  }
                }
              },
              "example": {
                "campground_name": "Alpine Hut",
                "location": {
                  "latitude": 47.8095,
                  "longitude": 13.055,
                  "address": "Salzburg, Austria"
                },
                "short_description": "<p>A beautiful alpine campsite...</p>"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Success",
            "content": {
              "application/json": {
                "example": {
                  "success": true,
                  "message": "Campground basic info updated successfully",
                  "data": {
                    "id": "664f...",
                    "campground_name": "Alpine Hut",
                    "location": {
                      "latitude": 47.8095,
                      "longitude": 13.055,
                      "address": "Salzburg, Austria"
                    },
                    "short_description": "<p>A beautiful alpine campsite...</p>",
                    "setup_status": "in_progress",
                    "step1_status": "in_progress"
                  }
                }
              }
            }
          },
          "401": {
            "description": "Unauthorized"
          },
          "403": {
            "description": "Forbidden"
          },
          "404": {
            "description": "Not found"
          },
          "422": {
            "description": "Validation error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ValidationErrorResponse"
                }
              }
            }
          }
        },
        "security": [
          {
            "bearer": []
          }
        ]
      }
    },
    "/api/campground/{id}/media": {
      "get": {
        "summary": "Get Media",
        "operationId": "getMedia",
        "tags": [
          "Step 1b Media"
        ],
        "parameters": [
          {
            "name": "Authorization",
            "in": "header",
            "required": true,
            "example": "Bearer {{campsiteToken}}",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "Accept-Language",
            "in": "header",
            "required": true,
            "example": "en",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "id",
            "in": "path",
            "required": true,
            "example": "664f1a2b3c4d5e6f7a8b9c0d",
            "description": "Campsite ID",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Success",
            "content": {
              "application/json": {
                "example": {
                  "success": true,
                  "message": "Campground media retrieved successfully",
                  "data": {
                    "cover": {
                      "id": "665a...",
                      "url": "http://localhost:3000/media/campsites/cover/image.jpg",
                      "type": "cover",
                      "mediaCategory": "image"
                    },
                    "gallery": [
                      {
                        "id": "665a...",
                        "url": "http://localhost:3000/media/campsites/gallery/image.jpg",
                        "type": "gallery",
                        "mediaCategory": "image"
                      }
                    ]
                  }
                }
              }
            }
          }
        },
        "security": [
          {
            "bearer": []
          }
        ]
      },
      "delete": {
        "summary": "Bulk Delete Media",
        "description": "Hard-deletes multiple media items. Physical files also removed from disk.",
        "operationId": "deleteMediaBulk",
        "tags": [
          "Step 1b Media"
        ],
        "parameters": [
          {
            "name": "Authorization",
            "in": "header",
            "required": true,
            "example": "Bearer {{campsiteToken}}",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "Accept-Language",
            "in": "header",
            "required": true,
            "example": "en",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "Content-Type",
            "in": "header",
            "required": true,
            "example": "application/json",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "id",
            "in": "path",
            "required": true,
            "example": "664f1a2b3c4d5e6f7a8b9c0d",
            "description": "Campsite ID",
            "schema": {
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "required": [
                  "mediaIds"
                ],
                "properties": {
                  "mediaIds": {
                    "type": "array",
                    "items": {
                      "type": "string"
                    },
                    "minItems": 1,
                    "example": [
                      "665a1b2c3d4e5f6a7b8c9d10",
                      "665a1b2c3d4e5f6a7b8c9d11"
                    ]
                  }
                }
              },
              "example": {
                "mediaIds": [
                  "665a1b2c3d4e5f6a7b8c9d10",
                  "665a1b2c3d4e5f6a7b8c9d11"
                ]
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Success",
            "content": {
              "application/json": {
                "example": {
                  "success": true,
                  "message": "Media deleted successfully",
                  "data": {
                    "deletedCount": 2
                  }
                }
              }
            }
          },
          "401": {
            "description": "Unauthorized"
          },
          "404": {
            "description": "Not found"
          },
          "422": {
            "description": "Validation error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ValidationErrorResponse"
                }
              }
            }
          }
        },
        "security": [
          {
            "bearer": []
          }
        ]
      }
    },
    "/api/campground/{id}/media/chunk": {
      "post": {
        "summary": "Upload Media Chunk",
        "description": "Upload one chunk. Last chunk (chunkIndex == totalChunks-1) assembles file and returns media record.\n\nAllowed MIME types:\n- cover: image/jpeg, image/png, image/webp\n- gallery: all image types + video/mp4, video/quicktime, video/webm, video/x-msvideo\n\nNew cover auto-deletes previous cover.",
        "operationId": "uploadMediaChunk",
        "tags": [
          "Step 1b Media"
        ],
        "parameters": [
          {
            "name": "Authorization",
            "in": "header",
            "required": true,
            "example": "Bearer {{campsiteToken}}",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "Accept-Language",
            "in": "header",
            "required": true,
            "example": "en",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "id",
            "in": "path",
            "required": true,
            "example": "664f1a2b3c4d5e6f7a8b9c0d",
            "description": "Campsite ID",
            "schema": {
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "multipart/form-data": {
              "schema": {
                "type": "object",
                "required": [
                  "chunk",
                  "uploadId",
                  "chunkIndex",
                  "totalChunks",
                  "filename",
                  "mimeType",
                  "mediaType"
                ],
                "properties": {
                  "chunk": {
                    "type": "string",
                    "format": "binary",
                    "description": "Raw binary chunk. Max 10 MB."
                  },
                  "uploadId": {
                    "type": "string",
                    "format": "uuid",
                    "description": "Client-generated UUID, same for all chunks of same file.",
                    "example": "550e8400-e29b-41d4-a716-446655440000"
                  },
                  "chunkIndex": {
                    "type": "integer",
                    "minimum": 0,
                    "description": "0-based chunk index.",
                    "example": 0
                  },
                  "totalChunks": {
                    "type": "integer",
                    "minimum": 1,
                    "description": "Total number of chunks.",
                    "example": 5
                  },
                  "filename": {
                    "type": "string",
                    "description": "Original filename with extension.",
                    "example": "campsite-hero.jpg"
                  },
                  "mimeType": {
                    "type": "string",
                    "description": "MIME type of the complete file.",
                    "example": "image/jpeg"
                  },
                  "mediaType": {
                    "type": "string",
                    "enum": [
                      "cover",
                      "gallery"
                    ],
                    "example": "gallery"
                  }
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Chunk received - more expected",
            "content": {
              "application/json": {
                "example": {
                  "success": true,
                  "message": "Chunk received",
                  "data": {
                    "status": "chunk_received",
                    "chunkIndex": 0
                  }
                }
              }
            }
          },
          "201": {
            "description": "Last chunk - file assembled",
            "content": {
              "application/json": {
                "example": {
                  "success": true,
                  "message": "Chunk received",
                  "data": {
                    "status": "complete",
                    "media": {
                      "id": "665a...",
                      "url": "http://localhost:3000/media/campsites/cover/image.jpg",
                      "type": "cover",
                      "mediaCategory": "image"
                    }
                  }
                }
              }
            }
          },
          "400": {
            "description": "Invalid MIME type"
          },
          "401": {
            "description": "Unauthorized"
          },
          "404": {
            "description": "Not found"
          },
          "422": {
            "description": "Validation error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ValidationErrorResponse"
                }
              }
            }
          }
        },
        "security": [
          {
            "bearer": []
          }
        ]
      }
    },
    "/api/campground/{id}/media/chunk/{uploadId}": {
      "delete": {
        "summary": "Cancel Chunk Upload",
        "description": "Abort in-progress chunked upload. Cleans up all temp chunk files.",
        "operationId": "cancelChunkUpload",
        "tags": [
          "Step 1b Media"
        ],
        "parameters": [
          {
            "name": "Authorization",
            "in": "header",
            "required": true,
            "example": "Bearer {{campsiteToken}}",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "Accept-Language",
            "in": "header",
            "required": true,
            "example": "en",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "id",
            "in": "path",
            "required": true,
            "example": "664f1a2b3c4d5e6f7a8b9c0d",
            "description": "Campsite ID",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "uploadId",
            "in": "path",
            "required": true,
            "example": "550e8400-e29b-41d4-a716-446655440000",
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Success",
            "content": {
              "application/json": {
                "example": {
                  "success": true,
                  "message": "Upload cancelled",
                  "data": {
                    "cancelled": true
                  }
                }
              }
            }
          }
        },
        "security": [
          {
            "bearer": []
          }
        ]
      }
    },
    "/api/campground/{id}/media/{mediaId}": {
      "delete": {
        "summary": "Delete Single Media",
        "description": "Permanently deletes media item and physical file. If deleted item is cover, coverImageUrl is cleared.",
        "operationId": "deleteMedia",
        "tags": [
          "Step 1b Media"
        ],
        "parameters": [
          {
            "name": "Authorization",
            "in": "header",
            "required": true,
            "example": "Bearer {{campsiteToken}}",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "Accept-Language",
            "in": "header",
            "required": true,
            "example": "en",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "id",
            "in": "path",
            "required": true,
            "example": "664f1a2b3c4d5e6f7a8b9c0d",
            "description": "Campsite ID",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "mediaId",
            "in": "path",
            "required": true,
            "example": "665a1b2c3d4e5f6a7b8c9d0e",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Success",
            "content": {
              "application/json": {
                "example": {
                  "success": true,
                  "message": "Media deleted successfully",
                  "data": {
                    "deletedId": "665a1b2c3d4e5f6a7b8c9d0e"
                  }
                }
              }
            }
          },
          "404": {
            "description": "Not found"
          }
        },
        "security": [
          {
            "bearer": []
          }
        ]
      }
    },
    "/api/campground/{id}/links": {
      "get": {
        "summary": "Get Links",
        "operationId": "getLinks",
        "tags": [
          "Step 1c Links"
        ],
        "parameters": [
          {
            "name": "Authorization",
            "in": "header",
            "required": true,
            "example": "Bearer {{campsiteToken}}",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "Accept-Language",
            "in": "header",
            "required": true,
            "example": "en",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "id",
            "in": "path",
            "required": true,
            "example": "664f1a2b3c4d5e6f7a8b9c0d",
            "description": "Campsite ID",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Success",
            "content": {
              "application/json": {
                "example": {
                  "success": true,
                  "message": "Campground links retrieved successfully",
                  "data": {
                    "website_url": "https://www.alpinehut.at",
                    "instagram_url": null,
                    "facebook_url": null,
                    "youtube_url": null,
                    "twitter_url": null,
                    "booking_url": null,
                    "contact_url": null
                  }
                }
              }
            }
          }
        },
        "security": [
          {
            "bearer": []
          }
        ]
      },
      "patch": {
        "summary": "Update Links",
        "description": "All fields optional. website_url and booking_url must be https://. Pass null or empty string to clear.",
        "operationId": "updateLinks",
        "tags": [
          "Step 1c Links"
        ],
        "parameters": [
          {
            "name": "Authorization",
            "in": "header",
            "required": true,
            "example": "Bearer {{campsiteToken}}",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "Accept-Language",
            "in": "header",
            "required": true,
            "example": "en",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "Content-Type",
            "in": "header",
            "required": true,
            "example": "application/json",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "id",
            "in": "path",
            "required": true,
            "example": "664f1a2b3c4d5e6f7a8b9c0d",
            "description": "Campsite ID",
            "schema": {
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "website_url": {
                    "type": "string",
                    "example": "https://www.alpinehut.at"
                  },
                  "instagram_url": {
                    "type": "string",
                    "example": "https://instagram.com/alpinehut"
                  },
                  "facebook_url": {
                    "type": "string",
                    "example": "https://facebook.com/alpinehut"
                  },
                  "youtube_url": {
                    "type": "string",
                    "example": "https://youtube.com/@alpinehut"
                  },
                  "twitter_url": {
                    "type": "string",
                    "example": "https://twitter.com/alpinehut"
                  },
                  "booking_url": {
                    "type": "string",
                    "example": "https://booking.alpinehut.at"
                  },
                  "contact_url": {
                    "type": "string",
                    "example": "https://www.alpinehut.at/contact"
                  }
                }
              },
              "example": {
                "website_url": "https://www.alpinehut.at",
                "instagram_url": "https://instagram.com/alpinehut"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Success",
            "content": {
              "application/json": {
                "example": {
                  "success": true,
                  "message": "Campground links updated successfully",
                  "data": {
                    "website_url": "https://www.alpinehut.at",
                    "instagram_url": "https://instagram.com/alpinehut",
                    "facebook_url": null,
                    "youtube_url": null,
                    "twitter_url": null,
                    "booking_url": null,
                    "contact_url": null
                  }
                }
              }
            }
          },
          "422": {
            "description": "Validation error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ValidationErrorResponse"
                }
              }
            }
          }
        },
        "security": [
          {
            "bearer": []
          }
        ]
      }
    },
    "/api/campground/{id}/faqs": {
      "get": {
        "summary": "Get FAQs & Contact",
        "description": "Returns contact_url, campsite FAQ list, and suggested admin FAQs not yet added.\n\nFirst-visit auto-init: if no FAQs yet, all active admin FAQs (audience: campingSpotOwners) are auto-copied before returning.\n\nfaqs[].isCustom: false = unmodified admin copy, true = owner edited. sourceFaqId: null = owner-created.",
        "operationId": "getFaqs",
        "tags": [
          "Step 1d FAQs"
        ],
        "parameters": [
          {
            "name": "Authorization",
            "in": "header",
            "required": true,
            "example": "Bearer {{campsiteToken}}",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "Accept-Language",
            "in": "header",
            "required": true,
            "example": "en",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "id",
            "in": "path",
            "required": true,
            "example": "664f1a2b3c4d5e6f7a8b9c0d",
            "description": "Campsite ID",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Success",
            "content": {
              "application/json": {
                "example": {
                  "success": true,
                  "message": "FAQs retrieved successfully",
                  "data": {
                    "contact_url": "https://www.alpinehut.at/contact",
                    "faqs": [
                      {
                        "id": "666a...",
                        "question_en": "Are pets allowed?",
                        "question_de": "Sind Haustiere erlaubt?",
                        "answer_en": "Yes, on a leash.",
                        "answer_de": "Ja, an der Leine.",
                        "order": 1,
                        "isCustom": false,
                        "sourceFaqId": "666a000000000000000000a1"
                      }
                    ],
                    "suggested": [
                      {
                        "id": "666a000000000000000000a3",
                        "question_en": "Do you have Wi-Fi?",
                        "question_de": "Haben Sie WLAN?",
                        "answer_en": "Yes, free Wi-Fi at reception.",
                        "answer_de": "Ja, kostenloses WLAN.",
                        "order": 4
                      }
                    ]
                  }
                }
              }
            }
          },
          "401": {
            "description": "Unauthorized"
          },
          "404": {
            "description": "Not found"
          }
        },
        "security": [
          {
            "bearer": []
          }
        ]
      },
      "post": {
        "summary": "Create FAQ / Add Suggested FAQ",
        "description": "Custom FAQ: omit sourceFaqId.\nAdd suggested: provide sourceFaqId from suggested[].id.\n\nDeduplication: unique index on (campsiteId, sourceFaqId).",
        "operationId": "createFaq",
        "tags": [
          "Step 1d FAQs"
        ],
        "parameters": [
          {
            "name": "Authorization",
            "in": "header",
            "required": true,
            "example": "Bearer {{campsiteToken}}",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "Accept-Language",
            "in": "header",
            "required": true,
            "example": "en",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "Content-Type",
            "in": "header",
            "required": true,
            "example": "application/json",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "id",
            "in": "path",
            "required": true,
            "example": "664f1a2b3c4d5e6f7a8b9c0d",
            "description": "Campsite ID",
            "schema": {
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "required": [
                  "question_en",
                  "answer_en"
                ],
                "properties": {
                  "question_en": {
                    "type": "string",
                    "maxLength": 500,
                    "example": "Are pets allowed?"
                  },
                  "question_de": {
                    "type": "string",
                    "maxLength": 500,
                    "nullable": true,
                    "example": "Sind Haustiere erlaubt?"
                  },
                  "answer_en": {
                    "type": "string",
                    "maxLength": 5000,
                    "example": "Yes, pets are welcome on a leash."
                  },
                  "answer_de": {
                    "type": "string",
                    "maxLength": 5000,
                    "nullable": true,
                    "example": "Ja, Haustiere sind willkommen."
                  },
                  "order": {
                    "type": "integer",
                    "minimum": 1,
                    "example": 3
                  },
                  "sourceFaqId": {
                    "type": "string",
                    "description": "ObjectId from suggested[].id. Omit for custom FAQs.",
                    "example": "666a000000000000000000a3"
                  }
                }
              },
              "examples": {
                "custom_faq": {
                  "value": {
                    "question_en": "Do you offer group discounts?",
                    "question_de": "Bieten Sie Gruppenrabatte an?",
                    "answer_en": "Yes, contact us for groups of 10+.",
                    "answer_de": "Ja, für Gruppen ab 10 Personen."
                  },
                  "summary": "Custom FAQ"
                },
                "suggested_faq": {
                  "value": {
                    "question_en": "Do you have Wi-Fi?",
                    "question_de": "Haben Sie WLAN?",
                    "answer_en": "Yes, free Wi-Fi at reception.",
                    "answer_de": "Ja, kostenloses WLAN.",
                    "sourceFaqId": "666a000000000000000000a3"
                  },
                  "summary": "Adding suggested FAQ"
                }
              }
            }
          }
        },
        "responses": {
          "201": {
            "description": "FAQ created",
            "content": {
              "application/json": {
                "example": {
                  "success": true,
                  "message": "FAQ created successfully",
                  "data": {
                    "id": "666a...",
                    "question_en": "Do you offer group discounts?",
                    "answer_en": "Yes.",
                    "order": 4,
                    "isCustom": true,
                    "sourceFaqId": null
                  }
                }
              }
            }
          },
          "404": {
            "description": "Not found"
          },
          "422": {
            "description": "Validation error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ValidationErrorResponse"
                }
              }
            }
          }
        },
        "security": [
          {
            "bearer": []
          }
        ]
      }
    },
    "/api/campground/{id}/faqs/{faqId}": {
      "patch": {
        "summary": "Update FAQ",
        "description": "Partial update. Always sets isCustom: true.",
        "operationId": "updateFaq",
        "tags": [
          "Step 1d FAQs"
        ],
        "parameters": [
          {
            "name": "Authorization",
            "in": "header",
            "required": true,
            "example": "Bearer {{campsiteToken}}",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "Accept-Language",
            "in": "header",
            "required": true,
            "example": "en",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "Content-Type",
            "in": "header",
            "required": true,
            "example": "application/json",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "id",
            "in": "path",
            "required": true,
            "example": "664f1a2b3c4d5e6f7a8b9c0d",
            "description": "Campsite ID",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "faqId",
            "in": "path",
            "required": true,
            "example": "666a1b2c3d4e5f6a7b8c9d01",
            "schema": {
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "question_en": {
                    "type": "string",
                    "maxLength": 500
                  },
                  "question_de": {
                    "type": "string",
                    "nullable": true
                  },
                  "answer_en": {
                    "type": "string",
                    "maxLength": 5000
                  },
                  "answer_de": {
                    "type": "string",
                    "nullable": true
                  },
                  "order": {
                    "type": "integer",
                    "minimum": 1
                  }
                }
              },
              "example": {
                "answer_en": "Yes, on a leash at all times.",
                "order": 1
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Success",
            "content": {
              "application/json": {
                "example": {
                  "success": true,
                  "message": "FAQ updated successfully",
                  "data": {
                    "id": "666a...",
                    "question_en": "Are pets allowed?",
                    "answer_en": "Yes, on a leash at all times.",
                    "order": 1,
                    "isCustom": true,
                    "sourceFaqId": "666a000000000000000000a1"
                  }
                }
              }
            }
          },
          "404": {
            "description": "Not found"
          },
          "422": {
            "description": "Validation error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ValidationErrorResponse"
                }
              }
            }
          }
        },
        "security": [
          {
            "bearer": []
          }
        ]
      },
      "delete": {
        "summary": "Delete FAQ (soft)",
        "description": "Soft-deletes (isActive: false). If FAQ had sourceFaqId, it re-appears in suggested on next GET.",
        "operationId": "deleteFaq",
        "tags": [
          "Step 1d FAQs"
        ],
        "parameters": [
          {
            "name": "Authorization",
            "in": "header",
            "required": true,
            "example": "Bearer {{campsiteToken}}",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "Accept-Language",
            "in": "header",
            "required": true,
            "example": "en",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "id",
            "in": "path",
            "required": true,
            "example": "664f1a2b3c4d5e6f7a8b9c0d",
            "description": "Campsite ID",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "faqId",
            "in": "path",
            "required": true,
            "example": "666a1b2c3d4e5f6a7b8c9d01",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Success",
            "content": {
              "application/json": {
                "example": {
                  "success": true,
                  "message": "FAQ deleted successfully",
                  "data": {
                    "deletedId": "666a1b2c3d4e5f6a7b8c9d01"
                  }
                }
              }
            }
          },
          "404": {
            "description": "Not found"
          }
        },
        "security": [
          {
            "bearer": []
          }
        ]
      }
    },
    "/api/campground/{id}/contact": {
      "patch": {
        "summary": "Update Contact URL",
        "description": "Must be https://. Pass null or empty string to clear.",
        "operationId": "updateContact",
        "tags": [
          "Step 1d FAQs"
        ],
        "parameters": [
          {
            "name": "Authorization",
            "in": "header",
            "required": true,
            "example": "Bearer {{campsiteToken}}",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "Accept-Language",
            "in": "header",
            "required": true,
            "example": "en",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "Content-Type",
            "in": "header",
            "required": true,
            "example": "application/json",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "id",
            "in": "path",
            "required": true,
            "example": "664f1a2b3c4d5e6f7a8b9c0d",
            "description": "Campsite ID",
            "schema": {
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "contact_url": {
                    "type": "string",
                    "example": "https://www.alpinehut.at/contact"
                  }
                }
              },
              "example": {
                "contact_url": "https://www.alpinehut.at/contact"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Success",
            "content": {
              "application/json": {
                "example": {
                  "success": true,
                  "message": "Contact URL updated successfully",
                  "data": {
                    "contact_url": "https://www.alpinehut.at/contact"
                  }
                }
              }
            }
          }
        },
        "security": [
          {
            "bearer": []
          }
        ]
      }
    },
    "/api/campground/{id}/availability": {
      "get": {
        "summary": "Get Availability Config",
        "description": "Returns current config, or null if not yet configured.",
        "operationId": "getAvailability",
        "tags": [
          "Step 2 Availability"
        ],
        "parameters": [
          {
            "name": "Authorization",
            "in": "header",
            "required": true,
            "example": "Bearer {{campsiteToken}}",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "Accept-Language",
            "in": "header",
            "required": true,
            "example": "en",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "id",
            "in": "path",
            "required": true,
            "example": "664f1a2b3c4d5e6f7a8b9c0d",
            "description": "Campsite ID",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Success",
            "content": {
              "application/json": {
                "example": {
                  "success": true,
                  "message": "Availability retrieved successfully",
                  "data": {
                    "type": "manual",
                    "erpProvider": null,
                    "isConfigured": true
                  }
                }
              }
            }
          }
        },
        "security": [
          {
            "bearer": []
          }
        ]
      },
      "patch": {
        "summary": "Save / Update Availability Config",
        "description": "Upsert. Sets step2_status to 'configured'.\n- type: manual = owner manages manually\n- type: erp = ERP connection (erpProvider required)",
        "operationId": "upsertAvailability",
        "tags": [
          "Step 2 Availability"
        ],
        "parameters": [
          {
            "name": "Authorization",
            "in": "header",
            "required": true,
            "example": "Bearer {{campsiteToken}}",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "Accept-Language",
            "in": "header",
            "required": true,
            "example": "en",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "Content-Type",
            "in": "header",
            "required": true,
            "example": "application/json",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "id",
            "in": "path",
            "required": true,
            "example": "664f1a2b3c4d5e6f7a8b9c0d",
            "description": "Campsite ID",
            "schema": {
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "required": [
                  "type"
                ],
                "properties": {
                  "type": {
                    "type": "string",
                    "enum": [
                      "manual",
                      "erp"
                    ]
                  },
                  "erpProvider": {
                    "type": "string",
                    "description": "Required when type = erp",
                    "example": "camping_care"
                  },
                  "erpConfig": {
                    "type": "object",
                    "description": "ERP credentials, required for type = erp",
                    "example": {
                      "apiKey": "YOUR_ERP_API_KEY"
                    }
                  }
                }
              },
              "examples": {
                "manual": {
                  "value": {
                    "type": "manual"
                  },
                  "summary": "Manual setup"
                },
                "erp": {
                  "value": {
                    "type": "erp",
                    "erpProvider": "camping_care",
                    "erpConfig": {
                      "apiKey": "YOUR_ERP_API_KEY"
                    }
                  },
                  "summary": "ERP integration"
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Success",
            "content": {
              "application/json": {
                "example": {
                  "success": true,
                  "message": "Availability updated successfully",
                  "data": {
                    "type": "manual",
                    "erpProvider": null,
                    "isConfigured": true
                  }
                }
              }
            }
          },
          "422": {
            "description": "Validation error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ValidationErrorResponse"
                }
              }
            }
          }
        },
        "security": [
          {
            "bearer": []
          }
        ]
      }
    },
    "/api/campground/{id}/switch-mode": {
      "post": {
        "summary": "Switch Availability Mode",
        "description": "Switches between manual and ERP mode.\n\nWARNING: Deletes all existing sub-categories and availability rules for this campsite. Irreversible.",
        "operationId": "switchMode",
        "tags": [
          "Step 2 Availability"
        ],
        "parameters": [
          {
            "name": "Authorization",
            "in": "header",
            "required": true,
            "example": "Bearer {{campsiteToken}}",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "Accept-Language",
            "in": "header",
            "required": true,
            "example": "en",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "id",
            "in": "path",
            "required": true,
            "example": "664f1a2b3c4d5e6f7a8b9c0d",
            "description": "Campsite ID",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Success",
            "content": {
              "application/json": {
                "example": {
                  "success": true,
                  "message": "Mode switched successfully",
                  "data": {
                    "deletedSubCategories": 3,
                    "deletedRules": 42
                  }
                }
              }
            }
          },
          "401": {
            "description": "Unauthorized"
          },
          "404": {
            "description": "Not found"
          }
        },
        "security": [
          {
            "bearer": []
          }
        ]
      }
    },
    "/api/campground/{id}/availability/rules": {
      "get": {
        "summary": "Get Availability Rules (calendar grid)",
        "description": "Returns per-date availability status for each sub-category in the given date range. Used to render the availability calendar.",
        "operationId": "getAvailabilityRules",
        "tags": [
          "Step 2 Availability Rules"
        ],
        "parameters": [
          {
            "name": "Authorization",
            "in": "header",
            "required": true,
            "example": "Bearer {{campsiteToken}}",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "Accept-Language",
            "in": "header",
            "required": true,
            "example": "en",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "id",
            "in": "path",
            "required": true,
            "example": "664f1a2b3c4d5e6f7a8b9c0d",
            "description": "Campsite ID",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "startDate",
            "in": "query",
            "required": true,
            "description": "Start date (YYYY-MM-DD)",
            "example": "2026-04-27",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "endDate",
            "in": "query",
            "required": true,
            "description": "End date (YYYY-MM-DD)",
            "example": "2026-05-10",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Success",
            "content": {
              "application/json": {
                "example": {
                  "success": true,
                  "message": "Availability rules retrieved",
                  "data": {
                    "startDate": "2026-04-27",
                    "endDate": "2026-05-10",
                    "categories": [
                      {
                        "categoryId": "64f1a2b3c4d5e6f7a8b9c0d1",
                        "categoryName": "Tent Pitch Standard",
                        "isVisible": true,
                        "dates": [
                          {
                            "date": "2026-04-27",
                            "status": "available",
                            "isUntilFurtherNotice": false
                          },
                          {
                            "date": "2026-04-28",
                            "status": "not_available",
                            "isUntilFurtherNotice": false
                          }
                        ]
                      }
                    ]
                  }
                }
              }
            }
          },
          "401": {
            "description": "Unauthorized"
          },
          "404": {
            "description": "Not found"
          }
        },
        "security": [
          {
            "bearer": []
          }
        ]
      },
      "put": {
        "summary": "Save / Update Availability Rules",
        "description": "Upserts availability rules for one or more sub-categories.\n\nstatus values: available | limited | low | not_available\n\nuntilFurtherNotice: true = open-ended rule (omit endDate).\n\nReplaces any existing rules overlapping the given date range for the specified categories.",
        "operationId": "upsertAvailabilityRules",
        "tags": [
          "Step 2 Availability Rules"
        ],
        "parameters": [
          {
            "name": "Authorization",
            "in": "header",
            "required": true,
            "example": "Bearer {{campsiteToken}}",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "Accept-Language",
            "in": "header",
            "required": true,
            "example": "en",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "Content-Type",
            "in": "header",
            "required": true,
            "example": "application/json",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "id",
            "in": "path",
            "required": true,
            "example": "664f1a2b3c4d5e6f7a8b9c0d",
            "description": "Campsite ID",
            "schema": {
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "required": [
                  "categories"
                ],
                "properties": {
                  "startDate": {
                    "type": "string",
                    "description": "Required unless untilFurtherNotice is true",
                    "example": "2026-04-27"
                  },
                  "endDate": {
                    "type": "string",
                    "description": "Required unless untilFurtherNotice is true",
                    "example": "2026-05-10"
                  },
                  "untilFurtherNotice": {
                    "type": "boolean",
                    "description": "Open-ended rule with no end date",
                    "example": false
                  },
                  "categories": {
                    "type": "array",
                    "minItems": 1,
                    "items": {
                      "type": "object",
                      "required": [
                        "categoryId",
                        "status"
                      ],
                      "properties": {
                        "categoryId": {
                          "type": "string",
                          "example": "64f1a2b3c4d5e6f7a8b9c0d1"
                        },
                        "status": {
                          "type": "string",
                          "enum": [
                            "available",
                            "limited",
                            "low",
                            "not_available"
                          ],
                          "example": "available"
                        },
                        "isVisible": {
                          "type": "boolean",
                          "default": true
                        }
                      }
                    }
                  }
                }
              },
              "examples": {
                "date_range": {
                  "value": {
                    "startDate": "2026-04-27",
                    "endDate": "2026-05-10",
                    "categories": [
                      {
                        "categoryId": "64f1a2b3c4d5e6f7a8b9c0d1",
                        "status": "available",
                        "isVisible": true
                      },
                      {
                        "categoryId": "64f1a2b3c4d5e6f7a8b9c0d2",
                        "status": "not_available",
                        "isVisible": false
                      }
                    ]
                  },
                  "summary": "Date range rule"
                },
                "ufn": {
                  "value": {
                    "untilFurtherNotice": true,
                    "categories": [
                      {
                        "categoryId": "64f1a2b3c4d5e6f7a8b9c0d1",
                        "status": "available"
                      }
                    ]
                  },
                  "summary": "Until further notice"
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Success",
            "content": {
              "application/json": {
                "example": {
                  "success": true,
                  "message": "Availability rules saved",
                  "data": {
                    "savedRules": 28,
                    "untilFurtherNotice": false,
                    "startDate": "2026-04-27",
                    "endDate": "2026-05-10"
                  }
                }
              }
            }
          },
          "401": {
            "description": "Unauthorized"
          },
          "422": {
            "description": "Validation error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ValidationErrorResponse"
                }
              }
            }
          }
        },
        "security": [
          {
            "bearer": []
          }
        ]
      }
    },
    "/api/availability": {
      "get": {
        "summary": "Get Availability Grid (public calendar)",
        "description": "Public spot-availability calendar. Dates with no rule for a sub-category are filled with not_available.",
        "tags": [
          "Step 2 Availability Rules"
        ],
        "parameters": [
          {
            "name": "fromDate",
            "in": "query",
            "required": true,
            "description": "Start date (YYYY-MM-DD)",
            "example": "2026-04-27",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "toDate",
            "in": "query",
            "required": true,
            "description": "End date (YYYY-MM-DD)",
            "example": "2026-05-10",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "Authorization",
            "in": "header",
            "required": true,
            "example": "Bearer {{campsiteToken}}",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "Accept-Language",
            "in": "header",
            "required": true,
            "example": "en",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Success",
            "content": {
              "application/json": {
                "example": {
                  "status": true,
                  "message": "availability.grid",
                  "data": {
                    "fromDate": "2026-04-27",
                    "toDate": "2026-05-10",
                    "subCategories": [
                      {
                        "id": "64f1a2b3c4d5e6f7a8b9c0d1",
                        "name": "Camping Pitch Standard",
                        "superCategories": [
                          {
                            "id": "64a1b2c3d4e5f6a7b8c9d0e1",
                            "name_en": "Tent",
                            "name_de": "Zelt"
                          }
                        ],
                        "availability": {
                          "2026-04-27": {
                            "status": "available",
                            "totalSlots": 10,
                            "availableSlots": 7,
                            "occupiedPercentage": 30
                          },
                          "2026-04-28": {
                            "status": "not_available",
                            "totalSlots": 0,
                            "availableSlots": 0,
                            "occupiedPercentage": 0
                          }
                        }
                      }
                    ]
                  }
                }
              }
            }
          }
        },
        "security": []
      }
    },
    "/api/campground/{id}/complete": {
      "post": {
        "summary": "Complete Setup",
        "description": "Validates Step 1 + Step 2 are complete, marks setupStatus as 'completed', generates public slug.\n\nPrerequisites:\n- step1_status = completed (name + location.address + description filled, at least 1 image)\n- step2_status = configured",
        "operationId": "completeSetup",
        "tags": [
          "Step 3 Activate"
        ],
        "parameters": [
          {
            "name": "Authorization",
            "in": "header",
            "required": true,
            "example": "Bearer {{campsiteToken}}",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "Accept-Language",
            "in": "header",
            "required": true,
            "example": "en",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "id",
            "in": "path",
            "required": true,
            "example": "664f1a2b3c4d5e6f7a8b9c0d",
            "description": "Campsite ID",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Success",
            "content": {
              "application/json": {
                "example": {
                  "success": true,
                  "message": "Campground setup completed successfully",
                  "data": {
                    "setup_status": "completed",
                    "slug": "alpine-hut-a3f2"
                  }
                }
              }
            }
          },
          "409": {
            "description": "Setup already active"
          },
          "422": {
            "description": "Step preconditions not met",
            "content": {
              "application/json": {
                "examples": {
                  "step1": {
                    "summary": "Step 1 incomplete",
                    "value": {
                      "success": false,
                      "message": "Step 1 is not completed. Fill in name, location, description and upload at least one image."
                    }
                  },
                  "step2": {
                    "summary": "Step 2 incomplete",
                    "value": {
                      "success": false,
                      "message": "Step 2 is not configured. Please set up availability first."
                    }
                  }
                }
              }
            }
          }
        },
        "security": [
          {
            "bearer": []
          }
        ]
      }
    },
    "/api/campground/{id}/activate": {
      "post": {
        "summary": "Activate Profile",
        "description": "Requires setupStatus = completed. Sets isActive = true and setupStatus = active.\n\nNote: does NOT make profile publicly visible. Use PATCH /:id/visibility separately.",
        "operationId": "activateProfile",
        "tags": [
          "Step 3 Activate"
        ],
        "parameters": [
          {
            "name": "Authorization",
            "in": "header",
            "required": true,
            "example": "Bearer {{campsiteToken}}",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "Accept-Language",
            "in": "header",
            "required": true,
            "example": "en",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "id",
            "in": "path",
            "required": true,
            "example": "664f1a2b3c4d5e6f7a8b9c0d",
            "description": "Campsite ID",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Success",
            "content": {
              "application/json": {
                "example": {
                  "success": true,
                  "message": "Profile activated successfully",
                  "data": {
                    "is_active": true,
                    "setup_status": "active"
                  }
                }
              }
            }
          },
          "422": {
            "description": "Setup not completed yet"
          }
        },
        "security": [
          {
            "bearer": []
          }
        ]
      }
    },
    "/api/campground/{id}/visibility": {
      "patch": {
        "summary": "Update Profile Visibility",
        "description": "Toggle public visibility. Requires isActive = true.",
        "operationId": "updateVisibility",
        "tags": [
          "Step 3 Activate"
        ],
        "parameters": [
          {
            "name": "Authorization",
            "in": "header",
            "required": true,
            "example": "Bearer {{campsiteToken}}",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "Accept-Language",
            "in": "header",
            "required": true,
            "example": "en",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "Content-Type",
            "in": "header",
            "required": true,
            "example": "application/json",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "id",
            "in": "path",
            "required": true,
            "example": "664f1a2b3c4d5e6f7a8b9c0d",
            "description": "Campsite ID",
            "schema": {
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "required": [
                  "is_visible"
                ],
                "properties": {
                  "is_visible": {
                    "type": "boolean",
                    "example": true
                  }
                }
              },
              "example": {
                "is_visible": true
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Success",
            "content": {
              "application/json": {
                "example": {
                  "success": true,
                  "message": "Visibility updated successfully",
                  "data": {
                    "is_visible": true
                  }
                }
              }
            }
          },
          "422": {
            "description": "Profile not yet active"
          }
        },
        "security": [
          {
            "bearer": []
          }
        ]
      }
    },
    "/api/campground/public/{slug}": {
      "get": {
        "summary": "Get Public Profile",
        "description": "Unauthenticated. Only works when isActive = true AND isVisible = true.",
        "operationId": "getPublicProfile",
        "tags": [
          "Public Profile"
        ],
        "parameters": [
          {
            "name": "slug",
            "in": "path",
            "required": true,
            "example": "alpine-hut-a3f2",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Success",
            "content": {
              "application/json": {
                "example": {
                  "success": true,
                  "message": "Public profile retrieved successfully",
                  "data": {
                    "campground_name": "Alpine Hut",
                    "short_description": "<p>A beautiful alpine campsite.</p>",
                    "location": {
                      "latitude": 47.8095,
                      "longitude": 13.055,
                      "address": "Salzburg, Austria"
                    },
                    "cover_image_url": "http://localhost:3000/media/campsites/cover/image.jpg",
                    "links": {
                      "website_url": "https://www.alpinehut.at",
                      "instagram_url": null,
                      "facebook_url": null,
                      "youtube_url": null,
                      "twitter_url": null,
                      "booking_url": null,
                      "contact_url": "https://www.alpinehut.at/contact"
                    },
                    "media": {
                      "cover": {
                        "url": "http://localhost:3000/media/campsites/cover/image.jpg"
                      },
                      "gallery": [
                        {
                          "url": "http://localhost:3000/media/campsites/gallery/image.jpg",
                          "mediaCategory": "image"
                        }
                      ]
                    },
                    "faqs": [
                      {
                        "id": "666a...",
                        "question_en": "Are pets allowed?",
                        "question_de": "Sind Haustiere erlaubt?",
                        "answer_en": "Yes, on a leash.",
                        "answer_de": "Ja, an der Leine.",
                        "order": 1,
                        "isCustom": false,
                        "sourceFaqId": "666a000000000000000000a1"
                      }
                    ]
                  }
                }
              }
            }
          },
          "404": {
            "description": "Not found"
          }
        },
        "security": []
      }
    },
    "/api/sub-categories": {
      "get": {
        "summary": "List Sub-Categories",
        "description": "Returns all sub-categories for the authenticated campsite (manual and ERP-synced).",
        "tags": [
          "Sub-Categories"
        ],
        "parameters": [
          {
            "name": "Authorization",
            "in": "header",
            "required": true,
            "example": "Bearer {{campsiteToken}}",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "Accept-Language",
            "in": "header",
            "required": true,
            "example": "en",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Success",
            "content": {
              "application/json": {
                "example": {
                  "success": true,
                  "message": "Sub-categories retrieved successfully",
                  "data": [
                    {
                      "id": "64f1a2b3c4d5e6f7a8b9c0d4",
                      "name": "Tent Pitch",
                      "erpCategoryId": null,
                      "superCategories": [
                        {
                          "id": "64a1b2c3d4e5f6a7b8c9d0e1",
                          "name_en": "Tent",
                          "name_de": "Zelt",
                          "icon": "tent.svg"
                        }
                      ]
                    }
                  ]
                }
              }
            }
          },
          "401": {
            "description": "Unauthorized"
          }
        },
        "security": [
          {
            "bearer": []
          }
        ]
      },
      "post": {
        "summary": "Create Manual Sub-Category",
        "description": "name must be unique per campsite (case-insensitive). erpCategoryId is always null for manual categories.",
        "tags": [
          "Sub-Categories"
        ],
        "parameters": [
          {
            "name": "Authorization",
            "in": "header",
            "required": true,
            "example": "Bearer {{campsiteToken}}",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "Accept-Language",
            "in": "header",
            "required": true,
            "example": "en",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "Content-Type",
            "in": "header",
            "required": true,
            "example": "application/json",
            "schema": {
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "required": [
                  "name"
                ],
                "properties": {
                  "name": {
                    "type": "string",
                    "example": "Tent Pitch"
                  }
                }
              },
              "example": {
                "name": "Tent Pitch"
              }
            }
          }
        },
        "responses": {
          "201": {
            "description": "Created",
            "content": {
              "application/json": {
                "example": {
                  "success": true,
                  "message": "Sub-category created successfully",
                  "data": {
                    "id": "64f1a2b3c4d5e6f7a8b9c0d4",
                    "name": "Tent Pitch",
                    "erpCategoryId": null,
                    "superCategories": [
                      {
                        "id": "64a1b2c3d4e5f6a7b8c9d0e1",
                        "name_en": "Tent",
                        "name_de": "Zelt",
                        "icon": "tent.svg"
                      }
                    ]
                  }
                }
              }
            }
          },
          "401": {
            "description": "Unauthorized"
          },
          "409": {
            "description": "Name already exists",
            "content": {
              "application/json": {
                "example": {
                  "success": false,
                  "message": "A sub-category with this name already exists."
                }
              }
            }
          },
          "422": {
            "description": "Validation error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ValidationErrorResponse"
                }
              }
            }
          }
        },
        "security": [
          {
            "bearer": []
          }
        ]
      }
    },
    "/api/sub-categories/{id}": {
      "patch": {
        "summary": "Update Manual Sub-Category",
        "description": "Rename. Returns 403 if ERP-synced (erpCategoryId is not null).",
        "tags": [
          "Sub-Categories"
        ],
        "parameters": [
          {
            "name": "Authorization",
            "in": "header",
            "required": true,
            "example": "Bearer {{campsiteToken}}",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "Accept-Language",
            "in": "header",
            "required": true,
            "example": "en",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "Content-Type",
            "in": "header",
            "required": true,
            "example": "application/json",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "id",
            "in": "path",
            "required": true,
            "example": "664f1a2b3c4d5e6f7a8b9c0d",
            "description": "Sub-category ID",
            "schema": {
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "required": [
                  "name"
                ],
                "properties": {
                  "name": {
                    "type": "string",
                    "example": "Deluxe Tent Pitch"
                  }
                }
              },
              "example": {
                "name": "Deluxe Tent Pitch"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Success",
            "content": {
              "application/json": {
                "example": {
                  "success": true,
                  "message": "Sub-category updated successfully",
                  "data": {
                    "id": "64f...",
                    "name": "Deluxe Tent Pitch",
                    "erpCategoryId": null
                  }
                }
              }
            }
          },
          "403": {
            "description": "Only manually created categories can be edited",
            "content": {
              "application/json": {
                "example": {
                  "success": false,
                  "message": "Only manually created categories can be edited or deleted."
                }
              }
            }
          },
          "404": {
            "description": "Not found"
          },
          "409": {
            "description": "Conflict"
          },
          "422": {
            "description": "Validation error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ValidationErrorResponse"
                }
              }
            }
          }
        },
        "security": [
          {
            "bearer": []
          }
        ]
      },
      "delete": {
        "summary": "Delete Manual Sub-Category",
        "description": "Hard-deletes. Cascade: all AvailabilityRule documents also deleted. Returns 403 if ERP-synced.",
        "tags": [
          "Sub-Categories"
        ],
        "parameters": [
          {
            "name": "Authorization",
            "in": "header",
            "required": true,
            "example": "Bearer {{campsiteToken}}",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "Accept-Language",
            "in": "header",
            "required": true,
            "example": "en",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "id",
            "in": "path",
            "required": true,
            "example": "664f1a2b3c4d5e6f7a8b9c0d",
            "description": "Sub-category ID",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Success",
            "content": {
              "application/json": {
                "example": {
                  "success": true,
                  "message": "Sub-category deleted successfully",
                  "data": null
                }
              }
            }
          },
          "403": {
            "description": "Only manually created categories can be deleted"
          },
          "404": {
            "description": "Not found"
          }
        },
        "security": [
          {
            "bearer": []
          }
        ]
      }
    },
    "/api/sub-categories/map": {
      "put": {
        "summary": "Map Sub-Categories to Super-Categories (single or bulk)",
        "description": "Maps one or many sub-categories to their super-categories.\n- Fully replaces mappedSuperCategoryIds ($set, not $addToSet)\n- Pass superCategoryIds: [] to clear a mapping\n- All superCategoryIds validated before any write\n- Works for both ERP-synced and manual categories",
        "tags": [
          "Sub-Categories"
        ],
        "parameters": [
          {
            "name": "Authorization",
            "in": "header",
            "required": true,
            "example": "Bearer {{campsiteToken}}",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "Accept-Language",
            "in": "header",
            "required": true,
            "example": "en",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "Content-Type",
            "in": "header",
            "required": true,
            "example": "application/json",
            "schema": {
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "required": [
                  "mappings"
                ],
                "properties": {
                  "mappings": {
                    "type": "array",
                    "minItems": 1,
                    "items": {
                      "type": "object",
                      "required": [
                        "subCategoryId",
                        "superCategoryIds"
                      ],
                      "properties": {
                        "subCategoryId": {
                          "type": "string"
                        },
                        "superCategoryIds": {
                          "type": "array",
                          "items": {
                            "type": "string"
                          }
                        }
                      }
                    }
                  }
                }
              },
              "example": {
                "mappings": [
                  {
                    "subCategoryId": "64f1a2b3c4d5e6f7a8b9c0d1",
                    "superCategoryIds": [
                      "64a1b2c3d4e5f6a7b8c9d0e1",
                      "64a1b2c3d4e5f6a7b8c9d0e2"
                    ]
                  },
                  {
                    "subCategoryId": "64f1a2b3c4d5e6f7a8b9c0d2",
                    "superCategoryIds": []
                  }
                ]
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Success",
            "content": {
              "application/json": {
                "example": {
                  "status": true,
                  "message": "subCategory.mappingUpdated",
                  "data": {
                    "updated": 2,
                    "results": [
                      {
                        "id": "64f1a2b3c4d5e6f7a8b9c0d1",
                        "mappedSuperCategoryIds": [
                          "64a1b2c3d4e5f6a7b8c9d0e1"
                        ]
                      }
                    ]
                  }
                }
              }
            }
          },
          "404": {
            "description": "Not found"
          },
          "422": {
            "description": "Validation error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ValidationErrorResponse"
                }
              }
            }
          }
        },
        "security": [
          {
            "bearer": []
          }
        ]
      }
    },
    "/api/sub-categories/sync": {
      "put": {
        "summary": "Sync Manual Categories (bulk save - 'Complete Configuration' button)",
        "description": "Single endpoint for the Complete Configuration button. Submits full current state of manual categories.\n\nDiff logic against DB state:\n- Item with id = update name + superCategoryIds\n- Item without id = create new manual category\n- Manual category in DB but absent from payload = hard delete + cascade AvailabilityRules\n\nPass categories: [] to delete ALL manual categories.\nOnly affects manual categories (erpCategoryId: null).",
        "tags": [
          "Sub-Categories"
        ],
        "parameters": [
          {
            "name": "Authorization",
            "in": "header",
            "required": true,
            "example": "Bearer {{campsiteToken}}",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "Accept-Language",
            "in": "header",
            "required": true,
            "example": "en",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "Content-Type",
            "in": "header",
            "required": true,
            "example": "application/json",
            "schema": {
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "required": [
                  "categories"
                ],
                "properties": {
                  "categories": {
                    "type": "array",
                    "items": {
                      "type": "object",
                      "required": [
                        "name",
                        "superCategoryIds"
                      ],
                      "properties": {
                        "id": {
                          "type": "string",
                          "description": "Omit for new categories"
                        },
                        "name": {
                          "type": "string"
                        },
                        "superCategoryIds": {
                          "type": "array",
                          "items": {
                            "type": "string"
                          }
                        }
                      }
                    }
                  }
                }
              },
              "example": {
                "categories": [
                  {
                    "id": "64f1a2b3c4d5e6f7a8b9c0d3",
                    "name": "Tent Pitch Premium",
                    "superCategoryIds": [
                      "64a1b2c3d4e5f6a7b8c9d0e1"
                    ]
                  },
                  {
                    "name": "Glamping Pod",
                    "superCategoryIds": [
                      "64a1b2c3d4e5f6a7b8c9d0e1",
                      "64a1b2c3d4e5f6a7b8c9d0e2"
                    ]
                  }
                ]
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Success",
            "content": {
              "application/json": {
                "example": {
                  "success": true,
                  "message": "Camping categories saved successfully",
                  "data": {
                    "created": 1,
                    "updated": 1,
                    "deleted": 1,
                    "categories": [
                      {
                        "id": "64f1a2b3c4d5e6f7a8b9c0d4",
                        "name": "Tent Pitch",
                        "erpCategoryId": null,
                        "superCategories": [
                          {
                            "id": "64a1b2c3d4e5f6a7b8c9d0e1",
                            "name_en": "Tent",
                            "name_de": "Zelt",
                            "icon": "tent.svg"
                          }
                        ]
                      }
                    ]
                  }
                }
              }
            }
          },
          "404": {
            "description": "Not found"
          },
          "409": {
            "description": "Conflict"
          },
          "422": {
            "description": "Validation error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ValidationErrorResponse"
                }
              }
            }
          }
        },
        "security": [
          {
            "bearer": []
          }
        ]
      }
    },
    "/api/camping-care/initiate": {
      "post": {
        "summary": "1. Initiate CampingCare OAuth",
        "description": "Starts the CampingCare OAuth flow.\n- Deletes stale pending sessions for this campsite\n- Creates new ERP OAuth session with 10-minute TTL\n- Returns sessionId (for polling) and installUrl (open in popup)\n\nsyncAt valid values: 30 | 60 | 120 (minutes)",
        "tags": [
          "CampingCare ERP"
        ],
        "parameters": [
          {
            "name": "Authorization",
            "in": "header",
            "required": true,
            "example": "Bearer {{campsiteToken}}",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "Accept-Language",
            "in": "header",
            "required": true,
            "example": "en",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "Content-Type",
            "in": "header",
            "required": true,
            "example": "application/json",
            "schema": {
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "required": [
                  "syncAt"
                ],
                "properties": {
                  "syncAt": {
                    "type": "integer",
                    "enum": [
                      30,
                      60,
                      120
                    ],
                    "example": 60
                  }
                }
              },
              "example": {
                "syncAt": 60
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Success",
            "content": {
              "application/json": {
                "example": {
                  "status": true,
                  "message": "campingCare.initiated",
                  "data": {
                    "sessionId": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
                    "installUrl": "https://app.camping.care/apps/1045/install?redirect_uri=YOUR_CALLBACK_URL"
                  }
                }
              }
            }
          },
          "401": {
            "description": "Unauthorized"
          },
          "422": {
            "description": "Validation error",
            "content": {
              "application/json": {
                "example": {
                  "success": false,
                  "message": "Validation failed",
                  "errors": [
                    {
                      "field": "syncAt",
                      "message": "\"syncAt\" must be one of [30, 60, 120]"
                    }
                  ]
                }
              }
            }
          }
        },
        "security": []
      }
    },
    "/api/camping-care/callback": {
      "get": {
        "summary": "2. OAuth Callback (public - called automatically by CampingCare)",
        "description": "DO NOT call manually. Called by CampingCare after user installs the app.\n\nOn success: saves credentials, runs initial sync, builds 14-day AvailabilityRules, schedules cron job, updates session to 'completed'.\n\nAlways responds with HTML that calls window.close() to close the popup.",
        "tags": [
          "CampingCare ERP"
        ],
        "parameters": [
          {
            "name": "authtoken",
            "in": "query",
            "required": true,
            "description": "OAuth token from CampingCare",
            "example": "SAMPLE_AUTH_TOKEN",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "admin_id",
            "in": "query",
            "required": true,
            "example": "12345",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "admin_uid",
            "in": "query",
            "required": true,
            "example": "abc123",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "chain_id",
            "in": "query",
            "required": true,
            "example": "0",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "app_id",
            "in": "query",
            "required": true,
            "example": "1045",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "Accept-Language",
            "in": "header",
            "required": true,
            "example": "en",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "HTML page that closes the popup",
            "content": {
              "text/html": {
                "example": "<!DOCTYPE html><html><body><script>window.close();</script></body></html>"
              }
            }
          }
        },
        "security": []
      }
    },
    "/api/camping-care/status/{sessionId}": {
      "get": {
        "summary": "3. Poll Session Status",
        "description": "Poll every 2 seconds after OAuth initiation.\n\nstatus values:\n- pending: OAuth not completed\n- completed: Auth saved, initial sync done\n- error: Something went wrong (see error field)",
        "tags": [
          "CampingCare ERP"
        ],
        "parameters": [
          {
            "name": "Authorization",
            "in": "header",
            "required": true,
            "example": "Bearer {{campsiteToken}}",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "Accept-Language",
            "in": "header",
            "required": true,
            "example": "en",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "sessionId",
            "in": "path",
            "required": true,
            "example": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Success",
            "content": {
              "application/json": {
                "examples": {
                  "pending": {
                    "value": {
                      "status": true,
                      "message": "campingCare.status",
                      "data": {
                        "status": "pending",
                        "error": null,
                        "categoriesCount": 0
                      }
                    },
                    "summary": "Still waiting"
                  },
                  "completed": {
                    "value": {
                      "status": true,
                      "message": "campingCare.status",
                      "data": {
                        "status": "completed",
                        "error": null,
                        "categoriesCount": 5
                      }
                    },
                    "summary": "Done"
                  }
                }
              }
            }
          },
          "404": {
            "description": "Not found"
          }
        },
        "security": []
      }
    },
    "/api/camping-care/sync": {
      "post": {
        "summary": "4. Manual Sync",
        "description": "Manually triggers full sync:\n- Fetches all accommodations from CampingCare API\n- Upserts SubCategory records (keyed on erpCategoryId)\n- Rebuilds 14-day AvailabilityRule window per sub-category\n- Soft-deletes sub-categories no longer in API response\n\nCron does the same automatically at syncAt interval.",
        "tags": [
          "CampingCare ERP"
        ],
        "parameters": [
          {
            "name": "Authorization",
            "in": "header",
            "required": true,
            "example": "Bearer {{campsiteToken}}",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "Accept-Language",
            "in": "header",
            "required": true,
            "example": "en",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Success",
            "content": {
              "application/json": {
                "example": {
                  "status": true,
                  "message": "campingCare.synced",
                  "data": {
                    "categoriesCount": 10
                  }
                }
              }
            }
          },
          "400": {
            "description": "No credentials found",
            "content": {
              "application/json": {
                "example": {
                  "status": false,
                  "message": "No CampingCare credentials found for this campsite"
                }
              }
            }
          }
        },
        "security": []
      }
    },
    "/api/campalot/initiate": {
      "post": {
        "summary": "1. Initiate Campalot Integration",
        "description": "Connects to Campalot API, runs initial sync, schedules recurring cron.\n- Creates/updates sub-categories\n- Builds 14-day AvailabilityRule per category\n\nsyncAt valid values: 30 | 60 | 120 (minutes)",
        "tags": [
          "Campalot ERP"
        ],
        "parameters": [
          {
            "name": "Authorization",
            "in": "header",
            "required": true,
            "example": "Bearer {{campsiteToken}}",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "Accept-Language",
            "in": "header",
            "required": true,
            "example": "en",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "Content-Type",
            "in": "header",
            "required": true,
            "example": "application/json",
            "schema": {
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "required": [
                  "baseUrl",
                  "toa",
                  "syncAt"
                ],
                "properties": {
                  "baseUrl": {
                    "type": "string",
                    "description": "Campalot API base URL",
                    "example": "https://api.campalot.example.com"
                  },
                  "toa": {
                    "type": "string",
                    "description": "Campalot auth token / API key",
                    "example": "YOUR_CAMPALOT_TOKEN"
                  },
                  "syncAt": {
                    "type": "integer",
                    "enum": [
                      30,
                      60,
                      120
                    ],
                    "description": "Sync interval in minutes",
                    "example": 60
                  }
                }
              },
              "example": {
                "baseUrl": "https://api.campalot.example.com",
                "toa": "YOUR_CAMPALOT_TOKEN",
                "syncAt": 60
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Success",
            "content": {
              "application/json": {
                "example": {
                  "status": true,
                  "message": "campalot.initiated",
                  "data": {
                    "categoriesCount": 8
                  }
                }
              }
            }
          },
          "400": {
            "description": "Invalid credentials or unreachable API"
          },
          "401": {
            "description": "Unauthorized"
          },
          "422": {
            "description": "Validation error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ValidationErrorResponse"
                }
              }
            }
          }
        },
        "security": []
      }
    },
    "/api/campalot/sync": {
      "post": {
        "summary": "2. Manual Sync (Campalot)",
        "description": "Manually triggers full sync from Campalot API.\n- Fetches latest availability data\n- Upserts AvailabilityRule documents\n- Soft-deletes categories no longer in response",
        "tags": [
          "Campalot ERP"
        ],
        "parameters": [
          {
            "name": "Authorization",
            "in": "header",
            "required": true,
            "example": "Bearer {{campsiteToken}}",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "Accept-Language",
            "in": "header",
            "required": true,
            "example": "en",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Success",
            "content": {
              "application/json": {
                "example": {
                  "status": true,
                  "message": "campalot.synced",
                  "data": {
                    "categoriesCount": 8
                  }
                }
              }
            }
          },
          "400": {
            "description": "No Campalot credentials found for this campsite"
          },
          "401": {
            "description": "Unauthorized"
          }
        },
        "security": []
      }
    }
  }
}