{"openapi":"3.0.0","paths":{"/facts":{"get":{"description":"Retrieve facts with optional filtering by breed or species, and pagination support.","operationId":"FactsController_getFacts","parameters":[{"name":"limit","required":false,"in":"query","description":"Number of facts to return","schema":{"minimum":1,"maximum":100,"example":10,"type":"number"}},{"name":"offset","required":false,"in":"query","description":"Number of facts to skip for pagination","schema":{"minimum":0,"example":0,"type":"number"}},{"name":"breed_id","required":false,"in":"query","description":"Filter facts by breed ID","schema":{"example":"abys","type":"string"}},{"name":"species_id","required":false,"in":"query","description":"Filter facts by species ID","schema":{"example":"dog","type":"string"}},{"name":"category","required":false,"in":"query","description":"Filter facts by category (e.g. fun)","schema":{"example":"fun","type":"string"}},{"name":"include_sources","required":false,"in":"query","description":"Include source URLs in the response","schema":{"example":false,"type":"boolean"}},{"name":"lang","required":false,"in":"query","description":"Two-letter language code for translated content","schema":{"example":"en","type":"string"}}],"responses":{"200":{"description":"Successfully retrieved facts","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/FactResponseDto"}}}}}},"security":[{"x-api-key":[]}],"summary":"Get a list of facts","tags":["Facts"]}},"/facts/random":{"get":{"description":"Retrieve a completely random fact from all available facts.","operationId":"FactsController_getRandomFact","parameters":[{"name":"include_sources","required":false,"in":"query","description":"Include source URLs in the response","schema":{"example":false,"type":"boolean"}},{"name":"lang","required":false,"in":"query","description":"Two-letter language code for translated content","schema":{"example":"en","type":"string"}}],"responses":{"200":{"description":"Successfully retrieved random fact","content":{"application/json":{"schema":{"$ref":"#/components/schemas/FactResponseDto"}}}},"404":{"description":"No facts found"}},"security":[{"x-api-key":[]}],"summary":"Get a random fact","tags":["Facts"]}},"/facts/breed/{breedId}":{"get":{"description":"Retrieve all facts for a specific breed with pagination support.","operationId":"FactsController_getFactsByBreed","parameters":[{"name":"breedId","required":true,"in":"path","description":"The breed identifier","schema":{"example":"115","type":"string"}},{"name":"limit","required":false,"in":"query","description":"Number of facts to return (1-100)","schema":{"example":10,"type":"number"}},{"name":"offset","required":false,"in":"query","description":"Number of facts to skip","schema":{"example":0,"type":"number"}},{"name":"include_sources","required":false,"in":"query","description":"Include source URLs in the response","schema":{"example":false,"type":"boolean"}},{"name":"lang","required":false,"in":"query","description":"Two-letter language code for translated content","schema":{"example":"en","type":"string"}}],"responses":{"200":{"description":"Successfully retrieved facts for the breed","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/FactResponseDto"}}}}}},"security":[{"x-api-key":[]}],"summary":"Get facts by breed","tags":["Facts"]}},"/facts/breed/{breedId}/random":{"get":{"description":"Retrieve a random fact for the specified breed.","operationId":"FactsController_getRandomFactByBreed","parameters":[{"name":"breedId","required":true,"in":"path","description":"The breed identifier","schema":{"example":"115","type":"string"}},{"name":"include_sources","required":false,"in":"query","description":"Include source URLs in the response","schema":{"example":false,"type":"boolean"}},{"name":"lang","required":false,"in":"query","description":"Two-letter language code for translated content","schema":{"example":"en","type":"string"}}],"responses":{"200":{"description":"Successfully retrieved random fact for the breed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/FactResponseDto"}}}},"404":{"description":"No facts found for the specified breed"}},"security":[{"x-api-key":[]}],"summary":"Get a random fact for a specific breed","tags":["Facts"]}},"/facts/species/{speciesId}/random":{"get":{"description":"Retrieve a random fact for the specified species.","operationId":"FactsController_getRandomFactBySpecies","parameters":[{"name":"speciesId","required":true,"in":"path","description":"The species identifier","schema":{"example":"2","type":"string"}},{"name":"include_sources","required":false,"in":"query","description":"Include source URLs in the response","schema":{"example":false,"type":"boolean"}},{"name":"lang","required":false,"in":"query","description":"Two-letter language code for translated content","schema":{"example":"en","type":"string"}}],"responses":{"200":{"description":"Successfully retrieved random fact for the species","content":{"application/json":{"schema":{"$ref":"#/components/schemas/FactResponseDto"}}}},"404":{"description":"No facts found for the specified species"}},"security":[{"x-api-key":[]}],"summary":"Get a random fact for a specific species","tags":["Facts"]}},"/facts/{id}":{"get":{"description":"Retrieve a specific fact by its unique identifier.","operationId":"FactsController_getFactById","parameters":[{"name":"id","required":true,"in":"path","description":"The fact ID","schema":{"example":1,"type":"string"}},{"name":"include_sources","required":false,"in":"query","description":"Include source URLs in the response","schema":{"example":false,"type":"boolean"}},{"name":"lang","required":false,"in":"query","description":"Two-letter language code for translated content","schema":{"example":"en","type":"string"}}],"responses":{"200":{"description":"Successfully retrieved the fact","content":{"application/json":{"schema":{"$ref":"#/components/schemas/FactResponseDto"}}}},"404":{"description":"Fact not found"}},"security":[{"x-api-key":[]}],"summary":"Get a fact by ID","tags":["Facts"]}},"/votes":{"get":{"operationId":"VotesController_list","parameters":[{"name":"limit","required":false,"in":"query","description":"Maximum number of results to return (default 10)","schema":{"minimum":1,"maximum":100,"default":10,"example":10,"type":"number"}},{"name":"page","required":false,"in":"query","description":"Zero-based page index","schema":{"minimum":0,"default":0,"example":0,"type":"number"}},{"name":"order","required":false,"in":"query","description":"Sort order of returned records","schema":{"default":"ASC","enum":["ASC","DESC","RANDOM"],"type":"string"}},{"name":"species_id","required":false,"in":"query","description":"Filter results by a specific species identifier","schema":{"example":"1","type":"string"}},{"name":"breed_groups","required":false,"in":"query","description":"Comma-separated list of breed groups to include in the response","schema":{"example":"Toy,Hound","type":"string"}},{"name":"exclude_breed_groups","required":false,"in":"query","description":"Comma-separated list of breed groups to exclude from the response","schema":{"example":"Mixed","type":"string"}},{"name":"lang","required":false,"in":"query","description":"Return translated fields when available for the requested language code","schema":{"example":"it","type":"string"}},{"name":"sub_id","required":false,"in":"query","description":"Filter by sub identifier","schema":{"type":"string"}}],"responses":{"200":{"description":"List of votes","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/VoteDto"}}}}}},"summary":"List votes for the authenticated user","tags":["Votes"]},"post":{"operationId":"VotesController_create","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateVoteDto"}}}},"responses":{"200":{"description":"Created vote","content":{"application/json":{"schema":{"$ref":"#/components/schemas/VoteDto"}}}}},"security":[{"x-api-key":[]}],"summary":"Create a vote","tags":["Votes"]}},"/votes/{vote_id}":{"get":{"operationId":"VotesController_get","parameters":[{"name":"vote_id","required":true,"in":"path","schema":{"type":"number"}}],"responses":{"200":{"description":"The vote","content":{"application/json":{"schema":{"$ref":"#/components/schemas/VoteDto"}}}}},"summary":"Get a vote by ID","tags":["Votes"]}},"/webhooks":{"post":{"operationId":"WebhooksController_createEndpoint","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateWebhookEndpointDto"}}}},"responses":{"201":{"description":""}},"security":[{"x-api-key":[]}],"summary":"Create a new webhook endpoint","tags":["Webhooks"]},"get":{"operationId":"WebhooksController_getEndpoints","parameters":[],"responses":{"200":{"description":"List of webhook endpoints","schema":{"example":[{"id":"123e4567-e89b-12d3-a456-426614174000","url":"https://example.com/webhook","enabled_events":["image.uploaded"],"description":"Production Webhook","status":"enabled","created_at":"2023-01-01T00:00:00Z"}]},"content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/CreateWebhookEndpointDto"}}}}}},"security":[{"x-api-key":[]}],"summary":"List all webhook endpoints","tags":["Webhooks"]}},"/webhooks/topics":{"get":{"operationId":"WebhooksController_getTopics","parameters":[],"responses":{"200":{"description":"List of available webhook topics","content":{"application/json":{"schema":{"example":[{"topic":"image.uploaded","description":"Triggered when an image is successfully uploaded."}]}}}}},"security":[{"x-api-key":[]}],"summary":"List available webhook topics","tags":["Webhooks"]}},"/webhooks/{id}":{"get":{"operationId":"WebhooksController_getEndpoint","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":"The webhook endpoint details","content":{"application/json":{"schema":{"example":{"id":"123e4567-e89b-12d3-a456-426614174000","url":"https://example.com/webhook","enabled_events":["image.uploaded"],"description":"Production Webhook","status":"enabled","created_at":"2023-01-01T00:00:00Z"}}}}}},"security":[{"x-api-key":[]}],"summary":"Get a specific webhook endpoint","tags":["Webhooks"]},"delete":{"operationId":"WebhooksController_deleteEndpoint","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":"Confirmation of deletion","content":{"application/json":{"schema":{"example":{"success":true}}}}}},"security":[{"x-api-key":[]}],"summary":"Delete a webhook endpoint","tags":["Webhooks"]}},"/webhooks/{id}/rotate-secret":{"post":{"operationId":"WebhooksController_rotateSecret","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"example":{"id":"123e4567-e89b-12d3-a456-426614174000","signing_secret":"whsec_3f1c..."}}}}}},"security":[{"x-api-key":[]}],"summary":"Issue a new signing secret for this endpoint. The old one stops working immediately.","tags":["Webhooks"]}},"/accounts/features":{"get":{"operationId":"AccountsController_getFeatures","parameters":[],"responses":{"200":{"description":"List of enabled feature flags","content":{"application/json":{"schema":{"type":"array","items":{"type":"string"}}}}}},"security":[{"x-api-key":[]}],"summary":"Get enabled feature flags for the current account","tags":["Accounts"]}},"/accounts/quota":{"get":{"operationId":"AccountsController_getQuota","parameters":[],"responses":{"200":{"description":"Current quota status","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AccountQuotaDto"}}}}},"security":[{"x-api-key":[]}],"summary":"Get current upload quota usage and remaining limit","tags":["Accounts"]}},"/breeds/bans/countries":{"get":{"operationId":"BreedBansController_listCountries","parameters":[{"name":"species_id","required":false,"in":"query","description":"Filter by species identifier","schema":{"type":"string"}},{"name":"animal_type","required":false,"in":"query","description":"Filter by animal type: dog or cat","schema":{"type":"string"}}],"responses":{"200":{"description":"List of countries that have breed-specific or characteristic-based legislation","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/BanCountryListItemDto"}}}}}},"security":[{"x-api-key":[]}],"summary":"List countries with breed legislation","tags":["Breed Bans"]}},"/breeds/bans/country":{"get":{"description":"Returns all breed bans, restrictions, and characteristic-based legislation for a country. If the country does not have national-level legislation, returns jurisdiction-level (state/city/canton) laws instead.","operationId":"BreedBansController_getBansByCountry","parameters":[{"name":"limit","required":false,"in":"query","description":"Maximum number of records to return per page","schema":{"minimum":1,"maximum":100,"default":10,"example":10,"type":"number"}},{"name":"page","required":false,"in":"query","description":"Zero-indexed page number to return","schema":{"minimum":0,"default":0,"example":0,"type":"number"}},{"name":"order","required":false,"in":"query","description":"Sort order of returned records","schema":{"default":"ASC","enum":["ASC","DESC","RANDOM"],"type":"string"}},{"name":"species_id","required":false,"in":"query","description":"Filter by species identifier","schema":{"example":"2","type":"string"}},{"name":"breed_groups","required":false,"in":"query","description":"Comma-separated list of breed groups to include in the response","schema":{"example":"Toy,Hound","type":"string"}},{"name":"exclude_breed_groups","required":false,"in":"query","description":"Comma-separated list of breed groups to exclude from the response","schema":{"example":"Mixed","type":"string"}},{"name":"lang","required":false,"in":"query","description":"Return translated fields when available for the requested language code","schema":{"example":"it","type":"string"}},{"name":"country","required":true,"in":"query","description":"ISO 3166-1 alpha-2 country code","schema":{"example":"AU","type":"string"}},{"name":"legislation_type","required":false,"in":"query","description":"Filter: breed_specific, characteristic_based, behavior_based, hybrid","schema":{"example":"breed_specific","type":"string"}},{"name":"approach","required":false,"in":"query","description":"Filter: ban, restriction, permit, approved_list","schema":{"example":"ban","type":"string"}},{"name":"jurisdiction","required":false,"in":"query","description":"Filter to a specific jurisdiction within the country","schema":{"example":"Victoria","type":"string"}}],"responses":{"200":{"description":"Legislation for the requested country","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BanCountryResponseDto"}}}}},"security":[{"x-api-key":[]}],"summary":"Get breed bans and legislation by country","tags":["Breed Bans"]}},"/breeds/bans/breed/{breedId}":{"get":{"description":"Returns every country and jurisdiction where this breed is banned, restricted, or requires a permit.","operationId":"BreedBansController_getBansByBreed","parameters":[{"name":"breedId","required":true,"in":"path","description":"Canonical breed identifier","schema":{"example":"15","type":"string"}},{"name":"species_id","required":false,"in":"query","description":"Filter by species identifier","schema":{"example":"2","type":"string"}}],"responses":{"200":{"description":"List of bans for the breed across all countries","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/BreedBanSummaryDto"}}}}}},"security":[{"x-api-key":[]}],"summary":"Get all bans for a specific breed globally","tags":["Breed Bans"]}},"/pets":{"post":{"operationId":"PetsController_create","parameters":[],"requestBody":{"required":true,"content":{"multipart/form-data":{"schema":{"$ref":"#/components/schemas/CreatePetDto"}}}},"responses":{"201":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PetResponseDto"}}}}},"security":[{"x-api-key":[]}],"summary":"Create a pet with optional images","tags":["Pets"]},"get":{"operationId":"PetsController_list","parameters":[{"name":"limit","required":false,"in":"query","description":"Maximum number of records to return per page","schema":{"minimum":1,"maximum":100,"default":10,"example":10,"type":"number"}},{"name":"page","required":false,"in":"query","description":"Zero-indexed page number to return","schema":{"minimum":0,"default":0,"example":0,"type":"number"}},{"name":"order","required":false,"in":"query","description":"Sort order of returned records","schema":{"default":"ASC","enum":["ASC","DESC","RANDOM"],"type":"string"}},{"name":"species_id","required":false,"in":"query","description":"Filter results by a specific species identifier","schema":{"example":"1","type":"string"}},{"name":"breed_groups","required":false,"in":"query","description":"Comma-separated list of breed groups to include in the response","schema":{"example":"Toy,Hound","type":"string"}},{"name":"exclude_breed_groups","required":false,"in":"query","description":"Comma-separated list of breed groups to exclude from the response","schema":{"example":"Mixed","type":"string"}},{"name":"lang","required":false,"in":"query","description":"Return translated fields when available for the requested language code","schema":{"example":"it","type":"string"}},{"name":"breed_id","required":false,"in":"query","description":"Filter by breed identifier","schema":{"type":"string"}},{"name":"sub_id","required":false,"in":"query","description":"Filter by sub_id","schema":{"type":"string"}},{"name":"external_owner_id","required":false,"in":"query","description":"Return only pets belonging to this owner ID from your own system (exact match)","schema":{"maxLength":255,"type":"string"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/PetResponseDto"}}}}}},"security":[{"x-api-key":[]}],"summary":"List pets for the authenticated account","tags":["Pets"]}},"/pets/{petId}/images":{"post":{"operationId":"PetsController_uploadImages","parameters":[{"name":"petId","required":true,"in":"path","description":"Pet identifier","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"multipart/form-data":{"schema":{"$ref":"#/components/schemas/UploadPetImagesDto"}}}},"responses":{"200":{"description":"","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/PetImageResponseDto"}}}}}},"security":[{"x-api-key":[]}],"summary":"Upload additional images for an existing pet","tags":["Pets"]}},"/pets/{petId}/videos":{"post":{"description":"Send the video in the multipart field `file`, up to 200 MB. MP4, MOV, WebM, AVI, MPEG and 3GP are accepted. The type is read from the file itself, so a generic Content-Type such as application/octet-stream is fine. Anything else returns 415.","operationId":"PetsController_uploadVideo","parameters":[{"name":"petId","required":true,"in":"path","description":"Pet identifier","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"multipart/form-data":{"schema":{"$ref":"#/components/schemas/UploadPetVideoDto"}}}},"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PetImageResponseDto"}}}}},"security":[{"x-api-key":[]}],"summary":"Upload an additional video for an existing pet","tags":["Pets"]}},"/pets/portrait-styles":{"get":{"operationId":"PetsController_listPortraitStyles","parameters":[],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/PortraitStyleResponseDto"}}}}}},"security":[{"x-api-key":[]}],"summary":"List available portrait styles","tags":["Pets"]}},"/pets/{petId}":{"get":{"operationId":"PetsController_getById","parameters":[{"name":"petId","required":true,"in":"path","description":"Pet identifier","schema":{"type":"string"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PetResponseDto"}}}}},"security":[{"x-api-key":[]}],"summary":"Get a pet by ID","tags":["Pets"]},"patch":{"operationId":"PetsController_update","parameters":[{"name":"petId","required":true,"in":"path","description":"Pet identifier","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdatePetDto"}}}},"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PetResponseDto"}}}}},"security":[{"x-api-key":[]}],"summary":"Update pet metadata","tags":["Pets"]},"delete":{"operationId":"PetsController_remove","parameters":[{"name":"petId","required":true,"in":"path","description":"Pet identifier","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"security":[{"x-api-key":[]}],"summary":"Delete a pet","tags":["Pets"]}},"/pets/{petId}/portraits":{"get":{"operationId":"PetsController_getPortraits","parameters":[{"name":"petId","required":true,"in":"path","description":"Pet identifier","schema":{"type":"string"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/PetImageResponseDto"}}}}}},"security":[{"x-api-key":[]}],"summary":"Get only the AI generated portraits for a pet","tags":["Pets"]}},"/pets/{petId}/body-condition-score":{"post":{"operationId":"PetsController_generateBodyConditionScore","parameters":[{"name":"petId","required":true,"in":"path","description":"Pet identifier","schema":{"type":"string"}},{"name":"lang","required":false,"in":"query","description":"Two-letter language code for translated content","schema":{"example":"en-GB","type":"string"}},{"name":"season","required":false,"in":"query","description":"Explicit season override (winter, spring, summer, autumn)","schema":{"example":"winter","type":"string"}},{"name":"country","required":false,"in":"query","description":"ISO country code override","schema":{"example":"AU","type":"string"}},{"name":"compare_version","required":false,"in":"query","description":"A previously generated prompt version to include alongside the current result (e.g. v1). Only returns if a cached result exists for that version.","schema":{"example":"v1","type":"string"}},{"name":"request_review","required":false,"in":"query","description":"Send this result to a vet even if the model is confident. Results with low confidence go to a vet automatically.","schema":{"example":true,"type":"boolean"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BodyConditionScoreResponseDto"}}}}},"security":[{"x-api-key":[]}],"summary":"Analyse the body condition score (BCS) for a pet based on their images","tags":["Pets"]}},"/pets/{petId}/estimated-age":{"post":{"operationId":"PetsController_generateEstimatedAge","parameters":[{"name":"petId","required":true,"in":"path","description":"Pet identifier","schema":{"type":"string"}},{"name":"lang","required":false,"in":"query","description":"Two-letter language code for translated content","schema":{"type":"string"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/EstimatedAgeResponseDto"}}}}},"security":[{"x-api-key":[]}],"summary":"Estimate the age of a pet based on their images","tags":["Pets"]}},"/pets/{petId}/genealogy":{"post":{"operationId":"PetsController_generateGenealogy","parameters":[{"name":"petId","required":true,"in":"path","description":"Pet identifier","schema":{"type":"string"}},{"name":"lang","required":false,"in":"query","description":"Two-letter language code for translated content","schema":{"type":"string"}}],"responses":{"200":{"description":"The analysis result containing breed mixture, age, gender predictions, and creative descriptions."}},"security":[{"x-api-key":[]}],"summary":"Analyze genealogy/breed from all pet images","tags":["Pets"]}},"/pets/{petId}/muscle-condition-score":{"post":{"operationId":"PetsController_generateMuscleWastingRisk","parameters":[{"name":"petId","required":true,"in":"path","description":"Pet identifier","schema":{"type":"string"}},{"name":"lang","required":false,"in":"query","description":"Two-letter language code for translated content","schema":{"type":"string"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MuscleConditionScoreResponseDto"}}}}},"security":[{"x-api-key":[]}],"summary":"Evaluate Muscle Condition from all pet images as a wasting risk flag","tags":["Pets"]}},"/pets/{petId}/estimated-weight":{"post":{"operationId":"PetsController_generateEstimatedWeight","parameters":[{"name":"petId","required":true,"in":"path","description":"Pet identifier","schema":{"type":"string"}},{"name":"lang","required":false,"in":"query","description":"Two-letter language code for translated content","schema":{"example":"en-GB","type":"string"}},{"name":"season","required":false,"in":"query","description":"Explicit season override (winter, spring, summer, autumn)","schema":{"example":"winter","type":"string"}},{"name":"country","required":false,"in":"query","description":"ISO country code override","schema":{"example":"AU","type":"string"}}],"responses":{"201":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/EstimatedWeightResponseDto"}}}}},"security":[{"x-api-key":[]}],"summary":"Estimate weight and size for a pet based on photos","tags":["Pets"]}},"/pets/{petId}/health-tips":{"get":{"description":"Returns a blend of breed-standard seeded tips (filtered by primary breed) and AI-generated personalised tips. Results are cached per pet per request signature and invalidated when new images are uploaded. Requires at least one image to be uploaded to the pet. Running genealogy, body-condition-score, and muscle-condition-score first will produce more personalised AI tips.","operationId":"PetsController_getPersonalisedHealthTips","parameters":[{"name":"petId","required":true,"in":"path","description":"Pet identifier","schema":{"type":"string"}},{"name":"lang","required":false,"in":"query","description":"Two-letter language code for translated content","schema":{"example":"en","type":"string"}},{"name":"include_seeded","required":false,"in":"query","description":"Include breed-standard seeded tips (default: true)","schema":{"default":true,"type":"boolean"}},{"name":"include_sources","required":false,"in":"query","description":"Include source URLs on breed-standard tips (default: false)","schema":{"default":false,"type":"boolean"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PetHealthTipsResponseDto"}}}}},"security":[{"x-api-key":[]}],"summary":"Get personalised health tips for a pet based on their images and health scores","tags":["Pets"]}},"/pets/{petId}/portrait":{"post":{"operationId":"PetsController_generatePortrait","parameters":[{"name":"petId","required":true,"in":"path","description":"Pet identifier","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreatePortraitDto"}}}},"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PetImageResponseDto"}}}}},"security":[{"x-api-key":[]}],"summary":"Generate an AI portrait for a pet","tags":["Pets"]}},"/breeds/{id}/colours":{"get":{"description":"Returns the palette of colour/pattern variants valid for this breed - breed-specific variants (e.g. Birman colourpoints) plus any that apply species-wide.","operationId":"BreedsController_getBreedColours","parameters":[{"name":"id","required":true,"in":"path","description":"Identifier of the breed","schema":{"example":"birm","type":"string"}}],"responses":{"200":{"description":"List of colour/pattern variants for the breed","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/ColourDto"}}}}}},"security":[{"x-api-key":[]}],"summary":"List the registered colour/pattern variants for a breed","tags":["Breeds"]}},"/breeds/search":{"get":{"operationId":"BreedsController_searchBreeds","parameters":[{"name":"limit","required":false,"in":"query","description":"Maximum number of results to return (default 10)","schema":{"minimum":1,"maximum":100,"default":10,"example":10,"type":"number"}},{"name":"page","required":false,"in":"query","description":"Zero-based page index","schema":{"minimum":0,"default":0,"example":0,"type":"number"}},{"name":"order","required":false,"in":"query","description":"Sort order of returned records","schema":{"default":"ASC","enum":["ASC","DESC","RANDOM"],"type":"string"}},{"name":"species_id","required":false,"in":"query","description":"Filter breeds by species identifier","schema":{"example":"1","type":"string"}},{"name":"breed_groups","required":false,"in":"query","description":"Comma-separated list of breed groups to include (case-insensitive)","schema":{"example":"Toy,Hound","type":"string"}},{"name":"exclude_breed_groups","required":false,"in":"query","description":"Comma-separated list of breed groups to exclude (case-insensitive)","schema":{"example":"Mixed","type":"string"}},{"name":"lang","required":false,"in":"query","description":"Two-letter language code for translated content","schema":{"example":"en","type":"string"}},{"name":"q","required":false,"in":"query","description":"Partial name to match","schema":{"minLength":1,"maxLength":30,"example":"sib","type":"string"}},{"name":"venom_code","required":false,"in":"query","description":"Filter by VeNoM code. Matches any VeNoM entry belonging to the breed, not just its primary one (a breed can have multiple, e.g. colour/coat variants).","schema":{"type":"string"}},{"name":"extinct","required":false,"in":"query","description":"Filter by extinction status. If omitted, results are not filtered by extinction status.","schema":{"type":"boolean"}}],"responses":{"200":{"description":"List of breeds that match the search term. Returns BasicBreedDto for standard users or ProBreedDto for users with full_breed_schema feature flag.","content":{"application/json":{"schema":{"type":"array","items":{"type":"object"}}}}}},"security":[{"x-api-key":[]}],"summary":"Search breeds by name","tags":["Breeds"]}},"/breeds":{"get":{"operationId":"BreedsController_listBreeds","parameters":[{"name":"limit","required":false,"in":"query","description":"Maximum number of results to return (default 1000)","schema":{"minimum":1,"maximum":1000,"default":1000,"example":1000,"type":"number"}},{"name":"page","required":false,"in":"query","description":"Zero-based page index","schema":{"minimum":0,"default":0,"example":0,"type":"number"}},{"name":"order","required":false,"in":"query","description":"Sort order of the results","schema":{"enum":["ASC","DESC","RANDOM"],"type":"string"}},{"name":"species_id","required":false,"in":"query","description":"Filter breeds by species identifier","schema":{"example":"1","type":"string"}},{"name":"breed_groups","required":false,"in":"query","description":"Comma-separated list of breed groups to include (case-insensitive)","schema":{"example":"Toy,Hound","type":"string"}},{"name":"exclude_breed_groups","required":false,"in":"query","description":"Comma-separated list of breed groups to exclude (case-insensitive)","schema":{"example":"Mixed","type":"string"}},{"name":"lang","required":false,"in":"query","description":"Two-letter language code for translated content","schema":{"example":"en","type":"string"}},{"name":"extinct","required":false,"in":"query","description":"Filter by extinction status (true for extinct, false for living). Defaults to false.","schema":{"default":false,"type":"boolean"}},{"name":"venom_code","required":false,"in":"query","description":"Filter by VeNoM code. Matches any VeNoM entry belonging to the breed, not just its primary one (a breed can have multiple, e.g. colour/coat variants).","schema":{"type":"string"}}],"responses":{"200":{"description":"List of breeds. Returns BasicBreedDto for standard users or ProBreedDto for users with full_breed_schema feature flag.","content":{"application/json":{"schema":{"type":"array","items":{"type":"object"}}}}}},"security":[{"x-api-key":[]}],"summary":"List breeds","tags":["Breeds"]}},"/breeds/breed-groups":{"get":{"operationId":"BreedsController_listBreedGroups","parameters":[{"name":"species_id","required":false,"in":"query","description":"Filter breed groups by species identifier","schema":{"type":"string"}}],"responses":{"200":{"description":"Unique breed groups","content":{"application/json":{"schema":{"type":"array","items":{"type":"string"}}}}}},"security":[{"x-api-key":[]}],"summary":"List available breed groups","tags":["Breeds"]}},"/breeds/{id}":{"get":{"operationId":"BreedsController_getBreed","parameters":[{"name":"id","required":true,"in":"path","description":"Breed identifier","schema":{"example":"115","type":"string"}},{"name":"lang","required":false,"in":"query","description":"Two-letter language code for translated content","schema":{"example":"en","type":"string"}}],"responses":{"200":{"description":"Breed details. Returns BasicBreedDto for standard users or ProBreedDto for users with full_breed_schema feature flag.","content":{"application/json":{"schema":{"type":"object"}}}}},"security":[{"x-api-key":[]}],"summary":"Retrieve a breed by identifier","tags":["Breeds"]}},"/pets/{petId}/body-condition-score/reviews":{"get":{"operationId":"BcsReviewsController_list","parameters":[{"name":"petId","required":true,"in":"path","description":"Pet identifier","schema":{"type":"string"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/BcsReviewDto"}}}}}},"security":[{"x-api-key":[]}],"summary":"List vet reviews of this pet's body condition scores, newest first","tags":["Pets"]}},"/accounts/capabilities":{"get":{"operationId":"CapabilitiesController_list","parameters":[],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/CapabilityDto"}}}}}},"security":[{"x-api-key":[]}],"summary":"List the analysis capabilities on this account and whether each is switched on","tags":["Accounts"]}},"/accounts/capabilities/{capabilityId}":{"patch":{"operationId":"CapabilitiesController_update","parameters":[{"name":"capabilityId","required":true,"in":"path","schema":{"example":"portraits","type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateCapabilityDto"}}}},"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CapabilityDto"}}}}},"security":[{"x-api-key":[]}],"summary":"Switch a capability off (or back on) for this account. Off makes its endpoints return 403.","tags":["Accounts"]}},"/pets/{petId}/visits":{"post":{"description":"One call writes the visit, its items and its observations in a single transaction. Reposting the same external_id for the same source_system updates that visit rather than creating a second one, so retries are safe.","operationId":"ClinicalHistoryController_createVisit","parameters":[{"name":"petId","required":true,"in":"path","description":"Pet identifier","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateVisitDto"}}}},"responses":{"201":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/VisitResponseDto"}}}},"403":{"description":"The pet belongs to another account, or the feature is not enabled"},"404":{"description":"Pet not found"}},"security":[{"x-api-key":[]}],"summary":"Record a vet visit, with its clinical notes and measurements","tags":["Pets"]},"get":{"operationId":"ClinicalHistoryController_listVisits","parameters":[{"name":"petId","required":true,"in":"path","description":"Pet identifier","schema":{"type":"string"}},{"name":"limit","required":false,"in":"query","description":"Maximum number of records to return per page","schema":{"minimum":1,"maximum":100,"default":10,"example":10,"type":"number"}},{"name":"page","required":false,"in":"query","description":"Zero-indexed page number to return","schema":{"minimum":0,"default":0,"example":0,"type":"number"}},{"name":"order","required":false,"in":"query","description":"Sort order of returned records","schema":{"default":"ASC","enum":["ASC","DESC","RANDOM"],"type":"string"}},{"name":"species_id","required":false,"in":"query","description":"Filter results by a specific species identifier","schema":{"example":"1","type":"string"}},{"name":"breed_groups","required":false,"in":"query","description":"Comma-separated list of breed groups to include in the response","schema":{"example":"Toy,Hound","type":"string"}},{"name":"exclude_breed_groups","required":false,"in":"query","description":"Comma-separated list of breed groups to exclude from the response","schema":{"example":"Mixed","type":"string"}},{"name":"lang","required":false,"in":"query","description":"Return translated fields when available for the requested language code","schema":{"example":"it","type":"string"}},{"name":"from","required":false,"in":"query","description":"Only visits that occurred on or after this time.","schema":{"example":"2026-01-01T00:00:00Z","type":"string"}},{"name":"to","required":false,"in":"query","description":"Only visits that occurred on or before this time.","schema":{"type":"string"}},{"name":"visit_type","required":false,"in":"query","schema":{"enum":["consultation","vaccination","surgery","emergency","follow_up","lab_only","other"],"type":"string"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/VisitResponseDto"}}}}}},"security":[{"x-api-key":[]}],"summary":"List a pet's visits, most recent first","tags":["Pets"]}},"/pets/{petId}/visits/{visitId}":{"get":{"operationId":"ClinicalHistoryController_getVisit","parameters":[{"name":"petId","required":true,"in":"path","description":"Pet identifier","schema":{"type":"string"}},{"name":"visitId","required":true,"in":"path","description":"Visit identifier","schema":{"type":"string"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/VisitResponseDto"}}}},"404":{"description":"Pet or visit not found"}},"security":[{"x-api-key":[]}],"summary":"Get a single visit with its notes and measurements","tags":["Pets"]}},"/calculators/energy-requirement":{"post":{"description":"RER = 70 x kg^0.75; MER = RER x a life stage factor (AAHA 2021 Nutrition and Weight Management Guidelines). For adult dogs the factor follows actual daily exercise in three bands; those factors are provisional. Send food energy to get portions in cups, cans or grams. Calories are per day. Results are estimates to discuss with a vet.","operationId":"CalculatorsController_energyRequirement","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/EnergyRequirementRequestDto"}}}},"responses":{"200":{"description":"RER, MER range, portions, formulas, citations and what was assumed"},"403":{"description":"The calculators feature is not enabled, or the pet is not yours"},"422":{"description":"Inputs cannot support a result (code explains why)"}},"security":[{"x-api-key":[]}],"summary":"Daily energy requirement (RER and MER) for a weight, breed or pet","tags":["Calculators"]}},"/calculators/weight-loss-plan":{"post":{"description":"Ideal weight from a vet-entered value, a weight recorded at BCS 5, the BCS (each point above 5 is about 10% overweight, AAHA 2014) or the breed range. Feeds RER at ideal weight x 1.0 for dogs and x 0.8 for cats (AAHA 2021). Staged mode steps one band at a time; durations and rechecks follow AAHA 2014 (1-2% a week for dogs, 0.5-2% for cats). Every response has a status. BCS 1-2 (very_lean) returns an urgent vet referral and no numbers; BCS 3 (below_ideal) returns a feeding target for ideal weight with a routine vet check; BCS 4-5 (at_ideal) returns the maintenance target.","operationId":"CalculatorsController_weightLossPlan","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/WeightLossPlanRequestDto"}}}},"responses":{"200":{"description":"Ideal weight, kcal targets, staged steps, recheck schedule, red flags and citations"},"403":{"description":"The calculators feature is not enabled, or the pet is not yours"},"422":{"description":"Inputs cannot support a plan (code explains why)"}},"security":[{"x-api-key":[]}],"summary":"Weight-loss plan: daily kcal at ideal weight, staged by body condition band","tags":["Calculators"]}},"/pets/{petId}/observations":{"post":{"description":"For inputs collected outside a vet visit. exercise_band is the actual daily exercise (lt_30, 30_60 or gt_60 minutes). The calculators read the latest value of each.","operationId":"PetObservationsController_create","parameters":[{"name":"petId","required":true,"in":"path","description":"Pet identifier","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreatePetObservationDto"}}}},"responses":{"201":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PetObservationResponseDto"}}}},"403":{"description":"The pet belongs to another account, or the feature is not enabled"},"404":{"description":"Pet not found"}},"security":[{"x-api-key":[]}],"summary":"Record a pet's exercise band, weight or body condition score","tags":["Pets"]}},"/favourites":{"get":{"operationId":"FavouritesController_list","parameters":[{"name":"limit","required":false,"in":"query","description":"Maximum number of results to return (default 10)","schema":{"minimum":1,"maximum":100,"default":10,"example":10,"type":"number"}},{"name":"page","required":false,"in":"query","description":"Zero-based page index","schema":{"minimum":0,"default":0,"example":0,"type":"number"}},{"name":"order","required":false,"in":"query","description":"Sort order of the results","schema":{"enum":["ASC","DESC","RANDOM"],"type":"string"}},{"name":"species_id","required":false,"in":"query","description":"Filter results by a specific species identifier","schema":{"example":"1","type":"string"}},{"name":"breed_groups","required":false,"in":"query","description":"Comma-separated list of breed groups to include in the response","schema":{"example":"Toy,Hound","type":"string"}},{"name":"exclude_breed_groups","required":false,"in":"query","description":"Comma-separated list of breed groups to exclude from the response","schema":{"example":"Mixed","type":"string"}},{"name":"lang","required":false,"in":"query","description":"Return translated fields when available for the requested language code","schema":{"example":"it","type":"string"}},{"name":"account_id","required":false,"in":"query","description":"Filter favourites by account identifier","schema":{"example":"account-123","type":"string"}},{"name":"image_id","required":false,"in":"query","description":"Filter by image identifier","schema":{"example":"abc123","type":"string"}},{"name":"sub_id","required":false,"in":"query","description":"Filter by sub identifier","schema":{"example":"my-list","type":"string"}},{"name":"is_deleted","required":false,"in":"query","description":"Include deleted favourites","schema":{"default":false,"example":false,"type":"boolean"}},{"name":"attach_image","required":false,"in":"query","description":"Include image details in the response","schema":{"default":false,"example":true,"type":"boolean"}}],"responses":{"200":{"description":"List of favourites","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/FavouriteDto"}}}}}},"security":[{"x-api-key":[]}],"summary":"List favourites for the authenticated user","tags":["Favourites"]},"post":{"operationId":"FavouritesController_create","parameters":[],"requestBody":{"required":true,"description":"Favourite payload","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateFavouriteDto"}}}},"responses":{"200":{"description":"Created favourite","content":{"application/json":{"schema":{"$ref":"#/components/schemas/FavouriteDto"}}}}},"security":[{"x-api-key":[]}],"summary":"Create a favourite for the authenticated user","tags":["Favourites"]}},"/favourites/{id}":{"get":{"operationId":"FavouritesController_findOne","parameters":[{"name":"id","required":true,"in":"path","description":"Favourite identifier","schema":{"example":1,"type":"string"}}],"responses":{"200":{"description":"Favourite details","content":{"application/json":{"schema":{"$ref":"#/components/schemas/FavouriteDto"}}}}},"security":[{"x-api-key":[]}],"summary":"Retrieve a favourite by identifier","tags":["Favourites"]},"delete":{"operationId":"FavouritesController_delete","parameters":[{"name":"id","required":true,"in":"path","description":"Favourite identifier","schema":{"example":1,"type":"string"}}],"responses":{"200":{"description":"Confirmation message","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MessageResponseDto"}}}}},"security":[{"x-api-key":[]}],"summary":"Delete a favourite","tags":["Favourites"]}},"/categories/{id}":{"get":{"operationId":"CategoriesController_getCategory","parameters":[{"name":"id","required":true,"in":"path","description":"Identifier of the category","schema":{"example":"1","type":"string"}}],"responses":{"200":{"description":"Category details","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CategoryDto"}}}}},"security":[{"x-api-key":[]}],"summary":"Retrieve a category by identifier","tags":["Categories"]}},"/categories":{"get":{"operationId":"CategoriesController_listCategories","parameters":[{"name":"limit","required":false,"in":"query","description":"Maximum number of results to return (default 10)","schema":{"minimum":1,"maximum":100,"default":10,"example":10,"type":"number"}},{"name":"page","required":false,"in":"query","description":"Zero-based page index","schema":{"minimum":0,"default":0,"example":0,"type":"number"}},{"name":"order","required":false,"in":"query","description":"Sort order of the results","schema":{"enum":["ASC","DESC","RANDOM"],"type":"string"}},{"name":"species_id","required":false,"in":"query","description":"Filter categories by species identifier","schema":{"example":"1","type":"string"}},{"name":"breed_groups","required":false,"in":"query","description":"Comma-separated list of breed groups to include in the response","schema":{"example":"Toy,Hound","type":"string"}},{"name":"exclude_breed_groups","required":false,"in":"query","description":"Comma-separated list of breed groups to exclude from the response","schema":{"example":"Mixed","type":"string"}},{"name":"lang","required":false,"in":"query","description":"Return translated fields when available for the requested language code","schema":{"example":"it","type":"string"}}],"responses":{"200":{"description":"List of categories","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/CategoryDto"}}}}}},"security":[{"x-api-key":[]}],"summary":"List categories","tags":["Categories"]}},"/health-tips":{"get":{"description":"Retrieve health tips with optional filtering by breed or species, and pagination support.","operationId":"HealthTipsController_getHealthTips","parameters":[{"name":"limit","required":false,"in":"query","description":"Number of health tips to return","schema":{"minimum":1,"maximum":100,"example":10,"type":"number"}},{"name":"offset","required":false,"in":"query","description":"Number of health tips to skip for pagination","schema":{"minimum":0,"example":0,"type":"number"}},{"name":"breed_id","required":false,"in":"query","description":"Filter health tips by breed ID","schema":{"example":"abys","type":"string"}},{"name":"species_id","required":false,"in":"query","description":"Filter health tips by species ID","schema":{"example":"dog","type":"string"}},{"name":"include_sources","required":false,"in":"query","description":"Include sources in the response","schema":{"example":false,"type":"boolean"}},{"name":"lang","required":false,"in":"query","description":"Two-letter language code for translated content","schema":{"example":"en","type":"string"}}],"responses":{"200":{"description":"Successfully retrieved health tips","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/HealthTipResponseDto"}}}}}},"security":[{"x-api-key":[]}],"summary":"Get a list of health tips","tags":["Health Tips"]}},"/health-tips/breed/{breedId}":{"get":{"description":"Retrieve all health tips for a specific breed with pagination support.","operationId":"HealthTipsController_getHealthTipsByBreed","parameters":[{"name":"breedId","required":true,"in":"path","description":"The breed identifier","schema":{"example":"115","type":"string"}},{"name":"limit","required":false,"in":"query","description":"Number of health tips to return (1-100)","schema":{"example":10,"type":"number"}},{"name":"offset","required":false,"in":"query","description":"Number of health tips to skip","schema":{"example":0,"type":"number"}},{"name":"include_sources","required":false,"in":"query","description":"Include sources in the response","schema":{"example":false,"type":"boolean"}},{"name":"lang","required":false,"in":"query","description":"Two-letter language code for translated content","schema":{"example":"en","type":"string"}}],"responses":{"200":{"description":"Successfully retrieved health tips for the breed","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/HealthTipResponseDto"}}}}}},"security":[{"x-api-key":[]}],"summary":"Get health tips for a specific breed","tags":["Health Tips"]}},"/health-tips/{id}":{"get":{"description":"Retrieve a specific health tip by its unique identifier.","operationId":"HealthTipsController_getHealthTipById","parameters":[{"name":"id","required":true,"in":"path","description":"The health tip ID","schema":{"example":1,"type":"string"}},{"name":"include_sources","required":false,"in":"query","description":"Include sources in the response","schema":{"example":false,"type":"boolean"}},{"name":"lang","required":false,"in":"query","description":"Two-letter language code for translated content","schema":{"example":"en","type":"string"}}],"responses":{"200":{"description":"Successfully retrieved the health tip","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HealthTipResponseDto"}}}},"404":{"description":"Health tip not found"}},"security":[{"x-api-key":[]}],"summary":"Get a health tip by ID","tags":["Health Tips"]}},"/images/search":{"get":{"operationId":"ImagesController_search","parameters":[{"name":"limit","required":false,"in":"query","description":"Maximum number of results to return (default 10)","schema":{"minimum":1,"maximum":100,"default":1,"example":1,"type":"number"}},{"name":"page","required":false,"in":"query","description":"Zero-based page index","schema":{"minimum":0,"default":0,"example":0,"type":"number"}},{"name":"order","required":false,"in":"query","description":"Sort order of the results","schema":{"enum":["ASC","DESC","RANDOM"],"type":"string"}},{"name":"species_id","required":false,"in":"query","description":"Filter images by species identifier","schema":{"example":"1","type":"string"}},{"name":"breed_groups","required":false,"in":"query","description":"Comma-separated list of breed groups to include in the response","schema":{"example":"Toy,Hound","type":"string"}},{"name":"exclude_breed_groups","required":false,"in":"query","description":"Comma-separated list of breed groups to exclude from the response","schema":{"example":"Mixed","type":"string"}},{"name":"lang","required":false,"in":"query","description":"Return translated fields when available for the requested language code","schema":{"example":"it","type":"string"}},{"name":"has_breeds","required":false,"in":"query","description":"Filter to images that have breed metadata","schema":{"example":true,"type":"boolean"}},{"name":"include_breeds","required":false,"in":"query","description":"Include breed information in the response","schema":{"example":false,"type":"boolean"}},{"name":"include_categories","required":false,"in":"query","description":"Include category information in the response","schema":{"example":true,"type":"boolean"}},{"name":"account_id","required":false,"in":"query","description":"Return images belonging to this account","schema":{"example":"account-123","type":"string"}},{"name":"breed_id","required":false,"in":"query","description":"Filter results by breed identifier","schema":{"example":"1","type":"string"}},{"name":"breed_ids","required":false,"in":"query","description":"Filter results by one or more comma-separated breed identifiers","schema":{"example":"1,115","type":"string"}},{"name":"colour_id","required":false,"in":"query","description":"Filter images by a single colour/pattern variant identifier","schema":{"example":"5f2e1c3a-...","type":"string"}},{"name":"colour_ids","required":false,"in":"query","description":"Filter images by one or more comma-separated colour/pattern variant identifiers","schema":{"example":"5f2e1c3a-...,6a1f2d4b-...","type":"string"}},{"name":"colour_code","required":false,"in":"query","description":"Filter images by registry colour/pattern code, e.g. \"b 22\" for FIFe colourpoints","schema":{"example":"b 22","type":"string"}},{"name":"has_colours","required":false,"in":"query","description":"Filter to images that have a registered colour/pattern variant","schema":{"example":true,"type":"boolean"}},{"name":"include_colours","required":false,"in":"query","description":"Include colour/pattern variant information in the response","schema":{"example":false,"type":"boolean"}},{"name":"age_months_min","required":false,"in":"query","description":"Minimum pet age at time of photo, in months","schema":{"example":12,"type":"number"}},{"name":"age_months_max","required":false,"in":"query","description":"Maximum pet age at time of photo, in months","schema":{"example":36,"type":"number"}},{"name":"mime_types","required":false,"in":"query","description":"Only return images of these file types: comma-separated jpg, png, gif (or image/jpeg, image/png, image/gif). Works with or without an API key.","schema":{"example":"png,gif","type":"string"}},{"name":"size","required":false,"in":"query","description":"Accepted for compatibility with the original API. Every value currently returns the standard image URL.","schema":{"enum":["thumb","small","med","full"],"type":"string"}},{"name":"sub_id","required":false,"in":"query","description":"Filter results by sub identifier","schema":{"example":"my-custom-id","type":"string"}},{"name":"order_by","required":false,"in":"query","description":"Field to order results by (e.g. created_at, sub_id, breeds, id)","schema":{"example":"created_at","type":"string"}}],"responses":{"200":{"description":"List of images that match the search criteria","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/ImageDto"}}}}}},"summary":"Search for public images","tags":["Images"]}},"/images/{id}":{"get":{"operationId":"ImagesController_findOne","parameters":[{"name":"id","required":true,"in":"path","description":"Identifier of the image","schema":{"example":"abc123","type":"string"}}],"responses":{"200":{"description":"Image details","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ImageDto"}}}}},"summary":"Retrieve an image by id","tags":["Images"]},"delete":{"operationId":"ImagesController_deleteImage","parameters":[{"name":"id","required":true,"in":"path","description":"Identifier of the image","schema":{"example":"abc12345","type":"string"}}],"responses":{"200":{"description":"Image deleted successfully"}},"security":[{"x-api-key":[]}],"summary":"Delete an uploaded image","tags":["Images"]}},"/images/{id}/labels":{"get":{"operationId":"ImagesController_getLatestLabels","parameters":[{"name":"id","required":true,"in":"path","description":"Identifier of the image","schema":{"example":"abc123","type":"string"}}],"responses":{"200":{"description":"Latest breed identification result"}},"security":[{"x-api-key":[]}],"summary":"Get the latest breed identification labels for an image","tags":["Images"]}},"/images/upload":{"post":{"description":"Uploads an image for processing. This is an opaque asynchronous operation. The response includes a `links.status` URL which SHOULD be polled to check the progress of the image analysis and optimization.","operationId":"ImagesController_uploadImage","parameters":[],"requestBody":{"required":true,"description":"Image upload payload. Provide either a binary file or a base64 encoded string.","content":{"multipart/form-data":{"schema":{"type":"object","properties":{"file":{"type":"string","format":"binary","description":"Binary image file when uploading using multipart/form-data"},"type":{"type":"string","enum":["base64","FILE"],"description":"Type of upload being performed","example":"FILE"},"image":{"type":"string","description":"Base64 encoded image data when uploading without a file"},"height":{"type":"number","description":"Optional resize height in pixels","example":600},"width":{"type":"number","description":"Optional resize width in pixels","example":800},"sub_id":{"type":"string","description":"Optional sub identifier associated with the image","example":"my-gallery"}},"required":["type"]}},"application/json":{"schema":{"type":"object","properties":{"file":{"type":"string","format":"binary","description":"Binary image file when uploading using multipart/form-data"},"type":{"type":"string","enum":["base64","FILE"],"description":"Type of upload being performed","example":"FILE"},"image":{"type":"string","description":"Base64 encoded image data when uploading without a file"},"height":{"type":"number","description":"Optional resize height in pixels","example":600},"width":{"type":"number","description":"Optional resize width in pixels","example":800},"sub_id":{"type":"string","description":"Optional sub identifier associated with the image","example":"my-gallery"}},"required":["type"]}}}},"responses":{"200":{"description":"Uploaded image metadata. NOTE: The `status` field in this initial response will likely be `to_be_reviewed`. Use the `links.status` URL to poll for the final `clean` or `unsafe` status.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ImageDto"}}}}},"security":[{"x-api-key":[]}],"summary":"Upload an image","tags":["Images"]}},"/images/{id}/status":{"get":{"description":"Returns the current processing status of the image. Clients should poll this endpoint until the status changes from `to_be_reviewed` to `clean` or `unsafe`, then `labelled`.","operationId":"ImagesController_getUploadStatus","parameters":[{"name":"id","required":true,"in":"path","description":"Identifier of the image","schema":{"example":"abc12345","type":"string"}}],"responses":{"200":{"description":"Current status of the image processing","content":{"application/json":{"schema":{"type":"object","properties":{"id":{"type":"string"},"status":{"type":"string","description":"The current status of the image analysis. Possible values: `to_be_reviewed` (processing), `clean` (approved and starting labelling), `unsafe` (rejected), `flagged` (requires manual review) `does_not_contain_species` (rejected), and finally `labelled` (ready for use).","example":"to_be_reviewed"},"updated_at":{"type":"string","format":"date-time"}}}}}}},"security":[{"x-api-key":[]}],"summary":"Get the processing status of an uploaded image","tags":["Images"]}},"/images/upload-sync":{"post":{"description":"This endpoint uploads an image and waits for analysis to complete before returning the result. The response includes the analysis status and any detected tags.","operationId":"ImagesController_uploadImageSync","parameters":[],"requestBody":{"required":true,"description":"Image upload payload. Provide either a binary file or a base64 encoded string.","content":{"multipart/form-data":{"schema":{"type":"object","properties":{"file":{"type":"string","format":"binary","description":"Binary image file when uploading using multipart/form-data"},"type":{"type":"string","enum":["base64","FILE"],"description":"Type of upload being performed","example":"FILE"},"image":{"type":"string","description":"Base64 encoded image data when uploading without a file"},"height":{"type":"number","description":"Optional resize height in pixels","example":600},"width":{"type":"number","description":"Optional resize width in pixels","example":800},"sub_id":{"type":"string","description":"Optional sub identifier associated with the image","example":"my-gallery"},"auto_crop":{"type":"boolean","description":"Automatically crop and detect multiple animals within the image. This will create a child image for each in the response.","default":true}},"required":["type"]}},"application/json":{"schema":{"type":"object","properties":{"file":{"type":"string","format":"binary","description":"Binary image file when uploading using multipart/form-data"},"type":{"type":"string","enum":["base64","FILE"],"description":"Type of upload being performed","example":"FILE"},"image":{"type":"string","description":"Base64 encoded image data when uploading without a file"},"height":{"type":"number","description":"Optional resize height in pixels","example":600},"width":{"type":"number","description":"Optional resize width in pixels","example":800},"sub_id":{"type":"string","description":"Optional sub identifier associated with the image","example":"my-gallery"},"auto_crop":{"type":"boolean","description":"Automatically crop and detect multiple animals within the image. This will create a child image for each in the response.","default":true}},"required":["type"]}}}},"responses":{"200":{"description":"Uploaded image metadata with completed analysis results","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ImageDto"}}}}},"security":[{"x-api-key":[]}],"summary":"Upload an image and wait for analysis to complete","tags":["Images"]}},"/images/{imageId}/public-requests":{"post":{"operationId":"ImagePublicRequestsController_createRequest","parameters":[{"name":"imageId","required":true,"in":"path","description":"Image ID","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateImagePublicRequestDto"}}}},"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ImagePublicRequestDto"}}}}},"security":[{"x-api-key":[]}],"summary":"Request an image to be made public","tags":["Images"]},"delete":{"operationId":"ImagePublicRequestsController_cancelRequest","parameters":[{"name":"imageId","required":true,"in":"path","description":"Image ID","schema":{"type":"string"}}],"responses":{"204":{"description":"Request cancelled"}},"security":[{"x-api-key":[]}],"summary":"Cancel a pending public request","tags":["Images"]}},"/images/{imageId}/public-requests/status":{"get":{"operationId":"ImagePublicRequestsController_getStatus","parameters":[{"name":"imageId","required":true,"in":"path","description":"Image ID","schema":{"type":"string"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ImagePublicRequestDto"}}}}},"security":[{"x-api-key":[]}],"summary":"Get the public request status for an image","tags":["Images"]}},"/sub-ids":{"get":{"operationId":"SubIdsController_getSubIds","parameters":[{"name":"limit","required":false,"in":"query","description":"Limit the number of results returned (default 1000)","schema":{"type":"number"}},{"name":"page","required":false,"in":"query","description":"Page number for pagination (default 0)","schema":{"type":"number"}},{"name":"start_date","required":false,"in":"query","description":"Filter by start date (ISO 8601 string)","schema":{"type":"string"}},{"name":"end_date","required":false,"in":"query","description":"Filter by end date (ISO 8601 string)","schema":{"type":"string"}}],"responses":{"200":{"description":"Detailed list of sub_ids with counts","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/GetSubIdsResponseDto"}}}}}},"security":[{"x-api-key":[]}],"summary":"Get detailed list of sub_ids used in the account along with counts representing usage activity","tags":["Sub IDs"]}}},"info":{"title":"TheCatAPI","description":"REST API documentation for the TheCatAPI created by ThatAPICompany. Documentation and tutorials available at https://docs.thedogapi.com","version":"1.7.1","contact":{"name":"ThatAPICompany","url":"https://thatapicompany.com","email":"aden@thatapicompany.com"}},"tags":[{"name":"Pets","description":"Create pets, upload their photos and videos, and run analyses on them."},{"name":"Calculators","description":"Daily calories and weight-loss plans from a weight, a breed or a pet."},{"name":"Breeds","description":"Breed data: characteristics, weights, groups and registered colours."},{"name":"Images","description":"Search public images, upload your own and check their processing."},{"name":"Health Tips","description":"Vet-reviewed health tips by breed."},{"name":"Facts","description":"Fact-checked breed and species facts."},{"name":"Breed Bans","description":"Breed legislation by country and by breed."},{"name":"Webhooks","description":"Get results pushed to your server when they are ready."},{"name":"Accounts","description":"Your quota, enabled features and analysis capabilities."},{"name":"Votes","description":"Votes on images."},{"name":"Favourites","description":"Saved favourite images."},{"name":"Categories","description":"Image categories."},{"name":"Sub IDs","description":"The sub_id values your users have used, with counts."}],"servers":[{"url":"https://beta-api.thecatapi.com/v1","description":"Production Server"}],"components":{"securitySchemes":{"x-api-key":{"type":"apiKey","in":"header","name":"x-api-key","description":"API key required to access protected resources"}},"schemas":{"FactResponseDto":{"type":"object","properties":{"id":{"type":"string","description":"Unique identifier for the fact","example":"aB3xY9mK12"},"title":{"type":"string","description":"Title of the fact","example":"The German Shepherd's 'Flying Trot'"},"fact":{"type":"string","description":"The fact content","example":"The German Shepherd is known for its efficient 'flying trot,' a gait where all four feet are momentarily off the ground, allowing for exceptional speed and endurance. This gait, favored in herding and police work, is a result of specific angulation in their hindquarters, enabling them to cover vast distances with minimal energy expenditure. The correct angulation is vital for breed standard and working ability."},"source_urls":{"description":"Array of source URLs for the fact","example":["https://www.akc.org/dog-breeds/german-shepherd-dog/","https://www.germanshepherddog.com/about-gsd/breed-standard/"],"type":"array","items":{"type":"string"}},"slug":{"type":"string","description":"URL-friendly slug for the fact","example":"the-german-shepherds-flying-trot"},"category":{"type":"string","description":"Category of the fact","example":"fun"},"species_id":{"type":"string","description":"Species ID this fact belongs to","example":1}},"required":["id","fact","species_id"]},"CatBreedExpansionDto":{"type":"object","properties":{"indoor":{"type":"boolean","description":"Indicates whether the breed is suitable for indoor living."},"lap":{"type":"boolean","description":"Whether the breed enjoys sitting on laps."},"adaptability":{"type":"number","description":"Adaptability of the breed on a 1-5 scale."},"affection_level":{"type":"number","description":"Affection level of the breed on a 1-5 scale."},"child_friendly":{"type":"number","description":"Suitability for households with children on a 1-5 scale."},"cat_friendly":{"type":"number","description":"Compatibility with other cats on a 1-5 scale."},"dog_friendly":{"type":"number","description":"Compatibility with dogs on a 1-5 scale."},"energy_level":{"type":"number","description":"Typical energy level on a 1-5 scale."},"grooming":{"type":"number","description":"Grooming requirements on a 1-5 scale."},"health_issues":{"type":"number","description":"Propensity for health issues on a 1-5 scale."},"intelligence":{"type":"number","description":"Intelligence on a 1-5 scale."},"shedding_level":{"type":"number","description":"Amount of shedding on a 1-5 scale."},"social_needs":{"type":"number","description":"Social needs on a 1-5 scale."},"stranger_friendly":{"type":"number","description":"How friendly the breed is towards strangers on a 1-5 scale."},"vocalisation":{"type":"number","description":"How vocal the breed is on a 1-5 scale."},"experimental":{"type":"boolean","description":"Whether the breed is experimental."},"hairless":{"type":"boolean","description":"Indicates if the breed is hairless."},"natural":{"type":"boolean","description":"Whether the breed occurs naturally."},"rare":{"type":"boolean","description":"Whether the breed is considered rare."},"rex":{"type":"boolean","description":"Whether the breed possesses the rex mutation."},"suppressed_tail":{"type":"boolean","description":"Whether the breed commonly has a suppressed tail."},"short_legs":{"type":"boolean","description":"Whether the breed commonly has short legs."},"hypoallergenic":{"type":"boolean","description":"Whether the breed is hypoallergenic."},"cfa_url":{"type":"string","description":"Cat Fanciers Association reference URL."},"vetstreet_url":{"type":"string","description":"Vetstreet reference URL."},"vcahospitals_url":{"type":"string","description":"VCA Hospitals reference URL."}},"required":["indoor","lap","adaptability","affection_level","child_friendly","cat_friendly","dog_friendly","energy_level","grooming","health_issues","intelligence","shedding_level","social_needs","stranger_friendly","vocalisation","experimental","hairless","natural","rare","rex","suppressed_tail","short_legs","hypoallergenic"]},"DogBreedExpansionDto":{"type":"object","properties":{"model":{"type":"string","description":"Model used for AI-generated imagery."},"male_height_inches":{"type":"string","description":"Average male height in inches."},"male_height_cm":{"type":"string","description":"Average male height in centimeters."},"female_height_inches":{"type":"string","description":"Average female height in inches."},"female_height_cm":{"type":"string","description":"Average female height in centimeters."},"male_weight_pounds":{"type":"string","description":"Average male weight in pounds."},"male_weight_kg":{"type":"string","description":"Average male weight in kilograms."},"female_weight_pounds":{"type":"string","description":"Average female weight in pounds."},"female_weight_kg":{"type":"string","description":"Average female weight in kilograms."},"family_friendly":{"type":"string","description":"Narrative describing the breed with families."},"good_with_other_dogs_score":{"type":"number","description":"Score indicating friendliness with other dogs."},"good_with_other_dogs_context":{"type":"string","description":"Context for the breed’s compatibility with other dogs."},"shedding_score":{"type":"number","description":"Shedding score on a 1-5 scale."},"shedding_reason":{"type":"string","description":"Explanation of the breed’s shedding tendencies."},"grooming_score":{"type":"number","description":"Grooming score on a 1-5 scale."},"grooming_type":{"type":"string","description":"Details about grooming requirements."},"daily_exercise_time_minutes":{"type":"string","description":"Recommended daily exercise time in minutes."},"exercise_type":{"type":"string","description":"Suggested exercise types for the breed."},"bidability_score":{"type":"number","description":"Bidability score on a 1-5 scale."},"bidability_characteristics":{"type":"string","description":"Description of training characteristics."},"prey_drive_score":{"type":"number","description":"Prey drive score on a 1-5 scale."},"prey_drive_reason":{"type":"string","description":"Reasoning behind the prey drive score."},"barking_score":{"type":"number","description":"Barking score on a 1-5 scale."},"barking_characteristics":{"type":"string","description":"Explanation of barking behaviors."},"language":{"type":"string","description":"Language used for translations."}}},"HorseBreedExpansionDto":{"type":"object","properties":{"height_hands":{"type":"string","description":"Typical height measured in hands."},"common_uses":{"type":"string","description":"Common uses for the horse breed."},"notable_traits":{"type":"string","description":"Notable traits of the horse breed."}}},"BreedSpeciesExpansionDto":{"type":"object","properties":{"cat":{"description":"Additional cat-specific breed attributes.","allOf":[{"$ref":"#/components/schemas/CatBreedExpansionDto"}]},"dog":{"description":"Additional dog-specific breed attributes.","allOf":[{"$ref":"#/components/schemas/DogBreedExpansionDto"}]},"horse":{"description":"Additional horse-specific breed attributes.","allOf":[{"$ref":"#/components/schemas/HorseBreedExpansionDto"}]}}},"BasicImageDto":{"type":"object","properties":{"species_id":{"type":"string","description":"Identifier of the species that the image belongs to","example":"1"},"id":{"type":"string","description":"Unique identifier of the image","example":"abc123"},"url":{"type":"string","description":"Publicly accessible image URL","example":"https://cdn.example.com/images/abc123.jpg"},"width":{"type":"number","description":"Width of the image in pixels","example":640},"height":{"type":"number","description":"Height of the image in pixels","example":480}},"required":["id","url","width","height"]},"BreedVenomCodeDto":{"type":"object","properties":{"code":{"type":"string","description":"VeNoM registry code.","example":"13634"},"name":{"type":"string","description":"VeNoM registry name for this code.","example":"German Shepherd Dog (Alsatian; GSD) - Black"},"is_primary":{"type":"boolean","description":"Whether this is the default VeNoM entry for the breed. Exactly one code per breed has this set to true.","example":true}},"required":["code","name","is_primary"]},"ProBreedDto":{"type":"object","properties":{"id":{"type":"string","description":"Unique identifier for the breed.","example":"115"},"name":{"type":"string","description":"Display name of the breed.","example":"German Shepherd"},"species_id":{"type":"string","description":"Species identifier that the breed belongs to.","example":"2"},"life_span":{"type":"string","description":"Expected life span of the breed.","example":"9-13"},"temperament":{"type":"string","description":"Typical temperament traits for the breed.","example":"Confident, courageous, intelligent, loyal, protective"},"origin":{"type":"string","description":"Origin location of the breed.","example":"Germany"},"country_codes":{"type":"string","description":"Comma separated country codes associated with the breed.","example":"DE"},"country_code":{"type":"string","description":"Primary country code for the breed.","example":"DE"},"description":{"type":"string","description":"Description of the breed.","example":"Large, athletic working dog with erect ears, noble expression, and confident bearing. Known for high intelligence, loyalty, courage, and versatility in herding and working roles."},"history":{"type":"string","description":"Historical background of the breed.","example":"Developed in 1899 by Captain Max von Stephanitz to create the ideal herding dog, standardized from local shepherd dogs. Intelligence and trainability led to worldwide use in police and military roles."},"alt_names":{"type":"string","description":"Alternate names for the breed."},"wikipedia_url":{"type":"string","description":"Wikipedia article URL for the breed."},"reference_image_id":{"type":"string","description":"Reference image identifier for the breed."},"bred_for":{"type":"string","description":"What the breed was originally bred for."},"perfect_for":{"type":"string","description":"Ideal uses or owners for the breed."},"breed_group":{"type":"string","description":"Group classification for the breed.","example":"Herding"},"indoor":{"type":"boolean","description":"Indicates if the breed is suited for indoor living."},"lap":{"type":"boolean","description":"Whether the breed enjoys being in laps."},"adaptability":{"type":"number","description":"Adaptability score on a 1-5 scale."},"affection_level":{"type":"number","description":"Affection level score on a 1-5 scale."},"child_friendly":{"type":"number","description":"Child friendliness score on a 1-5 scale."},"cat_friendly":{"type":"number","description":"Compatibility with cats score on a 1-5 scale."},"dog_friendly":{"type":"number","description":"Compatibility with dogs score on a 1-5 scale."},"energy_level":{"type":"number","description":"Energy level score on a 1-5 scale."},"grooming":{"type":"number","description":"Grooming requirement score on a 1-5 scale."},"health_issues":{"type":"number","description":"Health issues propensity score on a 1-5 scale."},"intelligence":{"type":"number","description":"Intelligence score on a 1-5 scale."},"shedding_level":{"type":"number","description":"Shedding level score on a 1-5 scale."},"social_needs":{"type":"number","description":"Social needs score on a 1-5 scale."},"stranger_friendly":{"type":"number","description":"Stranger friendliness score on a 1-5 scale."},"vocalisation":{"type":"number","description":"Vocalisation score on a 1-5 scale."},"experimental":{"type":"boolean","description":"Indicates if the breed is experimental."},"hairless":{"type":"boolean","description":"Indicates if the breed is hairless."},"natural":{"type":"boolean","description":"Indicates if the breed occurs naturally."},"rare":{"type":"boolean","description":"Indicates if the breed is rare."},"rex":{"type":"boolean","description":"Indicates if the breed possesses the rex mutation."},"suppressed_tail":{"type":"boolean","description":"Indicates if the breed has a suppressed tail."},"short_legs":{"type":"boolean","description":"Indicates if the breed has short legs."},"hypoallergenic":{"type":"boolean","description":"Indicates if the breed is hypoallergenic."},"cfa_url":{"type":"string","description":"Cat Fanciers Association URL related to the breed."},"vetstreet_url":{"type":"string","description":"Vetstreet article URL related to the breed."},"vcahospitals_url":{"type":"string","description":"VCA Hospitals article URL related to the breed."},"male_height_inches":{"type":"string","description":"Average male height in inches for dog breeds.","example":"24-26"},"male_height_cm":{"type":"string","description":"Average male height in centimeters for dog breeds.","example":"61-66"},"female_height_inches":{"type":"string","description":"Average female height in inches for dog breeds.","example":"22-24"},"female_height_cm":{"type":"string","description":"Average female height in centimeters for dog breeds.","example":"56-61"},"male_weight_pounds":{"type":"string","description":"Average male weight in pounds for dog breeds.","example":"65-90"},"male_weight_kg":{"type":"string","description":"Average male weight in kilograms for dog breeds.","example":"29-41"},"female_weight_pounds":{"type":"string","description":"Average female weight in pounds for dog breeds.","example":"50-70"},"female_weight_kg":{"type":"string","description":"Average female weight in kilograms for dog breeds.","example":"23-32"},"family_friendly":{"type":"string","description":"Narrative describing family friendliness for dog breeds.","example":"Good with children when properly socialized and trained, protective of family. It's not recommended to leave children unsupervised with dogs."},"good_with_other_dogs_score":{"type":"number","description":"Score indicating compatibility with other dogs.","example":3},"good_with_other_dogs_context":{"type":"string","description":"Additional context about compatibility with other dogs.","example":"Generally friendly with proper socialization, but can be selective with unfamiliar dogs due to protective nature"},"shedding_score":{"type":"number","description":"Shedding score on a 1-5 scale for dog breeds.","example":5},"shedding_reason":{"type":"string","description":"Explanation of shedding tendencies for dog breeds.","example":"Extreme year-round and seasonal shedding from thick double coat, often called 'German Shedders'"},"grooming_score":{"type":"number","description":"Grooming score on a 1-5 scale for dog breeds.","example":3},"grooming_type":{"type":"string","description":"Description of grooming requirements for dog breeds.","example":"Regular brushing 2-3 times weekly, daily during seasonal coat blows"},"daily_exercise_time_minutes":{"type":"string","description":"Recommended daily exercise time in minutes for dog breeds.","example":"120"},"exercise_type":{"type":"string","description":"Suggested exercise types for dog breeds.","example":"Running hiking agility work mental stimulation herding activities"},"bidability_score":{"type":"number","description":"Bidability score on a 1-5 scale for dog breeds.","example":5},"bidability_characteristics":{"type":"string","description":"Training characteristics associated with bidability.","example":"Extremely trainable, highly intelligent, work-focused and eager to please, excels in obedience"},"prey_drive_score":{"type":"number","description":"Prey drive score on a 1-5 scale for dog breeds.","example":3},"prey_drive_reason":{"type":"string","description":"Explanation of the prey drive score for dog breeds.","example":"Moderate prey drive with strong herding instincts, may chase smaller animals"},"barking_score":{"type":"number","description":"Barking score on a 1-5 scale for dog breeds.","example":3},"barking_characteristics":{"type":"string","description":"Explanation of barking behaviours for dog breeds.","example":"Alert barker and excellent watchdog, protective rather than nuisance barking"},"language":{"type":"string","description":"Language code used for dog breed translations."},"expansions":{"description":"Additional species-specific metadata expansions.","allOf":[{"$ref":"#/components/schemas/BreedSpeciesExpansionDto"}]},"image":{"description":"Reference image information for the breed.","allOf":[{"$ref":"#/components/schemas/BasicImageDto"}]},"venom_codes":{"description":"All VeNoM registry entries for this breed (colour/coat variants etc can mean more than one). Use the entry with is_primary = true if you just want a single default code.","type":"array","items":{"$ref":"#/components/schemas/BreedVenomCodeDto"}}},"required":["id","name"]},"CategoryDto":{"type":"object","properties":{"name":{"type":"string","description":"Category name","example":"Hats"},"species_id":{"type":"string","description":"Species identifier that this category belongs to","example":"1"},"id":{"type":"string","description":"Unique identifier for the category","example":"5"}},"required":["name","id"]},"ColourDto":{"type":"object","properties":{"id":{"type":"string","description":"Unique identifier for the colour","example":"5f2e1c3a-..."},"species_id":{"type":"string","description":"Species identifier this colour belongs to","example":"1"},"breed_id":{"type":"string","description":"Breed identifier, if this variant is breed-specific. Absent means it applies to any breed of this species.","example":"birm"},"code":{"type":"string","description":"Registry code","example":"b 22"},"name":{"type":"string","description":"Human-readable name","example":"Chocolate tabby point"},"base_colour":{"type":"string","description":"Base colour, decomposed from `code`","example":"chocolate"},"pattern":{"type":"string","description":"Pattern/division, decomposed from `code`","example":"tabby-point"},"standard":{"type":"string","description":"Registering body for this code","example":"FIFe"},"description":{"type":"string","description":"Longer description of the variant"}},"required":["id","species_id","code","name"]},"ImageReviewStateDto":{"type":"object","properties":{"approved":{"type":"boolean","description":"Passed review and may be served publicly"},"public":{"type":"boolean","description":"Marked public by its owner"},"pending":{"type":"boolean","description":"Awaiting review"},"rejected":{"type":"boolean","description":"Rejected in review"},"flagged":{"type":"boolean","description":"Flagged by automated safety checks"},"is_portrait":{"type":"boolean","description":"Generated portrait rather than a photograph. Not eligible as a breed reference image."}},"required":["approved","public","pending","rejected","flagged","is_portrait"]},"ImageDto":{"type":"object","properties":{"species_id":{"type":"string","description":"Identifier of the species that the image belongs to","example":"1"},"id":{"type":"string","description":"Unique identifier of the image","example":"abc123"},"url":{"type":"string","description":"Publicly accessible image URL","example":"https://cdn.example.com/images/abc123.jpg"},"width":{"type":"number","description":"Width of the image in pixels","example":640},"height":{"type":"number","description":"Height of the image in pixels","example":480},"sub_id":{"type":"string","description":"Custom tag / account sub identifier associated with this image","example":"natural"},"breeds":{"description":"Breeds associated with the image.","type":"array","items":{"$ref":"#/components/schemas/ProBreedDto"}},"categories":{"description":"Associated category metadata for the image","type":"array","items":{"$ref":"#/components/schemas/CategoryDto"}},"colours":{"description":"Registered colour/pattern variant(s) tagged on this image","type":"array","items":{"$ref":"#/components/schemas/ColourDto"}},"tags":{"description":"Tags associated with the image","type":"array","items":{"type":"string"}},"age_months":{"type":"number","description":"The pet's age in this photo, in whole months","example":14},"unsafe_reasons":{"description":"Reasons why the image failed safety checks","example":["adult content detected (very_likely)"],"type":"array","items":{"type":"string"}},"created_at":{"format":"date-time","type":"string","description":"Date the image was created","example":"2023-10-20T12:34:56.000Z"},"credit_name":{"type":"string","description":"Who the image is credited to, when an attribution was supplied at upload. Admin responses only: the value is free text from the uploader and is not sanitised yet, and admin uploads currently write a staff email into it.","example":"Jane Doe"},"credit_url":{"type":"string","description":"Link to the source or licence for the image. Admin responses only, for the same reason as credit_name.","example":"https://example.com/photo/123"},"review":{"description":"Review state of the image. Admin responses only - a caller picking a breed reference image needs to see whether an image is approved and public before choosing it.","example":{"approved":true,"public":true,"pending":false,"rejected":false,"flagged":false,"is_portrait":false},"allOf":[{"$ref":"#/components/schemas/ImageReviewStateDto"}]},"childImages":{"description":"Optional array of cropped child images if auto_crop was enabled and multiple animals were tightly detected.","type":"array","items":{"$ref":"#/components/schemas/ImageDto"}}},"required":["id","url","width","height"]},"VoteDto":{"type":"object","properties":{"id":{"type":"number","description":"Unique identifier of the vote","example":1120951},"image_id":{"type":"string","description":"Identifier of the image voted on","example":"asf2"},"sub_id":{"type":"string","description":"Custom sub-identifier","example":"my-user-1234"},"created_at":{"format":"date-time","type":"string","description":"Timestamp when the vote was created","example":"2023-10-28T17:29:28.000Z"},"value":{"type":"number","description":"Vote value (1 for upvote, -1 for downvote)","example":1},"country_code":{"type":"string","description":"Country code derived from IP","example":"AU"},"image":{"description":"Associated image data","allOf":[{"$ref":"#/components/schemas/ImageDto"}]}},"required":["id","image_id","created_at","value"]},"CreateVoteDto":{"type":"object","properties":{"image_id":{"type":"string","description":"Identifier of the image to vote on","example":"abc123"},"sub_id":{"type":"string","description":"Optional sub identifier","example":"my-user-123"},"value":{"type":"number","description":"Vote value (1 for upvote, -1 for downvote)","example":1},"country_code":{"type":"string","description":"Country code","example":"US"},"ip_address":{"type":"string","description":"IP Address"}},"required":["image_id","value"]},"CreateWebhookEndpointDto":{"type":"object","properties":{"url":{"type":"string","description":"The URL to deliver webhooks to","example":"https://example.com/hooks"},"description":{"type":"string","description":"Description of what this endpoint is for"},"enabled_events":{"description":"List of event types to subscribe to","example":["image.uploaded"],"type":"array","items":{"type":"string"}}},"required":["url","enabled_events"]},"AccountQuotaDto":{"type":"object","properties":{"quota":{"type":"number","description":"Total monthly image upload quota","example":10},"usage":{"type":"number","description":"Number of images uploaded this month","example":3},"remaining":{"type":"number","description":"Remaining images allowed to be uploaded this month","example":7}},"required":["quota","usage","remaining"]},"BanCountryListItemDto":{"type":"object","properties":{"iso_code":{"type":"string","example":"AU"},"name":{"type":"string","example":"Australia"},"has_national_legislation":{"type":"boolean","example":true},"legislation_level":{"type":"string","example":"national"}},"required":["iso_code","name","has_national_legislation","legislation_level"]},"BanBreedDto":{"type":"object","properties":{"breed_id":{"type":"string","example":"15"},"breed_name":{"type":"string","example":"American Pit Bull Terrier"},"ban_type":{"type":"string","example":"complete_ban"},"includes_mixes":{"type":"boolean","example":true},"filial_generation":{"type":"string","example":"F1"},"conditions":{"type":"string","example":"Must be desexed, muzzled in public"},"penalty_summary":{"type":"string","example":"Fine up to $10,000"}},"required":["breed_name","ban_type","includes_mixes"]},"BanCharacteristicDto":{"type":"object","properties":{"type":{"type":"string","example":"height"},"operator":{"type":"string","example":"greater_than"},"value":{"type":"string","example":"35"},"unit":{"type":"string","example":"cm"},"description":{"type":"string","example":"Dogs over 35cm shoulder height banned in urban areas"}},"required":["type","description"]},"BanRequirementDto":{"type":"object","properties":{"type":{"type":"string","example":"muzzle"},"description":{"type":"string","example":"Required in all public places"},"value":{"type":"string","example":"1.5m"},"is_mandatory":{"type":"boolean","example":true}},"required":["type","description","is_mandatory"]},"BanLegislationDto":{"type":"object","properties":{"id":{"type":"number","example":1},"legislation_name":{"type":"string","example":"Customs (Prohibited Imports) Regulations"},"legislation_type":{"type":"string","example":"breed_specific"},"approach":{"type":"string","example":"ban"},"status":{"type":"string","example":"active"},"animal_type":{"type":"string","example":"dog"},"effective_date":{"type":"string"},"source_url":{"type":"string"},"summary":{"type":"string"},"jurisdiction":{"type":"object"},"banned_breeds":{"type":"array","items":{"$ref":"#/components/schemas/BanBreedDto"}},"characteristics":{"type":"array","items":{"$ref":"#/components/schemas/BanCharacteristicDto"}},"requirements":{"type":"array","items":{"$ref":"#/components/schemas/BanRequirementDto"}}},"required":["id","legislation_name","legislation_type","approach","status","banned_breeds","characteristics","requirements"]},"BanJurisdictionDto":{"type":"object","properties":{"name":{"type":"string","example":"Victoria"},"type":{"type":"string","example":"state"},"legislation":{"type":"array","items":{"$ref":"#/components/schemas/BanLegislationDto"}}},"required":["name","type","legislation"]},"BanCountryResponseDto":{"type":"object","properties":{"country":{"type":"object"},"legislation":{"type":"array","items":{"$ref":"#/components/schemas/BanLegislationDto"}},"jurisdictions":{"type":"array","items":{"$ref":"#/components/schemas/BanJurisdictionDto"}}},"required":["country","legislation","jurisdictions"]},"BreedBanSummaryDto":{"type":"object","properties":{"country_iso_code":{"type":"string","example":"AU"},"country_name":{"type":"string","example":"Australia"},"jurisdiction_name":{"type":"string","example":"Victoria"},"ban_type":{"type":"string","example":"complete_ban"},"legislation_name":{"type":"string","example":"Customs (Prohibited Imports) Regulations"},"conditions":{"type":"string"}},"required":["country_iso_code","country_name","ban_type","legislation_name"]},"CreatePetDto":{"type":"object","properties":{"name":{"type":"string","description":"Name of the pet","example":"Buddy"},"breed_id":{"type":"string","description":"Breed identifier (references breeds.id)","example":"abys"},"species_id":{"type":"string","description":"Species identifier","example":"1"},"description":{"type":"string","description":"Description of the pet"},"microchip_id":{"type":"string","description":"Microchip ID","example":"123456789"},"sub_id":{"type":"string","description":"Subscription or other identifier","example":"sub_123"},"external_owner_id":{"type":"string","description":"The pet owner's ID in your own system (e.g. a Firebase uid). Many pets can share one value; filter GET /pets by it to list one owner's pets.","example":"Xy7rT2kLmN9pQ4sV8wZ1aB3cD5e","maxLength":255},"country":{"type":"string","description":"ISO 3166-1 alpha-2 country code for geographic and seasonal context","example":"AU"},"sex":{"type":"string","enum":["male","female","unknown"],"description":"Used to pick the sex-specific breed weight range in the calculators.","example":"female"},"neuter_status":{"type":"string","enum":["neutered","intact","unknown"],"description":"Used to pick the neutered or intact energy factor in the calculators.","example":"neutered"},"date_of_birth":{"type":"string","description":"ISO date string for date of birth. Provide this OR age_years/age_months.","example":"2022-06-15"},"age_years":{"type":"number","description":"Age in years. Used with age_months to compute date_of_birth.","example":3},"age_months":{"type":"number","description":"Age in months (0-11). Used with age_years to compute date_of_birth.","example":6},"body_condition_score":{"type":"number","description":"Body Condition Score (1-9 scale)","example":5,"minimum":1,"maximum":9},"poses":{"type":"string","description":"JSON string mapping file index (0-based) to pose enum value. E.g. {\"0\":\"front\",\"1\":\"side\"}","example":"{\"0\":\"front\",\"1\":\"side\"}"},"images":{"description":"Image files to upload (max 20)","type":"array","items":{"type":"string","format":"binary"}}}},"PetImageResponseDto":{"type":"object","properties":{"id":{"type":"string","example":"abc123"},"url":{"type":"string","example":"https://cdn.example.com/images/abc123.jpg"},"pet_id":{"type":"string","example":"pet123"},"width":{"type":"number","example":640},"height":{"type":"number","example":480},"pose":{"type":"string","enum":["front","side","rear","top"],"example":"front"},"pet_age_months":{"type":"number","description":"The pet's age in months when this image was taken","example":18},"age_years":{"type":"number","description":"Age in years component","example":1},"age_months":{"type":"number","description":"Age in months component (0-11)","example":6},"description":{"type":"string","description":"Description of the pet at the time of the photos","example":"Playing in the snow"},"portrait_style_id":{"type":"string","description":"The style of the AI-generated portrait","example":"studio"},"mime_type":{"type":"string","description":"MIME type of the media file","example":"image/jpeg"},"review_status":{"type":"string","description":"Review status of the media (e.g. clean, unsafe, to_be_reviewed)","example":"clean"},"upload_error":{"type":"boolean","description":"Whether there was an error processing/transcoding the video","example":false},"created_at":{"format":"date-time","type":"string","example":"2024-01-15T12:00:00.000Z"}},"required":["id","pet_id","width","height","created_at"]},"PetResponseDto":{"type":"object","properties":{"id":{"type":"string","example":"abc123"},"name":{"type":"string","example":"Buddy"},"breed_id":{"type":"string","example":"15"},"species_id":{"type":"string","example":"2"},"description":{"type":"string","example":"A friendly golden retriever"},"microchip_id":{"type":"string","example":"123456789"},"sub_id":{"type":"string","example":"sub_123"},"external_owner_id":{"type":"string","example":"Xy7rT2kLmN9pQ4sV8wZ1aB3cD5e","description":"The pet owner's ID in your own system"},"country":{"type":"string","example":"AU","description":"ISO 3166-1 alpha-2 country code"},"date_of_birth":{"type":"string","example":"2022-06-15"},"sex":{"type":"string","enum":["male","female","unknown"]},"neuter_status":{"type":"string","enum":["neutered","intact","unknown"]},"body_condition_score":{"type":"number","example":5,"description":"WSAVA Body Condition Score 1-9"},"body_condition_score_reasons":{"type":"string","example":"Reasons for the score"},"body_condition_score_timestamp":{"format":"date-time","type":"string","example":"2024-01-15T12:00:00.000Z"},"estimated_age_months":{"type":"number","example":36,"description":"Estimated age of the pet in months"},"estimated_age_reasons":{"type":"string","example":"Reasons for the age estimate"},"estimated_age_timestamp":{"format":"date-time","type":"string","example":"2024-01-15T12:00:00.000Z"},"genealogy_result":{"type":"object","description":"Genealogy analysis result"},"genealogy_timestamp":{"format":"date-time","type":"string","example":"2024-01-15T12:00:00.000Z"},"muscle_wasting_risk":{"type":"boolean","example":true,"description":"A wasting risk flag indicating obvious muscle loss."},"muscle_condition_reasons":{"type":"string","example":"Prominent spine and sharp scapular borders are visible, indicating severe muscle wasting.","description":"Reasons for the visual assessment."},"muscle_condition_timestamp":{"format":"date-time","type":"string","example":"2024-01-15T12:00:00.000Z"},"estimated_weight_kg":{"type":"number","example":12.5,"description":"Estimated weight of the pet in kilograms"},"estimated_size_classification":{"type":"string","example":"medium","description":"Size classification of the pet for its species"},"estimated_weight_reasons":{"type":"string","example":"Reasons for the weight estimate"},"estimated_weight_timestamp":{"format":"date-time","type":"string","example":"2024-01-15T12:00:00.000Z"},"images":{"type":"array","items":{"$ref":"#/components/schemas/PetImageResponseDto"}},"created_at":{"format":"date-time","type":"string","example":"2024-01-15T12:00:00.000Z"},"updated_at":{"format":"date-time","type":"string","example":"2024-01-15T12:00:00.000Z"}},"required":["id","images","created_at","updated_at"]},"UploadPetImagesDto":{"type":"object","properties":{"age_years":{"type":"number","description":"Age in years at the time images were taken","example":2},"age_months":{"type":"number","description":"Age in months (0-11) at the time images were taken","example":6},"poses":{"type":"string","description":"JSON string mapping file index to pose enum. E.g. {\"0\":\"front\",\"2\":\"back\"}"},"description":{"type":"string","description":"Description of the pet at the time of the photos","example":"Playing in the snow"},"images":{"description":"Image files to upload (max 20)","type":"array","items":{"type":"string","format":"binary"}}}},"UploadPetVideoDto":{"type":"object","properties":{"age_years":{"type":"number","description":"Age in years at the time the video was taken","example":2},"age_months":{"type":"number","description":"Age in months (0-11) at the time the video was taken","example":6},"description":{"type":"string","description":"Description of the pet at the time of the video","example":"Running in the yard"},"file":{"type":"string","format":"binary","description":"Video file to upload"}}},"PortraitStyleResponseDto":{"type":"object","properties":{"id":{"type":"string"},"name":{"type":"string"},"description":{"type":"string"},"category":{"type":"string"},"popularity_score":{"type":"number"}},"required":["id","name","popularity_score"]},"UpdatePetDto":{"type":"object","properties":{"name":{"type":"string","description":"Name of the pet"},"breed_id":{"type":"string","description":"Breed identifier"},"species_id":{"type":"string","description":"Species identifier"},"description":{"type":"string","description":"Description of the pet"},"microchip_id":{"type":"string","description":"Microchip ID"},"sub_id":{"type":"string","description":"Subscription or other identifier"},"external_owner_id":{"type":"string","description":"The pet owner's ID in your own system (e.g. a Firebase uid). Many pets can share one value; filter GET /pets by it to list one owner's pets. Send an empty string to clear it.","maxLength":255},"country":{"type":"string","description":"ISO 3166-1 alpha-2 country code for geographic and seasonal context","example":"AU"},"sex":{"type":"string","enum":["male","female","unknown"],"description":"Used to pick the sex-specific breed weight range in the calculators.","example":"female"},"neuter_status":{"type":"string","enum":["neutered","intact","unknown"],"description":"Used to pick the neutered or intact energy factor in the calculators.","example":"neutered"},"date_of_birth":{"type":"string","description":"ISO date for date of birth","example":"2022-06-15"},"age_years":{"type":"number","description":"Age in years","example":3},"age_months":{"type":"number","description":"Age in months (0-11)","example":6},"body_condition_score":{"type":"number","description":"Body Condition Score (1-9 scale)","example":5,"minimum":1,"maximum":9}}},"BcsVersionResultDto":{"type":"object","properties":{"prompt_version":{"type":"string","example":"v1"},"score":{"type":"number","example":5},"reasons":{"type":"string","example":"The ribs are easily felt without excess fat covering. The waist is easily observed behind ribs when viewed from above."},"confidence":{"type":"number","example":4},"confidence_reason":{"type":"string","example":"All key anatomical landmarks clearly visible across multiple images."},"generated_at":{"format":"date-time","type":"string","example":"2024-01-15T12:00:00.000Z"}},"required":["prompt_version","score","reasons","confidence","confidence_reason","generated_at"]},"BcsReviewDto":{"type":"object","properties":{"id":{"type":"string","example":"rv_8Kq2xT1a"},"pet_id":{"type":"string","example":"Mhq3zCuduT"},"status":{"type":"string","enum":["pending","completed","rejected"],"example":"pending","description":"`pending` until a vet has looked. `completed` when a vet has scored it. `rejected` when a vet could not score it from these photos; ask the owner for new ones."},"reason":{"type":"string","enum":["low_confidence","requested"],"example":"low_confidence","description":"`low_confidence` when the model could not see enough of the body. `requested` when you passed `request_review=true`."},"model_score":{"type":"number","example":6,"description":"The model score this review is checking (WSAVA 1-9)"},"model_confidence":{"type":"number","example":2,"description":"The model confidence (1-5) at the time of the request"},"vet_score":{"type":"number","example":5,"nullable":true,"description":"The vet score (WSAVA 1-9). Present when status is `completed`."},"vet_notes":{"type":"string","example":"Waist visible from above, ribs palpable with slight cover.","nullable":true,"description":"Vet notes, written for the owner."},"requested_at":{"format":"date-time","type":"string","example":"2026-09-30T02:11:04.000Z"},"completed_at":{"format":"date-time","type":"string","example":"2026-09-30T09:40:51.000Z","nullable":true}},"required":["id","pet_id","status","reason","model_score","model_confidence","requested_at"]},"BodyConditionScoreResponseDto":{"type":"object","properties":{"score":{"type":"number","example":5,"description":"Body Condition Score according to WSAVA 9-point scale"},"reasons":{"type":"string","example":"The ribs are easily felt without excess fat covering. The waist is easily observed behind ribs when viewed from above.","description":"Reasons for the score"},"condition_flags":{"example":["Elevated joint load"],"description":"Condition flags based on the Body Condition Score results","type":"array","items":{"type":"string"}},"breed_predispositions":{"example":["Hip dysplasia","Elbow dysplasia"],"description":"Genetic and physical predispositions based on the pet breed","type":"array","items":{"type":"string"}},"confidence":{"type":"number","example":4,"description":"Model confidence in the BCS assessment on a 1-5 scale. Derived from the visibility of key anatomical landmarks (ribs, waist, abdominal tuck) and number of images available. Not a probabilistic estimate."},"confidence_reason":{"type":"string","example":"All key anatomical landmarks clearly visible across multiple images.","description":"Human-readable explanation of what drove the confidence score"},"prompt_version":{"type":"string","example":"v1","description":"Prompt version used to generate this result"},"generated_at":{"format":"date-time","type":"string","example":"2024-01-15T12:00:00.000Z"},"comparison":{"description":"Result from a second prompt version, present only when compare_version is requested","allOf":[{"$ref":"#/components/schemas/BcsVersionResultDto"}]},"review":{"nullable":true,"description":"Vet review of this result. `null` when the model was confident and no review was requested. When present and `completed`, use `review.vet_score` as the score to show.","allOf":[{"$ref":"#/components/schemas/BcsReviewDto"}]}},"required":["score","reasons","condition_flags","breed_predispositions","confidence","confidence_reason","prompt_version","generated_at"]},"EstimatedAgeResponseDto":{"type":"object","properties":{"age_months":{"type":"number","example":36,"description":"Estimated age of the pet in months"},"reasons":{"type":"string","example":"Teeth show mild tartar accumulation typical of a 3 year old. Coat is still vibrant with no typical signs of greying around the muzzle. Eyes are clear.","description":"Reasons for the age estimate"},"plausible_range":{"type":"string","example":"12-18 months","description":"Plausible age range for the pet"},"life_stage":{"type":"string","example":"Adult","description":"Standardised life stage of the pet (e.g., Puppy/Kitten, Adult, Mature Adult, Senior)"},"generated_at":{"format":"date-time","type":"string","example":"2024-01-15T12:00:00.000Z"}},"required":["age_months","reasons","plausible_range","life_stage","generated_at"]},"MuscleConditionScoreResponseDto":{"type":"object","properties":{"wasting_risk_flag":{"type":"boolean","example":true,"description":"A wasting risk flag indicating obvious muscle loss."},"reasons":{"type":"string","example":"Prominent spine and sharp scapular borders are visible, indicating severe muscle wasting.","description":"Reasons for the visual assessment."},"generated_at":{"format":"date-time","type":"string","example":"2024-01-15T12:00:00.000Z"}},"required":["wasting_risk_flag","reasons","generated_at"]},"EstimatedWeightResponseDto":{"type":"object","properties":{"weight_kg":{"type":"number","example":12.5,"description":"Estimated weight of the pet in kilograms"},"size_classification":{"type":"string","example":"medium","enum":["small","medium","large"],"description":"Size classification of the pet for its species"},"reasons":{"type":"string","example":"Based on the proportions relative to common household objects and the apparent bone structure typical of a beagle mix, the pet appears to be in the medium weight range.","description":"Reasons for the weight estimate"},"generated_at":{"format":"date-time","type":"string","example":"2024-01-15T12:00:00.000Z"}},"required":["weight_kg","size_classification","reasons","generated_at"]},"PetHealthTipResponseDto":{"type":"object","properties":{"id":{"type":"string","example":"aB3xY9mK12"},"category":{"type":"string","example":"Nutrition"},"title":{"type":"string","example":"Increase Fibre Intake"},"description":{"type":"string","example":"Based on your dog's body condition score..."},"tip_type":{"type":"string","enum":["breed_standard","personalised"],"description":"\"breed_standard\" tips come from curated breed-specific seed data; \"personalised\" tips are generated by AI based on this pet's images and health scores."},"sources":{"type":"array","items":{"type":"string"}}},"required":["id","category","title","description","tip_type"]},"PetHealthTipsResponseDto":{"type":"object","properties":{"items":{"type":"array","items":{"$ref":"#/components/schemas/PetHealthTipResponseDto"}},"generated_at":{"format":"date-time","type":"string","example":"2026-04-29T10:00:00.000Z"}},"required":["items","generated_at"]},"CreatePortraitDto":{"type":"object","properties":{"style":{"type":"string","description":"The style of portrait to generate (e.g., studio, pack_leader, birthday_party)","example":"studio"},"model":{"type":"string","description":"The codename of the model to use for generation (e.g., rembrandt, picasso, da-vinci, van-gogh, warhol)","example":"rembrandt"},"image_ids":{"description":"Optional list of specific image IDs to use as references. Must belong to the same pet.","example":["image123","image456"],"type":"array","items":{"type":"string"}},"aspect_ratio":{"type":"string","description":"Output aspect ratio, width:height. Omit for the default square portrait. Use a wide ratio such as 21:9 for profile headers. Not available with the picasso, da-vinci or warhol models.","enum":["1:1","2:3","3:2","3:4","4:3","4:5","5:4","9:16","16:9","21:9"],"example":"21:9"}},"required":["style"]},"CapabilityDto":{"type":"object","properties":{"id":{"type":"string","enum":["body_condition","muscle_condition","breed_identification","estimated_age","estimated_weight","portraits","pet_health_tips"],"example":"portraits"},"name":{"type":"string","example":"Pet portraits"},"description":{"type":"string","example":"Stylised artwork generated from the pet's photos."},"endpoints":{"example":["POST /pets/{petId}/portrait"],"type":"array","items":{"type":"string"}},"included":{"type":"boolean","example":true,"description":"Whether this account is entitled to the capability. We switch this on; false means every endpoint listed returns 403 whatever `enabled` says."},"enabled":{"type":"boolean","example":false,"description":"The account's own switch. false means every endpoint listed returns 403 for this account until switched back on. An endpoint works only when `included` and `enabled` are both true."},"updated_at":{"format":"date-time","type":"string","nullable":true,"example":"2026-09-30T02:00:00.000Z"}},"required":["id","name","description","endpoints","included","enabled","updated_at"]},"UpdateCapabilityDto":{"type":"object","properties":{"enabled":{"type":"boolean","example":false}},"required":["enabled"]},"CreateClinicalItemDto":{"type":"object","properties":{"item_type":{"type":"string","enum":["note","problem","diagnosis","procedure","medication","prescription","vaccination","lab_panel","addendum"],"example":"note"},"occurred_at":{"type":"string","description":"When this item happened. Defaults to the visit's occurred_at, which is the normal case: everything in a consultation happened at the consultation."},"occurred_at_precision":{"type":"string","enum":["exact","day","month","year"]},"title":{"type":"string","example":"History"},"body":{"type":"string","description":"The verbatim clinical text. Kept as written, never rewritten."},"payload":{"type":"object","description":"Type-specific structured fields.","example":{"qar":true,"calm":true,"bodyTemp":"normal"}},"concept_id":{"type":"string","description":"clinical_concepts.id, when known."},"entered_by":{"type":"string","example":"Karyn Kanowski"}},"required":["item_type"]},"CreateObservationDto":{"type":"object","properties":{"observation_type":{"type":"string","enum":["weight","bcs","muscle_condition_score","resting_respiratory_rate","heart_rate","temperature","capillary_refill_time","mucous_membrane_colour","exercise_band"],"example":"weight"},"value_numeric":{"type":"number","example":32.4},"value_text":{"type":"string","description":"Categorical result, e.g. mucous membrane colour.","example":"pink"},"unit":{"type":"string","enum":["kg","bpm","breaths_per_min","celsius","seconds","score"],"description":"Required whenever value_numeric is given, and checked against observation_type."},"scale":{"type":"string","description":"Required for scored types. '9' for a 1-9 BCS.","example":"9"},"observed_at":{"type":"string","description":"Defaults to the visit's occurred_at."},"observation_state":{"type":"string","enum":["asleep","resting","post_op","agitated"]},"method":{"type":"string","enum":["vet_manual_count","stethoscope","scale","thermometer","ai_video","ai_photo","owner_report","pms_import"]},"measured_by":{"type":"string","example":"Karyn Kanowski"}},"required":["observation_type"]},"CreateVisitDto":{"type":"object","properties":{"occurred_at":{"type":"string","description":"When the visit happened. Required, never defaulted, rejected if in the future or before the pet was born.","example":"2026-09-05T09:30:00Z"},"occurred_at_precision":{"type":"string","enum":["exact","day","month","year"],"description":"Defaults to exact for a full timestamp, day for a date-only value."},"ended_at":{"type":"string"},"timezone":{"type":"string","description":"IANA zone","example":"Europe/London"},"visit_type":{"type":"string","enum":["consultation","vaccination","surgery","emergency","follow_up","lab_only","other"]},"reason":{"type":"string","description":"Presenting complaint, verbatim."},"summary":{"type":"string"},"clinic_name":{"type":"string","example":"Wolfe Vets, Harrogate"},"clinic_external_id":{"type":"string"},"clinician_name":{"type":"string","example":"Karyn Kanowski"},"source":{"type":"string","enum":["api","pms_api","clinic_portal","owner_upload","document_extraction","migration"]},"source_system":{"type":"string","example":"happier_vet_portal"},"external_id":{"type":"string","description":"Your own id for this visit. Reposting the same one returns the existing visit rather than creating a second, so retries are safe."},"status":{"type":"string","enum":["draft","complete","amended"]},"consent_status":{"type":"string","enum":["obtained","not_obtained","not_required","not_recorded"]},"consent_reference":{"type":"string"},"verification_status":{"type":"string","enum":["unverified","vet_verified","disputed"],"description":"Whether a vet has confirmed this record. This is the caller's assertion about their own data, not a claim we validate, so treat it as provenance rather than proof."},"verified_by":{"type":"string","description":"Who verified it, when verification_status says one did.","example":"Karyn Kanowski"},"items":{"description":"Notes and other dated records, written in the same transaction as the visit.","type":"array","items":{"$ref":"#/components/schemas/CreateClinicalItemDto"}},"observations":{"description":"Measurements taken at this visit.","type":"array","items":{"$ref":"#/components/schemas/CreateObservationDto"}}},"required":["occurred_at"]},"ClinicalConceptResponseDto":{"type":"object","properties":{"id":{"type":"string"},"name":{"type":"string"},"venom_code":{"type":"string"},"snomed_code":{"type":"string"},"icd10_code":{"type":"string"}},"required":["id","name"]},"ClinicalItemResponseDto":{"type":"object","properties":{"id":{"type":"string"},"item_type":{"type":"string"},"occurred_at":{"format":"date-time","type":"string"},"occurred_at_precision":{"type":"string"},"title":{"type":"string"},"body":{"type":"string"},"payload":{"type":"object"},"concept_name":{"type":"string"},"entered_by":{"type":"string"},"confidence":{"type":"number"},"source":{"type":"string"},"concept":{"description":"Terminology codes. Admin responses only.","allOf":[{"$ref":"#/components/schemas/ClinicalConceptResponseDto"}]}},"required":["id","item_type","occurred_at","occurred_at_precision","source"]},"ObservationResponseDto":{"type":"object","properties":{"id":{"type":"string"},"observation_type":{"type":"string"},"value_numeric":{"type":"number"},"value_text":{"type":"string"},"unit":{"type":"string"},"scale":{"type":"string"},"observed_at":{"format":"date-time","type":"string"},"observation_state":{"type":"string"},"method":{"type":"string"},"measured_by":{"type":"string"},"confidence":{"type":"number"},"model_name":{"type":"string"},"verification_status":{"type":"string"},"source":{"type":"string"}},"required":["id","observation_type","observed_at","verification_status","source"]},"VisitResponseDto":{"type":"object","properties":{"id":{"type":"string"},"pet_id":{"type":"string"},"occurred_at":{"format":"date-time","type":"string"},"occurred_at_precision":{"type":"string"},"ended_at":{"format":"date-time","type":"string"},"timezone":{"type":"string"},"visit_type":{"type":"string"},"reason":{"type":"string"},"summary":{"type":"string"},"clinic_name":{"type":"string"},"clinician_name":{"type":"string"},"source":{"type":"string"},"source_system":{"type":"string"},"external_id":{"type":"string"},"status":{"type":"string"},"consent_status":{"type":"string"},"verification_status":{"type":"string"},"verified_by":{"type":"string"},"verified_at":{"format":"date-time","type":"string"},"created_at":{"format":"date-time","type":"string"},"items":{"type":"array","items":{"$ref":"#/components/schemas/ClinicalItemResponseDto"}},"observations":{"type":"array","items":{"$ref":"#/components/schemas/ObservationResponseDto"}}},"required":["id","pet_id","occurred_at","occurred_at_precision","visit_type","source","status","consent_status","verification_status","created_at"]},"EnergyRequirementRequestDto":{"type":"object","properties":{"pet_id":{"type":"string","description":"A pet on your account. Its latest weight, BCS, exercise band, age and breed are used for anything you don't send."},"breed_id":{"type":"string","description":"A breed, for its standard weight range when no weight or pet is given."},"weight_kg":{"type":"number","example":20,"description":"Current weight in kg."},"species":{"type":"string","enum":["dog","cat"],"description":"Defaults to the pet's or breed's species, then this API's."},"life_stage":{"type":"string","enum":["growth","adult","senior"],"description":"growth for puppies and kittens. Derived from age when not sent (under 12 months is growth)."},"age_months":{"type":"number","example":30,"description":"Age in months. Needed for a growing dog."},"sex":{"type":"string","enum":["male","female","unknown"],"description":"Picks the sex-specific breed weight range."},"bcs":{"type":"number","example":6,"description":"Body condition score, 1-9."},"neuter_status":{"type":"string","enum":["neutered","intact","unknown"],"description":"Unknown spans both neutered and intact ranges."},"exercise_band":{"type":"string","enum":["lt_30","30_60","gt_60"],"description":"Actual daily exercise, not intended: under 30, 30 to 60, or over 60 minutes. Adult dogs only. Without it, adult dogs get a result for each band."},"input_policy":{"type":"string","enum":["any","measured_only"],"default":"any","description":"measured_only refuses inputs estimated from photos. Clinician tools and insurers will usually want it."},"lang":{"type":"string","example":"en-GB","description":"Language for message text. en-GB only today."},"reproductive":{"type":"string","enum":["none","gestation","lactation"],"default":"none"},"factor_choice":{"type":"string","enum":["low","mid","high"],"default":"mid"},"kcal_per_cup":{"type":"number","example":350,"description":"Food energy per cup, for portions in cups."},"kcal_per_can":{"type":"number","example":380,"description":"Food energy per can, for portions in cans."},"kcal_per_kg":{"type":"number","example":3700,"description":"Food energy per kg, for portions in grams."}}},"WeightLossPlanRequestDto":{"type":"object","properties":{"pet_id":{"type":"string","description":"A pet on your account. Its latest weight, BCS, exercise band, age and breed are used for anything you don't send."},"breed_id":{"type":"string","description":"A breed, for its standard weight range when no weight or pet is given."},"weight_kg":{"type":"number","example":20,"description":"Current weight in kg."},"species":{"type":"string","enum":["dog","cat"],"description":"Defaults to the pet's or breed's species, then this API's."},"life_stage":{"type":"string","enum":["growth","adult","senior"],"description":"growth for puppies and kittens. Derived from age when not sent (under 12 months is growth)."},"age_months":{"type":"number","example":30,"description":"Age in months. Needed for a growing dog."},"sex":{"type":"string","enum":["male","female","unknown"],"description":"Picks the sex-specific breed weight range."},"bcs":{"type":"number","example":6,"description":"Body condition score, 1-9."},"neuter_status":{"type":"string","enum":["neutered","intact","unknown"],"description":"Unknown spans both neutered and intact ranges."},"exercise_band":{"type":"string","enum":["lt_30","30_60","gt_60"],"description":"Actual daily exercise, not intended: under 30, 30 to 60, or over 60 minutes. Adult dogs only. Without it, adult dogs get a result for each band."},"input_policy":{"type":"string","enum":["any","measured_only"],"default":"any","description":"measured_only refuses inputs estimated from photos. Clinician tools and insurers will usually want it."},"lang":{"type":"string","example":"en-GB","description":"Language for message text. en-GB only today."},"ideal_weight_kg":{"type":"number","example":30,"description":"Vet-entered ideal weight in kg. Wins over BCS and breed."},"mode":{"type":"string","enum":["staged","direct"],"default":"staged","description":"staged steps down one body condition band at a time; direct feeds for ideal weight straight away."}}},"CreatePetObservationDto":{"type":"object","properties":{"observation_type":{"type":"string","enum":["exercise_band","weight","bcs"],"example":"exercise_band"},"value_text":{"type":"string","description":"For exercise_band: lt_30, 30_60 or gt_60 minutes a day of actual exercise, not intended.","example":"30_60"},"value_numeric":{"type":"number","description":"For weight (kg) or bcs.","example":24.5},"unit":{"type":"string","enum":["kg","score"],"description":"kg for weight, score for bcs."},"scale":{"type":"string","description":"Required for bcs: '9' for a 1-9 score.","example":"9"},"observed_at":{"type":"string","description":"When it was observed. Defaults to now. Rejected if in the future."},"method":{"type":"string","enum":["owner_report","scale","vet_manual_count"],"description":"Defaults to owner_report."}},"required":["observation_type"]},"PetObservationResponseDto":{"type":"object","properties":{"id":{"type":"string"},"pet_id":{"type":"string"},"observation_type":{"type":"string","enum":["weight","bcs","muscle_condition_score","resting_respiratory_rate","heart_rate","temperature","capillary_refill_time","mucous_membrane_colour","exercise_band"]},"value_text":{"type":"string"},"value_numeric":{"type":"number"},"unit":{"type":"string"},"scale":{"type":"string"},"observed_at":{"format":"date-time","type":"string"},"method":{"type":"string"}},"required":["id","pet_id","observation_type","observed_at"]},"FavouriteDto":{"type":"object","properties":{"id":{"type":"number","description":"Unique identifier of the favourite entry","example":232413577},"image_id":{"type":"string","description":"Identifier of the related image","example":"asf2"},"sub_id":{"type":"string","description":"Custom identifier provided when creating the favourite","example":"my-user-1234"},"created_at":{"format":"date-time","type":"string","description":"Timestamp when the favourite was created","example":"2023-10-28T17:39:28.000Z"},"image":{"description":"Image metadata associated with the favourite","allOf":[{"$ref":"#/components/schemas/ImageDto"}]}},"required":["id","image_id","created_at"]},"CreateFavouriteDto":{"type":"object","properties":{"image_id":{"type":"string","description":"Identifier of the image to favourite","example":"abc123"},"sub_id":{"type":"string","description":"Optional sub identifier to group favourites","example":"my-list"},"client_ip_address":{"type":"string","description":"Client IP address used for auditing","example":"192.0.2.1"},"ip_address":{"type":"string","description":"IP Address","example":"127.0.0.1"},"country_code":{"type":"string","description":"ISO Alpha-2 country code derived from the request","example":"US"}},"required":["image_id"]},"MessageResponseDto":{"type":"object","properties":{"message":{"type":"string","description":"Status of the operation","example":"SUCCESS"}},"required":["message"]},"HealthTipResponseDto":{"type":"object","properties":{"id":{"type":"string","description":"Unique identifier for the health tip","example":"aB3xY9mK12"},"title":{"type":"string","description":"Title of the health tip"},"category":{"type":"string","description":"Category of the health tip"},"description":{"type":"string","description":"Description of the health tip"},"sources":{"description":"Array of sources for the health tip","type":"array","items":{"type":"string"}},"species_id":{"type":"string","description":"Species ID this health tip belongs to","example":1}},"required":["id","description","species_id"]},"CreateImagePublicRequestDto":{"type":"object","properties":{"request_message":{"type":"string","description":"Optional message to the admin explaining why this image should be public","maxLength":500}}},"ImagePublicRequestDto":{"type":"object","properties":{"id":{"type":"string"},"image_id":{"type":"string"},"account_id":{"type":"string"},"status":{"type":"string","enum":["pending","approved","denied","cancelled"]},"request_message":{"type":"string"},"admin_message":{"type":"string"},"actioned_by_email":{"type":"string","description":"Populated in admin responses only"},"actioned_at":{"format":"date-time","type":"string"},"created_at":{"format":"date-time","type":"string"},"updated_at":{"format":"date-time","type":"string"},"image":{"type":"object","description":"Populated in admin responses only"}},"required":["id","image_id","account_id","status","created_at","updated_at"]},"GetSubIdsResponseDto":{"type":"object","properties":{"sub_id":{"type":"string","description":"The related sub_id","example":"my-user-123"},"images":{"type":"number","description":"Number of images associated with this sub_id","example":5},"votes":{"type":"number","description":"Number of votes associated with this sub_id","example":12},"favourites":{"type":"number","description":"Number of favourites associated with this sub_id","example":3},"pets":{"type":"number","description":"Number of pets associated with this sub_id","example":0}},"required":["sub_id","images","votes","favourites","pets"]}}},"security":[{"x-api-key":[]}]}