{
	"title": "Wappalyzer schema",
	"definitions": {
		"non-empty-non-blank-string": {
			"type": "string",
			"pattern": "^(?!\\s*$).+"
		}
	},
	"type": "object",
	"additionalProperties": false,
	"required": ["technologies", "categories"],
	"properties": {
		"$schema": {
			"type": "string"
		},
		"categories": {
			"type": "object",
			"minProperties": 64,
			"additionalProperties": false,
			"patternProperties": {
				"^[0-9]+$": {
					"type": "object",
					"properties": {
						"priority": {
							"type": "number"
						},
						"name": {
							"type": "string"
						}
					}
				}
			}
		},
		"technologies": {
			"type": "object",
			"additionalProperties": {
				"additionalProperties": false,
				"required": ["cats","website"],
				"properties": {
					"description": {
						"type": "string",
            "pattern": "^.{0,500}$"
					},
					"oss": {
						"type": "boolean"
					},
					"saas": {
						"type": "boolean"
					},
          "pricing": {
						"type": "array",
						"items": {
							"type": "string",
              "pattern": "^(low|mid|high|freemium|poa|payg|onetime|recurring)$"
						}
          },
					"cats": {
						"type": "array",
						"items": {
							"type": "number"
						},
						"minItems": 1
					},
					"cpe": {
						"$ref": "#/definitions/non-empty-non-blank-string"
					},
					"cookies": {
						"type": "object",
						"additionalProperties": false,
						"patternProperties": {
							"^.+$": {
							},
							"additionalProperties": {
								"type": "string"
							}
						}
					},
					"js": {
						"type": "object",
						"additionalProperties": false,
						"patternProperties": {
							"^.+$": {
							},
							"additionalProperties": {
								"type": "string"
							}
						}
					},
          "dom": {
            "oneOf": [
							{
								"type": "array",
								"items": {
									"$ref": "#/definitions/non-empty-non-blank-string"
								}
							},
							{
								"$ref": "#/definitions/non-empty-non-blank-string"
							},
              {
                "type": "object",
                "additionalProperties": false,
                "patternProperties": {
                  "^.+$": {
                  }
                }
              }
            ]
					},
          "dns": {
						"type": "object",
						"additionalProperties": false,
						"patternProperties": {
							"^.+$": {
							}
						}
					},
					"headers": {
						"type": "object",
						"additionalProperties": false,
						"patternProperties": {
							"^.+$": {
							},
							"additionalProperties": {
								"type": "string"
							}
						}
					},
					"html": {
						"oneOf": [
							{
								"type": "array",
								"items": {
									"$ref": "#/definitions/non-empty-non-blank-string"
								}
							},
							{
								"$ref": "#/definitions/non-empty-non-blank-string"
							}
						]
					},
					"css": {
						"oneOf": [
							{
								"type": "array",
								"items": {
									"$ref": "#/definitions/non-empty-non-blank-string"
								}
							},
							{
								"$ref": "#/definitions/non-empty-non-blank-string"
							}
						]
					},
					"robots": {
						"oneOf": [
							{
								"type": "array",
								"items": {
									"$ref": "#/definitions/non-empty-non-blank-string"
								}
							},
							{
								"$ref": "#/definitions/non-empty-non-blank-string"
							}
						]
					},
					"magento": {
						"oneOf": [
							{
								"type": "array",
								"items": {
									"$ref": "#/definitions/non-empty-non-blank-string"
								}
							},
							{
								"$ref": "#/definitions/non-empty-non-blank-string"
							}
						]
					},
					"certIssuer": {
						"oneOf": [
							{
								"type": "array",
								"items": {
									"$ref": "#/definitions/non-empty-non-blank-string"
								}
							},
							{
								"$ref": "#/definitions/non-empty-non-blank-string"
							}
						]
					},
					"excludes": {
						"oneOf": [
							{
								"type": "array",
								"items": {
									"$ref": "#/definitions/non-empty-non-blank-string"
								}
							},
							{
								"$ref": "#/definitions/non-empty-non-blank-string"
							}
						]
					},
					"implies": {
						"oneOf": [
							{
								"type": "array",
								"items": {
									"$ref": "#/definitions/non-empty-non-blank-string"
								}
							},
							{
								"$ref": "#/definitions/non-empty-non-blank-string"
							}
						]
					},
					"requires": {
						"oneOf": [
							{
								"type": "array",
								"items": {
									"$ref": "#/definitions/non-empty-non-blank-string"
								}
							},
							{
								"$ref": "#/definitions/non-empty-non-blank-string"
							}
						]
					},
					"meta": {
						"type": "object",
						"additionalProperties": false,
						"patternProperties": {
							"^.+$": {
							},
							"additionalProperties": {
								"type": "string"
							}
						}
					},
					"scripts": {
						"oneOf": [
							{
								"type": "array",
								"items": {
									"$ref": "#/definitions/non-empty-non-blank-string"
								}
							},
							{
								"$ref": "#/definitions/non-empty-non-blank-string"
							}
						]
					},
					"url": {
						"$ref": "#/definitions/non-empty-non-blank-string"
					},
					"website": {
						"$ref": "#/definitions/non-empty-non-blank-string"
					},
					"icon": {
						"$ref": "#/definitions/non-empty-non-blank-string"
					},
					"xhr": {
						"$ref": "#/definitions/non-empty-non-blank-string"
					}
				}
			}
		}
	}
}
