diff --git a/canvasapi/canvas.py b/canvasapi/canvas.py
index c295820..64c74a4 100644
--- a/canvasapi/canvas.py
+++ b/canvasapi/canvas.py
@@ -8,6 +8,7 @@ from canvasapi.folder import Folder
 from canvasapi.group import Group, GroupCategory
 from canvasapi.paginated_list import PaginatedList
 from canvasapi.requester import Requester
+from canvasapi.section import Section
 from canvasapi.user import User
 from canvasapi.util import combine_kwargs
 
@@ -42,7 +43,7 @@ class Canvas(object):
         )
         return Account(self.__requester, response.json())
 
-    def get_account(self, account_id):
+    def get_account(self, account_id, use_sis_id=False, **kwargs):
         """
         Retrieve information on an individual account.
 
@@ -50,12 +51,22 @@ class Canvas(object):
         <https://canvas.instructure.com/doc/api/accounts.html#method.accounts.show>`_
 
         :param account_id: The ID of the account to retrieve.
-        :type account_id: int
+        :type account_id: int or str
+        :param use_sis_id: Whether or not account_id is an sis ID.
+            Defaults to `False`.
+        :type use_sis_id: bool
+
         :rtype: :class:`canvasapi.account.Account`
         """
+        if use_sis_id:
+            uri_str = 'accounts/sis_account_id:{}'
+        else:
+            uri_str = 'accounts/{}'
+
         response = self.__requester.request(
             'GET',
-            'accounts/%s' % (account_id)
+            uri_str.format(account_id),
+            **combine_kwargs(**kwargs)
         )
         return Account(self.__requester, response.json())
 
@@ -102,7 +113,7 @@ class Canvas(object):
             'course_accounts',
         )
 
-    def get_course(self, course_id, **kwargs):
+    def get_course(self, course_id, use_sis_id=False, **kwargs):
         """
         Retrieve a course by its ID.
 
@@ -110,12 +121,20 @@ class Canvas(object):
         <https://canvas.instructure.com/doc/api/courses.html#method.courses.show>`_
 
         :param course_id: The ID of the course to retrieve.
-        :type course_id: int
+        :type course_id: int or str
+        :param use_sis_id: Whether or not course_id is an sis ID.
+            Defaults to `False`.
+        :type use_sis_id: bool
         :rtype: :class:`canvasapi.course.Course`
         """
+        if use_sis_id:
+            uri_str = 'courses/sis_course_id:{}'
+        else:
+            uri_str = 'courses/{}'
+
         response = self.__requester.request(
             'GET',
-            'courses/%s' % (course_id),
+            uri_str.format(course_id),
             **combine_kwargs(**kwargs)
         )
         return Course(self.__requester, response.json())
@@ -251,19 +270,30 @@ class Canvas(object):
         )
         return CourseNickname(self.__requester, response.json())
 
-    def get_section(self, section_id):
+    def get_section(self, section_id, use_sis_id=False, **kwargs):
         """
         Get details about a specific section.
 
         :calls: `GET /api/v1/sections/:id \
         <https://canvas.instructure.com/doc/api/sections.html#method.sections.show>`_
 
+        :param section_id: The ID of the section to get.
+        :type section_id: int or str
+        :param use_sis_id: Whether or not section_id is an sis ID.
+            Defaults to `False`.
+        :type use_sis_id: bool
+
         :rtype: :class:`canvasapi.section.Section`
         """
-        from canvasapi.section import Section
+        if use_sis_id:
+            uri_str = 'sections/sis_section_id:{}'
+        else:
+            uri_str = 'sections/{}'
+
         response = self.__requester.request(
             'GET',
-            'sections/%s' % (section_id)
+            uri_str.format(section_id),
+            **combine_kwargs(**kwargs)
         )
         return Section(self.__requester, response.json())
 
@@ -340,7 +370,7 @@ class Canvas(object):
         )
         return Group(self.__requester, response.json())
 
-    def get_group(self, group_id, **kwargs):
+    def get_group(self, group_id, use_sis_id=False, **kwargs):
         """
         Return the data for a single group. If the caller does not
         have permission to view the group a 401 will be returned.
@@ -348,11 +378,22 @@ class Canvas(object):
         :calls: `GET /api/v1/groups/:group_id \
         <https://canvas.instructure.com/doc/api/groups.html#method.groups.show>`_
 
+        :param group_id: The ID of the group to get.
+        :type group_id: int or str
+        :param use_sis_id: Whether or not group_id is an sis ID.
+            Defaults to `False`.
+        :type use_sis_id: bool
+
         :rtype: :class:`canvasapi.group.Group`
         """
