{
  "openapi": "3.1.0",
  "info": {
    "title": "weltweitversichert.com public API",
    "version": "1.0.0",
    "summary": "Public read APIs for international health-insurance comparison and visa checks.",
    "description": "Independent German-language brokerage for international health insurance. The read endpoints below do not require a bearer token or an API key. Do not send health data, policy numbers or other special-category data to the chat endpoint. Lead creation is a side effect and is not for automated use.",
    "contact": {
      "name": "Nomad Insurance Broker OÜ",
      "email": "hallo@weltweitversichert.com",
      "url": "https://weltweitversichert.com/contact/"
    }
  },
  "servers": [
    {
      "url": "https://weltweitversichert.com/api"
    }
  ],
  "tags": [
    { "name": "comparison", "description": "Public tariff catalog used by the comparison calculator." },
    { "name": "visa", "description": "Passport and destination visa lookup." }
  ],
  "paths": {
    "/vergleich": {
      "get": {
        "operationId": "getComparisonCatalog",
        "tags": ["comparison"],
        "summary": "Tariff catalog for the comparison calculator",
        "description": "Returns the normalized public catalog: providers, tariffs, price bands and benefit rows. No query parameters. No authentication. Prices are display data, not a binding offer.",
        "responses": {
          "200": {
            "description": "Catalog snapshot",
            "content": {
              "application/json": {
                "schema": { "$ref": "#/components/schemas/ComparisonCatalog" }
              }
            }
          },
          "503": {
            "description": "Catalog temporarily unavailable",
            "content": {
              "application/json": {
                "schema": { "$ref": "#/components/schemas/Error" }
              }
            }
          }
        }
      }
    },
    "/vergleich/quote": {
      "get": {
        "operationId": "quoteComparisonFromBirthdates",
        "tags": ["comparison"],
        "summary": "List prices calculated from birth dates and the start of cover",
        "description": "Age is the number of full years at beginn, computed from each geburtsdatum. Do not pass a guessed age. No authentication. Prices are display data, not an offer.",
        "parameters": [
          {
            "name": "land",
            "in": "query",
            "required": true,
            "description": "Destination country, German name or ISO 3166-1 alpha-2.",
            "schema": { "type": "string", "example": "TH" }
          },
          {
            "name": "geb",
            "in": "query",
            "required": true,
            "description": "Birth date, YYYY-MM-DD. Repeat the parameter or separate several dates with a comma.",
            "schema": { "type": "string", "example": "1990-04-12" }
          },
          {
            "name": "beginn",
            "in": "query",
            "required": true,
            "description": "Start of cover, YYYY-MM-DD. Age is calculated on this date.",
            "schema": { "type": "string", "example": "2026-12-01" }
          },
          {
            "name": "wunsch",
            "in": "query",
            "required": true,
            "description": "What the customer wants included, comma-separated: einzelzimmer, zahn, usa, ruecktransport, schwangerschaft, vorsorge, ambulant, stationaer. Use keine only after the customer said they need no extra benefit. Omit it and the response is the questions, not a price.",
            "schema": { "type": "string", "example": "einzelzimmer,zahn" }
          },
          {
            "name": "sb",
            "in": "query",
            "required": false,
            "description": "Maximum accepted deductible in EUR. Omit it to receive the available steps instead of a premium.",
            "schema": { "type": "number", "example": 500 }
          }
        ],
        "responses": {
          "200": {
            "description": "Quotes, or a prompt for the deductible if sb is missing",
            "content": {
              "application/json": {
                "schema": { "type": "object", "additionalProperties": true }
              }
            }
          },
          "400": {
            "description": "Birth date, start date or country is missing or unreadable",
            "content": {
              "application/json": {
                "schema": { "$ref": "#/components/schemas/Error" }
              }
            }
          },
          "503": {
            "description": "Catalog temporarily unavailable",
            "content": {
              "application/json": {
                "schema": { "$ref": "#/components/schemas/Error" }
              }
            }
          }
        }
      }
    },
    "/visa": {
      "get": {
        "operationId": "getVisaCheck",
        "tags": ["visa"],
        "summary": "Visa result for a passport and destination",
        "description": "ISO 3166-1 alpha-2 codes. Example: from=DE and to=TH. No authentication.",
        "parameters": [
          {
            "name": "from",
            "in": "query",
            "required": true,
            "description": "Passport country, ISO 3166-1 alpha-2.",
            "schema": { "type": "string", "minLength": 2, "maxLength": 2, "example": "DE" }
          },
          {
            "name": "to",
            "in": "query",
            "required": true,
            "description": "Destination country, ISO 3166-1 alpha-2.",
            "schema": { "type": "string", "minLength": 2, "maxLength": 2, "example": "TH" }
          }
        ],
        "responses": {
          "200": {
            "description": "Merged visa result",
            "content": {
              "application/json": {
                "schema": { "type": "object", "additionalProperties": true }
              }
            }
          },
          "400": {
            "description": "from or to is missing",
            "content": {
              "application/json": {
                "schema": { "$ref": "#/components/schemas/Error" }
              }
            }
          },
          "404": {
            "description": "Unknown country code",
            "content": {
              "application/json": {
                "schema": { "$ref": "#/components/schemas/Error" }
              }
            }
          }
        }
      }
    }
  },
  "components": {
    "schemas": {
      "Error": {
        "type": "object",
        "properties": {
          "error": { "type": "string" }
        },
        "required": ["error"]
      },
      "ComparisonCatalog": {
        "type": "object",
        "properties": {
          "standDatum": { "type": "string", "description": "ISO date of the catalog snapshot." },
          "providers": { "type": "array", "items": { "type": "object", "additionalProperties": true } },
          "tariffs": { "type": "array", "items": { "type": "object", "additionalProperties": true } },
          "prices": { "type": "array", "items": { "type": "object", "additionalProperties": true } }
        },
        "required": ["standDatum", "providers", "tariffs", "prices"]
      }
    }
  }
}
