{"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"}}}}}},"security":[{"bearer":[]}],"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"}}}}},"security":[{"bearer":[]}],"summary":"Get a vote by ID","tags":["Votes"]}},"/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"]}},"/accounts/{accountId}/quota":{"get":{"operationId":"AccountsController_getAccountQuota","parameters":[{"name":"accountId","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":"Current quota status for the account","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AccountQuotaDto"}}}}},"security":[{"x-api-key":[]}],"summary":"Get an account's quota, usage and remaining (Admin only)","tags":["Accounts"]},"patch":{"operationId":"AccountsController_updateQuota","parameters":[{"name":"accountId","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateAccountQuotaDto"}}}},"responses":{"200":{"description":"Quota updated successfully","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AccountQuotaDto"}}}}},"security":[{"x-api-key":[]}],"summary":"Update an account's monthly image upload quota (Admin only)","tags":["Accounts"]}},"/accounts/{accountId}/overview":{"get":{"operationId":"AccountsController_getAccountOverview","parameters":[{"name":"accountId","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"security":[{"x-api-key":[]}],"summary":"Get account overview stats (Admin only)","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":{"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"}}],"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 from Gemini. 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"]}},"/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":[]},{"bearer":[]}],"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":[]},{"bearer":[]}],"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":[]},{"bearer":[]}],"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":[]},{"bearer":[]}],"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":"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":[],"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"},"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"]},"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"]},"UpdateAccountQuotaDto":{"type":"object","properties":{"imageUploadQuota":{"type":"number","description":"New monthly image upload quota for the account","example":20}},"required":["imageUploadQuota"]},"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"},"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"},"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"},"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"]},"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"}]}},"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"}}},"required":["style"]},"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"},"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":[]}]}