+        if use_sis_id:
+            uri_str = 'groups/sis_group_id:{}'
+        else:
+            uri_str = 'groups/{}'
+
         response = self.__requester.request(
             'GET',
-            'groups/%s' % (group_id),
+            uri_str.format(group_id),
             **combine_kwargs(**kwargs)
         )
         return Group(self.__requester, response.json())

Query paramaters and sis ids
Hi, i am new to this api but I like the implementations of it a lot.

A lot of the canvas api accepts query parameters,
Lets take for example [listing users in a course](https://canvas.instructure.com/doc/api/live#!/courses.json/list_users_in_course_users_get_5) where almost every parameter type is query

I would like to be able to add a query parameters for example
/api/v1/courses/{course_id}/users?enrollment_type=student
Is this possible now or how would you suggest the implementation? 

Also, along with that it would also be handy to not use user_id but sis_user_id
and for course_id; sis_course_id. 
However, sis_ids are not a query string. But instead come with a "sis_course_id:" in front of the sis id number itself.
example:
```/api/v1/courses/sis_course_id:{{sis_course_id}}```

Is that possible?, suggest implementation?

Currently I seem to be able to make a custom query like this
This example fetches only students in a course and I have tested it to be working.
```
	canvas = Canvas(API_URL, API_KEY)

	# First, retrieve the Course object
	course = canvas.get_course(COURSE_ID)

	
	'''You can make your own custom request like this'''
	from canvasapi.paginated_list import PaginatedList
	from canvasapi.user import User

	st_users = PaginatedList(User,
					course._requester,
					'GET',
					'courses/{}/users?enrollment_type=student'.format(COURSE_ID)
					,{})
	for st in st_users:
		print(st.id,st.name)
```
diff --git a/tests/fixtures/account.json b/tests/fixtures/account.json
index f8e0456..de829c0 100644
--- a/tests/fixtures/account.json
+++ b/tests/fixtures/account.json
@@ -146,6 +146,21 @@
 		},
 		"status_code": 200
 	},
+	"get_by_sis_id": {
+		"method": "GET",
+		"endpoint": "accounts/sis_account_id:test-sis-id",
+		"data": {
+			"id": 10,
+			"sis_account_id": "test-sis-id",
+			"name": "Account From SIS",
+			"parent_account_id": null,
+			"root_account_id": null,
+			"default_storage_quota_mb": 500,
+			"default_user_storage_quota_mb": 50,
+			"default_group_storage_quota_mb": 50,
+			"default_time_zone": "America/New_York"
+		}
+	},
 	"get_courses": {
 		"method": "GET",
 		"endpoint": "accounts/1/courses",
diff --git a/tests/fixtures/course.json b/tests/fixtures/course.json
index 4a879bc..7ee017d 100644
--- a/tests/fixtures/course.json
+++ b/tests/fixtures/course.json
@@ -159,6 +159,22 @@
 		},
 		"status_code": 200
 	},
+	"get_by_sis_id": {
+		"method": "GET",
+		"endpoint": "courses/sis_course_id:test-sis-id",
+		"data": {
+			"id": 1,
+			"sis_course_id": "test-sis-id",
+			"course_code": "SIS101",
+			"name": "SIS Course",
+			"workflow_state": "available",
+			"account_id": 1,
+			"root_account_id": 1,
+			"enrollment_term_id": 1,
+			"grading_standard_id": 1
+		},
+		"status_code": 200
+	},
 	"get_external_tools": {
 		"method": "GET",
 		"endpoint": "courses/1/external_tools",
diff --git a/tests/fixtures/group.json b/tests/fixtures/group.json
index 0481a4c..6e542af 100644
--- a/tests/fixtures/group.json
+++ b/tests/fixtures/group.json
@@ -19,6 +19,17 @@
 		},
 		"status_code": 200
 	},
+	"get_by_sis_id": {
+		"method": "GET",
+		"endpoint": "groups/sis_group_id:test-sis-id",
+		"data": {
+			"id": 10,
+			"sis_group_id": "test-sis-id",
+			"name": "SIS Group",
+			"description": "best SIS group ever"
+		},
+		"status_code": 200
+	},
 	"pages_get_page": {
 		"method": "GET",
 		"endpoint": "groups/1/pages/my-url",
diff --git a/tests/fixtures/section.json b/tests/fixtures/section.json
index 6d06bcd..19c860b 100644
--- a/tests/fixtures/section.json
+++ b/tests/fixtures/section.json
@@ -9,6 +9,17 @@
 		},
 		"status_code": 200
 	},
