id: https://spec.openapis.org/oas/3.0/schema/WORK-IN-PROGRESS
$schema: http://json-schema.org/draft-04/schema#
description: The description of OpenAPI v3.0.x Documents
type: object
required:
  - openapi
  - info
  - paths
properties:
  openapi:
    type: string
    pattern: ^3\.0\.\d(-.+)?$
  info:
    $ref: '#/definitions/Info'
  externalDocs:
    $ref: '#/definitions/ExternalDocumentation'
  servers:
    type: array
    items:
      $ref: '#/definitions/Server'
  security:
    type: array
    items:
      $ref: '#/definitions/SecurityRequirement'
  tags:
    type: array
    items:
      $ref: '#/definitions/Tag'
    uniqueItems: true
  paths:
    $ref: '#/definitions/Paths'
  components:
    $ref: '#/definitions/Components'
patternProperties:
  '^x-': {}
additionalProperties: false
definitions:
  Reference:
    type: object
    required:
      - $ref
    patternProperties:
      '^\$ref$':
        type: string
        format: uri-reference
  Info:
    type: object
    required:
      - title
      - version
    properties:
      title:
        type: string
      description:
        type: string
      termsOfService:
        type: string
        format: uri-reference
      contact:
        $ref: '#/definitions/Contact'
      license:
        $ref: '#/definitions/License'
      version:
        type: string
    patternProperties:
      '^x-': {}
    additionalProperties: false


  Contact:
    type: object
    properties:
      name:
        type: string
      url:
        type: string
        format: uri-reference
      email:
        type: string
        format: email
    patternProperties:
      '^x-': {}
    additionalProperties: false

  License:
    type: object
    required:
      - name
    properties:
      name:
        type: string
      url:
        type: string
        format: uri-reference
    patternProperties:
      '^x-': {}
    additionalProperties: false

  Server:
    type: object
    required:
      - url
    properties:
      url:
        type: string
      description:
        type: string
      variables:
        type: object
        additionalProperties:
          $ref: '#/definitions/ServerVariable'
    patternProperties:
      '^x-': {}
    additionalProperties: false

  ServerVariable:
    type: object
    required:
      - default
    properties:
      enum:
        type: array
        items:
          type: string
      default:
        type: string
      description:
        type: string
    patternProperties:
      '^x-': {}
    additionalProperties: false

  Components:
    type: object
    properties:
      schemas:
        type: object
        patternProperties:
          '^[a-zA-Z0-9\.\-_]+$':
            oneOf:
              - $ref: '#/definitions/Schema'
              - $ref: '#/definitions/Reference'
      responses:
        type: object
        patternProperties:
          '^[a-zA-Z0-9\.\-_]+$':
            oneOf:
              - $ref: '#/definitions/Reference'
              - $ref: '#/definitions/Response'
      parameters:
        type: object
        patternProperties:
          '^[a-zA-Z0-9\.\-_]+$':
            oneOf:
              - $ref: '#/definitions/Reference'
              - $ref: '#/definitions/Parameter'
      examples:
        type: object
        patternProperties:
          '^[a-zA-Z0-9\.\-_]+$':
            oneOf:
              - $ref: '#/definitions/Reference'
              - $ref: '#/definitions/Example'
      requestBodies:
        type: object
        patternProperties:
          '^[a-zA-Z0-9\.\-_]+$':
            oneOf:
              - $ref: '#/definitions/Reference'
              - $ref: '#/definitions/RequestBody'
      headers:
        type: object
        patternProperties:
          '^[a-zA-Z0-9\.\-_]+$':
            oneOf:
              - $ref: '#/definitions/Reference'
              - $ref: '#/definitions/Header'
      securitySchemes:
        type: object
        patternProperties:
          '^[a-zA-Z0-9\.\-_]+$':
            oneOf:
              - $ref: '#/definitions/Reference'
              - $ref: '#/definitions/SecurityScheme'
      links:
        type: object
        patternProperties:
          '^[a-zA-Z0-9\.\-_]+$':
            oneOf:
              - $ref: '#/definitions/Reference'
              - $ref: '#/definitions/Link'
      callbacks:
        type: object
        patternProperties:
          '^[a-zA-Z0-9\.\-_]+$':
            oneOf:
              - $ref: '#/definitions/Reference'
              - $ref: '#/definitions/Callback'
    patternProperties:
      '^x-': {}
    additionalProperties: false

  Schema:
    type: object
    properties:
      title:
        type: string
      multipleOf:
        type: number
        minimum: 0
        exclusiveMinimum: true
      maximum:
        type: number
      exclusiveMaximum:
        type: boolean
        default: false
      minimum:
        type: number
      exclusiveMinimum:
        type: boolean
        default: false
      maxLength:
        type: integer
        minimum: 0
      minLength:
        type: integer
        minimum: 0
        default: 0
      pattern:
        type: string
        format: regex
      maxItems:
        type: integer
        minimum: 0
      minItems:
        type: integer
        minimum: 0
        default: 0
      uniqueItems:
        type: boolean
        default: false
      maxProperties:
        type: integer
        minimum: 0
      minProperties:
        type: integer
        minimum: 0
        default: 0
      required:
        type: array
        items:
          type: string
        minItems: 1
        uniqueItems: true
      enum:
        type: array
        items: {}
        minItems: 1
        uniqueItems: false
      type:
        type: string
        enum:
          - array
          - boolean
          - integer
          - number
          - object
          - string
      not:
        oneOf:
          - $ref: '#/definitions/Schema'
          - $ref: '#/definitions/Reference'
      allOf:
        type: array
        items:
          oneOf:
            - $ref: '#/definitions/Schema'
            - $ref: '#/definitions/Reference'
      oneOf:
        type: array
        items:
          oneOf:
            - $ref: '#/definitions/Schema'
            - $ref: '#/definitions/Reference'
      anyOf:
        type: array
        items:
          oneOf:
            - $ref: '#/definitions/Schema'
            - $ref: '#/definitions/Reference'
      items:
        oneOf:
          - $ref: '#/definitions/Schema'
          - $ref: '#/definitions/Reference'
      properties:
        type: object
        additionalProperties:
          oneOf:
            - $ref: '#/definitions/Schema'
            - $ref: '#/definitions/Reference'
      additionalProperties:
        oneOf:
          - $ref: '#/definitions/Schema'
          - $ref: '#/definitions/Reference'
          - type: boolean
        default: true
      description:
        type: string
      format:
        type: string
      default: {}
      nullable:
        type: boolean
        default: false
      discriminator:
        $ref: '#/definitions/Discriminator'
      readOnly:
        type: boolean
        default: false
      writeOnly:
        type: boolean
        default: false
      example: {}
      externalDocs:
        $ref: '#/definitions/ExternalDocumentation'
      deprecated:
        type: boolean
        default: false
      xml:
        $ref: '#/definitions/XML'
    patternProperties:
      '^x-': {}
    additionalProperties: false

  Discriminator:
    type: object
    required:
      - propertyName
    properties:
      propertyName:
        type: string
      mapping:
        type: object
        additionalProperties:
          type: string

  XML:
    type: object
    properties:
      name:
        type: string
      namespace:
        type: string
        format: uri
      prefix:
        type: string
      attribute:
        type: boolean
        default: false
      wrapped:
        type: boolean
        default: false
    patternProperties:
      '^x-': {}
    additionalProperties: false

  Response:
    type: object
    required:
      - description
    properties:
      description:
        type: string
      headers:
        type: object
        additionalProperties:
          oneOf:
            - $ref: '#/definitions/Header'
            - $ref: '#/definitions/Reference'
      content:
        type: object
        additionalProperties:
          $ref: '#/definitions/MediaType'
      links:
        type: object
        additionalProperties:
          oneOf:
            - $ref: '#/definitions/Link'
            - $ref: '#/definitions/Reference'
    patternProperties:
      '^x-': {}
    additionalProperties: false

  MediaType:
    type: object
    properties:
      schema:
        oneOf:
          - $ref: '#/definitions/Schema'
          - $ref: '#/definitions/Reference'
      example: {}
      examples:
        type: object
        additionalProperties:
          oneOf:
            - $ref: '#/definitions/Example'
            - $ref: '#/definitions/Reference'
      encoding:
        type: object
        additionalProperties:
          $ref: '#/definitions/Encoding'
    patternProperties:
      '^x-': {}
    additionalProperties: false
    allOf:
      - $ref: '#/definitions/ExampleXORExamples'

  Example:
    type: object
    properties:
      summary:
        type: string
      description:
        type: string
      value: {}
      externalValue:
        type: string
        format: uri-reference
    patternProperties:
      '^x-': {}
    additionalProperties: false

  Header:
    type: object
    properties:
      description:
        type: string
      required:
        type: boolean
        default: false
      deprecated:
        type: boolean
        default: false
      allowEmptyValue:
        type: boolean
        default: false
      style:
        type: string
        enum:
          - simple
        default: simple
      explode:
        type: boolean
      allowReserved:
        type: boolean
        default: false
      schema:
        oneOf:
          - $ref: '#/definitions/Schema'
          - $ref: '#/definitions/Reference'
      content:
        type: object
        additionalProperties:
          $ref: '#/definitions/MediaType'
        minProperties: 1
        maxProperties: 1
      example: {}
      examples:
        type: object
        additionalProperties:
          oneOf:
            - $ref: '#/definitions/Example'
            - $ref: '#/definitions/Reference'
    patternProperties:
      '^x-': {}
    additionalProperties: false
    allOf:
      - $ref: '#/definitions/ExampleXORExamples'
      - $ref: '#/definitions/SchemaXORContent'

  Paths:
    type: object
    patternProperties:
      '^\/':
        $ref: '#/definitions/PathItem'
      '^x-': {}
    additionalProperties: false

  PathItem:
    type: object
    properties:
      $ref:
        type: string
      summary:
        type: string
      description:
        type: string
      get:
        $ref: '#/definitions/Operation'
      put:
        $ref: '#/definitions/Operation'
      post:
        $ref: '#/definitions/Operation'
      delete:
        $ref: '#/definitions/Operation'
      options:
        $ref: '#/definitions/Operation'
      head:
        $ref: '#/definitions/Operation'
      patch:
        $ref: '#/definitions/Operation'
      trace:
        $ref: '#/definitions/Operation'
      servers:
        type: array
        items:
          $ref: '#/definitions/Server'
      parameters:
        type: array
        items:
          oneOf:
            - $ref: '#/definitions/Parameter'
            - $ref: '#/definitions/Reference'
        uniqueItems: true
    patternProperties:
      '^x-': {}
    additionalProperties: false

  Operation:
    type: object
    required:
      - responses
    properties:
      tags:
        type: array
        items:
          type: string
      summary:
        type: string
      description:
        type: string
      externalDocs:
        $ref: '#/definitions/ExternalDocumentation'
      operationId:
        type: string
      parameters:
        type: array
        items:
          oneOf:
            - $ref: '#/definitions/Parameter'
            - $ref: '#/definitions/Reference'
        uniqueItems: true
      requestBody:
        oneOf:
          - $ref: '#/definitions/RequestBody'
          - $ref: '#/definitions/Reference'
      responses:
        $ref: '#/definitions/Responses'
      callbacks:
        type: object
        additionalProperties:
          oneOf:
            - $ref: '#/definitions/Callback'
            - $ref: '#/definitions/Reference'
      deprecated:
        type: boolean
        default: false
      security:
        type: array
        items:
          $ref: '#/definitions/SecurityRequirement'
      servers:
        type: array
        items:
          $ref: '#/definitions/Server'
    patternProperties:
      '^x-': {}
    additionalProperties: false

  Responses:
    type: object
    properties:
      default:
        oneOf:
          - $ref: '#/definitions/Response'
          - $ref: '#/definitions/Reference'
    patternProperties:
      '^[1-5](?:\d{2}|XX)$':
        oneOf:
          - $ref: '#/definitions/Response'
          - $ref: '#/definitions/Reference'
      '^x-': {}
    minProperties: 1
    additionalProperties: false


  SecurityRequirement:
    type: object
    additionalProperties:
      type: array
      items:
        type: string

  Tag:
    type: object
    required:
      - name
    properties:
      name:
        type: string
      description:
        type: string
      externalDocs:
        $ref: '#/definitions/ExternalDocumentation'
    patternProperties:
      '^x-': {}
    additionalProperties: false

  ExternalDocumentation:
    type: object
    required:
      - url
    properties:
      description:
        type: string
      url:
        type: string
        format: uri-reference
    patternProperties:
      '^x-': {}
    additionalProperties: false

  ExampleXORExamples:
    description: Example and examples are mutually exclusive
    not:
      required: [example, examples]

  SchemaXORContent:
    description: Schema and content are mutually exclusive, at least one is required
    not:
      required: [schema, content]
    oneOf:
      - required: [schema]
      - required: [content]
        description: Some properties are not allowed if content is present
        allOf:
          - not:
              required: [style]
          - not:
              required: [explode]
          - not:
              required: [allowReserved]
          - not:
              required: [example]
          - not:
              required: [examples]

  Parameter:
    type: object
    properties:
      name:
        type: string
      in:
        type: string
      description:
        type: string
      required:
        type: boolean
        default: false
      deprecated:
        type: boolean
        default: false
      allowEmptyValue:
        type: boolean
        default: false
      style:
        type: string
      explode:
        type: boolean
      allowReserved:
        type: boolean
        default: false
      schema:
        oneOf:
          - $ref: '#/definitions/Schema'
          - $ref: '#/definitions/Reference'
      content:
        type: object
        additionalProperties:
          $ref: '#/definitions/MediaType'
        minProperties: 1
        maxProperties: 1
      example: {}
      examples:
        type: object
        additionalProperties:
          oneOf:
            - $ref: '#/definitions/Example'
            - $ref: '#/definitions/Reference'
    patternProperties:
      '^x-': {}
    additionalProperties: false
    required:
      - name
      - in
    allOf:
      - $ref: '#/definitions/ExampleXORExamples'
      - $ref: '#/definitions/SchemaXORContent'
    oneOf:
      - $ref: '#/definitions/PathParameter'
      - $ref: '#/definitions/QueryParameter'
      - $ref: '#/definitions/HeaderParameter'
      - $ref: '#/definitions/CookieParameter'

  PathParameter:
    description: Parameter in path
    required:
      - required
    properties:
      in:
        enum: [path]
      style:
        enum: [matrix, label, simple]
        default: simple
      required:
        enum: [true]

  QueryParameter:
    description: Parameter in query
    properties:
      in:
        enum: [query]
      style:
        enum: [form, spaceDelimited, pipeDelimited, deepObject]
        default: form

  HeaderParameter:
    description: Parameter in header
    properties:
      in:
        enum: [header]
      style:
        enum: [simple]
        default: simple

  CookieParameter:
    description: Parameter in cookie
    properties:
      in:
        enum: [cookie]
      style:
        enum: [form]
        default: form

  RequestBody:
    type: object
    required:
      - content
    properties:
      description:
        type: string
      content:
        type: object
        additionalProperties:
          $ref: '#/definitions/MediaType'
      required:
        type: boolean
        default: false
    patternProperties:
      '^x-': {}
    additionalProperties: false

  SecurityScheme:
    oneOf:
      - $ref: '#/definitions/APIKeySecurityScheme'
      - $ref: '#/definitions/HTTPSecurityScheme'
      - $ref: '#/definitions/OAuth2SecurityScheme'
      - $ref: '#/definitions/OpenIdConnectSecurityScheme'

  APIKeySecurityScheme:
    type: object
    required:
      - type
      - name
      - in
    properties:
      type:
        type: string
        enum:
          - apiKey
      name:
        type: string
      in:
        type: string
        enum:
          - header
          - query
          - cookie
      description:
        type: string
    patternProperties:
      '^x-': {}
    additionalProperties: false

  HTTPSecurityScheme:
    type: object
    required:
      - scheme
      - type
    properties:
      scheme:
        type: string
      bearerFormat:
        type: string
      description:
        type: string
      type:
        type: string
        enum:
          - http
    patternProperties:
      '^x-': {}
    additionalProperties: false
    oneOf:
      - description: Bearer
        properties:
          scheme:
            type: string
            pattern: ^[Bb][Ee][Aa][Rr][Ee][Rr]$

      - description: Non Bearer
        not:
          required: [bearerFormat]
        properties:
          scheme:
            not:
              type: string
              pattern: ^[Bb][Ee][Aa][Rr][Ee][Rr]$

  OAuth2SecurityScheme:
    type: object
    required:
      - type
      - flows
    properties:
      type:
        type: string
        enum:
          - oauth2
      flows:
        $ref: '#/definitions/OAuthFlows'
      description:
        type: string
    patternProperties:
      '^x-': {}
    additionalProperties: false

  OpenIdConnectSecurityScheme:
    type: object
    required:
      - type
      - openIdConnectUrl
    properties:
      type:
        type: string
        enum:
          - openIdConnect
      openIdConnectUrl:
        type: string
        format: uri-reference
      description:
        type: string
    patternProperties:
      '^x-': {}
    additionalProperties: false

  OAuthFlows:
    type: object
    properties:
      implicit:
        $ref: '#/definitions/ImplicitOAuthFlow'
      password:
        $ref: '#/definitions/PasswordOAuthFlow'
      clientCredentials:
        $ref: '#/definitions/ClientCredentialsFlow'
      authorizationCode:
        $ref: '#/definitions/AuthorizationCodeOAuthFlow'
    patternProperties:
      '^x-': {}
    additionalProperties: false

  ImplicitOAuthFlow:
    type: object
    required:
      - authorizationUrl
      - scopes
    properties:
      authorizationUrl:
        type: string
        format: uri-reference
      refreshUrl:
        type: string
        format: uri-reference
      scopes:
        type: object
        additionalProperties:
          type: string
    patternProperties:
      '^x-': {}
    additionalProperties: false

  PasswordOAuthFlow:
    type: object
    required:
      - tokenUrl
      - scopes
    properties:
      tokenUrl:
        type: string
        format: uri-reference
      refreshUrl:
        type: string
        format: uri-reference
      scopes:
        type: object
        additionalProperties:
          type: string
    patternProperties:
      '^x-': {}
    additionalProperties: false

  ClientCredentialsFlow:
    type: object
    required:
      - tokenUrl
      - scopes
    properties:
      tokenUrl:
        type: string
        format: uri-reference
      refreshUrl:
        type: string
        format: uri-reference
      scopes:
        type: object
        additionalProperties:
          type: string
    patternProperties:
      '^x-': {}
    additionalProperties: false

  AuthorizationCodeOAuthFlow:
    type: object
    required:
      - authorizationUrl
      - tokenUrl
      - scopes
    properties:
      authorizationUrl:
        type: string
        format: uri-reference
      tokenUrl:
        type: string
        format: uri-reference
      refreshUrl:
        type: string
        format: uri-reference
      scopes:
        type: object
        additionalProperties:
          type: string
    patternProperties:
      '^x-': {}
    additionalProperties: false

  Link:
    type: object
    properties:
      operationId:
        type: string
      operationRef:
        type: string
        format: uri-reference
      parameters:
        type: object
        additionalProperties: {}
      requestBody: {}
      description:
        type: string
      server:
        $ref: '#/definitions/Server'
    patternProperties:
      '^x-': {}
    additionalProperties: false
    not:
      description: Operation Id and Operation Ref are mutually exclusive
      required: [operationId, operationRef]

  Callback:
    type: object
    additionalProperties:
      $ref: '#/definitions/PathItem'
    patternProperties:
      '^x-': {}

  Encoding:
    type: object
    properties:
      contentType:
        type: string
      headers:
        type: object
        additionalProperties:
          oneOf:
            - $ref: '#/definitions/Header'
            - $ref: '#/definitions/Reference'
      style:
        type: string
        enum:
          - form
          - spaceDelimited
          - pipeDelimited
          - deepObject
      explode:
        type: boolean
      allowReserved:
        type: boolean
        default: false
    patternProperties:
      '^x-': {}
    additionalProperties: false
