code: def properties(self, name=None, pk=None, category=Category.INSTANCE, **kwargs):
          # type: (Optional[str], Optional[str], Optional[str], **Any) -> List[Property]
          
          request_params = {
              'name': name,
              'id': pk,
              'category': category
          }
          if kwargs:
              request_params.update(**kwargs)
  
          response = self._request('GET', self._build_url('properties'), params=request_params)
  
          if response.status_code != requests.codes.ok:  # pragma: no cover
              raise NotFoundError("Could not retrieve properties")
  
          data = response.json()
  
          return [Property.create(p, client=self) for p in data['results']]
docs: Retrieve properties.
  
          If additional `keyword=value` arguments are provided, these are added to the request parameters. Please
          refer to the documentation of the KE-chain API for additional query parameters.
  
          :param name: name to limit the search for.
          :type name: basestring or None
          :param pk: primary key or id (UUID) of the property to search for
          :type pk: basestring or None
          :param category: filter the properties by category. Defaults to INSTANCE. Other options MODEL or None
          :type category: basestring or None
          :param kwargs: (optional) additional search keyword arguments
          :type kwargs: dict or None
          :return: list of :class:`models.Property`
          :raises NotFoundError: When no `Property` is found