diff --git a/canvasapi/account.py b/canvasapi/account.py
index 63f2ca2..3a03734 100644
--- a/canvasapi/account.py
+++ b/canvasapi/account.py
@@ -663,6 +663,7 @@ class Account(CanvasObject):
             'GET',
             'accounts/{}/terms'.format(self.id),
             {'account_id': self.id},
+            _root='enrollment_terms',
             _kwargs=combine_kwargs(**kwargs)
         )
 
diff --git a/canvasapi/paginated_list.py b/canvasapi/paginated_list.py
index 8717902..56732fb 100644
--- a/canvasapi/paginated_list.py
+++ b/canvasapi/paginated_list.py
@@ -10,30 +10,31 @@ class PaginatedList(object):
 
     def __init__(
         self, content_class, requester, request_method, first_url, extra_attribs=None,
-            **kwargs):
+            _root=None, **kwargs):
 
-        self.__elements = list()
+        self._elements = list()
 
-        self.__requester = requester
-        self.__content_class = content_class
-        self.__first_url = first_url
-        self.__first_params = kwargs or {}
-        self.__first_params['per_page'] = kwargs.get('per_page', 100)
-        self.__next_url = first_url
-        self.__next_params = self.__first_params
-        self.__extra_attribs = extra_attribs or {}
-        self.__request_method = request_method
+        self._requester = requester
+        self._content_class = content_class
+        self._first_url = first_url
+        self._first_params = kwargs or {}
+        self._first_params['per_page'] = kwargs.get('per_page', 100)
+        self._next_url = first_url
+        self._next_params = self._first_params
+        self._extra_attribs = extra_attribs or {}
+        self._request_method = request_method
+        self._root = _root
 
     def __getitem__(self, index):
         assert isinstance(index, (int, slice))
         if isinstance(index, int):
-            self.__get_up_to_index(index)
-            return self.__elements[index]
+            self._get_up_to_index(index)
+            return self._elements[index]
         else:
             return self._Slice(self, index)
 
     def __iter__(self):
-        for element in self.__elements:
+        for element in self._elements:
             yield element
         while self._has_next():
             new_elements = self._grow()
@@ -41,60 +42,68 @@ class PaginatedList(object):
                 yield element
 
     def __repr__(self):
-        return "<PaginatedList of type {}>".format(self.__content_class.__name__)
+        return "<PaginatedList of type {}>".format(self._content_class.__name__)
 
     def _is_larger_than(self, index):
-        return len(self.__elements) > index or self._has_next()
+        return len(self._elements) > index or self._has_next()
 
-    def __get_up_to_index(self, index):
-        while len(self.__elements) <= index and self._has_next():
+    def _get_up_to_index(self, index):
+        while len(self._elements) <= index and self._has_next():
             self._grow()
 
     def _grow(self):
         new_elements = self._get_next_page()
-        self.__elements += new_elements
+        self._elements += new_elements
         return new_elements
 
     def _has_next(self):
-        return self.__next_url is not None
+        return self._next_url is not None
 
     def _get_next_page(self):
