{"openapi":"3.1.0","info":{"title":"SeguroMatch — cotizar para agentes de IA","version":"1.0.0","description":"Cotiza seguros de hogar, coche y moto en España en nombre de un cliente, con todos sus datos de una vez. Flujo: GET /api/agent/requisitos?ramo=… → pregunta al cliente todo en un mensaje → POST /api/agent/cotizaciones. Sin autenticación. No contrata ni cobra: el cliente recibe en su correo los precios y el enlace para contratar, y confirma con un código SMS. También disponible como servidor MCP en POST /api/agent/mcp. Privacidad: https://seguromatch.com/legal/politica-privacidad"},"servers":[{"url":"https://seguromatch.com"}],"paths":{"/api/agent/requisitos":{"get":{"operationId":"requisitos","summary":"Datos que hay que pedir al cliente para cotizar un ramo","parameters":[{"name":"ramo","in":"query","required":false,"schema":{"type":"string","enum":["hogar","coche","moto"]}}],"responses":{"200":{"description":"Requisitos del ramo (o índice sin ramo)"},"400":{"description":"Ramo no válido","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"},"mensaje":{"type":"string"},"errores":{"type":"array","items":{"type":"object"}},"request_id":{"type":"string"}}}}}}}}},"/api/agent/catalogo":{"get":{"operationId":"catalogo","summary":"Valores permitidos de un campo","parameters":[{"name":"tipo","in":"query","required":true,"schema":{"type":"string","enum":["document-types","genders","nationalities","marital-statuses","employment-statuses","home-property-types","home-build-materials","home-occupancies","home-locations","home-build-qualities","home-alarm-types","home-door-types","home-settlement-types","driving-license-types","fuel-types","car-use-types","annual-km-options","car-parking-types","motorcycle-garage-types","motorcycle-driving-experience","motorcycle-driving-license-types","car-insurance-companies","motorcycle-insurance-companies","motorcycle-engine-types","economic-occupations","home-uses","road-types","provinces","towns","vehicle-brands","vehicle-models","vehicle-versions"]}},{"name":"codigo_postal","in":"query","required":false,"schema":{"type":"string","pattern":"^\\d{5}$"}},{"name":"ramo","in":"query","required":false,"schema":{"type":"string","enum":["coche","moto"]}},{"name":"marca","in":"query","required":false,"schema":{"type":"string"}},{"name":"modelo","in":"query","required":false,"schema":{"type":"string"}},{"name":"motor","in":"query","required":false,"schema":{"type":"string"}}],"responses":{"200":{"description":"Valores del catálogo"},"400":{"description":"Parámetros no válidos","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"},"mensaje":{"type":"string"},"errores":{"type":"array","items":{"type":"object"}},"request_id":{"type":"string"}}}}}},"429":{"description":"Límite alcanzado","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"},"mensaje":{"type":"string"},"errores":{"type":"array","items":{"type":"object"}},"request_id":{"type":"string"}}}}}}}}},"/api/agent/cotizaciones":{"post":{"operationId":"cotizar","summary":"Cotizar con todos los datos del cliente","requestBody":{"required":true,"content":{"application/json":{"schema":{"oneOf":[{"$ref":"#/components/schemas/CreateHomeQuote"},{"$ref":"#/components/schemas/CreateCarQuote"},{"$ref":"#/components/schemas/CreateMotorcycleQuote"}],"discriminator":{"propertyName":"insurance_line","mapping":{"Home":"#/components/schemas/CreateHomeQuote","Car":"#/components/schemas/CreateCarQuote","Motorcycle":"#/components/schemas/CreateMotorcycleQuote"}}}}}},"responses":{"200":{"description":"Precios por aseguradora. El enlace para contratar va al correo del cliente.","content":{"application/json":{"schema":{"type":"object","properties":{"estado":{"type":"string","enum":["cotizado","sin_ofertas"]},"ramo":{"type":"string","enum":["Home","Car","Motorcycle"]},"referencia":{"type":"string"},"ofertas":{"type":"array","items":{"type":"object","properties":{"aseguradora":{"type":["string","null"]},"producto":{"type":["string","null"]},"modalidad":{"type":["string","null"]},"precio":{"type":"number"},"moneda":{"type":"string","enum":["EUR"]},"periodicidad":{"type":["string","null"]},"precio_anual_total":{"type":["number","null"]},"franquicia":{"type":["number","null"]},"es_estimacion":{"type":"boolean"}}}},"mejor_precio":{"type":["number","null"]},"siguiente_paso":{"type":"string"},"aviso":{"type":"string"},"request_id":{"type":"string"}}}}}},"400":{"description":"Faltan datos o son incorrectos: TODOS los errores juntos","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"},"mensaje":{"type":"string"},"errores":{"type":"array","items":{"type":"object"}},"request_id":{"type":"string"}}}}}},"403":{"description":"No se puede cotizar con estos datos","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"},"mensaje":{"type":"string"},"errores":{"type":"array","items":{"type":"object"}},"request_id":{"type":"string"}}}}}},"429":{"description":"Límite alcanzado (ver Retry-After)","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"},"mensaje":{"type":"string"},"errores":{"type":"array","items":{"type":"object"}},"request_id":{"type":"string"}}}}}},"503":{"description":"Canal apagado o consulta no disponible (ver Retry-After)","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"},"mensaje":{"type":"string"},"errores":{"type":"array","items":{"type":"object"}},"request_id":{"type":"string"}}}}}}}}}},"components":{"schemas":{"CreateHomeQuote":{"type":"object","description":"El cuerpo de la petición. Solo snake_case. Ningún campo obligatorio se rellena por defecto; una clave no documentada se rechaza.","properties":{"insurance_line":{"type":"string","enum":["Home"],"example":"Home","description":"Ramo a cotizar. Se espera: Home, Car o Motorcycle."},"effective_date":{"type":"string","format":"date","example":"2030-01-01","description":"Fecha de inicio del seguro. Obligatoria: ya no se pone \"hoy\", y una fecha pasada se rechaza en vez de corregirse. Se espera: fecha YYYY-MM-DD, hoy o posterior (día natural de España)."},"client_reference":{"type":"string","maxLength":100,"example":"EXP-2026-0042","description":"Tu referencia interna. Se devuelve en la respuesta y en los webhooks. No es una clave de idempotencia. Se espera: texto de hasta 100 caracteres."},"holder":{"$ref":"#/components/schemas/HomeHolder"},"risk":{"$ref":"#/components/schemas/HomeRisk"}},"required":["insurance_line","effective_date","holder","risk"],"additionalProperties":false},"HomeHolder":{"type":"object","description":"El tomador. Solo snake_case. Ningún campo obligatorio se rellena por defecto; una clave no documentada se rechaza. `nationality` es obligatorio con `holder.document_type` = Nie o Passport. `address` es obligatorio salvo que envíes `holder.address_same_as_risk: true`. `address` NO se envía con `holder.address_same_as_risk: true` (enviarlo es una contradicción: 400).","properties":{"document_type":{"type":"string","enum":["Dni","Nie","Passport"],"example":"Dni","description":"Tipo de documento de identidad. No se asume DNI. Se espera: Dni, Nie o Passport (empresas con Cif no se cotizan por esta API). Valores: GET /api/v1/catalog?type=document-types."},"document_id":{"type":"string","minLength":5,"maxLength":20,"example":"12345678Z","description":"Número del documento. Su formato debe corresponder al tipo declarado. Se espera: DNI: 8 dígitos + letra · NIE: X/Y/Z + 7 dígitos + letra · Pasaporte: mínimo 5 caracteres."},"name":{"type":"string","minLength":1,"maxLength":60,"example":"Juan","description":"Nombre, tal como figura en el documento. Se espera: texto, solo letras."},"surname":{"type":"string","minLength":1,"maxLength":60,"example":"García","description":"Primer apellido. Se espera: texto, solo letras."},"surname2":{"type":"string","maxLength":60,"example":"López","description":"Segundo apellido. EXCEPCIÓN documentada: en Hogar, con DNI y sin segundo apellido, se duplica el primero. Se espera: texto, solo letras."},"birth_date":{"type":"string","format":"date","example":"1985-03-15","description":"Fecha de nacimiento. Se espera: fecha YYYY-MM-DD, no futura."},"gender":{"type":"string","enum":["Male","Female"],"example":"Female","description":"Sexo. No se asume \"Male\". Se espera: Male o Female. Valores: GET /api/v1/catalog?type=genders."},"marital_status":{"type":"string","enum":["Single","Married","UnmarriedPartner","Divorced","Widowed"],"example":"Married","description":"Estado civil. Determina la prima en varias aseguradoras; no se asume \"Single\". Se espera: un valor del catálogo marital-statuses. Valores: GET /api/v1/catalog?type=marital-statuses."},"nationality":{"type":"string","enum":["ESP","GBR","FRA","DEU","ITA","PRT","ROU","MAR","COL","ECU","ARG","VEN","PER","BOL","BRA","CHN","PAK","UKR","RUS","POL","BGR","NLD","BEL","SWE","NOR","DNK","FIN","IRL","CHE","AUT","USA","CAN","MEX","CHL","URY","PRY","CUB","DOM","HND","SLV","GTM","NIC","PAN","CRI","DZA","SEN","NGA","GHA","PHL","IND","JPN","KOR","AUS","NZL","TUR","ISR","EGY","ZAF"],"example":"ESP","description":"Nacionalidad ISO-3. Obligatoria con NIE o pasaporte. Con DNI es española por definición: si la mandas, tiene que ser ESP. Se espera: código ISO-3 del catálogo nationalities. OBLIGATORIO con `holder.document_type` = Nie o Passport. Valores: GET /api/v1/catalog?type=nationalities."},"employment_status":{"type":"string","enum":["Employee","SelfEmployed","CivilServant","Retired","Student","Unemployed","HomeWorker"],"example":"Employee","description":"Situación laboral. No se asume \"Employee\". Se espera: un valor del catálogo employment-statuses. Valores: GET /api/v1/catalog?type=employment-statuses."},"economic_occupation":{"type":"string","pattern":"^\\d{4}$","example":"2611","description":"Profesión, código CNO-11 de 4 dígitos. No se asume 2612. En Hogar es obligatoria siempre: para una persona inactiva, la última profesión ejercida. Se espera: 4 dígitos, en texto, del catálogo economic-occupations. Valores: GET /api/v1/catalog?type=economic-occupations."},"phone":{"type":"string","example":"+34644182739","description":"Móvil español del tomador. Se espera: 9 dígitos empezando por 6 o 7; se admiten +34 y 0034."},"email":{"type":"string","maxLength":100,"pattern":"^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$","example":"cliente@example.com","description":"Correo del tomador. Es el destino de la documentación de la póliza: ahora se valida su formato. Se espera: dirección de correo válida."},"address_same_as_risk":{"type":"boolean","example":true,"description":"true = el tomador vive en la vivienda asegurada: se usa la dirección de `risk.address`. Ya no se copia en silencio. Si lo mandas a true, no envíes `holder.address`. Se espera: true o false."},"address":{"$ref":"#/components/schemas/HolderAddress"}},"required":["document_type","document_id","name","surname","birth_date","gender","marital_status","employment_status","economic_occupation","phone","email"],"additionalProperties":false,"x-required-when":[{"field":"nationality","when":"con `holder.document_type` = Nie o Passport","depends_on":["holder.document_type"]},{"field":"address","when":"salvo que envíes `holder.address_same_as_risk: true`","depends_on":["holder.address_same_as_risk"]}],"x-forbidden-when":[{"field":"address","when":"con `holder.address_same_as_risk: true`","depends_on":["holder.address_same_as_risk"]}]},"HolderAddress":{"type":"object","description":"La dirección del tomador. Solo snake_case. Ningún campo obligatorio se rellena por defecto; una clave no documentada se rechaza.","properties":{"postal_code":{"type":"string","pattern":"^\\d{5}$","example":"28001","description":"Código postal español. Se espera: 5 dígitos, en texto."},"town_id":{"type":"integer","minimum":1,"example":28079,"description":"Municipio (catálogo towns). Solo se deduce del código postal si este tiene UN único municipio; si tiene varios, es obligatorio. Se espera: entero del catálogo towns. Valores: GET /api/v1/catalog?type=towns."},"road_type":{"type":"string","enum":["Acequia","Atajo","Autovia","Avenida","Barriada","Barrio","Calle","Callejon","Camino","Carretera","Comarcal","Conjunto","Glorieta","GranVia","Grupo","Kilometro","Nacional","Pasaje","Paseo","Pasillo","Paso","Plaza","Poligono","Rambla","Riera","Ronda","Sendero","Torrente","Travesera","Travesia","Urbanizacion","Via","Vial"],"example":"Calle","description":"Tipo de vía. Un valor no reconocido ya no se convierte en \"Calle\". Se espera: un valor del catálogo road-types. Valores: GET /api/v1/catalog?type=road-types."},"road_name":{"type":"string","minLength":1,"maxLength":100,"example":"Gran Vía","description":"Nombre de la vía. No se inventa \"Principal\". Se espera: texto."},"road_number":{"type":"string","minLength":1,"maxLength":10,"example":"12","description":"Número de la vía, en texto. Usa \"S/N\" si la vía no tiene número. No se inventa \"1\". Se espera: texto (p. ej. \"12\", \"12B\", \"S/N\")."}},"required":["postal_code","road_type","road_name","road_number"],"additionalProperties":false},"HomeRisk":{"type":"object","description":"La vivienda. Solo snake_case. Ningún campo obligatorio se rellena por defecto; una clave no documentada se rechaza.","properties":{"area_m2":{"type":"number","minimum":10,"maximum":2000,"example":85,"description":"Superficie construida en m². No se asume 80. Se espera: número entre 10 y 2000."},"year_built":{"type":"integer","minimum":1700,"maximum":2026,"example":1995,"description":"Año de construcción. No se asume 2000. Se espera: año completo, no futuro."},"last_reform_year":{"type":["integer","null"],"minimum":1900,"maximum":2026,"example":null,"description":"Año de la última reforma, o null para declarar que NO se ha reformado. Omitirlo ya no significa \"no reformada\". Se espera: año entre 1900 y el actual, o null. null = la vivienda no se ha reformado."},"rooms":{"type":"integer","minimum":1,"maximum":50,"example":3,"description":"Número de habitaciones. No se asume 3. Se espera: entero entre 1 y 50."},"use":{"type":"string","enum":["Owner","Rental","Tenant"],"example":"Owner","description":"Régimen: propietario que la habita, propietario que la alquila, o inquilino. No se asume \"Owner\". Se espera: Owner, Rental o Tenant. Valores: GET /api/v1/catalog?type=home-uses."},"occupancy":{"type":"string","enum":["MainResidence","SecondHome"],"example":"MainResidence","description":"Vivienda habitual o segunda residencia. No se asume \"MainResidence\". Se espera: un valor del catálogo home-occupancies. Valores: GET /api/v1/catalog?type=home-occupancies."},"dwelling_type":{"type":"string","enum":["MiddleFloor","TopFloor","GroundFloor","DetachedHouse","TerracedHouse"],"example":"MiddleFloor","description":"Tipo de vivienda. No se asume \"MiddleFloor\". Se espera: un valor del catálogo home-property-types. Valores: GET /api/v1/catalog?type=home-property-types."},"location":{"type":"string","enum":["CityCentre","ResidentialDevelopment","Depopulated"],"example":"CityCentre","description":"Ubicación. No se asume \"CityCentre\". Se espera: un valor del catálogo home-locations. Valores: GET /api/v1/catalog?type=home-locations."},"materials":{"type":"string","enum":["NonCombustible","LessThan25Combustible","MoreThan25Combustible"],"example":"NonCombustible","description":"Materiales de construcción. No se asume \"NonCombustible\". Se espera: un valor del catálogo home-build-materials. Valores: GET /api/v1/catalog?type=home-build-materials."},"build_quality":{"type":"string","enum":["Basic","Normal","High","Luxury"],"example":"Normal","description":"Calidad de construcción. No se asume \"Normal\". Se espera: un valor del catálogo home-build-qualities. Valores: GET /api/v1/catalog?type=home-build-qualities."},"alarm":{"type":"string","enum":["NoAlarm","ConnectedAlarm","NonConnectedAlarm"],"example":"NoAlarm","description":"Alarma. Declara NoAlarm explícitamente si no hay. Se espera: un valor del catálogo home-alarm-types. Valores: GET /api/v1/catalog?type=home-alarm-types."},"owner_is_holder":{"type":"boolean","example":true,"description":"¿El tomador ocupa el papel de propietario en la póliza? Ya no se asume: hay que mandarlo. Con false (un propietario distinto del tomador) el caso NO se puede cotizar por esta API. Inquilinos (`use: \"Tenant\"`) incluidos: mandan true, porque aquí «propietario» es el papel en la póliza, no la propiedad del inmueble. La plataforma declara al tomador en ese papel en los tres regímenes, igual que la web, y el casero de un inquilino no se envía a ninguna aseguradora. Se espera: true, también con use \"Tenant\" (false se rechaza como caso no soportado)."},"buildings_limit":{"type":"number","minimum":0,"maximum":5000000,"example":150000,"description":"Capital de continente en euros. No se asume 125.000. Propietario y arrendador: mayor que 0. Un inquilino puede declarar 0. Se espera: número ≥ 0."},"contents_limit":{"type":"number","minimum":0,"maximum":2000000,"example":25000,"description":"Capital de contenido en euros. No se asume 20.000. 0 es un valor válido y se respeta. Se espera: número ≥ 0."},"settlement_type":{"type":"string","enum":["ReplacementValue","FirstRisk"],"example":"ReplacementValue","description":"Tipo de indemnización. No se asume \"ReplacementValue\". Se espera: un valor del catálogo home-settlement-types. Valores: GET /api/v1/catalog?type=home-settlement-types."},"security_main_door":{"type":"boolean","example":false,"description":"Puerta principal blindada o acorazada. Si no se envía, no se declara la medida (sin descuento). Se espera: true o false."},"security_windows":{"type":"boolean","example":false,"description":"Rejas o protección en ventanas. Si no se envía, no se declara la medida (sin descuento). Se espera: true o false."},"cadastral_reference":{"type":"string","minLength":14,"maxLength":20,"example":"9872023VH5797S0001WX","description":"Referencia catastral. Identifica el inmueble; no mueve la prima. Se espera: texto de 14 a 20 caracteres."},"address":{"$ref":"#/components/schemas/HolderAddress"}},"required":["area_m2","year_built","last_reform_year","rooms","use","occupancy","dwelling_type","location","materials","build_quality","alarm","owner_is_holder","buildings_limit","contents_limit","settlement_type","address"],"additionalProperties":false},"CreateCarQuote":{"type":"object","description":"El cuerpo de la petición. Solo snake_case. Ningún campo obligatorio se rellena por defecto; una clave no documentada se rechaza. `owner` es obligatorio con `owner_same_as_holder: false`. `owner` NO se envía con `owner_same_as_holder: true` (enviarlo es una contradicción: 400).","properties":{"insurance_line":{"type":"string","enum":["Car"],"example":"Car","description":"Ramo a cotizar. Se espera: Home, Car o Motorcycle."},"effective_date":{"type":"string","format":"date","example":"2030-01-01","description":"Fecha de inicio del seguro. Obligatoria: ya no se pone \"hoy\", y una fecha pasada se rechaza en vez de corregirse. Se espera: fecha YYYY-MM-DD, hoy o posterior (día natural de España)."},"client_reference":{"type":"string","maxLength":100,"example":"EXP-2026-0042","description":"Tu referencia interna. Se devuelve en la respuesta y en los webhooks. No es una clave de idempotencia. Se espera: texto de hasta 100 caracteres."},"owner_same_as_holder":{"type":"boolean","example":true,"description":"¿El propietario del vehículo es el tomador? Ya no se asume que sí. Con false hay que enviar `owner`. Se espera: true o false."},"holder":{"$ref":"#/components/schemas/Holder"},"vehicle":{"$ref":"#/components/schemas/CarVehicle"},"driver":{"$ref":"#/components/schemas/CarDriver"},"owner":{"$ref":"#/components/schemas/Owner"}},"required":["insurance_line","effective_date","owner_same_as_holder","holder","vehicle","driver"],"additionalProperties":false,"x-required-when":[{"field":"owner","when":"con `owner_same_as_holder: false`","depends_on":["owner_same_as_holder"]}],"x-forbidden-when":[{"field":"owner","when":"con `owner_same_as_holder: true`","depends_on":["owner_same_as_holder"]}]},"Holder":{"type":"object","description":"El tomador. Solo snake_case. Ningún campo obligatorio se rellena por defecto; una clave no documentada se rechaza. `surname2` es obligatorio con `holder.document_type: \"Dni\"`. `nationality` es obligatorio con `holder.document_type` = Nie o Passport. `economic_occupation` es obligatorio con `holder.employment_status` en activo (Employee, SelfEmployed o CivilServant).","properties":{"document_type":{"type":"string","enum":["Dni","Nie","Passport"],"example":"Dni","description":"Tipo de documento de identidad. No se asume DNI. Se espera: Dni, Nie o Passport (empresas con Cif no se cotizan por esta API). Valores: GET /api/v1/catalog?type=document-types."},"document_id":{"type":"string","minLength":5,"maxLength":20,"example":"12345678Z","description":"Número del documento. Su formato debe corresponder al tipo declarado. Se espera: DNI: 8 dígitos + letra · NIE: X/Y/Z + 7 dígitos + letra · Pasaporte: mínimo 5 caracteres."},"name":{"type":"string","minLength":1,"maxLength":60,"example":"Juan","description":"Nombre, tal como figura en el documento. Se espera: texto, solo letras."},"surname":{"type":"string","minLength":1,"maxLength":60,"example":"García","description":"Primer apellido. Se espera: texto, solo letras."},"surname2":{"type":"string","maxLength":60,"example":"López","description":"Segundo apellido. Obligatorio con DNI. Se espera: texto, solo letras. OBLIGATORIO con `holder.document_type: \"Dni\"`."},"birth_date":{"type":"string","format":"date","example":"1985-03-15","description":"Fecha de nacimiento. Se espera: fecha YYYY-MM-DD, no futura."},"gender":{"type":"string","enum":["Male","Female"],"example":"Female","description":"Sexo. No se asume \"Male\". Se espera: Male o Female. Valores: GET /api/v1/catalog?type=genders."},"marital_status":{"type":"string","enum":["Single","Married","UnmarriedPartner","Divorced","Widowed"],"example":"Married","description":"Estado civil. Determina la prima en varias aseguradoras; no se asume \"Single\". Se espera: un valor del catálogo marital-statuses. Valores: GET /api/v1/catalog?type=marital-statuses."},"nationality":{"type":"string","enum":["ESP","GBR","FRA","DEU","ITA","PRT","ROU","MAR","COL","ECU","ARG","VEN","PER","BOL","BRA","CHN","PAK","UKR","RUS","POL","BGR","NLD","BEL","SWE","NOR","DNK","FIN","IRL","CHE","AUT","USA","CAN","MEX","CHL","URY","PRY","CUB","DOM","HND","SLV","GTM","NIC","PAN","CRI","DZA","SEN","NGA","GHA","PHL","IND","JPN","KOR","AUS","NZL","TUR","ISR","EGY","ZAF"],"example":"ESP","description":"Nacionalidad ISO-3. Obligatoria con NIE o pasaporte. Con DNI es española por definición: si la mandas, tiene que ser ESP. Se espera: código ISO-3 del catálogo nationalities. OBLIGATORIO con `holder.document_type` = Nie o Passport. Valores: GET /api/v1/catalog?type=nationalities."},"employment_status":{"type":"string","enum":["Employee","SelfEmployed","CivilServant","Retired","Student","Unemployed","HomeWorker"],"example":"Employee","description":"Situación laboral. No se asume \"Employee\". Se espera: un valor del catálogo employment-statuses. Valores: GET /api/v1/catalog?type=employment-statuses."},"economic_occupation":{"type":"string","pattern":"^\\d{4}$","example":"2611","description":"Profesión, código CNO-11 de 4 dígitos. No se asume 2612. Obligatoria para personas en activo; un jubilado, estudiante o parado no la envía. Se espera: 4 dígitos, en texto, del catálogo economic-occupations. OBLIGATORIO con `holder.employment_status` en activo (Employee, SelfEmployed o CivilServant). Valores: GET /api/v1/catalog?type=economic-occupations."},"phone":{"type":"string","example":"+34644182739","description":"Móvil español del tomador. Se espera: 9 dígitos empezando por 6 o 7; se admiten +34 y 0034."},"email":{"type":"string","maxLength":100,"pattern":"^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$","example":"cliente@example.com","description":"Correo del tomador. Es el destino de la documentación de la póliza: ahora se valida su formato. Se espera: dirección de correo válida."},"address":{"$ref":"#/components/schemas/HolderAddress"}},"required":["document_type","document_id","name","surname","birth_date","gender","marital_status","employment_status","phone","email","address"],"additionalProperties":false,"x-required-when":[{"field":"surname2","when":"con `holder.document_type: \"Dni\"`","depends_on":["holder.document_type"]},{"field":"nationality","when":"con `holder.document_type` = Nie o Passport","depends_on":["holder.document_type"]},{"field":"economic_occupation","when":"con `holder.employment_status` en activo (Employee, SelfEmployed o CivilServant)","depends_on":["holder.employment_status"]}]},"CarVehicle":{"type":"object","description":"El vehículo. Solo snake_case. Ningún campo obligatorio se rellena por defecto; una clave no documentada se rechaza. `purchase_date` es obligatorio salvo con `vehicle.purchase_type: \"planned\"`. `purchase_date` NO se envía con `vehicle.purchase_type: \"planned\"` (aún no comprado) (enviarlo es una contradicción: 400).","properties":{"registration_plate":{"type":"string","minLength":4,"maxLength":10,"example":"1234BCD","description":"Matrícula española. Identifica el vehículo solo si corresponde a UNA versión; si tiene varias, envía `version_id`. Se espera: matrícula española (p. ej. 1234BCD)."},"brand_id":{"type":"string","maxLength":20,"example":"00016","description":"Marca (catálogo vehicle-brands). Se espera: id del catálogo. Valores: GET /api/v1/catalog?type=vehicle-brands."},"model_id":{"type":"string","maxLength":20,"example":"0001600012","description":"Modelo (catálogo vehicle-models). Se espera: id del catálogo. Valores: GET /api/v1/catalog?type=vehicle-models."},"version_id":{"type":"string","maxLength":20,"example":"06310010019","description":"Versión exacta (Base7). Obligatoria si no hay matrícula o si la matrícula tiene varias versiones. Se espera: id del catálogo vehicle-versions. Valores: GET /api/v1/catalog?type=vehicle-versions."},"brand_name":{"type":"string","maxLength":80,"example":"SEAT","description":"Nombre de la marca (solo informativo). Se espera: texto."},"model_name":{"type":"string","maxLength":80,"example":"LEON","description":"Nombre del modelo (solo informativo). Se espera: texto."},"version_name":{"type":"string","maxLength":160,"example":"1.5 TSI 130 CV","description":"Nombre de la versión (solo informativo). Se espera: texto."},"registration_date":{"type":"string","format":"date","example":"2019-06-01","description":"Primera matriculación. Solo se deduce de la matrícula si esta identifica un único vehículo; si no, es obligatoria. Se espera: fecha YYYY-MM-DD, no futura."},"purchase_type":{"type":"string","enum":["already_owned","new","used_dealer","used_private","planned"],"example":"already_owned","description":"Cómo se adquirió. Ya no se deduce de las fechas: algunas aseguradoras tarifican distinto según el caso. Se espera: already_owned, new, used_dealer, used_private o planned."},"purchase_date":{"type":"string","format":"date","example":"2019-06-15","description":"Fecha de compra. Ya no se deduce de la matriculación. No se envía con purchase_type \"planned\". Se espera: fecha YYYY-MM-DD, no futura e igual o posterior a la matriculación. OBLIGATORIO salvo con `vehicle.purchase_type: \"planned\"`. No se envía con `vehicle.purchase_type: \"planned\"` (aún no comprado)."},"use":{"type":"string","enum":["Private","Professional","PublicService"],"example":"Private","description":"Uso del vehículo. No se asume \"Private\": declara el uso real. Se espera: un valor del catálogo car-use-types. Valores: GET /api/v1/catalog?type=car-use-types."},"annual_km":{"type":"string","enum":["UpTo5000km","UpTo10000km","UpTo15000km","UpTo20000km","UpTo25000km","UpTo30000km","MoreThan30000km"],"example":"UpTo10000km","description":"Kilómetros anuales. No se asume \"UpTo15000km\". Se espera: un valor del catálogo annual-km-options. Valores: GET /api/v1/catalog?type=annual-km-options."},"parking_type":{"type":"string","enum":["PrivateGarage","CommunalParking","NoGarage"],"example":"NoGarage","description":"Dónde duerme el coche. Determina la prima; no se asume \"NoGarage\". Se espera: un valor del catálogo car-parking-types. Valores: GET /api/v1/catalog?type=car-parking-types."},"fuel_type":{"type":"string","enum":["Gasoline","Diesel","Electric","Hybrid","PlugInHybrid","Lpg","Cng"],"example":"Gasoline","description":"Combustible. Se toma del catálogo cuando el vehículo queda identificado. Se espera: un valor del catálogo fuel-types. Valores: GET /api/v1/catalog?type=fuel-types."},"retail_price":{"type":"number","minimum":1,"maximum":5000000,"example":24500,"description":"Precio de venta al público, en euros. Se espera: número > 0."}},"required":["purchase_type","use","annual_km","parking_type"],"additionalProperties":false,"x-required-when":[{"field":"purchase_date","when":"salvo con `vehicle.purchase_type: \"planned\"`","depends_on":["vehicle.purchase_type"]}],"x-forbidden-when":[{"field":"purchase_date","when":"con `vehicle.purchase_type: \"planned\"` (aún no comprado)","depends_on":["vehicle.purchase_type"]}]},"CarDriver":{"type":"object","description":"El conductor habitual. Solo snake_case. Ningún campo obligatorio se rellena por defecto; una clave no documentada se rechaza. `document_type` es obligatorio con `driver.same_as_holder: false`. `document_id` es obligatorio con `driver.same_as_holder: false`. `name` es obligatorio con `driver.same_as_holder: false`. `surname` es obligatorio con `driver.same_as_holder: false`. `surname2` es obligatorio con `driver.same_as_holder: false` y `driver.document_type: \"Dni\"`. `birth_date` es obligatorio con `driver.same_as_holder: false`. `gender` es obligatorio con `driver.same_as_holder: false`. `marital_status` es obligatorio con `driver.same_as_holder: false`. `nationality` es obligatorio con `driver.same_as_holder: false` y `driver.document_type` = Nie o Passport. `previous_company_code` es obligatorio con `driver.previously_insured: true`. `previous_policy_number` es obligatorio con `driver.previously_insured: true`. `previous_plate` es obligatorio con `driver.previously_insured: true`. `total_years_insured` es obligatorio con `driver.previously_insured: true`. `years_in_previous_company` es obligatorio con `driver.previously_insured: true`. `years_without_accidents` es obligatorio con `driver.previously_insured: true`. `last_five_years_accidents` es obligatorio con `driver.previously_insured: true`. `parking_fine_only` es obligatorio con `driver.penalties: \"1\"`. `document_type` NO se envía con `driver.same_as_holder: true` (enviarlo es una contradicción: 400). `document_id` NO se envía con `driver.same_as_holder: true` (enviarlo es una contradicción: 400). `name` NO se envía con `driver.same_as_holder: true` (enviarlo es una contradicción: 400). `surname` NO se envía con `driver.same_as_holder: true` (enviarlo es una contradicción: 400). `surname2` NO se envía con `driver.same_as_holder: true` (enviarlo es una contradicción: 400). `birth_date` NO se envía con `driver.same_as_holder: true` (enviarlo es una contradicción: 400). `gender` NO se envía con `driver.same_as_holder: true` (enviarlo es una contradicción: 400). `marital_status` NO se envía con `driver.same_as_holder: true` (enviarlo es una contradicción: 400). `nationality` NO se envía con `driver.same_as_holder: true` (enviarlo es una contradicción: 400). `previous_company_code` NO se envía con `driver.previously_insured: false` (enviarlo es una contradicción: 400). `previous_policy_number` NO se envía con `driver.previously_insured: false` (enviarlo es una contradicción: 400). `previous_plate` NO se envía con `driver.previously_insured: false` (enviarlo es una contradicción: 400). `total_years_insured` NO se envía con `driver.previously_insured: false` (enviarlo es una contradicción: 400). `years_in_previous_company` NO se envía con `driver.previously_insured: false` (enviarlo es una contradicción: 400). `years_without_accidents` NO se envía con `driver.previously_insured: false` (enviarlo es una contradicción: 400). `last_five_years_accidents` NO se envía con `driver.previously_insured: false` (enviarlo es una contradicción: 400).","properties":{"same_as_holder":{"type":"boolean","example":true,"description":"¿El conductor habitual es el tomador? Ya no se asume que sí. Con false, envía su identidad en este mismo bloque. Se espera: true o false."},"document_type":{"type":"string","enum":["Dni","Nie","Passport"],"example":"Dni","description":"Tipo de documento de identidad. No se asume DNI. Se espera: Dni, Nie o Passport (empresas con Cif no se cotizan por esta API). OBLIGATORIO con `driver.same_as_holder: false`. No se envía con `driver.same_as_holder: true`. Valores: GET /api/v1/catalog?type=document-types."},"document_id":{"type":"string","minLength":5,"maxLength":20,"example":"12345678Z","description":"Número del documento. Su formato debe corresponder al tipo declarado. Se espera: DNI: 8 dígitos + letra · NIE: X/Y/Z + 7 dígitos + letra · Pasaporte: mínimo 5 caracteres. OBLIGATORIO con `driver.same_as_holder: false`. No se envía con `driver.same_as_holder: true`."},"name":{"type":"string","minLength":1,"maxLength":60,"example":"Juan","description":"Nombre, tal como figura en el documento. Se espera: texto, solo letras. OBLIGATORIO con `driver.same_as_holder: false`. No se envía con `driver.same_as_holder: true`."},"surname":{"type":"string","minLength":1,"maxLength":60,"example":"García","description":"Primer apellido. Se espera: texto, solo letras. OBLIGATORIO con `driver.same_as_holder: false`. No se envía con `driver.same_as_holder: true`."},"surname2":{"type":"string","maxLength":60,"example":"López","description":"Segundo apellido. Obligatorio con DNI. Se espera: texto, solo letras. OBLIGATORIO con `driver.same_as_holder: false` y `driver.document_type: \"Dni\"`. No se envía con `driver.same_as_holder: true`."},"birth_date":{"type":"string","format":"date","example":"1985-03-15","description":"Fecha de nacimiento. Se espera: fecha YYYY-MM-DD, no futura. OBLIGATORIO con `driver.same_as_holder: false`. No se envía con `driver.same_as_holder: true`."},"gender":{"type":"string","enum":["Male","Female"],"example":"Female","description":"Sexo. No se asume \"Male\". Se espera: Male o Female. OBLIGATORIO con `driver.same_as_holder: false`. No se envía con `driver.same_as_holder: true`. Valores: GET /api/v1/catalog?type=genders."},"marital_status":{"type":"string","enum":["Single","Married","UnmarriedPartner","Divorced","Widowed"],"example":"Married","description":"Estado civil. Determina la prima en varias aseguradoras; no se asume \"Single\". Se espera: un valor del catálogo marital-statuses. OBLIGATORIO con `driver.same_as_holder: false`. No se envía con `driver.same_as_holder: true`. Valores: GET /api/v1/catalog?type=marital-statuses."},"nationality":{"type":"string","enum":["ESP","GBR","FRA","DEU","ITA","PRT","ROU","MAR","COL","ECU","ARG","VEN","PER","BOL","BRA","CHN","PAK","UKR","RUS","POL","BGR","NLD","BEL","SWE","NOR","DNK","FIN","IRL","CHE","AUT","USA","CAN","MEX","CHL","URY","PRY","CUB","DOM","HND","SLV","GTM","NIC","PAN","CRI","DZA","SEN","NGA","GHA","PHL","IND","JPN","KOR","AUS","NZL","TUR","ISR","EGY","ZAF"],"example":"ESP","description":"Nacionalidad ISO-3. Obligatoria con NIE o pasaporte. Con DNI es española por definición: si la mandas, tiene que ser ESP. Se espera: código ISO-3 del catálogo nationalities. OBLIGATORIO con `driver.same_as_holder: false` y `driver.document_type` = Nie o Passport. No se envía con `driver.same_as_holder: true`. Valores: GET /api/v1/catalog?type=nationalities."},"driving_license_type":{"type":"string","enum":["B","C1","C"],"example":"B","description":"Tipo de carnet. No se asume \"B\". Se espera: un valor del catálogo driving-license-types. Valores: GET /api/v1/catalog?type=driving-license-types."},"driving_license_date":{"type":"string","format":"date","example":"2008-04-20","description":"Fecha de expedición del carnet. Ya no se asume \"hace 5 años\". Se espera: fecha YYYY-MM-DD, no futura."},"driving_license_country":{"type":"string","enum":["ESP","GBR","FRA","DEU","ITA","PRT","ROU","MAR","COL","ECU","ARG","VEN","PER","BOL","BRA","CHN","PAK","UKR","RUS","POL","BGR","NLD","BEL","SWE","NOR","DNK","FIN","IRL","CHE","AUT","USA","CAN","MEX","CHL","URY","PRY","CUB","DOM","HND","SLV","GTM","NIC","PAN","CRI","DZA","SEN","NGA","GHA","PHL","IND","JPN","KOR","AUS","NZL","TUR","ISR","EGY","ZAF"],"example":"ESP","description":"País de expedición del carnet (ISO-3). Hoy solo se cotizan carnets españoles: cualquier otro se rechaza como caso no soportado, en vez de declararse español. Se espera: ESP. Valores: GET /api/v1/catalog?type=nationalities."},"previously_insured":{"type":"boolean","example":true,"description":"¿Tiene o ha tenido un seguro de coche a su nombre? Ya no se asume que no. Con true, el historial completo es obligatorio; con false no se envía y se declara 0 años. Se espera: true o false."},"previous_company_code":{"type":"string","minLength":1,"maxLength":20,"example":"C0109","description":"Aseguradora anterior. Los códigos de coche y de moto son catálogos distintos. Se espera: código del catálogo car-insurance-companies. OBLIGATORIO con `driver.previously_insured: true`. No se envía con `driver.previously_insured: false`. Valores: GET /api/v1/catalog?type=car-insurance-companies."},"previous_policy_number":{"type":"string","minLength":5,"maxLength":40,"example":"POL-123456","description":"Número de la póliza anterior. Se espera: texto de al menos 5 caracteres. OBLIGATORIO con `driver.previously_insured: true`. No se envía con `driver.previously_insured: false`."},"previous_plate":{"type":"string","minLength":4,"maxLength":10,"example":"1234BCD","description":"Matrícula del vehículo de la póliza anterior. Ya no se asume que es el mismo vehículo: si lo es, repite su matrícula. Se espera: matrícula española. OBLIGATORIO con `driver.previously_insured: true`. No se envía con `driver.previously_insured: false`."},"total_years_insured":{"type":"integer","minimum":0,"maximum":80,"example":5,"description":"Años totales asegurado. Con `previously_insured: false` no se envía, o se envía 0. Se espera: entero ≥ 0. OBLIGATORIO con `driver.previously_insured: true`. No se envía con `driver.previously_insured: false` (se admite 0, que dice lo mismo)."},"years_in_previous_company":{"type":"integer","minimum":0,"maximum":80,"example":5,"description":"Años en la aseguradora anterior. No puede superar total_years_insured. Con `previously_insured: false` no se envía, o se envía 0. Se espera: entero ≥ 0. OBLIGATORIO con `driver.previously_insured: true`. No se envía con `driver.previously_insured: false` (se admite 0, que dice lo mismo)."},"years_without_accidents":{"type":"integer","minimum":0,"maximum":80,"example":5,"description":"Años sin siniestros con culpa. Con `previously_insured: false` no se envía, o se envía 0. Se espera: entero ≥ 0. OBLIGATORIO con `driver.previously_insured: true`. No se envía con `driver.previously_insured: false` (se admite 0, que dice lo mismo)."},"last_five_years_accidents":{"type":"integer","minimum":0,"maximum":20,"example":5,"description":"Siniestros con culpa en los últimos 5 años. Con `previously_insured: false` no se envía, o se envía 0. Se espera: entero ≥ 0. OBLIGATORIO con `driver.previously_insured: true`. No se envía con `driver.previously_insured: false` (se admite 0, que dice lo mismo)."},"penalties":{"type":"string","enum":["0","1","2","3","4","5","6"],"example":"0","description":"Multas de tráfico de los últimos 3 años, en texto. \"6\" = más de cinco. Ya no se declara \"ninguna\" en tu nombre. Se espera: \"0\" a \"6\", en texto."},"parking_fine_only":{"type":"boolean","example":false,"description":"Con UNA sola multa: ¿fue solo de aparcamiento? Una aseguradora lo distingue. Se espera: true o false. OBLIGATORIO con `driver.penalties: \"1\"`."},"points_lost":{"type":"boolean","example":false,"description":"¿Perdió puntos del carnet el último año? Es una declaración del conductor: ya no se omite. Se espera: true o false."}},"required":["same_as_holder","driving_license_type","driving_license_date","driving_license_country","previously_insured","penalties","points_lost"],"additionalProperties":false,"x-required-when":[{"field":"document_type","when":"con `driver.same_as_holder: false`","depends_on":["driver.same_as_holder"]},{"field":"document_id","when":"con `driver.same_as_holder: false`","depends_on":["driver.same_as_holder"]},{"field":"name","when":"con `driver.same_as_holder: false`","depends_on":["driver.same_as_holder"]},{"field":"surname","when":"con `driver.same_as_holder: false`","depends_on":["driver.same_as_holder"]},{"field":"surname2","when":"con `driver.same_as_holder: false` y `driver.document_type: \"Dni\"`","depends_on":["driver.same_as_holder","driver.document_type"]},{"field":"birth_date","when":"con `driver.same_as_holder: false`","depends_on":["driver.same_as_holder"]},{"field":"gender","when":"con `driver.same_as_holder: false`","depends_on":["driver.same_as_holder"]},{"field":"marital_status","when":"con `driver.same_as_holder: false`","depends_on":["driver.same_as_holder"]},{"field":"nationality","when":"con `driver.same_as_holder: false` y `driver.document_type` = Nie o Passport","depends_on":["driver.same_as_holder","driver.document_type"]},{"field":"previous_company_code","when":"con `driver.previously_insured: true`","depends_on":["driver.previously_insured"]},{"field":"previous_policy_number","when":"con `driver.previously_insured: true`","depends_on":["driver.previously_insured"]},{"field":"previous_plate","when":"con `driver.previously_insured: true`","depends_on":["driver.previously_insured"]},{"field":"total_years_insured","when":"con `driver.previously_insured: true`","depends_on":["driver.previously_insured"]},{"field":"years_in_previous_company","when":"con `driver.previously_insured: true`","depends_on":["driver.previously_insured"]},{"field":"years_without_accidents","when":"con `driver.previously_insured: true`","depends_on":["driver.previously_insured"]},{"field":"last_five_years_accidents","when":"con `driver.previously_insured: true`","depends_on":["driver.previously_insured"]},{"field":"parking_fine_only","when":"con `driver.penalties: \"1\"`","depends_on":["driver.penalties"]}],"x-forbidden-when":[{"field":"document_type","when":"con `driver.same_as_holder: true`","depends_on":["driver.same_as_holder"]},{"field":"document_id","when":"con `driver.same_as_holder: true`","depends_on":["driver.same_as_holder"]},{"field":"name","when":"con `driver.same_as_holder: true`","depends_on":["driver.same_as_holder"]},{"field":"surname","when":"con `driver.same_as_holder: true`","depends_on":["driver.same_as_holder"]},{"field":"surname2","when":"con `driver.same_as_holder: true`","depends_on":["driver.same_as_holder"]},{"field":"birth_date","when":"con `driver.same_as_holder: true`","depends_on":["driver.same_as_holder"]},{"field":"gender","when":"con `driver.same_as_holder: true`","depends_on":["driver.same_as_holder"]},{"field":"marital_status","when":"con `driver.same_as_holder: true`","depends_on":["driver.same_as_holder"]},{"field":"nationality","when":"con `driver.same_as_holder: true`","depends_on":["driver.same_as_holder"]},{"field":"previous_company_code","when":"con `driver.previously_insured: false`","depends_on":["driver.previously_insured"]},{"field":"previous_policy_number","when":"con `driver.previously_insured: false`","depends_on":["driver.previously_insured"]},{"field":"previous_plate","when":"con `driver.previously_insured: false`","depends_on":["driver.previously_insured"]},{"field":"total_years_insured","when":"con `driver.previously_insured: false`","depends_on":["driver.previously_insured"],"zero_allowed":true},{"field":"years_in_previous_company","when":"con `driver.previously_insured: false`","depends_on":["driver.previously_insured"],"zero_allowed":true},{"field":"years_without_accidents","when":"con `driver.previously_insured: false`","depends_on":["driver.previously_insured"],"zero_allowed":true},{"field":"last_five_years_accidents","when":"con `driver.previously_insured: false`","depends_on":["driver.previously_insured"],"zero_allowed":true}]},"Owner":{"type":"object","description":"El propietario. Solo snake_case. Ningún campo obligatorio se rellena por defecto; una clave no documentada se rechaza. `document_type` es obligatorio con `owner_same_as_holder: false`. `document_id` es obligatorio con `owner_same_as_holder: false`. `name` es obligatorio con `owner_same_as_holder: false`. `surname` es obligatorio con `owner_same_as_holder: false`. `surname2` es obligatorio con `owner_same_as_holder: false` y `owner.document_type: \"Dni\"`. `birth_date` es obligatorio con `owner_same_as_holder: false`. `gender` es obligatorio con `owner_same_as_holder: false`. `marital_status` es obligatorio con `owner_same_as_holder: false`. `nationality` es obligatorio con `owner_same_as_holder: false` y `owner.document_type` = Nie o Passport.","properties":{"document_type":{"type":"string","enum":["Dni","Nie","Passport"],"example":"Dni","description":"Tipo de documento de identidad. No se asume DNI. Se espera: Dni, Nie o Passport (empresas con Cif no se cotizan por esta API). OBLIGATORIO con `owner_same_as_holder: false`. Valores: GET /api/v1/catalog?type=document-types."},"document_id":{"type":"string","minLength":5,"maxLength":20,"example":"12345678Z","description":"Número del documento. Su formato debe corresponder al tipo declarado. Se espera: DNI: 8 dígitos + letra · NIE: X/Y/Z + 7 dígitos + letra · Pasaporte: mínimo 5 caracteres. OBLIGATORIO con `owner_same_as_holder: false`."},"name":{"type":"string","minLength":1,"maxLength":60,"example":"Juan","description":"Nombre, tal como figura en el documento. Se espera: texto, solo letras. OBLIGATORIO con `owner_same_as_holder: false`."},"surname":{"type":"string","minLength":1,"maxLength":60,"example":"García","description":"Primer apellido. Se espera: texto, solo letras. OBLIGATORIO con `owner_same_as_holder: false`."},"surname2":{"type":"string","maxLength":60,"example":"López","description":"Segundo apellido. Obligatorio con DNI. Se espera: texto, solo letras. OBLIGATORIO con `owner_same_as_holder: false` y `owner.document_type: \"Dni\"`."},"birth_date":{"type":"string","format":"date","example":"1985-03-15","description":"Fecha de nacimiento. Se espera: fecha YYYY-MM-DD, no futura. OBLIGATORIO con `owner_same_as_holder: false`."},"gender":{"type":"string","enum":["Male","Female"],"example":"Female","description":"Sexo. No se asume \"Male\". Se espera: Male o Female. OBLIGATORIO con `owner_same_as_holder: false`. Valores: GET /api/v1/catalog?type=genders."},"marital_status":{"type":"string","enum":["Single","Married","UnmarriedPartner","Divorced","Widowed"],"example":"Married","description":"Estado civil. Determina la prima en varias aseguradoras; no se asume \"Single\". Se espera: un valor del catálogo marital-statuses. OBLIGATORIO con `owner_same_as_holder: false`. Valores: GET /api/v1/catalog?type=marital-statuses."},"nationality":{"type":"string","enum":["ESP","GBR","FRA","DEU","ITA","PRT","ROU","MAR","COL","ECU","ARG","VEN","PER","BOL","BRA","CHN","PAK","UKR","RUS","POL","BGR","NLD","BEL","SWE","NOR","DNK","FIN","IRL","CHE","AUT","USA","CAN","MEX","CHL","URY","PRY","CUB","DOM","HND","SLV","GTM","NIC","PAN","CRI","DZA","SEN","NGA","GHA","PHL","IND","JPN","KOR","AUS","NZL","TUR","ISR","EGY","ZAF"],"example":"ESP","description":"Nacionalidad ISO-3. Obligatoria con NIE o pasaporte. Con DNI es española por definición: si la mandas, tiene que ser ESP. Se espera: código ISO-3 del catálogo nationalities. OBLIGATORIO con `owner_same_as_holder: false` y `owner.document_type` = Nie o Passport. Valores: GET /api/v1/catalog?type=nationalities."}},"required":[],"additionalProperties":false,"x-required-when":[{"field":"document_type","when":"con `owner_same_as_holder: false`","depends_on":["owner_same_as_holder"]},{"field":"document_id","when":"con `owner_same_as_holder: false`","depends_on":["owner_same_as_holder"]},{"field":"name","when":"con `owner_same_as_holder: false`","depends_on":["owner_same_as_holder"]},{"field":"surname","when":"con `owner_same_as_holder: false`","depends_on":["owner_same_as_holder"]},{"field":"surname2","when":"con `owner_same_as_holder: false` y `owner.document_type: \"Dni\"`","depends_on":["owner_same_as_holder","owner.document_type"]},{"field":"birth_date","when":"con `owner_same_as_holder: false`","depends_on":["owner_same_as_holder"]},{"field":"gender","when":"con `owner_same_as_holder: false`","depends_on":["owner_same_as_holder"]},{"field":"marital_status","when":"con `owner_same_as_holder: false`","depends_on":["owner_same_as_holder"]},{"field":"nationality","when":"con `owner_same_as_holder: false` y `owner.document_type` = Nie o Passport","depends_on":["owner_same_as_holder","owner.document_type"]}]},"CreateMotorcycleQuote":{"type":"object","description":"El cuerpo de la petición. Solo snake_case. Ningún campo obligatorio se rellena por defecto; una clave no documentada se rechaza. `owner` es obligatorio con `owner_same_as_holder: false`. `owner` NO se envía con `owner_same_as_holder: true` (enviarlo es una contradicción: 400).","properties":{"insurance_line":{"type":"string","enum":["Motorcycle"],"example":"Motorcycle","description":"Ramo a cotizar. Se espera: Home, Car o Motorcycle."},"effective_date":{"type":"string","format":"date","example":"2030-01-01","description":"Fecha de inicio del seguro. Obligatoria: ya no se pone \"hoy\", y una fecha pasada se rechaza en vez de corregirse. Se espera: fecha YYYY-MM-DD, hoy o posterior (día natural de España)."},"client_reference":{"type":"string","maxLength":100,"example":"EXP-2026-0042","description":"Tu referencia interna. Se devuelve en la respuesta y en los webhooks. No es una clave de idempotencia. Se espera: texto de hasta 100 caracteres."},"owner_same_as_holder":{"type":"boolean","example":true,"description":"¿El propietario del vehículo es el tomador? Ya no se asume que sí. Con false hay que enviar `owner`. Se espera: true o false."},"holder":{"$ref":"#/components/schemas/Holder"},"vehicle":{"$ref":"#/components/schemas/MotoVehicle"},"driver":{"$ref":"#/components/schemas/MotoDriver"},"owner":{"$ref":"#/components/schemas/Owner"}},"required":["insurance_line","effective_date","owner_same_as_holder","holder","vehicle","driver"],"additionalProperties":false,"x-required-when":[{"field":"owner","when":"con `owner_same_as_holder: false`","depends_on":["owner_same_as_holder"]}],"x-forbidden-when":[{"field":"owner","when":"con `owner_same_as_holder: true`","depends_on":["owner_same_as_holder"]}]},"MotoVehicle":{"type":"object","description":"La moto. Solo snake_case. Ningún campo obligatorio se rellena por defecto; una clave no documentada se rechaza.","properties":{"code":{"type":"string","maxLength":20,"example":"02360100002","description":"Versión exacta (Base7, catálogo vehicle-versions con line=Motorcycle). Obligatoria si no hay matrícula o si la matrícula tiene varias versiones. Se espera: id del catálogo vehicle-versions. Valores: GET /api/v1/catalog?type=vehicle-versions."},"registration_plate":{"type":"string","minLength":4,"maxLength":10,"example":"5678BCD","description":"Matrícula española. Se valida siempre que se envía. Se espera: matrícula española."},"registration_date":{"type":"string","format":"date","example":"2020-01-01","description":"Primera matriculación. Solo se deduce de la matrícula; si no se puede, es obligatoria. Se espera: fecha YYYY-MM-DD, no futura."},"purchase_date":{"type":"string","format":"date","example":"2020-02-01","description":"Fecha de compra. Ya no se deduce de la matriculación. Se espera: fecha YYYY-MM-DD, no futura e igual o posterior a la matriculación."},"circulation_postal_code":{"type":"string","pattern":"^\\d{5}$","example":"28001","description":"Código postal por donde circula habitualmente. Ya no se asume el del tomador: si es el mismo, repítelo. Se espera: 5 dígitos, en texto."},"circulation_town_id":{"type":"integer","minimum":1,"example":28079,"description":"Municipio de circulación. Solo se deduce si el código postal tiene un único municipio. Se espera: entero del catálogo towns. Valores: GET /api/v1/catalog?type=towns."},"garage_type_id":{"type":"string","enum":["PrivateGarage","CommunalParking","NoGarage"],"example":"NoGarage","description":"Dónde duerme la moto. Determina la prima. Se espera: un valor del catálogo motorcycle-garage-types. Valores: GET /api/v1/catalog?type=motorcycle-garage-types."},"kilometers_per_year":{"type":"integer","minimum":1,"maximum":200000,"example":5000,"description":"Kilómetros al año. Se espera: entero > 0."}},"required":["purchase_date","circulation_postal_code","garage_type_id","kilometers_per_year"],"additionalProperties":false},"MotoDriver":{"type":"object","description":"El conductor habitual. Solo snake_case. Ningún campo obligatorio se rellena por defecto; una clave no documentada se rechaza. `document_type` es obligatorio con `driver.same_as_holder: false`. `document_id` es obligatorio con `driver.same_as_holder: false`. `name` es obligatorio con `driver.same_as_holder: false`. `surname` es obligatorio con `driver.same_as_holder: false`. `surname2` es obligatorio con `driver.same_as_holder: false` y `driver.document_type: \"Dni\"`. `birth_date` es obligatorio con `driver.same_as_holder: false`. `gender` es obligatorio con `driver.same_as_holder: false`. `marital_status` es obligatorio con `driver.same_as_holder: false`. `nationality` es obligatorio con `driver.same_as_holder: false` y `driver.document_type` = Nie o Passport. `previous_motorcycle_code` es obligatorio con `driver.driving_experience_id: \"OtherMotorcycle\"`. `car_license_date` es obligatorio con `driver.has_car_license: true`. `previous_company_code` es obligatorio con `driver.previously_insured: true`. `previous_policy_number` es obligatorio con `driver.previously_insured: true`. `previous_plate` es obligatorio con `driver.previously_insured: true`. `total_years_insured` es obligatorio con `driver.previously_insured: true`. `years_in_previous_company` es obligatorio con `driver.previously_insured: true`. `years_without_accidents` es obligatorio con `driver.previously_insured: true`. `last_five_years_accidents` es obligatorio con `driver.previously_insured: true`. `document_type` NO se envía con `driver.same_as_holder: true` (enviarlo es una contradicción: 400). `document_id` NO se envía con `driver.same_as_holder: true` (enviarlo es una contradicción: 400). `name` NO se envía con `driver.same_as_holder: true` (enviarlo es una contradicción: 400). `surname` NO se envía con `driver.same_as_holder: true` (enviarlo es una contradicción: 400). `surname2` NO se envía con `driver.same_as_holder: true` (enviarlo es una contradicción: 400). `birth_date` NO se envía con `driver.same_as_holder: true` (enviarlo es una contradicción: 400). `gender` NO se envía con `driver.same_as_holder: true` (enviarlo es una contradicción: 400). `marital_status` NO se envía con `driver.same_as_holder: true` (enviarlo es una contradicción: 400). `nationality` NO se envía con `driver.same_as_holder: true` (enviarlo es una contradicción: 400). `previous_company_code` NO se envía con `driver.previously_insured: false` (enviarlo es una contradicción: 400). `previous_policy_number` NO se envía con `driver.previously_insured: false` (enviarlo es una contradicción: 400). `previous_plate` NO se envía con `driver.previously_insured: false` (enviarlo es una contradicción: 400). `total_years_insured` NO se envía con `driver.previously_insured: false` (enviarlo es una contradicción: 400). `years_in_previous_company` NO se envía con `driver.previously_insured: false` (enviarlo es una contradicción: 400). `years_without_accidents` NO se envía con `driver.previously_insured: false` (enviarlo es una contradicción: 400). `last_five_years_accidents` NO se envía con `driver.previously_insured: false` (enviarlo es una contradicción: 400).","properties":{"same_as_holder":{"type":"boolean","example":true,"description":"¿El conductor habitual es el tomador? Ya no se asume que sí. Se espera: true o false."},"document_type":{"type":"string","enum":["Dni","Nie","Passport"],"example":"Dni","description":"Tipo de documento de identidad. No se asume DNI. Se espera: Dni, Nie o Passport (empresas con Cif no se cotizan por esta API). OBLIGATORIO con `driver.same_as_holder: false`. No se envía con `driver.same_as_holder: true`. Valores: GET /api/v1/catalog?type=document-types."},"document_id":{"type":"string","minLength":5,"maxLength":20,"example":"12345678Z","description":"Número del documento. Su formato debe corresponder al tipo declarado. Se espera: DNI: 8 dígitos + letra · NIE: X/Y/Z + 7 dígitos + letra · Pasaporte: mínimo 5 caracteres. OBLIGATORIO con `driver.same_as_holder: false`. No se envía con `driver.same_as_holder: true`."},"name":{"type":"string","minLength":1,"maxLength":60,"example":"Juan","description":"Nombre, tal como figura en el documento. Se espera: texto, solo letras. OBLIGATORIO con `driver.same_as_holder: false`. No se envía con `driver.same_as_holder: true`."},"surname":{"type":"string","minLength":1,"maxLength":60,"example":"García","description":"Primer apellido. Se espera: texto, solo letras. OBLIGATORIO con `driver.same_as_holder: false`. No se envía con `driver.same_as_holder: true`."},"surname2":{"type":"string","maxLength":60,"example":"López","description":"Segundo apellido. Obligatorio con DNI. Se espera: texto, solo letras. OBLIGATORIO con `driver.same_as_holder: false` y `driver.document_type: \"Dni\"`. No se envía con `driver.same_as_holder: true`."},"birth_date":{"type":"string","format":"date","example":"1985-03-15","description":"Fecha de nacimiento. Se espera: fecha YYYY-MM-DD, no futura. OBLIGATORIO con `driver.same_as_holder: false`. No se envía con `driver.same_as_holder: true`."},"gender":{"type":"string","enum":["Male","Female"],"example":"Female","description":"Sexo. No se asume \"Male\". Se espera: Male o Female. OBLIGATORIO con `driver.same_as_holder: false`. No se envía con `driver.same_as_holder: true`. Valores: GET /api/v1/catalog?type=genders."},"marital_status":{"type":"string","enum":["Single","Married","UnmarriedPartner","Divorced","Widowed"],"example":"Married","description":"Estado civil. Determina la prima en varias aseguradoras; no se asume \"Single\". Se espera: un valor del catálogo marital-statuses. OBLIGATORIO con `driver.same_as_holder: false`. No se envía con `driver.same_as_holder: true`. Valores: GET /api/v1/catalog?type=marital-statuses."},"nationality":{"type":"string","enum":["ESP","GBR","FRA","DEU","ITA","PRT","ROU","MAR","COL","ECU","ARG","VEN","PER","BOL","BRA","CHN","PAK","UKR","RUS","POL","BGR","NLD","BEL","SWE","NOR","DNK","FIN","IRL","CHE","AUT","USA","CAN","MEX","CHL","URY","PRY","CUB","DOM","HND","SLV","GTM","NIC","PAN","CRI","DZA","SEN","NGA","GHA","PHL","IND","JPN","KOR","AUS","NZL","TUR","ISR","EGY","ZAF"],"example":"ESP","description":"Nacionalidad ISO-3. Obligatoria con NIE o pasaporte. Con DNI es española por definición: si la mandas, tiene que ser ESP. Se espera: código ISO-3 del catálogo nationalities. OBLIGATORIO con `driver.same_as_holder: false` y `driver.document_type` = Nie o Passport. No se envía con `driver.same_as_holder: true`. Valores: GET /api/v1/catalog?type=nationalities."},"driving_license_type":{"type":"string","enum":["AM","A1","A2","A","B","LCM"],"example":"A2","description":"Tipo de carnet de moto. Se espera: un valor del catálogo motorcycle-driving-license-types. Valores: GET /api/v1/catalog?type=motorcycle-driving-license-types."},"driving_license_date":{"type":"string","format":"date","example":"2015-06-01","description":"Fecha de expedición del carnet de moto. Se espera: fecha YYYY-MM-DD, no futura."},"driving_license_issuing_zone_id":{"type":"string","enum":["Spain","RestEU","RestWorld"],"example":"Spain","description":"Zona de expedición del carnet. Ya no se asume España. Se espera: Spain, RestEU o RestWorld."},"driving_experience_id":{"type":"string","enum":["NoExperience","ThisMotorcycle","OtherMotorcycle"],"example":"ThisMotorcycle","description":"Experiencia conduciendo motos. Se espera: un valor del catálogo motorcycle-driving-experience. Valores: GET /api/v1/catalog?type=motorcycle-driving-experience."},"previous_motorcycle_code":{"type":"string","maxLength":20,"example":"02360100001","description":"Versión de la moto anterior. Se espera: id del catálogo vehicle-versions. OBLIGATORIO con `driver.driving_experience_id: \"OtherMotorcycle\"`. Valores: GET /api/v1/catalog?type=vehicle-versions."},"has_car_license":{"type":"boolean","example":true,"description":"¿Tiene además carnet de coche? No se asume. Se espera: true o false."},"car_license_date":{"type":"string","format":"date","example":"2010-03-01","description":"Fecha del carnet de coche. Se espera: fecha YYYY-MM-DD, no futura. OBLIGATORIO con `driver.has_car_license: true`."},"previously_insured":{"type":"boolean","example":false,"description":"¿Tiene o ha tenido un seguro de moto a su nombre? Ya no se asume que no. Se espera: true o false."},"previous_company_code":{"type":"string","minLength":1,"maxLength":20,"example":"C0109","description":"Aseguradora anterior. Los códigos de coche y de moto son catálogos distintos. Se espera: código del catálogo motorcycle-insurance-companies. OBLIGATORIO con `driver.previously_insured: true`. No se envía con `driver.previously_insured: false`. Valores: GET /api/v1/catalog?type=motorcycle-insurance-companies."},"previous_policy_number":{"type":"string","minLength":5,"maxLength":40,"example":"POL-123456","description":"Número de la póliza anterior. Se espera: texto de al menos 5 caracteres. OBLIGATORIO con `driver.previously_insured: true`. No se envía con `driver.previously_insured: false`."},"previous_plate":{"type":"string","minLength":4,"maxLength":10,"example":"1234BCD","description":"Matrícula del vehículo de la póliza anterior. Ya no se asume que es el mismo vehículo: si lo es, repite su matrícula. Se espera: matrícula española. OBLIGATORIO con `driver.previously_insured: true`. No se envía con `driver.previously_insured: false`."},"total_years_insured":{"type":"integer","minimum":0,"maximum":80,"example":5,"description":"Años totales asegurado. Con `previously_insured: false` no se envía, o se envía 0. Se espera: entero ≥ 0. OBLIGATORIO con `driver.previously_insured: true`. No se envía con `driver.previously_insured: false` (se admite 0, que dice lo mismo)."},"years_in_previous_company":{"type":"integer","minimum":0,"maximum":80,"example":5,"description":"Años en la aseguradora anterior. No puede superar total_years_insured. Con `previously_insured: false` no se envía, o se envía 0. Se espera: entero ≥ 0. OBLIGATORIO con `driver.previously_insured: true`. No se envía con `driver.previously_insured: false` (se admite 0, que dice lo mismo)."},"years_without_accidents":{"type":"integer","minimum":0,"maximum":80,"example":5,"description":"Años sin siniestros con culpa. Con `previously_insured: false` no se envía, o se envía 0. Se espera: entero ≥ 0. OBLIGATORIO con `driver.previously_insured: true`. No se envía con `driver.previously_insured: false` (se admite 0, que dice lo mismo)."},"last_five_years_accidents":{"type":"integer","minimum":0,"maximum":20,"example":5,"description":"Siniestros con culpa en los últimos 5 años. Con `previously_insured: false` no se envía, o se envía 0. Se espera: entero ≥ 0. OBLIGATORIO con `driver.previously_insured: true`. No se envía con `driver.previously_insured: false` (se admite 0, que dice lo mismo)."},"penalties":{"type":"string","enum":["0","1","2","3","4","5","6"],"example":"0","description":"Multas de los últimos 3 años. Hoy ninguna aseguradora de moto lo consume: se guarda con la cotización. Se espera: \"0\" a \"6\", en texto."},"points_lost":{"type":"boolean","example":false,"description":"¿Perdió puntos el último año? Hoy no lo consume ninguna aseguradora de moto. Se espera: true o false."}},"required":["same_as_holder","driving_license_type","driving_license_date","driving_license_issuing_zone_id","driving_experience_id","previously_insured"],"additionalProperties":false,"x-required-when":[{"field":"document_type","when":"con `driver.same_as_holder: false`","depends_on":["driver.same_as_holder"]},{"field":"document_id","when":"con `driver.same_as_holder: false`","depends_on":["driver.same_as_holder"]},{"field":"name","when":"con `driver.same_as_holder: false`","depends_on":["driver.same_as_holder"]},{"field":"surname","when":"con `driver.same_as_holder: false`","depends_on":["driver.same_as_holder"]},{"field":"surname2","when":"con `driver.same_as_holder: false` y `driver.document_type: \"Dni\"`","depends_on":["driver.same_as_holder","driver.document_type"]},{"field":"birth_date","when":"con `driver.same_as_holder: false`","depends_on":["driver.same_as_holder"]},{"field":"gender","when":"con `driver.same_as_holder: false`","depends_on":["driver.same_as_holder"]},{"field":"marital_status","when":"con `driver.same_as_holder: false`","depends_on":["driver.same_as_holder"]},{"field":"nationality","when":"con `driver.same_as_holder: false` y `driver.document_type` = Nie o Passport","depends_on":["driver.same_as_holder","driver.document_type"]},{"field":"previous_motorcycle_code","when":"con `driver.driving_experience_id: \"OtherMotorcycle\"`","depends_on":["driver.driving_experience_id"]},{"field":"car_license_date","when":"con `driver.has_car_license: true`","depends_on":["driver.has_car_license"]},{"field":"previous_company_code","when":"con `driver.previously_insured: true`","depends_on":["driver.previously_insured"]},{"field":"previous_policy_number","when":"con `driver.previously_insured: true`","depends_on":["driver.previously_insured"]},{"field":"previous_plate","when":"con `driver.previously_insured: true`","depends_on":["driver.previously_insured"]},{"field":"total_years_insured","when":"con `driver.previously_insured: true`","depends_on":["driver.previously_insured"]},{"field":"years_in_previous_company","when":"con `driver.previously_insured: true`","depends_on":["driver.previously_insured"]},{"field":"years_without_accidents","when":"con `driver.previously_insured: true`","depends_on":["driver.previously_insured"]},{"field":"last_five_years_accidents","when":"con `driver.previously_insured: true`","depends_on":["driver.previously_insured"]}],"x-forbidden-when":[{"field":"document_type","when":"con `driver.same_as_holder: true`","depends_on":["driver.same_as_holder"]},{"field":"document_id","when":"con `driver.same_as_holder: true`","depends_on":["driver.same_as_holder"]},{"field":"name","when":"con `driver.same_as_holder: true`","depends_on":["driver.same_as_holder"]},{"field":"surname","when":"con `driver.same_as_holder: true`","depends_on":["driver.same_as_holder"]},{"field":"surname2","when":"con `driver.same_as_holder: true`","depends_on":["driver.same_as_holder"]},{"field":"birth_date","when":"con `driver.same_as_holder: true`","depends_on":["driver.same_as_holder"]},{"field":"gender","when":"con `driver.same_as_holder: true`","depends_on":["driver.same_as_holder"]},{"field":"marital_status","when":"con `driver.same_as_holder: true`","depends_on":["driver.same_as_holder"]},{"field":"nationality","when":"con `driver.same_as_holder: true`","depends_on":["driver.same_as_holder"]},{"field":"previous_company_code","when":"con `driver.previously_insured: false`","depends_on":["driver.previously_insured"]},{"field":"previous_policy_number","when":"con `driver.previously_insured: false`","depends_on":["driver.previously_insured"]},{"field":"previous_plate","when":"con `driver.previously_insured: false`","depends_on":["driver.previously_insured"]},{"field":"total_years_insured","when":"con `driver.previously_insured: false`","depends_on":["driver.previously_insured"],"zero_allowed":true},{"field":"years_in_previous_company","when":"con `driver.previously_insured: false`","depends_on":["driver.previously_insured"],"zero_allowed":true},{"field":"years_without_accidents","when":"con `driver.previously_insured: false`","depends_on":["driver.previously_insured"],"zero_allowed":true},{"field":"last_five_years_accidents","when":"con `driver.previously_insured: false`","depends_on":["driver.previously_insured"],"zero_allowed":true}]}}}}