{"openapi":"3.1.0","info":{"title":"Animind AI API","version":"1.0.0","description":"The Universal Animal Communication Intelligence Platform.\n\nEvery interpretation returned by this API is a probabilistic behavioural\ninterpretation, not a literal translation of animal language. Clients must\nsurface the `limitations` and `safety_guidance` fields alongside any result\nthey display, and must present `insufficient_evidence: true` as a valid\noutcome rather than hiding it.","contact":{"email":"support@animind.ai"}},"servers":[{"url":"https://pet-mind.anchit-tandon.com/api-origin","description":"API server"}],"tags":[{"name":"Authentication","description":"Sign-up, sign-in, sessions and consent."},{"name":"Species","description":"Supported species and behaviour catalogue."},{"name":"Animals","description":"Animal profiles and behavioural baselines."},{"name":"Observations","description":"Capture, context, media and submission."},{"name":"Analysis","description":"Job progress and interpretations."},{"name":"Feedback","description":"Outcome feedback and calibration."},{"name":"Research","description":"Projects, ethograms, annotation and export."},{"name":"Reports","description":"Report generation and export."},{"name":"Communication","description":"Two-way communication: species-resolved cues a person sends, the animal’s replies, and the measured reliability of each cue for one individual."},{"name":"Find","description":"Short-range radio trackers and proximity hunting. Readings are raw dBm; bands, trends and distances are derived server-side."},{"name":"Account","description":"API keys, webhooks, privacy and data export."}],"components":{"securitySchemes":{"bearerAuth":{"type":"http","scheme":"bearer","bearerFormat":"JWT"},"apiKey":{"type":"apiKey","in":"header","name":"x-api-key"}},"schemas":{"SessionUser":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"id":{"type":"string","minLength":1},"email":{"type":"string","format":"email","pattern":"^(?!\\.)(?!.*\\.\\.)([A-Za-z0-9_'+\\-\\.]*)[A-Za-z0-9_+-]@([A-Za-z0-9][A-Za-z0-9\\-]*\\.)+[A-Za-z]{2,}$"},"displayName":{"type":"string"},"roles":{"type":"array","items":{"type":"string","enum":["consumer","researcher","veterinarian","organisation_member","expert_annotator","administrator"]}},"primaryRole":{"type":"string","enum":["consumer","researcher","veterinarian","organisation_member","expert_annotator","administrator"]},"organisationIds":{"type":"array","items":{"type":"string","minLength":1}},"onboardingCompletedAt":{"anyOf":[{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$"},{"type":"null"}]},"consents":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{"type":"boolean"}},"subscriptionPlan":{"type":"string","enum":["free","plus","professional","research","enterprise"]},"featureFlags":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{"type":"boolean"}}},"required":["id","email","displayName","roles","primaryRole","organisationIds","onboardingCompletedAt","consents","subscriptionPlan","featureFlags"],"additionalProperties":false},"AuthResponse":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"user":{"type":"object","properties":{"id":{"type":"string","minLength":1},"email":{"type":"string","format":"email","pattern":"^(?!\\.)(?!.*\\.\\.)([A-Za-z0-9_'+\\-\\.]*)[A-Za-z0-9_+-]@([A-Za-z0-9][A-Za-z0-9\\-]*\\.)+[A-Za-z]{2,}$"},"displayName":{"type":"string"},"roles":{"type":"array","items":{"type":"string","enum":["consumer","researcher","veterinarian","organisation_member","expert_annotator","administrator"]}},"primaryRole":{"type":"string","enum":["consumer","researcher","veterinarian","organisation_member","expert_annotator","administrator"]},"organisationIds":{"type":"array","items":{"type":"string","minLength":1}},"onboardingCompletedAt":{"anyOf":[{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$"},{"type":"null"}]},"consents":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{"type":"boolean"}},"subscriptionPlan":{"type":"string","enum":["free","plus","professional","research","enterprise"]},"featureFlags":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{"type":"boolean"}}},"required":["id","email","displayName","roles","primaryRole","organisationIds","onboardingCompletedAt","consents","subscriptionPlan","featureFlags"],"additionalProperties":false},"tokens":{"type":"object","properties":{"accessToken":{"type":"string"},"refreshToken":{"type":"string"},"expiresIn":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991},"tokenType":{"type":"string","const":"Bearer"},"rotated":{"type":"boolean"}},"required":["accessToken","refreshToken","expiresIn","tokenType"],"additionalProperties":false}},"required":["user","tokens"],"additionalProperties":false},"OAuthCallbackRequest":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"provider":{"type":"string","enum":["apple","google"]},"idToken":{"type":"string","minLength":10},"displayName":{"type":"string","maxLength":120}},"required":["provider","idToken"],"additionalProperties":false},"Animal":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"id":{"type":"string","minLength":1},"name":{"type":"string"},"speciesSlug":{"type":"string"},"speciesCommonName":{"type":"string"},"breed":{"anyOf":[{"type":"string"},{"type":"null"}]},"subspecies":{"anyOf":[{"type":"string"},{"type":"null"}]},"sex":{"type":"string","enum":["male","female","unknown"]},"dateOfBirth":{"anyOf":[{"type":"string"},{"type":"null"}]},"estimatedAgeMonths":{"anyOf":[{"type":"number"},{"type":"null"}]},"weightKg":{"anyOf":[{"type":"number"},{"type":"null"}]},"environment":{"anyOf":[{"type":"string"},{"type":"null"}]},"householdOrGroup":{"anyOf":[{"type":"string"},{"type":"null"}]},"behaviouralNotes":{"anyOf":[{"type":"string"},{"type":"null"}]},"hasMedicalNotes":{"type":"boolean"},"baselineStatus":{"type":"string","enum":["new_profile","early_learning","developing","strong","longitudinal"]},"maturityScore":{"type":"number","minimum":0,"maximum":1},"observationCount":{"type":"integer","minimum":0,"maximum":9007199254740991},"lastAnalysedAt":{"anyOf":[{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$"},{"type":"null"}]},"organisationId":{"anyOf":[{"type":"string","minLength":1},{"type":"null"}]},"createdAt":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$"}},"required":["id","name","speciesSlug","speciesCommonName","breed","subspecies","sex","dateOfBirth","estimatedAgeMonths","weightKg","environment","householdOrGroup","behaviouralNotes","hasMedicalNotes","baselineStatus","maturityScore","observationCount","lastAnalysedAt","organisationId","createdAt"],"additionalProperties":false},"CreateAnimal":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"name":{"type":"string","minLength":1,"maxLength":120},"speciesSlug":{"type":"string","minLength":1},"breed":{"type":"string","maxLength":120},"subspecies":{"type":"string","maxLength":120},"sex":{"default":"unknown","type":"string","enum":["male","female","unknown"]},"dateOfBirth":{"type":"string","format":"date","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))$"},"estimatedAgeMonths":{"type":"integer","minimum":0,"maximum":2400},"weightKg":{"type":"number","exclusiveMinimum":0,"maximum":20000},"environment":{"type":"string","maxLength":200},"householdOrGroup":{"type":"string","maxLength":200},"behaviouralNotes":{"type":"string","maxLength":5000},"medicalNotes":{"type":"string","maxLength":5000},"organisationId":{"type":"string","minLength":1}},"required":["name","speciesSlug","sex"],"additionalProperties":false},"Observation":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"id":{"type":"string","minLength":1},"status":{"type":"string","enum":["draft","uploading","queued","analysing","complete","failed","cancelled"]},"stage":{"type":"string","enum":["queued","detecting_species","isolating_vocalisations","analysing_movement_and_posture","evaluating_environmental_context","comparing_historical_patterns","estimating_probable_intent","generating_interpretation","complete","failed"]},"animalId":{"anyOf":[{"type":"string","minLength":1},{"type":"null"}]},"animalName":{"anyOf":[{"type":"string"},{"type":"null"}]},"speciesSlug":{"anyOf":[{"type":"string"},{"type":"null"}]},"speciesCommonName":{"anyOf":[{"type":"string"},{"type":"null"}]},"projectId":{"anyOf":[{"type":"string","minLength":1},{"type":"null"}]},"context":{"type":"object","properties":{"whatHappenedBefore":{"type":"string","maxLength":2000},"whatHappenedDuring":{"type":"string","maxLength":2000},"whatHappenedAfter":{"type":"string","maxLength":2000},"foodPresent":{"default":"unknown","type":"string","enum":["yes","no","unknown"]},"strangerPresent":{"default":"unknown","type":"string","enum":["yes","no","unknown"]},"otherAnimalsPresent":{"default":"unknown","type":"string","enum":["yes","no","unknown"]},"animalRestrained":{"default":"unknown","type":"string","enum":["yes","no","unknown"]},"nearOffspring":{"default":"unknown","type":"string","enum":["yes","no","unknown"]},"animalPlaying":{"default":"unknown","type":"string","enum":["yes","no","unknown"]},"animalSleeping":{"default":"unknown","type":"string","enum":["yes","no","unknown"]},"animalBeingHandled":{"default":"unknown","type":"string","enum":["yes","no","unknown"]},"loudSoundPresent":{"default":"unknown","type":"string","enum":["yes","no","unknown"]},"animalInjuredOrUnwell":{"default":"unknown","type":"string","enum":["yes","no","unknown"]},"indoorOutdoor":{"default":"unknown","type":"string","enum":["indoor","outdoor","unknown"]},"locationCategory":{"default":"other","type":"string","enum":["home_indoor","home_outdoor","garden","street","park","farm","stable","kennel_or_shelter","veterinary_clinic","zoo_or_sanctuary","vehicle","wild_forest","wild_grassland","wild_wetland","wild_coastal","wild_marine","wild_mountain","wild_desert","other"]},"weather":{"default":"unknown","type":"string","enum":["clear","partly_cloudy","overcast","light_rain","heavy_rain","storm","snow","fog","windy","hot","cold","unknown"]},"timeOfDay":{"default":"unknown","type":"string","enum":["dawn","morning","midday","afternoon","dusk","night","unknown"]},"observedAt":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$"},"temperatureC":{"type":"number","minimum":-90,"maximum":70},"latitude":{"type":"number","minimum":-90,"maximum":90},"longitude":{"type":"number","minimum":-180,"maximum":180},"locationFuzzRadiusM":{"type":"number","minimum":0,"maximum":200000},"humanCount":{"type":"integer","minimum":0,"maximum":1000},"otherAnimalCount":{"type":"integer","minimum":0,"maximum":100000},"observerDistanceM":{"type":"number","minimum":0,"maximum":100000},"freeText":{"type":"string","maxLength":5000},"sources":{"default":{},"type":"object","propertyNames":{"type":"string"},"additionalProperties":{"type":"string","enum":["user","device_sensor","computer_vision","inferred"]}}},"required":["foodPresent","strangerPresent","otherAnimalsPresent","animalRestrained","nearOffspring","animalPlaying","animalSleeping","animalBeingHandled","loudSoundPresent","animalInjuredOrUnwell","indoorOutdoor","locationCategory","weather","timeOfDay","sources"],"additionalProperties":false},"media":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string","minLength":1},"kind":{"type":"string","enum":["audio","video","image"]},"filename":{"type":"string"},"contentType":{"type":"string"},"byteSize":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"durationMs":{"anyOf":[{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},{"type":"null"}]},"status":{"type":"string","enum":["pending","uploaded","scanned","rejected","deleted"]},"downloadUrl":{"anyOf":[{"type":"string"},{"type":"null"}]},"thumbnailUrl":{"anyOf":[{"type":"string"},{"type":"null"}]},"createdAt":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$"}},"required":["id","kind","filename","contentType","byteSize","durationMs","status","createdAt"],"additionalProperties":false}},"interpretationId":{"anyOf":[{"type":"string","minLength":1},{"type":"null"}]},"createdAt":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$"},"observedAt":{"anyOf":[{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$"},{"type":"null"}]},"completedAt":{"anyOf":[{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$"},{"type":"null"}]},"failureReason":{"anyOf":[{"type":"string"},{"type":"null"}]}},"required":["id","status","stage","animalId","animalName","speciesSlug","speciesCommonName","projectId","context","media","interpretationId","createdAt","observedAt","completedAt","failureReason"],"additionalProperties":false},"CreateObservation":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"animalId":{"type":"string","minLength":1},"speciesSlug":{"type":"string"},"projectId":{"type":"string","minLength":1},"sessionId":{"type":"string","minLength":1},"context":{"default":{},"type":"object","properties":{"whatHappenedBefore":{"type":"string","maxLength":2000},"whatHappenedDuring":{"type":"string","maxLength":2000},"whatHappenedAfter":{"type":"string","maxLength":2000},"foodPresent":{"default":"unknown","type":"string","enum":["yes","no","unknown"]},"strangerPresent":{"default":"unknown","type":"string","enum":["yes","no","unknown"]},"otherAnimalsPresent":{"default":"unknown","type":"string","enum":["yes","no","unknown"]},"animalRestrained":{"default":"unknown","type":"string","enum":["yes","no","unknown"]},"nearOffspring":{"default":"unknown","type":"string","enum":["yes","no","unknown"]},"animalPlaying":{"default":"unknown","type":"string","enum":["yes","no","unknown"]},"animalSleeping":{"default":"unknown","type":"string","enum":["yes","no","unknown"]},"animalBeingHandled":{"default":"unknown","type":"string","enum":["yes","no","unknown"]},"loudSoundPresent":{"default":"unknown","type":"string","enum":["yes","no","unknown"]},"animalInjuredOrUnwell":{"default":"unknown","type":"string","enum":["yes","no","unknown"]},"indoorOutdoor":{"default":"unknown","type":"string","enum":["indoor","outdoor","unknown"]},"locationCategory":{"default":"other","type":"string","enum":["home_indoor","home_outdoor","garden","street","park","farm","stable","kennel_or_shelter","veterinary_clinic","zoo_or_sanctuary","vehicle","wild_forest","wild_grassland","wild_wetland","wild_coastal","wild_marine","wild_mountain","wild_desert","other"]},"weather":{"default":"unknown","type":"string","enum":["clear","partly_cloudy","overcast","light_rain","heavy_rain","storm","snow","fog","windy","hot","cold","unknown"]},"timeOfDay":{"default":"unknown","type":"string","enum":["dawn","morning","midday","afternoon","dusk","night","unknown"]},"observedAt":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$"},"temperatureC":{"type":"number","minimum":-90,"maximum":70},"latitude":{"type":"number","minimum":-90,"maximum":90},"longitude":{"type":"number","minimum":-180,"maximum":180},"locationFuzzRadiusM":{"type":"number","minimum":0,"maximum":200000},"humanCount":{"type":"integer","minimum":0,"maximum":1000},"otherAnimalCount":{"type":"integer","minimum":0,"maximum":100000},"observerDistanceM":{"type":"number","minimum":0,"maximum":100000},"freeText":{"type":"string","maxLength":5000},"sources":{"default":{},"type":"object","propertyNames":{"type":"string"},"additionalProperties":{"type":"string","enum":["user","device_sensor","computer_vision","inferred"]}}},"additionalProperties":false},"clientDraftId":{"type":"string","maxLength":120}},"required":["context"],"additionalProperties":false},"RequestUpload":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"kind":{"type":"string","enum":["audio","video","image"]},"filename":{"type":"string","minLength":1,"maxLength":400},"contentType":{"type":"string","minLength":1,"maxLength":200},"byteSize":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991},"checksumSha256":{"type":"string","pattern":"^[a-f0-9]{64}$"},"durationMs":{"type":"integer","minimum":0,"maximum":9007199254740991},"derivedFromMediaId":{"type":"string","minLength":1}},"required":["kind","filename","contentType","byteSize"],"additionalProperties":false},"UploadTicket":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"mediaId":{"type":"string","minLength":1},"uploadUrl":{"type":"string"},"method":{"type":"string","enum":["PUT","POST"]},"headers":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{"type":"string"}},"expiresAt":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$"},"resumable":{"default":false,"type":"boolean"}},"required":["mediaId","uploadUrl","method","headers","expiresAt","resumable"],"additionalProperties":false},"InterpretationOutput":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"species":{"type":"object","properties":{"name":{"type":"string","minLength":1},"slug":{"default":null,"anyOf":[{"type":"string"},{"type":"null"}]},"confidence":{"type":"number","minimum":0,"maximum":1},"source":{"default":"user_declared","type":"string","enum":["user_declared","detected","inferred_from_profile","unknown"]}},"required":["name","slug","confidence","source"],"additionalProperties":false},"affect":{"default":null,"anyOf":[{"type":"object","properties":{"arousal":{"type":"object","properties":{"score":{"type":"number","minimum":-1,"maximum":1},"confidence":{"type":"number","minimum":0,"maximum":1},"indicators":{"default":[],"type":"array","items":{"type":"object","properties":{"featureKey":{"type":"string"},"signal":{"type":"string"},"measuredValue":{"type":"number"},"contribution":{"type":"number","minimum":-1,"maximum":1},"weight":{"type":"number","minimum":0,"maximum":1}},"required":["featureKey","signal","contribution","weight"],"additionalProperties":false}},"level":{"type":"string","enum":["low","moderate","high"]}},"required":["score","confidence","indicators","level"],"additionalProperties":false},"valence":{"type":"object","properties":{"score":{"type":"number","minimum":-1,"maximum":1},"confidence":{"type":"number","minimum":0,"maximum":1},"indicators":{"default":[],"type":"array","items":{"type":"object","properties":{"featureKey":{"type":"string"},"signal":{"type":"string"},"measuredValue":{"type":"number"},"contribution":{"type":"number","minimum":-1,"maximum":1},"weight":{"type":"number","minimum":0,"maximum":1}},"required":["featureKey","signal","contribution","weight"],"additionalProperties":false}},"level":{"type":"string","enum":["negative","neutral","positive"]}},"required":["score","confidence","indicators","level"],"additionalProperties":false}},"required":["arousal","valence"],"additionalProperties":false},{"type":"null"}]},"voiced":{"default":null,"anyOf":[{"type":"object","properties":{"state":{"type":"string","enum":["alarmed","excited","playful","uneasy","alert","engaged","withdrawn","settled","content"]},"label":{"type":"string","minLength":1},"phrase":{"type":"string","minLength":1},"basis":{"type":"string","enum":["acoustics_only","acoustics_and_context"]},"confidence":{"type":"number","minimum":0,"maximum":1}},"required":["state","label","phrase","basis","confidence"],"additionalProperties":false},{"type":"null"}]},"primary_interpretation":{"type":"object","properties":{"category":{"type":"string","enum":["attention_seeking","play_initiation","food_related","water_related","alarm","defensive_warning","territorial","social_contact","separation_distress","fear","curiosity","pain_or_discomfort","rest","mating_or_courtship","parent_offspring","group_coordination","submission","dominance_display","hunting_or_prey_focus","unknown_insufficient_evidence"]},"summary":{"type":"string","minLength":1,"maxLength":400},"confidence":{"type":"number","minimum":0,"maximum":1}},"required":["category","summary","confidence"],"additionalProperties":false},"emotional_state":{"default":[],"type":"array","items":{"type":"object","properties":{"label":{"type":"string","minLength":1},"confidence":{"type":"number","minimum":0,"maximum":1}},"required":["label","confidence"],"additionalProperties":false}},"likely_intents":{"default":[],"type":"array","items":{"type":"object","properties":{"label":{"type":"string","minLength":1},"confidence":{"type":"number","minimum":0,"maximum":1}},"required":["label","confidence"],"additionalProperties":false}},"urgency":{"type":"object","properties":{"level":{"type":"string","enum":["none","low","moderate","high","critical"]},"confidence":{"type":"number","minimum":0,"maximum":1},"rationale":{"type":"string"}},"required":["level","confidence"],"additionalProperties":false},"evidence":{"default":[],"type":"array","items":{"type":"object","properties":{"signal":{"type":"string","minLength":1},"source":{"type":"string","enum":["audio","video","image","motion","context","history"]},"weight":{"type":"number","minimum":0,"maximum":1},"featureKey":{"type":"string"},"measuredValue":{"anyOf":[{"type":"number"},{"type":"string"}]}},"required":["signal","source","weight"],"additionalProperties":false}},"contradictory_evidence":{"default":[],"type":"array","items":{"type":"object","properties":{"signal":{"type":"string","minLength":1},"source":{"type":"string","enum":["audio","video","image","motion","context","history"]},"weight":{"type":"number","minimum":0,"maximum":1},"featureKey":{"type":"string"},"measuredValue":{"anyOf":[{"type":"number"},{"type":"string"}]}},"required":["signal","source","weight"],"additionalProperties":false}},"alternative_interpretations":{"default":[],"type":"array","items":{"type":"object","properties":{"label":{"type":"string","minLength":1},"confidence":{"type":"number","minimum":0,"maximum":1},"category":{"type":"string","enum":["attention_seeking","play_initiation","food_related","water_related","alarm","defensive_warning","territorial","social_contact","separation_distress","fear","curiosity","pain_or_discomfort","rest","mating_or_courtship","parent_offspring","group_coordination","submission","dominance_display","hunting_or_prey_focus","unknown_insufficient_evidence"]}},"required":["label","confidence"],"additionalProperties":false}},"recommended_observations":{"default":[],"type":"array","items":{"type":"string"}},"safety_guidance":{"default":[],"type":"array","items":{"type":"string"}},"limitations":{"default":[],"type":"array","items":{"type":"string"}},"data_completeness":{"type":"object","properties":{"modalitiesPresent":{"type":"array","items":{"type":"string","enum":["audio","video","image","motion","context","history"]}},"modalitiesMissing":{"type":"array","items":{"type":"string","enum":["audio","video","image","motion","context","history"]}},"score":{"type":"number","minimum":0,"maximum":1},"notes":{"default":[],"type":"array","items":{"type":"string"}}},"required":["modalitiesPresent","modalitiesMissing","score","notes"],"additionalProperties":false},"model_version":{"type":"string","minLength":1},"species_adapter_version":{"type":"string","minLength":1},"insufficient_evidence":{"default":false,"type":"boolean"},"contextual_explanation":{"default":"","type":"string"}},"required":["species","affect","voiced","primary_interpretation","emotional_state","likely_intents","urgency","evidence","contradictory_evidence","alternative_interpretations","recommended_observations","safety_guidance","limitations","data_completeness","model_version","species_adapter_version","insufficient_evidence","contextual_explanation"],"additionalProperties":false},"CreateFeedback":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"interpretationId":{"type":"string","minLength":1},"outcome":{"type":"string","enum":["approached_food","drank_water","initiated_play","moved_away","approached_person","approached_animal","rested","became_more_agitated","calmed_down","vocalised_again","unsure","other"]},"outcomeDetail":{"type":"string","maxLength":2000},"wasUseful":{"type":"boolean"},"primaryWasCorrect":{"type":"boolean"},"closerAlternativeIndex":{"type":"integer","minimum":0,"maximum":9007199254740991},"notes":{"type":"string","maxLength":5000},"allowTrainingUse":{"default":false,"type":"boolean"},"showsIdentifiablePeople":{"type":"boolean"}},"required":["interpretationId","outcome","allowTrainingUse"],"additionalProperties":false},"CreateProject":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"name":{"type":"string","minLength":1,"maxLength":200},"description":{"type":"string","maxLength":5000},"organisationId":{"type":"string","minLength":1},"speciesSlugs":{"default":[],"type":"array","items":{"type":"string"}},"ethicsReference":{"type":"string","maxLength":200}},"required":["name","speciesSlugs"],"additionalProperties":false},"CreateReport":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"kind":{"type":"string","enum":["pet_behaviour","veterinary_observation","trainer","research_observation","group_behaviour","longitudinal_trend","baseline_deviation","dataset_annotation","model_confidence"]},"format":{"default":"web","type":"string","enum":["pdf","csv","json","web"]},"animalId":{"type":"string","minLength":1},"projectId":{"type":"string","minLength":1},"organisationId":{"type":"string","minLength":1},"from":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$"},"to":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$"},"shareable":{"default":false,"type":"boolean"}},"required":["kind","format","shareable"],"additionalProperties":false},"ApiError":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"details":{"type":"array","items":{"type":"object","properties":{"path":{"type":"string"},"message":{"type":"string"}},"required":["path","message"],"additionalProperties":false}},"requestId":{"type":"string"}},"required":["code","message"],"additionalProperties":false}},"required":["error"],"additionalProperties":false}}},"security":[{"bearerAuth":[]},{"apiKey":[]}],"paths":{"/v1/auth/oauth/callback":{"post":{"tags":["Authentication"],"summary":"Sign in with a Google ID token","description":"The only endpoint that mints a session. Obtain an ID token from Google on your own platform — Google Identity Services in a browser, the Google Sign-In SDK on iOS or Android — and post it here. The token is verified against Google’s published keys; its audience must equal this deployment’s GOOGLE_CLIENT_ID, and the account’s email must be verified. Signing in creates the account if it does not exist. Password, magic-link and password-reset endpoints were removed: Google is the only way in.","security":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/OAuthCallbackRequest"}}}},"responses":{"200":{"description":"Signed in","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AuthResponse"}}}},"400":{"description":"Validation failed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"401":{"description":"Authentication required","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"403":{"description":"Forbidden","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"429":{"description":"Rate limited","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}}}},"/v1/auth/refresh":{"post":{"tags":["Authentication"],"summary":"Rotate a refresh token","description":"Refresh tokens are single-use. Presenting a token that was already exchanged revokes the entire session family, because reuse indicates the token leaked.","security":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["refreshToken"],"properties":{"refreshToken":{"type":"string"}}}}}},"responses":{"200":{"description":"New token pair","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AuthResponse"}}}},"400":{"description":"Validation failed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"401":{"description":"Authentication required","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"403":{"description":"Forbidden","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"429":{"description":"Rate limited","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}}}},"/v1/auth/me":{"get":{"tags":["Authentication"],"summary":"Current session user","responses":{"200":{"description":"The authenticated user","content":{"application/json":{"schema":{"type":"object","properties":{"user":{"$ref":"#/components/schemas/SessionUser"}}}}}},"400":{"description":"Validation failed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"401":{"description":"Authentication required","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"403":{"description":"Forbidden","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"429":{"description":"Rate limited","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}}}},"/v1/species":{"get":{"tags":["Species"],"summary":"List supported species","security":[],"responses":{"200":{"description":"Species list"},"400":{"description":"Validation failed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"401":{"description":"Authentication required","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"403":{"description":"Forbidden","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"429":{"description":"Rate limited","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}}}},"/v1/species/{slug}":{"get":{"tags":["Species"],"summary":"Species detail including acoustic range and safety guidance","security":[],"parameters":[{"name":"slug","in":"path","required":true,"description":"Species registry slug, e.g. `african-elephant`.","schema":{"type":"string"}}],"responses":{"200":{"description":"Species detail"},"400":{"description":"Validation failed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"401":{"description":"Authentication required","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"403":{"description":"Forbidden","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"429":{"description":"Rate limited","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}}}},"/v1/behaviours":{"get":{"tags":["Species"],"summary":"Behaviour category catalogue","security":[],"responses":{"200":{"description":"Behaviour categories"},"400":{"description":"Validation failed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"401":{"description":"Authentication required","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"403":{"description":"Forbidden","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"429":{"description":"Rate limited","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}}}},"/v1/animals":{"get":{"tags":["Animals"],"summary":"List animals","responses":{"200":{"description":"Animals"},"400":{"description":"Validation failed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"401":{"description":"Authentication required","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"403":{"description":"Forbidden","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"429":{"description":"Rate limited","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}}},"post":{"tags":["Animals"],"summary":"Create an animal profile","requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateAnimal"}}}},"responses":{"201":{"description":"Created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Animal"}}}},"400":{"description":"Validation failed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"401":{"description":"Authentication required","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"403":{"description":"Forbidden","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"429":{"description":"Rate limited","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}}}},"/v1/animals/{id}":{"get":{"tags":["Animals"],"summary":"Animal detail","parameters":[{"name":"id","in":"path","required":true,"description":"Animal id","schema":{"type":"string"}}],"responses":{"200":{"description":"Animal","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Animal"}}}},"400":{"description":"Validation failed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"401":{"description":"Authentication required","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"403":{"description":"Forbidden","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"429":{"description":"Rate limited","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}}}},"/v1/animals/{id}/baseline":{"get":{"tags":["Animals"],"summary":"Personalisation baseline for an animal","description":"Returns the per-feature running statistics and the maturity score. Maturity is capped below 1 by design: personalisation is never presented as scientific certainty.","parameters":[{"name":"id","in":"path","required":true,"description":"Animal id","schema":{"type":"string"}}],"responses":{"200":{"description":"Baseline"},"400":{"description":"Validation failed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"401":{"description":"Authentication required","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"403":{"description":"Forbidden","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"429":{"description":"Rate limited","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}}}},"/v1/cues":{"get":{"tags":["Communication"],"summary":"Cue vocabulary for a species","description":"Cues are synthesised markers placed outside the species’ own fundamental-frequency band, so a cue can never be mistaken for a conspecific call. Wild and no-approach species are refused with a reason and no specs.","responses":{"200":{"description":"Cue catalogue"},"400":{"description":"Validation failed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"401":{"description":"Authentication required","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"403":{"description":"Forbidden","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"429":{"description":"Rate limited","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}}}},"/v1/animals/{id}/conversations":{"get":{"tags":["Communication"],"summary":"Recent conversations with an animal","parameters":[{"name":"id","in":"path","required":true,"description":"Animal id","schema":{"type":"string"}}],"responses":{"200":{"description":"Conversations"},"400":{"description":"Validation failed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"401":{"description":"Authentication required","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"403":{"description":"Forbidden","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"429":{"description":"Rate limited","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}}},"post":{"tags":["Communication"],"summary":"Start a conversation","parameters":[{"name":"id","in":"path","required":true,"description":"Animal id","schema":{"type":"string"}}],"responses":{"201":{"description":"Conversation"},"400":{"description":"Validation failed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"401":{"description":"Authentication required","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"403":{"description":"Forbidden","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"429":{"description":"Rate limited","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}}}},"/v1/animals/{id}/cue-reliability":{"get":{"tags":["Communication"],"summary":"Which cues this individual has actually learned","description":"Below five uses of a cue no reliability figure is returned at all: a short run of successes is an anecdote, and reporting a percentage next to it would overstate the evidence exactly as a confident reading of a two-second recording would.","parameters":[{"name":"id","in":"path","required":true,"description":"Animal id","schema":{"type":"string"}}],"responses":{"200":{"description":"Per-cue reliability"},"400":{"description":"Validation failed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"401":{"description":"Authentication required","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"403":{"description":"Forbidden","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"429":{"description":"Rate limited","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}}}},"/v1/conversations/{id}":{"get":{"tags":["Communication"],"summary":"Conversation with all turns","parameters":[{"name":"id","in":"path","required":true,"description":"Conversation id","schema":{"type":"string"}}],"responses":{"200":{"description":"Conversation"},"400":{"description":"Validation failed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"401":{"description":"Authentication required","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"403":{"description":"Forbidden","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"429":{"description":"Rate limited","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}}}},"/v1/conversations/{id}/cues":{"post":{"tags":["Communication"],"summary":"Play a cue and record the human turn","description":"Returns the resolved specification for the client to synthesise, plus a URL for the same waveform rendered as a WAV.","parameters":[{"name":"id","in":"path","required":true,"description":"Conversation id","schema":{"type":"string"}}],"responses":{"201":{"description":"Cue turn"},"400":{"description":"Validation failed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"401":{"description":"Authentication required","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"403":{"description":"Forbidden","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"429":{"description":"Rate limited","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}}}},"/v1/conversations/{id}/responses":{"post":{"tags":["Communication"],"summary":"Attach an observation as the animal’s reply","description":"Latency is measured from the preceding cue. A reply outside the response window is still stored but does not count toward whether the cue works.","parameters":[{"name":"id","in":"path","required":true,"description":"Conversation id","schema":{"type":"string"}}],"responses":{"201":{"description":"Updated conversation"},"400":{"description":"Validation failed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"401":{"description":"Authentication required","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"403":{"description":"Forbidden","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"429":{"description":"Rate limited","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}}}},"/v1/conversations/{id}/turns/{turnId}/audio.wav":{"get":{"tags":["Communication"],"summary":"The rendered cue as 16-bit PCM WAV","description":"For clients that would rather not synthesise. Requires a bearer token or an API key like any other endpoint, so it is meant for native apps and SDKs; a browser renders the same PCM from the cue spec instead of following this URL.","parameters":[{"name":"id","in":"path","required":true,"description":"Conversation id","schema":{"type":"string"}},{"name":"turnId","in":"path","required":true,"description":"Turn id","schema":{"type":"string"}}],"responses":{"200":{"description":"Audio"},"400":{"description":"Validation failed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"401":{"description":"Authentication required","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"403":{"description":"Forbidden","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"429":{"description":"Rate limited","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}}}},"/v1/animals/{id}/phrases":{"get":{"tags":["Communication"],"summary":"The phrase board for one animal","description":"Phrases, the groups of them that play the same sound, what the board would cost to establish, and what each phrase has earned so far. Collisions are reported rather than merged: two labels on one sound may well be deliberate, and only the owner knows.","parameters":[{"name":"id","in":"path","required":true,"description":"Animal id","schema":{"type":"string"}}],"responses":{"200":{"description":"Phrase board"},"400":{"description":"Validation failed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"401":{"description":"Authentication required","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"403":{"description":"Forbidden","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"429":{"description":"Rate limited","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}}},"post":{"tags":["Communication"],"summary":"Add a phrase","description":"A recording binding must name a clip belonging to this animal and filed under this cue. A clip is only ever played to the animal it was made from.","parameters":[{"name":"id","in":"path","required":true,"description":"Animal id","schema":{"type":"string"}}],"responses":{"201":{"description":"Phrase"},"400":{"description":"Validation failed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"401":{"description":"Authentication required","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"403":{"description":"Forbidden","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"429":{"description":"Rate limited","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}}}},"/v1/animals/{id}/phrases/{phraseId}":{"patch":{"tags":["Communication"],"summary":"Edit a phrase","parameters":[{"name":"id","in":"path","required":true,"description":"Animal id","schema":{"type":"string"}},{"name":"phraseId","in":"path","required":true,"description":"Phrase id","schema":{"type":"string"}}],"responses":{"200":{"description":"Phrase"},"400":{"description":"Validation failed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"401":{"description":"Authentication required","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"403":{"description":"Forbidden","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"429":{"description":"Rate limited","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}}},"delete":{"tags":["Communication"],"summary":"Remove a phrase","description":"The turns that used it survive with their phrase link nulled. Deleting a phrase removes a button, not the record of what the animal was asked.","parameters":[{"name":"id","in":"path","required":true,"description":"Animal id","schema":{"type":"string"}},{"name":"phraseId","in":"path","required":true,"description":"Phrase id","schema":{"type":"string"}}],"responses":{"204":{"description":"Removed"},"400":{"description":"Validation failed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"401":{"description":"Authentication required","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"403":{"description":"Forbidden","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"429":{"description":"Rate limited","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}}}},"/v1/animals/{id}/phrases/reorder":{"post":{"tags":["Communication"],"summary":"Reorder the whole board","description":"Takes the complete list rather than a pair of indices: a drag moves everything after it, and a partial list would leave the omitted phrases interleaved at whatever position they held.","parameters":[{"name":"id","in":"path","required":true,"description":"Animal id","schema":{"type":"string"}}],"responses":{"200":{"description":"Reordered board"},"400":{"description":"Validation failed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"401":{"description":"Authentication required","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"403":{"description":"Forbidden","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"429":{"description":"Rate limited","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}}}},"/v1/conversations/{id}/phrases":{"post":{"tags":["Communication"],"summary":"Press a phrase and record the human turn","description":"As with a cue, but the turn records which phrase produced it, so reliability accrues to the label pressed as well as to the sound underneath it. A phrase bound to the synthesised cue stays synthesised even where a recording exists for the same intent.","parameters":[{"name":"id","in":"path","required":true,"description":"Conversation id","schema":{"type":"string"}}],"responses":{"201":{"description":"Phrase turn"},"400":{"description":"Validation failed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"401":{"description":"Authentication required","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"403":{"description":"Forbidden","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"429":{"description":"Rate limited","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}}}},"/v1/phrasebook":{"get":{"tags":["Communication"],"summary":"Cross-species phrasebook","description":"Curated reference material, not inference: signals grouped into cross-species themes from the species registry, plus hand-written contrasts for signals that look the same across species and mean different things. Every theme reports the species with nothing catalogued under it, because an incomplete list that reads as complete is the failure this surface exists to avoid.","responses":{"200":{"description":"Phrasebook"},"400":{"description":"Validation failed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"401":{"description":"Authentication required","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"403":{"description":"Forbidden","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"429":{"description":"Rate limited","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}}}},"/v1/trackers":{"get":{"tags":["Find"],"summary":"List radio trackers","responses":{"200":{"description":"Trackers"},"400":{"description":"Validation failed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"401":{"description":"Authentication required","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"403":{"description":"Forbidden","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"429":{"description":"Rate limited","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}}},"post":{"tags":["Find"],"summary":"Register a tracker","description":"Idempotent per device identifier: registering a known radio again updates it rather than creating a second tag.","responses":{"201":{"description":"Created"},"400":{"description":"Validation failed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"401":{"description":"Authentication required","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"403":{"description":"Forbidden","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"429":{"description":"Rate limited","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}}}},"/v1/trackers/nearby":{"get":{"tags":["Find"],"summary":"Survey: trackers heard recently, strongest first","responses":{"200":{"description":"Hunt summaries"},"400":{"description":"Validation failed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"401":{"description":"Authentication required","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"403":{"description":"Forbidden","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"429":{"description":"Rate limited","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}}}},"/v1/trackers/{id}/sightings":{"post":{"tags":["Find"],"summary":"Post a burst of readings and get the hunt summary","description":"The response is computed by the proximity engine. A burst that cannot support a conclusion comes back with insufficientSignal set and no distance.","parameters":[{"name":"id","in":"path","required":true,"description":"Tracker id","schema":{"type":"string"}}],"responses":{"200":{"description":"Hunt summary"},"400":{"description":"Validation failed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"401":{"description":"Authentication required","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"403":{"description":"Forbidden","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"429":{"description":"Rate limited","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}}}},"/v1/trackers/{id}/hunt":{"get":{"tags":["Find"],"summary":"Current hunt summary from stored readings","parameters":[{"name":"id","in":"path","required":true,"description":"Tracker id","schema":{"type":"string"}}],"responses":{"200":{"description":"Hunt summary"},"400":{"description":"Validation failed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"401":{"description":"Authentication required","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"403":{"description":"Forbidden","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"429":{"description":"Rate limited","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}}}},"/v1/trackers/{id}/calibrate":{"post":{"tags":["Find"],"summary":"Calibrate the one-metre reference reading","description":"Until a tracker is calibrated no distance estimate is returned, because an uncalibrated metre figure is a guess wearing a unit.","parameters":[{"name":"id","in":"path","required":true,"description":"Tracker id","schema":{"type":"string"}}],"responses":{"200":{"description":"Calibration result"},"400":{"description":"Validation failed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"401":{"description":"Authentication required","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"403":{"description":"Forbidden","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"429":{"description":"Rate limited","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}}}},"/v1/observations":{"get":{"tags":["Observations"],"summary":"List observations","responses":{"200":{"description":"Observations"},"400":{"description":"Validation failed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"401":{"description":"Authentication required","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"403":{"description":"Forbidden","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"429":{"description":"Rate limited","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}}},"post":{"tags":["Observations"],"summary":"Create an observation draft","requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateObservation"}}}},"responses":{"201":{"description":"Draft created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Observation"}}}},"400":{"description":"Validation failed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"401":{"description":"Authentication required","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"403":{"description":"Forbidden","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"429":{"description":"Rate limited","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}}}},"/v1/observations/{id}/media":{"post":{"tags":["Observations"],"summary":"Request a signed upload URL","description":"Bytes are uploaded directly to object storage. The declared size, content type and checksum are re-verified server-side when the upload is confirmed.","parameters":[{"name":"id","in":"path","required":true,"description":"Observation id","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RequestUpload"}}}},"responses":{"201":{"description":"Upload ticket","content":{"application/json":{"schema":{"$ref":"#/components/schemas/UploadTicket"}}}},"400":{"description":"Validation failed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"401":{"description":"Authentication required","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"403":{"description":"Forbidden","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"429":{"description":"Rate limited","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}}}},"/v1/media/{mediaId}/complete":{"post":{"tags":["Observations"],"summary":"Confirm an upload completed","parameters":[{"name":"mediaId","in":"path","required":true,"description":"Media id","schema":{"type":"string"}}],"responses":{"200":{"description":"Upload verified"},"400":{"description":"Validation failed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"401":{"description":"Authentication required","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"403":{"description":"Forbidden","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"429":{"description":"Rate limited","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}}}},"/v1/observations/{id}/submit":{"post":{"tags":["Observations"],"summary":"Submit an observation for analysis","parameters":[{"name":"id","in":"path","required":true,"description":"Observation id","schema":{"type":"string"}}],"responses":{"202":{"description":"Queued for analysis"},"400":{"description":"Validation failed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"401":{"description":"Authentication required","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"403":{"description":"Forbidden","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"429":{"description":"Rate limited","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}}}},"/v1/observations/{id}/progress":{"get":{"tags":["Analysis"],"summary":"Analysis progress","description":"Reports real stage transitions written by the worker. `fraction` is null while a stage is running with no measurable sub-progress — clients should show an indeterminate state rather than interpolating.","parameters":[{"name":"id","in":"path","required":true,"description":"Observation id","schema":{"type":"string"}}],"responses":{"200":{"description":"Progress"},"400":{"description":"Validation failed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"401":{"description":"Authentication required","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"403":{"description":"Forbidden","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"429":{"description":"Rate limited","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}}}},"/v1/observations/{id}/progress/stream":{"get":{"tags":["Analysis"],"summary":"Analysis progress as Server-Sent Events","parameters":[{"name":"id","in":"path","required":true,"description":"Observation id","schema":{"type":"string"}}],"responses":{"200":{"description":"text/event-stream of progress, complete and failed events"},"400":{"description":"Validation failed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"401":{"description":"Authentication required","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"403":{"description":"Forbidden","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"429":{"description":"Rate limited","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}}}},"/v1/observations/{id}/interpretation":{"get":{"tags":["Analysis"],"summary":"Current interpretation for an observation","parameters":[{"name":"id","in":"path","required":true,"description":"Observation id","schema":{"type":"string"}}],"responses":{"200":{"description":"Interpretation","content":{"application/json":{"schema":{"type":"object","properties":{"output":{"$ref":"#/components/schemas/InterpretationOutput"},"isSimulated":{"type":"boolean"}}}}}},"400":{"description":"Validation failed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"401":{"description":"Authentication required","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"403":{"description":"Forbidden","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"429":{"description":"Rate limited","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}}}},"/v1/feedback":{"post":{"tags":["Feedback"],"summary":"Record what happened next","description":"Feedback is stored alongside the prediction and never overwrites it. Training use requires explicit per-submission consent in addition to account-level consent.","requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateFeedback"}}}},"responses":{"201":{"description":"Feedback recorded"},"400":{"description":"Validation failed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"401":{"description":"Authentication required","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"403":{"description":"Forbidden","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"429":{"description":"Rate limited","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}}}},"/v1/projects":{"get":{"tags":["Research"],"summary":"List research projects","responses":{"200":{"description":"Projects"},"400":{"description":"Validation failed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"401":{"description":"Authentication required","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"403":{"description":"Forbidden","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"429":{"description":"Rate limited","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}}},"post":{"tags":["Research"],"summary":"Create a research project","requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateProject"}}}},"responses":{"201":{"description":"Project created"},"400":{"description":"Validation failed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"401":{"description":"Authentication required","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"403":{"description":"Forbidden","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"429":{"description":"Rate limited","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}}}},"/v1/projects/{id}/export":{"get":{"tags":["Research"],"summary":"Export project observations","description":"Returns rows with a provenance block. Coordinates are exported at their stored precision; `location_fuzz_radius_m` states how coarse they are.","parameters":[{"name":"id","in":"path","required":true,"description":"Project id","schema":{"type":"string"}}],"responses":{"200":{"description":"Export"},"400":{"description":"Validation failed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"401":{"description":"Authentication required","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"403":{"description":"Forbidden","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"429":{"description":"Rate limited","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}}}},"/v1/reports":{"post":{"tags":["Reports"],"summary":"Generate a report","requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateReport"}}}},"responses":{"201":{"description":"Report generated"},"400":{"description":"Validation failed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"401":{"description":"Authentication required","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"403":{"description":"Forbidden","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"429":{"description":"Rate limited","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}}}},"/v1/api-keys":{"get":{"tags":["Account"],"summary":"List API keys","responses":{"200":{"description":"API keys"},"400":{"description":"Validation failed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"401":{"description":"Authentication required","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"403":{"description":"Forbidden","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"429":{"description":"Rate limited","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}}},"post":{"tags":["Account"],"summary":"Create an API key","description":"The raw key is returned exactly once and is never recoverable afterwards.","responses":{"201":{"description":"API key created"},"400":{"description":"Validation failed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"401":{"description":"Authentication required","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"403":{"description":"Forbidden","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"429":{"description":"Rate limited","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}}}},"/v1/privacy/export":{"get":{"tags":["Account"],"summary":"Export all of your data","responses":{"200":{"description":"Portable JSON export"},"400":{"description":"Validation failed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"401":{"description":"Authentication required","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"403":{"description":"Forbidden","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"429":{"description":"Rate limited","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}}}},"/v1/privacy/delete-account":{"post":{"tags":["Account"],"summary":"Request account deletion","responses":{"200":{"description":"Deletion scheduled"},"400":{"description":"Validation failed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"401":{"description":"Authentication required","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"403":{"description":"Forbidden","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"429":{"description":"Rate limited","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}}}}}}