{"openapi":"3.1.0","info":{"title":"CasaLario Public Price API","version":"1.0.0","description":"Read-only public accommodations and stay-price API for ferienvilla-costablanca.de. Same endpoint structure as Avevio. No reservations, messages, payment or personal guest data. Legacy price-info prose is never published. Quotes with unresolved additional costs have complete=false and total=null."},"servers":[{"url":"https://www.ferienvilla-costablanca.de"}],"paths":{"/api/v1/units":{"get":{"operationId":"listUnits","summary":"Published CasaLario accommodation units","parameters":[{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"maximum":10000,"default":1}}],"responses":{"200":{"description":"Successful public read; inspect status and complete before using a price","content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnitList"}}}},"400":{"description":"Invalid input","content":{"application/json":{"schema":{"type":"object"}}}},"404":{"description":"Published unit not found","content":{"application/json":{"schema":{"type":"object"}}}},"405":{"description":"GET/HEAD only","content":{"application/json":{"schema":{"type":"object"}}}},"429":{"description":"Rate limit; retry after 60 seconds","content":{"application/json":{"schema":{"type":"object"}}}},"503":{"description":"Temporarily unavailable","content":{"application/json":{"schema":{"type":"object"}}}}}},"head":{"summary":"Same status/headers as GET without response body","parameters":[{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"maximum":10000,"default":1}}],"responses":{"200":{"description":"No response body"},"400":{"description":"Invalid input"},"404":{"description":"Published unit not found"},"405":{"description":"GET/HEAD only"},"429":{"description":"Rate limit; retry after 60 seconds"},"503":{"description":"Temporarily unavailable"}}}},"/api/v1/units/{unit_id}":{"get":{"operationId":"getUnitPricingMetadata","summary":"Public unit information and photos","parameters":[{"name":"unit_id","in":"path","required":true,"schema":{"type":"integer","minimum":1}}],"responses":{"200":{"description":"Successful public read; inspect status and complete before using a price","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Unit"}}}},"400":{"description":"Invalid input","content":{"application/json":{"schema":{"type":"object"}}}},"404":{"description":"Published unit not found","content":{"application/json":{"schema":{"type":"object"}}}},"405":{"description":"GET/HEAD only","content":{"application/json":{"schema":{"type":"object"}}}},"429":{"description":"Rate limit; retry after 60 seconds","content":{"application/json":{"schema":{"type":"object"}}}},"503":{"description":"Temporarily unavailable","content":{"application/json":{"schema":{"type":"object"}}}}}},"head":{"summary":"Same status/headers as GET without response body","parameters":[{"name":"unit_id","in":"path","required":true,"schema":{"type":"integer","minimum":1}}],"responses":{"200":{"description":"No response body"},"400":{"description":"Invalid input"},"404":{"description":"Published unit not found"},"405":{"description":"GET/HEAD only"},"429":{"description":"Rate limit; retry after 60 seconds"},"503":{"description":"Temporarily unavailable"}}}},"/api/v1/units/{unit_id}/price":{"get":{"operationId":"getUnitPrice","summary":"Read-only stay price; incomplete quotes cannot be ranked","parameters":[{"name":"unit_id","in":"path","required":true,"schema":{"type":"integer","minimum":1}},{"name":"arrival","in":"query","required":true,"schema":{"type":"string","format":"date"}},{"name":"departure","in":"query","required":true,"schema":{"type":"string","format":"date"}},{"name":"guests","in":"query","required":true,"schema":{"type":"integer","minimum":1,"maximum":100}},{"name":"dogs","in":"query","required":false,"schema":{"type":"integer","minimum":0,"maximum":100,"default":0}},{"name":"linen","in":"query","required":false,"schema":{"type":"string","enum":["yes","no"],"default":"no"}}],"responses":{"200":{"description":"Successful public read; inspect status and complete before using a price","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Quote"}}}},"400":{"description":"Invalid input","content":{"application/json":{"schema":{"type":"object"}}}},"404":{"description":"Published unit not found","content":{"application/json":{"schema":{"type":"object"}}}},"405":{"description":"GET/HEAD only","content":{"application/json":{"schema":{"type":"object"}}}},"429":{"description":"Rate limit; retry after 60 seconds","content":{"application/json":{"schema":{"type":"object"}}}},"503":{"description":"Temporarily unavailable","content":{"application/json":{"schema":{"type":"object"}}}}}},"head":{"summary":"Same status/headers as GET without response body","parameters":[{"name":"unit_id","in":"path","required":true,"schema":{"type":"integer","minimum":1}},{"name":"arrival","in":"query","required":true,"schema":{"type":"string","format":"date"}},{"name":"departure","in":"query","required":true,"schema":{"type":"string","format":"date"}},{"name":"guests","in":"query","required":true,"schema":{"type":"integer","minimum":1,"maximum":100}},{"name":"dogs","in":"query","required":false,"schema":{"type":"integer","minimum":0,"maximum":100,"default":0}},{"name":"linen","in":"query","required":false,"schema":{"type":"string","enum":["yes","no"],"default":"no"}}],"responses":{"200":{"description":"No response body"},"400":{"description":"Invalid input"},"404":{"description":"Published unit not found"},"405":{"description":"GET/HEAD only"},"429":{"description":"Rate limit; retry after 60 seconds"},"503":{"description":"Temporarily unavailable"}}}}},"components":{"schemas":{"Unit":{"type":"object","required":["schema_version","unit_id","property_id","property_name","public_path","quote_endpoint","source_type"],"properties":{"schema_version":{"type":"string"},"unit_id":{"type":"integer"},"property_id":{"type":"integer"},"property_name":{"type":"string"},"unit_name":{"type":"string"},"town":{"type":"string"},"cin":{"type":"string"},"public_path":{"type":"string"},"public_url":{"type":"string"},"inquiry_url":{"type":"string"},"quote_endpoint":{"type":"string"},"source_type":{"type":"string"},"max_guests":{"type":"integer"},"max_dogs":{"type":["integer","null"],"description":"null: no verified upper bound available; source validates party."},"images":{"type":"array","items":{"type":"string","format":"uri"}},"provider":{"type":"object","properties":{"name":{"type":"string"},"url":{"type":"string","format":"uri"}}}}},"UnitList":{"type":"object","required":["page","page_size","items"],"properties":{"page":{"type":"integer"},"page_size":{"type":"integer","const":100},"items":{"type":"array","items":{"$ref":"#/components/schemas/Unit"}}}},"Quote":{"allOf":[{"$ref":"#/components/schemas/Unit"},{"type":"object","required":["status","complete","total","binding","booking_created","calculated_at"],"properties":{"status":{"enum":["ok","not_available","external_source_unavailable","external_costs_unresolved"]},"complete":{"type":"boolean","description":"Only calculable fixed mandatory costs and selected services. Never rank complete=false as a complete offer."},"total":{"type":["string","null"],"pattern":"^\\d+\\.\\d{2}$","description":"Decimal currency amount, never cents."},"source_subtotal":{"type":["string","null"],"pattern":"^\\d+\\.\\d{2}$","description":"Decimal currency amount, never cents."},"average_per_night":{"type":["string","null"],"pattern":"^\\d+\\.\\d{2}$","description":"Decimal currency amount, never cents."},"currency":{"type":["string","null"],"enum":["EUR",null]},"arrival":{"type":"string","format":"date"},"departure":{"type":"string","format":"date"},"guests":{"type":"integer"},"dogs":{"type":"integer"},"linen":{"enum":["yes","no"]},"nights":{"type":"integer","minimum":1,"maximum":366},"deposit":{"type":"null","description":"Not inferred from legacy prose. Check deposit_status."},"deposit_status":{"enum":["none_reported_by_source","unresolved"]},"additional_costs":{"type":["array","null"],"items":{"type":"object"},"description":"null means unresolved, not free."},"costs_status":{"enum":["none_reported_by_source","unresolved"]},"consumption_costs":{"type":["array","null"],"items":{"type":"object"}},"consumption_included":{"type":["boolean","null"]},"availability":{"enum":["source_quote_returned","unavailable","unknown"]},"comparison_basis":{"const":"fixed_costs_and_selected_services"},"binding":{"const":false},"booking_created":{"const":false},"calculated_at":{"type":"string","format":"date-time"}}}]}}}}