{
  "openapi": "3.0.1",
  "info": {
    "title": "Energy Technology List",
    "version": "v1"
  },
  "servers": [
    {
      "url": "https://api.etl.energysecurity.gov.uk"
    }
  ],
  "security": [
    {
      "api-key": [
        "read"
      ]
    }
  ],
  "tags": [
    {
      "description": "Get product information",
      "name": "Products"
    },
    {
      "description": "Get technology information",
      "name": "Technologies"
    },
    {
      "description": "Get sub-technology information",
      "name": "Sub Technologies"
    },
    {
      "description": "Search for products, technologies and sub technologies",
      "name": "Search"
    }
  ],
  "paths": {
    "/api/v1/products": {
      "get": {
        "description": "<p>Get all products listed on the ETL. The response is paginated.</p>\n<p>By default products are sorted by the date they were added to the ETL, with the most recent first.</p>",
        "operationId": "getProducts",
        "parameters": [
          {
            "description": "The page number you want to retrieve, zero indexed.",
            "in": "query",
            "name": "page",
            "schema": {
              "type": "integer",
              "example": 0
            }
          },
          {
            "description": "The number of records per page, up to a maximum of 200.",
            "in": "query",
            "name": "size",
            "schema": {
              "type": "integer",
              "example": 20
            }
          },
          {
            "description": "The sorting criteria of the results, in the format: <code>propertyName(,asc|desc)</code> e.g. <code>sort=name</code> or <code>sort=dateAdded,desc</code>. Default sort order is ascending. Multiple sort criteria are supported.",
            "in": "query",
            "name": "sort",
            "schema": {
              "type": "string"
            }
          },
          {
            "description": "The listing status of the product. By default only currently listed products are shown.",
            "in": "query",
            "name": "listingStatus",
            "schema": {
              "type": "string",
              "enum": [
                "current",
                "removed",
                "currentOrRemoved"
              ]
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PagedProductList"
                }
              }
            },
            "description": "OK"
          },
          "401": {
            "description": "Unauthorized"
          },
          "403": {
            "description": "Forbidden"
          },
          "404": {
            "description": "Not Found"
          }
        },
        "summary": "Get all products",
        "tags": [
          "Products"
        ]
      }
    },
    "/api/v1/products/search/byFieldText": {
      "get": {
        "description": "<p>Search for products by the text value of certain fields. For example, get all products manufactured by 'Acme Inc', or with the model number 'XYZ123'.</p>\n<p>Search terms do not need to be exact. The search engine will return products that best match the given terms.</p>\n<p>For example, a search for products in the 'hand dryers' technology will still match products even though the full technology name is 'high speed hand air dryers'.</p>\n<p>Parameters can be combined to return only products which match on all criteria.</p>\n<p>By default, the results are ordered by relevance to the search parameters. This can be changed with the sort parameter.</p>",
        "operationId": "searchProducts",
        "parameters": [
          {
            "description": "The name of the technology category.",
            "in": "query",
            "name": "technology",
            "schema": {
              "type": "string"
            }
          },
          {
            "description": "The name of the sub-technology category.",
            "in": "query",
            "name": "subTechnology",
            "schema": {
              "type": "string"
            }
          },
          {
            "description": "The product name.",
            "in": "query",
            "name": "productName",
            "schema": {
              "type": "string"
            }
          },
          {
            "description": "The product model number.",
            "in": "query",
            "name": "modelNumber",
            "schema": {
              "type": "string"
            }
          },
          {
            "description": "The name of the product manufacturer.",
            "in": "query",
            "name": "manufacturer",
            "schema": {
              "type": "string"
            }
          },
          {
            "description": "The Uniclass classification code the product has been categorised into.",
            "in": "query",
            "name": "uniclass",
            "schema": {
              "type": "string"
            }
          },
          {
            "description": "Sorting criteria in the format: <code>propertyName(,asc|desc)</code> e.g. <code>sort=name</code> or <code>sort=dateAdded,desc</code>. Default sort order is ascending. Sorting on multiple properties is not supported.",
            "in": "query",
            "name": "sort",
            "schema": {
              "type": "string"
            }
          },
          {
            "description": "The page number you want to retrieve.",
            "in": "query",
            "name": "page",
            "schema": {
              "type": "integer",
              "format": "int32"
            }
          },
          {
            "description": "The number of records per page, up to a maximum of 200.",
            "in": "query",
            "name": "size",
            "schema": {
              "type": "integer",
              "format": "int32"
            }
          },
          {
            "description": "The listing status of the product. By default only currently listed products are shown.",
            "in": "query",
            "name": "listingStatus",
            "schema": {
              "type": "string",
              "enum": [
                "current",
                "removed",
                "currentOrRemoved"
              ]
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PagedProductList"
                }
              }
            },
            "description": "OK"
          },
          "401": {
            "description": "Unauthorized"
          },
          "403": {
            "description": "Forbidden"
          },
          "404": {
            "description": "Not Found"
          }
        },
        "summary": "Search products by field text",
        "tags": [
          "Products"
        ]
      }
    },
    "/api/v1/products/search/byIds": {
      "get": {
        "description": "Get products by their IDs. Multiple IDs can be specified by repeating the query parameter. This allows multiple products to be fetched in a single request.",
        "operationId": "getProducts_1",
        "parameters": [
          {
            "description": "The ID of the product you want to retrieve.",
            "in": "query",
            "name": "productId",
            "required": true,
            "schema": {
              "type": "integer"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ProductList"
                }
              }
            },
            "description": "OK"
          },
          "401": {
            "description": "Unauthorized"
          },
          "403": {
            "description": "Forbidden"
          },
          "404": {
            "description": "Not Found"
          }
        },
        "summary": "Get multiple products",
        "tags": [
          "Products"
        ]
      }
    },
    "/api/v1/products/{productId}": {
      "get": {
        "description": "Get a specific product by its ID.",
        "operationId": "getProduct",
        "parameters": [
          {
            "description": "The ID of the product you want to retrieve.",
            "in": "path",
            "name": "productId",
            "required": true,
            "schema": {
              "type": "integer",
              "format": "int64"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Product"
                }
              }
            },
            "description": "OK"
          },
          "401": {
            "description": "Unauthorized"
          },
          "403": {
            "description": "Forbidden"
          },
          "404": {
            "description": "Not Found"
          }
        },
        "summary": "Get a specific product",
        "tags": [
          "Products"
        ]
      }
    },
    "/api/v1/search": {
      "get": {
        "description": "<p>Search across the ETL for products, technology categories and sub-technology categories using a free text search term.\nFilters can also be applied to limit the returned results to only products matching the specified restrictions.</p>\n<p>The same filter parameter can be specified multiple times, in which case they are logically ORed, meaning products matching any of the provided filters will be returned.</p>\n<p>Multiple different filter parameters can also be specified, in which case they are logically ANDed, meaning products must match all of provided different filters.</p>\n<p>For example <code>?manufacturer=1&manufacturer=2&technology=3&technology=4</code> will return all products produced by manufacturer ID 1 or 2 and which are in technology categories with ID 3 or 4.</p>\n<p>Products can also be filtered by their technical characteristics using the feature definition filter parameter.</p>\n<p>By default, the results are ordered by relevance to the search parameters. This can be changed with the sort parameter.</p>\n",
        "operationId": "search",
        "parameters": [
          {
            "description": "The search term. Can be multiple words. These terms will be matched against all technology, sub-technology and product data.",
            "in": "query",
            "name": "keywords",
            "schema": {
              "type": "string"
            }
          },
          {
            "description": "A technology ID. Only products in this technology category will be returned.",
            "in": "query",
            "name": "technology",
            "schema": {
              "type": "integer",
              "format": "int32"
            }
          },
          {
            "description": "A sub-technology ID. Only products in this sub-technology category will be returned.",
            "in": "query",
            "name": "subTechnology",
            "schema": {
              "type": "integer",
              "format": "int32"
            }
          },
          {
            "description": "A manufacturer ID. Only products produced by this manufacturer will be returned.",
            "in": "query",
            "name": "manufacturer",
            "schema": {
              "type": "integer",
              "format": "int32"
            }
          },
          {
            "description": "<p>A feature filter. The name of this parameter includes the feature definition ID you want to filter on. The parameter value can either be an exact value, or a range of values.</p>\n<p>To specify that a product must have an exact value for a feature, the value can be provided as the parameter value directly.</p>\n<p>For example, assuming the feature 'Total energy consumption in kW' for a certain technology category has an feature definition ID of <code>12-5</code>, to find all products with a total energy consumption of 1.3 kw use <code>?feature12-5=1.3</code></p>\n<p>Similarly for TEXT or ENUM type features the required feature value can be used as the parameter value. For example, assuming an ENUM feature 'Fuel type' with an ID of <code>8-1</code>, to find all products with a with a fuel type of 'Gas' use <code>?feature8-1=Gas</code></p>\n<p>For numeric features a range of values can also be specified using the parameter value <code>minXmaxY</code> where X is the minimum value and Y is the maximum value.</p>\n<p>For example, assuming the feature 'Total energy consumption in kW' for a certain technology category has an feature definition ID of <code>12-5</code>, to find all products with a total energy consumption of between 0.5 and 2kw (inclusive) use <code>?feature12-5=min0.5max2</code></p>\n",
            "in": "query",
            "name": "feature<FeatureDefinitionId>",
            "schema": {
              "type": "string"
            }
          },
          {
            "description": "A Uniclass classification code. Only products that have been categorised under this code will be returned.",
            "in": "query",
            "name": "uniclass",
            "schema": {
              "type": "string"
            }
          },
          {
            "description": "Sorting criteria of the resulting products in the format: <code>propertyName(,asc|desc)</code> e.g. <code>sort=name</code> or <code>sort=dateAdded,desc</code>. Default sort order is ascending. Sorting on multiple properties is not supported.",
            "in": "query",
            "name": "sort",
            "schema": {
              "type": "string"
            }
          },
          {
            "description": "The page number you want to retrieve.",
            "in": "query",
            "name": "page",
            "schema": {
              "type": "integer",
              "format": "int32"
            }
          },
          {
            "description": "The number of records per page, up to a maximum of 200.",
            "in": "query",
            "name": "size",
            "schema": {
              "type": "integer",
              "format": "int32"
            }
          },
          {
            "description": "The listing status of the product. By default only currently listed products are shown.",
            "in": "query",
            "name": "listingStatus",
            "schema": {
              "type": "string",
              "enum": [
                "current",
                "removed",
                "currentOrRemoved"
              ]
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/SearchResult"
                }
              }
            },
            "description": "OK"
          },
          "401": {
            "description": "Unauthorized"
          },
          "403": {
            "description": "Forbidden"
          },
          "404": {
            "description": "Not Found"
          }
        },
        "summary": "Search for products, technologies and sub-technologies",
        "tags": [
          "Search"
        ]
      }
    },
    "/api/v1/subTechnologies": {
      "get": {
        "description": "Get all the sub-technology categories and their feature definitions on the ETL.",
        "operationId": "getSubTechnologies",
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/SubTechnologyList"
                }
              }
            },
            "description": "OK"
          },
          "401": {
            "description": "Unauthorized"
          },
          "403": {
            "description": "Forbidden"
          },
          "404": {
            "description": "Not Found"
          }
        },
        "summary": "Get all sub-technologies",
        "tags": [
          "Sub Technologies"
        ]
      }
    },
    "/api/v1/subTechnologies/{subTechnologyId}": {
      "get": {
        "description": "Get a specific sub-technology and its feature definitions by ID.",
        "operationId": "getSubTechnology",
        "parameters": [
          {
            "description": "The ID of the sub-technology you want to retrieve.",
            "in": "path",
            "name": "subTechnologyId",
            "required": true,
            "schema": {
              "type": "integer",
              "format": "int32"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/SubTechnology"
                }
              }
            },
            "description": "OK"
          },
          "401": {
            "description": "Unauthorized"
          },
          "403": {
            "description": "Forbidden"
          },
          "404": {
            "description": "Not Found"
          }
        },
        "summary": "Get a specific sub-technology",
        "tags": [
          "Sub Technologies"
        ]
      }
    },
    "/api/v1/subTechnologies/{subTechnologyId}/products": {
      "get": {
        "description": "<p>Get all products listed on the ETL under the given sub-technology. The response is paginated.</p>\n<p>By default products are sorted by the date they were added to the ETL, with the most recent first.</p>",
        "operationId": "getSubTechnologyProducts",
        "parameters": [
          {
            "description": "The ID of the sub technology whose products you want to retrieve",
            "in": "path",
            "name": "subTechnologyId",
            "required": true,
            "schema": {
              "type": "integer",
              "format": "int32"
            }
          },
          {
            "description": "The page number you want to retrieve, zero indexed.",
            "in": "query",
            "name": "page",
            "schema": {
              "type": "integer",
              "example": 0
            }
          },
          {
            "description": "The number of records per page, up to a maximum of 200.",
            "in": "query",
            "name": "size",
            "schema": {
              "type": "integer",
              "example": 20
            }
          },
          {
            "description": "The sorting criteria of the results, in the format: <code>propertyName(,asc|desc)</code> e.g. <code>sort=name</code> or <code>sort=dateAdded,desc</code>. Default sort order is ascending. Multiple sort criteria are supported.",
            "in": "query",
            "name": "sort",
            "schema": {
              "type": "string"
            }
          },
          {
            "description": "The listing status of the product. By default only currently listed products are shown.",
            "in": "query",
            "name": "listingStatus",
            "schema": {
              "type": "string",
              "enum": [
                "current",
                "removed",
                "currentOrRemoved"
              ]
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PagedProductList"
                }
              }
            },
            "description": "OK"
          },
          "401": {
            "description": "Unauthorized"
          },
          "403": {
            "description": "Forbidden"
          },
          "404": {
            "description": "Not Found"
          }
        },
        "summary": "Get all products in a specific sub-technology",
        "tags": [
          "Sub Technologies"
        ]
      }
    },
    "/api/v1/technologies": {
      "get": {
        "description": "Get all the technology categories and their feature definitions on the ETL.",
        "operationId": "getTechnologies",
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/TechnologyList"
                }
              }
            },
            "description": "OK"
          },
          "401": {
            "description": "Unauthorized"
          },
          "403": {
            "description": "Forbidden"
          },
          "404": {
            "description": "Not Found"
          }
        },
        "summary": "Get all technologies",
        "tags": [
          "Technologies"
        ]
      }
    },
    "/api/v1/technologies/{technologyId}": {
      "get": {
        "description": "Get a specific technology and its feature definitions by ID.",
        "operationId": "getTechnology",
        "parameters": [
          {
            "description": "The ID of the technology you want to retrieve.",
            "in": "path",
            "name": "technologyId",
            "required": true,
            "schema": {
              "type": "integer",
              "format": "int32"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Technology"
                }
              }
            },
            "description": "OK"
          },
          "401": {
            "description": "Unauthorized"
          },
          "403": {
            "description": "Forbidden"
          },
          "404": {
            "description": "Not Found"
          }
        },
        "summary": "Get a specific technology",
        "tags": [
          "Technologies"
        ]
      }
    },
    "/api/v1/technologies/{technologyId}/products": {
      "get": {
        "description": "<p>Get all products listed on the ETL under the given technology. The response is paginated.</p>\n<p>By default products are sorted by the date they were added to the ETL, with the most recent first.</p>",
        "operationId": "getTechnologyProducts",
        "parameters": [
          {
            "description": "The ID of the technology whose products you want to retrieve.",
            "in": "path",
            "name": "technologyId",
            "required": true,
            "schema": {
              "type": "integer",
              "format": "int32"
            }
          },
          {
            "description": "The page number you want to retrieve, zero indexed.",
            "in": "query",
            "name": "page",
            "schema": {
              "type": "integer",
              "example": 0
            }
          },
          {
            "description": "The number of records per page, up to a maximum of 200.",
            "in": "query",
            "name": "size",
            "schema": {
              "type": "integer",
              "example": 20
            }
          },
          {
            "description": "The sorting criteria of the results, in the format: <code>propertyName(,asc|desc)</code> e.g. <code>sort=name</code> or <code>sort=dateAdded,desc</code>. Default sort order is ascending. Multiple sort criteria are supported.",
            "in": "query",
            "name": "sort",
            "schema": {
              "type": "string"
            }
          },
          {
            "description": "The listing status of the product. By default only currently listed products are shown.",
            "in": "query",
            "name": "listingStatus",
            "schema": {
              "type": "string",
              "enum": [
                "current",
                "removed",
                "currentOrRemoved"
              ]
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PagedProductList"
                }
              }
            },
            "description": "OK"
          },
          "401": {
            "description": "Unauthorized"
          },
          "403": {
            "description": "Forbidden"
          },
          "404": {
            "description": "Not Found"
          }
        },
        "summary": "Get all products in a specific technology",
        "tags": [
          "Technologies"
        ]
      }
    }
  },
  "components": {
    "schemas": {
      "FeatureDefinition": {
        "required": [
          "displayOrder",
          "enumOptions",
          "featureId",
          "filterDisplayOrder",
          "isActive",
          "isFilterable",
          "isSortable",
          "maxValue",
          "minValue",
          "name",
          "sortDisplayOrder",
          "type",
          "unit"
        ],
        "type": "object",
        "properties": {
          "displayOrder": {
            "type": "integer",
            "description": "The order in which this feature definition is displayed against a product. This will be null if no specific order has been specified.",
            "format": "int32",
            "nullable": true
          },
          "enumOptions": {
            "type": "array",
            "description": "The possible values for this feature if it is of an enumerated type. This will be an empty array if the feature definition type is not ENUM.",
            "items": {
              "$ref": "#/components/schemas/FeatureEnumOption"
            }
          },
          "featureId": {
            "type": "string",
            "description": "The ID of this feature definition."
          },
          "filterDisplayOrder": {
            "type": "integer",
            "description": "The display order of this feature within the ETL browse products page filter section. This will be null if isFilterable is false.",
            "format": "int32",
            "nullable": true
          },
          "isActive": {
            "type": "boolean",
            "description": "If false, data for this feature is no longer collected for new products but will still be shown for existing products where available."
          },
          "isFilterable": {
            "type": "boolean",
            "description": "True if this feature is filterable on the ETL browse products page filter section. If this is false you can still filter on this feature in this API."
          },
          "isSortable": {
            "type": "boolean",
            "description": "True if this feature is sortable on the ETL browse products page sort dropdown. If this is false you can still sort by this feature in this API."
          },
          "maxValue": {
            "type": "number",
            "description": "The maximum value this feature has across all products which have a corresponding ProductFeature. This will be null if type is not a numeric type.",
            "format": "double",
            "nullable": true
          },
          "minValue": {
            "type": "number",
            "description": "The minimum value this feature has across all products which have a corresponding ProductFeature. This will be null if type is not a numeric type.",
            "format": "double",
            "nullable": true
          },
          "name": {
            "type": "string",
            "description": "The name of this feature definition."
          },
          "sortDisplayOrder": {
            "type": "integer",
            "description": "The display order of this feature within the ETL browse products page sort dropdown. This will be null if isSortable is false.",
            "format": "int32",
            "nullable": true
          },
          "type": {
            "type": "string",
            "description": "The data type of this feature definition.",
            "enum": [
              "INTEGER",
              "DOUBLE",
              "ENUM",
              "RATIO",
              "TEXT"
            ]
          },
          "unit": {
            "type": "string",
            "description": "The unit of the feature definition, such as kW, mm, %. This will be null if the value has no unit, for example if the type is ENUM.",
            "nullable": true
          }
        },
        "description": "A feature definition represents a technical characteristic of a product, such as energy efficiency or power rating. A product will have its value for this characteristic recorded in a ProductFeature.<br/> Each technology and sub-technology category has a predefined list of feature definitions that products listed in those categories will have corresponding ProductFeature values for. <br/>Some products may not have corresponding ProductFeature values for all the feature definitions in a technology/sub-technology category, as the product may have been added to the ETL before some of the technical characteristics were captured as part of the product application process."
      },
      "FeatureEnumOption": {
        "required": [
          "displayOrder",
          "option"
        ],
        "type": "object",
        "properties": {
          "displayOrder": {
            "type": "integer",
            "description": "The order this option should be displayed in.",
            "format": "int32"
          },
          "option": {
            "type": "string",
            "description": "The value of this option."
          }
        },
        "description": "A possible option for an enumerated FeatureDefinition."
      },
      "IndoorUnit": {
        "required": [
          "capacity",
          "modelNumber"
        ],
        "type": "object",
        "properties": {
          "capacity": {
            "type": "number",
            "description": "The capacity of this indoor unit in litres.",
            "format": "double"
          },
          "modelNumber": {
            "type": "string",
            "description": "The model number of this indoor unit."
          }
        },
        "description": "An indoor unit for a heating, ventilation and air conditioning (HVAC) system."
      },
      "Manufacturer": {
        "required": [
          "address",
          "country",
          "emailAddress",
          "id",
          "name",
          "postcode",
          "telNumber",
          "website"
        ],
        "type": "object",
        "properties": {
          "address": {
            "type": "string",
            "description": "The address of this manufacturer, excluding postcode. This may be null if it was not provided.",
            "nullable": true
          },
          "country": {
            "type": "string",
            "description": "The country the address of the manufacturer is based in. This may be null if it was not provided.",
            "nullable": true
          },
          "emailAddress": {
            "type": "string",
            "description": "The email address of this manufacturer. This may be null if it was not provided.",
            "nullable": true
          },
          "id": {
            "type": "integer",
            "description": "The ID of this manufacturer.",
            "format": "int64"
          },
          "name": {
            "type": "string",
            "description": "The name of this manufacturer."
          },
          "postcode": {
            "type": "string",
            "description": "The postcode of this manufacturer. This may be null if it was not provided.",
            "nullable": true
          },
          "telNumber": {
            "type": "string",
            "description": "The telephone number of this manufacturer. This may be null if it was not provided.",
            "nullable": true
          },
          "website": {
            "type": "string",
            "description": "The website of this manufacturer. This may be null if it was not provided.",
            "nullable": true
          }
        },
        "description": "A manufacturer of a product or products."
      },
      "NestedSubTechnology": {
        "required": [
          "dateRemoved",
          "id",
          "isRemoved",
          "isUnlisted",
          "name",
          "subTechnologyInformationUrl",
          "urlSlug"
        ],
        "type": "object",
        "properties": {
          "dateRemoved": {
            "type": "string",
            "description": "The date this sub-technology was removed from the ETL. This will be null if isRemoved is false.",
            "format": "date",
            "nullable": true
          },
          "id": {
            "type": "integer",
            "description": "The sub-technology ID.",
            "format": "int32"
          },
          "isRemoved": {
            "type": "boolean",
            "description": "The removal status of this sub-technology. If true, this sub-technology has been removed from the ETL."
          },
          "isUnlisted": {
            "type": "boolean",
            "description": "If true, products in this sub-technology category are not individually listed."
          },
          "name": {
            "type": "string",
            "description": "The sub-technology name as it appears on the ETL."
          },
          "subTechnologyInformationUrl": {
            "type": "string",
            "description": "A link to more information about this sub-technology on the ETL."
          },
          "urlSlug": {
            "type": "string",
            "description": "A URL safe string that uniquely identifies this sub-technology."
          }
        },
        "description": "An alternate simpler representation of a sub-technology. Used when returning the full sub-technology model would not be practical."
      },
      "NestedTechnology": {
        "required": [
          "dateRemoved",
          "id",
          "isRemoved",
          "isUnlisted",
          "name",
          "nameSynonyms",
          "technologyInformationUrl",
          "urlSlug"
        ],
        "type": "object",
        "properties": {
          "dateRemoved": {
            "type": "string",
            "description": "The date this technology was removed from the ETL. This will be null if isRemoved is false.",
            "format": "date",
            "nullable": true
          },
          "id": {
            "type": "integer",
            "description": "The technology ID.",
            "format": "int32"
          },
          "isRemoved": {
            "type": "boolean",
            "description": "The removal status of this technology. If true, this technology has been removed from the ETL and no longer has any product listed against it."
          },
          "isUnlisted": {
            "type": "boolean",
            "description": "If true, products in this technology category are not individually listed."
          },
          "name": {
            "type": "string",
            "description": "The technology name as it appears on the ETL."
          },
          "nameSynonyms": {
            "type": "array",
            "description": "A list of alternate names this technology may be known by.",
            "items": {
              "type": "string",
              "description": "A list of alternate names this technology may be known by."
            }
          },
          "technologyInformationUrl": {
            "type": "string",
            "description": "A link to more information about the technology on the ETL."
          },
          "urlSlug": {
            "type": "string",
            "description": "A URL safe string that uniquely identifies this technology."
          }
        },
        "description": "An alternate simpler representation of a technology. Used when returning the full technology model would not be practical."
      },
      "PagedProductList": {
        "required": [
          "page",
          "products"
        ],
        "type": "object",
        "properties": {
          "page": {
            "$ref": "#/components/schemas/ResultPage"
          },
          "products": {
            "type": "array",
            "description": "The list of products.",
            "items": {
              "$ref": "#/components/schemas/Product"
            }
          }
        },
        "description": "A paginated list of products."
      },
      "Product": {
        "required": [
          "dateAdded",
          "dateRemoved",
          "features",
          "id",
          "images",
          "indoorUnits",
          "isRemoved",
          "manufacturer",
          "modelNumber",
          "name",
          "publicFiles",
          "subTechnologyId",
          "technologyId",
          "uniclassCodes"
        ],
        "type": "object",
        "properties": {
          "dateAdded": {
            "type": "string",
            "description": "The date this product was added to the ETL.",
            "format": "date"
          },
          "dateRemoved": {
            "type": "string",
            "description": "The date this product was removed from the ETL. This will be null if isRemoved is false.",
            "format": "date",
            "nullable": true
          },
          "features": {
            "type": "array",
            "description": "A list of this product's features.",
            "items": {
              "$ref": "#/components/schemas/ProductFeature"
            }
          },
          "id": {
            "type": "integer",
            "description": "The unique product ID",
            "format": "int64"
          },
          "images": {
            "type": "array",
            "description": "A list of images of this product.",
            "items": {
              "$ref": "#/components/schemas/ProductImage"
            }
          },
          "indoorUnits": {
            "type": "array",
            "description": "A list of compatible indoor units for this product (if applicable).",
            "items": {
              "$ref": "#/components/schemas/IndoorUnit"
            }
          },
          "isRemoved": {
            "type": "boolean",
            "description": "The removal status of this product. If true, this product has been removed from the ETL and is not longer listed."
          },
          "manufacturer": {
            "$ref": "#/components/schemas/Manufacturer"
          },
          "modelNumber": {
            "type": "string",
            "description": "The model number of this product. This will be null if the product has no model number.",
            "nullable": true
          },
          "name": {
            "type": "string",
            "description": "The name of this product"
          },
          "publicFiles": {
            "type": "array",
            "description": "A list of files linked to this product.",
            "items": {
              "$ref": "#/components/schemas/PublicFile"
            }
          },
          "subTechnologyId": {
            "type": "integer",
            "description": "The optional sub-technology category this product belongs to. This will be null if this product is not part of a sub-technology category.",
            "format": "int32",
            "nullable": true
          },
          "technologyId": {
            "type": "integer",
            "description": "The technology category this product belongs to.",
            "format": "int32"
          },
          "uniclassCodes": {
            "type": "array",
            "description": "A list of Uniclass classification codes this product has been categorised into.",
            "items": {
              "$ref": "#/components/schemas/UniclassCode"
            }
          }
        },
        "description": "An ETL product. A product has a list of features which define its technical characteristics. A product may be removed from the current ETL if it no longer meets criteria or is not longer manufactured."
      },
      "ProductFeature": {
        "required": [
          "displayOrder",
          "featureDefinitionId",
          "name",
          "numericValue",
          "unit",
          "value"
        ],
        "type": "object",
        "properties": {
          "displayOrder": {
            "type": "integer",
            "description": "The order in which this feature is displayed against the product. This will be null if no specific order has been specified.",
            "format": "int32",
            "nullable": true
          },
          "featureDefinitionId": {
            "type": "string",
            "description": "The ID of the feature definition this feature relates to."
          },
          "name": {
            "type": "string",
            "description": "The name of this product feature."
          },
          "numericValue": {
            "type": "number",
            "description": "The numeric value of this product feature. This will be null if the value is not numeric (e.g. text).",
            "format": "double",
            "nullable": true
          },
          "unit": {
            "type": "string",
            "description": "The unit of the product feature, such as kW, mm, %. This will be null if the value has no unit.",
            "nullable": true
          },
          "value": {
            "type": "string",
            "description": "The value of this product feature, as a string."
          }
        },
        "description": "A product specific value for a feature definition."
      },
      "ProductImage": {
        "required": [
          "displayOrder",
          "fileId",
          "url"
        ],
        "type": "object",
        "properties": {
          "displayOrder": {
            "type": "integer",
            "description": "The order in which this image is displayed against the product.",
            "format": "int32"
          },
          "fileId": {
            "type": "string",
            "description": "The image file ID."
          },
          "url": {
            "type": "string",
            "description": "<p>A URL for the image. By default the image will be 200 pixels wide with a proportional height.</p> <p>This can be changed using the first part of the URL path. For example <code>https://hostname/320x/image-id</code> would return the image with a width of 320 pixels and a proportional height.</p>"
          }
        },
        "description": "A link to a product image."
      },
      "ProductList": {
        "required": [
          "products"
        ],
        "type": "object",
        "properties": {
          "products": {
            "type": "array",
            "description": "The list of products.",
            "items": {
              "$ref": "#/components/schemas/Product"
            }
          }
        },
        "description": "A list of products."
      },
      "PublicFile": {
        "required": [
          "category",
          "displayOrder",
          "fileId",
          "fileName",
          "fileSize",
          "url"
        ],
        "type": "object",
        "properties": {
          "category": {
            "type": "string",
            "description": "The file category. Either 'BIM' (building information modeling) or 'TSD' (technical specification document)",
            "enum": [
              "BIM",
              "TSD"
            ]
          },
          "displayOrder": {
            "type": "integer",
            "description": "The order in which this file is displayed against the product.",
            "format": "int32"
          },
          "fileId": {
            "type": "string",
            "description": "The file ID."
          },
          "fileName": {
            "type": "string",
            "description": "The file name."
          },
          "fileSize": {
            "type": "integer",
            "description": "The file size in bytes.",
            "format": "int64"
          },
          "url": {
            "type": "string",
            "description": "A download link for the file."
          }
        },
        "description": "A link to a product public file."
      },
      "ResultPage": {
        "required": [
          "number",
          "size",
          "totalElements",
          "totalPages"
        ],
        "type": "object",
        "properties": {
          "number": {
            "type": "integer",
            "description": "The number of items (e.g. products) in this page.",
            "format": "int32"
          },
          "size": {
            "type": "integer",
            "description": "The maximum size of the page.",
            "format": "int32"
          },
          "totalElements": {
            "type": "integer",
            "description": "The total number of items (e.g. products) available across all pages.",
            "format": "int64"
          },
          "totalPages": {
            "type": "integer",
            "description": "The total number of available pages.",
            "format": "int32"
          }
        },
        "description": "Pagination information associated with a response."
      },
      "SearchResult": {
        "required": [
          "implicatedSubTechnologyIds",
          "implicatedTechnologyIds",
          "matchedProducts",
          "subTechnologies",
          "technologies"
        ],
        "type": "object",
        "properties": {
          "implicatedSubTechnologyIds": {
            "type": "array",
            "description": "A distinct list of sub-technology IDs products returned from the search belong to.",
            "items": {
              "type": "integer",
              "description": "A distinct list of sub-technology IDs products returned from the search belong to.",
              "format": "int32"
            }
          },
          "implicatedTechnologyIds": {
            "type": "array",
            "description": "A distinct list of technology IDs products returned from the search belong to.",
            "items": {
              "type": "integer",
              "description": "A distinct list of technology IDs products returned from the search belong to.",
              "format": "int32"
            }
          },
          "matchedProducts": {
            "$ref": "#/components/schemas/PagedProductList"
          },
          "subTechnologies": {
            "type": "array",
            "description": "The list of sub-technologies returned from the search.",
            "items": {
              "$ref": "#/components/schemas/NestedSubTechnology"
            }
          },
          "technologies": {
            "type": "array",
            "description": "The list of technologies returned from the search.",
            "items": {
              "$ref": "#/components/schemas/NestedTechnology"
            }
          }
        },
        "description": "A result of a search operation. Contains matching technologies, sub-technologies and products."
      },
      "SubTechnology": {
        "required": [
          "dateRemoved",
          "featureDefinitions",
          "id",
          "isRemoved",
          "isUnlisted",
          "name",
          "parentTechnologyId",
          "parentTechnologyInformationUrl",
          "parentTechnologyName",
          "subTechnologyInformationUrl",
          "subTechnologyManufacturers",
          "uniclassCodes",
          "urlSlug"
        ],
        "type": "object",
        "properties": {
          "dateRemoved": {
            "type": "string",
            "description": "The date this sub-technology was removed from the ETL. This will be null if isRemoved is false.",
            "format": "date",
            "nullable": true
          },
          "featureDefinitions": {
            "type": "array",
            "description": "A list of all feature definitions available in this sub-technology.",
            "items": {
              "$ref": "#/components/schemas/FeatureDefinition"
            }
          },
          "id": {
            "type": "integer",
            "description": "The sub-technology ID.",
            "format": "int32"
          },
          "isRemoved": {
            "type": "boolean",
            "description": "The removal status of this sub-technology. If true, this sub-technology has been removed from the ETL and no longer has any product listed against it."
          },
          "isUnlisted": {
            "type": "boolean",
            "description": "If true, products in this sub-technology category are not individually listed."
          },
          "name": {
            "type": "string",
            "description": "The sub-technology name as it appears on the ETL."
          },
          "parentTechnologyId": {
            "type": "integer",
            "description": "The ID of this sub-technology's parent technology.",
            "format": "int32"
          },
          "parentTechnologyInformationUrl": {
            "type": "string",
            "description": "A link to more information about this sub-technology's parent technology on the ETL."
          },
          "parentTechnologyName": {
            "type": "string",
            "description": "The name of this sub-technology's parent technology as it appears on the ETL."
          },
          "subTechnologyInformationUrl": {
            "type": "string",
            "description": "A link to more information about this sub-technology on the ETL."
          },
          "subTechnologyManufacturers": {
            "type": "array",
            "description": "A list of all manufacturers who produce products in this sub-technology.",
            "items": {
              "$ref": "#/components/schemas/Manufacturer"
            }
          },
          "uniclassCodes": {
            "type": "array",
            "description": "A list of Uniclass codes which are applicable to products in this sub-technology.",
            "items": {
              "$ref": "#/components/schemas/UniclassCode"
            }
          },
          "urlSlug": {
            "type": "string",
            "description": "A URL safe string that uniquely identifies this sub-technology."
          }
        },
        "description": "An ETL sub-technology category. This provides further categorisation within a broader technology category."
      },
      "SubTechnologyList": {
        "required": [
          "subTechnologies"
        ],
        "type": "object",
        "properties": {
          "subTechnologies": {
            "type": "array",
            "description": "The list of sub-technologies.",
            "items": {
              "$ref": "#/components/schemas/SubTechnology"
            }
          }
        },
        "description": "A list of sub-technologies."
      },
      "Technology": {
        "required": [
          "dateRemoved",
          "featureDefinitions",
          "id",
          "isRemoved",
          "isUnlisted",
          "name",
          "nameSynonyms",
          "subTechnologies",
          "technologyInformationUrl",
          "technologyManufacturers",
          "uniclassCodes",
          "urlSlug"
        ],
        "type": "object",
        "properties": {
          "dateRemoved": {
            "type": "string",
            "description": "The date this technology was removed from the ETL. This will be null if isRemoved is false.",
            "format": "date",
            "nullable": true
          },
          "featureDefinitions": {
            "type": "array",
            "description": "A list of all feature definitions available in this technology and any sub-technologies.",
            "items": {
              "$ref": "#/components/schemas/FeatureDefinition"
            }
          },
          "id": {
            "type": "integer",
            "description": "The technology ID.",
            "format": "int32"
          },
          "isRemoved": {
            "type": "boolean",
            "description": "The removal status of this technology. If true, this technology has been removed from the ETL and no longer has any product listed against it."
          },
          "isUnlisted": {
            "type": "boolean",
            "description": "If true, products in this technology category are not individually listed."
          },
          "name": {
            "type": "string",
            "description": "The technology name as it appears on the ETL."
          },
          "nameSynonyms": {
            "type": "array",
            "description": "A list of alternate names this technology may be known by.",
            "items": {
              "type": "string",
              "description": "A list of alternate names this technology may be known by."
            }
          },
          "subTechnologies": {
            "type": "array",
            "description": "A list of sub-technologies under this technology. This will be an empty array if this technology has no sub-technologies.",
            "items": {
              "$ref": "#/components/schemas/NestedSubTechnology"
            }
          },
          "technologyInformationUrl": {
            "type": "string",
            "description": "A link to more information about this technology on the ETL."
          },
          "technologyManufacturers": {
            "type": "array",
            "description": "A list of all manufacturers who produce products in this technology and any sub-technologies.",
            "items": {
              "$ref": "#/components/schemas/Manufacturer"
            }
          },
          "uniclassCodes": {
            "type": "array",
            "description": "A list of Uniclass codes which are applicable to products in this technology.",
            "items": {
              "$ref": "#/components/schemas/UniclassCode"
            }
          },
          "urlSlug": {
            "type": "string",
            "description": "A URL safe string that uniquely identifies this technology."
          }
        },
        "description": "An ETL technology category. All products on the ETL are listed under a specific technology category. A technology category may also contain further sub-technology categories within it."
      },
      "TechnologyList": {
        "required": [
          "technologies"
        ],
        "type": "object",
        "properties": {
          "technologies": {
            "type": "array",
            "description": "The list of technologies.",
            "items": {
              "$ref": "#/components/schemas/Technology"
            }
          }
        },
        "description": "A list of technologies."
      },
      "UniclassCode": {
        "required": [
          "classification",
          "code"
        ],
        "type": "object",
        "properties": {
          "classification": {
            "type": "string",
            "description": "The Uniclass title."
          },
          "code": {
            "type": "string",
            "description": "The Uniclass code."
          }
        },
        "description": "A Uniclass classification code. For more information see <a href='https://www.thenbs.com/our-tools/uniclass-2015'>https://www.thenbs.com/our-tools/uniclass-2015</a>"
      }
    },
    "securitySchemes": {
      "api-key": {
        "in": "header",
        "name": "x-api-key",
        "type": "apiKey"
      }
    }
  }
}
