openapi: 3.0.3
info:
  title: 'PetProject API Documentation'
  description: ''
  version: 1.0.0
servers:
  -
    url: 'http://127.0.0.1:8000'
tags:
  -
    name: Authentication
    description: "\nEndpoints for OTP login, Google login, profile management, and logout."
  -
    name: Collaborators
    description: "\nManage collaborator invites for a specific pet."
  -
    name: Documents
    description: "\nManage documents for a specific pet."
  -
    name: Invites
    description: ''
  -
    name: Lookups
    description: "\nPublic endpoints for species, breeds, and document categories."
  -
    name: Pets
    description: "\nManage pets owned by or shared with the authenticated user."
  -
    name: Reminders
    description: "\nManage reminders for a specific pet."
components:
  securitySchemes:
    default:
      type: http
      scheme: bearer
      description: 'Authenticate by sending a Bearer token in the Authorization header: <code>Authorization: Bearer {SANCTUM_TOKEN}</code>. Obtain a token by calling the <b>POST /api/v1/login</b> endpoint.'
security:
  -
    default: []
paths:
  /api/v1/auth/send-otp:
    post:
      summary: 'Send OTP to a phone number.'
      operationId: sendOTPToAPhoneNumber
      description: ''
      parameters: []
      responses: {  }
      tags:
        - Authentication
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              properties:
                phone:
                  type: string
                  description: 'Must match the regex /^\+[1-9]\d{6,14}$/. Must not be greater than 16 characters.'
                  example: bngzmiyvdljnikhw
              required:
                - phone
      security: []
  /api/v1/auth/verify-otp:
    post:
      summary: 'Verify OTP and get a token.'
      operationId: verifyOTPAndGetAToken
      description: 'Creates a new user if the phone number is not registered.'
      parameters: []
      responses: {  }
      tags:
        - Authentication
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              properties:
                phone:
                  type: string
                  description: 'Must match the regex /^\+[1-9]\d{6,14}$/. Must not be greater than 16 characters.'
                  example: bngzmiyvdljnikhw
                otp:
                  type: string
                  description: 'Must be 6 characters.'
                  example: aykcmy
              required:
                - phone
                - otp
      security: []
  /api/v1/auth/google:
    post:
      summary: 'Login with Google.'
      operationId: loginWithGoogle
      description: 'The mobile app handles Google Sign-In and sends the verified email.'
      parameters: []
      responses: {  }
      tags:
        - Authentication
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              properties:
                email:
                  type: string
                  description: 'Must be a valid email address. Must not be greater than 255 characters.'
                  example: gbailey@example.net
              required:
                - email
      security: []
  /api/v1/auth/profile:
    get:
      summary: "Get the authenticated user's profile."
      operationId: getTheAuthenticatedUsersProfile
      description: ''
      parameters: []
      responses:
        401:
          description: ''
          content:
            application/json:
              schema:
                type: object
                example:
                  status: false
                  status_code: 401
                  msg: Unauthenticated.
                  data: null
                properties:
                  status:
                    type: boolean
                    example: false
                  status_code:
                    type: integer
                    example: 401
                  msg:
                    type: string
                    example: Unauthenticated.
                  data:
                    type: string
                    example: null
                    nullable: true
      tags:
        - Authentication
  /api/v1/auth/update-profile:
    post:
      summary: "Update the authenticated user's profile."
      operationId: updateTheAuthenticatedUsersProfile
      description: ''
      parameters: []
      responses: {  }
      tags:
        - Authentication
      requestBody:
        required: false
        content:
          multipart/form-data:
            schema:
              type: object
              properties:
                name:
                  type: string
                  description: 'Must not be greater than 255 characters.'
                  example: b
                avatar:
                  type: string
                  format: binary
                  description: 'Must be an image. Must not be greater than 2048 kilobytes.'
  /api/v1/auth/logout:
    post:
      summary: 'Logout (revoke current token).'
      operationId: logoutrevokeCurrentToken
      description: ''
      parameters: []
      responses: {  }
      tags:
        - Authentication
  '/api/v1/pets/{pet_id}/collaborators':
    get:
      summary: 'List collaborators for a pet.'
      operationId: listCollaboratorsForAPet
      description: ''
      parameters: []
      responses:
        401:
          description: ''
          content:
            application/json:
              schema:
                type: object
                example:
                  status: false
                  status_code: 401
                  msg: Unauthenticated.
                  data: null
                properties:
                  status:
                    type: boolean
                    example: false
                  status_code:
                    type: integer
                    example: 401
                  msg:
                    type: string
                    example: Unauthenticated.
                  data:
                    type: string
                    example: null
                    nullable: true
      tags:
        - Collaborators
    post:
      summary: 'Invite a collaborator by phone number.'
      operationId: inviteACollaboratorByPhoneNumber
      description: ''
      parameters: []
      responses: {  }
      tags:
        - Collaborators
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              properties:
                phone:
                  type: string
                  description: 'Must not be greater than 20 characters.'
                  example: bngzmiyvdljnikhw
                role:
                  type: string
                  description: ''
                  example: family
                  enum:
                    - family
                    - vet
              required:
                - phone
                - role
    parameters:
      -
        in: path
        name: pet_id
        description: 'The ID of the pet.'
        example: 1
        required: true
        schema:
          type: integer
  '/api/v1/pets/{pet_id}/collaborators/{id}':
    put:
      summary: "Update a collaborator's role."
      operationId: updateACollaboratorsRole
      description: ''
      parameters: []
      responses: {  }
      tags:
        - Collaborators
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              properties:
                role:
                  type: string
                  description: ''
                  example: family
                  enum:
                    - family
                    - vet
              required:
                - role
    delete:
      summary: 'Remove a collaborator.'
      operationId: removeACollaborator
      description: ''
      parameters: []
      responses: {  }
      tags:
        - Collaborators
    parameters:
      -
        in: path
        name: pet_id
        description: 'The ID of the pet.'
        example: 1
        required: true
        schema:
          type: integer
      -
        in: path
        name: id
        description: 'The ID of the collaborator.'
        example: 1
        required: true
        schema:
          type: integer
  '/api/v1/pets/{pet_id}/documents':
    get:
      summary: 'List documents for a pet.'
      operationId: listDocumentsForAPet
      description: ''
      parameters: []
      responses:
        401:
          description: ''
          content:
            application/json:
              schema:
                type: object
                example:
                  status: false
                  status_code: 401
                  msg: Unauthenticated.
                  data: null
                properties:
                  status:
                    type: boolean
                    example: false
                  status_code:
                    type: integer
                    example: 401
                  msg:
                    type: string
                    example: Unauthenticated.
                  data:
                    type: string
                    example: null
                    nullable: true
      tags:
        - Documents
    post:
      summary: 'Create a document for a pet.'
      operationId: createADocumentForAPet
      description: ''
      parameters: []
      responses: {  }
      tags:
        - Documents
      requestBody:
        required: true
        content:
          multipart/form-data:
            schema:
              type: object
              properties:
                title:
                  type: string
                  description: 'Must not be greater than 255 characters.'
                  example: b
                description:
                  type: string
                  description: 'Must not be greater than 2000 characters.'
                  example: 'Et animi quos velit et fugiat.'
                  nullable: true
                category_id:
                  type: string
                  description: 'The <code>id</code> of an existing record in the document_categories table.'
                  example: architecto
                document_date:
                  type: string
                  description: 'Must be a valid date. Must be a date before or equal to <code>today</code>.'
                  example: '2022-04-21'
                  nullable: true
                issued_by:
                  type: string
                  description: 'Must not be greater than 255 characters.'
                  example: 'n'
                  nullable: true
                files:
                  type: array
                  description: 'Must be a file. Must not be greater than 10240 kilobytes.'
                  items:
                    type: string
                    format: binary
              required:
                - title
                - category_id
                - files
    parameters:
      -
        in: path
        name: pet_id
        description: 'The ID of the pet.'
        example: 1
        required: true
        schema:
          type: integer
  '/api/v1/pets/{pet_id}/documents/{id}':
    get:
      summary: 'Show a document.'
      operationId: showADocument
      description: ''
      parameters: []
      responses:
        401:
          description: ''
          content:
            application/json:
              schema:
                type: object
                example:
                  status: false
                  status_code: 401
                  msg: Unauthenticated.
                  data: null
                properties:
                  status:
                    type: boolean
                    example: false
                  status_code:
                    type: integer
                    example: 401
                  msg:
                    type: string
                    example: Unauthenticated.
                  data:
                    type: string
                    example: null
                    nullable: true
      tags:
        - Documents
    delete:
      summary: 'Delete a document.'
      operationId: deleteADocument
      description: ''
      parameters: []
      responses: {  }
      tags:
        - Documents
    post:
      summary: 'Update a document.'
      operationId: updateADocument
      description: ''
      parameters: []
      responses: {  }
      tags:
        - Documents
      requestBody:
        required: true
        content:
          multipart/form-data:
            schema:
              type: object
              properties:
                title:
                  type: string
                  description: 'Must not be greater than 255 characters.'
                  example: b
                description:
                  type: string
                  description: 'Must not be greater than 2000 characters.'
                  example: 'Et animi quos velit et fugiat.'
                  nullable: true
                category_id:
                  type: string
                  description: 'The <code>id</code> of an existing record in the document_categories table.'
                  example: null
                document_date:
                  type: string
                  description: 'Must be a valid date. Must be a date before or equal to <code>today</code>.'
                  example: '2022-04-21'
                  nullable: true
                issued_by:
                  type: string
                  description: 'Must not be greater than 255 characters.'
                  example: 'n'
                  nullable: true
                files:
                  type: array
                  description: 'Must be a file. Must not be greater than 10240 kilobytes.'
                  items:
                    type: string
                    format: binary
              required:
                - files
    parameters:
      -
        in: path
        name: pet_id
        description: 'The ID of the pet.'
        example: 1
        required: true
        schema:
          type: integer
      -
        in: path
        name: id
        description: 'The ID of the document.'
        example: 16
        required: true
        schema:
          type: integer
  '/api/v1/pets/{pet_id}/documents/{document_id}/files':
    post:
      summary: 'Upload files to a document.'
      operationId: uploadFilesToADocument
      description: ''
      parameters: []
      responses: {  }
      tags:
        - Documents
      requestBody:
        required: true
        content:
          multipart/form-data:
            schema:
              type: object
              properties:
                files:
                  type: array
                  description: 'Must be a file. Must not be greater than 10240 kilobytes.'
                  items:
                    type: string
                    format: binary
              required:
                - files
    parameters:
      -
        in: path
        name: pet_id
        description: 'The ID of the pet.'
        example: 1
        required: true
        schema:
          type: integer
      -
        in: path
        name: document_id
        description: 'The ID of the document.'
        example: 16
        required: true
        schema:
          type: integer
  /api/v1/invites:
    get:
      summary: 'List pending invites for the authenticated user.'
      operationId: listPendingInvitesForTheAuthenticatedUser
      description: ''
      parameters: []
      responses:
        401:
          description: ''
          content:
            application/json:
              schema:
                type: object
                example:
                  status: false
                  status_code: 401
                  msg: Unauthenticated.
                  data: null
                properties:
                  status:
                    type: boolean
                    example: false
                  status_code:
                    type: integer
                    example: 401
                  msg:
                    type: string
                    example: Unauthenticated.
                  data:
                    type: string
                    example: null
                    nullable: true
      tags:
        - Invites
  '/api/v1/invites/{collaborator_invite_id}/accept':
    post:
      summary: 'Accept an invite.'
      operationId: acceptAnInvite
      description: ''
      parameters: []
      responses: {  }
      tags:
        - Invites
    parameters:
      -
        in: path
        name: collaborator_invite_id
        description: 'The ID of the collaborator invite.'
        example: architecto
        required: true
        schema:
          type: string
  '/api/v1/invites/{collaborator_invite_id}/decline':
    post:
      summary: 'Decline an invite.'
      operationId: declineAnInvite
      description: ''
      parameters: []
      responses: {  }
      tags:
        - Invites
    parameters:
      -
        in: path
        name: collaborator_invite_id
        description: 'The ID of the collaborator invite.'
        example: architecto
        required: true
        schema:
          type: string
  /api/v1/species:
    get:
      summary: 'List all species.'
      operationId: listAllSpecies
      description: ''
      parameters: []
      responses:
        200:
          description: ''
          content:
            application/json:
              schema:
                type: object
                example:
                  status: true
                  status_code: 200
                  msg: Success
                  data:
                    -
                      id: 1
                      name: Dog
                    -
                      id: 2
                      name: Cat
                properties:
                  status:
                    type: boolean
                    example: true
                  status_code:
                    type: integer
                    example: 200
                  msg:
                    type: string
                    example: Success
                  data:
                    type: array
                    example:
                      -
                        id: 1
                        name: Dog
                      -
                        id: 2
                        name: Cat
                    items:
                      type: object
                      properties:
                        id:
                          type: integer
                          example: 1
                        name:
                          type: string
                          example: Dog
      tags:
        - Lookups
      security: []
  '/api/v1/species/{species_id}/breeds':
    get:
      summary: 'List breeds for a species.'
      operationId: listBreedsForASpecies
      description: ''
      parameters: []
      responses:
        200:
          description: ''
          content:
            application/json:
              schema:
                type: object
                example:
                  status: true
                  status_code: 200
                  msg: Success
                  data:
                    -
                      id: 6
                      name: Beagle
                      species_id: 1
                    -
                      id: 10
                      name: Boxer
                      species_id: 1
                    -
                      id: 4
                      name: Bulldog
                      species_id: 1
                    -
                      id: 15
                      name: Chihuahua
                      species_id: 1
                    -
                      id: 8
                      name: Dachshund
                      species_id: 1
                    -
                      id: 13
                      name: Doberman
                      species_id: 1
                    -
                      id: 2
                      name: 'German Shepherd'
                      species_id: 1
                    -
                      id: 3
                      name: 'Golden Retriever'
                      species_id: 1
                    -
                      id: 14
                      name: 'Great Dane'
                      species_id: 1
                    -
                      id: 17
                      name: 'Indian Pariah'
                      species_id: 1
                    -
                      id: 18
                      name: 'Indie / Mixed'
                      species_id: 1
                    -
                      id: 1
                      name: 'Labrador Retriever'
                      species_id: 1
                    -
                      id: 12
                      name: Pomeranian
                      species_id: 1
                    -
                      id: 5
                      name: Poodle
                      species_id: 1
                    -
                      id: 16
                      name: Pug
                      species_id: 1
                    -
                      id: 7
                      name: Rottweiler
                      species_id: 1
                    -
                      id: 11
                      name: 'Shih Tzu'
                      species_id: 1
                    -
                      id: 9
                      name: 'Siberian Husky'
                      species_id: 1
                properties:
                  status:
                    type: boolean
                    example: true
                  status_code:
                    type: integer
                    example: 200
                  msg:
                    type: string
                    example: Success
                  data:
                    type: array
                    example:
                      -
                        id: 6
                        name: Beagle
                        species_id: 1
                      -
                        id: 10
                        name: Boxer
                        species_id: 1
                      -
                        id: 4
                        name: Bulldog
                        species_id: 1
                      -
                        id: 15
                        name: Chihuahua
                        species_id: 1
                      -
                        id: 8
                        name: Dachshund
                        species_id: 1
                      -
                        id: 13
                        name: Doberman
                        species_id: 1
                      -
                        id: 2
                        name: 'German Shepherd'
                        species_id: 1
                      -
                        id: 3
                        name: 'Golden Retriever'
                        species_id: 1
                      -
                        id: 14
                        name: 'Great Dane'
                        species_id: 1
                      -
                        id: 17
                        name: 'Indian Pariah'
                        species_id: 1
                      -
                        id: 18
                        name: 'Indie / Mixed'
                        species_id: 1
                      -
                        id: 1
                        name: 'Labrador Retriever'
                        species_id: 1
                      -
                        id: 12
                        name: Pomeranian
                        species_id: 1
                      -
                        id: 5
                        name: Poodle
                        species_id: 1
                      -
                        id: 16
                        name: Pug
                        species_id: 1
                      -
                        id: 7
                        name: Rottweiler
                        species_id: 1
                      -
                        id: 11
                        name: 'Shih Tzu'
                        species_id: 1
                      -
                        id: 9
                        name: 'Siberian Husky'
                        species_id: 1
                    items:
                      type: object
                      properties:
                        id:
                          type: integer
                          example: 6
                        name:
                          type: string
                          example: Beagle
                        species_id:
                          type: integer
                          example: 1
      tags:
        - Lookups
      security: []
    parameters:
      -
        in: path
        name: species_id
        description: 'The ID of the species.'
        example: 1
        required: true
        schema:
          type: integer
  /api/v1/document-categories:
    get:
      summary: 'List all document categories.'
      operationId: listAllDocumentCategories
      description: ''
      parameters: []
      responses:
        200:
          description: ''
          content:
            application/json:
              schema:
                type: object
                example:
                  status: true
                  status_code: 200
                  msg: Success
                  data:
                    -
                      id: 1
                      name: Vaccination
                    -
                      id: 2
                      name: 'Blood Test'
                    -
                      id: 3
                      name: 'X-Ray / Imaging'
                    -
                      id: 4
                      name: Prescription
                    -
                      id: 5
                      name: Insurance
                    -
                      id: 6
                      name: 'Surgery Report'
                    -
                      id: 7
                      name: 'Allergy Report'
                    -
                      id: 8
                      name: 'Dental Record'
                    -
                      id: 9
                      name: 'Lab Report'
                    -
                      id: 10
                      name: Other
                properties:
                  status:
                    type: boolean
                    example: true
                  status_code:
                    type: integer
                    example: 200
                  msg:
                    type: string
                    example: Success
                  data:
                    type: array
                    example:
                      -
                        id: 1
                        name: Vaccination
                      -
                        id: 2
                        name: 'Blood Test'
                      -
                        id: 3
                        name: 'X-Ray / Imaging'
                      -
                        id: 4
                        name: Prescription
                      -
                        id: 5
                        name: Insurance
                      -
                        id: 6
                        name: 'Surgery Report'
                      -
                        id: 7
                        name: 'Allergy Report'
                      -
                        id: 8
                        name: 'Dental Record'
                      -
                        id: 9
                        name: 'Lab Report'
                      -
                        id: 10
                        name: Other
                    items:
                      type: object
                      properties:
                        id:
                          type: integer
                          example: 1
                        name:
                          type: string
                          example: Vaccination
      tags:
        - Lookups
      security: []
  /api/v1/pets:
    get:
      summary: "List the user's pets."
      operationId: listTheUsersPets
      description: ''
      parameters: []
      responses:
        401:
          description: ''
          content:
            application/json:
              schema:
                type: object
                example:
                  status: false
                  status_code: 401
                  msg: Unauthenticated.
                  data: null
                properties:
                  status:
                    type: boolean
                    example: false
                  status_code:
                    type: integer
                    example: 401
                  msg:
                    type: string
                    example: Unauthenticated.
                  data:
                    type: string
                    example: null
                    nullable: true
      tags:
        - Pets
    post:
      summary: 'Create a new pet.'
      operationId: createANewPet
      description: ''
      parameters: []
      responses: {  }
      tags:
        - Pets
      requestBody:
        required: true
        content:
          multipart/form-data:
            schema:
              type: object
              properties:
                name:
                  type: string
                  description: 'Must not be greater than 255 characters.'
                  example: b
                species_id:
                  type: string
                  description: 'The <code>id</code> of an existing record in the species table.'
                  example: architecto
                breed_id:
                  type: string
                  description: 'The <code>id</code> of an existing record in the breeds table.'
                  example: null
                  nullable: true
                date_of_birth:
                  type: string
                  description: 'Must be a valid date. Must be a date before or equal to <code>today</code>.'
                  example: '2022-04-21'
                  nullable: true
                gender:
                  type: string
                  description: ''
                  example: unknown
                  enum:
                    - male
                    - female
                    - unknown
                  nullable: true
                weight_kg:
                  type: number
                  description: 'Must be at least 0. Must not be greater than 999.99.'
                  example: 22
                  nullable: true
                medical_notes:
                  type: string
                  description: 'Must not be greater than 5000 characters.'
                  example: g
                  nullable: true
                is_neutered:
                  type: boolean
                  description: ''
                  example: true
                  nullable: true
                is_vaccinated:
                  type: boolean
                  description: ''
                  example: true
                  nullable: true
                microchip_number:
                  type: string
                  description: 'Must not be greater than 255 characters.'
                  example: z
                  nullable: true
                address_line_1:
                  type: string
                  description: 'This field is required when <code>pincode</code>, <code>city</code>, or <code>state</code> is present. Must not be greater than 255 characters.'
                  example: m
                  nullable: true
                address_line_2:
                  type: string
                  description: 'Must not be greater than 255 characters.'
                  example: i
                  nullable: true
                pincode:
                  type: string
                  description: 'This field is required when <code>address_line_1</code> is present. Must not be greater than 10 characters.'
                  example: yvdljn
                  nullable: true
                city:
                  type: string
                  description: 'This field is required when <code>address_line_1</code> is present. Must not be greater than 100 characters.'
                  example: i
                  nullable: true
                state:
                  type: string
                  description: 'This field is required when <code>address_line_1</code> is present. Must not be greater than 100 characters.'
                  example: k
                  nullable: true
                photo:
                  type: string
                  format: binary
                  description: 'Must be an image. Must not be greater than 5120 kilobytes.'
                  nullable: true
              required:
                - name
                - species_id
  '/api/v1/pets/{id}':
    get:
      summary: 'Show a pet.'
      operationId: showAPet
      description: ''
      parameters: []
      responses:
        401:
          description: ''
          content:
            application/json:
              schema:
                type: object
                example:
                  status: false
                  status_code: 401
                  msg: Unauthenticated.
                  data: null
                properties:
                  status:
                    type: boolean
                    example: false
                  status_code:
                    type: integer
                    example: 401
                  msg:
                    type: string
                    example: Unauthenticated.
                  data:
                    type: string
                    example: null
                    nullable: true
      tags:
        - Pets
    delete:
      summary: 'Delete a pet.'
      operationId: deleteAPet
      description: ''
      parameters: []
      responses: {  }
      tags:
        - Pets
    post:
      summary: 'Update a pet.'
      operationId: updateAPet
      description: ''
      parameters: []
      responses: {  }
      tags:
        - Pets
      requestBody:
        required: false
        content:
          multipart/form-data:
            schema:
              type: object
              properties:
                name:
                  type: string
                  description: 'Must not be greater than 255 characters.'
                  example: b
                species_id:
                  type: string
                  description: 'The <code>id</code> of an existing record in the species table.'
                  example: null
                breed_id:
                  type: string
                  description: 'The <code>id</code> of an existing record in the breeds table.'
                  example: null
                  nullable: true
                date_of_birth:
                  type: string
                  description: 'Must be a valid date. Must be a date before or equal to <code>today</code>.'
                  example: '2022-04-21'
                  nullable: true
                gender:
                  type: string
                  description: ''
                  example: male
                  enum:
                    - male
                    - female
                    - unknown
                weight_kg:
                  type: number
                  description: 'Must be at least 0. Must not be greater than 999.99.'
                  example: 22
                  nullable: true
                medical_notes:
                  type: string
                  description: 'Must not be greater than 5000 characters.'
                  example: g
                  nullable: true
                is_neutered:
                  type: boolean
                  description: ''
                  example: false
                  nullable: true
                is_vaccinated:
                  type: boolean
                  description: ''
                  example: false
                  nullable: true
                microchip_number:
                  type: string
                  description: 'Must not be greater than 255 characters.'
                  example: z
                  nullable: true
                address_line_1:
                  type: string
                  description: 'This field is required when <code>pincode</code>, <code>city</code>, or <code>state</code> is present. Must not be greater than 255 characters.'
                  example: m
                  nullable: true
                address_line_2:
                  type: string
                  description: 'Must not be greater than 255 characters.'
                  example: i
                  nullable: true
                pincode:
                  type: string
                  description: 'This field is required when <code>address_line_1</code> is present. Must not be greater than 10 characters.'
                  example: yvdljn
                  nullable: true
                city:
                  type: string
                  description: 'This field is required when <code>address_line_1</code> is present. Must not be greater than 100 characters.'
                  example: i
                  nullable: true
                state:
                  type: string
                  description: 'This field is required when <code>address_line_1</code> is present. Must not be greater than 100 characters.'
                  example: k
                  nullable: true
                photo:
                  type: string
                  format: binary
                  description: 'Must be an image. Must not be greater than 5120 kilobytes.'
                  nullable: true
    parameters:
      -
        in: path
        name: id
        description: 'The ID of the pet.'
        example: 1
        required: true
        schema:
          type: integer
  '/api/v1/pets/{pet_id}/photo':
    post:
      summary: "Upload a pet's photo."
      operationId: uploadAPetsPhoto
      description: ''
      parameters: []
      responses: {  }
      tags:
        - Pets
      requestBody:
        required: true
        content:
          multipart/form-data:
            schema:
              type: object
              properties:
                photo:
                  type: string
                  format: binary
                  description: 'Must be an image. Must not be greater than 5120 kilobytes.'
              required:
                - photo
    parameters:
      -
        in: path
        name: pet_id
        description: 'The ID of the pet.'
        example: 1
        required: true
        schema:
          type: integer
  '/api/v1/pets/{pet_id}/reminders':
    get:
      summary: 'List reminders for a pet.'
      operationId: listRemindersForAPet
      description: ''
      parameters: []
      responses:
        401:
          description: ''
          content:
            application/json:
              schema:
                type: object
                example:
                  status: false
                  status_code: 401
                  msg: Unauthenticated.
                  data: null
                properties:
                  status:
                    type: boolean
                    example: false
                  status_code:
                    type: integer
                    example: 401
                  msg:
                    type: string
                    example: Unauthenticated.
                  data:
                    type: string
                    example: null
                    nullable: true
      tags:
        - Reminders
    post:
      summary: 'Create a reminder for a pet.'
      operationId: createAReminderForAPet
      description: ''
      parameters: []
      responses: {  }
      tags:
        - Reminders
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              properties:
                title:
                  type: string
                  description: 'Must not be greater than 255 characters.'
                  example: b
                description:
                  type: string
                  description: 'Must not be greater than 2000 characters.'
                  example: 'Et animi quos velit et fugiat.'
                  nullable: true
                category:
                  type: string
                  description: ''
                  example: vaccine
                  enum:
                    - medication
                    - food
                    - vaccine
                    - housing
                    - grooming
                recurrence:
                  type: string
                  description: ''
                  example: weekly
                  enum:
                    - once
                    - daily
                    - weekly
                    - monthly
                    - yearly
                remind_at:
                  type: string
                  description: 'Must be a valid date.'
                  example: '2026-03-27T12:42:05'
                end_date:
                  type: string
                  description: 'Must be a valid date. Must be a date after or equal to <code>remind_at</code>.'
                  example: '2052-04-19'
                  nullable: true
                alert_before_minutes:
                  type: integer
                  description: ''
                  example: 1440
                  enum:
                    - 0
                    - 5
                    - 10
                    - 15
                    - 30
                    - 60
                    - 1440
                  nullable: true
                is_active:
                  type: boolean
                  description: ''
                  example: false
                  nullable: true
              required:
                - title
                - category
                - recurrence
                - remind_at
    parameters:
      -
        in: path
        name: pet_id
        description: 'The ID of the pet.'
        example: 1
        required: true
        schema:
          type: integer
  '/api/v1/pets/{pet_id}/reminders/{id}':
    get:
      summary: 'Show a reminder.'
      operationId: showAReminder
      description: ''
      parameters: []
      responses:
        401:
          description: ''
          content:
            application/json:
              schema:
                type: object
                example:
                  status: false
                  status_code: 401
                  msg: Unauthenticated.
                  data: null
                properties:
                  status:
                    type: boolean
                    example: false
                  status_code:
                    type: integer
                    example: 401
                  msg:
                    type: string
                    example: Unauthenticated.
                  data:
                    type: string
                    example: null
                    nullable: true
      tags:
        - Reminders
    put:
      summary: 'Update a reminder.'
      operationId: updateAReminder
      description: ''
      parameters: []
      responses: {  }
      tags:
        - Reminders
      requestBody:
        required: false
        content:
          application/json:
            schema:
              type: object
              properties:
                title:
                  type: string
                  description: 'Must not be greater than 255 characters.'
                  example: b
                description:
                  type: string
                  description: 'Must not be greater than 2000 characters.'
                  example: 'Et animi quos velit et fugiat.'
                  nullable: true
                category:
                  type: string
                  description: ''
                  example: grooming
                  enum:
                    - medication
                    - food
                    - vaccine
                    - housing
                    - grooming
                recurrence:
                  type: string
                  description: ''
                  example: weekly
                  enum:
                    - once
                    - daily
                    - weekly
                    - monthly
                    - yearly
                remind_at:
                  type: string
                  description: 'Must be a valid date.'
                  example: '2026-03-27T12:42:05'
                end_date:
                  type: string
                  description: 'Must be a valid date. Must be a date after or equal to <code>remind_at</code>.'
                  example: '2052-04-19'
                  nullable: true
                alert_before_minutes:
                  type: integer
                  description: ''
                  example: 0
                  enum:
                    - 0
                    - 5
                    - 10
                    - 15
                    - 30
                    - 60
                    - 1440
                  nullable: true
                is_active:
                  type: boolean
                  description: ''
                  example: false
                  nullable: true
    delete:
      summary: 'Delete a reminder.'
      operationId: deleteAReminder
      description: ''
      parameters: []
      responses: {  }
      tags:
        - Reminders
    parameters:
      -
        in: path
        name: pet_id
        description: 'The ID of the pet.'
        example: 1
        required: true
        schema:
          type: integer
      -
        in: path
        name: id
        description: 'The ID of the reminder.'
        example: 16
        required: true
        schema:
          type: integer
  /api/v1/reminders/upcoming:
    get:
      summary: "List upcoming reminders across all of the user's pets."
      operationId: listUpcomingRemindersAcrossAllOfTheUsersPets
      description: ''
      parameters:
        -
          in: query
          name: days
          description: 'Number of days to look ahead. Defaults to 7.'
          example: 14
          required: false
          schema:
            type: integer
            description: 'Number of days to look ahead. Defaults to 7.'
            example: 14
      responses:
        401:
          description: ''
          content:
            application/json:
              schema:
                type: object
                example:
                  status: false
                  status_code: 401
                  msg: Unauthenticated.
                  data: null
                properties:
                  status:
                    type: boolean
                    example: false
                  status_code:
                    type: integer
                    example: 401
                  msg:
                    type: string
                    example: Unauthenticated.
                  data:
                    type: string
                    example: null
                    nullable: true
      tags:
        - Reminders