+	"get_by_sis_id": {
+		"method": "GET",
+		"endpoint": "sections/sis_section_id:test-sis-id",
+		"data":{
+			"id": 10,
+			"sis_section_id": "test-sis-id",
+			"course_id": 1,
+			"name": "SIS Section"
+		},
+		"status_code": 200
+	},
 	"list_enrollments": {
 		"method": "GET",
 		"endpoint": "sections/1/enrollments",
diff --git a/tests/test_canvas.py b/tests/test_canvas.py
index 17cc875..e2acf32 100644
--- a/tests/test_canvas.py
+++ b/tests/test_canvas.py
@@ -51,6 +51,14 @@ class TestCanvas(unittest.TestCase):
 
         self.assertIsInstance(account, Account)
 
+    def test_get_account_sis_id(self, m):
+        register_uris({'account': ['get_by_sis_id']}, m)
+
+        account = self.canvas.get_account('test-sis-id', use_sis_id=True)
+
+        self.assertIsInstance(account, Account)
+        self.assertEqual(account.name, 'Account From SIS')
+
     def test_get_account_fail(self, m):
         register_uris({'generic': ['not_found']}, m)
 
@@ -82,6 +90,14 @@ class TestCanvas(unittest.TestCase):
         self.assertIsInstance(course, Course)
         self.assertTrue(hasattr(course, 'name'))
 
+    def test_get_course_sis_id(self, m):
+        register_uris({'course': ['get_by_sis_id']}, m)
+
+        course = self.canvas.get_course('test-sis-id', use_sis_id=True)
+
+        self.assertIsInstance(course, Course)
+        self.assertEqual(course.name, 'SIS Course')
+
     def test_get_course_with_start_date(self, m):
         register_uris({'course': ['start_at_date']}, m)
 
@@ -225,6 +241,14 @@ class TestCanvas(unittest.TestCase):
 
         self.assertIsInstance(info, Section)
 
+    def test_get_section_sis_id(self, m):
+        register_uris({'section': ['get_by_sis_id']}, m)
+
+        section = self.canvas.get_section('test-sis-id', use_sis_id=True)
+
+        self.assertIsInstance(section, Section)
+        self.assertEqual(section.name, 'SIS Section')
+
     # create_group()
     def test_create_group(self, m):
         register_uris({'group': ['create']}, m)
@@ -245,6 +269,14 @@ class TestCanvas(unittest.TestCase):
         self.assertTrue(hasattr(group, 'name'))
         self.assertTrue(hasattr(group, 'description'))
 
+    def test_get_group_sis_id(self, m):
+        register_uris({'group': ['get_by_sis_id']}, m)
+
+        group = self.canvas.get_group('test-sis-id', use_sis_id=True)
+
+        self.assertIsInstance(group, Group)
+        self.assertEqual(group.name, 'SIS Group')
+
     # get_group_category()
     def test_get_group_category(self, m):
         register_uris({'group': ['get_category_by_id']}, m)

pip install -e .[dev]
parse_log_pytest
requirements.txt
pytest pytest-cov pytest-xdist pytest-mock pytest-asyncio
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@a959a8a10118da72c0e5771b09e6c53ced3ef33d#egg=canvasapi
certifi==2021.5.30
charset-normalizer==2.0.12
coverage==6.2
docutils==0.18.1
execnet==1.9.0
idna==3.10
imagesize==1.4.1
importlib-metadata==4.8.3
iniconfig==1.1.1
Jinja2==3.0.3
MarkupSafe==2.0.1
packaging==21.3
pluggy==1.0.0
py==1.11.0
pycodestyle==2.10.0
pyflakes==3.0.1
Pygments==2.14.0
pyparsing==3.1.4
pytest==7.0.1
pytest-asyncio==0.16.0
pytest-cov==4.0.0
pytest-mock==3.6.1
pytest-xdist==3.0.2
pytz==2025.2
requests==2.27.1
requests-mock==1.12.1
six==1.17.0
snowballstemmer==2.2.0
Sphinx==5.3.0
sphinx-rtd-theme==2.0.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.18.1
      - execnet==1.9.0
      - idna==3.10
      - imagesize==1.4.1
      - importlib-metadata==4.8.3
      - iniconfig==1.1.1
      - jinja2==3.0.3
      - markupsafe==2.0.1
      - packaging==21.3
      - pluggy==1.0.0
      - py==1.11.0
      - pycodestyle==2.10.0
      - pyflakes==3.0.1
      - pygments==2.14.0
      - pyparsing==3.1.4
      - pytest==7.0.1
      - pytest-asyncio==0.16.0
      - pytest-cov==4.0.0
      - pytest-mock==3.6.1
      - pytest-xdist==3.0.2
      - pytz==2025.2
      - requests==2.27.1
      - requests-mock==1.12.1
      - six==1.17.0
      - snowballstemmer==2.2.0
      - sphinx==5.3.0
      - sphinx-rtd-theme==2.0.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_canvas.py::TestCanvas::test_get_account_sis_id tests/test_canvas.py::TestCanvas::test_get_course_sis_id tests/test_canvas.py::TestCanvas::test_get_group_sis_id tests/test_canvas.py::TestCanvas::test_get_section_sis_id
tests/test_canvas.py::TestCanvas::test_clear_course_nicknames tests/test_canvas.py::TestCanvas::test_conversations_batch_update tests/test_canvas.py::TestCanvas::test_conversations_batch_updated_fail_on_event tests/test_canvas.py::TestCanvas::test_conversations_batch_updated_fail_on_ids tests/test_canvas.py::TestCanvas::test_conversations_get_running_batches tests/test_canvas.py::TestCanvas::test_conversations_mark_all_as_read tests/test_canvas.py::TestCanvas::test_conversations_unread_count tests/test_canvas.py::TestCanvas::test_create_account tests/test_canvas.py::TestCanvas::test_create_appointment_group tests/test_canvas.py::TestCanvas::test_create_appointment_group_fail_on_context_codes tests/test_canvas.py::TestCanvas::test_create_appointment_group_fail_on_title tests/test_canvas.py::TestCanvas::test_create_calendar_event tests/test_canvas.py::TestCanvas::test_create_calendar_event_fail tests/test_canvas.py::TestCanvas::test_create_conversation tests/test_canvas.py::TestCanvas::test_create_group tests/test_canvas.py::TestCanvas::test_get_account tests/test_canvas.py::TestCanvas::test_get_account_fail tests/test_canvas.py::TestCanvas::test_get_accounts tests/test_canvas.py::TestCanvas::test_get_activity_stream_summary tests/test_canvas.py::TestCanvas::test_get_appointment_group tests/test_canvas.py::TestCanvas::test_get_calendar_event tests/test_canvas.py::TestCanvas::test_get_conversation tests/test_canvas.py::TestCanvas::test_get_conversations tests/test_canvas.py::TestCanvas::test_get_course tests/test_canvas.py::TestCanvas::test_get_course_accounts tests/test_canvas.py::TestCanvas::test_get_course_fail tests/test_canvas.py::TestCanvas::test_get_course_nickname tests/test_canvas.py::TestCanvas::test_get_course_nickname_fail tests/test_canvas.py::TestCanvas::test_get_course_nicknames tests/test_canvas.py::TestCanvas::test_get_course_non_unicode_char tests/test_canvas.py::TestCanvas::test_get_course_with_start_date tests/test_canvas.py::TestCanvas::test_get_courses tests/test_canvas.py::TestCanvas::test_get_file tests/test_canvas.py::TestCanvas::test_get_group tests/test_canvas.py::TestCanvas::test_get_group_category tests/test_canvas.py::TestCanvas::test_get_section tests/test_canvas.py::TestCanvas::test_get_todo_items tests/test_canvas.py::TestCanvas::test_get_upcoming_events tests/test_canvas.py::TestCanvas::test_get_user tests/test_canvas.py::TestCanvas::test_get_user_by_id_type tests/test_canvas.py::TestCanvas::test_get_user_fail tests/test_canvas.py::TestCanvas::test_list_appointment_groups tests/test_canvas.py::TestCanvas::test_list_calendar_events tests/test_canvas.py::TestCanvas::test_list_group_participants tests/test_canvas.py::TestCanvas::test_list_user_participants tests/test_canvas.py::TestCanvas::test_reserve_time_slot tests/test_canvas.py::TestCanvas::test_reserve_time_slot_by_participant_id tests/test_canvas.py::TestCanvas::test_search_accounts tests/test_canvas.py::TestCanvas::test_search_all_courses tests/test_canvas.py::TestCanvas::test_search_recipients tests/test_canvas.py::TestCanvas::test_set_course_nickname
canvasapi/canvas.py
canvasapi/canvas.py