-        response = self.__requester.request(
-            self.__request_method,
-            self.__next_url,
-            **self.__next_params
+        response = self._requester.request(
+            self._request_method,
+            self._next_url,
+            **self._next_params
         )
         data = response.json()
-        self.__next_url = None
+        self._next_url = None
 
         next_link = response.links.get('next')
-        regex = r'{}(.*)'.format(re.escape(self.__requester.base_url))
+        regex = r'{}(.*)'.format(re.escape(self._requester.base_url))
 
-        self.__next_url = re.search(regex, next_link['url']).group(1) if next_link else None
+        self._next_url = re.search(regex, next_link['url']).group(1) if next_link else None
 
-        self.__next_params = {}
+        self._next_params = {}
 
         content = []
+
+        if self._root:
+            try:
+                data = data[self._root]
+            except KeyError:
+                # TODO: Fix this message to make more sense to an end user.
+                raise ValueError("Invalid root value specified.")
+
         for element in data:
             if element is not None:
-                element.update(self.__extra_attribs)
-                content.append(self.__content_class(self.__requester, element))
+                element.update(self._extra_attribs)
+                content.append(self._content_class(self._requester, element))
 
         return content
 
     class _Slice(object):
         def __init__(self, the_list, the_slice):
-            self.__list = the_list
-            self.__start = the_slice.start or 0
-            self.__stop = the_slice.stop
-            self.__step = the_slice.step or 1
+            self._list = the_list
+            self._start = the_slice.start or 0
+            self._stop = the_slice.stop
+            self._step = the_slice.step or 1
 
         def __iter__(self):
-            index = self.__start
-            while not self.__finished(index):
-                if self.__list._is_larger_than(index):
-                    yield self.__list[index]
-                    index += self.__step
-
-        def __finished(self, index):
-            return self.__stop is not None and index >= self.__stop
+            index = self._start
+            while not self._finished(index):
+                if self._list._is_larger_than(index):
+                    yield self._list[index]
+                    index += self._step
+
+        def _finished(self, index):
+            return self._stop is not None and index >= self._stop

Unable to list_enrollment_terms() on 0.8.2
It seems Enrollment Terms in the Canvas API aren't structured like most other Paginated Lists. Specifically, in the example response at https://canvas.instructure.com/doc/api/enrollment_terms.html#method.terms_api.index (and my own testing), the list of term objects are nested under a top-level string key `enrollment_terms` in the JSON response. It seems like other Paginated Lists return a JSON payload where the list object of requested items is the top-level element. This difference seems to cause `paginated_list.py` to fail to parse the Enrollment Terms response in the loop over the JSON payload at https://github.com/ucfopen/canvasapi/blob/v0.8.2/canvasapi/paginated_list.py#L78-L81, since on the first iteration `element` will be the string `enrollment_terms`, which does not have an update() member function.

I'm sorry if I missed something obvious that lets me specify what I want the "root element" of the payload to be when parsing a Paginated List. I poked around a little bit but didn't see any way to mess with the data variable in _get_next_page().
diff --git a/tests/fixtures/account.json b/tests/fixtures/account.json
index bf80693..e12a3e6 100644
--- a/tests/fixtures/account.json
+++ b/tests/fixtures/account.json
@@ -291,7 +291,8 @@
 	"list_enrollment_terms": {
 		"method": "GET",
 		"endpoint": "accounts/1/terms",
-		"data": [
+		"data": {
+			"enrollment_terms": [
 			{
 				"id": 1,
 				"name": "Enrollment Term 1"
@@ -299,8 +300,8 @@
 			{
 				"id": 2,
 				"name": "Enrollment Term 2"
-			}
-		],
+			}]
+		},
 		"status_code": 200
 	},
 	"list_groups_context": {
diff --git a/tests/test_paginated_list.py b/tests/test_paginated_list.py
index b7c2a1d..8fd6521 100644
--- a/tests/test_paginated_list.py
+++ b/tests/test_paginated_list.py
@@ -4,6 +4,7 @@ import unittest
 import requests_mock
 
 from canvasapi import Canvas
+from canvasapi.enrollment_term import EnrollmentTerm
 from canvasapi.paginated_list import PaginatedList
 from canvasapi.user import User
 from tests import settings
@@ -205,3 +206,30 @@ class TestPaginatedList(unittest.TestCase):
             'six_objects_three_pages'
         )
         self.assertEqual(pag_list.__repr__(), '<PaginatedList of type User>')
+
+    def test_root_element_incorrect(self, m):
+        register_uris({'account': ['list_enrollment_terms']}, m)
+
+        pag_list = PaginatedList(
+            EnrollmentTerm,
+            self.requester,
+            'GET',
+            'accounts/1/terms',
+            _root='wrong'
+        )
+
+        with self.assertRaises(ValueError):
+            pag_list[0]
+
+    def test_root_element(self, m):
+        register_uris({'account': ['list_enrollment_terms']}, m)
+
+        pag_list = PaginatedList(
+            EnrollmentTerm,
+            self.requester,
+            'GET',
+            'accounts/1/terms',
+            _root='enrollment_terms'
+        )
+
+        self.assertIsInstance(pag_list[0], EnrollmentTerm)

pip install -e .[dev]
parse_log_pytest
requirements.txt
pytest pytest-cov flake8 coverage
apt-get update apt-get install -y gcc
3.6
requirements.txt dev_requirements.txt
pytest --no-header -rA --tb=line --color=no -p no:cacheprovider -W ignore::DeprecationWarning
alabaster==0.7.13
attrs==22.2.0
Babel==2.11.0
-e git+https://github.com/ucfopen/canvasapi.git@65b75497665ca966c9046f2efde1273697c09e3b#egg=canvasapi
certifi==2021.5.30
charset-normalizer==2.0.12
coverage==6.2
docutils==0.17.1
flake8==5.0.4
idna==3.10
imagesize==1.4.1
importlib-metadata==4.2.0
iniconfig==1.1.1
Jinja2==3.0.3
MarkupSafe==2.0.1
mccabe==0.7.0
packaging==21.3
pluggy==1.0.0
py==1.11.0
pycodestyle==2.9.1
pyflakes==2.5.0
Pygments==2.14.0
pyparsing==3.1.4
pytest==7.0.1
pytest-cov==4.0.0
pytz==2025.2
requests==2.27.1
requests-mock==1.12.1
six==1.17.0
snowballstemmer==2.2.0
Sphinx==4.3.2
sphinx-rtd-theme==1.3.0
sphinxcontrib-applehelp==1.0.2
sphinxcontrib-devhelp==1.0.2
sphinxcontrib-htmlhelp==2.0.0
sphinxcontrib-jquery==4.1
sphinxcontrib-jsmath==1.0.1
sphinxcontrib-qthelp==1.0.3
sphinxcontrib-serializinghtml==1.1.5
tomli==1.2.3
typing_extensions==4.1.1
urllib3==1.26.20
zipp==3.6.0

name: canvasapi
channels:
  - defaults
  - https://repo.anaconda.com/pkgs/main
  - https://repo.anaconda.com/pkgs/r
  - conda-forge
dependencies:
  - _libgcc_mutex=0.1=main
  - _openmp_mutex=5.1=1_gnu
  - ca-certificates=2025.2.25=h06a4308_0
  - certifi=2021.5.30=py36h06a4308_0
  - ld_impl_linux-64=2.40=h12ee557_0
  - libffi=3.3=he6710b0_2
  - libgcc-ng=11.2.0=h1234567_1
  - libgomp=11.2.0=h1234567_1
  - libstdcxx-ng=11.2.0=h1234567_1
  - ncurses=6.4=h6a678d5_0
  - openssl=1.1.1w=h7f8727e_0
  - pip=21.2.2=py36h06a4308_0
  - python=3.6.13=h12debd9_1
  - readline=8.2=h5eee18b_0
  - setuptools=58.0.4=py36h06a4308_0
  - sqlite=3.45.3=h5eee18b_0
  - tk=8.6.14=h39e8969_0
  - wheel=0.37.1=pyhd3eb1b0_0
  - xz=5.6.4=h5eee18b_1
  - zlib=1.2.13=h5eee18b_1
  - pip:
      - alabaster==0.7.13
      - attrs==22.2.0
      - babel==2.11.0
      - charset-normalizer==2.0.12
      - coverage==6.2
      - docutils==0.17.1
      - flake8==5.0.4
      - idna==3.10
      - imagesize==1.4.1
      - importlib-metadata==4.2.0
      - iniconfig==1.1.1
      - jinja2==3.0.3
      - markupsafe==2.0.1
      - mccabe==0.7.0
      - packaging==21.3
      - pluggy==1.0.0
      - py==1.11.0
      - pycodestyle==2.9.1
      - pyflakes==2.5.0
      - pygments==2.14.0
      - pyparsing==3.1.4
      - pytest==7.0.1
      - pytest-cov==4.0.0
      - pytz==2025.2
      - requests==2.27.1
      - requests-mock==1.12.1
      - six==1.17.0
      - snowballstemmer==2.2.0
      - sphinx==4.3.2
      - sphinx-rtd-theme==1.3.0
      - sphinxcontrib-applehelp==1.0.2
      - sphinxcontrib-devhelp==1.0.2
      - sphinxcontrib-htmlhelp==2.0.0
      - sphinxcontrib-jquery==4.1
      - sphinxcontrib-jsmath==1.0.1
      - sphinxcontrib-qthelp==1.0.3
      - sphinxcontrib-serializinghtml==1.1.5
      - tomli==1.2.3
      - typing-extensions==4.1.1
      - urllib3==1.26.20
      - zipp==3.6.0
prefix: /opt/conda/envs/canvasapi

tests/test_paginated_list.py::TestPaginatedList::test_root_element tests/test_paginated_list.py::TestPaginatedList::test_root_element_incorrect
tests/test_paginated_list.py::TestPaginatedList::test_getitem_first tests/test_paginated_list.py::TestPaginatedList::test_getitem_second_page tests/test_paginated_list.py::TestPaginatedList::test_iterator tests/test_paginated_list.py::TestPaginatedList::test_paginated_list_empty tests/test_paginated_list.py::TestPaginatedList::test_paginated_list_four_two_pages tests/test_paginated_list.py::TestPaginatedList::test_paginated_list_single tests/test_paginated_list.py::TestPaginatedList::test_paginated_list_six_three_pages tests/test_paginated_list.py::TestPaginatedList::test_paginated_list_two_one_page tests/test_paginated_list.py::TestPaginatedList::test_repr tests/test_paginated_list.py::TestPaginatedList::test_slice_beginning tests/test_paginated_list.py::TestPaginatedList::test_slice_end tests/test_paginated_list.py::TestPaginatedList::test_slice_middle
canvasapi/account.py canvasapi/paginated_list.py
canvasapi/account.py canvasapi/paginated_list.py