openapi: 3.0.3 info: title: The Cat API description: >- The Cat API is an open, free, read and write API all about cats. Access thousands of cat images, vote on favorites, manage collections, explore breed information, and upload your own cat images. Requires a free API key for write operations. version: 1.0.0 contact: name: The Cat API Support url: https://thecatapi.com/ license: name: Free Tier Available url: https://thecatapi.com/pricing servers: - url: https://api.thecatapi.com/v1 description: The Cat API Production Server security: - ApiKeyHeader: [] paths: /images/search: get: operationId: searchImages summary: Search Cat Images description: >- Search and retrieve cat images with optional filters for breed, category, size, format, and pagination. Returns random results by default. tags: - Images parameters: - name: limit in: query required: false description: Number of results to return (1–100). schema: type: integer minimum: 1 maximum: 100 default: 1 - name: page in: query required: false description: Page number for paginated results. schema: type: integer default: 0 - name: order in: query required: false description: Order of results. schema: type: string enum: - RANDOM - ASC - DESC default: RANDOM - name: breed_ids in: query required: false description: Comma-separated breed IDs to filter images. schema: type: string example: beng,abys - name: category_ids in: query required: false description: Comma-separated category IDs to filter images. schema: type: string - name: size in: query required: false description: Preferred image size. schema: type: string enum: - small - med - full - thumb - name: mime_types in: query required: false description: Comma-separated MIME types to filter by (jpg, png, gif). schema: type: string example: jpg,gif - name: has_breeds in: query required: false description: Filter to only images that have breed information. schema: type: integer enum: - 0 - 1 responses: '200': description: Array of cat images matching the search criteria. content: application/json: schema: type: array items: $ref: '#/components/schemas/Image' '400': description: Bad request. content: application/json: schema: $ref: '#/components/schemas/Error' '401': description: Unauthorized — invalid or missing API key. content: application/json: schema: $ref: '#/components/schemas/Error' /images/upload: post: operationId: uploadImage summary: Upload Cat Image description: Upload a cat image. Requires a valid API key. Supported formats are JPEG, PNG, and GIF. tags: - Images requestBody: required: true content: multipart/form-data: schema: type: object properties: file: type: string format: binary description: The image file to upload. sub_id: type: string description: Optional sub-account identifier. responses: '201': description: Image uploaded successfully. content: application/json: schema: $ref: '#/components/schemas/Image' '400': description: Bad request — unsupported file type or validation error. content: application/json: schema: $ref: '#/components/schemas/Error' '401': description: Unauthorized. content: application/json: schema: $ref: '#/components/schemas/Error' /images: get: operationId: getUploadedImages summary: Get Uploaded Images description: Retrieve images uploaded by the authenticated user. tags: - Images parameters: - name: limit in: query required: false schema: type: integer default: 10 maximum: 100 - name: page in: query required: false schema: type: integer default: 0 - name: order in: query required: false schema: type: string enum: - ASC - DESC default: ASC responses: '200': description: List of uploaded images. content: application/json: schema: type: array items: $ref: '#/components/schemas/Image' /images/{image_id}: get: operationId: getImage summary: Get Image description: Retrieve a specific image by its ID. tags: - Images parameters: - name: image_id in: path required: true description: Unique identifier of the image. schema: type: string responses: '200': description: Image details. content: application/json: schema: $ref: '#/components/schemas/Image' '404': description: Image not found. content: application/json: schema: $ref: '#/components/schemas/Error' delete: operationId: deleteImage summary: Delete Image description: Delete an uploaded image. Only works on images uploaded by the authenticated user. tags: - Images parameters: - name: image_id in: path required: true schema: type: string responses: '204': description: Image deleted successfully. '404': description: Image not found. content: application/json: schema: $ref: '#/components/schemas/Error' /breeds: get: operationId: listBreeds summary: List Cat Breeds description: Returns a list of all cat breeds with detailed information including origin, temperament, and characteristics. tags: - Breeds parameters: - name: limit in: query required: false schema: type: integer default: 10 maximum: 100 - name: page in: query required: false schema: type: integer default: 0 - name: attach_breed in: query required: false schema: type: integer enum: - 0 - 1 responses: '200': description: List of cat breeds. content: application/json: schema: type: array items: $ref: '#/components/schemas/Breed' /breeds/search: get: operationId: searchBreeds summary: Search Cat Breeds description: Search for cat breeds by name. tags: - Breeds parameters: - name: q in: query required: true description: Breed name search query. schema: type: string example: Siamese - name: attach_breed in: query required: false schema: type: integer enum: - 0 - 1 responses: '200': description: Matching breeds. content: application/json: schema: type: array items: $ref: '#/components/schemas/Breed' /breeds/{breed_id}: get: operationId: getBreed summary: Get Breed description: Retrieve detailed information about a specific cat breed by its ID. tags: - Breeds parameters: - name: breed_id in: path required: true description: Unique breed identifier (e.g., beng for Bengal). schema: type: string responses: '200': description: Breed details. content: application/json: schema: $ref: '#/components/schemas/Breed' '404': description: Breed not found. /favourites: get: operationId: listFavourites summary: List Favourites description: Retrieve all images saved as favourites by the authenticated user. tags: - Favourites parameters: - name: limit in: query required: false schema: type: integer default: 100 maximum: 100 - name: page in: query required: false schema: type: integer default: 0 - name: sub_id in: query required: false description: Filter by sub-account identifier. schema: type: string responses: '200': description: List of favourites. content: application/json: schema: type: array items: $ref: '#/components/schemas/Favourite' post: operationId: saveFavourite summary: Save Favourite description: Save an image as a favourite for the authenticated user. tags: - Favourites requestBody: required: true content: application/json: schema: type: object required: - image_id properties: image_id: type: string description: ID of the image to save as a favourite. sub_id: type: string description: Optional sub-account identifier. responses: '200': description: Favourite saved successfully. content: application/json: schema: type: object properties: message: type: string id: type: integer '400': description: Bad request. /favourites/{favourite_id}: get: operationId: getFavourite summary: Get Favourite description: Retrieve a specific favourite by its ID. tags: - Favourites parameters: - name: favourite_id in: path required: true schema: type: integer responses: '200': description: Favourite details. content: application/json: schema: $ref: '#/components/schemas/Favourite' delete: operationId: deleteFavourite summary: Delete Favourite description: Remove an image from the authenticated user's favourites. tags: - Favourites parameters: - name: favourite_id in: path required: true schema: type: integer responses: '200': description: Favourite deleted successfully. '400': description: Bad request. /votes: get: operationId: listVotes summary: List Votes description: Retrieve all votes cast by the authenticated user. tags: - Votes parameters: - name: limit in: query required: false schema: type: integer default: 100 maximum: 100 - name: page in: query required: false schema: type: integer default: 0 - name: sub_id in: query required: false description: Filter by sub-account identifier. schema: type: string responses: '200': description: List of votes. content: application/json: schema: type: array items: $ref: '#/components/schemas/Vote' post: operationId: createVote summary: Create Vote description: Cast an upvote (1) or downvote (0) on a cat image. tags: - Votes requestBody: required: true content: application/json: schema: type: object required: - image_id - value properties: image_id: type: string description: ID of the image to vote on. value: type: integer enum: - 0 - 1 description: Vote value — 1 for upvote, 0 for downvote. sub_id: type: string description: Optional sub-account identifier. responses: '200': description: Vote recorded successfully. content: application/json: schema: type: object properties: message: type: string id: type: integer '400': description: Bad request. /votes/{vote_id}: get: operationId: getVote summary: Get Vote description: Retrieve a specific vote by its ID. tags: - Votes parameters: - name: vote_id in: path required: true schema: type: integer responses: '200': description: Vote details. content: application/json: schema: $ref: '#/components/schemas/Vote' delete: operationId: deleteVote summary: Delete Vote description: Remove a vote cast by the authenticated user. tags: - Votes parameters: - name: vote_id in: path required: true schema: type: integer responses: '200': description: Vote deleted successfully. /categories: get: operationId: listCategories summary: List Categories description: Returns a list of image categories available for filtering image searches. tags: - Categories parameters: - name: limit in: query required: false schema: type: integer default: 7 - name: page in: query required: false schema: type: integer default: 0 responses: '200': description: List of categories. content: application/json: schema: type: array items: $ref: '#/components/schemas/Category' components: securitySchemes: ApiKeyHeader: type: apiKey in: header name: x-api-key description: API key obtained by registering at https://thecatapi.com/signup schemas: Image: type: object description: A cat image with metadata. properties: id: type: string description: Unique identifier of the image. url: type: string format: uri description: Full URL of the image. width: type: integer description: Width of the image in pixels. height: type: integer description: Height of the image in pixels. breeds: type: array description: Breed information associated with this image. items: $ref: '#/components/schemas/Breed' categories: type: array items: $ref: '#/components/schemas/Category' required: - id - url Breed: type: object description: Information about a cat breed. properties: id: type: string description: Unique breed identifier (e.g., beng, abys). name: type: string description: Name of the breed. cfa_url: type: string format: uri description: Cat Fanciers' Association profile URL. vetstreet_url: type: string format: uri vcahospitals_url: type: string format: uri temperament: type: string description: Comma-separated list of temperament traits. origin: type: string description: Country of origin. country_codes: type: string description: ISO country code(s) for the breed's origin. description: type: string description: Narrative description of the breed. life_span: type: string description: Expected lifespan range (e.g., "12-15"). indoor: type: integer enum: - 0 - 1 lap: type: integer enum: - 0 - 1 adaptability: type: integer minimum: 1 maximum: 5 affection_level: type: integer minimum: 1 maximum: 5 child_friendly: type: integer minimum: 1 maximum: 5 dog_friendly: type: integer minimum: 1 maximum: 5 energy_level: type: integer minimum: 1 maximum: 5 grooming: type: integer minimum: 1 maximum: 5 health_issues: type: integer minimum: 1 maximum: 5 intelligence: type: integer minimum: 1 maximum: 5 shedding_level: type: integer minimum: 1 maximum: 5 social_needs: type: integer minimum: 1 maximum: 5 stranger_friendly: type: integer minimum: 1 maximum: 5 vocalisation: type: integer minimum: 1 maximum: 5 wikipedia_url: type: string format: uri image: $ref: '#/components/schemas/Image' required: - id - name Favourite: type: object description: A favourite image saved by a user. properties: id: type: integer description: Unique identifier of the favourite. user_id: type: string description: ID of the user who saved this favourite. image_id: type: string description: ID of the favourited image. sub_id: type: string description: Optional sub-account identifier. created_at: type: string format: date-time description: Timestamp when the favourite was created. image: $ref: '#/components/schemas/Image' required: - id - image_id Vote: type: object description: A vote cast on an image by a user. properties: id: type: integer description: Unique identifier of the vote. user_id: type: string description: ID of the user who cast this vote. image_id: type: string description: ID of the voted image. value: type: integer enum: - 0 - 1 description: Vote value — 1 for upvote, 0 for downvote. sub_id: type: string description: Sub-account identifier. created_at: type: string format: date-time description: Timestamp when the vote was cast. country_code: type: string description: ISO country code of the voter. image: $ref: '#/components/schemas/Image' required: - id - image_id - value Category: type: object description: An image category tag. properties: id: type: integer description: Unique identifier of the category. name: type: string description: Name of the category. required: - id - name Error: type: object properties: status: type: integer description: HTTP status code. message: type: string description: Error message. tags: - name: Images description: Search, upload, retrieve, and delete cat images. - name: Breeds description: List, search, and retrieve cat breed information. - name: Favourites description: Manage user favourite cat images. - name: Votes description: Cast and manage votes on cat images. - name: Categories description: Retrieve available image categories.