def _fetch_all(cls, api_key, endpoint=None, offset=0, limit=25, **kwargs):
        """
        Call `self._fetch_page` for as many pages as exist.

        TODO: should be extended to do async page fetches if API allows it via
        exposing total value.

        Returns a list of `cls` instances.
        """
        output = []
        qp = kwargs.copy()
        limit = max(1, min(100, limit))
        maximum = kwargs.get('maximum')
        qp['limit'] = min(limit, maximum) if maximum is not None else limit
        qp['offset'] = offset
        more, total = None, None

        while True:
            entities, options = cls._fetch_page(
                api_key=api_key, endpoint=endpoint, **qp
            )
            output += entities
            more = options.get('more')
            limit = options.get('limit')
            offset = options.get('offset')
            total = options.get('total')

            if more is None:
                if total is None or offset is None:
                    break
                more = (limit + offset) < total

            if not more or (maximum is not None and len(output) >= maximum):
                break

            qp['limit'] = limit
            qp['offset'] = offset + limit

        return output
Call `self._fetch_page` for as many pages as exist.

        TODO: should be extended to do async page fetches if API allows it via
        exposing total value.

        Returns a list of `cls` instances.