{"openapi":"3.1.0","info":{"title":"RouteRiff Route Audit API","version":"2026-10-07","description":"Read-only geographic sanity-check API for multi-stop travel routes. Results are planning heuristics, not live routing or travel advice."},"servers":[{"url":"https://routeriff.vercel.app"}],"paths":{"/api/audit":{"get":{"summary":"Audit a route from compact coordinate points","description":"Use query parameter points as pipe-separated lat,lon,name values. Example: 35.6762,139.6503,Tokyo|35.0116,135.7681,Kyoto","parameters":[{"name":"points","in":"query","required":true,"schema":{"type":"string"}},{"name":"days","in":"query","required":false,"schema":{"type":"integer","minimum":1,"maximum":365}}],"responses":{"200":{"description":"Route audit result","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AuditResponse"}}}},"400":{"description":"Invalid route input"}}},"post":{"summary":"Audit a route from structured coordinates","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["points"],"properties":{"days":{"type":"integer","minimum":1,"maximum":365},"points":{"type":"array","minItems":2,"maxItems":12,"items":{"$ref":"#/components/schemas/Point"}}}}}}},"responses":{"200":{"description":"Route audit result","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AuditResponse"}}}},"400":{"description":"Invalid route input"}}}}},"components":{"schemas":{"Point":{"type":"object","required":["lat","lon"],"properties":{"name":{"type":"string","maxLength":90},"lat":{"type":"number","minimum":-90,"maximum":90},"lon":{"type":"number","minimum":-180,"maximum":180},"country":{"type":"string","maxLength":90}}},"AuditResponse":{"type":"object","properties":{"ok":{"type":"boolean"},"version":{"type":"string"},"route":{"type":"object"},"audit":{"type":"object","properties":{"score":{"type":"integer","minimum":35,"maximum":99},"verdict":{"type":"string","enum":["Looks reasonable","Needs a second look","Rework before booking"]},"distance_km":{"type":"number"},"estimated_travel_hours":{"type":"number"},"average_travel_hours_per_day":{"type":["number","null"]},"long_jump_flags":{"type":"integer"},"backtracking_flags":{"type":"integer"},"largest_detour":{"type":["object","null"]},"legs":{"type":"array","items":{"type":"object"}}}},"limitations":{"type":"array","items":{"type":"string"}},"source_url":{"type":"string","format":"uri"}}}}}}