{
  "$schema": "http://json-schema.org/draft-07/schema#",
  "title": "API",
  "description": "VK API declaration",
  "type": "object",
  "definitions": {
    "deprecated_from_version": {
      "type": "string",
      "description": "Property deprecated from version",
      "pattern": "^[0-9]+.[0-9]+$"
    },
    "from_version": {
      "type": "string",
      "description": "Property implemented from version",
      "pattern": "^[0-9]+.[0-9]+$"
    },
    "enum": {
      "type": "array",
      "minItems": 1,
      "uniqueItems": true
    },
    "enumNames": {
      "type": "array",
      "description": "Enum values text representations",
      "items": {
        "type": "string"
      },
      "minItems": 1,
      "uniqueItems": true
    },
    "jsonReference": {
      "type": "object",
      "required": [
        "$ref"
      ],
      "additionalProperties": false,
      "properties": {
        "$ref": {
          "type": "string"
        }
      }
    },
    "parameterArray": {
      "type": "array",
      "minItems": 1,
      "items": {
        "$ref": "#"
      }
    },
    "parameterTypes": {
      "type": "string",
      "enum": [
        "array",
        "boolean",
        "integer",
        "number",
        "string"
      ]
    },
    "responseTypes": {
      "type": "string",
      "enum": [
        "array",
        "boolean",
        "integer",
        "number",
        "string",
        "object"
      ]
    },
    "responsePropertyTypes": {
      "type": "string",
      "enum": [
        "array",
        "boolean",
        "integer",
        "number",
        "string"
      ]
    },
    "itemTypes": {
      "type": "string",
      "enum": [
        "boolean",
        "integer",
        "number",
        "string"
      ]
    },
    "parameter": {
      "type": "object",
      "properties": {
        "name": {
          "type": "string",
          "pattern": "^[a-zA-Z][a-zA-Z0-9_]*$",
          "description": "Parameter name"
        },
        "nodoc": {
          "$ref": "#/definitions/nodoc"
        },
        "format": {
          "type": "string",
          "enum": [
            "json"
          ]
        },
        "ignore_sdk": {
          "$ref": "#/definitions/ignore_sdk"
        },
        "type": {
          "$ref": "#/definitions/parameterTypes",
          "description": "Parameter type"
        },
        "items": {
          "type": "object",
          "properties": {
            "$ref": {
              "type": "string",
              "format": "uri-reference"
            },
            "type": {
              "$ref": "#/definitions/itemTypes"
            },
            "maximum": {
              "type": "number"
            },
            "minimum": {
              "type": "number"
            },
            "minLength": {
              "type": "integer",
              "minimum": 0,
              "default": 0
            },
            "maxLength": {
              "type": "integer",
              "minimum": 0
            },
            "enum": [
              "#/definitions/enum"
            ],
            "enumNames": {
              "$ref": "#/definitions/enumNames"
            },
            "ignore_sdk": {
              "$ref": "#/definitions/ignore_sdk"
            }
          },
          "oneOf": [
            {
              "required": [
                "type"
              ]
            },
            {
              "required": [
                "$ref"
              ]
            }
          ],
          "additionalProperties": false
        },
        "maxItems": {
          "type": "integer",
          "minimum": 0
        },
        "minItems": {
          "type": "integer",
          "minimum": 0,
          "default": 0
        },
        "maximum": {
          "type": "number"
        },
        "minimum": {
          "type": "number"
        },
        "$ref": {
          "type": "string",
          "format": "uri-reference"
        },
        "enum": [
          "#/definitions/enum"
        ],
        "enumNames": {
          "$ref": "#/definitions/enumNames"
        },
        "default": [],
        "required": {
          "type": "boolean",
          "default": false
        },
        "maxLength": {
          "type": "integer",
          "minimum": 0
        },
        "minLength": {
          "type": "integer",
          "minimum": 0,
          "default": 0
        },
        "description": {
          "type": "string",
          "description": "Parameter description"
        },
        "deprecated_from_version": {
          "$ref": "#/definitions/deprecated_from_version"
        },
        "from_version": {
          "$ref": "#/definitions/from_version"
        }
      },
      "required": [
        "name",
        "type"
      ],
      "additionalProperties": false
    },
    "responseProperty": {
      "type": "object",
      "oneOf": [
        {
          "required": [
            "type"
          ]
        },
        {
          "required": [
            "$ref"
          ]
        }
      ],
      "properties": {
        "type": {
          "$ref": "#/definitions/responseTypes"
        },
        "description": {
          "type": "string"
        }
      }
    },
    "response": {
      "type": "object",
      "properties": {
        "type": {
          "type": "string"
        },
        "description": {
          "type": "string"
        },
        "nodoc": {
          "$ref": "#/definitions/nodoc"
        },
        "deprecated_from_version": {
          "$ref": "#/definitions/deprecated_from_version"
        },
        "from_version": {
          "$ref": "#/definitions/from_version"
        },
        "allOf": {
          "type": "array",
          "items": {
            "$ref": "#/definitions/response"
          }
        },
        "items": {
          "oneOf": [
            {
              "type": "array"
            },
            {
              "type": "object",
              "properties": {
                "$ref": {
                  "type": "string"
                }
              }
            }
          ]
        },
        "required": {
          "type": "array"
        },
        "title": {
          "type": "string"
        },
        "oneOf": {
          "type": "array"
        },
        "$ref": {
          "type": "string",
          "format": "uri-reference"
        },
        "properties": {
          "type": "object",
          "patternProperties": {
            "^[a-zA-Z0-9_]+$": {
              "$ref": "#/definitions/responseProperty"
            }
          },
          "additionalProperties": false
        },
        "ignore_sdk": {
          "$ref": "#/definitions/ignore_sdk"
        },
        "additional_properties": {
          "type": "boolean"
        }
      },
      "additionalProperties": false
    },
    "error": {
      "type": "object",
      "properties": {
        "code": {
          "type": "integer",
          "description": "Error code",
          "minimum": 0
        },
        "description": {
          "type": "string",
          "description": "Error description"
        },
        "subcodes": {
          "type": "array",
          "items": {
            "$ref": "#/definitions/error_subcode"
          },
          "description": "Array of error subcodes"
        },
        "global": {
          "type": "boolean",
          "default": false
        },
        "disabled": {
          "type": "boolean",
          "default": false
        },
        "nodoc": {
          "$ref": "#/definitions/nodoc"
        },
        "deprecated_from_version": {
          "$ref": "#/definitions/deprecated_from_version"
        },
        "from_version": {
          "$ref": "#/definitions/from_version"
        }
      },
      "required": [
        "code",
        "description"
      ],
      "additionalProperties": false
    },
    "error_subcode": {
      "type": "object",
      "properties": {
        "subcode": {
          "type": "integer"
        },
        "description": {
          "type": "string"
        },
        "@comment": {
          "type": "string"
        }
      }
    },
    "methodErrors": {
      "type": "array",
      "items": {
        "type": "object",
        "properties": {
          "$ref": {
            "type": "string",
            "format": "uri-reference"
          },
          "nodoc": {
            "$ref": "#/definitions/nodoc"
          }
        }
      },
      "description": "Possible custom errors"
    },
    "method": {
      "type": "object",
      "properties": {
        "name": {
          "type": "string",
          "pattern": "^[a-zA-Z][a-zA-Z0-9.]+$",
          "description": "Method name"
        },
        "description": {
          "type": "string",
          "description": "Method description"
        },
        "nodoc": {
          "$ref": "#/definitions/nodoc"
        },
        "timeout": {
          "type": "integer",
          "minimum": 1,
          "maximum": 30
        },
        "deprecated_from_version": {
          "$ref": "#/definitions/deprecated_from_version"
        },
        "from_version": {
          "$ref": "#/definitions/from_version"
        },
        "access_token_type": {
          "type": "array",
          "items": {
            "type": "string",
            "enum": [
              "open",
              "user",
              "group",
              "service"
            ],
            "description": "Access token type"
          },
          "description": "Input parameters for method"
        },
        "parameters": {
          "type": "array",
          "items": {
            "$ref": "#/definitions/parameter"
          },
          "description": "Input parameters for method"
        },
        "responses": {
          "type": "object",
          "patternProperties": {
            "^([a-zA-Z0-9_]+)?[rR]esponse$": {
              "$ref": "#/definitions/response"
            }
          },
          "additionalProperties": true,
          "description": "References to response objects"
        },
        "emptyResponse": {
          "type": "boolean",
          "default": false
        },
        "errors": {
          "$ref": "#/definitions/methodErrors"
        },
        "ignore_sdk": {
          "$ref": "#/definitions/ignore_sdk"
        }
      },
      "required": [
        "name",
        "access_token_type",
        "responses"
      ],
      "additionalProperties": false
    }
  },
  "properties": {
    "errors": {
      "type": "object",
      "patternProperties": {
        "^[a-z][a-z0-9_]+$": {
          "$ref": "#/definitions/error"
        }
      },
      "additionalProperties": false,
      "uniqueProperties": true
    },
    "methods": {
      "type": "array",
      "items": {
        "$ref": "#/definitions/method"
      }
    },
    "definitions": {
      "patternProperties": {
        "^([a-zA-Z0-9_]+)?[rR]esponse$": {
          "$ref": "#/definitions/response"
        }
      },
      "uniqueProperties": true
    },
    "$schema": {
      "type": "string",
      "format": "uri-reference"
    },
    "title": {
      "type": "string"
    }
  },
  "additionalProperties": false
}
