{"openapi":"3.1.0","info":{"title":"Snap For Water observation upload","description":"Early testing: the receipt uses Montgomery Whitewater place content, not necessarily the photo's location. Observations are received, not scientifically validated. Photos and precise coordinates remain private. Business listings are not sponsorships. Read /agents.md and /skills.md before submitting.","version":"0.1.0"},"servers":[{"url":"https://snapforwater.org"}],"paths":{"/api/observations":{"post":{"summary":"Submit an authorized photo observation","operationId":"observation_create_api_observations_post","requestBody":{"content":{"multipart/form-data":{"schema":{"$ref":"#/components/schemas/Body_observation_create_api_observations_post"}}},"required":true},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}}},"components":{"schemas":{"Body_observation_create_api_observations_post":{"properties":{"photo":{"type":"string","contentMediaType":"application/octet-stream","title":"Photo"},"idempotency_key":{"type":"string","title":"Idempotency Key"},"campaign":{"type":"string","title":"Campaign","default":""},"location":{"type":"string","title":"Location","default":""},"latitude":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Latitude"},"longitude":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Longitude"},"tags":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Tags"},"note":{"type":"string","title":"Note","default":""},"client_captured_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Client Captured At"},"device_id":{"type":"string","title":"Device Id","default":""},"terms_version":{"type":"string","title":"Terms Version","default":"terms-2026-09-04"},"privacy_version":{"type":"string","title":"Privacy Version","default":"privacy-2026-09-04"},"accepted_terms":{"type":"boolean","title":"Accepted Terms","default":false},"g-recaptcha-response":{"type":"string","title":"G-Recaptcha-Response","default":""}},"type":"object","required":["photo","idempotency_key"],"title":"Body_observation_create_api_observations_post"},"HTTPValidationError":{"properties":{"detail":{"items":{"$ref":"#/components/schemas/ValidationError"},"type":"array","title":"Detail"}},"type":"object","title":"HTTPValidationError"},"ValidationError":{"properties":{"loc":{"items":{"anyOf":[{"type":"string"},{"type":"integer"}]},"type":"array","title":"Location"},"msg":{"type":"string","title":"Message"},"type":{"type":"string","title":"Error Type"},"input":{"title":"Input"},"ctx":{"type":"object","title":"Context"}},"type":"object","required":["loc","msg","type"],"title":"ValidationError"}}}}