{"openapi":"3.1.0","info":{"title":"Loop API","version":"0.1.0","description":"The real-time data and action layer for AI agents. Optional Bearer auth (sk_live_…) — absent keys get the anonymous tier. Every record carries observed_at and confidence; inferred fields are labeled.","contact":{"email":"hello@stayinloop.dev","url":"https://stayinloop.dev/docs"}},"servers":[{"url":"https://api.stayinloop.dev"}],"components":{"securitySchemes":{"bearer":{"type":"http","scheme":"bearer"}},"schemas":{"Availability":{"type":"object","properties":{"status":{"type":"string","enum":["likely_open_now","likely_closed_now","unknown"]},"inferred":{"type":"boolean","const":true},"basis":{"type":"string"},"confidence":{"type":"number"}}},"SearchResult":{"type":"object","properties":{"result_id":{"type":"string","format":"uuid"},"name":{"type":"string"},"cuisine":{"type":"array","items":{"type":"string"}},"tags":{"type":"array","items":{"type":"string"}},"price_band":{"type":"object","properties":{"value":{"type":"string"},"inferred":{"type":"boolean"}}},"vegan":{"type":"boolean"},"outdoor_seating":{"type":"boolean"},"address":{"type":"string"},"availability":{"$ref":"#/components/schemas/Availability"},"confidence":{"type":"number"},"observed_at":{"type":"string","format":"date-time"},"relevance":{"type":"number"}}},"Error":{"type":"object","properties":{"error":{"type":"string"},"detail":{"type":"string"}}}}},"security":[{"bearer":[]},{}],"paths":{"/v1/search":{"get":{"operationId":"search","summary":"Natural-language search over the live catalog","parameters":[{"name":"q","in":"query","required":true,"schema":{"type":"string","maxLength":200}},{"name":"location","in":"query","schema":{"type":"string","maxLength":120}},{"name":"vegan","in":"query","schema":{"type":"boolean"}},{"name":"vegetarian","in":"query","schema":{"type":"boolean"}},{"name":"outdoor","in":"query","schema":{"type":"boolean"}},{"name":"open_now","in":"query","schema":{"type":"boolean"}},{"name":"price_band","in":"query","schema":{"type":"string","enum":["€","€€","€€€"]}}],"responses":{"200":{"description":"Ranked results with freshness stamps","content":{"application/json":{"schema":{"type":"object","properties":{"results":{"type":"array","items":{"$ref":"#/components/schemas/SearchResult"}},"coverage":{"type":"string"},"note":{"type":"string"}}}}}},"429":{"description":"Rate limited","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/details/{id}":{"get":{"operationId":"get_details","summary":"Full record for a result; returns a result_token for reporting","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","format":"uuid"}}],"responses":{"200":{"description":"Full record + result_token (30 min validity)"},"404":{"description":"unknown_result_id","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/verify/{id}":{"get":{"operationId":"verify","summary":"Freshness check — latest observation; stale records are re-checked live","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","format":"uuid"}},{"name":"claim","in":"query","schema":{"type":"string","maxLength":200}}],"responses":{"200":{"description":"Latest observation with observed_at"},"404":{"description":"unknown_result_id"}}}},"/v1/report":{"post":{"operationId":"report","summary":"Report an outcome — mutates the record's freshness and confidence","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["result_token","outcome"],"properties":{"result_token":{"type":"string"},"outcome":{"type":"string","enum":["correct","wrong","booked","closed","other"]}}}}}},"responses":{"200":{"description":"Acknowledged with new_confidence and observed_at"},"400":{"description":"invalid token / outcome"}}}}}}