Repository: BookOps-CAT/bookops-worldcat (language: python)

Issue:
Add documentation on adding retention commitments with Metadata API
OCLC mentions in [this doc](https://www.oclc.org/content/dam/developer-network/worldcat-metadata-api/worldcat-metadata-api-functionality-comparison.pdf) that it is possible to maintain shared print retention commitments with the Metadata API Version 2.0.


Discussion / hints:
Contacted OCLC support 3/25/24 to ask how one updates retention commitments with the Metadata API.

Fix patch:
diff --git a/bookops_worldcat/_session.py b/bookops_worldcat/_session.py
index 04a32ee..447a73f 100644
--- a/bookops_worldcat/_session.py
+++ b/bookops_worldcat/_session.py
@@ -1,8 +1,7 @@
 # -*- coding: utf-8 -*-
 
 """
-Base session class to allow extention of functionality to Worldcat Search API
-and others.
+Base session class to be subclassed for use with individual OCLC APIs.
 """
 
 from typing import Optional, Tuple, Union, List
@@ -15,7 +14,7 @@
 
 
 class WorldcatSession(requests.Session):
-    """Base class, inherits all requests.Session methods"""
+    """Base class for WorldCat API sessions. Inherits all `requests.Session` methods."""
 
     def __init__(
         self,
@@ -32,30 +31,35 @@ def __init__(
     ) -> None:
         """
         Args:
-            authorization:          WorldcatAccessToken instance
-            agent:                  "User-agent" parameter to attached to each
-                                    request in the session
-            timeout:                how long to wait for server to send data
-                                    before giving up
-            totalRetries:           optional number of times to retry a request that
-                                    failed or timed out. if totalRetries argument is
-                                    not passed, any arguments passed to
-                                    backoffFactor, statusForcelist, and
-                                    allowedMethods will be ignored. default is 0
-            backoffFactor:          if totalRetries is not 0, the backoff
-                                    factor as a float to use to calculate amount of
-                                    time session will sleep before attempting request
-                                    again. default is 0
-            statusForcelist:        if totalRetries is not 0, a list of HTTP
-                                    status codes to automatically retry requests on.
-                                    if not specified, failed requests with status codes
-                                    413, 429, and 503 will be retried up to number of
-                                    totalRetries.
-                                    example: [500, 502, 503, 504]
-            allowedMethods:         if totalRetries is not 0, set of HTTP methods that
-                                    requests should be retried on. if not specified,
-                                    requests using any HTTP method verbs will be
-                                    retried. example: ["GET", "POST"]
+            authorization:
+                `WorldcatAccessToken` instance.
+            agent:
+                `User-agent` parameter to attached to each request in the session.
+            timeout:
+                How long to wait for server to send data before giving up. Accepts
+                separate values for connect and read timeouts or a single value.
+            totalRetries:
+                Optional number of times to retry a request that has failed or timed
+                out. If `totalRetries` argument is not passed, all arguments passed
+                to `backoffFactor`, `statusForcelist`, and `allowedMethods`
+                will be ignored.
+            backoffFactor:
+                If `totalRetries` is not `0`, the backoff factor as a float to use to
+                calculate amount of time session will sleep before attempting request
+                again.
+            statusForcelist:
+                If `totalRetries` is not `0`, a list of HTTP status codes to
+                automatically retry requests on. If not specified, failed requests with
+                status codes 413, 429, and 503 will be retried up to number of
+                `totalRetries`.
+
+                **EXAMPLE:** `[500, 502, 503, 504]`
+            allowedMethods:
+                If `totalRetries` is not `0`, set of HTTP methods that requests should
+                be retried on. If not specified, requests using any HTTP method verbs
+                will be retried.
+
+                **EXAMPLE:** `["GET", "POST"]`
         """
         super().__init__()
         self.authorization = authorization
diff --git a/bookops_worldcat/authorize.py b/bookops_worldcat/authorize.py
index 6945ee3..bea9fe0 100644
--- a/bookops_worldcat/authorize.py
+++ b/bookops_worldcat/authorize.py
@@ -1,7 +1,7 @@
 # -*- coding: utf-8 -*-
 
 """
-This module provides means to authenticate and obtain a WorldCat access token.
+Provides means to authenticate and authorize interactions with OCLC web services.
 """
 
 import datetime
@@ -16,63 +16,49 @@
 
 class WorldcatAccessToken:
     """
-    Requests Worldcat access token.
-    Authenticates and authorizes using Client Credentials Grant. Does not support
-    Explicit Authorization Code and Refresh Token flows. Token with correctly
-    bonded scopes can then be passed into a session of particular web service
-    to authorize requests for resources.
-    More on OCLC's client credentials grant:
-    https://www.oclc.org/developer/api/keys/oauth/client-credentials-grant.en.html
-
-    Args:
-        key:                    your WSKey public client_id
-        secret:                 your WSKey secret
-        scopes:                 request scopes for the access token as a string,
-                                separate different scopes with space
-                                users with WSKeys set up to act as multiple institutions
-                                should provide scope and registryID in the format
-                                "{scope} context:{registryID}"
-                                examples:
-                                    single institution WSKey:
-                                        "WorldCatMetadataAPI"
-                                    multi-institution WSKey:
-                                        "WorldCatMetadataAPI context:00001"
-        agent:                  "User-agent" parameter to be passed in the request
-                                header; usage strongly encouraged
-        timeout:                how long to wait for server to send data before
-                                giving up; default value is 3 seconds
-
-
-    Examples:
-        >>> from bookops_worldcat import WorldcatAccessToken
-        >>> token = WorldcatAccessToken(
-                key="my_WSKey_client_id",
-                secret="my_WSKey_secret",
-                scopes="WorldCatMetadataAPI",
-                agent="my_app/1.0.0")
-        >>> token.token_str
-        "tk_Yebz4BpEp9dAsghA7KpWx6dYD1OZKWBlHjqW"
-        >>> token.is_expired()
-        False
-        >>> token.server_response.json()
-        {"token_token": "tk_Yebz4BpEp9dAsghA7KpWx6dYD1OZKWBlHjqW",
-         "token_type": "bearer",
-         "expires_in": "1199",
-         "principalID": "",
-         "principalIDNS": "",
-         "scopes": "WorldCatMetadataAPI",
-         "contextInstitutionId": "00001",
-         "expires_at": "2020-08-23 18:45:29Z"}
-        >>> token.server_response.request.headers
-        {"User-Agent": "my_app/1.0.0",
-         "Accept-Encoding": "gzip, deflate",
-         "Accept": "application/json",
-         "Connection": "keep-alive",
-         "Content-Length": "67",
-         "Content-Type": "application/x-www-form-urlencoded",
-         "Authorization": "Basic encoded_authorization_here="}
-
-    """
+    Requests a WorldCat access token.
+
+    Authenticates and authorizes using
+    [Client Credentials Grant](https://www.oclc.org/developer/api/keys/oauth/client-credentials-grant.en.html)
+    flow. A token with correctly bonded scopes can be passed into a session of an
+    OCLC web service to authorize requests for resources.
+
+    Example:
+        ```py
+        from bookops_worldcat import WorldcatAccessToken
+
+        token = WorldcatAccessToken(
+            key="my_WSKey_client_id",
+            secret="my_WSKey_secret",
+            scopes="WorldCatMetadataAPI",
+            agent="my_app/1.0.0")
+        print(token.token_str)
+        #>"tk_Yebz4BpEp9dAsghA7KpWx6dYD1OZKWBlHjqW"
+        print(token.is_expired())
+        #>False
+        print(token.server_response.json())
+        {
+            "token_token": "tk_Yebz4BpEp9dAsghA7KpWx6dYD1OZKWBlHjqW",
+            "token_type": "bearer",
+            "expires_in": "1199",
+            "principalID": "",
+            "principalIDNS": "",
+            "scopes": "WorldCatMetadataAPI",
+            "contextInstitutionId": "00001",
+            "expires_at": "2020-08-23 18:45:29Z"
+        }
+        print(token.server_response.request.headers)
+        {
+            "User-Agent": "my_app/1.0.0",
+            "Accept-Encoding": "gzip, deflate",
+            "Accept": "application/json",
+            "Connection": "keep-alive",
+            "Content-Length": "67",
+            "Content-Type": "application/x-www-form-urlencoded",
+            "Authorization": "Basic encoded_authorization_here="
+        }
+        ```
+    """  # noqa: E501
 
     def __init__(
         self,
@@ -80,11 +66,51 @@ def __init__(
         secret: str,
         scopes: str,
         agent: str = "",
-        timeout: Optional[
-            Union[int, float, Tuple[int, int], Tuple[float, float]]
-        ] = None,
+        timeout: Union[int, float, Tuple[int, int], Tuple[float, float], None] = (
+            5,
+            5,
+        ),
     ) -> None:
-        """Constructor"""
+        """Initializes WorldcatAccessToken object.
+
+
+        info: Usage Documentation:
+            - [Basic Usage](../start.md#authentication-and-authorization)
+            - [Advanced Usage](../advanced.md#WorldcatAccessToken)
+
+        Args:
+            key:
+                Your WSKey public client_id
+            secret:
+                Your WSKey secret
+            scopes:
+                Request scopes for the access token as a string. Multiple scopes
+                should be separated with a space. Users with WSKeys set up to act on
+                behalf of multiple institutions should provide scope and registryID
+                in the format:
+                `{scope} context:{registryID}`
+
+                **EXAMPLES:**
+
+                - Single institution WSKey: `"WorldCatMetadataAPI"`
+                - Multi-institution WSKey: `"WorldCatMetadataAPI context:00001"`
+
+            agent:
+                `User-agent` parameter to be passed in the request header. Usage is
+                strongly encouraged.
+            timeout:
+                How long to wait for server to send data before giving up. Accepts
+                separate values for connect and read timeouts or a single value.
+
+        Raises:
+            TypeError:
+                If `agent`, `key`, `secret`, or `scopes` args are passed
+                anything other than a str.
+            ValueError:
+                If an empty str is passed to `key`, `secret` or `scopes` arg.
+            WorldcatAuthorizationError:
+                If request for token encounters any errors.
+        """
 
         self.agent = agent
         self.grant_type = "client_credentials"
@@ -126,10 +152,6 @@ def __init__(
             raise TypeError("Argument 'scopes' must a string.")
         self.scopes = self.scopes.strip()
 
-        # assign default value for timout
-        if not self.timeout:
-            self.timeout = (3, 3)
-
         # initiate request
         self._request_token()
 
@@ -143,10 +165,10 @@ def _hasten_expiration_time(self, utc_stamp_str: str) -> datetime.datetime:
         new token in session setting.
 
         Args:
-            utcstamp:               utc timestamp string
+            utcstamp: utc timestamp string
 
         Returns:
-            utcstamp
+            UTC timestamp as `datetime.datetime` object
         """
         utcstamp = datetime.datetime.strptime(
             utc_stamp_str, "%Y-%m-%d %H:%M:%SZ"
@@ -155,7 +177,11 @@ def _hasten_expiration_time(self, utc_stamp_str: str) -> datetime.datetime:
         return utcstamp
 
     def _parse_server_response(self, response: requests.Response) -> None:
-        """Parses authorization server response"""
+        """Parses authorization server response
+
+        Raises:
+            WorldcatAuthorizationError: If server returns an error code.
+        """
         self.server_response = response
         if response.status_code == requests.codes.ok:
             self.token_str = response.json()["access_token"]
@@ -178,8 +204,12 @@ def _post_token_request(self) -> requests.Response:
         Fetches Worldcat access token for specified scope (web service)
 
         Returns:
-            requests.models.Response
-        """
+            [`requests.Response`](https://requests.readthedocs.io/en/latest/api/#requests.Response)
+            instance
+
+        Raises:
+            WorldcatAuthorizationError: If access token POST request encounters any errors.
+        """  # noqa: E501
 
         token_url = self._token_url()
         headers = self._token_headers()
@@ -218,12 +248,23 @@ def is_expired(self) -> bool:
         Checks if the access token is expired.
 
         Returns:
-            bool
+            bool: Whether or not the token is expired.
 
-        Examples:
-            >>> token.is_expired()
-            False
+        Raises:
+            TypeError:
+                If `WorldcatAccessToken.token_expires_at` is not a
+                `datetime.datetime` object.
 
+        Example:
+            ```py
+            token = WorldcatAccessToken(
+                key="my_WSKey_client_id",
+                secret="my_WSKey_secret",
+                scopes="WorldCatMetadataAPI",
+                agent="my_app/1.0.0")
+            print(token.is_expired())
+            #>False
+            ```
         """
         if isinstance(self.token_expires_at, datetime.datetime):
             if self.token_expires_at < datetime.datetime.now(datetime.timezone.utc):
diff --git a/bookops_worldcat/metadata_api.py b/bookops_worldcat/metadata_api.py
index ff5dc21..5fac7c2 100644
--- a/bookops_worldcat/metadata_api.py
+++ b/bookops_worldcat/metadata_api.py
@@ -1,8 +1,6 @@
 # -*- coding: utf-8 -*-
 
-"""
-This module provides MetadataSession class for requests to WorldCat Metadata API.
-"""
+"""WorldCat Metadata API wrapper session."""
 
 from typing import Callable, Dict, List, Optional, Tuple, Union, BinaryIO
 
@@ -15,7 +13,15 @@
 
 
 class MetadataSession(WorldcatSession):
-    """OCLC Metadata API wrapper session. Inherits `requests.Session` methods"""
+    """
+    The `MetadataSession` class supports interactions with the WorldCat Metadata API
+    and the child methods of this class allow users to interact with each endpoint
+    of the API.
+
+    `MetadataSession` inherits attributes and methods from `requests.Session`
+    and `WorldcatSession` and contains specific functionality for interacting
+    with the WorldCat Metadata API.
+    """
 
     BASE_URL = "https://metadata.api.oclc.org/worldcat"
 
@@ -23,39 +29,48 @@ def __init__(
         self,
         authorization: WorldcatAccessToken,
         agent: Optional[str] = None,
-        timeout: Union[int, float, Tuple[int, int], Tuple[float, float], None] = None,
+        timeout: Union[int, float, Tuple[int, int], Tuple[float, float], None] = (
+            5,
+            5,
+        ),
         totalRetries: int = 0,
         backoffFactor: float = 0,
         statusForcelist: Optional[List[int]] = None,
         allowedMethods: Optional[List[str]] = None,
     ) -> None:
-        """Initializes MetadataSession
+        """Initializes MetadataSession.
 
         Args:
-            authorization:          WorldcatAccessToken object
-            agent:                  "User-agent" parameter to be passed in the request
-                                    header; usage strongly encouraged
-            timeout:                how long to wait for server to send data before
-                                    giving up; default value is 5 seconds
-            totalRetries:           optional number of times to retry a request that
-                                    failed or timed out. if totalRetries argument is
-                                    not passed, any arguments passed to
-                                    backoffFactor, statusForcelist, and
-                                    allowedMethods will be ignored. default is 0
-            backoffFactor:          if totalRetries is not 0, the backoff
-                                    factor as a float to use to calculate amount of
-                                    time session will sleep before attempting request
-                                    again. default is 0
-            statusForcelist:        if totalRetries is not 0, a list of HTTP
-                                    status codes to automatically retry requests on.
-                                    if not specified, failed requests with status codes
-                                    413, 429, and 503 will be retried up to number of
-                                    totalRetries.
-                                    example: [500, 502, 503, 504]
-            allowedMethods:         if totalRetries is not 0, set of HTTP methods that
-                                    requests should be retried on. if not specified,
-                                    requests using any HTTP method verbs will be
-                                    retried. example: ["GET", "POST"]
+            authorization:
+                `WorldcatAccessToken` object for session.
+            agent:
+                `User-agent` for session to be passed in the request header. Usage is
+                strongly encouraged.
+            timeout:
+                How long to wait for server to send data before giving up. Accepts
+                separate values for connect and read timeouts or a single value.
+            totalRetries:
+                Optional number of times to retry a request that failed or timed out.
+                If `totalRetries` argument is not passed, any arguments passed to
+                `backoffFactor`, `statusForcelist`, and `allowedMethods` will be
+                ignored.
+            backoffFactor:
+                If `totalRetries` is not `0`, the backoff factor as a float to use to
+                calculate amount of time session will sleep before attempting request
+                again.
+            statusForcelist:
+                If `totalRetries` is not `0`, a list of HTTP status codes to
+                automatically retry requests on. If not specified, failed requests
+                with status codes 413, 429, and 503 will be retried up to number of
+                `totalRetries`.
+
+                **EXAMPLE:** `[500, 502, 503, 504]`
+            allowedMethods:
+                If `totalRetries` is not `0`, set of HTTP methods that requests should
+                be retried on. If not specified, requests using any HTTP method verbs
+                will be retried.
+
+                **EXAMPLE:** `["GET", "POST"]`
         """
         super().__init__(
             authorization,
@@ -160,19 +175,24 @@ def bib_create(
     ) -> Optional[Response]:
         """
         Create a bib record in OCLC if it does not already exist.
+
         Uses /manage/bibs endpoint.
 
         Args:
-            record:                 MARC record to be created
-            recordFormat:           format of MARC record; options:
-                                    'application/marcxml+xml'; 'application/marc'
-            responseFormat:         format of returned record; options:
-                                    'application/marcxml+xml', 'application/marc'
-                                    default is 'application/marcxml+xml'
-            hooks:                  Requests library hook system that can be used for
-                                    signal event handling. For more information see the
-                                    [Requests docs](https://requests.readthedocs.io/en/
-                                    master/user/advanced/#event-hooks)
+            record:
+                MARC record to be created
+            recordFormat:
+                Format of MARC record.
+
+                **OPTIONS:** `'application/marcxml+xml'` or `'application/marc'`
+            responseFormat:
+                Format of returned record.
+
+                **OPTIONS:** `'application/marcxml+xml'` or `'application/marc'`
+            hooks:
+                Requests library hook system that can be used for signal event
+                handling. For more information see the [Requests docs](https://requests.
+                readthedocs.io/en/master/user/advanced/#event-hooks)
 
         Returns:
             `requests.Response` instance
@@ -199,20 +219,22 @@ def bib_get(
         hooks: Optional[Dict[str, Callable]] = None,
     ) -> Optional[Response]:
         """
-        Send a GET request for a full bibliographic resource.
+        Send a GET request for a full bib record.
+
         Uses /manage/bibs/{oclcNumber} endpoint.
 
         Args:
-            oclcNumber:             OCLC bibliographic record number; can be an
-                                    integer or string with or without OCLC Number
-                                    prefix
-            responseFormat:         format of returned record, options:
-                                    'application/marcxml+xml', 'application/marc',
-                                    default is 'application/marcxml+xml'
-            hooks:                  Requests library hook system that can be used for
-                                    signal event handling. For more information see the
-                                    [Requests docs](https://requests.readthedocs.io/en/
-                                    master/user/advanced/#event-hooks)
+            oclcNumber:
+                OCLC bibliographic record number. Can be an integer or string
+                with or without OCLC Number prefix.
+            responseFormat:
+                Format of returned record.
+
+                **OPTIONS:** `'application/marcxml+xml'` or `'application/marc'`
+            hooks:
+                Requests library hook system that can be used for signal event
+                handling. For more information see the [Requests docs](https://requests.
+                readthedocs.io/en/master/user/advanced/#event-hooks)
 
         Returns:
             `requests.Response` instance
@@ -239,16 +261,17 @@ def bib_get_classification(
         """
         Given an OCLC number, retrieve classification recommendations for the bib
         record.
+
         Uses /search/classification-bibs/{oclcNumber} endpoint.
 
         Args:
-            oclcNumber:             OCLC bibliographic record number; can be an
-                                    integer or string with or without OCLC Number
-                                    prefix
-            hooks:                  Requests library hook system that can be used for
-                                    signal event handling. For more information see the
-                                    [Requests docs](https://requests.readthedocs.io/en/
-                                    master/user/advanced/#event-hooks)
+            oclcNumber:
+                OCLC bibliographic record number. Can be an integer or string
+                with or without OCLC Number prefix.
+            hooks:
+                Requests library hook system that can be used for signal event
+                handling. For more information see the [Requests docs](https://requests.
+                readthedocs.io/en/master/user/advanced/#event-hooks)
 
         Returns:
             `requests.Response` instance
@@ -269,30 +292,34 @@ def bib_get_classification(
 
     def bib_get_current_oclc_number(
         self,
-        oclcNumbers: Union[str, List[Union[str, int]]],
+        oclcNumbers: Union[int, str, List[Union[str, int]]],
         hooks: Optional[Dict[str, Callable]] = None,
     ) -> Optional[Response]:
         """
         Given one or more OCLC Numbers, retrieve current OCLC numbers.
+
         Uses /manage/bibs/current endpoint.
 
         Args:
-            oclcNumbers:            string or list containing one or more OCLC numbers
-                                    to be checked; numbers can be integers or strings
-                                    with or without OCLC Number prefix;
-                                    if str, the numbers must be separated by a comma
-            hooks:                  Requests library hook system that can be used for
-                                    signal event handling. For more information see the
-                                    [Requests docs](https://requests.readthedocs.io/en/
-                                    master/user/advanced/#event-hooks)
-
-
-        Returns:
-            `requests.Response` instance
+            oclcNumbers:
+                Integer, string or list containing one or more OCLC numbers to be
+                checked. Numbers can be integers or strings with or without OCLC
+                Number prefix. If str, the numbers must be separated by a comma.
+                If int, only one number may be passed as an arg.
+            hooks:
+                Requests library hook system that can be used for signal event
+                handling. For more information see the [Requests docs](https://requests.
+                readthedocs.io/en/master/user/advanced/#event-hooks)
+
+        Raises:
+            ValueError: If more than 10 items passed to `oclcNumbers` arg.
         """
-
         vetted_numbers = verify_oclc_numbers(oclcNumbers)
 
+        # check that no more than 10 oclc numbers were passed
+        if len(vetted_numbers) > 10:
+            raise ValueError("Too many OCLC Numbers passed to 'oclcNumbers' argument.")
+
         header = {"Accept": "application/json"}
         url = self._url_manage_bibs_current_oclc_number()
         payload = {"oclcNumbers": ",".join(vetted_numbers)}
@@ -315,17 +342,21 @@ def bib_match(
         """
         Given a bib record in MARC21 or MARCXML identify the best match in WorldCat.
         Record must contain at minimum an 008 and 245. Response contains number of
-        potential matches in numberOfRecords and best match in briefRecords.
+        potential matches in `numberOfRecords` and best match in `briefRecords`.
+
         Uses /manage/bibs/match endpoint.
 
         Args:
-            record:                 MARC record to be matched
-            recordFormat:           format of MARC record, options:
-                                    'application/marcxml+xml', 'application/marc'
-            hooks:                  Requests library hook system that can be used for
-                                    signal event handling. For more information see the
-                                    [Requests docs](https://requests.readthedocs.io/en/
-                                    master/user/advanced/#event-hooks)
+            record:
+                MARC record to be matched.
+            recordFormat:
+                Format of MARC record.
+
+                **OPTIONS:** `'application/marcxml+xml'` or `'application/marc'`
+            hooks:
+                Requests library hook system that can be used for signal event
+                handling. For more information see the [Requests docs](https://requests.
+                readthedocs.io/en/master/user/advanced/#event-hooks)
 
         Returns:
             `requests.Response` instance
@@ -356,22 +387,24 @@ def bib_replace(
         """
         Given an OCLC number and MARC record, find record in WorldCat and replace it.
         If the record does not exist in WorldCat, a new bib record will be created.
+
         Uses /manage/bibs/{oclcNumber} endpoint.
 
         Args:
-            oclcNumber:             OCLC bibliographic record number; can be an
-                                    integer or string with or without OCLC Number
-                                    prefix
-            record:                 MARC record to replace existing WorldCat record
-            recordFormat:           format of MARC record, options:
-                                    'application/marcxml+xml', 'application/marc'
-            responseFormat:         format of returned record; options:
-                                    'application/marcxml+xml', 'application/marc'
-                                    default is 'application/marcxml+xml'
-            hooks:                  Requests library hook system that can be used for
-                                    signal event handling. For more information see the
-                                    [Requests docs](https://requests.readthedocs.io/en/
-                                    master/user/advanced/#event-hooks)
+            record:
+                MARC record to replace existing WorldCat record
+            recordFormat:
+                Format of MARC record.
+
+                **OPTIONS:** `'application/marcxml+xml'` or `'application/marc'`
+            responseFormat:
+                Format of returned record.
+
+                **OPTIONS:** `'application/marcxml+xml'` or `'application/marc'`
+            hooks:
+                Requests library hook system that can be used for signal event
+                handling. For more information see the [Requests docs](https://requests.
+                readthedocs.io/en/master/user/advanced/#event-hooks)
 
         Returns:
             `requests.Response` instance
@@ -402,23 +435,32 @@ def bib_validate(
     ) -> Optional[Response]:
         """
         Given a bib record, validate that record conforms to MARC standards.
+
         Uses /manage/bibs/validate/{validationLevel} endpoint.
 
         Args:
-            record:                 MARC record to be validated
-            recordFormat:           format of MARC record, options:
-                                    'application/marcxml+xml', 'application/marc'
-            validationLevel:        Level at which to validate records
-                                    available values: 'validateFull', 'validateAdd',
-                                    'validateReplace'
-                                    default is 'validateFull'
-            hooks:                  Requests library hook system that can be used for
-                                    signal event handling. For more information see the
-                                    [Requests docs](https://requests.readthedocs.io/en/
-                                    master/user/advanced/#event-hooks)
+            record:
+                MARC record to validate
+            recordFormat:
+                Format of MARC record.
+
+                **OPTIONS:** `'application/marcxml+xml'` or `'application/marc'`
+            validationLevel:
+                Level at which to validate records.
+
+                **OPTIONS:** `'validateFull'`, `'validateAdd'`, `'validateReplace'`
+            hooks:
+                Requests library hook system that can be used for signal event
+                handling. For more information see the [Requests docs](https://requests.
+                readthedocs.io/en/master/user/advanced/#event-hooks)
 
         Returns:
             `requests.Response` instance
+
+        Raises:
+            ValueError:
+                If value of arg passed to `validationLevel` is not
+                `'validateFull'`, `'validateAdd'`, or `'validateReplace'`.
         """
         if validationLevel not in ["validateFull", "validateAdd", "validateReplace"]:
             raise ValueError(
@@ -452,16 +494,17 @@ def brief_bibs_get(
     ) -> Optional[Response]:
         """
         Retrieve specific brief bibliographic resource.
+
         Uses /search/brief-bibs/{oclcNumber} endpoint.
 
         Args:
-            oclcNumber:             OCLC bibliographic record number; can be an
-                                    integer or string with or without OCLC Number
-                                    prefix
-            hooks:                  Requests library hook system that can be used for
-                                    signal event handling. For more information see the
-                                    [Requests docs](https://requests.readthedocs.io/en/
-                                    master/user/advanced/#event-hooks)
+            oclcNumber:
+                OCLC bibliographic record number. Can be an integer or string
+                with or without OCLC Number prefix.
+            hooks:
+                Requests library hook system that can be used for signal event
+                handling. For more information see the [Requests docs](https://requests.
+                readthedocs.io/en/master/user/advanced/#event-hooks)
 
         Returns:
             `requests.Response` instance
@@ -519,103 +562,149 @@ def brief_bibs_search(
     ) -> Optional[Response]:
         """
         Search for brief bibliographic resources using WorldCat query syntax.
-        See https://help.oclc.org/Librarian_Toolbox/Searching_WorldCat_Indexes/
-        Bibliographic_records/Bibliographic_record_indexes for more information on
-        available indexes. Request may contain only one of: heldByInstitutionID,
-        heldByGroup, heldBySymbol, or combination of lat and lon.
+        See OCLC
+        [Bibliographic Records Index Documentation](https://help.oclc.org/Librarian_Toolbox/Searching_WorldCat_Indexes/Bibliographic_records/Bibliographic_record_indexes)
+        for more information on available indexes. Request may contain
+        only one of: `heldByInstitutionID`, `heldByGroup`, `heldBySymbol`, or
+        combination of `lat` and `lon`.
+
         Uses /search/brief-bibs endpoint.
 
         Args:
-            q:                      query in the form of a keyword search or
-                                    fielded search;
-                                    examples:
-                                        ti:Zendegi
-                                        ti:"Czarne oceany"
-                                        bn:9781680502404
-                                        kw:python databases
-                                        ti:Zendegi AND au:greg egan
-                                        (au:Okken OR au:Myers) AND su:python
-            deweyNumber:            limits the response to the
-                                    specified dewey classification number(s);
-                                    for multiple values repeat the parameter,
-                                    example:
-                                        '794,180'
-            datePublished:          restricts the response to one or
-                                    more dates, or to a range,
-                                    examples:
-                                        '2000'
-                                        '2000-2005'
-                                        '2000,2005'
-            heldByGroup:            restricts to holdings held by group symbol
-            heldBySymbol:           restricts response to holdings held by specified
-                                    institution symbol
-            heldByInstitutionID:    restricts response to holdings held by specified
-                                    institution registryId
-            inLanguage:             restricts the response to the single
-                                    specified language, example: 'fre'
-            inCatalogLanguage:      restricts the response to specified
-                                    cataloging language, example: 'eng';
-                                    default 'eng'
-            materialType:           restricts responses to specified material type,
-                                    example: 'bks', 'vis'
-            catalogSource:          restrict to responses to single OCLC symbol as
-                                    the cataloging source, example: 'DLC'
-            itemType:               restricts responses to single specified OCLC
-                                    top-level facet type, example: 'book'
-            itemSubType:            restricts responses to single specified OCLC
-                                    sub facet type, example: 'digital'
-            retentionCommitments:   restricts responses to bibliographic records
-                                    with retention commitment; options: True, False,
-                                    (default is False)
-            spProgram:              restricts responses to bibliographic records
-                                    associated with particular shared print
-                                    program
-            genre:                  genre to limit results to (ge index)
-            topic:                  topic to limit results to (s0 index)
-            subtopic:               subtopic to limit results to (s1 index)
-            audience:               audience to limit results to,
-                                    available values: 'juv', 'nonJuv'
-            content:                content to limit results to
-                                    available values: 'fic', 'nonFic', 'bio'
-            openAccess:             restricts response to just open access content
-            peerReviewed:           restricts response to just peer reviewed content
-            facets:                 list of facets to restrict responses
-            groupRelatedEditions:   whether or not use FRBR grouping,
-                                    options: False, True (default is False)
-            groupVariantRecords:    whether or not to group variant records.
-                                    options: False, True (default is False)
-            preferredLanguage:      language of metadata description,
-                                    default value "eng" (English)
-            showHoldingsIndicators: whether or not to show holdings indicators in
-                                    response. options: True, False, (default is False)
-            lat:                    limit to latitude, example: 37.502508
-            lon:                    limit to longitute, example: -122.22702
-            distance:               distance from latitude and longitude
-            unit:                   unit of distance param; options:
-                                    'M' (miles) or 'K' (kilometers), default is 'M'
-            orderBy:                results sort key;
-                                    options:
-                                        'recency'
-                                        'bestMatch'
-                                        'creator'
-                                        'library'
-                                        'publicationDateAsc'
-                                        'publicationDateDesc'
-                                        'mostWidelyHeld'
-                                        'title'
-                                    default is 'bestMatch'
-            offset:                 start position of bibliographic records to
-                                    return; default is 1
-            limit:                  maximum number of records to return;
-                                    maximum is 50, default is 10
-            hooks:                  Requests library hook system that can be used for
-                                    signal event handling. For more information see the
-                                    [Requests docs](https://requests.readthedocs.io/en/
-                                    master/user/advanced/#event-hooks)
+            q:
+                Query in the form of a keyword search or fielded search.
+
+                **EXAMPLES:**
+
+                - `ti:Zendegi`
+                - `ti:"Czarne oceany"`
+                - `bn:9781680502404`
+                - `kw:python databases`
+                - `ti:Zendegi AND au:greg egan`
+                - `(au:Okken OR au:Myers) AND su:python`
+
+            deweyNumber:
+                Limits the response to the specified dewey classification number(s).
+                For multiple values repeat the parameter.
+
+                **EXAMPLE:** `'794'`
+            datePublished:
+                Restricts the response to one or more dates, or to a range.
+
+                **EXAMPLES:** `'2000'`, `'2000-2005'`, `'2000,2005'`
+            heldByGroup:
+                Limits response to holdings held by group symbol.
+            heldBySymbol:
+                Limits response to holdings held by specified institution symbol.
+            heldByInstitutionID:
+                Limits response to holdings held by specified institution registryId.
+            inLanguage:
+                Limits response to the single specified language
+
+                **EXAMPLE:** `'fre'`
+            inCatalogLanguage:
+                Limits response to specified cataloging language.
+
+                **EXAMPLE:** `'eng'`
+            materialType:
+                Limits response to specified material type.
+
+                **EXAMPLES:** `'bks'`, `'vis'`
+            catalogSource:
+                Limits response to single OCLC symbol as the cataloging source.
+
+                **EXAMPLE:** `'DLC'`
+            itemType:
+                Limits response to specified item type.
+
+                **EXAMPLE:** `'book'`, `'vis'`
+            itemSubType:
+                Limits response to specified item subtype.
+
+                **EXAMPLES:** `'book-digital'`, `'audiobook-cd'`
+            retentionCommitments:
+                Limits response to bibliographic records with retention commitment.
+
+                **OPTIONS:** `True` or `False`
+            spProgram:
+                Limits response to bibliographic records associated with particular
+                shared print program.
+            genre:
+                Genre to limit response to (ge index).
+            topic:
+                Topic to limit response to (s0 index).
+            subtopic:
+                Subtopic to limit response to (s1 index).
+            audience:
+                Audience to limit response to.
+
+                **OPTIONS:** `'juv'` or `'nonJuv'`
+            content:
+                Content to limit response to.
+
+                **OPTIONS:** `'fic'`, `'nonFic'`, `'bio'`
+            openAccess:
+                Limits response to just open access content.
+            peerReviewed:
+                Limits response to just peer reviewed content.
+            facets:
+                List of facets to limit responses.
+            groupRelatedEditions:
+                Whether or not use FRBR grouping.
+
+                **OPTIONS:** `True` or `False`
+            groupVariantRecords:
+                Whether or not to group variant records.
+
+                **OPTIONS:** `True` or `False`
+            preferredLanguage:
+                Language user would prefer metadata description in. Does not limit
+                responses. To limit responses use `inCataloglanguage` facet.
+            showHoldingsIndicators:
+                Whether or not to show holdings indicators in response.
+                **OPTIONS:** `True` or `False`
+            lat:
+                Latitude
+
+                **EXAMPLE:** `37.502508`
+            lon:
+                Longitude
+
+                **EXAMPLE:** `-122.22702`
+            distance:
+                Limits response to holdings held by institutions within specified
+                distance from latitude and longitude.
+            unit:
+                Unit of distance from latitude and longitude.
+
+                **OPTIONS:** `'M'` (miles) or `'K'` (kilometers)
+            orderBy:
+                Results sort key.
+
+                **OPTIONS:**
+
+                - `'recency'`
+                - `'bestMatch'`
+                - `'creator'`
+                - `'library'`
+                - `'publicationDateAsc'`
+                - `'publicationDateDesc'`
+                - `'mostWidelyHeld'`
+                - `'title'`
+            offset:
+                Start position of bibliographic records to return.
+            limit:
+                Maximum number of records to return.
+
+                **MAXIMUM:** `50`
+            hooks:
+                Requests library hook system that can be used for signal event
+                handling. For more information see the [Requests docs](https://requests.
+                readthedocs.io/en/master/user/advanced/#event-hooks)
 
         Returns:
             `requests.Response` instance
-        """
+        """  # noqa: E501
         url = self._url_search_brief_bibs()
         header = {"Accept": "application/json"}
         payload = {
@@ -697,86 +786,115 @@ def brief_bibs_get_other_editions(
     ) -> Optional[Response]:
         """
         Retrieve other editions related to bibliographic resource with provided
-        OCLC Number. Query may contain only one of: heldByInstitutionID,
-        heldByGroup, heldBySymbol, or spProgram.
+        OCLC Number. Query may contain only one of: `heldByInstitutionID`,
+        `heldByGroup`, `heldBySymbol`, or `spProgram`.
+
         Uses /brief-bibs/{oclcNumber}/other-editions endpoint.
 
         Args:
-            oclcNumber:             OCLC bibliographic record number; can be an
-                                    integer or string with or without OCLC Number
-                                    prefix
-            deweyNumber:            limits the response to the
-                                    specified dewey classification number(s)
-                                    example:
-                                        '794,180'
-            datePublished:          restricts the response to one or
-                                    more dates, or to a range,
-                                    examples:
-                                        '2000'
-                                        '2000-2005'
-                                        '2000,2005'
-            heldByGroup:            restricts to holdings held by group symbol
-            heldBySymbol:           restricts to holdings with specified intitution
-                                    symbol
-            heldByInstitutionID:    restrict to specified institution registryId
-            inLanguage:             restricts the response to the single
-                                    specified language, example: 'fre'
-            inCatalogLanguage:      restricts the response to specified
-                                    cataloging language, example: 'eng';
-                                    default 'eng'
-            materialType:           restricts responses to specified material type,
-                                    example: 'bks', 'vis'
-            catalogSource:          restrict to responses to single OCLC symbol as
-                                    the cataloging source, example: 'DLC'
-            itemType:               restricts responses to single specified OCLC
-                                    top-level facet type, example: 'book'
-            itemSubType:            restricts responses to single specified OCLC
-                                    sub facet type, example: 'digital'
-            retentionCommitments:   restricts responses to bibliographic records
-                                    with retention commitment; options: False, True
-                                    (default is False)
-            spProgram:              restricts responses to bibliographic records
-                                    associated with particular shared print
-                                    program
-            genre:                  genre to limit results to
-            topic:                  topic to limit results to
-            subtopic:               subtopic to limit results to
-            audience:               audience to limit results to,
-                                    example:
-                                        juv,
-                                        nonJuv
-            content:                content to limit results to,
-                                    example:
-                                        fic,
-                                        nonFic,
-                                        fic,bio
-            openAccess:             filter to only open access content, False or True
-            peerReviewed:           filter to only peer reviewed content, False or True
-            facets:                 list of facets to restrict responses
-            groupVariantRecords:    whether or not to group variant records.
-                                    options: False, True (default is False)
-            preferredLanguage:      language of metadata description, default is 'eng'
-            showHoldingsIndicators: whether or not to show holdings indicators in
-                                    response. options: True, False (default is False)
-            offset:                 start position of bibliographic records to
-                                    return; default is 1
-            limit:                  maximum number of records to return;
-                                    maximum is 50, default is 10
-            orderBy:                results sort key;
-                                    options:
-                                        'recency'
-                                        'bestMatch'
-                                        'creator'
-                                        'library'
-                                        'publicationDateAsc'
-                                        'publicationDateDesc'
-                                        'mostWidelyHeld'
-                                        'title'
-                                    default is 'publicationDateDesc'
-            hooks:                  Requests library hook system that can be used for
-                                    signal event handling. For more information see the
-                                    [Requests docs](https://requests.readthedocs.io/en/
-                                    master/user/advanced/#event-hooks)
+            oclcNumber:
+                OCLC bibliographic record number. Can be an integer or string
+                with or without OCLC Number prefix.
+            deweyNumber:
+                Limits response to the specified dewey classification number(s).
+                For multiple values repeat the parameter.
+
+                **EXAMPLE:** `'794'`
+            datePublished:
+                Limits response to one or more dates, or to a range.
+
+                **EXAMPLES:** `'2000'`, `'2000-2005'`, `'2000,2005'`
+            heldByGroup:
+                Limits response to holdings held by group symbol.
+            heldBySymbol:
+                Limits response to holdings held by specified institution symbol.
+            heldByInstitutionID:
+                Limits response to holdings held by specified institution registryId.
+            inLanguage:
+                Limits response to the single specified language
+
+                **EXAMPLE:** `'fre'`
+            inCatalogLanguage:
+                Limits response to specified cataloging language.
+
+                **EXAMPLE:** `'eng'`
+            materialType:
+                Limits response to specified material type.
+
+                **EXAMPLES:** `'bks'`, `'vis'`
+            catalogSource:
+                Limits response to single OCLC symbol as the cataloging source.
+
+                **EXAMPLE:** `'DLC'`
+            itemType:
+                Limits response to specified item type.
+
+                **EXAMPLES:** `'book'`, `'vis'`
+            itemSubType:
+                Limits response to specified item sub type
+
+                **EXAMPLES:** `'book-digital'`, `'audiobook-cd'`
+            retentionCommitments:
+                Limits response to bibliographic records with retention commitment.
+
+                **OPTIONS:** `True` or `False`
+            spProgram:
+                Limits response to bibliographic records associated with particular
+                shared print program.
+            genre:
+                Genre to limit response to (ge index).
+            topic:
+                Topic to limit response to (s0 index).
+            subtopic:
+                Subtopic to limit response to (s1 index).
+            audience:
+                Audience to limit response to.
+
+                **OPTIONS:** `'juv'` or `'nonJuv'`
+            content:
+                Content to limit response to.
+
+                **OPTIONS:** `'fic'`, `'nonFic'`, `'bio'`
+            openAccess:
+                Limits response to just open access content.
+            peerReviewed:
+                Limits response to just peer reviewed content.
+            facets:
+                List of facets to limit responses.
+            groupVariantRecords:
+                Whether or not to group variant records.
+
+                **OPTIONS:** `True` or `False`
+            preferredLanguage:
+                Language user would prefer metadata description in. Does not limit
+                responses. To limit responses use `inCataloglanguage` facet.
+            showHoldingsIndicators:
+                Whether or not to show holdings indicators in response.
+
+                **OPTIONS:** `True` or `False`
+            offset:
+                Start position of bibliographic records to return.
+            limit:
+                Maximum number of records to return.
+
+                **MAXIMUM:** `50`
+            orderBy:
+                Results sort key.
+
+                **OPTIONS:**
+
+                - `'recency'`
+                - `'bestMatch'`
+                - `'creator'`
+                - `'library'`
+                - `'publicationDateAsc'`
+                - `'publicationDateDesc'`
+                - `'mostWidelyHeld'`
+                - `'title'`
+            hooks:
+                Requests library hook system that can be used for signal event
+                handling. For more information see the [Requests docs](https://requests.
+                readthedocs.io/en/master/user/advanced/#event-hooks)
 
         Returns:
             `requests.Response` instance
@@ -830,13 +948,15 @@ def holdings_get_codes(
     ) -> Optional[Response]:
         """
         Retrieve the all holding codes for the authenticated institution.
+
         Uses /manage/institution/holding-codes endpoint.
 
         Args:
-            hooks:                  Requests library hook system that can be used for
-                                    signal event handling. For more information see the
-                                    [Requests docs](https://requests.readthedocs.io/en/
-                                    master/user/advanced/#event-hooks)
+            hooks:
+                Requests library hook system that can be used for signal event
+                handling. For more information see the [Requests docs](https://requests.
+                readthedocs.io/en/master/user/advanced/#event-hooks)
+
         Returns:
             `requests.Response` instance
         """
@@ -854,27 +974,32 @@ def holdings_get_codes(
 
     def holdings_get_current(
         self,
-        oclcNumbers: Union[str, List[Union[str, int]]],
+        oclcNumbers: Union[int, str, List[Union[str, int]]],
         hooks: Optional[Dict[str, Callable]] = None,
     ) -> Optional[Response]:
         """
         Retrieves WorldCat holdings status of a record with provided OCLC number.
         The service automatically recognizes the user's institution based on the
         issued access token.
+
         Uses /manage/institution/holdings/current endpoint.
 
         Args:
-            oclcNumbers:            string or list containing one or more OCLC numbers
-                                    to be checked; numbers can be integers or strings
-                                    with or without OCLC Number prefix;
-                                    if str, the numbers must be separated by a comma
-            hooks:                  Requests library hook system that can be used for
-                                    signal event handling. For more information see the
-                                    [Requests docs](https://requests.readthedocs.io/en/
-                                    master/user/advanced/#event-hooks)
+            oclcNumbers:
+                Integer, string or list containing one or more OCLC numbers to be
+                checked. Numbers can be integers or strings with or without OCLC
+                Number prefix. If str, the numbers must be separated by a comma.
+                If int, only one number may be passed as an arg.
+            hooks:
+                Requests library hook system that can be used for signal event
+                handling. For more information see the [Requests docs](https://requests.
+                readthedocs.io/en/master/user/advanced/#event-hooks)
 
         Returns:
             `requests.Response` instance
+
+        Raises:
+            ValueError: If more than 10 items passed to `oclcNumbers` arg.
         """
         vetted_numbers = verify_oclc_numbers(oclcNumbers)
 
@@ -903,16 +1028,17 @@ def holdings_set(
     ) -> Optional[Response]:
         """
         Sets institution's WorldCat holdings on an individual record.
+
         Uses /manage/institions/holdings/{oclcNumber}/set endpoint.
 
         Args:
-            oclcNumber:             OCLC bibliographic record number; can be an
-                                    integer or string with or without OCLC Number
-                                    prefix
-            hooks:                  Requests library hook system that can be used for
-                                    signal event handling. For more information see the
-                                    [Requests docs](https://requests.readthedocs.io/en/
-                                    master/user/advanced/#event-hooks)
+            oclcNumber:
+                OCLC bibliographic record number. Can be an integer or string
+                with or without OCLC Number prefix.
+            hooks:
+                Requests library hook system that can be used for signal event
+                handling. For more information see the [Requests docs](https://requests.
+                readthedocs.io/en/master/user/advanced/#event-hooks)
 
         Returns:
             `requests.Response` instance
@@ -938,16 +1064,17 @@ def holdings_unset(
     ) -> Optional[Response]:
         """
         Unsets institution's WorldCat holdings on an individual record.
+
         Uses /manage/institions/holdings/{oclcNumber}/unset endpoint.
 
         Args:
-            oclcNumber:             OCLC bibliographic record number; can be an
-                                    integer or string with or without OCLC Number
-                                    prefix
-            hooks:                  Requests library hook system that can be used for
-                                    signal event handling. For more information see the
-                                    [Requests docs](https://requests.readthedocs.io/en/
-                                    master/user/advanced/#event-hooks)
+            oclcNumber:
+                OCLC bibliographic record number. Can be an integer or string
+                with or without OCLC Number prefix.
+            hooks:
+                Requests library hook system that can be used for signal event
+                handling. For more information see the [Requests docs](https://requests.
+                readthedocs.io/en/master/user/advanced/#event-hooks)
 
         Returns:
             `requests.Response` instance
@@ -973,19 +1100,23 @@ def holdings_set_with_bib(
         hooks: Optional[Dict[str, Callable]] = None,
     ) -> Optional[Response]:
         """
-        Given a MARC record in MARC XML or MARC21, set institution holdings on the
+        Given a MARC record in MARCXML or MARC21, set institution holdings on the
         record. MARC record must contain OCLC number in 001 or 035 subfield a.
         Only one MARC record is allowed in the request body.
+
         Uses /manage/institution/holdings/set endpoint.
 
         Args:
-            record:                 MARC record on which to set holdings
-            recordFormat:           format of MARC record, options:
-                                    'application/marcxml+xml', 'application/marc'
-            hooks:                  Requests library hook system that can be used for
-                                    signal event handling. For more information see the
-                                    [Requests docs](https://requests.readthedocs.io/en/
-                                    master/user/advanced/#event-hooks)
+            record:
+                MARC record on which to set holdings.
+            recordFormat:
+                Format of MARC record.
+
+                **OPTIONS:** `'application/marcxml+xml'` or `'application/marc'`
+            hooks:
+                Requests library hook system that can be used for signal event
+                handling. For more information see the [Requests docs](https://requests.
+                readthedocs.io/en/master/user/advanced/#event-hooks)
 
         Returns:
             `requests.Response` instance
@@ -1012,19 +1143,23 @@ def holdings_unset_with_bib(
         hooks: Optional[Dict[str, Callable]] = None,
     ) -> Optional[Response]:
         """
-        Given a MARC record in MARC XML or MARC21, unset institution holdings on the
+        Given a MARC record in MARCXML or MARC21, unset institution holdings on the
         record. MARC record must contain OCLC number in 001 or 035 subfield a.
         Only one MARC record is allowed in the request body.
+
         Uses /manage/institution/holdings/unset endpoint.
 
         Args:
-            record:                 MARC record on which to unset holdings
-            recordFormat:           format of MARC record, options:
-                                    'application/marcxml+xml', 'application/marc'
-            hooks:                  Requests library hook system that can be used for
-                                    signal event handling. For more information see the
-                                    [Requests docs](https://requests.readthedocs.io/en/
-                                    master/user/advanced/#event-hooks)
+            record:
+                MARC record on which to unset holdings.
+            recordFormat:
+                Format of MARC record.
+
+                **OPTIONS:** `'application/marcxml+xml'` or `'application/marc'`
+            hooks:
+                Requests library hook system that can be used for signal event
+                handling. For more information see the [Requests docs](https://requests.
+                readthedocs.io/en/master/user/advanced/#event-hooks)
 
         Returns:
             `requests.Response` instance
@@ -1052,19 +1187,24 @@ def lbd_create(
     ) -> Optional[Response]:
         """
         Given a local bibliographic data record, create it in WorldCat.
+
         Uses /manage/lbds endpoint.
 
         Args:
-            record:                 MARC record to be created
-            recordFormat:           format of MARC record, options:
-                                    'application/marcxml+xml', 'application/marc'
-            responseFormat:         format of returned record; options:
-                                    'application/marcxml+xml', 'application/marc'
-                                    default is 'application/marcxml+xml'
-            hooks:                  Requests library hook system that can be used for
-                                    signal event handling. For more information see the
-                                    [Requests docs](https://requests.readthedocs.io/en/
-                                    master/user/advanced/#event-hooks)
+            record:
+                MARC record to be created.
+            recordFormat:
+                Format of MARC record.
+
+                **OPTIONS:** `'application/marcxml+xml'` or `'application/marc'`
+            responseFormat:
+                Format of returned record.
+
+                **OPTIONS:** `'application/marcxml+xml'` or `'application/marc'`
+            hooks:
+                Requests library hook system that can be used for signal event
+                handling. For more information see the [Requests docs](https://requests.
+                readthedocs.io/en/master/user/advanced/#event-hooks)
 
         Returns:
             `requests.Response` instance
@@ -1092,18 +1232,21 @@ def lbd_delete(
     ) -> Optional[Response]:
         """
         Given a control number, delete the associated Local Bibliographic Data record.
+
         Uses /manage/lbds/{controlNumber} endpoint.
 
         Args:
-            controlNumber:          control number associated with Local Bibliographic
-                                    Data record; can be an integer or string
-            responseFormat:         format of returned record, options:
-                                    'application/marcxml+xml', 'application/marc',
-                                    default is 'application/marcxml+xml'
-            hooks:                  Requests library hook system that can be used for
-                                    signal event handling. For more information see the
-                                    [Requests docs](https://requests.readthedocs.io/en/
-                                    master/user/advanced/#event-hooks)
+            controlNumber:
+                Control number associated with Local Bibliographic Data record.
+                Can be an integer or string.
+            responseFormat:
+                Format of returned record.
+
+                **OPTIONS:** `'application/marcxml+xml'` or `'application/marc'`
+            hooks:
+                Requests library hook system that can be used for signal event
+                handling. For more information see the [Requests docs](https://requests.
+                readthedocs.io/en/master/user/advanced/#event-hooks)
 
         Returns:
             `requests.Response` instance
@@ -1128,18 +1271,21 @@ def lbd_get(
     ) -> Optional[Response]:
         """
         Given a Control Number, retrieve a Local Bibliographic Data record.
+
         Uses /manage/lbds/{controlNumber} endpoint.
 
         Args:
-            controlNumber:          control number associated with Local Bibliographic
-                                    Data record; can be an integer or string
-            responseFormat:         format of returned record, options:
-                                    'application/marcxml+xml', 'application/marc',
-                                    default is 'application/marcxml+xml'
-            hooks:                  Requests library hook system that can be used for
-                                    signal event handling. For more information see the
-                                    [Requests docs](https://requests.readthedocs.io/en/
-                                    master/user/advanced/#event-hooks)
+            controlNumber:
+                Control number associated with Local Bibliographic Data record.
+                Can be an integer or string.
+            responseFormat:
+                Format of returned record.
+
+                **OPTIONS:** `'application/marcxml+xml'` or `'application/marc'`
+            hooks:
+                Requests library hook system that can be used for signal event
+                handling. For more information see the [Requests docs](https://requests.
+                readthedocs.io/en/master/user/advanced/#event-hooks)
 
         Returns:
             `requests.Response` instance
@@ -1168,22 +1314,27 @@ def lbd_replace(
         Given a Control Number, find the associated Local Bibliographic Data
         Record and replace it. If the Control Number is not found in
         WorldCat, then the provided Local Bibliographic Data Record will be created.
+
         Uses /manage/lbds/{controlNumber} endpoint.
 
         Args:
-            controlNumber:          control number associated with Local Bibliographic
-                                    Data record; can be an integer or string
-            record:                 MARC record to replace existing local
-                                    bibliographic record
-            recordFormat:           format of MARC record, options:
-                                    'application/marcxml+xml', 'application/marc'
-            responseFormat:         format of returned record; options:
-                                    'application/marcxml+xml', 'application/marc'
-                                    default is 'application/marcxml+xml'
-            hooks:                  Requests library hook system that can be used for
-                                    signal event handling. For more information see the
-                                    [Requests docs](https://requests.readthedocs.io/en/
-                                    master/user/advanced/#event-hooks)
+            controlNumber:
+                Control number associated with Local Bibliographic Data record.
+                Can be an integer or string.
+            record:
+                MARC record to replace existing Local Bibliographic Data record.
+            recordFormat:
+                Format of MARC record.
+
+                **OPTIONS:** `'application/marcxml+xml'` or `'application/marc'`
+            responseFormat:
+                Format of returned record.
+
+                **OPTIONS:** `'application/marcxml+xml'` or `'application/marc'`
+            hooks:
+                Requests library hook system that can be used for signal event
+                handling. For more information see the [Requests docs](https://requests.
+                readthedocs.io/en/master/user/advanced/#event-hooks)
 
         Returns:
             `requests.Response` instance
@@ -1212,19 +1363,24 @@ def lhr_create(
     ) -> Optional[Response]:
         """
         Given a local holdings record, create it in WorldCat
+
         Uses /manage/lhrs endpoint.
 
         Args:
-            record:                 MARC holdings record to be created
-            recordFormat:           format of MARC holdings record, options:
-                                    'application/marcxml+xml', 'application/marc'
-            responseFormat:         format of returned record; options:
-                                    'application/marcxml+xml', 'application/marc'
-                                    default is 'application/marcxml+xml'
-            hooks:                  Requests library hook system that can be used for
-                                    signal event handling. For more information see the
-                                    [Requests docs](https://requests.readthedocs.io/en/
-                                    master/user/advanced/#event-hooks)
+            record:
+                MARC holdings record to be created.
+            recordFormat:
+                Format of MARC record.
+
+                **OPTIONS:** `'application/marcxml+xml'` or `'application/marc'`
+            responseFormat:
+                Format of returned record.
+
+                **OPTIONS:** `'application/marcxml+xml'` or `'application/marc'`
+            hooks:
+                Requests library hook system that can be used for signal event
+                handling. For more information see the [Requests docs](https://requests.
+                readthedocs.io/en/master/user/advanced/#event-hooks)
 
         Returns:
             `requests.Response` instance
@@ -1252,18 +1408,21 @@ def lhr_delete(
     ) -> Optional[Response]:
         """
         Given a control number, delete a Local Holdings record.
+
         Uses /manage/lhrs/{controlNumber} endpoint.
 
         Args:
-            controlNumber:          control number associated with Local Holdings
-                                    record; can be an integer or string
-            responseFormat:         format of returned record, options:
-                                    'application/marcxml+xml', 'application/marc',
-                                    default is 'application/marcxml+xml'
-            hooks:                  Requests library hook system that can be used for
-                                    signal event handling. For more information see the
-                                    [Requests docs](https://requests.readthedocs.io/en/
-                                    master/user/advanced/#event-hooks)
+            controlNumber:
+                Control number associated with Local Holdings record.
+                Can be an integer or string.
+            responseFormat:
+                Format of returned record.
+
+                **OPTIONS:** `'application/marcxml+xml'` or `'application/marc'`
+            hooks:
+                Requests library hook system that can be used for signal event
+                handling. For more information see the [Requests docs](https://requests.
+                readthedocs.io/en/master/user/advanced/#event-hooks)
 
         Returns:
             `requests.Response` instance
@@ -1288,18 +1447,21 @@ def lhr_get(
     ) -> Optional[Response]:
         """
         Send a GET request for a local holdings record
+
         Uses /manage/lhrs/{controlNumber} endpoint.
 
         Args:
-            controlNumber:          control number associated with Local Holdings
-                                    record; can be an integer or string
-            responseFormat:         format of returned record, options:
-                                    'application/marcxml+xml', 'application/marc',
-                                    default is 'application/marcxml+xml'
-            hooks:                  Requests library hook system that can be used for
-                                    signal event handling. For more information see the
-                                    [Requests docs](https://requests.readthedocs.io/en/
-                                    master/user/advanced/#event-hooks)
+            controlNumber:
+                Control number associated with Local Holdings record.
+                Can be an integer or string.
+            responseFormat:
+                Format of returned record.
+
+                **OPTIONS:** `'application/marcxml+xml'` or `'application/marc'`
+            hooks:
+                Requests library hook system that can be used for signal event
+                handling. For more information see the [Requests docs](https://requests.
+                readthedocs.io/en/master/user/advanced/#event-hooks)
 
         Returns:
             `requests.Response` instance
@@ -1328,22 +1490,27 @@ def lhr_replace(
         Given a Control Number, find the associated Local Holdings
         Record and replace it. If the Control Number is not found in
         WorldCat, then the provided Local Holdings Record will be created.
+
         Uses /manage/lhrs/{controlNumber} endpoint.
 
         Args:
-            controlNumber:          control number associated with Local Holdings
-                                    record; can be an integer or string
-            record:                 MARC holdings record to replace existing local
-                                    holdings record
-            recordFormat:           format of MARC holdings record, options:
-                                    'application/marcxml+xml', 'application/marc'
-            responseFormat:         format of returned record; options:
-                                    'application/marcxml+xml', 'application/marc'
-                                    default is 'application/marcxml+xml'
-            hooks:                  Requests library hook system that can be used for
-                                    signal event handling. For more information see the
-                                    [Requests docs](https://requests.readthedocs.io/en/
-                                    master/user/advanced/#event-hooks)
+            controlNumber:
+                Control number associated with Local Holdings record.
+                Can be an integer or string.
+            record:
+                MARC holdings record to replace existing local holdings record.
+            recordFormat:
+                Format of MARC record.
+
+                **OPTIONS:** `'application/marcxml+xml'` or `'application/marc'`
+            responseFormat:
+                Format of returned record.
+
+                **OPTIONS:** `'application/marcxml+xml'` or `'application/marc'`
+            hooks:
+                Requests library hook system that can be used for signal event
+                handling. For more information see the [Requests docs](https://requests.
+                readthedocs.io/en/master/user/advanced/#event-hooks)
 
         Returns:
             `requests.Response` instance
@@ -1370,15 +1537,17 @@ def local_bibs_get(
     ) -> Optional[Response]:
         """
         Retrieve LBD Resource.
+
         Uses /search/my-local-bib-data/{controlNumber} endpoint.
 
         Args:
-            controlNumber:          control number associated with Local Bibliographic
-                                    Data record; can be an integer or string
-            hooks:                  Requests library hook system that can be used for
-                                    signal event handling. For more information see the
-                                    [Requests docs](https://requests.readthedocs.io/en/
-                                    master/user/advanced/#event-hooks)
+            controlNumber:
+                Control number associated with Local Bibliographic Data record.
+                Can be an integer or string.
+            hooks:
+                Requests library hook system that can be used for signal event
+                handling. For more information see the [Requests docs](https://requests.
+                readthedocs.io/en/master/user/advanced/#event-hooks)
 
         Returns:
             `requests.Response` instance
@@ -1403,34 +1572,38 @@ def local_bibs_search(
         hooks: Optional[Dict[str, Callable]] = None,
     ) -> Optional[Response]:
         """
-        Search LBD Resources using WorldCat query syntax.
-        See https://help.oclc.org/Librarian_Toolbox/Searching_WorldCat_Indexes/
-        Local_bibliographic_data_records/Local_bibliographic_data_record_indexes_A-Z
-        for more information on available indexes.
+        Search LBD Resources using WorldCat query syntax. See OCLC
+        [Local Bibliographic Data Record Index](https://help.oclc.org/Librarian_Toolbox/Searching_WorldCat_Indexes/Local_bibliographic_data_records/Local_bibliographic_data_record_indexes_A-Z)
+        Documentation for more information on available indexes.
+
         Uses /search/my-local-bib-data endpoint.
 
         Args:
-            q:                      query in the form of a keyword search or
-                                    fielded search;
-                                    examples:
-                                        ti:Zendegi
-                                        ti:"Czarne oceany"
-                                        bn:9781680502404
-                                        kw:python databases
-                                        ti:Zendegi AND au:greg egan
-                                        (au:Okken OR au:Myers) AND su:python
-            offset:                 start position of bibliographic records to
-                                    return; default is 1
-            limit:                  maximum number of records to return;
-                                    maximum is 50, default is 10
-            hooks:                  Requests library hook system that can be used for
-                                    signal event handling. For more information see the
-                                    [Requests docs](https://requests.readthedocs.io/en/
-                                    master/user/advanced/#event-hooks)
+            q:
+                Query in the form of a keyword search or fielded search.
+
+                **EXAMPLES:**
+
+                - `ti:Zendegi`
+                - `ti:"Czarne oceany"`
+                - `bn:9781680502404`
+                - `kw:python databases`
+                - `ti:Zendegi AND au:greg egan`
+                - `(au:Okken OR au:Myers) AND su:python`
+            offset:
+                Start position of bibliographic records to return.
+            limit:
+                Maximum number of records to return.
+
+                **MAXIMUM:** `50`
+            hooks:
+                Requests library hook system that can be used for signal event
+                handling. For more information see the [Requests docs](https://requests.
+                readthedocs.io/en/master/user/advanced/#event-hooks)
 
         Returns:
             `requests.Response` instance
-        """
+        """  # noqa: E501
         url = self._url_search_lbd()
         header = {"Accept": "application/json"}
         payload = {"q": q, "offset": offset, "limit": limit}
@@ -1456,23 +1629,29 @@ def local_holdings_browse(
     ) -> Optional[Response]:
         """
         Browse local holdings.
+
         Uses /browse/my-holdings endpoint.
 
         Args:
-            holdingLocation:        holding location for item
-            shelvingLocation:       shelving location for item
-            callNumber:             call number for item
-            oclcNumber:             OCLC bibliographic record number; can be an
-                                    integer or string with or without OCLC Number
-                                    prefix
-            browsePosition:         position within browse list where the matching
-                                    record should be, default is 0
-            limit:                  maximum number of records to return;
-                                    maximum is 50, default is 10
-            hooks:                  Requests library hook system that can be used for
-                                    signal event handling. For more information see the
-                                    [Requests docs](https://requests.readthedocs.io/en/
-                                    master/user/advanced/#event-hooks)
+            holdingLocation:
+                Holding location for item.
+            shelvingLocation:
+                Shelving location for item.
+            callNumber:
+                Call number for item.
+            oclcNumber:
+                OCLC bibliographic record number. Can be an integer or string
+                with or without OCLC Number prefix.
+            browsePosition:
+                Position within browse list where the matching record should be.
+            limit:
+                Maximum number of records to return.
+
+                **MAXIMUM:** `50`
+            hooks:
+                Requests library hook system that can be used for signal event
+                handling. For more information see the [Requests docs](https://requests.
+                readthedocs.io/en/master/user/advanced/#event-hooks)
 
         Returns:
             `requests.Response` instance
@@ -1507,15 +1686,17 @@ def local_holdings_get(
     ) -> Optional[Response]:
         """
         Retrieve LHR Resource.
+
         Uses /search/my-holdings/{controlNumber} endpoint.
 
         Args:
-            controlNumber:          control number associated with Local Holdings
-                                    record; can be an integer or string
-            hooks:                  Requests library hook system that can be used for
-                                    signal event handling. For more information see the
-                                    [Requests docs](https://requests.readthedocs.io/en/
-                                    master/user/advanced/#event-hooks)
+            controlNumber:
+                Control number associated with Local Holdings record.
+                Can be an integer or string.
+            hooks:
+                Requests library hook system that can be used for signal event
+                handling. For more information see the [Requests docs](https://requests.
+                readthedocs.io/en/master/user/advanced/#event-hooks)
 
         Returns:
             `requests.Response` instance
@@ -1543,28 +1724,30 @@ def local_holdings_search(
     ) -> Optional[Response]:
         """
         Search LHR Resources. Query must contain, at minimum, either an
-        OCLC Number or barcode.
+        `oclcNumber` or `barcode`.
+
         Uses /search/my-holdings endpoint.
 
         Args:
-            oclcNumber:             OCLC bibliographic record number; can be an
-                                    integer or string with or without OCLC Number
-                                    prefix
-            barcode:                barcode as a string,
-            orderBy:                results sort key;
-                                    options:
-                                        'commitmentExpirationDate'
-                                        'location'
-                                        'oclcSymbol'
-                                    default is 'oclcSymbol'
-            offset:                 start position of bibliographic records to
-                                    return; default is 1
-            limit:                  maximum number of records to return;
-                                    maximum is 50, default is 10
-            hooks:                  Requests library hook system that can be used for
-                                    signal event handling. For more information see the
-                                    [Requests docs](https://requests.readthedocs.io/en/
-                                    master/user/advanced/#event-hooks)
+            oclcNumber:
+                OCLC bibliographic record number. Can be an integer or string
+                with or without OCLC Number prefix.
+            barcode:
+                Barcode as a string.
+            orderBy:
+                Results sort key.
+
+                **OPTIONS:** `'commitmentExpirationDate'`, `'location'`, `'oclcSymbol'`
+            offset:
+                Start position of bibliographic records to return.
+            limit:
+                Maximum number of records to return.
+
+                **MAXIMUM:** `50`
+            hooks:
+                Requests library hook system that can be used for signal event
+                handling. For more information see the [Requests docs](https://requests.
+                readthedocs.io/en/master/user/advanced/#event-hooks)
 
         Returns:
             `requests.Response` instance
@@ -1605,34 +1788,38 @@ def local_holdings_search_shared_print(
     ) -> Optional[Response]:
         """
         Search for shared print LHR Resources. Query must contain, at minimum,
-        either an OCLC Number or barcode and a value for either heldBySymbol,
-        heldByInstitutionID or spProgram.
+        either an `oclcNumber` or `barcode` and a value for either
+        `heldBySymbol`, `heldByInstitutionID` or `spProgram`.
+
         Uses /search/retained-holdings endpoint.
 
         Args:
-            oclcNumber:             OCLC bibliographic record number; can be an
-                                    integer or string with or without OCLC Number
-                                    prefix
-            barcode:                barcode as a string,
-            heldBySymbol:           restricts to holdings with specified institution
-                                    symbol
-            heldByInstitutionID:    restrict to specified institution registryId
-            spProgram:              restricts responses to bibliographic records
-                                    associated with particular shared print program
-            orderBy:                results sort key;
-                                    options:
-                                        'commitmentExpirationDate'
-                                        'location'
-                                        'oclcSymbol'
-                                    default is 'oclcSymbol'
-            offset:                 start position of bibliographic records to
-                                    return; default is 1
-            limit:                  maximum number of records to return;
-                                    maximum is 50, default is 10
-            hooks:                  Requests library hook system that can be used for
-                                    signal event handling. For more information see the
-                                    [Requests docs](https://requests.readthedocs.io/en/
-                                    master/user/advanced/#event-hooks)
+            oclcNumber:
+                OCLC bibliographic record number. Can be an integer or string
+                with or without OCLC Number prefix.
+            barcode:
+                Barcode as a string.
+            heldBySymbol:
+                Restricts to holdings with specified institution symbol.
+            heldByInstitutionID:
+                Restrict to specified institution registryId.
+            spProgram:
+                Limits response to bibliographic records associated with
+                particular shared print program.
+            orderBy:
+                Results sort key.
+
+                **OPTIONS:** `'commitmentExpirationDate'`, `'location'`, `'oclcSymbol'`
+            offset:
+                Start position of bibliographic records to return.
+            limit:
+                Maximum number of records to return.
+
+                **MAXIMUM:** `50`
+            hooks:
+                Requests library hook system that can be used for signal event
+                handling. For more information see the [Requests docs](https://requests.
+                readthedocs.io/en/master/user/advanced/#event-hooks)
 
         Returns:
             `requests.Response` instance
@@ -1675,26 +1862,40 @@ def shared_print_holdings_search(
     ) -> Optional[Response]:
         """
         Finds member shared print holdings for specified item. Query must
-        contain, at minimum, either an OCLC Number, ISBN, or ISSN.
+        contain, at minimum, either an `oclcNumber`, `isbn`, or `issn`.
+
         Uses /search/bibs-retained-holdings endpoint.
 
         Args:
-            oclcNumber:             OCLC bibliographic record number; can be an
-                                    integer or string with or without OCLC Number
-                                    prefix
-            isbn:                   ISBN without any dashes, example: '978149191646x'
-            issn:                   ISSN hyphenated, example: '0099-1234'
-            heldByGroup:            restricts to holdings held by group symbol
-            heldInState:            restricts to holdings held by institutions
-                                    in requested state, example: "NY"
-            itemType:               restricts results to specified item type (example
-                                    'book' or 'vis')
-            itemSubType:            restricts results to specified item sub type
-                                    examples: 'book-digital' or 'audiobook-cd'
-            hooks:                  Requests library hook system that can be used for
-                                    signal event handling. For more information see the
-                                    [Requests docs](https://requests.readthedocs.io/en/
-                                    master/user/advanced/#event-hooks)
+            oclcNumber:
+                OCLC bibliographic record number. Can be an integer or string
+                with or without OCLC Number prefix.
+            isbn:
+                ISBN without any dashes.
+
+                **EXAMPLE:** `'978149191646x'`
+            issn:
+                ISSN, hyphenated.
+
+                **EXAMPLE:** `'0099-1234'`
+            heldByGroup:
+                Restricts to holdings held by group symbol.
+            heldInState:
+                Restricts to holdings held by institutions in requested state.
+
+                **EXAMPLE:** `'US-NY'`
+            itemType:
+                Limits response to specified item type.
+
+                **EXAMPLES:** `'book'`, `'vis'`
+            itemSubType:
+                Limits response to specified item sub type
+
+                **EXAMPLES:** `'book-digital'`, `'audiobook-cd'`
+            hooks:
+                Requests library hook system that can be used for signal event
+                handling. For more information see the [Requests docs](https://requests.
+                readthedocs.io/en/master/user/advanced/#event-hooks)
 
         Returns:
             `requests.Response` instance
@@ -1747,48 +1948,77 @@ def summary_holdings_search(
         """
         Given a known item, get summary of holdings and brief bib record. Query must
         contain, at minimum, either an OCLC Number, ISBN, or ISSN. Query may contain
-        only one of: heldByInstitutionId, heldByGroup, heldBySymbol, heldInCountry,
-        heldInState or combination of lat, lon and distance. If using lat/lon
-        arguments, query must contain a valid distance argument.
+        only one of: `heldByInstitutionId`, `heldByGroup`, `heldBySymbol`,
+        `heldInCountry`, `heldInState` or combination of `lat`, `lon` and
+        `distance`. If using lat/lon arguments, query must contain a valid
+        distance argument.
+
         Uses /search/bibs-summary-holdings endpoint.
 
         Args:
-            oclcNumber:                 OCLC bibliographic record number; can be an
-                                        integer or string with or without OCLC Number
-                                        prefix
-            isbn:                       ISBN without any dashes,
-                                        example: '978149191646x'
-            issn:                       ISSN (hyphenated, example: '0099-1234')
-            holdingsAllEditions:        get holdings for all editions;
-                                        options: True or False
-            holdingsAllVariantRecords:  get holdings for specific edition across
-                                        variant records; options: False, True
-            preferredLanguage:          language of metadata description;
-                                        default 'eng' (English)
-            holdingsFilterFormat:       get holdings for specific itemSubType,
-                                        example: book-digital
-            heldInCountry:              restricts to holdings held by institutions
-                                        in requested country
-            heldInState:                limits to holdings held by institutions
-                                        in requested state, example: 'US-NY'
-            heldByGroup:                limits to holdings held by indicated by
-                                        symbol group
-            heldBySymbol:               limits to holdings held by institutions
-                                        indicated by institution symbol
-            heldByInstitutionID:        limits to holdings held by institutions
-                                        indicated by institution registryID
-            heldByLibraryType:          limits to holdings held by library type,
-                                        options: 'PUBLIC', 'ALL'
-            lat:                        limit to latitude, example: 37.502508,
-            lon:                        limit to longitute, example: -122.22702
-            distance:                   distance from latitude and longitude
-            unit:                       unit of distance param; options:
-                                        'M' (miles) or 'K' (kilometers), default is 'M'
-            hooks:                      Requests library hook system that can be used
-                                        for signal event handling. For more information
-                                        see the [Requests docs](https://requests.
-                                        readthedocs.io/en/master/user/advanced/
-                                        #event-hooks)
+            oclcNumber:
+                OCLC bibliographic record number. Can be an integer or string
+                with or without OCLC Number prefix.
+            isbn:
+                ISBN without any dashes.
+
+                **EXAMPLE:** `'978149191646x'`
+            issn:
+                ISSN, hyphenated.
+
+                **EXAMPLE:** `'0099-1234'`
+            holdingsAllEditions:
+                Get holdings for all editions.
+
+                **OPTIONS:** `True` or `False`
+            holdingsAllVariantRecords:
+                Get holdings for specific edition across variant records.
+
+                **OPTIONS:** `True` or `False`
+            preferredLanguage:
+                Language user would prefer metadata description in. Does not limit
+                responses. To limit responses use `inCataloglanguage` facet.
+            holdingsFilterFormat:
+                Get holdings for specific itemSubType.
+
+                **EXAMPLE:** `'book-digital'`
+            heldInCountry:
+                Restricts to holdings held by institutions in requested country.
+            heldInState:
+                Restricts to holdings held by institutions in requested state.
+
+                **EXAMPLE:** `'US-NY'`
+            heldByGroup:
+                Restricts to holdings held by group symbol.
+            heldBySymbol:
+                Limits to holdings held by institutions indicated by
+                institution symbol.
+            heldByInstitutionID:
+                Limits to holdings held by institutions indicated by institution
+                registryID.
+            heldByLibraryType:
+                Limits to holdings held by library type.
+
+                **OPTIONS:** `'PUBLIC'`, `'ALL'`
+            lat:
+                Latitude
+
+                **EXAMPLE:** `37.502508`
+            lon:
+                Longitude
+
+                **EXAMPLE:** `-122.22702`
+            distance:
+                Limits results to holdings held by institutions within specified
+                distance from latitude and longitude.
+            unit:
+                Unit of distance from latitude and longitude.
+
+                **OPTIONS:** `'M'` (miles) or `'K'` (kilometers).
+            hooks:
+                Requests library hook system that can be used for signal event
+                handling. For more information see the [Requests docs](https://requests.
+                readthedocs.io/en/master/user/advanced/#event-hooks)
 
         Returns:
             `requests.Response` instance
@@ -1847,43 +2077,66 @@ def summary_holdings_get(
     ) -> Optional[Response]:
         """
         Given an OCLC number, get summary of holdings. Query may contain
-        only one of: heldByInstitutionId, heldByGroup, heldBySymbol, heldInCountry,
-        heldInState or combination of lat, lon and distance. If using lat/lon
-        arguments, query must contain a valid distance argument.
+        only one of: `heldByInstitutionId`, `heldByGroup`, `heldBySymbol`,
+        `heldInCountry`, `heldInState` or combination of `lat`, `lon` and
+        `distance`. If using lat/lon arguments, query must contain a valid
+        distance argument.
+
         Uses /search/summary-holdings endpoint.
 
         Args:
-            oclcNumber:                 OCLC bibliographic record number; can be an
-                                        integer or string with or without OCLC Number
-                                        prefix
-            holdingsAllEditions:        get holdings for all editions;
-                                        options: True, False
-            holdingsAllVariantRecords:  get holdings for specific edition across
-                                        all variant records; options: True, False
-            holdingsFilterFormat:       get holdings for specific itemSubType,
-                                        example: book-digital
-            heldInCountry:              limits to holdings held by institutions
-                                        in requested country
-            heldInState:                limits to holdings held by institutions
-                                        in requested state, example: 'US-NY'
-            heldByGroup:                limits to holdings held by institutions
-                                        indicated by group symbol
-            heldBySymbol:               limits to holdings held by institutions
-                                        indicated by institution symbol
-            heldByInstitutionID:        limits to holdings held by institutions
-                                        indicated by institution registryID
-            heldByLibraryType:          limits to holdings held by library type,
-                                        options: 'PUBLIC', 'ALL'
-            lat:                        limit to latitude, example: 37.502508
-            lon:                        limit to longitute, example: -122.22702
-            distance:                   distance from latitude and longitude
-            unit:                       unit of distance param; options:
-                                        'M' (miles) or 'K' (kilometers), default is 'M'
-            hooks:                      Requests library hook system that can be used
-                                        for signal event handling. For more information
-                                        see the [Requests docs](https://requests.
-                                        readthedocs.io/en/master/user/advanced/
-                                        #event-hooks)
+            oclcNumber:
+                OCLC bibliographic record number. Can be an integer or string
+                with or without OCLC Number prefix.
+            holdingsAllEditions:
+                Get holdings for all editions.
+
+                **OPTIONS:** `True` or `False`
+            holdingsAllVariantRecords:
+                Get holdings for specific edition across variant records.
+
+                **OPTIONS:** `True` or `False`
+            holdingsFilterFormat:
+                Get holdings for specific itemSubType.
+
+                **EXAMPLE:** `'book-digital'`
+            heldInCountry:
+                Restricts to holdings held by institutions in requested country.
+            heldInState:
+                Restricts to holdings held by institutions in requested state.
+
+                **EXAMPLE:** `'US-NY'`
+            heldByGroup:
+                Restricts to holdings held by group symbol.
+            heldBySymbol:
+                Limits to holdings held by institutions indicated by
+                institution symbol.
+            heldByInstitutionID:
+                Limits to holdings held by institutions indicated by institution
+                registryID.
+            heldByLibraryType:
+                Limits to holdings held by library type.
+
+                **OPTIONS:** `'PUBLIC'`, `'ALL'`
+            lat:
+                Latitude
+
+                **EXAMPLE:** `37.502508`
+            lon:
+                Longitude
+
+                **EXAMPLE:** `-122.22702`
+            distance:
+                Limits results to holdings held by institutions within specified
+                distance from latitude and longitude.
+            unit:
+                Unit of distance from latitude and longitude.
+
+                **OPTIONS:** `'M'` (miles) or `'K'` (kilometers).
+            hooks:
+                Requests library hook system that can be used for signal event
+                handling. For more information see the [Requests docs](https://requests.
+                readthedocs.io/en/master/user/advanced/#event-hooks)
 
         Returns:
             `requests.Response` instance
diff --git a/bookops_worldcat/query.py b/bookops_worldcat/query.py
index 41fb7b9..cac785a 100644
--- a/bookops_worldcat/query.py
+++ b/bookops_worldcat/query.py
@@ -1,10 +1,9 @@
 # -*- coding: utf-8 -*-
 
-"""
-Handles actual requests to OCLC services
-"""
+"""Handles requests to OCLC web services."""
+
 from __future__ import annotations
-from typing import Optional, Union, Tuple, TYPE_CHECKING
+from typing import Union, Tuple, TYPE_CHECKING
 import sys
 
 from requests.models import PreparedRequest
@@ -17,35 +16,40 @@
 
 
 class Query:
-    """
-    Sends a request to OCLC service and unifies exceptions.
-    Query object handles refreshing expired token before request is
-    made to the web service.
-
-    `Query.response` attribute is `requests.Response` instance that
-    can be parsed to extract information received from the web service.
+    """Sends a request to OCLC web service and unifies exceptions.
 
+    Query object handles automatic refresh of expired token before each
+    request is made to the web service. `Query.response` attribute is
+    [`requests.Response`](https://requests.readthedocs.io/en/latest/api/#requests.PreparedRequest)
+    instance that can be parsed to extract information received from the web service.
     """
 
     def __init__(
         self,
         session: MetadataSession,
         prepared_request: PreparedRequest,
-        timeout: Optional[
-            Union[int, float, Tuple[int, int], Tuple[float, float]]
-        ] = None,
+        timeout: Union[int, float, Tuple[int, int], Tuple[float, float], None] = (
+            5,
+            5,
+        ),
     ) -> None:
         """Initializes Query object.
 
         Args:
-            session:                        `metadata_api.MetadataSession` instance
-            prepared_request:               `requests.models.PreparedRequest` instance
-            timeout:                        how long to wait for server to send data
-                                            before giving up
-
+            session:
+                `metadata_api.MetadataSession` instance.
+            prepared_request:
+                `requests.PreparedRequest` instance.
+            timeout:
+                How long to wait for server to send data before giving up. Accepts
+                separate values for connect and read timeouts or a single value.
 
         Raises:
-            WorldcatRequestError: If the request encounters an error
+            WorldcatRequestError:
+                If the request encounters any errors.
+            TypeError:
+                If `prepared_request` arg is passed anything other than a
+                `requests.PreparedRequest` object.
         """
         if not isinstance(prepared_request, PreparedRequest):
             raise TypeError("Invalid type for argument 'prepared_request'.")
diff --git a/bookops_worldcat/utils.py b/bookops_worldcat/utils.py
index 5605d3d..ab53ede 100644
--- a/bookops_worldcat/utils.py
+++ b/bookops_worldcat/utils.py
@@ -3,7 +3,7 @@
 """
 Shared utilities module.
 """
-
+import re
 from typing import List, Union
 
 from .errors import InvalidOclcNumber
@@ -19,16 +19,25 @@ def prep_oclc_number_str(oclcNumber: str) -> str:
     Checks for OCLC prefixes and removes them.
 
     Args:
-        oclcNumber:                OCLC record as string
+        oclcNumber:
+            OCLC record number as string
 
     Returns:
-        oclcNumber as str
+        `oclcNumber` as str
+
+    Raises:
+        InvalidOclcNumber: If `oclcNumber` argument does not match
+        OCLC number formatting rules.
     """
 
-    if oclcNumber.strip().startswith("ocm") or oclcNumber.strip().startswith("ocn"):
+    if re.match(r"^ocm[0-9]{,8}$", oclcNumber.strip()) or re.match(
+        r"^ocn[0-9]{9}$", oclcNumber.strip()
+    ):
         oclcNumber = oclcNumber.strip()[3:]
-    elif oclcNumber.strip().startswith("on"):
+    elif re.match(r"^on[0-9]{10,}$", oclcNumber.strip()):
         oclcNumber = oclcNumber.strip()[2:]
+    elif re.match(r"^\(OCoLC\)[0-9]{8,}$", oclcNumber.strip()):
+        oclcNumber = oclcNumber.strip()[7:]
 
     try:
         oclcNumber = str(int(oclcNumber))
@@ -42,11 +51,14 @@ def verify_oclc_number(oclcNumber: Union[int, str]) -> str:
     Verifies a valid looking OCLC number is passed and normalize it as integer.
 
     Args:
-        oclcNumber:                OCLC record number
+        oclcNumber:
+            OCLC record number as string or integer
 
     Returns:
-        oclcNumber as str
+        `oclcNumber` as str
 
+    Raises:
+        InvalidOclcNumber: If `oclcNumber` argument is not a str or int or is missing.
     """
     if not oclcNumber:
         raise InvalidOclcNumber("Argument 'oclcNumber' is missing.")
@@ -61,34 +73,40 @@ def verify_oclc_number(oclcNumber: Union[int, str]) -> str:
         raise InvalidOclcNumber("Argument 'oclcNumber' is of invalid type.")
 
 
-def verify_oclc_numbers(oclcNumbers: Union[str, List[Union[str, int]]]) -> List[str]:
+def verify_oclc_numbers(
+    oclcNumbers: Union[int, str, List[Union[str, int]]]
+) -> List[str]:
     """
     Parses and verifies list of oclcNumbers
 
     Args:
-        oclcNumbers:            list of OCLC control numbers for which holdings
-                                should be set;
-                                they can be integers or strings with or without
-                                OCLC # prefix;
-                                if str the numbers must be separated by comma
+        oclcNumbers:
+            List of OCLC control numbers. Control numbers can be integers or strings
+            with or without OCLC # prefix. If str, the numbers must be separated
+            by commas. If int, only one number will be parsed. Lists may contain strings
+            or integers or a combination of both.
 
     Returns:
-        vetted_numbers as list
+        `oclcNumbers` as a list of strings
 
+    Raises:
+        InvalidOclcNumber: If `oclcNumbers` argument is not a list, str, or int.
     """
     if isinstance(oclcNumbers, str):
         oclcNumbers_lst = _str2list(oclcNumbers)
+    elif isinstance(oclcNumbers, int):
+        oclcNumbers_lst = _str2list(str(oclcNumbers))
     elif isinstance(oclcNumbers, list):
-        oclcNumbers_lst = oclcNumbers  # type: ignore
+        oclcNumbers_lst = [str(n) for n in oclcNumbers]
     else:
         raise InvalidOclcNumber(
-            "Argument 'oclcNumbers' must be a list or comma separated string "
-            "of valid OCLC #s."
+            "Argument 'oclcNumbers' must be a single integer, a list or a "
+            "comma separated string of valid OCLC #s."
         )
     if not oclcNumbers_lst:
         raise InvalidOclcNumber(
-            "Argument 'oclcNumbers' must be a list or comma separated string "
-            "of valid OCLC #s."
+            "Argument 'oclcNumbers' must be a single integer, a list or a "
+            "comma separated string of valid OCLC #s."
         )
 
     vetted_numbers = [verify_oclc_number(n) for n in oclcNumbers_lst]
diff --git a/dev-requirements.txt b/dev-requirements.txt
index 1159bdc..434581a 100644
--- a/dev-requirements.txt
+++ b/dev-requirements.txt
@@ -1,26 +1,32 @@
-black==23.12.1 ; python_version >= "3.8" and python_version < "4.0" \
-    --hash=sha256:0808494f2b2df923ffc5723ed3c7b096bd76341f6213989759287611e9837d50 \
-    --hash=sha256:1fa88a0f74e50e4487477bc0bb900c6781dbddfdfa32691e780bf854c3b4a47f \
-    --hash=sha256:25e57fd232a6d6ff3f4478a6fd0580838e47c93c83eaf1ccc92d4faf27112c4e \
-    --hash=sha256:2d9e13db441c509a3763a7a3d9a49ccc1b4e974a47be4e08ade2a228876500ec \
-    --hash=sha256:3e1b38b3135fd4c025c28c55ddfc236b05af657828a8a6abe5deec419a0b7055 \
-    --hash=sha256:3fa4be75ef2a6b96ea8d92b1587dd8cb3a35c7e3d51f0738ced0781c3aa3a5a3 \
-    --hash=sha256:4ce3ef14ebe8d9509188014d96af1c456a910d5b5cbf434a09fef7e024b3d0d5 \
-    --hash=sha256:4f0031eaa7b921db76decd73636ef3a12c942ed367d8c3841a0739412b260a54 \
-    --hash=sha256:602cfb1196dc692424c70b6507593a2b29aac0547c1be9a1d1365f0d964c353b \
-    --hash=sha256:6d1bd9c210f8b109b1762ec9fd36592fdd528485aadb3f5849b2740ef17e674e \
-    --hash=sha256:78baad24af0f033958cad29731e27363183e140962595def56423e626f4bee3e \
-    --hash=sha256:8d4df77958a622f9b5a4c96edb4b8c0034f8434032ab11077ec6c56ae9f384ba \
-    --hash=sha256:97e56155c6b737854e60a9ab1c598ff2533d57e7506d97af5481141671abf3ea \
-    --hash=sha256:9c4352800f14be5b4864016882cdba10755bd50805c95f728011bcb47a4afd59 \
-    --hash=sha256:a4d6a9668e45ad99d2f8ec70d5c8c04ef4f32f648ef39048d010b0689832ec6d \
-    --hash=sha256:a920b569dc6b3472513ba6ddea21f440d4b4c699494d2e972a1753cdc25df7b0 \
-    --hash=sha256:ae76c22bde5cbb6bfd211ec343ded2163bba7883c7bc77f6b756a1049436fbb9 \
-    --hash=sha256:b18fb2ae6c4bb63eebe5be6bd869ba2f14fd0259bda7d18a46b764d8fb86298a \
-    --hash=sha256:c04b6d9d20e9c13f43eee8ea87d44156b8505ca8a3c878773f68b4e4812a421e \
-    --hash=sha256:c88b3711d12905b74206227109272673edce0cb29f27e1385f33b0163c414bba \
-    --hash=sha256:dd15245c8b68fe2b6bd0f32c1556509d11bb33aec9b5d0866dd8e2ed3dba09c2 \
-    --hash=sha256:e0aaf6041986767a5e0ce663c7a2f0e9eaf21e6ff87a5f95cbf3675bfd4c41d2
+astunparse==1.6.3 ; python_version >= "3.8" and python_version < "3.9" \
+    --hash=sha256:5ad93a8456f0d084c3456d059fd9a92cce667963232cbf763eac3bc5b7940872 \
+    --hash=sha256:c2652417f2c8b5bb325c885ae329bdf3f86424075c4fd1a128674bc6fba4b8e8
+babel==2.14.0 ; python_version >= "3.8" and python_version < "4.0" \
+    --hash=sha256:6919867db036398ba21eb5c7a0f6b28ab8cbc3ae7a73a44ebe34ae74a4e7d363 \
+    --hash=sha256:efb1a25b7118e67ce3a259bed20545c29cb68be8ad2c784c83689981b7a57287
+black==24.3.0 ; python_version >= "3.8" and python_version < "4.0" \
+    --hash=sha256:2818cf72dfd5d289e48f37ccfa08b460bf469e67fb7c4abb07edc2e9f16fb63f \
+    --hash=sha256:41622020d7120e01d377f74249e677039d20e6344ff5851de8a10f11f513bf93 \
+    --hash=sha256:4acf672def7eb1725f41f38bf6bf425c8237248bb0804faa3965c036f7672d11 \
+    --hash=sha256:4be5bb28e090456adfc1255e03967fb67ca846a03be7aadf6249096100ee32d0 \
+    --hash=sha256:4f1373a7808a8f135b774039f61d59e4be7eb56b2513d3d2f02a8b9365b8a8a9 \
+    --hash=sha256:56f52cfbd3dabe2798d76dbdd299faa046a901041faf2cf33288bc4e6dae57b5 \
+    --hash=sha256:65b76c275e4c1c5ce6e9870911384bff5ca31ab63d19c76811cb1fb162678213 \
+    --hash=sha256:65c02e4ea2ae09d16314d30912a58ada9a5c4fdfedf9512d23326128ac08ac3d \
+    --hash=sha256:6905238a754ceb7788a73f02b45637d820b2f5478b20fec82ea865e4f5d4d9f7 \
+    --hash=sha256:79dcf34b33e38ed1b17434693763301d7ccbd1c5860674a8f871bd15139e7837 \
+    --hash=sha256:7bb041dca0d784697af4646d3b62ba4a6b028276ae878e53f6b4f74ddd6db99f \
+    --hash=sha256:7d5e026f8da0322b5662fa7a8e752b3fa2dac1c1cbc213c3d7ff9bdd0ab12395 \
+    --hash=sha256:9f50ea1132e2189d8dff0115ab75b65590a3e97de1e143795adb4ce317934995 \
+    --hash=sha256:a0c9c4a0771afc6919578cec71ce82a3e31e054904e7197deacbc9382671c41f \
+    --hash=sha256:aadf7a02d947936ee418777e0247ea114f78aff0d0959461057cae8a04f20597 \
+    --hash=sha256:b5991d523eee14756f3c8d5df5231550ae8993e2286b8014e2fdea7156ed0959 \
+    --hash=sha256:bf21b7b230718a5f08bd32d5e4f1db7fc8788345c8aea1d155fc17852b3410f5 \
+    --hash=sha256:c45f8dff244b3c431b36e3224b6be4a127c6aca780853574c00faf99258041eb \
+    --hash=sha256:c7ed6668cbbfcd231fa0dc1b137d3e40c04c7f786e626b405c62bcd5db5857e4 \
+    --hash=sha256:d7de8d330763c66663661a1ffd432274a2f92f07feeddd89ffd085b5744f85e7 \
+    --hash=sha256:e19cb1c6365fd6dc38a6eae2dcb691d7d83935c10215aef8e6c38edee3f77abd \
+    --hash=sha256:e2af80566f43c85f5797365077fb64a393861a3730bd110971ab7a0c94e873e7
 certifi==2024.2.2 ; python_version >= "3.8" and python_version < "4.0" \
     --hash=sha256:0569859f95fc761b18b45ef421b1290a0f65f147e92a1e5eb3e635f9a5e4e66f \
     --hash=sha256:dc383c07b76109f368f6106eee2b593b04a011ea4d55f652c6ca24a754d1cdd1
@@ -118,7 +124,7 @@ charset-normalizer==3.3.2 ; python_version >= "3.8" and python_version < "4.0" \
 click==8.1.7 ; python_version >= "3.8" and python_version < "4.0" \
     --hash=sha256:ae74fb96c20a0277a1d615f1e4d73c8414f5a98db8b799a7931d1582f3390c28 \
     --hash=sha256:ca9853ad459e787e2192211578cc907e7594e294c7ccc834310722b41b9ca6de
-colorama==0.4.6 ; python_version >= "3.8" and python_version < "4.0" and (sys_platform == "win32" or platform_system == "Windows") \
+colorama==0.4.6 ; python_version >= "3.8" and python_version < "4.0" \
     --hash=sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44 \
     --hash=sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6
 coverage[toml]==7.4.1 ; python_version >= "3.8" and python_version < "4.0" \
@@ -180,9 +186,12 @@ exceptiongroup==1.2.0 ; python_version >= "3.8" and python_version < "3.11" \
 ghp-import==2.1.0 ; python_version >= "3.8" and python_version < "4.0" \
     --hash=sha256:8337dd7b50877f163d4c0289bc1f1c7f127550241988d568c1db512c4324a619 \
     --hash=sha256:9c535c4c61193c2df8871222567d7fd7e5014d835f97dc7b7439069e2413d343
-idna==3.6 ; python_version >= "3.8" and python_version < "4.0" \
-    --hash=sha256:9ecdbbd083b06798ae1e86adcbfe8ab1479cf864e4ee30fe4e46a003d12491ca \
-    --hash=sha256:c05567e9c24a6b9faaa835c4821bad0590fbb9d5779e7caa6e1cc4978e7eb24f
+griffe==0.42.1 ; python_version >= "3.8" and python_version < "4.0" \
+    --hash=sha256:57046131384043ed078692b85d86b76568a686266cc036b9b56b704466f803ce \
+    --hash=sha256:7e805e35617601355edcac0d3511cedc1ed0cb1f7645e2d336ae4b05bbae7b3b
+idna==3.7 ; python_version >= "3.8" and python_version < "4.0" \
+    --hash=sha256:028ff3aadf0609c1fd278d8ea3089299412a7a8b9bd005dd08b9f8285bcb5cfc \
+    --hash=sha256:82fee1fc78add43492d3a1898bfa6d8a904cc97d8427f683ed8e798d07761aa0
 importlib-metadata==7.0.1 ; python_version >= "3.8" and python_version < "4.0" \
     --hash=sha256:4805911c3a4ec7c3966410053e9ec6a1fecd629117df5adee56dfc9432a1081e \
     --hash=sha256:f238736bb06590ae52ac1fab06a3a9ef1d8dce2b7a35b5ab329371d6c8f5d2cc
@@ -265,12 +274,24 @@ mergedeep==1.3.4 ; python_version >= "3.8" and python_version < "4.0" \
 mike==2.0.0 ; python_version >= "3.8" and python_version < "4.0" \
     --hash=sha256:566f1cab1a58cc50b106fb79ea2f1f56e7bfc8b25a051e95e6eaee9fba0922de \
     --hash=sha256:87f496a65900f93ba92d72940242b65c86f3f2f82871bc60ebdcffc91fad1d9e
-mkapi==1.0.14 ; python_version >= "3.8" and python_version < "4.0" \
-    --hash=sha256:88bff6a183f09a5c80acf3c9edfc32e0ff3e2585589a9b6a962aae0467a79a12 \
-    --hash=sha256:b9b75ffeeeb6c29843ca703abf30464acac76c0867ca3ca66e3a825c0f258bb1
+mkdocs-autorefs==1.0.1 ; python_version >= "3.8" and python_version < "4.0" \
+    --hash=sha256:aacdfae1ab197780fb7a2dac92ad8a3d8f7ca8049a9cbe56a4218cd52e8da570 \
+    --hash=sha256:f684edf847eced40b570b57846b15f0bf57fb93ac2c510450775dcf16accb971
+mkdocs-material-extensions==1.3.1 ; python_version >= "3.8" and python_version < "4.0" \
+    --hash=sha256:10c9511cea88f568257f960358a467d12b970e1f7b2c0e5fb2bb48cab1928443 \
+    --hash=sha256:adff8b62700b25cb77b53358dad940f3ef973dd6db797907c49e3c2ef3ab4e31
+mkdocs-material==9.5.13 ; python_version >= "3.8" and python_version < "4.0" \
+    --hash=sha256:5cbe17fee4e3b4980c8420a04cc762d8dc052ef1e10532abd4fce88e5ea9ce6a \
+    --hash=sha256:d8e4caae576312a88fd2609b81cf43d233cdbe36860d67a68702b018b425bd87
 mkdocs==1.5.3 ; python_version >= "3.8" and python_version < "4.0" \
     --hash=sha256:3b3a78e736b31158d64dbb2f8ba29bd46a379d0c6e324c2246c3bc3d2189cfc1 \
     --hash=sha256:eb7c99214dcb945313ba30426c2451b735992c73c2e10838f76d09e39ff4d0e2
+mkdocstrings-python==1.9.0 ; python_version >= "3.8" and python_version < "4.0" \
+    --hash=sha256:6e1a442367cf75d30cf69774cbb1ad02aebec58bfff26087439df4955efecfde \
+    --hash=sha256:fad27d7314b4ec9c0359a187b477fb94c65ef561fdae941dca1b717c59aae96f
+mkdocstrings==0.24.1 ; python_version >= "3.8" and python_version < "4.0" \
+    --hash=sha256:b4206f9a2ca8a648e222d5a0ca1d36ba7dee53c88732818de183b536f9042b5d \
+    --hash=sha256:cc83f9a1c8724fc1be3c2fa071dd73d91ce902ef6a79710249ec8d0ee1064401
 mypy-extensions==1.0.0 ; python_version >= "3.8" and python_version < "4.0" \
     --hash=sha256:4392f6c0eb8a5668a69e23d168ffa70f0be9ccfd32b5cc2d26a34ae5b844552d \
     --hash=sha256:75dbf8955dc00442a438fc4d0666508a9a97b6bd41aa2f0ffe9d2f2725af0782
@@ -305,6 +326,8 @@ mypy==1.8.0 ; python_version >= "3.8" and python_version < "4.0" \
 packaging==23.2 ; python_version >= "3.8" and python_version < "4.0" \
     --hash=sha256:048fb0e9405036518eaaf48a55953c750c11e1a1b68e0dd1a9d62ed0c092cfc5 \
     --hash=sha256:8c491190033a9af7e1d931d0b5dacc2ef47509b34dd0de67ed209b5203fc88c7
+paginate==0.5.6 ; python_version >= "3.8" and python_version < "4.0" \
+    --hash=sha256:5e6007b6a9398177a7e1648d04fdd9f8c9766a1a945bceac82f1929e8c78af2d
 pathspec==0.12.1 ; python_version >= "3.8" and python_version < "4.0" \
     --hash=sha256:a0d503e138a4c123b27490a4f7beda6a01c6f288df0e4a8b79c7eb0dc7b4cc08 \
     --hash=sha256:a482d51503a1ab33b1c67a6c3813a26953dbdc71c31dacaef9a838c4e29f5712
@@ -314,6 +337,12 @@ platformdirs==4.2.0 ; python_version >= "3.8" and python_version < "4.0" \
 pluggy==1.4.0 ; python_version >= "3.8" and python_version < "4.0" \
     --hash=sha256:7db9f7b503d67d1c5b95f59773ebb58a8c1c288129a88665838012cfb07b8981 \
     --hash=sha256:8c85c2876142a764e5b7548e7d9a0e0ddb46f5185161049a79b7e974454223be
+pygments==2.17.2 ; python_version >= "3.8" and python_version < "4.0" \
+    --hash=sha256:b27c2826c47d0f3219f29554824c30c5e8945175d888647acd804ddd04af846c \
+    --hash=sha256:da46cec9fd2de5be3a8a784f434e4c4ab670b4ff54d605c4c2717e9d49c4c367
+pymdown-extensions==10.7.1 ; python_version >= "3.8" and python_version < "4.0" \
+    --hash=sha256:c70e146bdd83c744ffc766b4671999796aba18842b268510a329f7f64700d584 \
+    --hash=sha256:f5cc7000d7ff0d1ce9395d216017fa4df3dde800afb1fb72d1c7d3fd35e710f4
 pyparsing==3.1.1 ; python_version >= "3.8" and python_version < "4.0" \
     --hash=sha256:32c7c0b711493c72ff18a981d24f28aaf9c1fb7ed5e9667c9e84e3db623bdbfb \
     --hash=sha256:ede28a1a32462f5a9705e07aea48001a08f7cf81a021585011deba701581a0db
@@ -329,6 +358,9 @@ pytest==7.4.4 ; python_version >= "3.8" and python_version < "4.0" \
 python-dateutil==2.8.2 ; python_version >= "3.8" and python_version < "4.0" \
     --hash=sha256:0123cacc1627ae19ddf3c27a5de5bd67ee4586fbdd6440d9748f8abb483d3e86 \
     --hash=sha256:961d03dc3453ebbc59dbdea9e4e11c5651520a876d0f4db161e8674aae935da9
+pytz==2024.1 ; python_version >= "3.8" and python_version < "3.9" \
+    --hash=sha256:2a29735ea9c18baf14b448846bde5a48030ed267578472d8955cd0e7443a9812 \
+    --hash=sha256:328171f4e3623139da4983451950b28e95ac706e13f3f2630a879749e7a8b319
 pyyaml-env-tag==0.1 ; python_version >= "3.8" and python_version < "4.0" \
     --hash=sha256:70092675bda14fdec33b31ba77e7543de9ddc88f2e5b99160396572d11525bdb \
     --hash=sha256:af31106dec8a4d68c60207c1886031cbf839b68aa7abccdb19868200532c2069
@@ -383,6 +415,100 @@ pyyaml==6.0.1 ; python_version >= "3.8" and python_version < "4.0" \
     --hash=sha256:fca0e3a251908a499833aa292323f32437106001d436eca0e6e7833256674585 \
     --hash=sha256:fd1592b3fdf65fff2ad0004b5e363300ef59ced41c2e6b3a99d4089fa8c5435d \
     --hash=sha256:fd66fc5d0da6d9815ba2cebeb4205f95818ff4b79c3ebe268e75d961704af52f
+regex==2023.12.25 ; python_version >= "3.8" and python_version < "4.0" \
+    --hash=sha256:0694219a1d54336fd0445ea382d49d36882415c0134ee1e8332afd1529f0baa5 \
+    --hash=sha256:086dd15e9435b393ae06f96ab69ab2d333f5d65cbe65ca5a3ef0ec9564dfe770 \
+    --hash=sha256:094ba386bb5c01e54e14434d4caabf6583334090865b23ef58e0424a6286d3dc \
+    --hash=sha256:09da66917262d9481c719599116c7dc0c321ffcec4b1f510c4f8a066f8768105 \
+    --hash=sha256:0ecf44ddf9171cd7566ef1768047f6e66975788258b1c6c6ca78098b95cf9a3d \
+    --hash=sha256:0fda75704357805eb953a3ee15a2b240694a9a514548cd49b3c5124b4e2ad01b \
+    --hash=sha256:11a963f8e25ab5c61348d090bf1b07f1953929c13bd2309a0662e9ff680763c9 \
+    --hash=sha256:150c39f5b964e4d7dba46a7962a088fbc91f06e606f023ce57bb347a3b2d4630 \
+    --hash=sha256:1b9d811f72210fa9306aeb88385b8f8bcef0dfbf3873410413c00aa94c56c2b6 \
+    --hash=sha256:1e0eabac536b4cc7f57a5f3d095bfa557860ab912f25965e08fe1545e2ed8b4c \
+    --hash=sha256:22a86d9fff2009302c440b9d799ef2fe322416d2d58fc124b926aa89365ec482 \
+    --hash=sha256:22f3470f7524b6da61e2020672df2f3063676aff444db1daa283c2ea4ed259d6 \
+    --hash=sha256:263ef5cc10979837f243950637fffb06e8daed7f1ac1e39d5910fd29929e489a \
+    --hash=sha256:283fc8eed679758de38fe493b7d7d84a198b558942b03f017b1f94dda8efae80 \
+    --hash=sha256:29171aa128da69afdf4bde412d5bedc335f2ca8fcfe4489038577d05f16181e5 \
+    --hash=sha256:298dc6354d414bc921581be85695d18912bea163a8b23cac9a2562bbcd5088b1 \
+    --hash=sha256:2aae8101919e8aa05ecfe6322b278f41ce2994c4a430303c4cd163fef746e04f \
+    --hash=sha256:2f4e475a80ecbd15896a976aa0b386c5525d0ed34d5c600b6d3ebac0a67c7ddf \
+    --hash=sha256:34e4af5b27232f68042aa40a91c3b9bb4da0eeb31b7632e0091afc4310afe6cb \
+    --hash=sha256:37f8e93a81fc5e5bd8db7e10e62dc64261bcd88f8d7e6640aaebe9bc180d9ce2 \
+    --hash=sha256:3a17d3ede18f9cedcbe23d2daa8a2cd6f59fe2bf082c567e43083bba3fb00347 \
+    --hash=sha256:3b1de218d5375cd6ac4b5493e0b9f3df2be331e86520f23382f216c137913d20 \
+    --hash=sha256:43f7cd5754d02a56ae4ebb91b33461dc67be8e3e0153f593c509e21d219c5060 \
+    --hash=sha256:4558410b7a5607a645e9804a3e9dd509af12fb72b9825b13791a37cd417d73a5 \
+    --hash=sha256:4719bb05094d7d8563a450cf8738d2e1061420f79cfcc1fa7f0a44744c4d8f73 \
+    --hash=sha256:4bfc2b16e3ba8850e0e262467275dd4d62f0d045e0e9eda2bc65078c0110a11f \
+    --hash=sha256:518440c991f514331f4850a63560321f833979d145d7d81186dbe2f19e27ae3d \
+    --hash=sha256:51f4b32f793812714fd5307222a7f77e739b9bc566dc94a18126aba3b92b98a3 \
+    --hash=sha256:531ac6cf22b53e0696f8e1d56ce2396311254eb806111ddd3922c9d937151dae \
+    --hash=sha256:5cd05d0f57846d8ba4b71d9c00f6f37d6b97d5e5ef8b3c3840426a475c8f70f4 \
+    --hash=sha256:5dd58946bce44b53b06d94aa95560d0b243eb2fe64227cba50017a8d8b3cd3e2 \
+    --hash=sha256:60080bb3d8617d96f0fb7e19796384cc2467447ef1c491694850ebd3670bc457 \
+    --hash=sha256:636ba0a77de609d6510235b7f0e77ec494d2657108f777e8765efc060094c98c \
+    --hash=sha256:67d3ccfc590e5e7197750fcb3a2915b416a53e2de847a728cfa60141054123d4 \
+    --hash=sha256:68191f80a9bad283432385961d9efe09d783bcd36ed35a60fb1ff3f1ec2efe87 \
+    --hash=sha256:7502534e55c7c36c0978c91ba6f61703faf7ce733715ca48f499d3dbbd7657e0 \
+    --hash=sha256:7aa47c2e9ea33a4a2a05f40fcd3ea36d73853a2aae7b4feab6fc85f8bf2c9704 \
+    --hash=sha256:7d2af3f6b8419661a0c421584cfe8aaec1c0e435ce7e47ee2a97e344b98f794f \
+    --hash=sha256:7e316026cc1095f2a3e8cc012822c99f413b702eaa2ca5408a513609488cb62f \
+    --hash=sha256:88ad44e220e22b63b0f8f81f007e8abbb92874d8ced66f32571ef8beb0643b2b \
+    --hash=sha256:88d1f7bef20c721359d8675f7d9f8e414ec5003d8f642fdfd8087777ff7f94b5 \
+    --hash=sha256:89723d2112697feaa320c9d351e5f5e7b841e83f8b143dba8e2d2b5f04e10923 \
+    --hash=sha256:8a0ccf52bb37d1a700375a6b395bff5dd15c50acb745f7db30415bae3c2b0715 \
+    --hash=sha256:8c2c19dae8a3eb0ea45a8448356ed561be843b13cbc34b840922ddf565498c1c \
+    --hash=sha256:905466ad1702ed4acfd67a902af50b8db1feeb9781436372261808df7a2a7bca \
+    --hash=sha256:9852b76ab558e45b20bf1893b59af64a28bd3820b0c2efc80e0a70a4a3ea51c1 \
+    --hash=sha256:98a2636994f943b871786c9e82bfe7883ecdaba2ef5df54e1450fa9869d1f756 \
+    --hash=sha256:9aa1a67bbf0f957bbe096375887b2505f5d8ae16bf04488e8b0f334c36e31360 \
+    --hash=sha256:9eda5f7a50141291beda3edd00abc2d4a5b16c29c92daf8d5bd76934150f3edc \
+    --hash=sha256:a6d1047952c0b8104a1d371f88f4ab62e6275567d4458c1e26e9627ad489b445 \
+    --hash=sha256:a9b6d73353f777630626f403b0652055ebfe8ff142a44ec2cf18ae470395766e \
+    --hash=sha256:a9cc99d6946d750eb75827cb53c4371b8b0fe89c733a94b1573c9dd16ea6c9e4 \
+    --hash=sha256:ad83e7545b4ab69216cef4cc47e344d19622e28aabec61574b20257c65466d6a \
+    --hash=sha256:b014333bd0217ad3d54c143de9d4b9a3ca1c5a29a6d0d554952ea071cff0f1f8 \
+    --hash=sha256:b43523d7bc2abd757119dbfb38af91b5735eea45537ec6ec3a5ec3f9562a1c53 \
+    --hash=sha256:b521dcecebc5b978b447f0f69b5b7f3840eac454862270406a39837ffae4e697 \
+    --hash=sha256:b77e27b79448e34c2c51c09836033056a0547aa360c45eeeb67803da7b0eedaf \
+    --hash=sha256:b7a635871143661feccce3979e1727c4e094f2bdfd3ec4b90dfd4f16f571a87a \
+    --hash=sha256:b7fca9205b59c1a3d5031f7e64ed627a1074730a51c2a80e97653e3e9fa0d415 \
+    --hash=sha256:ba1b30765a55acf15dce3f364e4928b80858fa8f979ad41f862358939bdd1f2f \
+    --hash=sha256:ba99d8077424501b9616b43a2d208095746fb1284fc5ba490139651f971d39d9 \
+    --hash=sha256:c25a8ad70e716f96e13a637802813f65d8a6760ef48672aa3502f4c24ea8b400 \
+    --hash=sha256:c3c4a78615b7762740531c27cf46e2f388d8d727d0c0c739e72048beb26c8a9d \
+    --hash=sha256:c40281f7d70baf6e0db0c2f7472b31609f5bc2748fe7275ea65a0b4601d9b392 \
+    --hash=sha256:c7ad32824b7f02bb3c9f80306d405a1d9b7bb89362d68b3c5a9be53836caebdb \
+    --hash=sha256:cb3fe77aec8f1995611f966d0c656fdce398317f850d0e6e7aebdfe61f40e1cd \
+    --hash=sha256:cc038b2d8b1470364b1888a98fd22d616fba2b6309c5b5f181ad4483e0017861 \
+    --hash=sha256:cc37b9aeebab425f11f27e5e9e6cf580be7206c6582a64467a14dda211abc232 \
+    --hash=sha256:cc6bb9aa69aacf0f6032c307da718f61a40cf970849e471254e0e91c56ffca95 \
+    --hash=sha256:d126361607b33c4eb7b36debc173bf25d7805847346dd4d99b5499e1fef52bc7 \
+    --hash=sha256:d15b274f9e15b1a0b7a45d2ac86d1f634d983ca40d6b886721626c47a400bf39 \
+    --hash=sha256:d166eafc19f4718df38887b2bbe1467a4f74a9830e8605089ea7a30dd4da8887 \
+    --hash=sha256:d498eea3f581fbe1b34b59c697512a8baef88212f92e4c7830fcc1499f5b45a5 \
+    --hash=sha256:d6f7e255e5fa94642a0724e35406e6cb7001c09d476ab5fce002f652b36d0c39 \
+    --hash=sha256:d78bd484930c1da2b9679290a41cdb25cc127d783768a0369d6b449e72f88beb \
+    --hash=sha256:d865984b3f71f6d0af64d0d88f5733521698f6c16f445bb09ce746c92c97c586 \
+    --hash=sha256:d902a43085a308cef32c0d3aea962524b725403fd9373dea18110904003bac97 \
+    --hash=sha256:d94a1db462d5690ebf6ae86d11c5e420042b9898af5dcf278bd97d6bda065423 \
+    --hash=sha256:da695d75ac97cb1cd725adac136d25ca687da4536154cdc2815f576e4da11c69 \
+    --hash=sha256:db2a0b1857f18b11e3b0e54ddfefc96af46b0896fb678c85f63fb8c37518b3e7 \
+    --hash=sha256:df26481f0c7a3f8739fecb3e81bc9da3fcfae34d6c094563b9d4670b047312e1 \
+    --hash=sha256:e14b73607d6231f3cc4622809c196b540a6a44e903bcfad940779c80dffa7be7 \
+    --hash=sha256:e2610e9406d3b0073636a3a2e80db05a02f0c3169b5632022b4e81c0364bcda5 \
+    --hash=sha256:e692296c4cc2873967771345a876bcfc1c547e8dd695c6b89342488b0ea55cd8 \
+    --hash=sha256:e693e233ac92ba83a87024e1d32b5f9ab15ca55ddd916d878146f4e3406b5c91 \
+    --hash=sha256:e81469f7d01efed9b53740aedd26085f20d49da65f9c1f41e822a33992cb1590 \
+    --hash=sha256:e8c7e08bb566de4faaf11984af13f6bcf6a08f327b13631d41d62592681d24fe \
+    --hash=sha256:ed19b3a05ae0c97dd8f75a5d8f21f7723a8c33bbc555da6bbe1f96c470139d3c \
+    --hash=sha256:efb2d82f33b2212898f1659fb1c2e9ac30493ac41e4d53123da374c3b5541e64 \
+    --hash=sha256:f44dd4d68697559d007462b0a3a1d9acd61d97072b71f6d1968daef26bc744bd \
+    --hash=sha256:f72cbae7f6b01591f90814250e636065850c5926751af02bb48da94dfced7baa \
+    --hash=sha256:f7bc09bc9c29ebead055bcba136a67378f03d66bf359e87d0f7c759d6d4ffa31 \
+    --hash=sha256:ff100b203092af77d1a5a7abe085b3506b7eaaf9abf65b73b7d6905b6cb76988
 requests==2.31.0 ; python_version >= "3.8" and python_version < "4.0" \
     --hash=sha256:58cd2187c01e70e6e26505bca751777aa9f2ee0b7f4300988b709f44e013003f \
     --hash=sha256:942c5a758f98d790eaed1a29cb6eefc7ffb0d1cf7af05c3d2791656dbd6ad1e1
@@ -392,6 +518,9 @@ six==1.16.0 ; python_version >= "3.8" and python_version < "4.0" \
 tomli==2.0.1 ; python_version >= "3.8" and python_full_version <= "3.11.0a6" \
     --hash=sha256:939de3e7a6161af0c887ef91b7d41a53e7c5a1ca976325f429cb46ea9bc30ecc \
     --hash=sha256:de526c12914f0c550d15924c62d72abc48d6fe7364aa87328337a31007fe8a4f
+types-requests==2.31.0.20240125 ; python_version >= "3.8" and python_version < "4.0" \
+    --hash=sha256:03a28ce1d7cd54199148e043b2079cdded22d6795d19a2c2a6791a4b2b5e2eb5 \
+    --hash=sha256:9592a9a4cb92d6d75d9b491a41477272b710e021011a2a3061157e2fb1f1a5d1
 typing-extensions==4.9.0 ; python_version >= "3.8" and python_version < "4.0" \
     --hash=sha256:23478f88c37f27d76ac8aee6c905017a143b0b1b886c3c9f66bc2fd94f9f5783 \
     --hash=sha256:af72aea155e91adfc61c3ae9e0e342dbc0cba726d6cba4b6c72c1f34e47291cd
@@ -429,6 +558,9 @@ watchdog==3.0.0 ; python_version >= "3.8" and python_version < "4.0" \
     --hash=sha256:c9d8c8ec7efb887333cf71e328e39cffbf771d8f8f95d308ea4125bf5f90ba64 \
     --hash=sha256:d00e6be486affb5781468457b21a6cbe848c33ef43f9ea4a73b4882e5f188a44 \
     --hash=sha256:d429c2430c93b7903914e4db9a966c7f2b068dd2ebdd2fa9b9ce094c7d459f33
+wheel==0.43.0 ; python_version >= "3.8" and python_version < "3.9" \
+    --hash=sha256:465ef92c69fa5c5da2d1cf8ac40559a8c940886afcef87dcf14b9470862f1d85 \
+    --hash=sha256:55c570405f142630c6b9f72fe09d9b67cf1477fcf543ae5b8dcb1f5b7377da81
 zipp==3.17.0 ; python_version >= "3.8" and python_version < "4.0" \
     --hash=sha256:0e923e726174922dce09c53c59ad483ff7bbb8e572e00c7f7c46b88556409f31 \
     --hash=sha256:84e64a1c28cf7e91ed2078bb8cc8c259cb19b76942096c8d7b84947690cabaf0
diff --git a/docs/advanced.md b/docs/advanced.md
index 34b9afe..84b6e27 100644
--- a/docs/advanced.md
+++ b/docs/advanced.md
@@ -1,20 +1,21 @@
-
 # Advanced Usage
 
 ## OCLC Number Formatting
-`MetadataSession` accepts OCLC numbers in methods' arguments as integers or strings with or without a prefix (eg. "ocm", "ocn", or "on"). The following are all acceptable:
+`MetadataSession` accepts OCLC numbers in methods' arguments as integers or strings. OCLC numbers will be parsed with or without a prefix (eg. "(OCoLC)", "ocm", "ocn", or "on") to ensure they correspond to [OCLC's formatting rules](https://help.oclc.org/Metadata_Services/WorldShare_Collection_Manager/Data_sync_collections/Prepare_your_data/30035_field_and_OCLC_control_numbers) for OCLC control numbers. The following are all acceptable:
 
 ```python title="Acceptable oclcNumber arguments"
 session.brief_bibs_get(oclcNumber="ocm00012345")
 session.brief_bibs_search(oclcNumber="00054321")
 session.bib_get_classification(oclcNumber=12121)
+session.brief_bibs_search(oclcNumber="(OCoLC)00054321")
 ```
-The `bib_get_current_oclc_number` and `holdings_get_current` methods accept multiple OCLC Numbers passed to the `oclcNumbers` argument. For these methods OCLC Numbers can be passed as a list of strings and/or integers or a string with the numbers separated by commas. The following are all acceptable:
+The `bib_get_current_oclc_number` and `holdings_get_current` methods accept multiple OCLC Numbers passed to the `oclcNumbers` argument. For these methods OCLC Numbers can be passed as a list of strings and/or integers or a string with the numbers separated by commas. The `oclcNumbers` argument will also accept a single integer as a valid arguement. The following are all acceptable:
 
 ```python title="Acceptable oclcNumbers arguments"
 session.holdings_get_current(oclcNumbers=["ocm00012345", "00012346", "12347"])
 session.holdings_get_current(oclcNumbers=["ocm00012345", "00012346", 12347])
 session.bib_get_current_oclc_number(oclcNumbers="ocm00012345, 00012346, 12347")
+session.bib_get_current_oclc_number(oclcNumbers=12347)
 ```
 
 ## Authentication
diff --git a/docs/changelog.md b/docs/changelog.md
index 2e6bfc4..c2dde45 100644
--- a/docs/changelog.md
+++ b/docs/changelog.md
@@ -1,5 +1,19 @@
 # Changelog
 
+## [1.0.1] - (5/1/2024)
+### Fixed
++ Inconsistent default values for `timeout` arg for `MetadataSession`, `WorldcatAccessToken` and `Query` objects
+### Changed
++ Updated dev dependencies:
+  + black (24.3.0)
++ Updated dependencies:
+  + idna (3.7)
++ Reformatted docstrings for better readability on https://bookops-cat.github.io/bookops-worldcat/
++ Fixed typos
++ `prep_oclc_number_str` now parses OCLC Numbers with "(OCoLC)" prefix. Parsing rules match [OCLC documentation](https://help.oclc.org/Metadata_Services/WorldShare_Collection_Manager/Data_sync_collections/Prepare_your_data/30035_field_and_OCLC_control_numbers)
+### Added
++ Tutorials to `tutorials.md`
+
 ## [1.0.0] - (3/22/2024)
 ### Added
 + Support for OCLC Metadata API Version 2.0
@@ -195,6 +209,7 @@
 ### Fixed
 + fixed hooks info in docstrings in `SearchSession` and `MetadataSession`
 
+[1.0.1]: https://github.com/BookOps-CAT/bookops-worldcat/compare/v1.0.0...v1.0.1
 [1.0.0]: https://github.com/BookOps-CAT/bookops-worldcat/compare/v0.5.0...v1.0.0
 [0.5.0]: https://github.com/BookOps-CAT/bookops-worldcat/compare/v0.4.1...v0.5.0
 [0.4.1]: https://github.com/BookOps-CAT/bookops-worldcat/compare/v0.4.0...v0.4.1
diff --git a/docs/contributing.md b/docs/contributing.md
index 4d03cb7..dbde9f6 100644
--- a/docs/contributing.md
+++ b/docs/contributing.md
@@ -1,10 +1,10 @@
 # How to Contribute
 We welcome collaborators who would like to help expand and improve Bookops-Worldcat. Here are some ways to contribute.
 
-### Report bugs or suggest enhancements
+## Report bugs or suggest enhancements
 Please use our [Github issue tracker](https://github.com/BookOps-CAT/bookops-worldcat/issues) to submit bug reports or request new features.
 
-### Contribute code or documentation
+## Contribute code or documentation
 ??? info
     This page contains a draft of our contribution guidelines but there is still more for us to add.
     
@@ -16,7 +16,7 @@ Please use our [Github issue tracker](https://github.com/BookOps-CAT/bookops-wor
         + how to build docs after making edits
      + Add CI/CD info
 
-#### Style and Requirements
+### Style and Requirements
 For new code contributions, please use the tools and standards in place for Bookops-Worldcat:
 
  + Code style:
@@ -49,40 +49,66 @@ For new code contributions, please use the tools and standards in place for Book
     }
     ```
 
-#### Install and Setup
+### Install and Setup
 To get started contributing code to Bookops-Worldcat you will need: 
 
  + Python 3.8 or newer
  + `git`
  + [`poetry`](https://python-poetry.org/docs/#installation)
 
-##### Install Poetry 
+#### Install Poetry 
 Bookops-Worldcat uses `poetry` to manage virtual environments, dependencies, and publishing workflows. We use [`pipx`](https://python-poetry.org/docs/#installing-with-pipx) to run poetry (if you don't have `pipx`, see the [installation instructions](https://pipx.pypa.io/stable/installation/)). For other installation options, see the [`poetry`](https://python-poetry.org/docs/#installation) documentation.
 
-##### Fork the repo
+#### Fork the repo
 Fork the repository in GitHub and clone your fork locally
 ```bash
 git clone https://github.com/<your username>/bookops-worldcat
 cd bookops-worldcat
 ```
-##### Create a new branch for your changes
+#### Create a new branch for your changes
 ```bash
 git checkout -b new-branch
 ```
-##### Create a virtual environment and install dependencies
+#### Create a virtual environment and install dependencies
 Poetry will create a virtual environment, read the `pyproject.toml` and `poetry.lock` files, resolve dependencies, and install them with one command. 
 ```python
 poetry install
 ```
 
-##### Run tests
+#### Run tests
 Run tests before making changes on your fork.
 ??? info
     Our live tests are designed to look for API credentials in a specific file/directory in a Windows environment. We will need to refactor the live tests to allow contributors to run live tests with their own API credentials and run live tests in a macOS environment.
 
-```python
+```py
 # basic usage without webtests
 python -m pytest "not webtest"
 # with test coverage and without webtests
 python -m pytest "not webtest" --cov=bookops_worldcat/
-```
\ No newline at end of file
+```
+
+### Release Checklist
+Any major or minor updates should get a new release in GitHub. Use the following checklist when getting a new update ready for release. For patch updates/bug fixes, follow steps 1-4.
+
+1. Verify `poetry.lock`, `pyproject.toml`, `requirements.txt`, and `dev-requirements.txt` files are up-to-date
+     * **`poetry check`** to check that `poetry.lock` and `pyproject.toml` files are synced with 
+     * **`poetry update`** to update all packages 
+     * or **`poetry update [package1] [ package2]`** to update packages individually
+     * **`poetry install`** to install all versions of packages listed in the `pyproject.toml` file
+     * Export `requirements.txt` files with [poetry-plugin-export](https://github.com/python-poetry/poetry-plugin-export)
+2. Update documentation
+    * Update changelog: include version, date, and descriptions of changes
+    * Update links within docs if OCLC has made any changes
+3. Commit changes to repo
+    * Merge all changes into `release/v[version]` branch
+    * Ensure tests have run and passed within GitHub Actions
+4. Rebuild docs using mike:
+    * **`mike --rebase`** to fetch remote version of docs to your local branch (optional)
+    * **`mike deploy [version] [alias] --push`** to deploy docs
+    * **`mike set-default [version]`** to set new version to default
+5. Create a new github release
+    * At minimum, include information from changelog in release. Include additional details about changes as appropriate.
+6. Build package in poetry
+    * `poetry build`
+7. Publish to PyPI
+    * `poetry publish`
diff --git a/docs/local.md b/docs/local.md
index a128b15..7e92769 100644
--- a/docs/local.md
+++ b/docs/local.md
@@ -329,7 +329,32 @@ Users can manage local holdings records using Bookops-Worldcat in the same way t
     </record>
     ```
 ### Managing Shared Print Commitments
-Users can manage Shared Print collections using the Metadata API by adding Shared Print flags to their Local Holdings Records. More information on managing Shared Print commitments is available on [OCLC's Developer Network Site](https://www.oclc.org/developer/api/oclc-apis/worldcat-metadata-api/wcmetadata-faqs.en.html).
+Users can manage Shared Print collections using the Metadata API by adding Shared Print flags to their Local Holdings Records. More information on managing Shared Print collections is available on [OCLC's website](https://help.oclc.org/Metadata_Services/Shared_Print) and information about managing Shared Print collections via the Metadata API is available on [OCLC's Developer Network Site](https://www.oclc.org/developer/api/oclc-apis/worldcat-metadata-api/wcmetadata-faqs.en.html).
+
+```{ .xml title="MARC/XML with retention commitment in MARC 583 field" .no-copy}
+<record>
+    <leader>00000nx  a2200000zi 4500</leader>
+    <controlfield tag='004'>00001</controlfield>
+    <controlfield tag='005'>20240320085741.4</controlfield>
+    <controlfield tag='007'>ta</controlfield>
+    <controlfield tag='008'>2403200c    8   4001aaeng0240401</controlfield>
+    <datafield ind2='1' ind1=' ' tag='583'>
+        <subfield code='a'>committed to retain</subfield>
+        <subfield code='c'>20240101</subfield>
+        <subfield code='d'>in perpetuity</subfield>
+        <subfield code='f'>Test Program</subfield>
+        <subfield code='5'>NYP</subfield>                
+    </datafield>    
+    <datafield ind2=' ' ind1=' ' tag='852'>
+        <subfield code='a'>NYP</subfield>
+        <subfield code='b'>TEST</subfield>
+        <subfield code='c'>TEST-STACKS</subfield>
+    </datafield>
+    <datafield ind2=' ' ind1=' ' tag='876'>
+        <subfield code='p'>00001</subfield>
+    </datafield>
+</record>
+```
 
 ## Search Local Holdings Resources
 Users can browse, search for and retrieve brief local holdings data in JSON format using the `local_holdings_get`, `local_holdings_search`, `local_holdings_browse`, and `local_holdings_search_shared_print` methods:
diff --git a/docs/search.md b/docs/search.md
index eef1305..7d35476 100644
--- a/docs/search.md
+++ b/docs/search.md
@@ -7,7 +7,7 @@ Requests made to any `/search/` endpoints return server responses in JSON format
 ### Search Brief Bibs
 The `brief_bibs_search` method allows users to query WorldCat using WorldCat's [bibliographic record indexes](https://help.oclc.org/Librarian_Toolbox/Searching_WorldCat_Indexes/Bibliographic_records/Bibliographic_record_indexes).
 
-The Metadata API many limiters that one can use to restrict query results. A full list of available parameters for the `brief_bibs_search` method is available in the [API Documentation](api/metadata_api.md#bookops_worldcat.metadata_api.MetadataSession.brief_bibs_search). Additional search examples are also available in the [Advanced Search Functionality](#advanced-search-functionality) section of this page.
+The Metadata API has many limiters that one can use to restrict query results. A full list of available parameters for the `brief_bibs_search` method is available in the [API Documentation](api/metadata_api.md#bookops_worldcat.metadata_api.MetadataSession.brief_bibs_search). Additional search examples are also available in the [Advanced Search Functionality](#advanced-search-functionality) section of this page.
 
 Basic usage:
 ```python title="brief_bibs_search Request"
@@ -371,6 +371,20 @@ The query syntax is case-insensitive and allows keyword and phrase search (use q
 
 More about the query syntax available for brief bib resource searches can be found in [OCLC's documentation](https://help.oclc.org/Librarian_Toolbox/Searching_WorldCat_Indexes/Bibliographic_records/Bibliographic_record_indexes/Bibliographic_record_index_lists).
 
+??? info
+    Queries with the following indexes are not allowed without additional indexes: 
+      dd: Dewey Decimal Class Number
+      yr: Year
+      li: Holdings Library
+      ln: Language
+      ll: Language of cataloging
+      mt: Material Type
+      cs: Cataloging Source
+      x0: Format/Document Type word index
+      x4: Format/Document Type word index
+      l8: Shared Print word index
+      zu: Holding Library Group
+
 Two equivalent `brief_bibs_search` examples with item type and language limiters:
 
 === "Keyword Search"
diff --git a/docs/tutorials.md b/docs/tutorials.md
index c43ad41..9f750d2 100644
--- a/docs/tutorials.md
+++ b/docs/tutorials.md
@@ -1,2 +1,351 @@
-!!! warning "Work in Progress"
-    TBD
\ No newline at end of file
+# Tutorials
+The following examples illustrate how bookops-worldcat can be used in technical services workflows. These examples use [pymarc](https://pymarc.readthedocs.io/en/latest/) (version 5.1.2) and modules from the Python standard library in addition to bookops-worldcat. 
+
+Each example contains in-line comments in the code explaining the process step-by-step.
+
+### Setup
+#### Create and activate a virtual environment
+Create and activate a virtual environment before installing any packages. Using a virtual environment can help users manage dependencies. For more information about virtual environments see [PyPA's guide to virtual environments](https://packaging.python.org/en/latest/guides/installing-using-pip-and-virtual-environments/) and [Real Python's Virtual Environments primer](https://realpython.com/python-virtual-environments-a-primer/).
+
+Windows (Git Bash):
+
+1. Create your virtual environment
+
+    `python -m venv .venv`
+
+2. Activate your virtual environment
+   
+    `source ./.venv/scripts/activate`
+
+3. Install tutorial packages
+   
+    `pip -m install bookops-worldcat`
+
+    `pip -m install pymarc`
+
+MacOS: 
+
+1. Create a virtual environment
+    
+    `python3 -m venv .venv`
+
+2. Activate your virtual environment
+
+    `source ./.venv/bin/activate`
+
+3. Install tutorial packages
+
+    `pip3 -m install bookops-worldcat`
+
+    `pip3 -m install pymarc`
+
+
+### Obtain an Access Token
+The examples below use the following helper function to get an Access Token:
+
+```python title="get_token helper function"
+def get_token(filepath: str) -> WorldcatAccessToken:
+   """
+   Retrieves user's WSKey credentials from a .json file.
+
+   Args:
+       filepath: 
+            Path to location of .json file with credentials.
+            The format of the credentials in the .json file should be:
+               {
+                 "key": "my_key",
+                 "secret": "my_secret",
+                 "scopes": "WorldcatMetadataAPI",
+                 "agent": "MyApp/1.0"
+               } 
+
+   Returns:
+       WorldcatAccessToken
+   """
+   with open(filepath, "r") as file:
+       data = json.load(file)
+       return WorldcatAccessToken(
+           key=data["key"],
+           secret=data["secret"],
+           scopes=data["scopes"],
+           agent=data["agent"],
+       )
+```
+
+
+### Match minimal vendor records to full WorldCat records 
+Given minimal MARC records from a vendor, identify matches in WorldCat using the `/manage/bibs/match` endpoint. Parse the API response and retrieve full MARC records using the `/manage/bibs` endpoint. Merge the resulting records with the original records and save them to a new file. 
+
+```python title="Match MARC records"
+import os
+
+from bookops_worldcat import MetadataSession
+from pymarc import MARCReader, MARCWriter, Record
+
+from utils import get_token  # (1)!
+
+token = get_token("C:/Users/username/credentials/tutorial_creds.json") # (2)!
+
+# Step 1. Initiate MetadataSession
+with MetadataSession(authorization=token) as session:
+
+  # Step 2.  Read records from .mrc file one-by-one
+  with open("data/tutorial_input_1.mrc", "rb") as file: # (3)!
+      reader = MARCReader(file)
+      for record in reader:
+
+          # Step 3. Extract embedded order data from vendor record
+          order_data = record.get("960") # (4)! 
+
+          # Step 4. Match record using bib_match
+          match_response = session.bib_match(
+              record=record.as_marc(), recordFormat="application/marc"
+          )
+
+          # Step 5. Parse .json response and extract OCLC Number
+          match_json = match_response.json()
+          matched_oclc_number = match_json["briefRecords"][0]["oclcNumber"]
+
+          # Step 6. Retrieve full MARC record using OCLC Number
+          get_response = session.bib_get(
+              matched_oclc_number, responseFormat="application/marc"
+          )
+
+          # Step 7. Create pymarc Record object from MARC record in API response
+          pymarc_record = Record(get_response.content)
+
+          # Step 8. Merge order data from original record into new MARC record
+          pymarc_record.add_field(order_data)
+
+          # Step 9. Write record to new .mrc file
+          writer = MARCWriter(open("data/tutorial_output_1.mrc", "ab"))
+          writer.write(pymarc_record)
+          writer.close()
+```
+
+1. The helper function, `get_token`, is mentioned at the top of this page. In this example we are importing it from a module named `utils.py`
+2. The filepath for the `.json` file where your WSKey is stored.
+3. This is the name of the vendor MARC file.
+4. This is a MARC tag used for embedded order data but users should change this field based on local practices.
+
+
+### Search brief bibliographic resources
+Given minimal data in a spreadsheet, read data to form queries. Search for records using the `/search/brief-bibs/` endpoint and query formed from spreadsheet data. Retrieve full MARC records using the OCLC numbers in the API response. 
+
+The spreadsheet in this example contains the following fields: Title, Author, ISBN, Publication Date, Barcode, and Item Price.
+
+```python title="Search brief bibliographic resources"
+import os
+import csv
+
+from bookops_worldcat import MetadataSession
+from pymarc import MARCWriter, Record, Field, Subfield
+
+from utils import get_token # (1)!
+
+token = get_token("C:/Users/username/credentials/tutorial_creds.json") # (2)!
+
+# Step 1. Initiate MetadataSession
+with MetadataSession(authorization=token) as session:
+
+    # Step 2.  Read data from spreadsheet
+    with open("data/tutorial_input_2.csv", "r", encoding="utf-8") as csvfile:  # (3)!
+        reader = csv.reader(csvfile, delimiter="\t")
+        next(reader)
+
+        # Step 3. Iterate through each row in spreadsheet
+        for row in reader:
+
+            # Step 4. Query API using spreadsheet data and brief_bibs_search 
+            brief_bib_response = session.brief_bibs_search(
+                q=f"ti:{row[0]} AND au:{row[1]} AND bn:{row[2]}",
+                inCatalogLanguage="eng",
+                itemSubType="book-printbook",
+                datePublished=row[3], # (4)!
+            )
+
+            # Step 5. Parse .json response and extract OCLC Number
+            brief_bib_json = brief_bib_response.json()
+            matched_oclc_number = brief_bib_json["briefRecords"][0]["oclcNumber"]
+
+            # Step 6. Retrieve full MARC record using OCLC Number
+            get_response = session.bib_get(
+                matched_oclc_number, responseFormat="application/marc"
+            )
+
+            # Step 7. Create pymarc Record object from MARC record in API response
+            pymarc_record = Record(get_response.content)
+
+            # Step 8. Merge additional data from spreadsheet into new MARC record
+            pymarc_record.add_field(
+                Field(
+                    tag="949",
+                    indicators=["", ""],
+                    subfields=[
+                        Subfield(code="i", value=f"{row[4]}"), # (5)!
+                        Subfield(code="p", value=f"{row[5]}"), # (6)!
+                    ],
+                )
+            )
+
+            # Step 9. Write record to new .mrc file
+            writer = MARCWriter(open("data/tutorial_output_2.mrc", "ab"))
+            writer.write(pymarc_record)
+            writer.close()
+```
+
+1. The helper function, `get_token`, is mentioned at the top of this page. In this example we are importing it from a module named `utils.py`
+2. The filepath for the `.json` file where your WSKey is stored.
+3. The name of your vendor spreadsheet file.
+4. The query is formed using data from the first four columns of the spreadsheet: Title (column 1), Author (column 2), Publication Date (column 3), and ISBN (column 4)
+5. Add the barcode to the 949$i field.
+6. Add the item price to the 949$p field.
+
+### Check and Set Holdings
+#### Using MARC records
+Given a file of MARC records, extract the OCLC numbers from the records and check if holdings are set. Set/Unset holdings using the MARC record. 
+
+```python title="Using MARC records"
+import os
+
+from bookops_worldcat import MetadataSession
+from pymarc import MARCReader
+
+from utils import get_token  # (1)!
+
+
+token = get_token("C:/Users/username/credentials/tutorial_creds.json") # (2)!
+
+# 1. Initiate MetadataSession
+with MetadataSession(authorization=token) as session:
+    # 2. Read MARC records from file
+    with open("data/tutorial_input_3.mrc", "rb") as marc_file:  # (3)!
+        reader = MARCReader(marc_file)
+        for record in reader:
+            # 3. Get OCLC Number for record
+            oclc_number = record.get("035").value()
+
+            # 4. Check if holdings are set for record
+            get_response = session.holdings_get_current(oclc_number)
+
+            # 5.1. Set holdings with record
+            set_response = session.holdings_set_with_bib( # (4)!
+                record.as_marc(), recordFormat="application/marc"
+            )
+
+            # 5.2. Unset holdings with record
+            unset_response = session.holdings_unset_with_bib( # (5)!
+                record.as_marc(), recordFormat="application/marc"
+            )
+```
+
+1. The helper function, `get_token`, is mentioned at the top of this page. In this example we are importing it from a module named `utils.py`
+2. The filepath for the `.json` file where your WSKey is stored.
+3. The name of the file with your MARC records.
+4. If copying code from this example, delete step 5.1 or 5.2 depending on whether you would like to set or unset holdings. 
+5. If copying code from this example, delete step 5.1 or 5.2 depending on whether you would like to set or unset holdings.
+
+#### Using OCLC Numbers
+Read OCLC Numbers from a text file and check if holdings are set. Set/unset holdings using OCLC Number. 
+
+??? info "Step-by-step instructions"
+    This example uses the following steps. These steps are noted using in-line comments in the code:
+    
+      1. Read a file of OCLC Numbers and add them to a list.
+      2. Initiate `MetadataSession`
+      3. Loop through OCLC Numbers.
+      4. Check if holdings are set using OCLC Number.
+      5. Set holdings using OCLC Number.
+      6. Unset holdings using OCLC Number.
+
+```python title="Using OCLC Numbers"
+import os
+
+from bookops_worldcat import MetadataSession
+
+from utils import get_token  # (1)!
+
+
+token = get_token("C:/Users/username/credentials/tutorial_creds.json") # (2)!
+
+# 1. Read a file of OCLC Numbers and add them to a list
+oclc_numbers = []
+with open("data/tutorial_input_3.txt", "r") as numbers:  # (3)!
+    for number in numbers:
+        oclc_numbers.append(number.strip("\n"))
+# 2. Initiate MetadataSession
+with MetadataSession(authorization=token) as session:
+    # 3. Loop through OCLC Numbers
+    for number in oclc_numbers:
+        # 4. Check if holdings are set using OCLC Number
+        get_response = session.holdings_get_current(number)
+
+        # 5.1. Set holdings using OCLC Number
+        set_response = session.holdings_set(number) # (4)!
+
+        # 5.2. Unset holdings using OCLC Number
+        unset_response = session.holdings_unset(number) # (5)!
+```
+
+1. The helper function, `get_token`, is mentioned at the top of this page. In this example we are importing it from a module named `utils.py`
+2. The filepath for the `.json` file where your WSKey is stored.
+3. The name of the `.txt` file with your OCLC numbers.
+4. If copying code from this example, delete step 5.1 or 5.2 depending on whether you would like to set or unset holdings. 
+5. If copying code from this example, delete step 5.1 or 5.2 depending on whether you would like to set or unset holdings.
+
+
+### Get classification recommendations for vendor records
+Read data from a `.mrc` file and query WorldCat to retrieve classification recommendations. Add the resulting call numbers to the original MARC records and write the records to a new `.mrc` file.
+
+```python title="Get classification recommendations"
+import os
+
+from bookops_worldcat import MetadataSession
+from pymarc import MARCReader, Field, Subfield, MARCWriter
+
+from utils import get_token  # (1)!
+
+
+token = get_token("C:/Users/username/credentials/tutorial_creds.json") # (2)!
+
+# 1. Initiate MetadataSession
+with MetadataSession(authorization=token) as session:
+    # 2. Read MARC records from file
+    with open("data/classification_tutorial.mrc", "rb") as marc_file:  # (3)!
+        reader = MARCReader(marc_file)
+        for record in reader:
+            # 3. Extract OCLC Number from record
+            oclc_number = record.get("035").value()
+
+            # 4. Query API for classification recommendations using OCLC Number
+            response = session.bib_get_classification(oclc_number)
+
+            # 5. Parse API response
+            dewey = response.json()["dewey"]["mostPopular"][0]
+            lcc = response.json()["lc"]["mostPopular"][0]
+
+            # 6. Add classification from response to records
+            record.add_field(
+                Field(
+                    tag="050",
+                    indicators=[" ", "0"],
+                    subfields=[Subfield(code="a", value=f"{lcc}")],
+                )
+            )
+            record.add_field(
+                Field(
+                    tag="082",
+                    indicators=["0", " "],
+                    subfields=[Subfield(code="a", value=f"{dewey}")],
+                )
+            )
+
+            # 7. Write records to new file
+            writer = MARCWriter(open("data/tutorial_output_4.mrc", "ab"))
+            writer.write(record)
+            writer.close()
+```
+
+1. The helper function, `get_token`, is mentioned at the top of this page. In this example we are importing it from a module named `utils.py`
+2. The filepath for the `.json` file where your WSKey is stored.
+3. The name of the file with your MARC records.
\ No newline at end of file
diff --git a/mkdocs.yml b/mkdocs.yml
index f33a402..4c4a763 100644
--- a/mkdocs.yml
+++ b/mkdocs.yml
@@ -11,6 +11,7 @@ theme:
   features:
     - content.tabs.link
     - content.code.copy
+    - content.code.annotate
     - navigation.tabs
     - navigation.tabs.sticky
     - navigation.footer
@@ -51,12 +52,15 @@ markdown_extensions:
 - pymdownx.tabbed:
     alternate_style: true
 - tables
+- md_in_html
+- attr_list
 
 watch:
 - bookops_worldcat
 
 plugins:
   - search
+  - autorefs
   - mkdocstrings:
       handlers:
         python:
@@ -66,6 +70,7 @@ plugins:
             filters: ["!^_"]
             docstring_options:
               ignore_init_summary: true
+            docstring_section_style: spacy
             merge_init_into_class: true
             show_signature_annotations: true
           import:
diff --git a/poetry.lock b/poetry.lock
index 9332bda..a955f33 100644
--- a/poetry.lock
+++ b/poetry.lock
@@ -1,4 +1,4 @@
-# This file is automatically @generated by Poetry 1.7.1 and should not be changed by hand.
+# This file is automatically @generated by Poetry 1.8.2 and should not be changed by hand.
 
 [[package]]
 name = "astunparse"
@@ -34,33 +34,33 @@ dev = ["freezegun (>=1.0,<2.0)", "pytest (>=6.0)", "pytest-cov"]
 
 [[package]]
 name = "black"
-version = "23.12.1"
+version = "24.3.0"
 description = "The uncompromising code formatter."
 optional = false
 python-versions = ">=3.8"
 files = [
-    {file = "black-23.12.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:e0aaf6041986767a5e0ce663c7a2f0e9eaf21e6ff87a5f95cbf3675bfd4c41d2"},
-    {file = "black-23.12.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:c88b3711d12905b74206227109272673edce0cb29f27e1385f33b0163c414bba"},
-    {file = "black-23.12.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a920b569dc6b3472513ba6ddea21f440d4b4c699494d2e972a1753cdc25df7b0"},
-    {file = "black-23.12.1-cp310-cp310-win_amd64.whl", hash = "sha256:3fa4be75ef2a6b96ea8d92b1587dd8cb3a35c7e3d51f0738ced0781c3aa3a5a3"},
-    {file = "black-23.12.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:8d4df77958a622f9b5a4c96edb4b8c0034f8434032ab11077ec6c56ae9f384ba"},
-    {file = "black-23.12.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:602cfb1196dc692424c70b6507593a2b29aac0547c1be9a1d1365f0d964c353b"},
-    {file = "black-23.12.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9c4352800f14be5b4864016882cdba10755bd50805c95f728011bcb47a4afd59"},
-    {file = "black-23.12.1-cp311-cp311-win_amd64.whl", hash = "sha256:0808494f2b2df923ffc5723ed3c7b096bd76341f6213989759287611e9837d50"},
-    {file = "black-23.12.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:25e57fd232a6d6ff3f4478a6fd0580838e47c93c83eaf1ccc92d4faf27112c4e"},
-    {file = "black-23.12.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:2d9e13db441c509a3763a7a3d9a49ccc1b4e974a47be4e08ade2a228876500ec"},
-    {file = "black-23.12.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6d1bd9c210f8b109b1762ec9fd36592fdd528485aadb3f5849b2740ef17e674e"},
-    {file = "black-23.12.1-cp312-cp312-win_amd64.whl", hash = "sha256:ae76c22bde5cbb6bfd211ec343ded2163bba7883c7bc77f6b756a1049436fbb9"},
-    {file = "black-23.12.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:1fa88a0f74e50e4487477bc0bb900c6781dbddfdfa32691e780bf854c3b4a47f"},
-    {file = "black-23.12.1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:a4d6a9668e45ad99d2f8ec70d5c8c04ef4f32f648ef39048d010b0689832ec6d"},
-    {file = "black-23.12.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b18fb2ae6c4bb63eebe5be6bd869ba2f14fd0259bda7d18a46b764d8fb86298a"},
-    {file = "black-23.12.1-cp38-cp38-win_amd64.whl", hash = "sha256:c04b6d9d20e9c13f43eee8ea87d44156b8505ca8a3c878773f68b4e4812a421e"},
-    {file = "black-23.12.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:3e1b38b3135fd4c025c28c55ddfc236b05af657828a8a6abe5deec419a0b7055"},
-    {file = "black-23.12.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:4f0031eaa7b921db76decd73636ef3a12c942ed367d8c3841a0739412b260a54"},
-    {file = "black-23.12.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:97e56155c6b737854e60a9ab1c598ff2533d57e7506d97af5481141671abf3ea"},
-    {file = "black-23.12.1-cp39-cp39-win_amd64.whl", hash = "sha256:dd15245c8b68fe2b6bd0f32c1556509d11bb33aec9b5d0866dd8e2ed3dba09c2"},
-    {file = "black-23.12.1-py3-none-any.whl", hash = "sha256:78baad24af0f033958cad29731e27363183e140962595def56423e626f4bee3e"},
-    {file = "black-23.12.1.tar.gz", hash = "sha256:4ce3ef14ebe8d9509188014d96af1c456a910d5b5cbf434a09fef7e024b3d0d5"},
+    {file = "black-24.3.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:7d5e026f8da0322b5662fa7a8e752b3fa2dac1c1cbc213c3d7ff9bdd0ab12395"},
+    {file = "black-24.3.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:9f50ea1132e2189d8dff0115ab75b65590a3e97de1e143795adb4ce317934995"},
+    {file = "black-24.3.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e2af80566f43c85f5797365077fb64a393861a3730bd110971ab7a0c94e873e7"},
+    {file = "black-24.3.0-cp310-cp310-win_amd64.whl", hash = "sha256:4be5bb28e090456adfc1255e03967fb67ca846a03be7aadf6249096100ee32d0"},
+    {file = "black-24.3.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:4f1373a7808a8f135b774039f61d59e4be7eb56b2513d3d2f02a8b9365b8a8a9"},
+    {file = "black-24.3.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:aadf7a02d947936ee418777e0247ea114f78aff0d0959461057cae8a04f20597"},
+    {file = "black-24.3.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:65c02e4ea2ae09d16314d30912a58ada9a5c4fdfedf9512d23326128ac08ac3d"},
+    {file = "black-24.3.0-cp311-cp311-win_amd64.whl", hash = "sha256:bf21b7b230718a5f08bd32d5e4f1db7fc8788345c8aea1d155fc17852b3410f5"},
+    {file = "black-24.3.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:2818cf72dfd5d289e48f37ccfa08b460bf469e67fb7c4abb07edc2e9f16fb63f"},
+    {file = "black-24.3.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:4acf672def7eb1725f41f38bf6bf425c8237248bb0804faa3965c036f7672d11"},
+    {file = "black-24.3.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c7ed6668cbbfcd231fa0dc1b137d3e40c04c7f786e626b405c62bcd5db5857e4"},
+    {file = "black-24.3.0-cp312-cp312-win_amd64.whl", hash = "sha256:56f52cfbd3dabe2798d76dbdd299faa046a901041faf2cf33288bc4e6dae57b5"},
+    {file = "black-24.3.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:79dcf34b33e38ed1b17434693763301d7ccbd1c5860674a8f871bd15139e7837"},
+    {file = "black-24.3.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:e19cb1c6365fd6dc38a6eae2dcb691d7d83935c10215aef8e6c38edee3f77abd"},
+    {file = "black-24.3.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:65b76c275e4c1c5ce6e9870911384bff5ca31ab63d19c76811cb1fb162678213"},
+    {file = "black-24.3.0-cp38-cp38-win_amd64.whl", hash = "sha256:b5991d523eee14756f3c8d5df5231550ae8993e2286b8014e2fdea7156ed0959"},
+    {file = "black-24.3.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:c45f8dff244b3c431b36e3224b6be4a127c6aca780853574c00faf99258041eb"},
+    {file = "black-24.3.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:6905238a754ceb7788a73f02b45637d820b2f5478b20fec82ea865e4f5d4d9f7"},
+    {file = "black-24.3.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d7de8d330763c66663661a1ffd432274a2f92f07feeddd89ffd085b5744f85e7"},
+    {file = "black-24.3.0-cp39-cp39-win_amd64.whl", hash = "sha256:7bb041dca0d784697af4646d3b62ba4a6b028276ae878e53f6b4f74ddd6db99f"},
+    {file = "black-24.3.0-py3-none-any.whl", hash = "sha256:41622020d7120e01d377f74249e677039d20e6344ff5851de8a10f11f513bf93"},
+    {file = "black-24.3.0.tar.gz", hash = "sha256:a0c9c4a0771afc6919578cec71ce82a3e31e054904e7197deacbc9382671c41f"},
 ]
 
 [package.dependencies]
@@ -328,13 +328,13 @@ colorama = ">=0.4"
 
 [[package]]
 name = "idna"
-version = "3.6"
+version = "3.7"
 description = "Internationalized Domain Names in Applications (IDNA)"
 optional = false
 python-versions = ">=3.5"
 files = [
-    {file = "idna-3.6-py3-none-any.whl", hash = "sha256:c05567e9c24a6b9faaa835c4821bad0590fbb9d5779e7caa6e1cc4978e7eb24f"},
-    {file = "idna-3.6.tar.gz", hash = "sha256:9ecdbbd083b06798ae1e86adcbfe8ab1479cf864e4ee30fe4e46a003d12491ca"},
+    {file = "idna-3.7-py3-none-any.whl", hash = "sha256:82fee1fc78add43492d3a1898bfa6d8a904cc97d8427f683ed8e798d07761aa0"},
+    {file = "idna-3.7.tar.gz", hash = "sha256:028ff3aadf0609c1fd278d8ea3089299412a7a8b9bd005dd08b9f8285bcb5cfc"},
 ]
 
 [[package]]
@@ -1249,4 +1249,4 @@ testing = ["big-O", "jaraco.functools", "jaraco.itertools", "more-itertools", "p
 [metadata]
 lock-version = "2.0"
 python-versions = "^3.8"
-content-hash = "f4ad737b24c3992e5060ab2a08aa88bd67635c7f2a6f0f854cd7d325ac9dddd2"
+content-hash = "e29863e4f33eb0046c65ae158f498bc02ceb3e5f1cc830220ba087a261857db9"
diff --git a/pyproject.toml b/pyproject.toml
index 1975eb4..8db391e 100644
--- a/pyproject.toml
+++ b/pyproject.toml
@@ -46,7 +46,7 @@ pytest = "^7.0"
 pytest-cov = "^3.0"
 pytest-mock = "^3.7"
 mkdocs = "^1.4"
-black = "^23.3.0"
+black = "^24.3.0"
 mike = "^2.0.0"
 mypy = "^1.8"
 types-requests = "^2.31.0.20240125"
diff --git a/release-checklist.md b/release-checklist.md
deleted file mode 100644
index 5219a9c..0000000
--- a/release-checklist.md
+++ /dev/null
@@ -1,14 +0,0 @@
-1. Update documentation  
-    a) update Changelog: version, date, descriptions of changes, any links within docs
-    b) rebuild docs using mike:
-        - mike --rebase (optional, to fetch remote version of docs to your local branch)
-        - mike deploy [version] [alias] --push
-        - mike set-default [version]
-2. Verify poetry.lock & requirements are up-to-date  
-    a) poetry update / poetry update [package1] [ package2]  
-    b) poetry install
-3. Update version.py & pyproject.toml
-4. Commit changes to repo & run CI & coverage
-5. Create a new github release
-6. Build package in poetry (poetry build)
-7. Publish to PyPI (poetry publish)
\ No newline at end of file
diff --git a/requirements.txt b/requirements.txt
index e2b1f0e..b4132b6 100644
--- a/requirements.txt
+++ b/requirements.txt
@@ -92,9 +92,9 @@ charset-normalizer==3.3.2 ; python_version >= "3.8" and python_version < "4.0" \
     --hash=sha256:fb69256e180cb6c8a894fee62b3afebae785babc1ee98b81cdf68bbca1987f33 \
     --hash=sha256:fd1abc0d89e30cc4e02e4064dc67fcc51bd941eb395c502aac3ec19fab46b519 \
     --hash=sha256:ff8fa367d09b717b2a17a052544193ad76cd49979c805768879cb63d9ca50561
-idna==3.6 ; python_version >= "3.8" and python_version < "4.0" \
-    --hash=sha256:9ecdbbd083b06798ae1e86adcbfe8ab1479cf864e4ee30fe4e46a003d12491ca \
-    --hash=sha256:c05567e9c24a6b9faaa835c4821bad0590fbb9d5779e7caa6e1cc4978e7eb24f
+idna==3.7 ; python_version >= "3.8" and python_version < "4.0" \
+    --hash=sha256:028ff3aadf0609c1fd278d8ea3089299412a7a8b9bd005dd08b9f8285bcb5cfc \
+    --hash=sha256:82fee1fc78add43492d3a1898bfa6d8a904cc97d8427f683ed8e798d07761aa0
 requests==2.31.0 ; python_version >= "3.8" and python_version < "4.0" \
     --hash=sha256:58cd2187c01e70e6e26505bca751777aa9f2ee0b7f4300988b709f44e013003f \
     --hash=sha256:942c5a758f98d790eaed1a29cb6eefc7ffb0d1cf7af05c3d2791656dbd6ad1e1


Test patch:
diff --git a/tests/conftest.py b/tests/conftest.py
index 95ff734..9532720 100644
--- a/tests/conftest.py
+++ b/tests/conftest.py
@@ -38,7 +38,7 @@ def stub_holding_xml():
 @pytest.fixture
 def stub_marc21():
     fh = os.path.join(
-        os.environ["USERPROFILE"], "github/bookops-worldcat/temp/test.mrc"
+        os.environ["USERPROFILE"], "github/bookops-worldcat/tests/test.mrc"
     )
     with open(fh, "rb") as stub:
         stub_marc21 = stub.read()
diff --git a/tests/test.mrc b/tests/test.mrc
new file mode 100644
index 0000000..5b061b0
--- /dev/null
+++ b/tests/test.mrc
@@ -0,0 +1,1 @@
+00266nam a2200097 a 4500008004100000010001700041040002200058100002700080245001600107500004500123120827s2012    nyua          000 0 eng d  a   63011276   aOCWMSbengcOCWMS0 aOCLC Developer Network10aTest Record  aFOR OCLC DEVELOPER NETWORK DOCUMENTATION
\ No newline at end of file
diff --git a/tests/test_authorize.py b/tests/test_authorize.py
index 07625bb..84a7f1c 100644
--- a/tests/test_authorize.py
+++ b/tests/test_authorize.py
@@ -7,7 +7,6 @@
 
 
 from bookops_worldcat.authorize import WorldcatAccessToken
-from bookops_worldcat import __version__, __title__
 from bookops_worldcat.errors import WorldcatAuthorizationError
 
 
@@ -119,7 +118,7 @@ def test_scope_exceptions(self, argm, expectation, msg):
     @pytest.mark.parametrize(
         "argm,expectation",
         [
-            (None, (3, 3)),
+            (None, None),
             (1, 1),
             (0.5, 0.5),
             ((5, 5), (5, 5)),
@@ -201,7 +200,7 @@ def test_payload(self, mock_successful_post_token_response):
             "scope": "scope1",
         }
 
-    def test_post_token_request_timout(self, mock_credentials, mock_timeout):
+    def test_post_token_request_timeout(self, mock_credentials, mock_timeout):
         creds = mock_credentials
         with pytest.raises(WorldcatAuthorizationError):
             WorldcatAccessToken(
@@ -291,7 +290,7 @@ def test_post_token_request(
         assert token.oauth_server == "https://oauth.oclc.org"
         assert token.scopes == "scope1 scope2"
         assert token.server_response.json() == mock_oauth_server_response.json()
-        assert token.timeout == (3, 3)
+        assert token.timeout == (5, 5)
 
     def test_token_repr(
         self,
@@ -342,3 +341,38 @@ def test_post_token_request_with_live_service(self, live_keys):
         assert token.token_str.startswith("tk_")
         assert token.is_expired() is False
         assert isinstance(token.token_expires_at, datetime.datetime)
+
+    @pytest.mark.webtest
+    def test_post_token_request_with_live_service_no_timeout(self, live_keys):
+        token = WorldcatAccessToken(
+            key=os.getenv("WCKey"),
+            secret=os.getenv("WCSecret"),
+            scopes=os.getenv("WCScopes"),
+            timeout=None,
+        )
+
+        assert token.server_response.status_code == 200
+
+        # test presence of all returned parameters
+        response = token.server_response.json()
+        params = [
+            "access_token",
+            "expires_at",
+            "authenticating_institution_id",
+            "principalID",
+            "context_institution_id",
+            "scopes",
+            "token_type",
+            "expires_in",
+            "principalIDNS",
+        ]
+        for p in params:
+            assert p in response
+
+        # test if any new additions are present
+        assert sorted(params) == sorted(response.keys())
+
+        # test if token looks right
+        assert token.token_str.startswith("tk_")
+        assert token.is_expired() is False
+        assert isinstance(token.token_expires_at, datetime.datetime)
diff --git a/tests/test_metadata_api.py b/tests/test_metadata_api.py
index 0f18459..cd29b6d 100644
--- a/tests/test_metadata_api.py
+++ b/tests/test_metadata_api.py
@@ -288,33 +288,36 @@ def test_bib_get_classification_no_oclcNumber_passed(self, stub_session):
         with pytest.raises(TypeError):
             stub_session.bib_get_classification()
 
-    @pytest.mark.http_code(207)
-    def test_bib_get_current_oclc_number(self, stub_session, mock_session_response):
-        assert (
-            stub_session.bib_get_current_oclc_number(
-                oclcNumbers=["12345", "65891"]
-            ).status_code
-            == 207
-        )
-
-    @pytest.mark.http_code(207)
-    def test_bib_get_current_oclc_number_passed_as_str(
-        self, stub_session, mock_session_response
+    @pytest.mark.parametrize(
+        "argm", ["12345, 65891", ["12345", "65891"], 12345, ["12345", 12345]]
+    )
+    @pytest.mark.http_code(200)
+    def test_bib_get_current_oclc_number(
+        self, argm, stub_session, mock_session_response
     ):
         assert (
-            stub_session.bib_get_current_oclc_number(
-                oclcNumbers="12345,65891"
-            ).status_code
-            == 207
+            stub_session.bib_get_current_oclc_number(oclcNumbers=argm).status_code
+            == 200
         )
 
     @pytest.mark.parametrize("argm", [(None), (""), ([])])
     def test_bib_get_current_oclc_number_missing_numbers(self, stub_session, argm):
-        err_msg = "Argument 'oclcNumbers' must be a list or comma separated string of valid OCLC #s."
+        err_msg = "Argument 'oclcNumbers' must be a single integer, a list or a comma separated string of valid OCLC #s."
         with pytest.raises(InvalidOclcNumber) as exc:
             stub_session.bib_get_current_oclc_number(argm)
         assert err_msg in str(exc.value)
 
+    def test_bib_get_current_oclc_number_too_many_oclcNumbers_passed(
+        self, stub_session
+    ):
+        with pytest.raises(ValueError) as exc:
+            stub_session.bib_get_current_oclc_number(
+                oclcNumbers=[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11]
+            )
+        assert "Too many OCLC Numbers passed to 'oclcNumbers' argument." in str(
+            exc.value
+        )
+
     @pytest.mark.http_code(200)
     def test_bib_match(self, stub_session, mock_session_response, stub_marc_xml):
         assert (
@@ -417,9 +420,13 @@ def test_brief_bibs_get_other_editions_invalid_oclc_number(self, stub_session):
     def test_holdings_get_codes(self, stub_session, mock_session_response):
         assert stub_session.holdings_get_codes().status_code == 200
 
+    @pytest.mark.parametrize(
+        "argm",
+        ["12345", 12345, ["12345", 12345], "12345, 67890"],
+    )
     @pytest.mark.http_code(200)
-    def test_holdings_get_current(self, stub_session, mock_session_response):
-        assert stub_session.holdings_get_current("12345").status_code == 200
+    def test_holdings_get_current(self, argm, stub_session, mock_session_response):
+        assert stub_session.holdings_get_current(argm).status_code == 200
 
     def test_holdings_get_current_no_oclcNumber_passed(self, stub_session):
         with pytest.raises(TypeError):
diff --git a/tests/test_utils.py b/tests/test_utils.py
index e3101c1..e4fb10d 100644
--- a/tests/test_utils.py
+++ b/tests/test_utils.py
@@ -17,10 +17,16 @@ class TestUtils:
     @pytest.mark.parametrize(
         "argm,expectation",
         [
-            ("ocm00012345", "12345"),
-            ("ocn00012346", "12346"),
-            ("on000012347", "12347"),
-            (" ocm00012348", "12348"),
+            ("ocm00054321", "54321"),
+            ("ocm11111", "11111"),
+            ("ocn123456789", "123456789"),
+            ("on1234567890", "1234567890"),
+            ("on12345678901", "12345678901"),
+            (" ocn000111111", "111111"),
+            ("00012345", "12345"),
+            ("11111", "11111"),
+            ("(OCoLC)00012345", "12345"),
+            (" (OCoLC)00012349", "12349"),
         ],
     )
     def test_prep_oclc_number_str(self, argm, expectation):
@@ -84,12 +90,15 @@ def test_verify_oclc_number_exceptions(self, argm, expectation, msg):
     @pytest.mark.parametrize(
         "argm,expectation",
         [
-            ("000012345", "12345"),
-            (12345, "12345"),
-            ("ocm00012345", "12345"),
-            ("ocn00012345", "12345"),
-            ("ocn12345", "12345"),
-            (" on12345 \n", "12345"),
+            ("00011111", "11111"),
+            (12345678901, "12345678901"),
+            (2222, "2222"),
+            ("ocm00001234", "1234"),
+            ("ocm12345678", "12345678"),
+            ("ocn123456789", "123456789"),
+            (" on1111111111 \n", "1111111111"),
+            ("(OCoLC)00012345", "12345"),
+            ("(OCoLC)00012345", "12345"),
         ],
     )
     def test_verify_oclc_number_success(self, argm, expectation):
@@ -101,27 +110,27 @@ def test_verify_oclc_number_success(self, argm, expectation):
             (
                 None,
                 pytest.raises(InvalidOclcNumber),
-                "Argument 'oclcNumbers' must be a list or comma separated string of valid OCLC #s.",
+                "Argument 'oclcNumbers' must be a single integer, a list or a comma separated string of valid OCLC #s.",
             ),
             (
                 "",
                 pytest.raises(InvalidOclcNumber),
-                "Argument 'oclcNumbers' must be a list or comma separated string of valid OCLC #s.",
+                "Argument 'oclcNumbers' must be a single integer, a list or a comma separated string of valid OCLC #s.",
             ),
             (
                 [],
                 pytest.raises(InvalidOclcNumber),
-                "Argument 'oclcNumbers' must be a list or comma separated string of valid OCLC #s.",
+                "Argument 'oclcNumbers' must be a single integer, a list or a comma separated string of valid OCLC #s.",
             ),
             (
                 ",,",
                 pytest.raises(InvalidOclcNumber),
-                "Argument 'oclcNumbers' must be a list or comma separated string of valid OCLC #s.",
+                "Argument 'oclcNumbers' must be a single integer, a list or a comma separated string of valid OCLC #s.",
             ),
             (
                 12345.5,
                 pytest.raises(InvalidOclcNumber),
-                "Argument 'oclcNumbers' must be a list or comma separated string of valid OCLC #s.",
+                "Argument 'oclcNumbers' must be a single integer, a list or a comma separated string of valid OCLC #s.",
             ),
             (
                 "bt12345",
@@ -133,6 +142,26 @@ def test_verify_oclc_number_success(self, argm, expectation):
                 pytest.raises(InvalidOclcNumber),
                 "Argument 'oclcNumber' does not look like real OCLC #.",
             ),
+            (
+                "ocm123456789",
+                pytest.raises(InvalidOclcNumber),
+                "Argument 'oclcNumber' does not look like real OCLC #.",
+            ),
+            (
+                "ocn1",
+                pytest.raises(InvalidOclcNumber),
+                "Argument 'oclcNumber' does not look like real OCLC #.",
+            ),
+            (
+                "ocn1234567890",
+                pytest.raises(InvalidOclcNumber),
+                "Argument 'oclcNumber' does not look like real OCLC #.",
+            ),
+            (
+                "on1",
+                pytest.raises(InvalidOclcNumber),
+                "Argument 'oclcNumber' does not look like real OCLC #.",
+            ),
         ],
     )
     def test_verify_oclc_numbers_exceptions(self, argm, expectation, msg):
@@ -143,11 +172,24 @@ def test_verify_oclc_numbers_exceptions(self, argm, expectation, msg):
     @pytest.mark.parametrize(
         "argm,expectation",
         [
-            ("12345", ["12345"]),
-            ("12345,67890", ["12345", "67890"]),
-            ("ocm0012345, ocm67890", ["12345", "67890"]),
-            ([12345, 67890], ["12345", "67890"]),
-            (["ocn12345", "on67890"], ["12345", "67890"]),
+            ("1111", ["1111"]),
+            ("1111, ocm00002222", ["1111", "2222"]),
+            (
+                "ocm00012345, ocn123456789, on1234567890, (OCoLC)00067890",
+                ["12345", "123456789", "1234567890", "67890"],
+            ),
+            (123456789, ["123456789"]),
+            ([11111, "(OCoLC)00022222"], ["11111", "22222"]),
+            (
+                [
+                    "ocm11111",
+                    "ocm10000001",
+                    "ocm01111111",
+                    "ocn100000001",
+                    "on1000000001",
+                ],
+                ["11111", "10000001", "1111111", "100000001", "1000000001"],
+            ),
         ],
     )
     def test_verify_oclc_numbers_parsing(self, argm, expectation):