{"openapi":"3.0.0","info":{"version":"1.0.0","title":"Outdoorsy Partner API","description":"External-facing partner API for Outdoorsy. Stable contract; internal services churn freely behind a translation layer."},"servers":[{"url":"https://api.outdoorsy.dev"}],"components":{"schemas":{"Listing":{"type":"object","properties":{"id":{"type":"number","example":12345},"name":{"type":"string","example":"Sunset Camper Van"},"slug":{"type":"string"},"type":{"type":"string","example":"camper-van"},"vehicle_type":{"type":"string","nullable":true,"example":"Camper van"},"price_per_day":{"type":"number","nullable":true,"description":"In the currency indicated by `currency`.","example":234},"currency":{"type":"string","example":"USD"},"security_deposit":{"type":"number","nullable":true},"sleeps":{"type":"number","nullable":true},"instant_book":{"type":"boolean"},"primary_image_url":{"type":"string","nullable":true},"rating":{"type":"number","nullable":true},"reviews_count":{"type":"number","nullable":true},"location":{"type":"object","nullable":true,"properties":{"city":{"type":"string","nullable":true},"state":{"type":"string","nullable":true},"country":{"type":"string","nullable":true},"lat":{"type":"number","nullable":true},"lng":{"type":"number","nullable":true}},"required":["city","state","country","lat","lng"]}},"required":["id","name","slug","type","vehicle_type","price_per_day","currency","security_deposit","sleeps","instant_book","primary_image_url","rating","reviews_count","location"]},"ListingDetail":{"type":"object","properties":{"id":{"type":"number","example":12345},"name":{"type":"string","example":"Sunset Camper Van"},"slug":{"type":"string"},"type":{"type":"string","example":"camper-van"},"vehicle_type":{"type":"string","nullable":true,"example":"Camper van"},"price_per_day":{"type":"number","nullable":true,"description":"In the currency indicated by `currency`.","example":234},"currency":{"type":"string","example":"USD"},"security_deposit":{"type":"number","nullable":true},"sleeps":{"type":"number","nullable":true},"instant_book":{"type":"boolean"},"primary_image_url":{"type":"string","nullable":true},"rating":{"type":"number","nullable":true},"reviews_count":{"type":"number","nullable":true},"location":{"type":"object","nullable":true,"properties":{"city":{"type":"string","nullable":true},"state":{"type":"string","nullable":true},"country":{"type":"string","nullable":true},"lat":{"type":"number","nullable":true},"lng":{"type":"number","nullable":true}},"required":["city","state","country","lat","lng"]},"description":{"type":"string","nullable":true},"prices":{"type":"object","nullable":true,"properties":{"day":{"type":"number","nullable":true},"week":{"type":"number","nullable":true},"month":{"type":"number","nullable":true}},"required":["day","week","month"]},"seatbelts":{"type":"number","nullable":true},"vehicle":{"type":"object","nullable":true,"properties":{"make":{"type":"string","nullable":true},"model":{"type":"string","nullable":true},"year":{"type":"number","nullable":true},"length":{"type":"number","nullable":true}},"required":["make","model","year","length"]},"images":{"type":"array","items":{"type":"object","properties":{"url":{"type":"string"},"primary":{"type":"boolean"},"position":{"type":"number","nullable":true}},"required":["url","primary","position"]}}},"required":["id","name","slug","type","vehicle_type","price_per_day","currency","security_deposit","sleeps","instant_book","primary_image_url","rating","reviews_count","location","description","prices","seatbelts","vehicle","images"]},"Quote":{"type":"object","properties":{"listing_id":{"type":"number"},"start_date":{"type":"string"},"end_date":{"type":"string"},"duration_nights":{"type":"number"},"currency":{"type":"string"},"nightly_rate":{"type":"number"},"subtotal":{"type":"number"},"fees":{"type":"object","properties":{"service_fee":{"type":"number"},"outdoorsy_fee":{"type":"number"},"total":{"type":"number"}},"required":["service_fee","outdoorsy_fee","total"]},"tax":{"type":"number"},"discount":{"type":"number"},"security_deposit":{"type":"number"},"total":{"type":"number"},"due_now":{"type":"number"},"due_later":{"type":"object","nullable":true,"properties":{"amount":{"type":"number"},"date":{"type":"string","nullable":true}},"required":["amount","date"]},"mileage_included":{"type":"number","nullable":true},"instant_book":{"type":"boolean"}},"required":["listing_id","start_date","end_date","duration_nights","currency","nightly_rate","subtotal","fees","tax","discount","security_deposit","total","due_now","due_later","mileage_included","instant_book"]}},"parameters":{}},"paths":{"/health":{"get":{"summary":"Health check","tags":["Internal"],"responses":{"200":{"description":"Healthy","content":{"application/json":{"schema":{"type":"object","properties":{"status":{"type":"string","enum":["ok"]},"version":{"type":"string"}},"required":["status","version"]}}}}}}},"/v1/listings":{"get":{"summary":"Search listings","description":"Returns a page of listings matching the supplied filters. Backed by an eventually-consistent search index; use GET /v1/listings/{id} for source-of-truth state.","tags":["Listings"],"parameters":[{"schema":{"type":"string","description":"Free-text location search (city, address, or place name).","example":"Austin, TX"},"required":false,"name":"location","in":"query"},{"schema":{"type":"string","pattern":"^\\d{4}-\\d{2}-\\d{2}$","description":"ISO date (YYYY-MM-DD).","example":"2026-07-15"},"required":false,"name":"start_date","in":"query"},{"schema":{"type":"string","pattern":"^\\d{4}-\\d{2}-\\d{2}$","description":"ISO date (YYYY-MM-DD).","example":"2026-07-22"},"required":false,"name":"end_date","in":"query"},{"schema":{"type":"integer","minimum":0,"exclusiveMinimum":true},"required":false,"name":"guests","in":"query"},{"schema":{"type":"boolean","nullable":true},"required":false,"name":"instant_book","in":"query"},{"schema":{"type":"string"},"required":false,"name":"vehicle_type","in":"query"},{"schema":{"type":"integer","minimum":0,"exclusiveMinimum":true,"default":1},"required":false,"name":"page","in":"query"},{"schema":{"type":"integer","minimum":0,"exclusiveMinimum":true,"maximum":150,"default":20},"required":false,"name":"page_size","in":"query"}],"responses":{"200":{"description":"Listings page","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/Listing"}},"page":{"type":"number"},"page_size":{"type":"number"},"total":{"type":"number","nullable":true}},"required":["data","page","page_size","total"]}}}}}}},"/v1/listings/{id}":{"get":{"summary":"Get listing detail","description":"Returns source-of-truth detail for a single listing. Use this for read-modify-write flows — the search index is eventually consistent.","tags":["Listings"],"parameters":[{"schema":{"type":"integer","minimum":0,"exclusiveMinimum":true,"example":452064},"required":true,"name":"id","in":"path"}],"responses":{"200":{"description":"Listing detail","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ListingDetail"}}}},"404":{"description":"Listing not found"}}}},"/v1/quotes":{"post":{"summary":"Get a quote","description":"Returns a non-destructive full price breakdown for a listing and date range. Quote calculation does not reserve availability or create a booking.","tags":["Quotes"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"listing_id":{"type":"integer","minimum":0,"exclusiveMinimum":true,"example":452064},"start_date":{"type":"string","pattern":"^\\d{4}-\\d{2}-\\d{2}$","example":"2026-10-15"},"end_date":{"type":"string","pattern":"^\\d{4}-\\d{2}-\\d{2}$","example":"2026-10-18"}},"required":["listing_id","start_date","end_date"]}}}},"responses":{"200":{"description":"Quote breakdown","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Quote"}}}}}}}}}