diff --git a/CHANGELOG.md b/CHANGELOG.md
index db753f4..3217015 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -5,6 +5,9 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
 and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
 
 ## [Unreleased]
+### Added
+- Expose pass-through `auth` argument to `requests`
+
 ### Changed
 - Moved all tests to a top-level `tests` package and switched to using the `pytest` runner
 - Added missing parameter in docstring for `apiron.client.ServiceCaller.call`
diff --git a/apiron/client.py b/apiron/client.py
index 9c6dffd..42199a7 100644
--- a/apiron/client.py
+++ b/apiron/client.py
@@ -86,6 +86,7 @@ class ServiceCaller:
         data=None,
         headers=None,
         cookies=None,
+        auth=None,
     ):
         host = cls.choose_host(service=service)
 
@@ -104,6 +105,7 @@ class ServiceCaller:
             data=data,
             headers=headers,
             cookies=cookies,
+            auth=auth,
         )
 
         return session.prepare_request(request)
@@ -120,6 +122,7 @@ class ServiceCaller:
         data=None,
         headers=None,
         cookies=None,
+        auth=None,
         retry_spec=DEFAULT_RETRY,
         timeout_spec=DEFAULT_TIMEOUT,
         logger=None,
@@ -153,6 +156,8 @@ class ServiceCaller:
         :param dict cookies:
             Cookies to send to the endpoint
             (default ``None``)
+        :param auth:
+            An object suitable for the :class:`requests.Request` object's ``auth`` argument
         :param urllib3.util.retry.Retry retry_spec:
             (optional)
             An override of the retry behavior for this call.
@@ -190,6 +195,7 @@ class ServiceCaller:
             data=data,
             headers=headers,
             cookies=cookies,
+            auth=auth,
         )
 
         logger.info('{method} {url}'.format(

Add pass-through auth argument to ServiceCaller.call
**Is your feature request related to a problem? Please describe.**
It's currently fairly cumbersome to perform HTTP Basic Auth with `ServiceCaller.call`—doing so requires some amount of string manipulation, encoding, and bytes<->str casting. `requests` supports ease of use here via the `auth` argument to the `Request` constructor.

**Describe the solution you'd like**
`ServiceCaller.call` accepts an optional `auth` argument that, when supplied, is passed to the underlying `requests` call. This would allow other types of [custom authentication](http://docs.python-requests.org/en/master/user/advanced/#custom-authentication) as well.

**Describe alternatives you've considered**
This is currently _possible_ through HTTP headers via the `headers` argument, but requires some manual work by the developer since the header needs to be something of the form: `Authorization: Basic <b64encode(bytes('username:password'.encode('utf-8')))>`. This is somewhat cumbersome.

diff --git a/tests/test_client.py b/tests/test_client.py
index f4a95a8..8338fbc 100644
--- a/tests/test_client.py
+++ b/tests/test_client.py
@@ -47,6 +47,7 @@ class ClientTestCase(unittest.TestCase):
         data = 'I am a data'
         headers = {'Accept': 'stuff'}
         cookies = {'chocolate-chip': 'yes'}
+        auth = mock.Mock()
 
         mock_get_required_headers.return_value = {'header': 'value'}
         expected_headers = {}
@@ -63,6 +64,7 @@ class ClientTestCase(unittest.TestCase):
                 data=data,
                 headers=headers,
                 cookies=cookies,
+                auth=auth,
             )
 
             mock_request_constructor.assert_called_once_with(
@@ -72,6 +74,7 @@ class ClientTestCase(unittest.TestCase):
                 cookies=cookies,
                 params=params,
                 data=data,
+                auth=auth,
             )
 
             self.assertEqual(1, mock_prepare_request.call_count)

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.9
requirements.txt
pytest --no-header -rA --tb=line --color=no -p no:cacheprovider -W ignore::DeprecationWarning
-e git+https://github.com/ithaka/apiron.git@b71ef29b73b497d7065439d9e2663fedf0c44e36#egg=apiron
certifi==2025.1.31
charset-normalizer==3.4.1
coverage==7.8.0
exceptiongroup==1.2.2
execnet==2.1.1
idna==3.10
iniconfig==2.1.0
packaging==24.2
pluggy==1.5.0
pytest==8.3.5
pytest-asyncio==0.26.0
pytest-cov==6.0.0
pytest-mock==3.14.0
pytest-xdist==3.6.1
requests==2.32.3
tomli==2.2.1
typing_extensions==4.13.0
urllib3==2.3.0

name: apiron
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
  - ld_impl_linux-64=2.40=h12ee557_0
  - libffi=3.4.4=h6a678d5_1
  - 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=3.0.16=h5eee18b_0
  - pip=25.0=py39h06a4308_0
  - python=3.9.21=he870216_1
  - readline=8.2=h5eee18b_0
  - setuptools=75.8.0=py39h06a4308_0
  - sqlite=3.45.3=h5eee18b_0
  - tk=8.6.14=h39e8969_0
  - tzdata=2025a=h04d1e81_0
  - wheel=0.45.1=py39h06a4308_0
  - xz=5.6.4=h5eee18b_1
  - zlib=1.2.13=h5eee18b_1
  - pip:
      - certifi==2025.1.31
      - charset-normalizer==3.4.1
      - coverage==7.8.0
      - exceptiongroup==1.2.2
      - execnet==2.1.1
      - idna==3.10
      - iniconfig==2.1.0
      - packaging==24.2
      - pluggy==1.5.0
      - pytest==8.3.5
      - pytest-asyncio==0.26.0
      - pytest-cov==6.0.0
      - pytest-mock==3.14.0
      - pytest-xdist==3.6.1
      - requests==2.32.3
      - tomli==2.2.1
      - typing-extensions==4.13.0
      - urllib3==2.3.0
prefix: /opt/conda/envs/apiron

tests/test_client.py::ClientTestCase::test_build_request_object_passes_arguments_to_request_constructor
tests/test_client.py::ClientTestCase::test_build_request_object_raises_no_host_exception tests/test_client.py::ClientTestCase::test_call tests/test_client.py::ClientTestCase::test_call_with_existing_session tests/test_client.py::ClientTestCase::test_choose_host tests/test_client.py::ClientTestCase::test_choose_host_raises_exception tests/test_client.py::ClientTestCase::test_get_adapted_session tests/test_client.py::ClientTestCase::test_get_required_headers
apiron/client.py CHANGELOG.md
apiron/client.py CHANGELOG.md