swagger: "2.0"
info:
  description: |
    This is a sample server Petstore server.

    [Learn about Swagger](http://swagger.io) or join the IRC channel `#swagger` on irc.freenode.net.

    For this sample, you can use the api key `special-key` to test the authorization filters
  version: "1.0.0"
  title: Test based on Swagger Pet Store
  termsOfService: http://helloreverb.com/terms/
  contact:
    name: apiteam@swagger.io
  license:
    name: Apache 2.0
    url: http://www.apache.org/licenses/LICENSE-2.0.html
host: petstore.swagger.io
consumes:
  - application/json
produces:
  - application/json

basePath: /v2
schemes:
  - http
paths:
  /pets:
    post:
      tags:
        - pet
      summary: Add a new pet to the store
      description: ""
      operationId: addPet
      parameters:
        - in: body
          name: body
          description: Pet object that needs to be added to the store
          required: false
          schema:
            $ref: "#/definitions/Pet"
      responses:
        "405":
          description: Invalid input
      security:
        - petstore_auth:
          - write_pets
          - read_pets
    put:
      tags:
        - pet
      summary: Update an existing pet
      description: ""
      operationId: updatePet
      consumes:
        - application/json
        - application/xml
      produces:
        - application/json
        - application/xml
      parameters:
        - in: body
          name: body
          description: Pet object that needs to be added to the store
          required: false
          schema:
            $ref: "#/definitions/Pet"
      responses:
        "405":
          description: Validation exception
        "404":
          description: Pet not found
        "400":
          description: Invalid ID supplied
      security:
        - petstore_auth:
          - write_pets
          - read_pets
  /pets/findByStatus:
    get:
      tags:
        - pet
      summary: Finds Pets by status
      description: Multiple status values can be provided with comma seperated strings
      operationId: findPetsByStatus
      produces:
        - application/json
        - application/xml
      parameters:
        - in: query
          name: status
          description: Status values that need to be considered for filter
          required: false
          type: array
          items:
            type: string
          collectionFormat: multi
      responses:
        "200":
          description: successful operation
          schema:
            type: array
            items:
              $ref: "#/definitions/Pet"
        "400":
          description: Invalid status value
      security:
        - petstore_auth:
          - write_pets
          - read_pets
  /pets/findByTags:
    get:
      tags:
        - pet
      summary: Finds Pets by tags
      description: Muliple tags can be provided with comma seperated strings. Use tag1, tag2, tag3 for testing.
      operationId: findPetsByTags
      produces:
        - application/json
        - application/xml
      parameters:
        - in: query
          name: tags
          description: Tags to filter by
          required: false
          type: array
          items:
            type: string
          collectionFormat: multi
      responses:
        "200":
          description: successful operation
          schema:
            type: array
            items:
              $ref: "#/definitions/Pet"
        "400":
          description: Invalid tag value
      security:
        - petstore_auth:
          - write_pets
          - read_pets
  /pets/{petId}:
    get:
      tags:
        - pet
      summary: Find pet by ID
      description: Returns a pet when ID < 10.  ID > 10 or nonintegers will simulate API error conditions
      operationId: getPetById
      produces:
        - application/json
        - application/xml
      parameters:
        - in: path
          name: petId
          description: ID of pet that needs to be fetched
          required: true
          type: integer
          format: int64
      responses:
        "404":
          description: Pet not found
        "200":
          description: successful operation
          schema:
            $ref: "#/definitions/Pet"
        "400":
          description: Invalid ID supplied
      security:
        - api_key: []
        - petstore_auth:
          - write_pets
          - read_pets
    post:
      tags:
        - pet
      summary: Updates a pet in the store with form data
      description: ""
      operationId: updatePetWithForm
      consumes:
        - application/x-www-form-urlencoded
      produces:
        - application/json
        - application/xml
      parameters:
        - in: path
          name: petId
          description: ID of pet that needs to be updated
          required: true
          type: string
        - in: formData
          name: name
          description: Updated name of the pet
          required: true
          type: string
        - in: formData
          name: status
          description: Updated status of the pet
          required: true
          type: string
      responses:
        "405":
          description: Invalid input
      security:
        - petstore_auth:
          - write_pets
          - read_pets
    delete:
      tags:
        - pet
      summary: Deletes a pet
      description: ""
      operationId: deletePet
      produces:
        - application/json
        - application/xml
      parameters:
        - in: header
          name: api_key
          description: ""
          required: true
          type: string
        - in: path
          name: petId
          description: Pet id to delete
          required: true
          type: integer
          format: int64
      responses:
        "400":
          description: Invalid pet value
      security:
        - petstore_auth:
          - write_pets
          - read_pets
  /stores/order:
    post:
      tags:
        - store
      summary: Place an order for a pet
      description: ""
      operationId: placeOrder
      produces:
        - application/json
        - application/xml
      parameters:
        - in: body
          name: body
          description: order placed for purchasing the pet
          required: false
          schema:
            $ref: "#/definitions/Order"
      responses:
        "200":
          description: successful operation
          schema:
            $ref: "#/definitions/Order"
        "400":
          description: Invalid Order
  /stores/order/{orderId}:
    get:
      tags:
        - store
      summary: Find purchase order by ID
      description: For valid response try integer IDs with value <= 5 or > 10. Other values will generated exceptions
      operationId: getOrderById
      produces:
        - application/json
        - application/xml
      parameters:
        - in: path
          name: orderId
          description: ID of pet that needs to be fetched
          required: true
          type: string
      responses:
        "404":
          description: Order not found
        "200":
          description: successful operation
          schema:
            $ref: "#/definitions/Order"
        "400":
          description: Invalid ID supplied
    delete:
      tags:
        - store
      summary: Delete purchase order by ID
      description: For valid response try integer IDs with value < 1000. Anything above 1000 or nonintegers will generate API errors
      operationId: deleteOrder
      produces:
        - application/json
        - application/xml
      parameters:
        - in: path
          name: orderId
          description: ID of the order that needs to be deleted
          required: true
          type: string
      responses:
        "404":
          description: Order not found
        "400":
          description: Invalid ID supplied
  /users:
    post:
      tags:
        - user
      summary: Create user
      description: This can only be done by the logged in user.
      operationId: createUser
      produces:
        - application/json
        - application/xml
      parameters:
        - in: body
          name: body
          description: Created user object
          required: false
          schema:
            $ref: "#/definitions/User"
      responses:
        default:
          description: successful operation
  /users/createWithArray:
    post:
      tags:
        - user
      summary: Creates list of users with given input array
      description: ""
      operationId: createUsersWithArrayInput
      produces:
        - application/json
        - application/xml
      parameters:
        - in: body
          name: body
          description: List of user object
          required: false
          schema:
            type: array
            items:
              $ref: "#/definitions/User"
      responses:
        default:
          description: successful operation
  /users/createWithList:
    post:
      tags:
        - user
      summary: Creates list of users with given input array
      description: ""
      operationId: createUsersWithListInput
      produces:
        - application/json
        - application/xml
      parameters:
        - in: body
          name: body
          description: List of user object
          required: false
          schema:
            type: array
            items:
              $ref: "#/definitions/User"
      responses:
        default:
          description: successful operation
  /users/login:
    get:
      tags:
        - user
      summary: Logs user into the system
      description: ""
      operationId: loginUser
      produces:
        - application/json
        - application/xml
      parameters:
        - in: query
          name: username
          description: The user name for login
          required: false
          type: string
        - in: query
          name: password
          description: The password for login in clear text
          required: false
          type: string
      responses:
        "200":
          description: successful operation
          schema:
            type: string
        "400":
          description: Invalid username/password supplied
  /users/logout:
    get:
      tags:
        - user
      summary: Logs out current logged in user session
      description: ""
      operationId: logoutUser
      produces:
        - application/json
        - application/xml
      responses:
        default:
          description: successful operation
  /users/{username}:
    get:
      tags:
        - user
      summary: Get user by user name
      description: ""
      operationId: getUserByName
      produces:
        - application/json
        - application/xml
      parameters:
        - in: path
          name: username
          description: The name that needs to be fetched. Use user1 for testing.
          required: true
          type: string
      responses:
        "404":
          description: User not found
        "200":
          description: successful operation
          schema:
            $ref: "#/definitions/User"
        "400":
          description: Invalid username supplied
    put:
      tags:
        - user
      summary: Updated user
      description: This can only be done by the logged in user.
      operationId: updateUser
      produces:
        - application/json
        - application/xml
      parameters:
        - in: path
          name: username
          description: name that need to be deleted
          required: true
          type: string
        - in: body
          name: body
          description: Updated user object
          required: false
          schema:
            $ref: "#/definitions/User"
      responses:
        "404":
          description: User not found
        "400":
          description: Invalid user supplied
    delete:
      tags:
        - user
      summary: Delete user
      description: This can only be done by the logged in user.
      operationId: deleteUser
      produces:
        - application/json
        - application/xml
      parameters:
        - in: path
          name: username
          description: The name that needs to be deleted
          required: true
          type: string
      responses:
        "404":
          description: User not found
        "400":
          description: Invalid username supplied
  /anyobject:
    post:
      parameters:
        - in: body
          name: body
          type: object
      responses:
        200:
            description: Anything
            type: object

  /object_response:
    get:
      parameters:
        - in: query
          name: fail
          type: boolean
      responses:
        200:
          description: object_response
          schema:
            $ref: '#/definitions/TestResponse'

  /validation_override/{id}:
    put:
      parameters:
        - in: path
          name: id
          type: number
        - in: query
          name: page
          type: number
        - in: body
          name: body
          schema:
            properties:
              name:
                type: string
                required: true
              description:
                type: string
                required: true

      responses:
        200:
          description: default response

  /array_of_object_response:
    get:
      parameters:
        - in: query
          name: fail
          type: boolean
      responses:
        200:
          description: object_response
          schema:
            type: array
            items:
              $ref: '#/definitions/TestResponse'

  /empty_array_of_objects_with_required_properties:
    post:
      parameters:
        - in: body
          name: body
          required: true
          schema:
            $ref: '#/definitions/ObjectWithArrayOfObjectsWithRequiredProperties'
      responses:
        200:
          description: empty_array_of_objects_required_properties_response
          schema:
            type: array
            items:
              $ref: '#/definitions/ObjectWithRequiredProperties'

  /nested-referenced-schema:
    post:
      parameters:
        - in: body
          name: body
          required: true
          schema:
            $ref: '#/definitions/TopObj'
      responses:
        200:
          description: Ok
        400:
          description: Bad Request

  /can-omit-type:
    get:
      parameters:
        - in: body
          name: body
          required: true
          type: object
          parameters:
            nested:
              schema:
                $ref: '#/definitions/TopObj'

  /supports-header-validation:
    get:
      parameters:
        - in: query
          name: fail
          type: boolean
        - in: header
          name: x-test-header-required
          type: string
          required: true
        - in: header
          name: x-test-header-optional
          type: number
          required: false

  /typeless:
    get:
      parameters:
        - in: query
          name: typeless
    post:
      parameters:
        - in: body
          name: body
    put:
      parameters:
        - in: body
          name: body
          schema:
            type: object
            required:
              - typeless-required
            properties:
              typeless:
              typeless-required:

securityDefinitions:
  api_key:
    type: apiKey
    name: api_key
    in: header
  petstore_auth:
    type: oauth2
    authorizationUrl: http://petstore.swagger.io/api/oauth/dialog
    flow: implicit
    scopes:
      write_pets: modify pets in your account
      read_pets: read your pets

definitions:
  TopObj:
    type: object
    required:
      - name
    properties:
      name:
        type: string
      nested:
        type: object
        schema:
          $ref: '#/definitions/NestedObj'
  NestedObj:
    type: object
    required:
      - name
    properties:
      name:
        type: string
      nested:
        type: object
        schema:
          $ref: '#/definitions/NestedNestedObj'
  NestedNestedObj:
    type: object
    required:
      - name
    properties:
      name:
        type: string
      nested:
        type: object
  ObjectWithArrayOfObjectsWithRequiredProperties:
    type: object
    required:
      - id
    properties:
      id:
        type: string
      objects:
        type: array
        items:
          $ref: '#/definitions/ObjectWithRequiredProperties'
  ObjectWithRequiredProperties:
    type: object
    required:
      - name
    properties:
      name:
        type: string
  TestResponse:
    type: object
    properties:
      id:
        type: integer
        format: int64
        required: true
      username:
        type: string
      firstName:
        type: string
  User:
    type: object
    properties:
      id:
        type: integer
        format: int64
      username:
        type: string
      firstName:
        type: string
      lastName:
        type: string
      email:
        type: string
      password:
        type: string
      phone:
        type: string
      userStatus:
        type: integer
        format: int32
        description: User Status
  Category:
    type: object
    properties:
      id:
        type: integer
        format: int64
      name:
        type: string
  Pet:
    type: object
    required:
      - name
      - photoUrls
    properties:
      id:
        type: integer
        format: int64
      category:
        $ref: "#/definitions/Category"
      name:
        type: string
        example: doggie
      photoUrls:
        type: array
        items:
          type: string
      tags:
        type: array
        items:
          $ref: "#/definitions/Tag"
      status:
        type: string
        description: pet status in the store
  Tag:
    type: object
    properties:
      id:
        type: integer
        format: int64
      name:
        type: string
  Order:
    type: object
    properties:
      id:
        type: integer
        format: int64
      petId:
        type: integer
        format: int64
      quantity:
        type: integer
        format: int32
      shipDate:
        type: string
        format: date-time
      status:
        type: string
        description: Order Status
      complete:
        type: boolean
