From 64564cd3df8ac0da223aa31f43eb08a532d0c1cd Mon Sep 17 00:00:00 2001
From: "stainless-app[bot]"
 <142633134+stainless-app[bot]@users.noreply.github.com>
Date: Tue, 23 Sep 2025 11:10:17 +0000
Subject: [PATCH 1/7] chore: sync repo
---
 .github/workflows/ci.yml                      |  10 +-
 .github/workflows/publish-pypi.yml            |  31 --
 .github/workflows/release-doctor.yml          |  21 -
 .release-please-manifest.json                 |   3 -
 CHANGELOG.md                                  |  60 ---
 CONTRIBUTING.md                               |   6 +-
 LICENSE                                       |   2 +-
 README.md                                     | 137 ++---
 SECURITY.md                                   |   6 +-
 api.md                                        | 161 ++----
 bin/check-release-environment                 |  21 -
 release-please-config.json                    |  66 ---
 requirements-dev.lock                         |  16 +-
 requirements.lock                             |  16 +-
 scripts/bootstrap                             |  14 +-
 scripts/lint                                  |   2 +-
 scripts/utils/upload-artifact.sh              |   2 +-
 src/legalesign/pagination.py                  |  56 --
 src/legalesign/resources/__init__.py          | 201 --------
 src/legalesign/resources/attachment.py        | 482 -----------------
 src/legalesign/resources/invited.py           | 253 ---------
 src/legalesign/resources/member.py            | 487 ------------------
 src/legalesign/resources/notifications.py     | 135 -----
 src/legalesign/resources/pdf.py               | 318 ------------
 src/legalesign/resources/status.py            | 280 ----------
 src/legalesign/resources/subscribe.py         | 197 -------
 src/legalesign/resources/unsubscribe.py       | 191 -------
 src/legalesign/resources/user.py              | 402 ---------------
 .../types/attachment_list_params.py           |  21 -
 .../types/attachment_list_response.py         |  15 -
 src/legalesign/types/attachment_response.py   |  26 -
 .../types/attachment_upload_params.py         |  27 -
 .../types/document_preview_params.py          |  17 -
 src/legalesign/types/group_update_params.py   |  11 -
 src/legalesign/types/invited_list_params.py   |  12 -
 src/legalesign/types/invited_list_response.py |  25 -
 src/legalesign/types/member_create_params.py  |  29 --
 src/legalesign/types/member_list_params.py    |  21 -
 src/legalesign/types/member_list_response.py  |  15 -
 src/legalesign/types/member_response.py       |  32 --
 .../types/notification_list_response.py       |  25 -
 .../types/pdf_create_preview_params.py        |  34 --
 src/legalesign/types/permissions_enum.py      |   7 -
 .../signer_get_rejection_reason_response.py   |  13 -
 src/legalesign/types/signer_reset_params.py   |  15 -
 .../types/status_retrieve_all_params.py       |  21 -
 .../types/status_retrieve_all_response.py     |  15 -
 .../types/subscribe_create_webhook_params.py  |  25 -
 src/legalesign/types/timezone_enum.py         | 438 ----------------
 .../unsubscribe_delete_webhook_params.py      |  20 -
 src/legalesign/types/user_create_params.py    |  40 --
 .../types/user_retrieve_response.py           |  30 --
 src/legalesign/types/user_update_params.py    |  13 -
 .../types/webhook_event_filter_enum.py        |  19 -
 .../__init__.py                               |  16 +-
 .../_base_client.py                           |   2 +-
 src/{legalesign => legalesign_sdk}/_client.py | 146 ++----
 src/{legalesign => legalesign_sdk}/_compat.py |   0
 .../_constants.py                             |   0
 .../_exceptions.py                            |   4 +-
 src/{legalesign => legalesign_sdk}/_files.py  |   0
 src/{legalesign => legalesign_sdk}/_models.py |   0
 src/{legalesign => legalesign_sdk}/_qs.py     |   0
 .../_resource.py                              |  10 +-
 .../_response.py                              |  12 +-
 .../_streaming.py                             |   6 +-
 src/{legalesign => legalesign_sdk}/_types.py  |   2 +-
 .../_utils/__init__.py                        |   0
 .../_utils/_compat.py                         |   0
 .../_utils/_datetime_parse.py                 |   0
 .../_utils/_logs.py                           |   6 +-
 .../_utils/_proxy.py                          |   0
 .../_utils/_reflection.py                     |   0
 .../_utils/_resources_proxy.py                |   8 +-
 .../_utils/_streams.py                        |   0
 .../_utils/_sync.py                           |   0
 .../_utils/_transform.py                      |   0
 .../_utils/_typing.py                         |   0
 .../_utils/_utils.py                          |   0
 .../_version.py                               |   0
 src/{legalesign => legalesign_sdk}/lib/.keep  |   0
 src/{legalesign => legalesign_sdk}/py.typed   |   0
 src/legalesign_sdk/resources/__init__.py      | 103 ++++
 .../resources/document.py                     | 262 ++--------
 .../resources/group.py                        |  94 +---
 src/legalesign_sdk/resources/pdf.py           | 172 +++++++
 .../resources/signer.py                       | 195 +------
 src/legalesign_sdk/resources/status.py        | 163 ++++++
 .../resources/template.py                     |  92 +---
 .../resources/templatepdf/__init__.py         |   0
 .../resources/templatepdf/fields.py           |   8 +-
 .../resources/templatepdf/templatepdf.py      | 168 +-----
 .../types/__init__.py                         |  28 +-
 .../types/document_create_params.py           |   0
 .../types/document_create_response.py         |   0
 .../types/document_get_fields_response.py     |   0
 .../types/document_list_params.py             |   0
 .../types/document_list_response.py           |   0
 .../types/document_retrieve_response.py       |   0
 .../types/document_status_enum.py             |   0
 .../types/group_create_params.py              |   0
 .../types/group_list_params.py                |   0
 .../types/group_list_response.py              |   0
 .../types/group_retrieve_response.py          |   0
 .../types/list_meta.py                        |   0
 .../types/pdf_field_validation_enum.py        |   0
 .../types/signer_retrieve_fields_response.py  |   0
 .../types/signer_retrieve_response.py         |   0
 .../types/signer_send_reminder_params.py      |   0
 .../types/signer_status_enum.py               |   0
 .../types/status_retrieve_response.py}        |   4 +-
 .../types/template_create_params.py           |   0
 .../types/template_list_params.py             |   0
 .../types/template_list_response.py           |   0
 .../types/template_pdf.py                     |   0
 .../types/template_retrieve_response.py       |   0
 .../types/template_update_params.py           |   0
 .../types/templatepdf/__init__.py             |   0
 .../types/templatepdf/field_create_params.py  |   0
 .../types/templatepdf/field_list_response.py  |   0
 .../types/templatepdf_create_params.py        |   0
 .../templatepdf_get_edit_link_response.py     |   0
 .../types/templatepdf_list_params.py          |   0
 .../types/templatepdf_list_response.py        |   0
 .../api_resources/templatepdf/test_fields.py  |  36 +-
 tests/api_resources/test_attachment.py        | 375 --------------
 tests/api_resources/test_document.py          | 358 +++----------
 tests/api_resources/test_group.py             | 157 +-----
 tests/api_resources/test_invited.py           | 180 -------
 tests/api_resources/test_member.py            | 367 -------------
 tests/api_resources/test_notifications.py     |  80 ---
 tests/api_resources/test_pdf.py               | 176 +------
 tests/api_resources/test_signer.py            | 272 ++--------
 tests/api_resources/test_status.py            | 108 +---
 tests/api_resources/test_subscribe.py         | 118 -----
 tests/api_resources/test_template.py          | 152 ++----
 tests/api_resources/test_templatepdf.py       | 236 ++-------
 tests/api_resources/test_unsubscribe.py       | 110 ----
 tests/api_resources/test_user.py              | 320 ------------
 tests/conftest.py                             |  14 +-
 tests/test_client.py                          | 256 ++++-----
 tests/test_deepcopy.py                        |   2 +-
 tests/test_extract_files.py                   |   4 +-
 tests/test_files.py                           |   2 +-
 tests/test_models.py                          |   6 +-
 tests/test_qs.py                              |   2 +-
 tests/test_required_args.py                   |   2 +-
 tests/test_response.py                        |  38 +-
 tests/test_streaming.py                       |  34 +-
 tests/test_transform.py                       |   8 +-
 tests/test_utils/test_datetime_parse.py       |   2 +-
 tests/test_utils/test_proxy.py                |   2 +-
 tests/test_utils/test_typing.py               |   2 +-
 tests/utils.py                                |   8 +-
 154 files changed, 1173 insertions(+), 8297 deletions(-)
 delete mode 100644 .github/workflows/publish-pypi.yml
 delete mode 100644 .github/workflows/release-doctor.yml
 delete mode 100644 .release-please-manifest.json
 delete mode 100644 CHANGELOG.md
 delete mode 100644 bin/check-release-environment
 delete mode 100644 release-please-config.json
 delete mode 100644 src/legalesign/pagination.py
 delete mode 100644 src/legalesign/resources/__init__.py
 delete mode 100644 src/legalesign/resources/attachment.py
 delete mode 100644 src/legalesign/resources/invited.py
 delete mode 100644 src/legalesign/resources/member.py
 delete mode 100644 src/legalesign/resources/notifications.py
 delete mode 100644 src/legalesign/resources/pdf.py
 delete mode 100644 src/legalesign/resources/status.py
 delete mode 100644 src/legalesign/resources/subscribe.py
 delete mode 100644 src/legalesign/resources/unsubscribe.py
 delete mode 100644 src/legalesign/resources/user.py
 delete mode 100644 src/legalesign/types/attachment_list_params.py
 delete mode 100644 src/legalesign/types/attachment_list_response.py
 delete mode 100644 src/legalesign/types/attachment_response.py
 delete mode 100644 src/legalesign/types/attachment_upload_params.py
 delete mode 100644 src/legalesign/types/document_preview_params.py
 delete mode 100644 src/legalesign/types/group_update_params.py
 delete mode 100644 src/legalesign/types/invited_list_params.py
 delete mode 100644 src/legalesign/types/invited_list_response.py
 delete mode 100644 src/legalesign/types/member_create_params.py
 delete mode 100644 src/legalesign/types/member_list_params.py
 delete mode 100644 src/legalesign/types/member_list_response.py
 delete mode 100644 src/legalesign/types/member_response.py
 delete mode 100644 src/legalesign/types/notification_list_response.py
 delete mode 100644 src/legalesign/types/pdf_create_preview_params.py
 delete mode 100644 src/legalesign/types/permissions_enum.py
 delete mode 100644 src/legalesign/types/signer_get_rejection_reason_response.py
 delete mode 100644 src/legalesign/types/signer_reset_params.py
 delete mode 100644 src/legalesign/types/status_retrieve_all_params.py
 delete mode 100644 src/legalesign/types/status_retrieve_all_response.py
 delete mode 100644 src/legalesign/types/subscribe_create_webhook_params.py
 delete mode 100644 src/legalesign/types/timezone_enum.py
 delete mode 100644 src/legalesign/types/unsubscribe_delete_webhook_params.py
 delete mode 100644 src/legalesign/types/user_create_params.py
 delete mode 100644 src/legalesign/types/user_retrieve_response.py
 delete mode 100644 src/legalesign/types/user_update_params.py
 delete mode 100644 src/legalesign/types/webhook_event_filter_enum.py
 rename src/{legalesign => legalesign_sdk}/__init__.py (89%)
 rename src/{legalesign => legalesign_sdk}/_base_client.py (99%)
 rename src/{legalesign => legalesign_sdk}/_client.py (72%)
 rename src/{legalesign => legalesign_sdk}/_compat.py (100%)
 rename src/{legalesign => legalesign_sdk}/_constants.py (100%)
 rename src/{legalesign => legalesign_sdk}/_exceptions.py (97%)
 rename src/{legalesign => legalesign_sdk}/_files.py (100%)
 rename src/{legalesign => legalesign_sdk}/_models.py (100%)
 rename src/{legalesign => legalesign_sdk}/_qs.py (100%)
 rename src/{legalesign => legalesign_sdk}/_resource.py (79%)
 rename src/{legalesign => legalesign_sdk}/_response.py (98%)
 rename src/{legalesign => legalesign_sdk}/_streaming.py (98%)
 rename src/{legalesign => legalesign_sdk}/_types.py (99%)
 rename src/{legalesign => legalesign_sdk}/_utils/__init__.py (100%)
 rename src/{legalesign => legalesign_sdk}/_utils/_compat.py (100%)
 rename src/{legalesign => legalesign_sdk}/_utils/_datetime_parse.py (100%)
 rename src/{legalesign => legalesign_sdk}/_utils/_logs.py (69%)
 rename src/{legalesign => legalesign_sdk}/_utils/_proxy.py (100%)
 rename src/{legalesign => legalesign_sdk}/_utils/_reflection.py (100%)
 rename src/{legalesign => legalesign_sdk}/_utils/_resources_proxy.py (50%)
 rename src/{legalesign => legalesign_sdk}/_utils/_streams.py (100%)
 rename src/{legalesign => legalesign_sdk}/_utils/_sync.py (100%)
 rename src/{legalesign => legalesign_sdk}/_utils/_transform.py (100%)
 rename src/{legalesign => legalesign_sdk}/_utils/_typing.py (100%)
 rename src/{legalesign => legalesign_sdk}/_utils/_utils.py (100%)
 rename src/{legalesign => legalesign_sdk}/_version.py (100%)
 rename src/{legalesign => legalesign_sdk}/lib/.keep (100%)
 rename src/{legalesign => legalesign_sdk}/py.typed (100%)
 create mode 100644 src/legalesign_sdk/resources/__init__.py
 rename src/{legalesign => legalesign_sdk}/resources/document.py (79%)
 rename src/{legalesign => legalesign_sdk}/resources/group.py (76%)
 create mode 100644 src/legalesign_sdk/resources/pdf.py
 rename src/{legalesign => legalesign_sdk}/resources/signer.py (66%)
 create mode 100644 src/legalesign_sdk/resources/status.py
 rename src/{legalesign => legalesign_sdk}/resources/template.py (82%)
 rename src/{legalesign => legalesign_sdk}/resources/templatepdf/__init__.py (100%)
 rename src/{legalesign => legalesign_sdk}/resources/templatepdf/fields.py (94%)
 rename src/{legalesign => legalesign_sdk}/resources/templatepdf/templatepdf.py (73%)
 rename src/{legalesign => legalesign_sdk}/types/__init__.py (51%)
 rename src/{legalesign => legalesign_sdk}/types/document_create_params.py (100%)
 rename src/{legalesign => legalesign_sdk}/types/document_create_response.py (100%)
 rename src/{legalesign => legalesign_sdk}/types/document_get_fields_response.py (100%)
 rename src/{legalesign => legalesign_sdk}/types/document_list_params.py (100%)
 rename src/{legalesign => legalesign_sdk}/types/document_list_response.py (100%)
 rename src/{legalesign => legalesign_sdk}/types/document_retrieve_response.py (100%)
 rename src/{legalesign => legalesign_sdk}/types/document_status_enum.py (100%)
 rename src/{legalesign => legalesign_sdk}/types/group_create_params.py (100%)
 rename src/{legalesign => legalesign_sdk}/types/group_list_params.py (100%)
 rename src/{legalesign => legalesign_sdk}/types/group_list_response.py (100%)
 rename src/{legalesign => legalesign_sdk}/types/group_retrieve_response.py (100%)
 rename src/{legalesign => legalesign_sdk}/types/list_meta.py (100%)
 rename src/{legalesign => legalesign_sdk}/types/pdf_field_validation_enum.py (100%)
 rename src/{legalesign => legalesign_sdk}/types/signer_retrieve_fields_response.py (100%)
 rename src/{legalesign => legalesign_sdk}/types/signer_retrieve_response.py (100%)
 rename src/{legalesign => legalesign_sdk}/types/signer_send_reminder_params.py (100%)
 rename src/{legalesign => legalesign_sdk}/types/signer_status_enum.py (100%)
 rename src/{legalesign/types/status_response.py => legalesign_sdk/types/status_retrieve_response.py} (90%)
 rename src/{legalesign => legalesign_sdk}/types/template_create_params.py (100%)
 rename src/{legalesign => legalesign_sdk}/types/template_list_params.py (100%)
 rename src/{legalesign => legalesign_sdk}/types/template_list_response.py (100%)
 rename src/{legalesign => legalesign_sdk}/types/template_pdf.py (100%)
 rename src/{legalesign => legalesign_sdk}/types/template_retrieve_response.py (100%)
 rename src/{legalesign => legalesign_sdk}/types/template_update_params.py (100%)
 rename src/{legalesign => legalesign_sdk}/types/templatepdf/__init__.py (100%)
 rename src/{legalesign => legalesign_sdk}/types/templatepdf/field_create_params.py (100%)
 rename src/{legalesign => legalesign_sdk}/types/templatepdf/field_list_response.py (100%)
 rename src/{legalesign => legalesign_sdk}/types/templatepdf_create_params.py (100%)
 rename src/{legalesign => legalesign_sdk}/types/templatepdf_get_edit_link_response.py (100%)
 rename src/{legalesign => legalesign_sdk}/types/templatepdf_list_params.py (100%)
 rename src/{legalesign => legalesign_sdk}/types/templatepdf_list_response.py (100%)
 delete mode 100644 tests/api_resources/test_attachment.py
 delete mode 100644 tests/api_resources/test_invited.py
 delete mode 100644 tests/api_resources/test_member.py
 delete mode 100644 tests/api_resources/test_notifications.py
 delete mode 100644 tests/api_resources/test_subscribe.py
 delete mode 100644 tests/api_resources/test_unsubscribe.py
 delete mode 100644 tests/api_resources/test_user.py
diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml
index c41a1d2..8e56d41 100644
--- a/.github/workflows/ci.yml
+++ b/.github/workflows/ci.yml
@@ -16,7 +16,7 @@ jobs:
   lint:
     timeout-minutes: 10
     name: lint
-    runs-on: ${{ github.repository == 'stainless-sdks/legalesign-python' && 'depot-ubuntu-24.04' || 'ubuntu-latest' }}
+    runs-on: ${{ github.repository == 'stainless-sdks/legalesign-sdk-python' && 'depot-ubuntu-24.04' || 'ubuntu-latest' }}
     if: github.event_name == 'push' || github.event.pull_request.head.repo.fork
     steps:
       - uses: actions/checkout@v4
@@ -42,7 +42,7 @@ jobs:
     permissions:
       contents: read
       id-token: write
-    runs-on: ${{ github.repository == 'stainless-sdks/legalesign-python' && 'depot-ubuntu-24.04' || 'ubuntu-latest' }}
+    runs-on: ${{ github.repository == 'stainless-sdks/legalesign-sdk-python' && 'depot-ubuntu-24.04' || 'ubuntu-latest' }}
     steps:
       - uses: actions/checkout@v4
 
@@ -61,14 +61,14 @@ jobs:
         run: rye build
 
       - name: Get GitHub OIDC Token
-        if: github.repository == 'stainless-sdks/legalesign-python'
+        if: github.repository == 'stainless-sdks/legalesign-sdk-python'
         id: github-oidc
         uses: actions/github-script@v6
         with:
           script: core.setOutput('github_token', await core.getIDToken());
 
       - name: Upload tarball
-        if: github.repository == 'stainless-sdks/legalesign-python'
+        if: github.repository == 'stainless-sdks/legalesign-sdk-python'
         env:
           URL: https://pkg.stainless.com/s
           AUTH: ${{ steps.github-oidc.outputs.github_token }}
@@ -78,7 +78,7 @@ jobs:
   test:
     timeout-minutes: 10
     name: test
-    runs-on: ${{ github.repository == 'stainless-sdks/legalesign-python' && 'depot-ubuntu-24.04' || 'ubuntu-latest' }}
+    runs-on: ${{ github.repository == 'stainless-sdks/legalesign-sdk-python' && 'depot-ubuntu-24.04' || 'ubuntu-latest' }}
     if: github.event_name == 'push' || github.event.pull_request.head.repo.fork
     steps:
       - uses: actions/checkout@v4
diff --git a/.github/workflows/publish-pypi.yml b/.github/workflows/publish-pypi.yml
deleted file mode 100644
index 7a18849..0000000
--- a/.github/workflows/publish-pypi.yml
+++ /dev/null
@@ -1,31 +0,0 @@
-# This workflow is triggered when a GitHub release is created.
-# It can also be run manually to re-publish to PyPI in case it failed for some reason.
-# You can run this workflow by navigating to https://www.github.com/legalesign/legalesign-rest-python/actions/workflows/publish-pypi.yml
-name: Publish PyPI
-on:
-  workflow_dispatch:
-
-  release:
-    types: [published]
-
-jobs:
-  publish:
-    name: publish
-    runs-on: ubuntu-latest
-
-    steps:
-      - uses: actions/checkout@v4
-
-      - name: Install Rye
-        run: |
-          curl -sSf https://rye.astral.sh/get | bash
-          echo "$HOME/.rye/shims" >> $GITHUB_PATH
-        env:
-          RYE_VERSION: '0.44.0'
-          RYE_INSTALL_OPTION: '--yes'
-
-      - name: Publish to PyPI
-        run: |
-          bash ./bin/publish-pypi
-        env:
-          PYPI_TOKEN: ${{ secrets.LEGALESIGN_PYPI_TOKEN || secrets.PYPI_TOKEN }}
diff --git a/.github/workflows/release-doctor.yml b/.github/workflows/release-doctor.yml
deleted file mode 100644
index 31c3d92..0000000
--- a/.github/workflows/release-doctor.yml
+++ /dev/null
@@ -1,21 +0,0 @@
-name: Release Doctor
-on:
-  pull_request:
-    branches:
-      - main
-  workflow_dispatch:
-
-jobs:
-  release_doctor:
-    name: release doctor
-    runs-on: ubuntu-latest
-    if: github.repository == 'legalesign/legalesign-rest-python' && (github.event_name == 'push' || github.event_name == 'workflow_dispatch' || startsWith(github.head_ref, 'release-please') || github.head_ref == 'next')
-
-    steps:
-      - uses: actions/checkout@v4
-
-      - name: Check release environment
-        run: |
-          bash ./bin/check-release-environment
-        env:
-          PYPI_TOKEN: ${{ secrets.LEGALESIGN_PYPI_TOKEN || secrets.PYPI_TOKEN }}
diff --git a/.release-please-manifest.json b/.release-please-manifest.json
deleted file mode 100644
index b55c11f..0000000
--- a/.release-please-manifest.json
+++ /dev/null
@@ -1,3 +0,0 @@
-{
-  ".": "1.1.1"
-}
\ No newline at end of file
diff --git a/CHANGELOG.md b/CHANGELOG.md
deleted file mode 100644
index 69f3412..0000000
--- a/CHANGELOG.md
+++ /dev/null
@@ -1,60 +0,0 @@
-# Changelog
-
-## 1.1.1 (2025-09-23)
-
-Full Changelog: [v1.1.0...v1.1.1](https://github.com/legalesign/legalesign-rest-python/compare/v1.1.0...v1.1.1)
-
-## 1.1.0 (2025-09-23)
-
-Full Changelog: [v1.1.0...v1.1.0](https://github.com/legalesign/legalesign-rest-python/compare/v1.1.0...v1.1.0)
-
-### Chores
-
-* update SDK settings ([c268865](https://github.com/legalesign/legalesign-rest-python/commit/c268865fc77e2bda0f87b34d4d7ff7a712f60beb))
-
-## 1.1.0 (2025-09-19)
-
-Full Changelog: [v1.0.0...v1.1.0](https://github.com/legalesign/legalesign-rest-python/compare/v1.0.0...v1.1.0)
-
-### Features
-
-* **api:** manual updates ([1307dba](https://github.com/legalesign/legalesign-rest-python/commit/1307dba268c1534ae692d673626df485d58625a8))
-
-## 1.0.0 (2025-09-19)
-
-Full Changelog: [v0.3.0...v1.0.0](https://github.com/legalesign/legalesign-rest-python/compare/v0.3.0...v1.0.0)
-
-## 0.3.0 (2025-09-19)
-
-Full Changelog: [v0.2.0...v0.3.0](https://github.com/legalesign/legalesign-rest-python/compare/v0.2.0...v0.3.0)
-
-### Features
-
-* **api:** manual updates ([178351d](https://github.com/legalesign/legalesign-rest-python/commit/178351dc08b44a57f0acec7f941abfe032feed3b))
-
-## 0.2.0 (2025-09-19)
-
-Full Changelog: [v0.1.0...v0.2.0](https://github.com/legalesign/legalesign-rest-python/compare/v0.1.0...v0.2.0)
-
-### Features
-
-* **api:** manual updates ([e4f9e6b](https://github.com/legalesign/legalesign-rest-python/commit/e4f9e6bc20b80109820e424ca023a0810f2a477d))
-* **api:** manual updates ([14390e5](https://github.com/legalesign/legalesign-rest-python/commit/14390e5c766511ac7b24d8c03e06ddaa6102f02d))
-
-## 0.1.0 (2025-09-19)
-
-Full Changelog: [v0.0.1...v0.1.0](https://github.com/legalesign/legalesign-rest-python/compare/v0.0.1...v0.1.0)
-
-### Features
-
-* **api:** api update ([edfcc59](https://github.com/legalesign/legalesign-rest-python/commit/edfcc598e815c95949609b478dc282fde4fcb3f4))
-* **api:** manual updates ([a2f6a45](https://github.com/legalesign/legalesign-rest-python/commit/a2f6a454d95b54dfbd73be4a75a4188f2a5f760c))
-* **api:** manual updates ([9cec340](https://github.com/legalesign/legalesign-rest-python/commit/9cec340083e9194eed62e043e146e741c3c1b07a))
-
-
-### Chores
-
-* configure new SDK language ([344b444](https://github.com/legalesign/legalesign-rest-python/commit/344b4448026766f35a7538ba0d80b86db6d0abd4))
-* **internal:** update pydantic dependency ([15cb7bb](https://github.com/legalesign/legalesign-rest-python/commit/15cb7bb6fe767a591b8ee7fad614bcdf5b427112))
-* **types:** change optional parameter type from NotGiven to Omit ([fa74419](https://github.com/legalesign/legalesign-rest-python/commit/fa74419c25b044b92c6798b7e462f4f8ae0299c8))
-* update SDK settings ([6a4ed0d](https://github.com/legalesign/legalesign-rest-python/commit/6a4ed0d330ef395b1014725facc1382ccd4c0c7e))
diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md
index 4129b44..d4304ec 100644
--- a/CONTRIBUTING.md
+++ b/CONTRIBUTING.md
@@ -36,7 +36,7 @@ $ pip install -r requirements-dev.lock
 
 Most of the SDK is generated code. Modifications to code will be persisted between generations, but may
 result in merge conflicts between manual patches and changes from the generator. The generator will never
-modify the contents of the `src/legalesign/lib/` and `examples/` directories.
+modify the contents of the `src/legalesign_sdk/lib/` and `examples/` directories.
 
 ## Adding and running examples
 
@@ -62,7 +62,7 @@ If you’d like to use the repository from source, you can either install from g
 To install via git:
 
 ```sh
-$ pip install git+ssh://git@github.com/legalesign/legalesign-rest-python.git
+$ pip install git+ssh://git@github.com/stainless-sdks/legalesign-sdk-python.git
 ```
 
 Alternatively, you can build from source and install the wheel file:
@@ -120,7 +120,7 @@ the changes aren't made through the automated pipeline, you may want to make rel
 
 ### Publish with a GitHub workflow
 
-You can release to package managers by using [the `Publish PyPI` GitHub action](https://www.github.com/legalesign/legalesign-rest-python/actions/workflows/publish-pypi.yml). This requires a setup organization or repository secret to be set up.
+You can release to package managers by using [the `Publish PyPI` GitHub action](https://www.github.com/stainless-sdks/legalesign-sdk-python/actions/workflows/publish-pypi.yml). This requires a setup organization or repository secret to be set up.
 
 ### Publish manually
 
diff --git a/LICENSE b/LICENSE
index 3dc4475..0fe9f76 100644
--- a/LICENSE
+++ b/LICENSE
@@ -186,7 +186,7 @@
       same "printed page" as the copyright notice for easier
       identification within third-party archives.
 
-   Copyright 2025 Legalesign
+   Copyright 2025 Legalesign SDK
 
    Licensed under the Apache License, Version 2.0 (the "License");
    you may not use this file except in compliance with the License.
diff --git a/README.md b/README.md
index bc55ebe..c7a408f 100644
--- a/README.md
+++ b/README.md
@@ -1,9 +1,9 @@
-# Legalesign Python API library
+# Legalesign SDK Python API library
 
 
-[)](https://pypi.org/project/legalesign/)
+[)](https://pypi.org/project/legalesign_sdk/)
 
-The Legalesign Python library provides convenient access to the Legalesign REST API from any Python 3.8+
+The Legalesign SDK Python library provides convenient access to the Legalesign SDK REST API from any Python 3.8+
 application. The library includes type definitions for all request params and response fields,
 and offers both synchronous and asynchronous clients powered by [httpx](https://github.com/encode/httpx).
 
@@ -16,48 +16,55 @@ The REST API documentation can be found on [legalesign.com](https://legalesign.c
 ## Installation
 
 ```sh
-# install from PyPI
-pip install legalesign
+# install from this staging repo
+pip install git+ssh://git@github.com/stainless-sdks/legalesign-sdk-python.git
 ```
 
+> [!NOTE]
+> Once this package is [published to PyPI](https://www.stainless.com/docs/guides/publish), this will become: `pip install legalesign_sdk`
+
 ## Usage
 
 The full API of this library can be found in [api.md](api.md).
 
 ```python
 import os
-from legalesign import Legalesign
+from legalesign_sdk import LegalesignSDK
 
-client = Legalesign(
-    api_key=os.environ.get("LEGALESIGN_API_KEY"),  # This is the default and can be omitted
+client = LegalesignSDK(
+    api_key=os.environ.get("LEGALESIGN_SDK_API_KEY"),  # This is the default and can be omitted
 )
 
-groups = client.group.list()
-print(groups.meta)
+documents = client.document.list(
+    group="REPLACE_ME",
+)
+print(documents.meta)
 ```
 
 While you can provide an `api_key` keyword argument,
 we recommend using [python-dotenv](https://pypi.org/project/python-dotenv/)
-to add `LEGALESIGN_API_KEY="My API Key"` to your `.env` file
+to add `LEGALESIGN_SDK_API_KEY="My API Key"` to your `.env` file
 so that your API Key is not stored in source control.
 
 ## Async usage
 
-Simply import `AsyncLegalesign` instead of `Legalesign` and use `await` with each API call:
+Simply import `AsyncLegalesignSDK` instead of `LegalesignSDK` and use `await` with each API call:
 
 ```python
 import os
 import asyncio
-from legalesign import AsyncLegalesign
+from legalesign_sdk import AsyncLegalesignSDK
 
-client = AsyncLegalesign(
-    api_key=os.environ.get("LEGALESIGN_API_KEY"),  # This is the default and can be omitted
+client = AsyncLegalesignSDK(
+    api_key=os.environ.get("LEGALESIGN_SDK_API_KEY"),  # This is the default and can be omitted
 )
 
 
 async def main() -> None:
-    groups = await client.group.list()
-    print(groups.meta)
+    documents = await client.document.list(
+        group="REPLACE_ME",
+    )
+    print(documents.meta)
 
 
 asyncio.run(main())
@@ -72,25 +79,27 @@ By default, the async client uses `httpx` for HTTP requests. However, for improv
 You can enable this by installing `aiohttp`:
 
 ```sh
-# install from PyPI
-pip install legalesign[aiohttp]
+# install from this staging repo
+pip install 'legalesign_sdk[aiohttp] @ git+ssh://git@github.com/stainless-sdks/legalesign-sdk-python.git'
 ```
 
 Then you can enable it by instantiating the client with `http_client=DefaultAioHttpClient()`:
 
 ```python
 import asyncio
-from legalesign import DefaultAioHttpClient
-from legalesign import AsyncLegalesign
+from legalesign_sdk import DefaultAioHttpClient
+from legalesign_sdk import AsyncLegalesignSDK
 
 
 async def main() -> None:
-    async with AsyncLegalesign(
+    async with AsyncLegalesignSDK(
         api_key="My API Key",
         http_client=DefaultAioHttpClient(),
     ) as client:
-        groups = await client.group.list()
-        print(groups.meta)
+        documents = await client.document.list(
+            group="REPLACE_ME",
+        )
+        print(documents.meta)
 
 
 asyncio.run(main())
@@ -107,27 +116,29 @@ Typed requests and responses provide autocomplete and documentation within your
 
 ## Handling errors
 
-When the library is unable to connect to the API (for example, due to network connection problems or a timeout), a subclass of `legalesign.APIConnectionError` is raised.
+When the library is unable to connect to the API (for example, due to network connection problems or a timeout), a subclass of `legalesign_sdk.APIConnectionError` is raised.
 
 When the API returns a non-success status code (that is, 4xx or 5xx
-response), a subclass of `legalesign.APIStatusError` is raised, containing `status_code` and `response` properties.
+response), a subclass of `legalesign_sdk.APIStatusError` is raised, containing `status_code` and `response` properties.
 
-All errors inherit from `legalesign.APIError`.
+All errors inherit from `legalesign_sdk.APIError`.
 
 ```python
-import legalesign
-from legalesign import Legalesign
+import legalesign_sdk
+from legalesign_sdk import LegalesignSDK
 
-client = Legalesign()
+client = LegalesignSDK()
 
 try:
-    client.group.list()
-except legalesign.APIConnectionError as e:
+    client.document.list(
+        group="REPLACE_ME",
+    )
+except legalesign_sdk.APIConnectionError as e:
     print("The server could not be reached")
     print(e.__cause__)  # an underlying Exception, likely raised within httpx.
-except legalesign.RateLimitError as e:
+except legalesign_sdk.RateLimitError as e:
     print("A 429 status code was received; we should back off a bit.")
-except legalesign.APIStatusError as e:
+except legalesign_sdk.APIStatusError as e:
     print("Another non-200-range status code was received")
     print(e.status_code)
     print(e.response)
@@ -155,16 +166,18 @@ Connection errors (for example, due to a network connectivity problem), 408 Requ
 You can use the `max_retries` option to configure or disable retry settings:
 
 ```python
-from legalesign import Legalesign
+from legalesign_sdk import LegalesignSDK
 
 # Configure the default for all requests:
-client = Legalesign(
+client = LegalesignSDK(
     # default is 2
     max_retries=0,
 )
 
 # Or, configure per-request:
-client.with_options(max_retries=5).group.list()
+client.with_options(max_retries=5).document.list(
+    group="REPLACE_ME",
+)
 ```
 
 ### Timeouts
@@ -173,21 +186,23 @@ By default requests time out after 1 minute. You can configure this with a `time
 which accepts a float or an [`httpx.Timeout`](https://www.python-httpx.org/advanced/timeouts/#fine-tuning-the-configuration) object:
 
 ```python
-from legalesign import Legalesign
+from legalesign_sdk import LegalesignSDK
 
 # Configure the default for all requests:
-client = Legalesign(
+client = LegalesignSDK(
     # 20 seconds (default is 1 minute)
     timeout=20.0,
 )
 
 # More granular control:
-client = Legalesign(
+client = LegalesignSDK(
     timeout=httpx.Timeout(60.0, read=5.0, write=10.0, connect=2.0),
 )
 
 # Override per-request:
-client.with_options(timeout=5.0).group.list()
+client.with_options(timeout=5.0).document.list(
+    group="REPLACE_ME",
+)
 ```
 
 On timeout, an `APITimeoutError` is thrown.
@@ -200,10 +215,10 @@ Note that requests that time out are [retried twice by default](#retries).
 
 We use the standard library [`logging`](https://docs.python.org/3/library/logging.html) module.
 
-You can enable logging by setting the environment variable `LEGALESIGN_LOG` to `info`.
+You can enable logging by setting the environment variable `LEGALESIGN_SDK_LOG` to `info`.
 
 ```shell
-$ export LEGALESIGN_LOG=info
+$ export LEGALESIGN_SDK_LOG=info
 ```
 
 Or to `debug` for more verbose logging.
@@ -225,19 +240,21 @@ if response.my_field is None:
 The "raw" Response object can be accessed by prefixing `.with_raw_response.` to any HTTP method call, e.g.,
 
 ```py
-from legalesign import Legalesign
+from legalesign_sdk import LegalesignSDK
 
-client = Legalesign()
-response = client.group.with_raw_response.list()
+client = LegalesignSDK()
+response = client.document.with_raw_response.list(
+    group="REPLACE_ME",
+)
 print(response.headers.get('X-My-Header'))
 
-group = response.parse()  # get the object that `group.list()` would have returned
-print(group.meta)
+document = response.parse()  # get the object that `document.list()` would have returned
+print(document.meta)
 ```
 
-These methods return an [`APIResponse`](https://github.com/legalesign/legalesign-rest-python/tree/main/src/legalesign/_response.py) object.
+These methods return an [`APIResponse`](https://github.com/stainless-sdks/legalesign-sdk-python/tree/main/src/legalesign_sdk/_response.py) object.
 
-The async client returns an [`AsyncAPIResponse`](https://github.com/legalesign/legalesign-rest-python/tree/main/src/legalesign/_response.py) with the same structure, the only difference being `await`able methods for reading the response content.
+The async client returns an [`AsyncAPIResponse`](https://github.com/stainless-sdks/legalesign-sdk-python/tree/main/src/legalesign_sdk/_response.py) with the same structure, the only difference being `await`able methods for reading the response content.
 
 #### `.with_streaming_response`
 
@@ -246,7 +263,9 @@ The above interface eagerly reads the full response body when you make the reque
 To stream the response body, use `.with_streaming_response` instead, which requires a context manager and only reads the response body once you call `.read()`, `.text()`, `.json()`, `.iter_bytes()`, `.iter_text()`, `.iter_lines()` or `.parse()`. In the async client, these are async methods.
 
 ```python
-with client.group.with_streaming_response.list() as response:
+with client.document.with_streaming_response.list(
+    group="REPLACE_ME",
+) as response:
     print(response.headers.get("X-My-Header"))
 
     for line in response.iter_lines():
@@ -299,10 +318,10 @@ You can directly override the [httpx client](https://www.python-httpx.org/api/#c
 
 ```python
 import httpx
-from legalesign import Legalesign, DefaultHttpxClient
+from legalesign_sdk import LegalesignSDK, DefaultHttpxClient
 
-client = Legalesign(
-    # Or use the `LEGALESIGN_BASE_URL` env var
+client = LegalesignSDK(
+    # Or use the `LEGALESIGN_SDK_BASE_URL` env var
     base_url="http://my.test.server.example.com:8083",
     http_client=DefaultHttpxClient(
         proxy="http://my.test.proxy.example.com",
@@ -322,9 +341,9 @@ client.with_options(http_client=DefaultHttpxClient(...))
 By default the library closes underlying HTTP connections whenever the client is [garbage collected](https://docs.python.org/3/reference/datamodel.html#object.__del__). You can manually close the client using the `.close()` method if desired, or with a context manager that closes when exiting.
 
 ```py
-from legalesign import Legalesign
+from legalesign_sdk import LegalesignSDK
 
-with Legalesign() as client:
+with LegalesignSDK() as client:
   # make requests here
   ...
 
@@ -341,7 +360,7 @@ This package generally follows [SemVer](https://semver.org/spec/v2.0.0.html) con
 
 We take backwards-compatibility seriously and work hard to ensure you can rely on a smooth upgrade experience.
 
-We are keen for your feedback; please open an [issue](https://www.github.com/legalesign/legalesign-rest-python/issues) with questions, bugs, or suggestions.
+We are keen for your feedback; please open an [issue](https://www.github.com/stainless-sdks/legalesign-sdk-python/issues) with questions, bugs, or suggestions.
 
 ### Determining the installed version
 
@@ -350,8 +369,8 @@ If you've upgraded to the latest version but aren't seeing any new features you
 You can determine the version that is being used at runtime with:
 
 ```py
-import legalesign
-print(legalesign.__version__)
+import legalesign_sdk
+print(legalesign_sdk.__version__)
 ```
 
 ## Requirements
diff --git a/SECURITY.md b/SECURITY.md
index da9b811..04e5733 100644
--- a/SECURITY.md
+++ b/SECURITY.md
@@ -16,11 +16,11 @@ before making any information public.
 ## Reporting Non-SDK Related Security Issues
 
 If you encounter security issues that are not directly related to SDKs but pertain to the services
-or products provided by Legalesign, please follow the respective company's security reporting guidelines.
+or products provided by Legalesign SDK, please follow the respective company's security reporting guidelines.
 
-### Legalesign Terms and Policies
+### Legalesign SDK Terms and Policies
 
-Please contact sales@legalesign.com for any questions or concerns regarding the security of our services.
+Please contact support@legalesign.com for any questions or concerns regarding the security of our services.
 
 ---
 
diff --git a/api.md b/api.md
index 9696a2e..852ce78 100644
--- a/api.md
+++ b/api.md
@@ -1,25 +1,11 @@
-# Attachment
-
-Types:
-
-```python
-from legalesign.types import AttachmentResponse, ListMeta, AttachmentListResponse
-```
-
-Methods:
-
-- client.attachment.retrieve(attachment_id) -> AttachmentResponse
-- client.attachment.list(\*\*params) -> AttachmentListResponse
-- client.attachment.delete(attachment_id) -> None
-- client.attachment.upload(\*\*params) -> None
-
 # Document
 
 Types:
 
 ```python
-from legalesign.types import (
+from legalesign_sdk.types import (
     DocumentStatusEnum,
+    ListMeta,
     PdfFieldValidationEnum,
     DocumentCreateResponse,
     DocumentRetrieveResponse,
@@ -30,180 +16,107 @@ from legalesign.types import (
 
 Methods:
 
-- client.document.create(\*\*params) -> DocumentCreateResponse
-- client.document.retrieve(doc_id) -> DocumentRetrieveResponse
-- client.document.list(\*\*params) -> DocumentListResponse
-- client.document.archive(doc_id) -> None
-- client.document.delete_permanently(doc_id) -> None
-- client.document.download_audit_log(doc_id) -> BinaryAPIResponse
-- client.document.get_fields(doc_id) -> DocumentGetFieldsResponse
-- client.document.preview(\*\*params) -> None
+- client.document.create(\*\*params) -> DocumentCreateResponse
+- client.document.retrieve(doc_id) -> DocumentRetrieveResponse
+- client.document.list(\*\*params) -> DocumentListResponse
+- client.document.archive(doc_id) -> None
+- client.document.get_fields(doc_id) -> DocumentGetFieldsResponse
+- client.document.permanently_delete(doc_id) -> None
 
 # Group
 
 Types:
 
 ```python
-from legalesign.types import GroupRetrieveResponse, GroupListResponse
-```
-
-Methods:
-
-- client.group.create(\*\*params) -> None
-- client.group.retrieve(group_id) -> GroupRetrieveResponse
-- client.group.update(group_id, \*\*params) -> None
-- client.group.list(\*\*params) -> GroupListResponse
-
-# Invited
-
-Types:
-
-```python
-from legalesign.types import InvitedListResponse
-```
-
-Methods:
-
-- client.invited.list(\*\*params) -> InvitedListResponse
-- client.invited.delete(invited_id) -> None
-
-# Member
-
-Types:
-
-```python
-from legalesign.types import MemberResponse, PermissionsEnum, MemberListResponse
+from legalesign_sdk.types import GroupRetrieveResponse, GroupListResponse
 ```
 
 Methods:
 
-- client.member.create(\*\*params) -> None
-- client.member.retrieve(member_id) -> MemberResponse
-- client.member.list(\*\*params) -> MemberListResponse
-- client.member.delete(member_id) -> None
-
-# Notifications
-
-Types:
-
-```python
-from legalesign.types import WebhookEventFilterEnum, NotificationListResponse
-```
-
-Methods:
-
-- client.notifications.list() -> NotificationListResponse
+- client.group.create(\*\*params) -> None
+- client.group.retrieve(group_id) -> GroupRetrieveResponse
+- client.group.list(\*\*params) -> GroupListResponse
 
 # Pdf
 
 Methods:
 
-- client.pdf.retrieve(doc_id) -> BinaryAPIResponse
-- client.pdf.create_preview(\*\*params) -> BinaryAPIResponse
+- client.pdf.retrieve(doc_id) -> BinaryAPIResponse
 
 # Signer
 
 Types:
 
 ```python
-from legalesign.types import (
+from legalesign_sdk.types import (
     SignerStatusEnum,
     SignerRetrieveResponse,
-    SignerGetRejectionReasonResponse,
     SignerRetrieveFieldsResponse,
 )
 ```
 
 Methods:
 
-- client.signer.retrieve(signer_id) -> SignerRetrieveResponse
-- client.signer.get_access_link(signer_id) -> None
-- client.signer.get_rejection_reason(signer_id) -> SignerGetRejectionReasonResponse
-- client.signer.reset(signer_id, \*\*params) -> None
-- client.signer.retrieve_fields(signer_id) -> SignerRetrieveFieldsResponse
-- client.signer.send_reminder(signer_id, \*\*params) -> None
+- client.signer.retrieve(signer_id) -> SignerRetrieveResponse
+- client.signer.get_access_link(signer_id) -> None
+- client.signer.retrieve_fields(signer_id) -> SignerRetrieveFieldsResponse
+- client.signer.send_reminder(signer_id, \*\*params) -> None
 
 # Status
 
 Types:
 
 ```python
-from legalesign.types import StatusResponse, StatusRetrieveAllResponse
+from legalesign_sdk.types import StatusRetrieveResponse
 ```
 
 Methods:
 
-- client.status.retrieve(doc_id) -> StatusResponse
-- client.status.retrieve_all(\*\*params) -> StatusRetrieveAllResponse
-
-# Subscribe
-
-Methods:
-
-- client.subscribe.create_webhook(\*\*params) -> None
+- client.status.retrieve(doc_id) -> StatusRetrieveResponse
 
 # Template
 
 Types:
 
 ```python
-from legalesign.types import TemplateRetrieveResponse, TemplateListResponse
+from legalesign_sdk.types import TemplateRetrieveResponse, TemplateListResponse
 ```
 
 Methods:
 
-- client.template.create(\*\*params) -> None
-- client.template.retrieve(template_id) -> TemplateRetrieveResponse
-- client.template.update(template_id, \*\*params) -> None
-- client.template.list(\*\*params) -> TemplateListResponse
-- client.template.archive(template_id) -> None
+- client.template.create(\*\*params) -> None
+- client.template.retrieve(template_id) -> TemplateRetrieveResponse
+- client.template.update(template_id, \*\*params) -> None
+- client.template.list(\*\*params) -> TemplateListResponse
 
 # Templatepdf
 
 Types:
 
 ```python
-from legalesign.types import TemplatePdf, TemplatepdfListResponse, TemplatepdfGetEditLinkResponse
+from legalesign_sdk.types import (
+    TemplatePdf,
+    TemplatepdfListResponse,
+    TemplatepdfGetEditLinkResponse,
+)
 ```
 
 Methods:
 
-- client.templatepdf.create(\*\*params) -> None
-- client.templatepdf.retrieve(pdf_id) -> TemplatePdf
-- client.templatepdf.list(\*\*params) -> TemplatepdfListResponse
-- client.templatepdf.archive(pdf_id) -> None
-- client.templatepdf.convert_tags(pdf_id) -> None
-- client.templatepdf.get_edit_link(pdf_id) -> str
+- client.templatepdf.create(\*\*params) -> None
+- client.templatepdf.retrieve(pdf_id) -> TemplatePdf
+- client.templatepdf.list(\*\*params) -> TemplatepdfListResponse
+- client.templatepdf.get_edit_link(pdf_id) -> str
 
 ## Fields
 
 Types:
 
 ```python
-from legalesign.types.templatepdf import FieldListResponse
-```
-
-Methods:
-
-- client.templatepdf.fields.create(pdf_id, \*\*params) -> None
-- client.templatepdf.fields.list(pdf_id) -> FieldListResponse
-
-# Unsubscribe
-
-Methods:
-
-- client.unsubscribe.delete_webhook(\*\*params) -> None
-
-# User
-
-Types:
-
-```python
-from legalesign.types import TimezoneEnum, UserRetrieveResponse
+from legalesign_sdk.types.templatepdf import FieldListResponse
 ```
 
 Methods:
 
-- client.user.create(\*\*params) -> None
-- client.user.retrieve(user_id) -> UserRetrieveResponse
-- client.user.update(user_id, \*\*params) -> None
+- client.templatepdf.fields.create(pdf_id, \*\*params) -> None
+- client.templatepdf.fields.list(pdf_id) -> FieldListResponse
diff --git a/bin/check-release-environment b/bin/check-release-environment
deleted file mode 100644
index b845b0f..0000000
--- a/bin/check-release-environment
+++ /dev/null
@@ -1,21 +0,0 @@
-#!/usr/bin/env bash
-
-errors=()
-
-if [ -z "${PYPI_TOKEN}" ]; then
-  errors+=("The PYPI_TOKEN secret has not been set. Please set it in either this repository's secrets or your organization secrets.")
-fi
-
-lenErrors=${#errors[@]}
-
-if [[ lenErrors -gt 0 ]]; then
-  echo -e "Found the following errors in the release environment:\n"
-
-  for error in "${errors[@]}"; do
-    echo -e "- $error\n"
-  done
-
-  exit 1
-fi
-
-echo "The environment is ready to push releases!"
diff --git a/release-please-config.json b/release-please-config.json
deleted file mode 100644
index 48be9a0..0000000
--- a/release-please-config.json
+++ /dev/null
@@ -1,66 +0,0 @@
-{
-  "packages": {
-    ".": {}
-  },
-  "$schema": "https://raw.githubusercontent.com/stainless-api/release-please/main/schemas/config.json",
-  "include-v-in-tag": true,
-  "include-component-in-tag": false,
-  "versioning": "prerelease",
-  "prerelease": true,
-  "bump-minor-pre-major": true,
-  "bump-patch-for-minor-pre-major": false,
-  "pull-request-header": "Automated Release PR",
-  "pull-request-title-pattern": "release: ${version}",
-  "changelog-sections": [
-    {
-      "type": "feat",
-      "section": "Features"
-    },
-    {
-      "type": "fix",
-      "section": "Bug Fixes"
-    },
-    {
-      "type": "perf",
-      "section": "Performance Improvements"
-    },
-    {
-      "type": "revert",
-      "section": "Reverts"
-    },
-    {
-      "type": "chore",
-      "section": "Chores"
-    },
-    {
-      "type": "docs",
-      "section": "Documentation"
-    },
-    {
-      "type": "style",
-      "section": "Styles"
-    },
-    {
-      "type": "refactor",
-      "section": "Refactors"
-    },
-    {
-      "type": "test",
-      "section": "Tests",
-      "hidden": true
-    },
-    {
-      "type": "build",
-      "section": "Build System"
-    },
-    {
-      "type": "ci",
-      "section": "Continuous Integration",
-      "hidden": true
-    }
-  ],
-  "release-type": "python",
-  "extra-files": [
-    "src/legalesign/_version.py"
-  ]
-}
\ No newline at end of file
diff --git a/requirements-dev.lock b/requirements-dev.lock
index a55834a..7964cd8 100644
--- a/requirements-dev.lock
+++ b/requirements-dev.lock
@@ -14,14 +14,14 @@ aiohappyeyeballs==2.6.1
     # via aiohttp
 aiohttp==3.12.8
     # via httpx-aiohttp
-    # via legalesign
+    # via legalesign-sdk
 aiosignal==1.3.2
     # via aiohttp
 annotated-types==0.6.0
     # via pydantic
 anyio==4.4.0
     # via httpx
-    # via legalesign
+    # via legalesign-sdk
 argcomplete==3.1.2
     # via nox
 async-timeout==5.0.1
@@ -37,7 +37,7 @@ dirty-equals==0.6.0
 distlib==0.3.7
     # via virtualenv
 distro==1.8.0
-    # via legalesign
+    # via legalesign-sdk
 exceptiongroup==1.2.2
     # via anyio
     # via pytest
@@ -54,10 +54,10 @@ httpcore==1.0.9
     # via httpx
 httpx==0.28.1
     # via httpx-aiohttp
-    # via legalesign
+    # via legalesign-sdk
     # via respx
 httpx-aiohttp==0.1.8
-    # via legalesign
+    # via legalesign-sdk
 idna==3.4
     # via anyio
     # via httpx
@@ -89,7 +89,7 @@ propcache==0.3.1
     # via aiohttp
     # via yarl
 pydantic==2.11.9
-    # via legalesign
+    # via legalesign-sdk
 pydantic-core==2.33.2
     # via pydantic
 pygments==2.18.0
@@ -113,14 +113,14 @@ six==1.16.0
     # via python-dateutil
 sniffio==1.3.0
     # via anyio
-    # via legalesign
+    # via legalesign-sdk
 time-machine==2.9.0
 tomli==2.0.2
     # via mypy
     # via pytest
 typing-extensions==4.12.2
     # via anyio
-    # via legalesign
+    # via legalesign-sdk
     # via multidict
     # via mypy
     # via pydantic
diff --git a/requirements.lock b/requirements.lock
index 735fadc..2abc4a9 100644
--- a/requirements.lock
+++ b/requirements.lock
@@ -14,14 +14,14 @@ aiohappyeyeballs==2.6.1
     # via aiohttp
 aiohttp==3.12.8
     # via httpx-aiohttp
-    # via legalesign
+    # via legalesign-sdk
 aiosignal==1.3.2
     # via aiohttp
 annotated-types==0.6.0
     # via pydantic
 anyio==4.4.0
     # via httpx
-    # via legalesign
+    # via legalesign-sdk
 async-timeout==5.0.1
     # via aiohttp
 attrs==25.3.0
@@ -30,7 +30,7 @@ certifi==2023.7.22
     # via httpcore
     # via httpx
 distro==1.8.0
-    # via legalesign
+    # via legalesign-sdk
 exceptiongroup==1.2.2
     # via anyio
 frozenlist==1.6.2
@@ -42,9 +42,9 @@ httpcore==1.0.9
     # via httpx
 httpx==0.28.1
     # via httpx-aiohttp
-    # via legalesign
+    # via legalesign-sdk
 httpx-aiohttp==0.1.8
-    # via legalesign
+    # via legalesign-sdk
 idna==3.4
     # via anyio
     # via httpx
@@ -56,15 +56,15 @@ propcache==0.3.1
     # via aiohttp
     # via yarl
 pydantic==2.11.9
-    # via legalesign
+    # via legalesign-sdk
 pydantic-core==2.33.2
     # via pydantic
 sniffio==1.3.0
     # via anyio
-    # via legalesign
+    # via legalesign-sdk
 typing-extensions==4.12.2
     # via anyio
-    # via legalesign
+    # via legalesign-sdk
     # via multidict
     # via pydantic
     # via pydantic-core
diff --git a/scripts/bootstrap b/scripts/bootstrap
index e84fe62..b430fee 100755
--- a/scripts/bootstrap
+++ b/scripts/bootstrap
@@ -4,10 +4,18 @@ set -e
 
 cd "$(dirname "$0")/.."
 
-if ! command -v rye >/dev/null 2>&1 && [ -f "Brewfile" ] && [ "$(uname -s)" = "Darwin" ]; then
+if [ -f "Brewfile" ] && [ "$(uname -s)" = "Darwin" ] && [ "$SKIP_BREW" != "1" ] && [ -t 0 ]; then
   brew bundle check >/dev/null 2>&1 || {
-    echo "==> Installing Homebrew dependencies…"
-    brew bundle
+    echo -n "==> Install Homebrew dependencies? (y/N): "
+    read -r response
+    case "$response" in
+      [yY][eE][sS]|[yY])
+        brew bundle
+        ;;
+      *)
+        ;;
+    esac
+    echo
   }
 fi
 
diff --git a/scripts/lint b/scripts/lint
index ce13042..ca86d5d 100755
--- a/scripts/lint
+++ b/scripts/lint
@@ -8,4 +8,4 @@ echo "==> Running lints"
 rye run lint
 
 echo "==> Making sure it imports"
-rye run python -c 'import legalesign'
+rye run python -c 'import legalesign_sdk'
diff --git a/scripts/utils/upload-artifact.sh b/scripts/utils/upload-artifact.sh
index fc8c227..4f7ee6c 100755
--- a/scripts/utils/upload-artifact.sh
+++ b/scripts/utils/upload-artifact.sh
@@ -20,7 +20,7 @@ UPLOAD_RESPONSE=$(curl -v -X PUT \
 
 if echo "$UPLOAD_RESPONSE" | grep -q "HTTP/[0-9.]* 200"; then
   echo -e "\033[32mUploaded build to Stainless storage.\033[0m"
-  echo -e "\033[32mInstallation: pip install 'https://pkg.stainless.com/s/legalesign-python/$SHA/$FILENAME'\033[0m"
+  echo -e "\033[32mInstallation: pip install 'https://pkg.stainless.com/s/legalesign-sdk-python/$SHA/$FILENAME'\033[0m"
 else
   echo -e "\033[31mFailed to upload artifact.\033[0m"
   exit 1
diff --git a/src/legalesign/pagination.py b/src/legalesign/pagination.py
deleted file mode 100644
index 324e652..0000000
--- a/src/legalesign/pagination.py
+++ /dev/null
@@ -1,56 +0,0 @@
-# File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.
-
-from typing import List, Generic, TypeVar, Optional
-from typing_extensions import override
-
-from ._base_client import BasePage, PageInfo, BaseSyncPage, BaseAsyncPage
-
-__all__ = ["SyncMyOffsetPage", "AsyncMyOffsetPage"]
-
-_T = TypeVar("_T")
-
-
-class SyncMyOffsetPage(BaseSyncPage[_T], BasePage[_T], Generic[_T]):
-    objects: List[_T]
-    meta: Optional[object] = None
-
-    @override
-    def _get_page_items(self) -> List[_T]:
-        objects = self.objects
-        if not objects:
-            return []
-        return objects
-
-    @override
-    def next_page_info(self) -> Optional[PageInfo]:
-        offset = self._options.params.get("offset") or 0
-        if not isinstance(offset, int):
-            raise ValueError(f'Expected "offset" param to be an integer but got {offset}')
-
-        length = len(self._get_page_items())
-        current_count = offset + length
-
-        return PageInfo(params={"offset": current_count})
-
-
-class AsyncMyOffsetPage(BaseAsyncPage[_T], BasePage[_T], Generic[_T]):
-    objects: List[_T]
-    meta: Optional[object] = None
-
-    @override
-    def _get_page_items(self) -> List[_T]:
-        objects = self.objects
-        if not objects:
-            return []
-        return objects
-
-    @override
-    def next_page_info(self) -> Optional[PageInfo]:
-        offset = self._options.params.get("offset") or 0
-        if not isinstance(offset, int):
-            raise ValueError(f'Expected "offset" param to be an integer but got {offset}')
-
-        length = len(self._get_page_items())
-        current_count = offset + length
-
-        return PageInfo(params={"offset": current_count})
diff --git a/src/legalesign/resources/__init__.py b/src/legalesign/resources/__init__.py
deleted file mode 100644
index 2120f16..0000000
--- a/src/legalesign/resources/__init__.py
+++ /dev/null
@@ -1,201 +0,0 @@
-# File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.
-
-from .pdf import (
-    PdfResource,
-    AsyncPdfResource,
-    PdfResourceWithRawResponse,
-    AsyncPdfResourceWithRawResponse,
-    PdfResourceWithStreamingResponse,
-    AsyncPdfResourceWithStreamingResponse,
-)
-from .user import (
-    UserResource,
-    AsyncUserResource,
-    UserResourceWithRawResponse,
-    AsyncUserResourceWithRawResponse,
-    UserResourceWithStreamingResponse,
-    AsyncUserResourceWithStreamingResponse,
-)
-from .group import (
-    GroupResource,
-    AsyncGroupResource,
-    GroupResourceWithRawResponse,
-    AsyncGroupResourceWithRawResponse,
-    GroupResourceWithStreamingResponse,
-    AsyncGroupResourceWithStreamingResponse,
-)
-from .member import (
-    MemberResource,
-    AsyncMemberResource,
-    MemberResourceWithRawResponse,
-    AsyncMemberResourceWithRawResponse,
-    MemberResourceWithStreamingResponse,
-    AsyncMemberResourceWithStreamingResponse,
-)
-from .signer import (
-    SignerResource,
-    AsyncSignerResource,
-    SignerResourceWithRawResponse,
-    AsyncSignerResourceWithRawResponse,
-    SignerResourceWithStreamingResponse,
-    AsyncSignerResourceWithStreamingResponse,
-)
-from .status import (
-    StatusResource,
-    AsyncStatusResource,
-    StatusResourceWithRawResponse,
-    AsyncStatusResourceWithRawResponse,
-    StatusResourceWithStreamingResponse,
-    AsyncStatusResourceWithStreamingResponse,
-)
-from .invited import (
-    InvitedResource,
-    AsyncInvitedResource,
-    InvitedResourceWithRawResponse,
-    AsyncInvitedResourceWithRawResponse,
-    InvitedResourceWithStreamingResponse,
-    AsyncInvitedResourceWithStreamingResponse,
-)
-from .document import (
-    DocumentResource,
-    AsyncDocumentResource,
-    DocumentResourceWithRawResponse,
-    AsyncDocumentResourceWithRawResponse,
-    DocumentResourceWithStreamingResponse,
-    AsyncDocumentResourceWithStreamingResponse,
-)
-from .template import (
-    TemplateResource,
-    AsyncTemplateResource,
-    TemplateResourceWithRawResponse,
-    AsyncTemplateResourceWithRawResponse,
-    TemplateResourceWithStreamingResponse,
-    AsyncTemplateResourceWithStreamingResponse,
-)
-from .subscribe import (
-    SubscribeResource,
-    AsyncSubscribeResource,
-    SubscribeResourceWithRawResponse,
-    AsyncSubscribeResourceWithRawResponse,
-    SubscribeResourceWithStreamingResponse,
-    AsyncSubscribeResourceWithStreamingResponse,
-)
-from .attachment import (
-    AttachmentResource,
-    AsyncAttachmentResource,
-    AttachmentResourceWithRawResponse,
-    AsyncAttachmentResourceWithRawResponse,
-    AttachmentResourceWithStreamingResponse,
-    AsyncAttachmentResourceWithStreamingResponse,
-)
-from .templatepdf import (
-    TemplatepdfResource,
-    AsyncTemplatepdfResource,
-    TemplatepdfResourceWithRawResponse,
-    AsyncTemplatepdfResourceWithRawResponse,
-    TemplatepdfResourceWithStreamingResponse,
-    AsyncTemplatepdfResourceWithStreamingResponse,
-)
-from .unsubscribe import (
-    UnsubscribeResource,
-    AsyncUnsubscribeResource,
-    UnsubscribeResourceWithRawResponse,
-    AsyncUnsubscribeResourceWithRawResponse,
-    UnsubscribeResourceWithStreamingResponse,
-    AsyncUnsubscribeResourceWithStreamingResponse,
-)
-from .notifications import (
-    NotificationsResource,
-    AsyncNotificationsResource,
-    NotificationsResourceWithRawResponse,
-    AsyncNotificationsResourceWithRawResponse,
-    NotificationsResourceWithStreamingResponse,
-    AsyncNotificationsResourceWithStreamingResponse,
-)
-
-__all__ = [
-    "AttachmentResource",
-    "AsyncAttachmentResource",
-    "AttachmentResourceWithRawResponse",
-    "AsyncAttachmentResourceWithRawResponse",
-    "AttachmentResourceWithStreamingResponse",
-    "AsyncAttachmentResourceWithStreamingResponse",
-    "DocumentResource",
-    "AsyncDocumentResource",
-    "DocumentResourceWithRawResponse",
-    "AsyncDocumentResourceWithRawResponse",
-    "DocumentResourceWithStreamingResponse",
-    "AsyncDocumentResourceWithStreamingResponse",
-    "GroupResource",
-    "AsyncGroupResource",
-    "GroupResourceWithRawResponse",
-    "AsyncGroupResourceWithRawResponse",
-    "GroupResourceWithStreamingResponse",
-    "AsyncGroupResourceWithStreamingResponse",
-    "InvitedResource",
-    "AsyncInvitedResource",
-    "InvitedResourceWithRawResponse",
-    "AsyncInvitedResourceWithRawResponse",
-    "InvitedResourceWithStreamingResponse",
-    "AsyncInvitedResourceWithStreamingResponse",
-    "MemberResource",
-    "AsyncMemberResource",
-    "MemberResourceWithRawResponse",
-    "AsyncMemberResourceWithRawResponse",
-    "MemberResourceWithStreamingResponse",
-    "AsyncMemberResourceWithStreamingResponse",
-    "NotificationsResource",
-    "AsyncNotificationsResource",
-    "NotificationsResourceWithRawResponse",
-    "AsyncNotificationsResourceWithRawResponse",
-    "NotificationsResourceWithStreamingResponse",
-    "AsyncNotificationsResourceWithStreamingResponse",
-    "PdfResource",
-    "AsyncPdfResource",
-    "PdfResourceWithRawResponse",
-    "AsyncPdfResourceWithRawResponse",
-    "PdfResourceWithStreamingResponse",
-    "AsyncPdfResourceWithStreamingResponse",
-    "SignerResource",
-    "AsyncSignerResource",
-    "SignerResourceWithRawResponse",
-    "AsyncSignerResourceWithRawResponse",
-    "SignerResourceWithStreamingResponse",
-    "AsyncSignerResourceWithStreamingResponse",
-    "StatusResource",
-    "AsyncStatusResource",
-    "StatusResourceWithRawResponse",
-    "AsyncStatusResourceWithRawResponse",
-    "StatusResourceWithStreamingResponse",
-    "AsyncStatusResourceWithStreamingResponse",
-    "SubscribeResource",
-    "AsyncSubscribeResource",
-    "SubscribeResourceWithRawResponse",
-    "AsyncSubscribeResourceWithRawResponse",
-    "SubscribeResourceWithStreamingResponse",
-    "AsyncSubscribeResourceWithStreamingResponse",
-    "TemplateResource",
-    "AsyncTemplateResource",
-    "TemplateResourceWithRawResponse",
-    "AsyncTemplateResourceWithRawResponse",
-    "TemplateResourceWithStreamingResponse",
-    "AsyncTemplateResourceWithStreamingResponse",
-    "TemplatepdfResource",
-    "AsyncTemplatepdfResource",
-    "TemplatepdfResourceWithRawResponse",
-    "AsyncTemplatepdfResourceWithRawResponse",
-    "TemplatepdfResourceWithStreamingResponse",
-    "AsyncTemplatepdfResourceWithStreamingResponse",
-    "UnsubscribeResource",
-    "AsyncUnsubscribeResource",
-    "UnsubscribeResourceWithRawResponse",
-    "AsyncUnsubscribeResourceWithRawResponse",
-    "UnsubscribeResourceWithStreamingResponse",
-    "AsyncUnsubscribeResourceWithStreamingResponse",
-    "UserResource",
-    "AsyncUserResource",
-    "UserResourceWithRawResponse",
-    "AsyncUserResourceWithRawResponse",
-    "UserResourceWithStreamingResponse",
-    "AsyncUserResourceWithStreamingResponse",
-]
diff --git a/src/legalesign/resources/attachment.py b/src/legalesign/resources/attachment.py
deleted file mode 100644
index 97e65fc..0000000
--- a/src/legalesign/resources/attachment.py
+++ /dev/null
@@ -1,482 +0,0 @@
-# File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.
-
-from __future__ import annotations
-
-from typing import Union
-
-import httpx
-
-from ..types import attachment_list_params, attachment_upload_params
-from .._types import Body, Omit, Query, Headers, NoneType, NotGiven, Base64FileInput, omit, not_given
-from .._utils import maybe_transform, async_maybe_transform
-from .._compat import cached_property
-from .._resource import SyncAPIResource, AsyncAPIResource
-from .._response import (
-    to_raw_response_wrapper,
-    to_streamed_response_wrapper,
-    async_to_raw_response_wrapper,
-    async_to_streamed_response_wrapper,
-)
-from .._base_client import make_request_options
-from ..types.attachment_response import AttachmentResponse
-from ..types.attachment_list_response import AttachmentListResponse
-
-__all__ = ["AttachmentResource", "AsyncAttachmentResource"]
-
-
-class AttachmentResource(SyncAPIResource):
-    @cached_property
-    def with_raw_response(self) -> AttachmentResourceWithRawResponse:
-        """
-        This property can be used as a prefix for any HTTP method call to return
-        the raw response object instead of the parsed content.
-
-        For more information, see https://www.github.com/legalesign/legalesign-rest-python#accessing-raw-response-data-eg-headers
-        """
-        return AttachmentResourceWithRawResponse(self)
-
-    @cached_property
-    def with_streaming_response(self) -> AttachmentResourceWithStreamingResponse:
-        """
-        An alternative to `.with_raw_response` that doesn't eagerly read the response body.
-
-        For more information, see https://www.github.com/legalesign/legalesign-rest-python#with_streaming_response
-        """
-        return AttachmentResourceWithStreamingResponse(self)
-
-    def retrieve(
-        self,
-        attachment_id: str,
-        *,
-        # Use the following arguments if you need to pass additional parameters to the API that aren't available via kwargs.
-        # The extra values given here take precedence over values defined on the client or passed to this method.
-        extra_headers: Headers | None = None,
-        extra_query: Query | None = None,
-        extra_body: Body | None = None,
-        timeout: float | httpx.Timeout | None | NotGiven = not_given,
-    ) -> AttachmentResponse:
-        """
-        Get attachment
-
-        Args:
-          extra_headers: Send extra headers
-
-          extra_query: Add additional query parameters to the request
-
-          extra_body: Add additional JSON properties to the request
-
-          timeout: Override the client-level default timeout for this request, in seconds
-        """
-        if not attachment_id:
-            raise ValueError(f"Expected a non-empty value for `attachment_id` but received {attachment_id!r}")
-        return self._get(
-            f"/attachment/{attachment_id}/",
-            options=make_request_options(
-                extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout
-            ),
-            cast_to=AttachmentResponse,
-        )
-
-    def list(
-        self,
-        *,
-        group: str | Omit = omit,
-        limit: int | Omit = omit,
-        offset: int | Omit = omit,
-        # Use the following arguments if you need to pass additional parameters to the API that aren't available via kwargs.
-        # The extra values given here take precedence over values defined on the client or passed to this method.
-        extra_headers: Headers | None = None,
-        extra_query: Query | None = None,
-        extra_body: Body | None = None,
-        timeout: float | httpx.Timeout | None | NotGiven = not_given,
-    ) -> AttachmentListResponse:
-        """
-        List attachments in your groups
-
-        Args:
-          group: Filter by a specific group
-
-          limit: Length of dataset to return. Use with offset query to iterate through results.
-
-          offset: Offset from start of dataset. Use with the limit query to iterate through
-              dataset.
-
-          extra_headers: Send extra headers
-
-          extra_query: Add additional query parameters to the request
-
-          extra_body: Add additional JSON properties to the request
-
-          timeout: Override the client-level default timeout for this request, in seconds
-        """
-        return self._get(
-            "/attachment/",
-            options=make_request_options(
-                extra_headers=extra_headers,
-                extra_query=extra_query,
-                extra_body=extra_body,
-                timeout=timeout,
-                query=maybe_transform(
-                    {
-                        "group": group,
-                        "limit": limit,
-                        "offset": offset,
-                    },
-                    attachment_list_params.AttachmentListParams,
-                ),
-            ),
-            cast_to=AttachmentListResponse,
-        )
-
-    def delete(
-        self,
-        attachment_id: str,
-        *,
-        # Use the following arguments if you need to pass additional parameters to the API that aren't available via kwargs.
-        # The extra values given here take precedence over values defined on the client or passed to this method.
-        extra_headers: Headers | None = None,
-        extra_query: Query | None = None,
-        extra_body: Body | None = None,
-        timeout: float | httpx.Timeout | None | NotGiven = not_given,
-    ) -> None:
-        """
-        Delete attachment
-
-        Args:
-          extra_headers: Send extra headers
-
-          extra_query: Add additional query parameters to the request
-
-          extra_body: Add additional JSON properties to the request
-
-          timeout: Override the client-level default timeout for this request, in seconds
-        """
-        if not attachment_id:
-            raise ValueError(f"Expected a non-empty value for `attachment_id` but received {attachment_id!r}")
-        extra_headers = {"Accept": "*/*", **(extra_headers or {})}
-        return self._delete(
-            f"/attachment/{attachment_id}/",
-            options=make_request_options(
-                extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout
-            ),
-            cast_to=NoneType,
-        )
-
-    def upload(
-        self,
-        *,
-        filename: str,
-        group: str,
-        pdf_file: Union[str, Base64FileInput],
-        description: str | Omit = omit,
-        user: str | Omit = omit,
-        # Use the following arguments if you need to pass additional parameters to the API that aren't available via kwargs.
-        # The extra values given here take precedence over values defined on the client or passed to this method.
-        extra_headers: Headers | None = None,
-        extra_query: Query | None = None,
-        extra_body: Body | None = None,
-        timeout: float | httpx.Timeout | None | NotGiven = not_given,
-    ) -> None:
-        """
-        Upload PDF attachment
-
-        Args:
-          filename: Simple alphanumeric name ending .pdf
-
-          group: URI of the group name
-
-          pdf_file: Base64 encoded PDF file data, max size is a group setting, 5MB by default
-
-          user: Assign to group member if not the api user
-
-          extra_headers: Send extra headers
-
-          extra_query: Add additional query parameters to the request
-
-          extra_body: Add additional JSON properties to the request
-
-          timeout: Override the client-level default timeout for this request, in seconds
-        """
-        extra_headers = {"Accept": "*/*", **(extra_headers or {})}
-        return self._post(
-            "/attachment/",
-            body=maybe_transform(
-                {
-                    "filename": filename,
-                    "group": group,
-                    "pdf_file": pdf_file,
-                    "description": description,
-                    "user": user,
-                },
-                attachment_upload_params.AttachmentUploadParams,
-            ),
-            options=make_request_options(
-                extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout
-            ),
-            cast_to=NoneType,
-        )
-
-
-class AsyncAttachmentResource(AsyncAPIResource):
-    @cached_property
-    def with_raw_response(self) -> AsyncAttachmentResourceWithRawResponse:
-        """
-        This property can be used as a prefix for any HTTP method call to return
-        the raw response object instead of the parsed content.
-
-        For more information, see https://www.github.com/legalesign/legalesign-rest-python#accessing-raw-response-data-eg-headers
-        """
-        return AsyncAttachmentResourceWithRawResponse(self)
-
-    @cached_property
-    def with_streaming_response(self) -> AsyncAttachmentResourceWithStreamingResponse:
-        """
-        An alternative to `.with_raw_response` that doesn't eagerly read the response body.
-
-        For more information, see https://www.github.com/legalesign/legalesign-rest-python#with_streaming_response
-        """
-        return AsyncAttachmentResourceWithStreamingResponse(self)
-
-    async def retrieve(
-        self,
-        attachment_id: str,
-        *,
-        # Use the following arguments if you need to pass additional parameters to the API that aren't available via kwargs.
-        # The extra values given here take precedence over values defined on the client or passed to this method.
-        extra_headers: Headers | None = None,
-        extra_query: Query | None = None,
-        extra_body: Body | None = None,
-        timeout: float | httpx.Timeout | None | NotGiven = not_given,
-    ) -> AttachmentResponse:
-        """
-        Get attachment
-
-        Args:
-          extra_headers: Send extra headers
-
-          extra_query: Add additional query parameters to the request
-
-          extra_body: Add additional JSON properties to the request
-
-          timeout: Override the client-level default timeout for this request, in seconds
-        """
-        if not attachment_id:
-            raise ValueError(f"Expected a non-empty value for `attachment_id` but received {attachment_id!r}")
-        return await self._get(
-            f"/attachment/{attachment_id}/",
-            options=make_request_options(
-                extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout
-            ),
-            cast_to=AttachmentResponse,
-        )
-
-    async def list(
-        self,
-        *,
-        group: str | Omit = omit,
-        limit: int | Omit = omit,
-        offset: int | Omit = omit,
-        # Use the following arguments if you need to pass additional parameters to the API that aren't available via kwargs.
-        # The extra values given here take precedence over values defined on the client or passed to this method.
-        extra_headers: Headers | None = None,
-        extra_query: Query | None = None,
-        extra_body: Body | None = None,
-        timeout: float | httpx.Timeout | None | NotGiven = not_given,
-    ) -> AttachmentListResponse:
-        """
-        List attachments in your groups
-
-        Args:
-          group: Filter by a specific group
-
-          limit: Length of dataset to return. Use with offset query to iterate through results.
-
-          offset: Offset from start of dataset. Use with the limit query to iterate through
-              dataset.
-
-          extra_headers: Send extra headers
-
-          extra_query: Add additional query parameters to the request
-
-          extra_body: Add additional JSON properties to the request
-
-          timeout: Override the client-level default timeout for this request, in seconds
-        """
-        return await self._get(
-            "/attachment/",
-            options=make_request_options(
-                extra_headers=extra_headers,
-                extra_query=extra_query,
-                extra_body=extra_body,
-                timeout=timeout,
-                query=await async_maybe_transform(
-                    {
-                        "group": group,
-                        "limit": limit,
-                        "offset": offset,
-                    },
-                    attachment_list_params.AttachmentListParams,
-                ),
-            ),
-            cast_to=AttachmentListResponse,
-        )
-
-    async def delete(
-        self,
-        attachment_id: str,
-        *,
-        # Use the following arguments if you need to pass additional parameters to the API that aren't available via kwargs.
-        # The extra values given here take precedence over values defined on the client or passed to this method.
-        extra_headers: Headers | None = None,
-        extra_query: Query | None = None,
-        extra_body: Body | None = None,
-        timeout: float | httpx.Timeout | None | NotGiven = not_given,
-    ) -> None:
-        """
-        Delete attachment
-
-        Args:
-          extra_headers: Send extra headers
-
-          extra_query: Add additional query parameters to the request
-
-          extra_body: Add additional JSON properties to the request
-
-          timeout: Override the client-level default timeout for this request, in seconds
-        """
-        if not attachment_id:
-            raise ValueError(f"Expected a non-empty value for `attachment_id` but received {attachment_id!r}")
-        extra_headers = {"Accept": "*/*", **(extra_headers or {})}
-        return await self._delete(
-            f"/attachment/{attachment_id}/",
-            options=make_request_options(
-                extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout
-            ),
-            cast_to=NoneType,
-        )
-
-    async def upload(
-        self,
-        *,
-        filename: str,
-        group: str,
-        pdf_file: Union[str, Base64FileInput],
-        description: str | Omit = omit,
-        user: str | Omit = omit,
-        # Use the following arguments if you need to pass additional parameters to the API that aren't available via kwargs.
-        # The extra values given here take precedence over values defined on the client or passed to this method.
-        extra_headers: Headers | None = None,
-        extra_query: Query | None = None,
-        extra_body: Body | None = None,
-        timeout: float | httpx.Timeout | None | NotGiven = not_given,
-    ) -> None:
-        """
-        Upload PDF attachment
-
-        Args:
-          filename: Simple alphanumeric name ending .pdf
-
-          group: URI of the group name
-
-          pdf_file: Base64 encoded PDF file data, max size is a group setting, 5MB by default
-
-          user: Assign to group member if not the api user
-
-          extra_headers: Send extra headers
-
-          extra_query: Add additional query parameters to the request
-
-          extra_body: Add additional JSON properties to the request
-
-          timeout: Override the client-level default timeout for this request, in seconds
-        """
-        extra_headers = {"Accept": "*/*", **(extra_headers or {})}
-        return await self._post(
-            "/attachment/",
-            body=await async_maybe_transform(
-                {
-                    "filename": filename,
-                    "group": group,
-                    "pdf_file": pdf_file,
-                    "description": description,
-                    "user": user,
-                },
-                attachment_upload_params.AttachmentUploadParams,
-            ),
-            options=make_request_options(
-                extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout
-            ),
-            cast_to=NoneType,
-        )
-
-
-class AttachmentResourceWithRawResponse:
-    def __init__(self, attachment: AttachmentResource) -> None:
-        self._attachment = attachment
-
-        self.retrieve = to_raw_response_wrapper(
-            attachment.retrieve,
-        )
-        self.list = to_raw_response_wrapper(
-            attachment.list,
-        )
-        self.delete = to_raw_response_wrapper(
-            attachment.delete,
-        )
-        self.upload = to_raw_response_wrapper(
-            attachment.upload,
-        )
-
-
-class AsyncAttachmentResourceWithRawResponse:
-    def __init__(self, attachment: AsyncAttachmentResource) -> None:
-        self._attachment = attachment
-
-        self.retrieve = async_to_raw_response_wrapper(
-            attachment.retrieve,
-        )
-        self.list = async_to_raw_response_wrapper(
-            attachment.list,
-        )
-        self.delete = async_to_raw_response_wrapper(
-            attachment.delete,
-        )
-        self.upload = async_to_raw_response_wrapper(
-            attachment.upload,
-        )
-
-
-class AttachmentResourceWithStreamingResponse:
-    def __init__(self, attachment: AttachmentResource) -> None:
-        self._attachment = attachment
-
-        self.retrieve = to_streamed_response_wrapper(
-            attachment.retrieve,
-        )
-        self.list = to_streamed_response_wrapper(
-            attachment.list,
-        )
-        self.delete = to_streamed_response_wrapper(
-            attachment.delete,
-        )
-        self.upload = to_streamed_response_wrapper(
-            attachment.upload,
-        )
-
-
-class AsyncAttachmentResourceWithStreamingResponse:
-    def __init__(self, attachment: AsyncAttachmentResource) -> None:
-        self._attachment = attachment
-
-        self.retrieve = async_to_streamed_response_wrapper(
-            attachment.retrieve,
-        )
-        self.list = async_to_streamed_response_wrapper(
-            attachment.list,
-        )
-        self.delete = async_to_streamed_response_wrapper(
-            attachment.delete,
-        )
-        self.upload = async_to_streamed_response_wrapper(
-            attachment.upload,
-        )
diff --git a/src/legalesign/resources/invited.py b/src/legalesign/resources/invited.py
deleted file mode 100644
index 2016149..0000000
--- a/src/legalesign/resources/invited.py
+++ /dev/null
@@ -1,253 +0,0 @@
-# File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.
-
-from __future__ import annotations
-
-import httpx
-
-from ..types import invited_list_params
-from .._types import Body, Omit, Query, Headers, NoneType, NotGiven, omit, not_given
-from .._utils import maybe_transform, async_maybe_transform
-from .._compat import cached_property
-from .._resource import SyncAPIResource, AsyncAPIResource
-from .._response import (
-    to_raw_response_wrapper,
-    to_streamed_response_wrapper,
-    async_to_raw_response_wrapper,
-    async_to_streamed_response_wrapper,
-)
-from .._base_client import make_request_options
-from ..types.invited_list_response import InvitedListResponse
-
-__all__ = ["InvitedResource", "AsyncInvitedResource"]
-
-
-class InvitedResource(SyncAPIResource):
-    @cached_property
-    def with_raw_response(self) -> InvitedResourceWithRawResponse:
-        """
-        This property can be used as a prefix for any HTTP method call to return
-        the raw response object instead of the parsed content.
-
-        For more information, see https://www.github.com/legalesign/legalesign-rest-python#accessing-raw-response-data-eg-headers
-        """
-        return InvitedResourceWithRawResponse(self)
-
-    @cached_property
-    def with_streaming_response(self) -> InvitedResourceWithStreamingResponse:
-        """
-        An alternative to `.with_raw_response` that doesn't eagerly read the response body.
-
-        For more information, see https://www.github.com/legalesign/legalesign-rest-python#with_streaming_response
-        """
-        return InvitedResourceWithStreamingResponse(self)
-
-    def list(
-        self,
-        *,
-        group: str | Omit = omit,
-        # Use the following arguments if you need to pass additional parameters to the API that aren't available via kwargs.
-        # The extra values given here take precedence over values defined on the client or passed to this method.
-        extra_headers: Headers | None = None,
-        extra_query: Query | None = None,
-        extra_body: Body | None = None,
-        timeout: float | httpx.Timeout | None | NotGiven = not_given,
-    ) -> InvitedListResponse:
-        """
-        Invitations to people to join the group are listed by email
-
-        Args:
-          group: filter list by a given group
-
-          extra_headers: Send extra headers
-
-          extra_query: Add additional query parameters to the request
-
-          extra_body: Add additional JSON properties to the request
-
-          timeout: Override the client-level default timeout for this request, in seconds
-        """
-        return self._get(
-            "/invited/",
-            options=make_request_options(
-                extra_headers=extra_headers,
-                extra_query=extra_query,
-                extra_body=extra_body,
-                timeout=timeout,
-                query=maybe_transform({"group": group}, invited_list_params.InvitedListParams),
-            ),
-            cast_to=InvitedListResponse,
-        )
-
-    def delete(
-        self,
-        invited_id: str,
-        *,
-        # Use the following arguments if you need to pass additional parameters to the API that aren't available via kwargs.
-        # The extra values given here take precedence over values defined on the client or passed to this method.
-        extra_headers: Headers | None = None,
-        extra_query: Query | None = None,
-        extra_body: Body | None = None,
-        timeout: float | httpx.Timeout | None | NotGiven = not_given,
-    ) -> None:
-        """
-        Delete invitation
-
-        Args:
-          extra_headers: Send extra headers
-
-          extra_query: Add additional query parameters to the request
-
-          extra_body: Add additional JSON properties to the request
-
-          timeout: Override the client-level default timeout for this request, in seconds
-        """
-        if not invited_id:
-            raise ValueError(f"Expected a non-empty value for `invited_id` but received {invited_id!r}")
-        extra_headers = {"Accept": "*/*", **(extra_headers or {})}
-        return self._delete(
-            f"/invited/{invited_id}/",
-            options=make_request_options(
-                extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout
-            ),
-            cast_to=NoneType,
-        )
-
-
-class AsyncInvitedResource(AsyncAPIResource):
-    @cached_property
-    def with_raw_response(self) -> AsyncInvitedResourceWithRawResponse:
-        """
-        This property can be used as a prefix for any HTTP method call to return
-        the raw response object instead of the parsed content.
-
-        For more information, see https://www.github.com/legalesign/legalesign-rest-python#accessing-raw-response-data-eg-headers
-        """
-        return AsyncInvitedResourceWithRawResponse(self)
-
-    @cached_property
-    def with_streaming_response(self) -> AsyncInvitedResourceWithStreamingResponse:
-        """
-        An alternative to `.with_raw_response` that doesn't eagerly read the response body.
-
-        For more information, see https://www.github.com/legalesign/legalesign-rest-python#with_streaming_response
-        """
-        return AsyncInvitedResourceWithStreamingResponse(self)
-
-    async def list(
-        self,
-        *,
-        group: str | Omit = omit,
-        # Use the following arguments if you need to pass additional parameters to the API that aren't available via kwargs.
-        # The extra values given here take precedence over values defined on the client or passed to this method.
-        extra_headers: Headers | None = None,
-        extra_query: Query | None = None,
-        extra_body: Body | None = None,
-        timeout: float | httpx.Timeout | None | NotGiven = not_given,
-    ) -> InvitedListResponse:
-        """
-        Invitations to people to join the group are listed by email
-
-        Args:
-          group: filter list by a given group
-
-          extra_headers: Send extra headers
-
-          extra_query: Add additional query parameters to the request
-
-          extra_body: Add additional JSON properties to the request
-
-          timeout: Override the client-level default timeout for this request, in seconds
-        """
-        return await self._get(
-            "/invited/",
-            options=make_request_options(
-                extra_headers=extra_headers,
-                extra_query=extra_query,
-                extra_body=extra_body,
-                timeout=timeout,
-                query=await async_maybe_transform({"group": group}, invited_list_params.InvitedListParams),
-            ),
-            cast_to=InvitedListResponse,
-        )
-
-    async def delete(
-        self,
-        invited_id: str,
-        *,
-        # Use the following arguments if you need to pass additional parameters to the API that aren't available via kwargs.
-        # The extra values given here take precedence over values defined on the client or passed to this method.
-        extra_headers: Headers | None = None,
-        extra_query: Query | None = None,
-        extra_body: Body | None = None,
-        timeout: float | httpx.Timeout | None | NotGiven = not_given,
-    ) -> None:
-        """
-        Delete invitation
-
-        Args:
-          extra_headers: Send extra headers
-
-          extra_query: Add additional query parameters to the request
-
-          extra_body: Add additional JSON properties to the request
-
-          timeout: Override the client-level default timeout for this request, in seconds
-        """
-        if not invited_id:
-            raise ValueError(f"Expected a non-empty value for `invited_id` but received {invited_id!r}")
-        extra_headers = {"Accept": "*/*", **(extra_headers or {})}
-        return await self._delete(
-            f"/invited/{invited_id}/",
-            options=make_request_options(
-                extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout
-            ),
-            cast_to=NoneType,
-        )
-
-
-class InvitedResourceWithRawResponse:
-    def __init__(self, invited: InvitedResource) -> None:
-        self._invited = invited
-
-        self.list = to_raw_response_wrapper(
-            invited.list,
-        )
-        self.delete = to_raw_response_wrapper(
-            invited.delete,
-        )
-
-
-class AsyncInvitedResourceWithRawResponse:
-    def __init__(self, invited: AsyncInvitedResource) -> None:
-        self._invited = invited
-
-        self.list = async_to_raw_response_wrapper(
-            invited.list,
-        )
-        self.delete = async_to_raw_response_wrapper(
-            invited.delete,
-        )
-
-
-class InvitedResourceWithStreamingResponse:
-    def __init__(self, invited: InvitedResource) -> None:
-        self._invited = invited
-
-        self.list = to_streamed_response_wrapper(
-            invited.list,
-        )
-        self.delete = to_streamed_response_wrapper(
-            invited.delete,
-        )
-
-
-class AsyncInvitedResourceWithStreamingResponse:
-    def __init__(self, invited: AsyncInvitedResource) -> None:
-        self._invited = invited
-
-        self.list = async_to_streamed_response_wrapper(
-            invited.list,
-        )
-        self.delete = async_to_streamed_response_wrapper(
-            invited.delete,
-        )
diff --git a/src/legalesign/resources/member.py b/src/legalesign/resources/member.py
deleted file mode 100644
index 08560f9..0000000
--- a/src/legalesign/resources/member.py
+++ /dev/null
@@ -1,487 +0,0 @@
-# File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.
-
-from __future__ import annotations
-
-import httpx
-
-from ..types import PermissionsEnum, member_list_params, member_create_params
-from .._types import Body, Omit, Query, Headers, NoneType, NotGiven, omit, not_given
-from .._utils import maybe_transform, async_maybe_transform
-from .._compat import cached_property
-from .._resource import SyncAPIResource, AsyncAPIResource
-from .._response import (
-    to_raw_response_wrapper,
-    to_streamed_response_wrapper,
-    async_to_raw_response_wrapper,
-    async_to_streamed_response_wrapper,
-)
-from .._base_client import make_request_options
-from ..types.member_response import MemberResponse
-from ..types.permissions_enum import PermissionsEnum
-from ..types.member_list_response import MemberListResponse
-
-__all__ = ["MemberResource", "AsyncMemberResource"]
-
-
-class MemberResource(SyncAPIResource):
-    @cached_property
-    def with_raw_response(self) -> MemberResourceWithRawResponse:
-        """
-        This property can be used as a prefix for any HTTP method call to return
-        the raw response object instead of the parsed content.
-
-        For more information, see https://www.github.com/legalesign/legalesign-rest-python#accessing-raw-response-data-eg-headers
-        """
-        return MemberResourceWithRawResponse(self)
-
-    @cached_property
-    def with_streaming_response(self) -> MemberResourceWithStreamingResponse:
-        """
-        An alternative to `.with_raw_response` that doesn't eagerly read the response body.
-
-        For more information, see https://www.github.com/legalesign/legalesign-rest-python#with_streaming_response
-        """
-        return MemberResourceWithStreamingResponse(self)
-
-    def create(
-        self,
-        *,
-        email: str,
-        group: str,
-        do_email: bool | Omit = omit,
-        permission: PermissionsEnum | Omit = omit,
-        # Use the following arguments if you need to pass additional parameters to the API that aren't available via kwargs.
-        # The extra values given here take precedence over values defined on the client or passed to this method.
-        extra_headers: Headers | None = None,
-        extra_query: Query | None = None,
-        extra_body: Body | None = None,
-        timeout: float | httpx.Timeout | None | NotGiven = not_given,
-    ) -> None:
-        """
-        If the email is a registered user then access to group will be immediate,
-        otherise an invitation will be created and emailed.
-
-        Args:
-          do_email: use legalesign to send email notification to new user
-
-          permission:
-              Permissions options:
-
-              - 1 - administrator
-              - 2 - team docs visible, create & send
-              - 3 - team docs visible, send only
-              - 4 - no team sent docs visible, send only
-              - 5 - no team docs visible, create & send
-              - 6 - team docs visible, read only
-
-          extra_headers: Send extra headers
-
-          extra_query: Add additional query parameters to the request
-
-          extra_body: Add additional JSON properties to the request
-
-          timeout: Override the client-level default timeout for this request, in seconds
-        """
-        extra_headers = {"Accept": "*/*", **(extra_headers or {})}
-        return self._post(
-            "/member/",
-            body=maybe_transform(
-                {
-                    "email": email,
-                    "group": group,
-                    "do_email": do_email,
-                    "permission": permission,
-                },
-                member_create_params.MemberCreateParams,
-            ),
-            options=make_request_options(
-                extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout
-            ),
-            cast_to=NoneType,
-        )
-
-    def retrieve(
-        self,
-        member_id: str,
-        *,
-        # Use the following arguments if you need to pass additional parameters to the API that aren't available via kwargs.
-        # The extra values given here take precedence over values defined on the client or passed to this method.
-        extra_headers: Headers | None = None,
-        extra_query: Query | None = None,
-        extra_body: Body | None = None,
-        timeout: float | httpx.Timeout | None | NotGiven = not_given,
-    ) -> MemberResponse:
-        """
-        Get group member
-
-        Args:
-          extra_headers: Send extra headers
-
-          extra_query: Add additional query parameters to the request
-
-          extra_body: Add additional JSON properties to the request
-
-          timeout: Override the client-level default timeout for this request, in seconds
-        """
-        if not member_id:
-            raise ValueError(f"Expected a non-empty value for `member_id` but received {member_id!r}")
-        return self._get(
-            f"/member/{member_id}/",
-            options=make_request_options(
-                extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout
-            ),
-            cast_to=MemberResponse,
-        )
-
-    def list(
-        self,
-        *,
-        group: str | Omit = omit,
-        limit: int | Omit = omit,
-        offset: int | Omit = omit,
-        # Use the following arguments if you need to pass additional parameters to the API that aren't available via kwargs.
-        # The extra values given here take precedence over values defined on the client or passed to this method.
-        extra_headers: Headers | None = None,
-        extra_query: Query | None = None,
-        extra_body: Body | None = None,
-        timeout: float | httpx.Timeout | None | NotGiven = not_given,
-    ) -> MemberListResponse:
-        """
-        List members of groups, one user may be in one or more groups
-
-        Args:
-          group: filter list by a given group
-
-          limit: Length of dataset to return. Use with offset query to iterate through results.
-
-          offset: Offset from start of dataset. Use with the limit query to iterate through
-              dataset.
-
-          extra_headers: Send extra headers
-
-          extra_query: Add additional query parameters to the request
-
-          extra_body: Add additional JSON properties to the request
-
-          timeout: Override the client-level default timeout for this request, in seconds
-        """
-        return self._get(
-            "/member/",
-            options=make_request_options(
-                extra_headers=extra_headers,
-                extra_query=extra_query,
-                extra_body=extra_body,
-                timeout=timeout,
-                query=maybe_transform(
-                    {
-                        "group": group,
-                        "limit": limit,
-                        "offset": offset,
-                    },
-                    member_list_params.MemberListParams,
-                ),
-            ),
-            cast_to=MemberListResponse,
-        )
-
-    def delete(
-        self,
-        member_id: str,
-        *,
-        # Use the following arguments if you need to pass additional parameters to the API that aren't available via kwargs.
-        # The extra values given here take precedence over values defined on the client or passed to this method.
-        extra_headers: Headers | None = None,
-        extra_query: Query | None = None,
-        extra_body: Body | None = None,
-        timeout: float | httpx.Timeout | None | NotGiven = not_given,
-    ) -> None:
-        """
-        Remove member from group
-
-        Args:
-          extra_headers: Send extra headers
-
-          extra_query: Add additional query parameters to the request
-
-          extra_body: Add additional JSON properties to the request
-
-          timeout: Override the client-level default timeout for this request, in seconds
-        """
-        if not member_id:
-            raise ValueError(f"Expected a non-empty value for `member_id` but received {member_id!r}")
-        extra_headers = {"Accept": "*/*", **(extra_headers or {})}
-        return self._delete(
-            f"/member/{member_id}/",
-            options=make_request_options(
-                extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout
-            ),
-            cast_to=NoneType,
-        )
-
-
-class AsyncMemberResource(AsyncAPIResource):
-    @cached_property
-    def with_raw_response(self) -> AsyncMemberResourceWithRawResponse:
-        """
-        This property can be used as a prefix for any HTTP method call to return
-        the raw response object instead of the parsed content.
-
-        For more information, see https://www.github.com/legalesign/legalesign-rest-python#accessing-raw-response-data-eg-headers
-        """
-        return AsyncMemberResourceWithRawResponse(self)
-
-    @cached_property
-    def with_streaming_response(self) -> AsyncMemberResourceWithStreamingResponse:
-        """
-        An alternative to `.with_raw_response` that doesn't eagerly read the response body.
-
-        For more information, see https://www.github.com/legalesign/legalesign-rest-python#with_streaming_response
-        """
-        return AsyncMemberResourceWithStreamingResponse(self)
-
-    async def create(
-        self,
-        *,
-        email: str,
-        group: str,
-        do_email: bool | Omit = omit,
-        permission: PermissionsEnum | Omit = omit,
-        # Use the following arguments if you need to pass additional parameters to the API that aren't available via kwargs.
-        # The extra values given here take precedence over values defined on the client or passed to this method.
-        extra_headers: Headers | None = None,
-        extra_query: Query | None = None,
-        extra_body: Body | None = None,
-        timeout: float | httpx.Timeout | None | NotGiven = not_given,
-    ) -> None:
-        """
-        If the email is a registered user then access to group will be immediate,
-        otherise an invitation will be created and emailed.
-
-        Args:
-          do_email: use legalesign to send email notification to new user
-
-          permission:
-              Permissions options:
-
-              - 1 - administrator
-              - 2 - team docs visible, create & send
-              - 3 - team docs visible, send only
-              - 4 - no team sent docs visible, send only
-              - 5 - no team docs visible, create & send
-              - 6 - team docs visible, read only
-
-          extra_headers: Send extra headers
-
-          extra_query: Add additional query parameters to the request
-
-          extra_body: Add additional JSON properties to the request
-
-          timeout: Override the client-level default timeout for this request, in seconds
-        """
-        extra_headers = {"Accept": "*/*", **(extra_headers or {})}
-        return await self._post(
-            "/member/",
-            body=await async_maybe_transform(
-                {
-                    "email": email,
-                    "group": group,
-                    "do_email": do_email,
-                    "permission": permission,
-                },
-                member_create_params.MemberCreateParams,
-            ),
-            options=make_request_options(
-                extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout
-            ),
-            cast_to=NoneType,
-        )
-
-    async def retrieve(
-        self,
-        member_id: str,
-        *,
-        # Use the following arguments if you need to pass additional parameters to the API that aren't available via kwargs.
-        # The extra values given here take precedence over values defined on the client or passed to this method.
-        extra_headers: Headers | None = None,
-        extra_query: Query | None = None,
-        extra_body: Body | None = None,
-        timeout: float | httpx.Timeout | None | NotGiven = not_given,
-    ) -> MemberResponse:
-        """
-        Get group member
-
-        Args:
-          extra_headers: Send extra headers
-
-          extra_query: Add additional query parameters to the request
-
-          extra_body: Add additional JSON properties to the request
-
-          timeout: Override the client-level default timeout for this request, in seconds
-        """
-        if not member_id:
-            raise ValueError(f"Expected a non-empty value for `member_id` but received {member_id!r}")
-        return await self._get(
-            f"/member/{member_id}/",
-            options=make_request_options(
-                extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout
-            ),
-            cast_to=MemberResponse,
-        )
-
-    async def list(
-        self,
-        *,
-        group: str | Omit = omit,
-        limit: int | Omit = omit,
-        offset: int | Omit = omit,
-        # Use the following arguments if you need to pass additional parameters to the API that aren't available via kwargs.
-        # The extra values given here take precedence over values defined on the client or passed to this method.
-        extra_headers: Headers | None = None,
-        extra_query: Query | None = None,
-        extra_body: Body | None = None,
-        timeout: float | httpx.Timeout | None | NotGiven = not_given,
-    ) -> MemberListResponse:
-        """
-        List members of groups, one user may be in one or more groups
-
-        Args:
-          group: filter list by a given group
-
-          limit: Length of dataset to return. Use with offset query to iterate through results.
-
-          offset: Offset from start of dataset. Use with the limit query to iterate through
-              dataset.
-
-          extra_headers: Send extra headers
-
-          extra_query: Add additional query parameters to the request
-
-          extra_body: Add additional JSON properties to the request
-
-          timeout: Override the client-level default timeout for this request, in seconds
-        """
-        return await self._get(
-            "/member/",
-            options=make_request_options(
-                extra_headers=extra_headers,
-                extra_query=extra_query,
-                extra_body=extra_body,
-                timeout=timeout,
-                query=await async_maybe_transform(
-                    {
-                        "group": group,
-                        "limit": limit,
-                        "offset": offset,
-                    },
-                    member_list_params.MemberListParams,
-                ),
-            ),
-            cast_to=MemberListResponse,
-        )
-
-    async def delete(
-        self,
-        member_id: str,
-        *,
-        # Use the following arguments if you need to pass additional parameters to the API that aren't available via kwargs.
-        # The extra values given here take precedence over values defined on the client or passed to this method.
-        extra_headers: Headers | None = None,
-        extra_query: Query | None = None,
-        extra_body: Body | None = None,
-        timeout: float | httpx.Timeout | None | NotGiven = not_given,
-    ) -> None:
-        """
-        Remove member from group
-
-        Args:
-          extra_headers: Send extra headers
-
-          extra_query: Add additional query parameters to the request
-
-          extra_body: Add additional JSON properties to the request
-
-          timeout: Override the client-level default timeout for this request, in seconds
-        """
-        if not member_id:
-            raise ValueError(f"Expected a non-empty value for `member_id` but received {member_id!r}")
-        extra_headers = {"Accept": "*/*", **(extra_headers or {})}
-        return await self._delete(
-            f"/member/{member_id}/",
-            options=make_request_options(
-                extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout
-            ),
-            cast_to=NoneType,
-        )
-
-
-class MemberResourceWithRawResponse:
-    def __init__(self, member: MemberResource) -> None:
-        self._member = member
-
-        self.create = to_raw_response_wrapper(
-            member.create,
-        )
-        self.retrieve = to_raw_response_wrapper(
-            member.retrieve,
-        )
-        self.list = to_raw_response_wrapper(
-            member.list,
-        )
-        self.delete = to_raw_response_wrapper(
-            member.delete,
-        )
-
-
-class AsyncMemberResourceWithRawResponse:
-    def __init__(self, member: AsyncMemberResource) -> None:
-        self._member = member
-
-        self.create = async_to_raw_response_wrapper(
-            member.create,
-        )
-        self.retrieve = async_to_raw_response_wrapper(
-            member.retrieve,
-        )
-        self.list = async_to_raw_response_wrapper(
-            member.list,
-        )
-        self.delete = async_to_raw_response_wrapper(
-            member.delete,
-        )
-
-
-class MemberResourceWithStreamingResponse:
-    def __init__(self, member: MemberResource) -> None:
-        self._member = member
-
-        self.create = to_streamed_response_wrapper(
-            member.create,
-        )
-        self.retrieve = to_streamed_response_wrapper(
-            member.retrieve,
-        )
-        self.list = to_streamed_response_wrapper(
-            member.list,
-        )
-        self.delete = to_streamed_response_wrapper(
-            member.delete,
-        )
-
-
-class AsyncMemberResourceWithStreamingResponse:
-    def __init__(self, member: AsyncMemberResource) -> None:
-        self._member = member
-
-        self.create = async_to_streamed_response_wrapper(
-            member.create,
-        )
-        self.retrieve = async_to_streamed_response_wrapper(
-            member.retrieve,
-        )
-        self.list = async_to_streamed_response_wrapper(
-            member.list,
-        )
-        self.delete = async_to_streamed_response_wrapper(
-            member.delete,
-        )
diff --git a/src/legalesign/resources/notifications.py b/src/legalesign/resources/notifications.py
deleted file mode 100644
index 137a6d5..0000000
--- a/src/legalesign/resources/notifications.py
+++ /dev/null
@@ -1,135 +0,0 @@
-# File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.
-
-from __future__ import annotations
-
-import httpx
-
-from .._types import Body, Query, Headers, NotGiven, not_given
-from .._compat import cached_property
-from .._resource import SyncAPIResource, AsyncAPIResource
-from .._response import (
-    to_raw_response_wrapper,
-    to_streamed_response_wrapper,
-    async_to_raw_response_wrapper,
-    async_to_streamed_response_wrapper,
-)
-from .._base_client import make_request_options
-from ..types.notification_list_response import NotificationListResponse
-
-__all__ = ["NotificationsResource", "AsyncNotificationsResource"]
-
-
-class NotificationsResource(SyncAPIResource):
-    @cached_property
-    def with_raw_response(self) -> NotificationsResourceWithRawResponse:
-        """
-        This property can be used as a prefix for any HTTP method call to return
-        the raw response object instead of the parsed content.
-
-        For more information, see https://www.github.com/legalesign/legalesign-rest-python#accessing-raw-response-data-eg-headers
-        """
-        return NotificationsResourceWithRawResponse(self)
-
-    @cached_property
-    def with_streaming_response(self) -> NotificationsResourceWithStreamingResponse:
-        """
-        An alternative to `.with_raw_response` that doesn't eagerly read the response body.
-
-        For more information, see https://www.github.com/legalesign/legalesign-rest-python#with_streaming_response
-        """
-        return NotificationsResourceWithStreamingResponse(self)
-
-    def list(
-        self,
-        *,
-        # Use the following arguments if you need to pass additional parameters to the API that aren't available via kwargs.
-        # The extra values given here take precedence over values defined on the client or passed to this method.
-        extra_headers: Headers | None = None,
-        extra_query: Query | None = None,
-        extra_body: Body | None = None,
-        timeout: float | httpx.Timeout | None | NotGiven = not_given,
-    ) -> NotificationListResponse:
-        """Callbacks sent to URL of your choice"""
-        return self._get(
-            "/notifications/",
-            options=make_request_options(
-                extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout
-            ),
-            cast_to=NotificationListResponse,
-        )
-
-
-class AsyncNotificationsResource(AsyncAPIResource):
-    @cached_property
-    def with_raw_response(self) -> AsyncNotificationsResourceWithRawResponse:
-        """
-        This property can be used as a prefix for any HTTP method call to return
-        the raw response object instead of the parsed content.
-
-        For more information, see https://www.github.com/legalesign/legalesign-rest-python#accessing-raw-response-data-eg-headers
-        """
-        return AsyncNotificationsResourceWithRawResponse(self)
-
-    @cached_property
-    def with_streaming_response(self) -> AsyncNotificationsResourceWithStreamingResponse:
-        """
-        An alternative to `.with_raw_response` that doesn't eagerly read the response body.
-
-        For more information, see https://www.github.com/legalesign/legalesign-rest-python#with_streaming_response
-        """
-        return AsyncNotificationsResourceWithStreamingResponse(self)
-
-    async def list(
-        self,
-        *,
-        # Use the following arguments if you need to pass additional parameters to the API that aren't available via kwargs.
-        # The extra values given here take precedence over values defined on the client or passed to this method.
-        extra_headers: Headers | None = None,
-        extra_query: Query | None = None,
-        extra_body: Body | None = None,
-        timeout: float | httpx.Timeout | None | NotGiven = not_given,
-    ) -> NotificationListResponse:
-        """Callbacks sent to URL of your choice"""
-        return await self._get(
-            "/notifications/",
-            options=make_request_options(
-                extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout
-            ),
-            cast_to=NotificationListResponse,
-        )
-
-
-class NotificationsResourceWithRawResponse:
-    def __init__(self, notifications: NotificationsResource) -> None:
-        self._notifications = notifications
-
-        self.list = to_raw_response_wrapper(
-            notifications.list,
-        )
-
-
-class AsyncNotificationsResourceWithRawResponse:
-    def __init__(self, notifications: AsyncNotificationsResource) -> None:
-        self._notifications = notifications
-
-        self.list = async_to_raw_response_wrapper(
-            notifications.list,
-        )
-
-
-class NotificationsResourceWithStreamingResponse:
-    def __init__(self, notifications: NotificationsResource) -> None:
-        self._notifications = notifications
-
-        self.list = to_streamed_response_wrapper(
-            notifications.list,
-        )
-
-
-class AsyncNotificationsResourceWithStreamingResponse:
-    def __init__(self, notifications: AsyncNotificationsResource) -> None:
-        self._notifications = notifications
-
-        self.list = async_to_streamed_response_wrapper(
-            notifications.list,
-        )
diff --git a/src/legalesign/resources/pdf.py b/src/legalesign/resources/pdf.py
deleted file mode 100644
index b30bc00..0000000
--- a/src/legalesign/resources/pdf.py
+++ /dev/null
@@ -1,318 +0,0 @@
-# File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.
-
-from __future__ import annotations
-
-import httpx
-
-from ..types import pdf_create_preview_params
-from .._types import Body, Omit, Query, Headers, NotGiven, omit, not_given
-from .._utils import maybe_transform, async_maybe_transform
-from .._compat import cached_property
-from .._resource import SyncAPIResource, AsyncAPIResource
-from .._response import (
-    BinaryAPIResponse,
-    AsyncBinaryAPIResponse,
-    StreamedBinaryAPIResponse,
-    AsyncStreamedBinaryAPIResponse,
-    to_custom_raw_response_wrapper,
-    to_custom_streamed_response_wrapper,
-    async_to_custom_raw_response_wrapper,
-    async_to_custom_streamed_response_wrapper,
-)
-from .._base_client import make_request_options
-
-__all__ = ["PdfResource", "AsyncPdfResource"]
-
-
-class PdfResource(SyncAPIResource):
-    @cached_property
-    def with_raw_response(self) -> PdfResourceWithRawResponse:
-        """
-        This property can be used as a prefix for any HTTP method call to return
-        the raw response object instead of the parsed content.
-
-        For more information, see https://www.github.com/legalesign/legalesign-rest-python#accessing-raw-response-data-eg-headers
-        """
-        return PdfResourceWithRawResponse(self)
-
-    @cached_property
-    def with_streaming_response(self) -> PdfResourceWithStreamingResponse:
-        """
-        An alternative to `.with_raw_response` that doesn't eagerly read the response body.
-
-        For more information, see https://www.github.com/legalesign/legalesign-rest-python#with_streaming_response
-        """
-        return PdfResourceWithStreamingResponse(self)
-
-    def retrieve(
-        self,
-        doc_id: str,
-        *,
-        # Use the following arguments if you need to pass additional parameters to the API that aren't available via kwargs.
-        # The extra values given here take precedence over values defined on the client or passed to this method.
-        extra_headers: Headers | None = None,
-        extra_query: Query | None = None,
-        extra_body: Body | None = None,
-        timeout: float | httpx.Timeout | None | NotGiven = not_given,
-    ) -> BinaryAPIResponse:
-        """
-        Get the PDF for a signing document
-
-        Args:
-          extra_headers: Send extra headers
-
-          extra_query: Add additional query parameters to the request
-
-          extra_body: Add additional JSON properties to the request
-
-          timeout: Override the client-level default timeout for this request, in seconds
-        """
-        if not doc_id:
-            raise ValueError(f"Expected a non-empty value for `doc_id` but received {doc_id!r}")
-        extra_headers = {"Accept": "application/pdf", **(extra_headers or {})}
-        return self._get(
-            f"/pdf/{doc_id}/",
-            options=make_request_options(
-                extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout
-            ),
-            cast_to=BinaryAPIResponse,
-        )
-
-    def create_preview(
-        self,
-        *,
-        group: str,
-        is_signature_per_page: int,
-        signature_type: int,
-        signee_count: int,
-        text: str,
-        footer: str | Omit = omit,
-        footer_height: int | Omit = omit,
-        header: str | Omit = omit,
-        header_height: int | Omit = omit,
-        pdfheader: bool | Omit = omit,
-        title: str | Omit = omit,
-        # Use the following arguments if you need to pass additional parameters to the API that aren't available via kwargs.
-        # The extra values given here take precedence over values defined on the client or passed to this method.
-        extra_headers: Headers | None = None,
-        extra_query: Query | None = None,
-        extra_body: Body | None = None,
-        timeout: float | httpx.Timeout | None | NotGiven = not_given,
-    ) -> BinaryAPIResponse:
-        """
-        text/html document as pdf preview
-
-        Args:
-          signee_count: number of signers
-
-          text: raw html
-
-          pdfheader: Set to true to use group default
-
-          extra_headers: Send extra headers
-
-          extra_query: Add additional query parameters to the request
-
-          extra_body: Add additional JSON properties to the request
-
-          timeout: Override the client-level default timeout for this request, in seconds
-        """
-        extra_headers = {"Accept": "application/pdf", **(extra_headers or {})}
-        return self._post(
-            "/pdf/preview/",
-            body=maybe_transform(
-                {
-                    "group": group,
-                    "is_signature_per_page": is_signature_per_page,
-                    "signature_type": signature_type,
-                    "signee_count": signee_count,
-                    "text": text,
-                    "footer": footer,
-                    "footer_height": footer_height,
-                    "header": header,
-                    "header_height": header_height,
-                    "pdfheader": pdfheader,
-                    "title": title,
-                },
-                pdf_create_preview_params.PdfCreatePreviewParams,
-            ),
-            options=make_request_options(
-                extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout
-            ),
-            cast_to=BinaryAPIResponse,
-        )
-
-
-class AsyncPdfResource(AsyncAPIResource):
-    @cached_property
-    def with_raw_response(self) -> AsyncPdfResourceWithRawResponse:
-        """
-        This property can be used as a prefix for any HTTP method call to return
-        the raw response object instead of the parsed content.
-
-        For more information, see https://www.github.com/legalesign/legalesign-rest-python#accessing-raw-response-data-eg-headers
-        """
-        return AsyncPdfResourceWithRawResponse(self)
-
-    @cached_property
-    def with_streaming_response(self) -> AsyncPdfResourceWithStreamingResponse:
-        """
-        An alternative to `.with_raw_response` that doesn't eagerly read the response body.
-
-        For more information, see https://www.github.com/legalesign/legalesign-rest-python#with_streaming_response
-        """
-        return AsyncPdfResourceWithStreamingResponse(self)
-
-    async def retrieve(
-        self,
-        doc_id: str,
-        *,
-        # Use the following arguments if you need to pass additional parameters to the API that aren't available via kwargs.
-        # The extra values given here take precedence over values defined on the client or passed to this method.
-        extra_headers: Headers | None = None,
-        extra_query: Query | None = None,
-        extra_body: Body | None = None,
-        timeout: float | httpx.Timeout | None | NotGiven = not_given,
-    ) -> AsyncBinaryAPIResponse:
-        """
-        Get the PDF for a signing document
-
-        Args:
-          extra_headers: Send extra headers
-
-          extra_query: Add additional query parameters to the request
-
-          extra_body: Add additional JSON properties to the request
-
-          timeout: Override the client-level default timeout for this request, in seconds
-        """
-        if not doc_id:
-            raise ValueError(f"Expected a non-empty value for `doc_id` but received {doc_id!r}")
-        extra_headers = {"Accept": "application/pdf", **(extra_headers or {})}
-        return await self._get(
-            f"/pdf/{doc_id}/",
-            options=make_request_options(
-                extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout
-            ),
-            cast_to=AsyncBinaryAPIResponse,
-        )
-
-    async def create_preview(
-        self,
-        *,
-        group: str,
-        is_signature_per_page: int,
-        signature_type: int,
-        signee_count: int,
-        text: str,
-        footer: str | Omit = omit,
-        footer_height: int | Omit = omit,
-        header: str | Omit = omit,
-        header_height: int | Omit = omit,
-        pdfheader: bool | Omit = omit,
-        title: str | Omit = omit,
-        # Use the following arguments if you need to pass additional parameters to the API that aren't available via kwargs.
-        # The extra values given here take precedence over values defined on the client or passed to this method.
-        extra_headers: Headers | None = None,
-        extra_query: Query | None = None,
-        extra_body: Body | None = None,
-        timeout: float | httpx.Timeout | None | NotGiven = not_given,
-    ) -> AsyncBinaryAPIResponse:
-        """
-        text/html document as pdf preview
-
-        Args:
-          signee_count: number of signers
-
-          text: raw html
-
-          pdfheader: Set to true to use group default
-
-          extra_headers: Send extra headers
-
-          extra_query: Add additional query parameters to the request
-
-          extra_body: Add additional JSON properties to the request
-
-          timeout: Override the client-level default timeout for this request, in seconds
-        """
-        extra_headers = {"Accept": "application/pdf", **(extra_headers or {})}
-        return await self._post(
-            "/pdf/preview/",
-            body=await async_maybe_transform(
-                {
-                    "group": group,
-                    "is_signature_per_page": is_signature_per_page,
-                    "signature_type": signature_type,
-                    "signee_count": signee_count,
-                    "text": text,
-                    "footer": footer,
-                    "footer_height": footer_height,
-                    "header": header,
-                    "header_height": header_height,
-                    "pdfheader": pdfheader,
-                    "title": title,
-                },
-                pdf_create_preview_params.PdfCreatePreviewParams,
-            ),
-            options=make_request_options(
-                extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout
-            ),
-            cast_to=AsyncBinaryAPIResponse,
-        )
-
-
-class PdfResourceWithRawResponse:
-    def __init__(self, pdf: PdfResource) -> None:
-        self._pdf = pdf
-
-        self.retrieve = to_custom_raw_response_wrapper(
-            pdf.retrieve,
-            BinaryAPIResponse,
-        )
-        self.create_preview = to_custom_raw_response_wrapper(
-            pdf.create_preview,
-            BinaryAPIResponse,
-        )
-
-
-class AsyncPdfResourceWithRawResponse:
-    def __init__(self, pdf: AsyncPdfResource) -> None:
-        self._pdf = pdf
-
-        self.retrieve = async_to_custom_raw_response_wrapper(
-            pdf.retrieve,
-            AsyncBinaryAPIResponse,
-        )
-        self.create_preview = async_to_custom_raw_response_wrapper(
-            pdf.create_preview,
-            AsyncBinaryAPIResponse,
-        )
-
-
-class PdfResourceWithStreamingResponse:
-    def __init__(self, pdf: PdfResource) -> None:
-        self._pdf = pdf
-
-        self.retrieve = to_custom_streamed_response_wrapper(
-            pdf.retrieve,
-            StreamedBinaryAPIResponse,
-        )
-        self.create_preview = to_custom_streamed_response_wrapper(
-            pdf.create_preview,
-            StreamedBinaryAPIResponse,
-        )
-
-
-class AsyncPdfResourceWithStreamingResponse:
-    def __init__(self, pdf: AsyncPdfResource) -> None:
-        self._pdf = pdf
-
-        self.retrieve = async_to_custom_streamed_response_wrapper(
-            pdf.retrieve,
-            AsyncStreamedBinaryAPIResponse,
-        )
-        self.create_preview = async_to_custom_streamed_response_wrapper(
-            pdf.create_preview,
-            AsyncStreamedBinaryAPIResponse,
-        )
diff --git a/src/legalesign/resources/status.py b/src/legalesign/resources/status.py
deleted file mode 100644
index 6a0c9d8..0000000
--- a/src/legalesign/resources/status.py
+++ /dev/null
@@ -1,280 +0,0 @@
-# File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.
-
-from __future__ import annotations
-
-import httpx
-
-from ..types import status_retrieve_all_params
-from .._types import Body, Omit, Query, Headers, NotGiven, omit, not_given
-from .._utils import maybe_transform, async_maybe_transform
-from .._compat import cached_property
-from .._resource import SyncAPIResource, AsyncAPIResource
-from .._response import (
-    to_raw_response_wrapper,
-    to_streamed_response_wrapper,
-    async_to_raw_response_wrapper,
-    async_to_streamed_response_wrapper,
-)
-from .._base_client import make_request_options
-from ..types.status_response import StatusResponse
-from ..types.status_retrieve_all_response import StatusRetrieveAllResponse
-
-__all__ = ["StatusResource", "AsyncStatusResource"]
-
-
-class StatusResource(SyncAPIResource):
-    @cached_property
-    def with_raw_response(self) -> StatusResourceWithRawResponse:
-        """
-        This property can be used as a prefix for any HTTP method call to return
-        the raw response object instead of the parsed content.
-
-        For more information, see https://www.github.com/legalesign/legalesign-rest-python#accessing-raw-response-data-eg-headers
-        """
-        return StatusResourceWithRawResponse(self)
-
-    @cached_property
-    def with_streaming_response(self) -> StatusResourceWithStreamingResponse:
-        """
-        An alternative to `.with_raw_response` that doesn't eagerly read the response body.
-
-        For more information, see https://www.github.com/legalesign/legalesign-rest-python#with_streaming_response
-        """
-        return StatusResourceWithStreamingResponse(self)
-
-    def retrieve(
-        self,
-        doc_id: str,
-        *,
-        # Use the following arguments if you need to pass additional parameters to the API that aren't available via kwargs.
-        # The extra values given here take precedence over values defined on the client or passed to this method.
-        extra_headers: Headers | None = None,
-        extra_query: Query | None = None,
-        extra_body: Body | None = None,
-        timeout: float | httpx.Timeout | None | NotGiven = not_given,
-    ) -> StatusResponse:
-        """
-        Faster short query for a document status
-
-        Args:
-          extra_headers: Send extra headers
-
-          extra_query: Add additional query parameters to the request
-
-          extra_body: Add additional JSON properties to the request
-
-          timeout: Override the client-level default timeout for this request, in seconds
-        """
-        if not doc_id:
-            raise ValueError(f"Expected a non-empty value for `doc_id` but received {doc_id!r}")
-        return self._get(
-            f"/status/{doc_id}/",
-            options=make_request_options(
-                extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout
-            ),
-            cast_to=StatusResponse,
-        )
-
-    def retrieve_all(
-        self,
-        *,
-        filter: str | Omit = omit,
-        limit: int | Omit = omit,
-        offset: int | Omit = omit,
-        # Use the following arguments if you need to pass additional parameters to the API that aren't available via kwargs.
-        # The extra values given here take precedence over values defined on the client or passed to this method.
-        extra_headers: Headers | None = None,
-        extra_query: Query | None = None,
-        extra_body: Body | None = None,
-        timeout: float | httpx.Timeout | None | NotGiven = not_given,
-    ) -> StatusRetrieveAllResponse:
-        """
-        Shortened faster query for status of signing documents
-
-        Args:
-          filter: Filter on archived status, default is false
-
-          limit: Length of dataset to return. Use with offset query to iterate through results.
-
-          offset: Offset from start of dataset. Use with the limit query to iterate through
-              dataset.
-
-          extra_headers: Send extra headers
-
-          extra_query: Add additional query parameters to the request
-
-          extra_body: Add additional JSON properties to the request
-
-          timeout: Override the client-level default timeout for this request, in seconds
-        """
-        return self._get(
-            "/status/",
-            options=make_request_options(
-                extra_headers=extra_headers,
-                extra_query=extra_query,
-                extra_body=extra_body,
-                timeout=timeout,
-                query=maybe_transform(
-                    {
-                        "filter": filter,
-                        "limit": limit,
-                        "offset": offset,
-                    },
-                    status_retrieve_all_params.StatusRetrieveAllParams,
-                ),
-            ),
-            cast_to=StatusRetrieveAllResponse,
-        )
-
-
-class AsyncStatusResource(AsyncAPIResource):
-    @cached_property
-    def with_raw_response(self) -> AsyncStatusResourceWithRawResponse:
-        """
-        This property can be used as a prefix for any HTTP method call to return
-        the raw response object instead of the parsed content.
-
-        For more information, see https://www.github.com/legalesign/legalesign-rest-python#accessing-raw-response-data-eg-headers
-        """
-        return AsyncStatusResourceWithRawResponse(self)
-
-    @cached_property
-    def with_streaming_response(self) -> AsyncStatusResourceWithStreamingResponse:
-        """
-        An alternative to `.with_raw_response` that doesn't eagerly read the response body.
-
-        For more information, see https://www.github.com/legalesign/legalesign-rest-python#with_streaming_response
-        """
-        return AsyncStatusResourceWithStreamingResponse(self)
-
-    async def retrieve(
-        self,
-        doc_id: str,
-        *,
-        # Use the following arguments if you need to pass additional parameters to the API that aren't available via kwargs.
-        # The extra values given here take precedence over values defined on the client or passed to this method.
-        extra_headers: Headers | None = None,
-        extra_query: Query | None = None,
-        extra_body: Body | None = None,
-        timeout: float | httpx.Timeout | None | NotGiven = not_given,
-    ) -> StatusResponse:
-        """
-        Faster short query for a document status
-
-        Args:
-          extra_headers: Send extra headers
-
-          extra_query: Add additional query parameters to the request
-
-          extra_body: Add additional JSON properties to the request
-
-          timeout: Override the client-level default timeout for this request, in seconds
-        """
-        if not doc_id:
-            raise ValueError(f"Expected a non-empty value for `doc_id` but received {doc_id!r}")
-        return await self._get(
-            f"/status/{doc_id}/",
-            options=make_request_options(
-                extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout
-            ),
-            cast_to=StatusResponse,
-        )
-
-    async def retrieve_all(
-        self,
-        *,
-        filter: str | Omit = omit,
-        limit: int | Omit = omit,
-        offset: int | Omit = omit,
-        # Use the following arguments if you need to pass additional parameters to the API that aren't available via kwargs.
-        # The extra values given here take precedence over values defined on the client or passed to this method.
-        extra_headers: Headers | None = None,
-        extra_query: Query | None = None,
-        extra_body: Body | None = None,
-        timeout: float | httpx.Timeout | None | NotGiven = not_given,
-    ) -> StatusRetrieveAllResponse:
-        """
-        Shortened faster query for status of signing documents
-
-        Args:
-          filter: Filter on archived status, default is false
-
-          limit: Length of dataset to return. Use with offset query to iterate through results.
-
-          offset: Offset from start of dataset. Use with the limit query to iterate through
-              dataset.
-
-          extra_headers: Send extra headers
-
-          extra_query: Add additional query parameters to the request
-
-          extra_body: Add additional JSON properties to the request
-
-          timeout: Override the client-level default timeout for this request, in seconds
-        """
-        return await self._get(
-            "/status/",
-            options=make_request_options(
-                extra_headers=extra_headers,
-                extra_query=extra_query,
-                extra_body=extra_body,
-                timeout=timeout,
-                query=await async_maybe_transform(
-                    {
-                        "filter": filter,
-                        "limit": limit,
-                        "offset": offset,
-                    },
-                    status_retrieve_all_params.StatusRetrieveAllParams,
-                ),
-            ),
-            cast_to=StatusRetrieveAllResponse,
-        )
-
-
-class StatusResourceWithRawResponse:
-    def __init__(self, status: StatusResource) -> None:
-        self._status = status
-
-        self.retrieve = to_raw_response_wrapper(
-            status.retrieve,
-        )
-        self.retrieve_all = to_raw_response_wrapper(
-            status.retrieve_all,
-        )
-
-
-class AsyncStatusResourceWithRawResponse:
-    def __init__(self, status: AsyncStatusResource) -> None:
-        self._status = status
-
-        self.retrieve = async_to_raw_response_wrapper(
-            status.retrieve,
-        )
-        self.retrieve_all = async_to_raw_response_wrapper(
-            status.retrieve_all,
-        )
-
-
-class StatusResourceWithStreamingResponse:
-    def __init__(self, status: StatusResource) -> None:
-        self._status = status
-
-        self.retrieve = to_streamed_response_wrapper(
-            status.retrieve,
-        )
-        self.retrieve_all = to_streamed_response_wrapper(
-            status.retrieve_all,
-        )
-
-
-class AsyncStatusResourceWithStreamingResponse:
-    def __init__(self, status: AsyncStatusResource) -> None:
-        self._status = status
-
-        self.retrieve = async_to_streamed_response_wrapper(
-            status.retrieve,
-        )
-        self.retrieve_all = async_to_streamed_response_wrapper(
-            status.retrieve_all,
-        )
diff --git a/src/legalesign/resources/subscribe.py b/src/legalesign/resources/subscribe.py
deleted file mode 100644
index 261c7a0..0000000
--- a/src/legalesign/resources/subscribe.py
+++ /dev/null
@@ -1,197 +0,0 @@
-# File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.
-
-from __future__ import annotations
-
-import httpx
-
-from ..types import WebhookEventFilterEnum, subscribe_create_webhook_params
-from .._types import Body, Omit, Query, Headers, NoneType, NotGiven, omit, not_given
-from .._utils import maybe_transform, async_maybe_transform
-from .._compat import cached_property
-from .._resource import SyncAPIResource, AsyncAPIResource
-from .._response import (
-    to_raw_response_wrapper,
-    to_streamed_response_wrapper,
-    async_to_raw_response_wrapper,
-    async_to_streamed_response_wrapper,
-)
-from .._base_client import make_request_options
-from ..types.webhook_event_filter_enum import WebhookEventFilterEnum
-
-__all__ = ["SubscribeResource", "AsyncSubscribeResource"]
-
-
-class SubscribeResource(SyncAPIResource):
-    @cached_property
-    def with_raw_response(self) -> SubscribeResourceWithRawResponse:
-        """
-        This property can be used as a prefix for any HTTP method call to return
-        the raw response object instead of the parsed content.
-
-        For more information, see https://www.github.com/legalesign/legalesign-rest-python#accessing-raw-response-data-eg-headers
-        """
-        return SubscribeResourceWithRawResponse(self)
-
-    @cached_property
-    def with_streaming_response(self) -> SubscribeResourceWithStreamingResponse:
-        """
-        An alternative to `.with_raw_response` that doesn't eagerly read the response body.
-
-        For more information, see https://www.github.com/legalesign/legalesign-rest-python#with_streaming_response
-        """
-        return SubscribeResourceWithStreamingResponse(self)
-
-    def create_webhook(
-        self,
-        *,
-        notify: str,
-        url: str,
-        event_filter: WebhookEventFilterEnum | Omit = omit,
-        group: str | Omit = omit,
-        # Use the following arguments if you need to pass additional parameters to the API that aren't available via kwargs.
-        # The extra values given here take precedence over values defined on the client or passed to this method.
-        extra_headers: Headers | None = None,
-        extra_query: Query | None = None,
-        extra_body: Body | None = None,
-        timeout: float | httpx.Timeout | None | NotGiven = not_given,
-    ) -> None:
-        """
-        Create webhook
-
-        Args:
-          notify: The type of callback to receive, value must be all, signed, sent, rejected or
-              realtime
-
-          url: The URL where you wish to get notified
-
-          extra_headers: Send extra headers
-
-          extra_query: Add additional query parameters to the request
-
-          extra_body: Add additional JSON properties to the request
-
-          timeout: Override the client-level default timeout for this request, in seconds
-        """
-        extra_headers = {"Accept": "*/*", **(extra_headers or {})}
-        return self._post(
-            "/subscribe/",
-            body=maybe_transform(
-                {
-                    "notify": notify,
-                    "url": url,
-                    "event_filter": event_filter,
-                    "group": group,
-                },
-                subscribe_create_webhook_params.SubscribeCreateWebhookParams,
-            ),
-            options=make_request_options(
-                extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout
-            ),
-            cast_to=NoneType,
-        )
-
-
-class AsyncSubscribeResource(AsyncAPIResource):
-    @cached_property
-    def with_raw_response(self) -> AsyncSubscribeResourceWithRawResponse:
-        """
-        This property can be used as a prefix for any HTTP method call to return
-        the raw response object instead of the parsed content.
-
-        For more information, see https://www.github.com/legalesign/legalesign-rest-python#accessing-raw-response-data-eg-headers
-        """
-        return AsyncSubscribeResourceWithRawResponse(self)
-
-    @cached_property
-    def with_streaming_response(self) -> AsyncSubscribeResourceWithStreamingResponse:
-        """
-        An alternative to `.with_raw_response` that doesn't eagerly read the response body.
-
-        For more information, see https://www.github.com/legalesign/legalesign-rest-python#with_streaming_response
-        """
-        return AsyncSubscribeResourceWithStreamingResponse(self)
-
-    async def create_webhook(
-        self,
-        *,
-        notify: str,
-        url: str,
-        event_filter: WebhookEventFilterEnum | Omit = omit,
-        group: str | Omit = omit,
-        # Use the following arguments if you need to pass additional parameters to the API that aren't available via kwargs.
-        # The extra values given here take precedence over values defined on the client or passed to this method.
-        extra_headers: Headers | None = None,
-        extra_query: Query | None = None,
-        extra_body: Body | None = None,
-        timeout: float | httpx.Timeout | None | NotGiven = not_given,
-    ) -> None:
-        """
-        Create webhook
-
-        Args:
-          notify: The type of callback to receive, value must be all, signed, sent, rejected or
-              realtime
-
-          url: The URL where you wish to get notified
-
-          extra_headers: Send extra headers
-
-          extra_query: Add additional query parameters to the request
-
-          extra_body: Add additional JSON properties to the request
-
-          timeout: Override the client-level default timeout for this request, in seconds
-        """
-        extra_headers = {"Accept": "*/*", **(extra_headers or {})}
-        return await self._post(
-            "/subscribe/",
-            body=await async_maybe_transform(
-                {
-                    "notify": notify,
-                    "url": url,
-                    "event_filter": event_filter,
-                    "group": group,
-                },
-                subscribe_create_webhook_params.SubscribeCreateWebhookParams,
-            ),
-            options=make_request_options(
-                extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout
-            ),
-            cast_to=NoneType,
-        )
-
-
-class SubscribeResourceWithRawResponse:
-    def __init__(self, subscribe: SubscribeResource) -> None:
-        self._subscribe = subscribe
-
-        self.create_webhook = to_raw_response_wrapper(
-            subscribe.create_webhook,
-        )
-
-
-class AsyncSubscribeResourceWithRawResponse:
-    def __init__(self, subscribe: AsyncSubscribeResource) -> None:
-        self._subscribe = subscribe
-
-        self.create_webhook = async_to_raw_response_wrapper(
-            subscribe.create_webhook,
-        )
-
-
-class SubscribeResourceWithStreamingResponse:
-    def __init__(self, subscribe: SubscribeResource) -> None:
-        self._subscribe = subscribe
-
-        self.create_webhook = to_streamed_response_wrapper(
-            subscribe.create_webhook,
-        )
-
-
-class AsyncSubscribeResourceWithStreamingResponse:
-    def __init__(self, subscribe: AsyncSubscribeResource) -> None:
-        self._subscribe = subscribe
-
-        self.create_webhook = async_to_streamed_response_wrapper(
-            subscribe.create_webhook,
-        )
diff --git a/src/legalesign/resources/unsubscribe.py b/src/legalesign/resources/unsubscribe.py
deleted file mode 100644
index 3927458..0000000
--- a/src/legalesign/resources/unsubscribe.py
+++ /dev/null
@@ -1,191 +0,0 @@
-# File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.
-
-from __future__ import annotations
-
-import httpx
-
-from ..types import WebhookEventFilterEnum, unsubscribe_delete_webhook_params
-from .._types import Body, Omit, Query, Headers, NoneType, NotGiven, omit, not_given
-from .._utils import maybe_transform, async_maybe_transform
-from .._compat import cached_property
-from .._resource import SyncAPIResource, AsyncAPIResource
-from .._response import (
-    to_raw_response_wrapper,
-    to_streamed_response_wrapper,
-    async_to_raw_response_wrapper,
-    async_to_streamed_response_wrapper,
-)
-from .._base_client import make_request_options
-from ..types.webhook_event_filter_enum import WebhookEventFilterEnum
-
-__all__ = ["UnsubscribeResource", "AsyncUnsubscribeResource"]
-
-
-class UnsubscribeResource(SyncAPIResource):
-    @cached_property
-    def with_raw_response(self) -> UnsubscribeResourceWithRawResponse:
-        """
-        This property can be used as a prefix for any HTTP method call to return
-        the raw response object instead of the parsed content.
-
-        For more information, see https://www.github.com/legalesign/legalesign-rest-python#accessing-raw-response-data-eg-headers
-        """
-        return UnsubscribeResourceWithRawResponse(self)
-
-    @cached_property
-    def with_streaming_response(self) -> UnsubscribeResourceWithStreamingResponse:
-        """
-        An alternative to `.with_raw_response` that doesn't eagerly read the response body.
-
-        For more information, see https://www.github.com/legalesign/legalesign-rest-python#with_streaming_response
-        """
-        return UnsubscribeResourceWithStreamingResponse(self)
-
-    def delete_webhook(
-        self,
-        *,
-        url: str,
-        event_filter: WebhookEventFilterEnum | Omit = omit,
-        group: int | Omit = omit,
-        # Use the following arguments if you need to pass additional parameters to the API that aren't available via kwargs.
-        # The extra values given here take precedence over values defined on the client or passed to this method.
-        extra_headers: Headers | None = None,
-        extra_query: Query | None = None,
-        extra_body: Body | None = None,
-        timeout: float | httpx.Timeout | None | NotGiven = not_given,
-    ) -> None:
-        """
-        Delete webhook
-
-        Args:
-          url: URL to remove, it must match any registered callback exactly
-
-          group: if a group filter is applied refer to it with slug or resource_uri
-
-          extra_headers: Send extra headers
-
-          extra_query: Add additional query parameters to the request
-
-          extra_body: Add additional JSON properties to the request
-
-          timeout: Override the client-level default timeout for this request, in seconds
-        """
-        extra_headers = {"Accept": "*/*", **(extra_headers or {})}
-        return self._post(
-            "/unsubscribe/",
-            body=maybe_transform(
-                {
-                    "url": url,
-                    "event_filter": event_filter,
-                    "group": group,
-                },
-                unsubscribe_delete_webhook_params.UnsubscribeDeleteWebhookParams,
-            ),
-            options=make_request_options(
-                extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout
-            ),
-            cast_to=NoneType,
-        )
-
-
-class AsyncUnsubscribeResource(AsyncAPIResource):
-    @cached_property
-    def with_raw_response(self) -> AsyncUnsubscribeResourceWithRawResponse:
-        """
-        This property can be used as a prefix for any HTTP method call to return
-        the raw response object instead of the parsed content.
-
-        For more information, see https://www.github.com/legalesign/legalesign-rest-python#accessing-raw-response-data-eg-headers
-        """
-        return AsyncUnsubscribeResourceWithRawResponse(self)
-
-    @cached_property
-    def with_streaming_response(self) -> AsyncUnsubscribeResourceWithStreamingResponse:
-        """
-        An alternative to `.with_raw_response` that doesn't eagerly read the response body.
-
-        For more information, see https://www.github.com/legalesign/legalesign-rest-python#with_streaming_response
-        """
-        return AsyncUnsubscribeResourceWithStreamingResponse(self)
-
-    async def delete_webhook(
-        self,
-        *,
-        url: str,
-        event_filter: WebhookEventFilterEnum | Omit = omit,
-        group: int | Omit = omit,
-        # Use the following arguments if you need to pass additional parameters to the API that aren't available via kwargs.
-        # The extra values given here take precedence over values defined on the client or passed to this method.
-        extra_headers: Headers | None = None,
-        extra_query: Query | None = None,
-        extra_body: Body | None = None,
-        timeout: float | httpx.Timeout | None | NotGiven = not_given,
-    ) -> None:
-        """
-        Delete webhook
-
-        Args:
-          url: URL to remove, it must match any registered callback exactly
-
-          group: if a group filter is applied refer to it with slug or resource_uri
-
-          extra_headers: Send extra headers
-
-          extra_query: Add additional query parameters to the request
-
-          extra_body: Add additional JSON properties to the request
-
-          timeout: Override the client-level default timeout for this request, in seconds
-        """
-        extra_headers = {"Accept": "*/*", **(extra_headers or {})}
-        return await self._post(
-            "/unsubscribe/",
-            body=await async_maybe_transform(
-                {
-                    "url": url,
-                    "event_filter": event_filter,
-                    "group": group,
-                },
-                unsubscribe_delete_webhook_params.UnsubscribeDeleteWebhookParams,
-            ),
-            options=make_request_options(
-                extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout
-            ),
-            cast_to=NoneType,
-        )
-
-
-class UnsubscribeResourceWithRawResponse:
-    def __init__(self, unsubscribe: UnsubscribeResource) -> None:
-        self._unsubscribe = unsubscribe
-
-        self.delete_webhook = to_raw_response_wrapper(
-            unsubscribe.delete_webhook,
-        )
-
-
-class AsyncUnsubscribeResourceWithRawResponse:
-    def __init__(self, unsubscribe: AsyncUnsubscribeResource) -> None:
-        self._unsubscribe = unsubscribe
-
-        self.delete_webhook = async_to_raw_response_wrapper(
-            unsubscribe.delete_webhook,
-        )
-
-
-class UnsubscribeResourceWithStreamingResponse:
-    def __init__(self, unsubscribe: UnsubscribeResource) -> None:
-        self._unsubscribe = unsubscribe
-
-        self.delete_webhook = to_streamed_response_wrapper(
-            unsubscribe.delete_webhook,
-        )
-
-
-class AsyncUnsubscribeResourceWithStreamingResponse:
-    def __init__(self, unsubscribe: AsyncUnsubscribeResource) -> None:
-        self._unsubscribe = unsubscribe
-
-        self.delete_webhook = async_to_streamed_response_wrapper(
-            unsubscribe.delete_webhook,
-        )
diff --git a/src/legalesign/resources/user.py b/src/legalesign/resources/user.py
deleted file mode 100644
index 64475e6..0000000
--- a/src/legalesign/resources/user.py
+++ /dev/null
@@ -1,402 +0,0 @@
-# File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.
-
-from __future__ import annotations
-
-from typing_extensions import Literal
-
-import httpx
-
-from ..types import TimezoneEnum, user_create_params, user_update_params
-from .._types import Body, Omit, Query, Headers, NoneType, NotGiven, omit, not_given
-from .._utils import maybe_transform, async_maybe_transform
-from .._compat import cached_property
-from .._resource import SyncAPIResource, AsyncAPIResource
-from .._response import (
-    to_raw_response_wrapper,
-    to_streamed_response_wrapper,
-    async_to_raw_response_wrapper,
-    async_to_streamed_response_wrapper,
-)
-from .._base_client import make_request_options
-from ..types.timezone_enum import TimezoneEnum
-from ..types.user_retrieve_response import UserRetrieveResponse
-
-__all__ = ["UserResource", "AsyncUserResource"]
-
-
-class UserResource(SyncAPIResource):
-    @cached_property
-    def with_raw_response(self) -> UserResourceWithRawResponse:
-        """
-        This property can be used as a prefix for any HTTP method call to return
-        the raw response object instead of the parsed content.
-
-        For more information, see https://www.github.com/legalesign/legalesign-rest-python#accessing-raw-response-data-eg-headers
-        """
-        return UserResourceWithRawResponse(self)
-
-    @cached_property
-    def with_streaming_response(self) -> UserResourceWithStreamingResponse:
-        """
-        An alternative to `.with_raw_response` that doesn't eagerly read the response body.
-
-        For more information, see https://www.github.com/legalesign/legalesign-rest-python#with_streaming_response
-        """
-        return UserResourceWithStreamingResponse(self)
-
-    def create(
-        self,
-        *,
-        email: str,
-        first_name: str,
-        last_name: str,
-        groups: str | Omit = omit,
-        password: str | Omit = omit,
-        permission: Literal["1", "2", "3", "4", "5", "6"] | Omit = omit,
-        timezone: TimezoneEnum | Omit = omit,
-        # Use the following arguments if you need to pass additional parameters to the API that aren't available via kwargs.
-        # The extra values given here take precedence over values defined on the client or passed to this method.
-        extra_headers: Headers | None = None,
-        extra_query: Query | None = None,
-        extra_body: Body | None = None,
-        timeout: float | httpx.Timeout | None | NotGiven = not_given,
-    ) -> None:
-        """
-        Create user
-
-        Args:
-          groups: comma delimited list of groups to add user to, can be full group resource_uri or
-              groupId
-
-          password: If not set a verification email is sent. Password must be at least 8 chars,
-              include upper and lower case, with a number and a special character
-
-          permission: set user permissions _ 1 - admin _ 2 - create and send docs, team user _ 3 -
-              readonly, team user _ 4 - send only, team user _ 5 - send only, individual user
-              _ 6 - create and send docs, invidual user
-
-          timezone: List of available timezones
-
-          extra_headers: Send extra headers
-
-          extra_query: Add additional query parameters to the request
-
-          extra_body: Add additional JSON properties to the request
-
-          timeout: Override the client-level default timeout for this request, in seconds
-        """
-        extra_headers = {"Accept": "*/*", **(extra_headers or {})}
-        return self._post(
-            "/user/",
-            body=maybe_transform(
-                {
-                    "email": email,
-                    "first_name": first_name,
-                    "last_name": last_name,
-                    "groups": groups,
-                    "password": password,
-                    "permission": permission,
-                    "timezone": timezone,
-                },
-                user_create_params.UserCreateParams,
-            ),
-            options=make_request_options(
-                extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout
-            ),
-            cast_to=NoneType,
-        )
-
-    def retrieve(
-        self,
-        user_id: str,
-        *,
-        # Use the following arguments if you need to pass additional parameters to the API that aren't available via kwargs.
-        # The extra values given here take precedence over values defined on the client or passed to this method.
-        extra_headers: Headers | None = None,
-        extra_query: Query | None = None,
-        extra_body: Body | None = None,
-        timeout: float | httpx.Timeout | None | NotGiven = not_given,
-    ) -> UserRetrieveResponse:
-        """
-        Get user
-
-        Args:
-          extra_headers: Send extra headers
-
-          extra_query: Add additional query parameters to the request
-
-          extra_body: Add additional JSON properties to the request
-
-          timeout: Override the client-level default timeout for this request, in seconds
-        """
-        if not user_id:
-            raise ValueError(f"Expected a non-empty value for `user_id` but received {user_id!r}")
-        return self._get(
-            f"/user/{user_id}/",
-            options=make_request_options(
-                extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout
-            ),
-            cast_to=UserRetrieveResponse,
-        )
-
-    def update(
-        self,
-        user_id: str,
-        *,
-        first_name: str | Omit = omit,
-        last_name: str | Omit = omit,
-        # Use the following arguments if you need to pass additional parameters to the API that aren't available via kwargs.
-        # The extra values given here take precedence over values defined on the client or passed to this method.
-        extra_headers: Headers | None = None,
-        extra_query: Query | None = None,
-        extra_body: Body | None = None,
-        timeout: float | httpx.Timeout | None | NotGiven = not_given,
-    ) -> None:
-        """
-        Update a user first name or last name
-
-        Args:
-          extra_headers: Send extra headers
-
-          extra_query: Add additional query parameters to the request
-
-          extra_body: Add additional JSON properties to the request
-
-          timeout: Override the client-level default timeout for this request, in seconds
-        """
-        if not user_id:
-            raise ValueError(f"Expected a non-empty value for `user_id` but received {user_id!r}")
-        extra_headers = {"Accept": "*/*", **(extra_headers or {})}
-        return self._patch(
-            f"/user/{user_id}/",
-            body=maybe_transform(
-                {
-                    "first_name": first_name,
-                    "last_name": last_name,
-                },
-                user_update_params.UserUpdateParams,
-            ),
-            options=make_request_options(
-                extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout
-            ),
-            cast_to=NoneType,
-        )
-
-
-class AsyncUserResource(AsyncAPIResource):
-    @cached_property
-    def with_raw_response(self) -> AsyncUserResourceWithRawResponse:
-        """
-        This property can be used as a prefix for any HTTP method call to return
-        the raw response object instead of the parsed content.
-
-        For more information, see https://www.github.com/legalesign/legalesign-rest-python#accessing-raw-response-data-eg-headers
-        """
-        return AsyncUserResourceWithRawResponse(self)
-
-    @cached_property
-    def with_streaming_response(self) -> AsyncUserResourceWithStreamingResponse:
-        """
-        An alternative to `.with_raw_response` that doesn't eagerly read the response body.
-
-        For more information, see https://www.github.com/legalesign/legalesign-rest-python#with_streaming_response
-        """
-        return AsyncUserResourceWithStreamingResponse(self)
-
-    async def create(
-        self,
-        *,
-        email: str,
-        first_name: str,
-        last_name: str,
-        groups: str | Omit = omit,
-        password: str | Omit = omit,
-        permission: Literal["1", "2", "3", "4", "5", "6"] | Omit = omit,
-        timezone: TimezoneEnum | Omit = omit,
-        # Use the following arguments if you need to pass additional parameters to the API that aren't available via kwargs.
-        # The extra values given here take precedence over values defined on the client or passed to this method.
-        extra_headers: Headers | None = None,
-        extra_query: Query | None = None,
-        extra_body: Body | None = None,
-        timeout: float | httpx.Timeout | None | NotGiven = not_given,
-    ) -> None:
-        """
-        Create user
-
-        Args:
-          groups: comma delimited list of groups to add user to, can be full group resource_uri or
-              groupId
-
-          password: If not set a verification email is sent. Password must be at least 8 chars,
-              include upper and lower case, with a number and a special character
-
-          permission: set user permissions _ 1 - admin _ 2 - create and send docs, team user _ 3 -
-              readonly, team user _ 4 - send only, team user _ 5 - send only, individual user
-              _ 6 - create and send docs, invidual user
-
-          timezone: List of available timezones
-
-          extra_headers: Send extra headers
-
-          extra_query: Add additional query parameters to the request
-
-          extra_body: Add additional JSON properties to the request
-
-          timeout: Override the client-level default timeout for this request, in seconds
-        """
-        extra_headers = {"Accept": "*/*", **(extra_headers or {})}
-        return await self._post(
-            "/user/",
-            body=await async_maybe_transform(
-                {
-                    "email": email,
-                    "first_name": first_name,
-                    "last_name": last_name,
-                    "groups": groups,
-                    "password": password,
-                    "permission": permission,
-                    "timezone": timezone,
-                },
-                user_create_params.UserCreateParams,
-            ),
-            options=make_request_options(
-                extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout
-            ),
-            cast_to=NoneType,
-        )
-
-    async def retrieve(
-        self,
-        user_id: str,
-        *,
-        # Use the following arguments if you need to pass additional parameters to the API that aren't available via kwargs.
-        # The extra values given here take precedence over values defined on the client or passed to this method.
-        extra_headers: Headers | None = None,
-        extra_query: Query | None = None,
-        extra_body: Body | None = None,
-        timeout: float | httpx.Timeout | None | NotGiven = not_given,
-    ) -> UserRetrieveResponse:
-        """
-        Get user
-
-        Args:
-          extra_headers: Send extra headers
-
-          extra_query: Add additional query parameters to the request
-
-          extra_body: Add additional JSON properties to the request
-
-          timeout: Override the client-level default timeout for this request, in seconds
-        """
-        if not user_id:
-            raise ValueError(f"Expected a non-empty value for `user_id` but received {user_id!r}")
-        return await self._get(
-            f"/user/{user_id}/",
-            options=make_request_options(
-                extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout
-            ),
-            cast_to=UserRetrieveResponse,
-        )
-
-    async def update(
-        self,
-        user_id: str,
-        *,
-        first_name: str | Omit = omit,
-        last_name: str | Omit = omit,
-        # Use the following arguments if you need to pass additional parameters to the API that aren't available via kwargs.
-        # The extra values given here take precedence over values defined on the client or passed to this method.
-        extra_headers: Headers | None = None,
-        extra_query: Query | None = None,
-        extra_body: Body | None = None,
-        timeout: float | httpx.Timeout | None | NotGiven = not_given,
-    ) -> None:
-        """
-        Update a user first name or last name
-
-        Args:
-          extra_headers: Send extra headers
-
-          extra_query: Add additional query parameters to the request
-
-          extra_body: Add additional JSON properties to the request
-
-          timeout: Override the client-level default timeout for this request, in seconds
-        """
-        if not user_id:
-            raise ValueError(f"Expected a non-empty value for `user_id` but received {user_id!r}")
-        extra_headers = {"Accept": "*/*", **(extra_headers or {})}
-        return await self._patch(
-            f"/user/{user_id}/",
-            body=await async_maybe_transform(
-                {
-                    "first_name": first_name,
-                    "last_name": last_name,
-                },
-                user_update_params.UserUpdateParams,
-            ),
-            options=make_request_options(
-                extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout
-            ),
-            cast_to=NoneType,
-        )
-
-
-class UserResourceWithRawResponse:
-    def __init__(self, user: UserResource) -> None:
-        self._user = user
-
-        self.create = to_raw_response_wrapper(
-            user.create,
-        )
-        self.retrieve = to_raw_response_wrapper(
-            user.retrieve,
-        )
-        self.update = to_raw_response_wrapper(
-            user.update,
-        )
-
-
-class AsyncUserResourceWithRawResponse:
-    def __init__(self, user: AsyncUserResource) -> None:
-        self._user = user
-
-        self.create = async_to_raw_response_wrapper(
-            user.create,
-        )
-        self.retrieve = async_to_raw_response_wrapper(
-            user.retrieve,
-        )
-        self.update = async_to_raw_response_wrapper(
-            user.update,
-        )
-
-
-class UserResourceWithStreamingResponse:
-    def __init__(self, user: UserResource) -> None:
-        self._user = user
-
-        self.create = to_streamed_response_wrapper(
-            user.create,
-        )
-        self.retrieve = to_streamed_response_wrapper(
-            user.retrieve,
-        )
-        self.update = to_streamed_response_wrapper(
-            user.update,
-        )
-
-
-class AsyncUserResourceWithStreamingResponse:
-    def __init__(self, user: AsyncUserResource) -> None:
-        self._user = user
-
-        self.create = async_to_streamed_response_wrapper(
-            user.create,
-        )
-        self.retrieve = async_to_streamed_response_wrapper(
-            user.retrieve,
-        )
-        self.update = async_to_streamed_response_wrapper(
-            user.update,
-        )
diff --git a/src/legalesign/types/attachment_list_params.py b/src/legalesign/types/attachment_list_params.py
deleted file mode 100644
index 205b1bb..0000000
--- a/src/legalesign/types/attachment_list_params.py
+++ /dev/null
@@ -1,21 +0,0 @@
-# File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.
-
-from __future__ import annotations
-
-from typing_extensions import TypedDict
-
-__all__ = ["AttachmentListParams"]
-
-
-class AttachmentListParams(TypedDict, total=False):
-    group: str
-    """Filter by a specific group"""
-
-    limit: int
-    """Length of dataset to return. Use with offset query to iterate through results."""
-
-    offset: int
-    """Offset from start of dataset.
-
-    Use with the limit query to iterate through dataset.
-    """
diff --git a/src/legalesign/types/attachment_list_response.py b/src/legalesign/types/attachment_list_response.py
deleted file mode 100644
index 3aeea07..0000000
--- a/src/legalesign/types/attachment_list_response.py
+++ /dev/null
@@ -1,15 +0,0 @@
-# File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.
-
-from typing import List, Optional
-
-from .._models import BaseModel
-from .list_meta import ListMeta
-from .attachment_response import AttachmentResponse
-
-__all__ = ["AttachmentListResponse"]
-
-
-class AttachmentListResponse(BaseModel):
-    meta: Optional[ListMeta] = None
-
-    objects: Optional[List[AttachmentResponse]] = None
diff --git a/src/legalesign/types/attachment_response.py b/src/legalesign/types/attachment_response.py
deleted file mode 100644
index 9ce6e46..0000000
--- a/src/legalesign/types/attachment_response.py
+++ /dev/null
@@ -1,26 +0,0 @@
-# File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.
-
-from typing import Optional
-from datetime import datetime
-
-from .._models import BaseModel
-
-__all__ = ["AttachmentResponse"]
-
-
-class AttachmentResponse(BaseModel):
-    created: Optional[datetime] = None
-
-    description: Optional[str] = None
-
-    filename: Optional[str] = None
-
-    group: Optional[str] = None
-
-    resource_uri: Optional[str] = None
-
-    user: Optional[str] = None
-    """resource_uri for user"""
-
-    uuid: Optional[str] = None
-    """id for attachment object"""
diff --git a/src/legalesign/types/attachment_upload_params.py b/src/legalesign/types/attachment_upload_params.py
deleted file mode 100644
index bdc0d43..0000000
--- a/src/legalesign/types/attachment_upload_params.py
+++ /dev/null
@@ -1,27 +0,0 @@
-# File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.
-
-from __future__ import annotations
-
-from typing import Union
-from typing_extensions import Required, Annotated, TypedDict
-
-from .._types import Base64FileInput
-from .._utils import PropertyInfo
-
-__all__ = ["AttachmentUploadParams"]
-
-
-class AttachmentUploadParams(TypedDict, total=False):
-    filename: Required[str]
-    """Simple alphanumeric name ending .pdf"""
-
-    group: Required[str]
-    """URI of the group name"""
-
-    pdf_file: Required[Annotated[Union[str, Base64FileInput], PropertyInfo(format="base64")]]
-    """Base64 encoded PDF file data, max size is a group setting, 5MB by default"""
-
-    description: str
-
-    user: str
-    """Assign to group member if not the api user"""
diff --git a/src/legalesign/types/document_preview_params.py b/src/legalesign/types/document_preview_params.py
deleted file mode 100644
index 636044c..0000000
--- a/src/legalesign/types/document_preview_params.py
+++ /dev/null
@@ -1,17 +0,0 @@
-# File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.
-
-from __future__ import annotations
-
-from typing_extensions import TypedDict
-
-__all__ = ["DocumentPreviewParams"]
-
-
-class DocumentPreviewParams(TypedDict, total=False):
-    group: str
-
-    signee_count: int
-
-    text: str
-
-    title: str
diff --git a/src/legalesign/types/group_update_params.py b/src/legalesign/types/group_update_params.py
deleted file mode 100644
index 6f5c940..0000000
--- a/src/legalesign/types/group_update_params.py
+++ /dev/null
@@ -1,11 +0,0 @@
-# File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.
-
-from __future__ import annotations
-
-from typing_extensions import TypedDict
-
-__all__ = ["GroupUpdateParams"]
-
-
-class GroupUpdateParams(TypedDict, total=False):
-    public_name: str
diff --git a/src/legalesign/types/invited_list_params.py b/src/legalesign/types/invited_list_params.py
deleted file mode 100644
index e033d10..0000000
--- a/src/legalesign/types/invited_list_params.py
+++ /dev/null
@@ -1,12 +0,0 @@
-# File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.
-
-from __future__ import annotations
-
-from typing_extensions import TypedDict
-
-__all__ = ["InvitedListParams"]
-
-
-class InvitedListParams(TypedDict, total=False):
-    group: str
-    """filter list by a given group"""
diff --git a/src/legalesign/types/invited_list_response.py b/src/legalesign/types/invited_list_response.py
deleted file mode 100644
index 33cb3d5..0000000
--- a/src/legalesign/types/invited_list_response.py
+++ /dev/null
@@ -1,25 +0,0 @@
-# File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.
-
-from typing import List, Optional
-from datetime import datetime
-
-from .._models import BaseModel
-from .list_meta import ListMeta
-
-__all__ = ["InvitedListResponse", "Object"]
-
-
-class Object(BaseModel):
-    created: Optional[datetime] = None
-
-    email: Optional[str] = None
-
-    group: Optional[str] = None
-
-    resource_uri: Optional[str] = None
-
-
-class InvitedListResponse(BaseModel):
-    meta: Optional[ListMeta] = None
-
-    objects: Optional[List[Object]] = None
diff --git a/src/legalesign/types/member_create_params.py b/src/legalesign/types/member_create_params.py
deleted file mode 100644
index 3823b9d..0000000
--- a/src/legalesign/types/member_create_params.py
+++ /dev/null
@@ -1,29 +0,0 @@
-# File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.
-
-from __future__ import annotations
-
-from typing_extensions import Required, TypedDict
-
-from .permissions_enum import PermissionsEnum
-
-__all__ = ["MemberCreateParams"]
-
-
-class MemberCreateParams(TypedDict, total=False):
-    email: Required[str]
-
-    group: Required[str]
-
-    do_email: bool
-    """use legalesign to send email notification to new user"""
-
-    permission: PermissionsEnum
-    """Permissions options:
-
-    - 1 - administrator
-    - 2 - team docs visible, create & send
-    - 3 - team docs visible, send only
-    - 4 - no team sent docs visible, send only
-    - 5 - no team docs visible, create & send
-    - 6 - team docs visible, read only
-    """
diff --git a/src/legalesign/types/member_list_params.py b/src/legalesign/types/member_list_params.py
deleted file mode 100644
index 6698052..0000000
--- a/src/legalesign/types/member_list_params.py
+++ /dev/null
@@ -1,21 +0,0 @@
-# File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.
-
-from __future__ import annotations
-
-from typing_extensions import TypedDict
-
-__all__ = ["MemberListParams"]
-
-
-class MemberListParams(TypedDict, total=False):
-    group: str
-    """filter list by a given group"""
-
-    limit: int
-    """Length of dataset to return. Use with offset query to iterate through results."""
-
-    offset: int
-    """Offset from start of dataset.
-
-    Use with the limit query to iterate through dataset.
-    """
diff --git a/src/legalesign/types/member_list_response.py b/src/legalesign/types/member_list_response.py
deleted file mode 100644
index 62178b9..0000000
--- a/src/legalesign/types/member_list_response.py
+++ /dev/null
@@ -1,15 +0,0 @@
-# File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.
-
-from typing import List, Optional
-
-from .._models import BaseModel
-from .list_meta import ListMeta
-from .member_response import MemberResponse
-
-__all__ = ["MemberListResponse"]
-
-
-class MemberListResponse(BaseModel):
-    meta: Optional[ListMeta] = None
-
-    objects: Optional[List[MemberResponse]] = None
diff --git a/src/legalesign/types/member_response.py b/src/legalesign/types/member_response.py
deleted file mode 100644
index 7e0046c..0000000
--- a/src/legalesign/types/member_response.py
+++ /dev/null
@@ -1,32 +0,0 @@
-# File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.
-
-from typing import Optional
-from datetime import datetime
-
-from .._models import BaseModel
-from .permissions_enum import PermissionsEnum
-
-__all__ = ["MemberResponse"]
-
-
-class MemberResponse(BaseModel):
-    created: Optional[datetime] = None
-
-    group: Optional[str] = None
-
-    modified: Optional[datetime] = None
-
-    permission: Optional[PermissionsEnum] = None
-    """Permissions options:
-
-    - 1 - administrator
-    - 2 - team docs visible, create & send
-    - 3 - team docs visible, send only
-    - 4 - no team sent docs visible, send only
-    - 5 - no team docs visible, create & send
-    - 6 - team docs visible, read only
-    """
-
-    resource_uri: Optional[str] = None
-
-    user: Optional[str] = None
diff --git a/src/legalesign/types/notification_list_response.py b/src/legalesign/types/notification_list_response.py
deleted file mode 100644
index b722bc8..0000000
--- a/src/legalesign/types/notification_list_response.py
+++ /dev/null
@@ -1,25 +0,0 @@
-# File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.
-
-from typing import List, Optional
-from typing_extensions import Literal, TypeAlias
-
-from .._models import BaseModel
-from .webhook_event_filter_enum import WebhookEventFilterEnum
-
-__all__ = ["NotificationListResponse", "NotificationListResponseItem"]
-
-
-class NotificationListResponseItem(BaseModel):
-    active: Optional[bool] = None
-
-    event_filter: Optional[WebhookEventFilterEnum] = None
-
-    group_id: Optional[int] = None
-
-    notify_when: Optional[Literal[1, 2, 3, 4, 10]] = None
-    """1 = every 6 minutes, 2 = upon signing, 3 = sent, 4 = rejected, 10 = realtime"""
-
-    url: Optional[str] = None
-
-
-NotificationListResponse: TypeAlias = List[NotificationListResponseItem]
diff --git a/src/legalesign/types/pdf_create_preview_params.py b/src/legalesign/types/pdf_create_preview_params.py
deleted file mode 100644
index 0b388de..0000000
--- a/src/legalesign/types/pdf_create_preview_params.py
+++ /dev/null
@@ -1,34 +0,0 @@
-# File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.
-
-from __future__ import annotations
-
-from typing_extensions import Required, TypedDict
-
-__all__ = ["PdfCreatePreviewParams"]
-
-
-class PdfCreatePreviewParams(TypedDict, total=False):
-    group: Required[str]
-
-    is_signature_per_page: Required[int]
-
-    signature_type: Required[int]
-
-    signee_count: Required[int]
-    """number of signers"""
-
-    text: Required[str]
-    """raw html"""
-
-    footer: str
-
-    footer_height: int
-
-    header: str
-
-    header_height: int
-
-    pdfheader: bool
-    """Set to true to use group default"""
-
-    title: str
diff --git a/src/legalesign/types/permissions_enum.py b/src/legalesign/types/permissions_enum.py
deleted file mode 100644
index 3a4f445..0000000
--- a/src/legalesign/types/permissions_enum.py
+++ /dev/null
@@ -1,7 +0,0 @@
-# File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.
-
-from typing_extensions import Literal, TypeAlias
-
-__all__ = ["PermissionsEnum"]
-
-PermissionsEnum: TypeAlias = Literal[1, 2, 3, 4, 5, 6]
diff --git a/src/legalesign/types/signer_get_rejection_reason_response.py b/src/legalesign/types/signer_get_rejection_reason_response.py
deleted file mode 100644
index 1374912..0000000
--- a/src/legalesign/types/signer_get_rejection_reason_response.py
+++ /dev/null
@@ -1,13 +0,0 @@
-# File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.
-
-from typing import Optional
-
-from .._models import BaseModel
-
-__all__ = ["SignerGetRejectionReasonResponse"]
-
-
-class SignerGetRejectionReasonResponse(BaseModel):
-    reason: Optional[str] = None
-
-    status: Optional[int] = None
diff --git a/src/legalesign/types/signer_reset_params.py b/src/legalesign/types/signer_reset_params.py
deleted file mode 100644
index 86d9ed8..0000000
--- a/src/legalesign/types/signer_reset_params.py
+++ /dev/null
@@ -1,15 +0,0 @@
-# File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.
-
-from __future__ import annotations
-
-from typing_extensions import Required, TypedDict
-
-__all__ = ["SignerResetParams"]
-
-
-class SignerResetParams(TypedDict, total=False):
-    email: Required[str]
-    """Email of signer to revert to."""
-
-    notify: bool
-    """Email notify current signer access is being withdrawn"""
diff --git a/src/legalesign/types/status_retrieve_all_params.py b/src/legalesign/types/status_retrieve_all_params.py
deleted file mode 100644
index dadd317..0000000
--- a/src/legalesign/types/status_retrieve_all_params.py
+++ /dev/null
@@ -1,21 +0,0 @@
-# File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.
-
-from __future__ import annotations
-
-from typing_extensions import TypedDict
-
-__all__ = ["StatusRetrieveAllParams"]
-
-
-class StatusRetrieveAllParams(TypedDict, total=False):
-    filter: str
-    """Filter on archived status, default is false"""
-
-    limit: int
-    """Length of dataset to return. Use with offset query to iterate through results."""
-
-    offset: int
-    """Offset from start of dataset.
-
-    Use with the limit query to iterate through dataset.
-    """
diff --git a/src/legalesign/types/status_retrieve_all_response.py b/src/legalesign/types/status_retrieve_all_response.py
deleted file mode 100644
index f834570..0000000
--- a/src/legalesign/types/status_retrieve_all_response.py
+++ /dev/null
@@ -1,15 +0,0 @@
-# File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.
-
-from typing import List, Optional
-
-from .._models import BaseModel
-from .list_meta import ListMeta
-from .status_response import StatusResponse
-
-__all__ = ["StatusRetrieveAllResponse"]
-
-
-class StatusRetrieveAllResponse(BaseModel):
-    meta: Optional[ListMeta] = None
-
-    objects: Optional[List[StatusResponse]] = None
diff --git a/src/legalesign/types/subscribe_create_webhook_params.py b/src/legalesign/types/subscribe_create_webhook_params.py
deleted file mode 100644
index 3734035..0000000
--- a/src/legalesign/types/subscribe_create_webhook_params.py
+++ /dev/null
@@ -1,25 +0,0 @@
-# File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.
-
-from __future__ import annotations
-
-from typing_extensions import Required, Annotated, TypedDict
-
-from .._utils import PropertyInfo
-from .webhook_event_filter_enum import WebhookEventFilterEnum
-
-__all__ = ["SubscribeCreateWebhookParams"]
-
-
-class SubscribeCreateWebhookParams(TypedDict, total=False):
-    notify: Required[str]
-    """
-    The type of callback to receive, value must be all, signed, sent, rejected or
-    realtime
-    """
-
-    url: Required[str]
-    """The URL where you wish to get notified"""
-
-    event_filter: Annotated[WebhookEventFilterEnum, PropertyInfo(alias="eventFilter")]
-
-    group: str
diff --git a/src/legalesign/types/timezone_enum.py b/src/legalesign/types/timezone_enum.py
deleted file mode 100644
index f909b47..0000000
--- a/src/legalesign/types/timezone_enum.py
+++ /dev/null
@@ -1,438 +0,0 @@
-# File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.
-
-from typing_extensions import Literal, TypeAlias
-
-__all__ = ["TimezoneEnum"]
-
-TimezoneEnum: TypeAlias = Literal[
-    "Africa/Abidjan",
-    "Africa/Accra",
-    "Africa/Addis_Ababa",
-    "Africa/Algiers",
-    "Africa/Asmara",
-    "Africa/Bamako",
-    "Africa/Bangui",
-    "Africa/Banjul",
-    "Africa/Bissau",
-    "Africa/Blantyre",
-    "Africa/Brazzaville",
-    "Africa/Bujumbura",
-    "Africa/Cairo",
-    "Africa/Casablanca",
-    "Africa/Ceuta",
-    "Africa/Conakry",
-    "Africa/Dakar",
-    "Africa/Dar_es_Salaam",
-    "Africa/Djibouti",
-    "Africa/Douala",
-    "Africa/El_Aaiun",
-    "Africa/Freetown",
-    "Africa/Gaborone",
-    "Africa/Harare",
-    "Africa/Johannesburg",
-    "Africa/Juba",
-    "Africa/Kampala",
-    "Africa/Khartoum",
-    "Africa/Kigali",
-    "Africa/Kinshasa",
-    "Africa/Lagos",
-    "Africa/Libreville",
-    "Africa/Lome",
-    "Africa/Luanda",
-    "Africa/Lubumbashi",
-    "Africa/Lusaka",
-    "Africa/Malabo",
-    "Africa/Maputo",
-    "Africa/Maseru",
-    "Africa/Mbabane",
-    "Africa/Mogadishu",
-    "Africa/Monrovia",
-    "Africa/Nairobi",
-    "Africa/Ndjamena",
-    "Africa/Niamey",
-    "Africa/Nouakchott",
-    "Africa/Ouagadougou",
-    "Africa/Porto-Novo",
-    "Africa/Sao_Tome",
-    "Africa/Tripoli",
-    "Africa/Tunis",
-    "Africa/Windhoek",
-    "America/Adak",
-    "America/Anchorage",
-    "America/Anguilla",
-    "America/Antigua",
-    "America/Araguaina",
-    "America/Argentina/Buenos_Aires",
-    "America/Argentina/Catamarca",
-    "America/Argentina/Cordoba",
-    "America/Argentina/Jujuy",
-    "America/Argentina/La_Rioja",
-    "America/Argentina/Mendoza",
-    "America/Argentina/Rio_Gallegos",
-    "America/Argentina/Salta",
-    "America/Argentina/San_Juan",
-    "America/Argentina/San_Luis",
-    "America/Argentina/Tucuman",
-    "America/Argentina/Ushuaia",
-    "America/Aruba",
-    "America/Asuncion",
-    "America/Atikokan",
-    "America/Bahia",
-    "America/Bahia_Banderas",
-    "America/Barbados",
-    "America/Belem",
-    "America/Belize",
-    "America/Blanc-Sablon",
-    "America/Boa_Vista",
-    "America/Bogota",
-    "America/Boise",
-    "America/Cambridge_Bay",
-    "America/Campo_Grande",
-    "America/Cancun",
-    "America/Caracas",
-    "America/Cayenne",
-    "America/Cayman",
-    "America/Chicago",
-    "America/Chihuahua",
-    "America/Costa_Rica",
-    "America/Creston",
-    "America/Cuiaba",
-    "America/Curacao",
-    "America/Danmarkshavn",
-    "America/Dawson",
-    "America/Dawson_Creek",
-    "America/Denver",
-    "America/Detroit",
-    "America/Dominica",
-    "America/Edmonton",
-    "America/Eirunepe",
-    "America/El_Salvador",
-    "America/Fortaleza",
-    "America/Glace_Bay",
-    "America/Godthab",
-    "America/Goose_Bay",
-    "America/Grand_Turk",
-    "America/Grenada",
-    "America/Guadeloupe",
-    "America/Guatemala",
-    "America/Guayaquil",
-    "America/Guyana",
-    "America/Halifax",
-    "America/Havana",
-    "America/Hermosillo",
-    "America/Indiana/Indianapolis",
-    "America/Indiana/Knox",
-    "America/Indiana/Marengo",
-    "America/Indiana/Petersburg",
-    "America/Indiana/Tell_City",
-    "America/Indiana/Vevay",
-    "America/Indiana/Vincennes",
-    "America/Indiana/Winamac",
-    "America/Inuvik",
-    "America/Iqaluit",
-    "America/Jamaica",
-    "America/Juneau",
-    "America/Kentucky/Louisville",
-    "America/Kentucky/Monticello",
-    "America/Kralendijk",
-    "America/La_Paz",
-    "America/Lima",
-    "America/Los_Angeles",
-    "America/Lower_Princes",
-    "America/Maceio",
-    "America/Managua",
-    "America/Manaus",
-    "America/Marigot",
-    "America/Martinique",
-    "America/Matamoros",
-    "America/Mazatlan",
-    "America/Menominee",
-    "America/Merida",
-    "America/Metlakatla",
-    "America/Mexico_City",
-    "America/Miquelon",
-    "America/Moncton",
-    "America/Monterrey",
-    "America/Montevideo",
-    "America/Montreal",
-    "America/Montserrat",
-    "America/Nassau",
-    "America/New_York",
-    "America/Nipigon",
-    "America/Nome",
-    "America/Noronha",
-    "America/North_Dakota/Beulah",
-    "America/North_Dakota/Center",
-    "America/North_Dakota/New_Salem",
-    "America/Ojinaga",
-    "America/Panama",
-    "America/Pangnirtung",
-    "America/Paramaribo",
-    "America/Phoenix",
-    "America/Port-au-Prince",
-    "America/Port_of_Spain",
-    "America/Porto_Velho",
-    "America/Puerto_Rico",
-    "America/Rainy_River",
-    "America/Rankin_Inlet",
-    "America/Recife",
-    "America/Regina",
-    "America/Resolute",
-    "America/Rio_Branco",
-    "America/Santa_Isabel",
-    "America/Santarem",
-    "America/Santiago",
-    "America/Santo_Domingo",
-    "America/Sao_Paulo",
-    "America/Scoresbysund",
-    "America/Shiprock",
-    "America/Sitka",
-    "America/St_Barthelemy",
-    "America/St_Johns",
-    "America/St_Kitts",
-    "America/St_Lucia",
-    "America/St_Thomas",
-    "America/St_Vincent",
-    "America/Swift_Current",
-    "America/Tegucigalpa",
-    "America/Thule",
-    "America/Thunder_Bay",
-    "America/Tijuana",
-    "America/Toronto",
-    "America/Tortola",
-    "America/Vancouver",
-    "America/Whitehorse",
-    "America/Winnipeg",
-    "America/Yakutat",
-    "America/Yellowknife",
-    "Antarctica/Casey",
-    "Antarctica/Davis",
-    "Antarctica/DumontDUrville",
-    "Antarctica/Macquarie",
-    "Antarctica/Mawson",
-    "Antarctica/McMurdo",
-    "Antarctica/Palmer",
-    "Antarctica/Rothera",
-    "Antarctica/South_Pole",
-    "Antarctica/Syowa",
-    "Antarctica/Vostok",
-    "Arctic/Longyearbyen",
-    "Asia/Aden",
-    "Asia/Almaty",
-    "Asia/Amman",
-    "Asia/Anadyr",
-    "Asia/Aqtau",
-    "Asia/Aqtobe",
-    "Asia/Ashgabat",
-    "Asia/Baghdad",
-    "Asia/Bahrain",
-    "Asia/Baku",
-    "Asia/Bangkok",
-    "Asia/Beirut",
-    "Asia/Bishkek",
-    "Asia/Brunei",
-    "Asia/Choibalsan",
-    "Asia/Chongqing",
-    "Asia/Colombo",
-    "Asia/Damascus",
-    "Asia/Dhaka",
-    "Asia/Dili",
-    "Asia/Dubai",
-    "Asia/Dushanbe",
-    "Asia/Gaza",
-    "Asia/Harbin",
-    "Asia/Hebron",
-    "Asia/Ho_Chi_Minh",
-    "Asia/Hong_Kong",
-    "Asia/Hovd",
-    "Asia/Irkutsk",
-    "Asia/Jakarta",
-    "Asia/Jayapura",
-    "Asia/Jerusalem",
-    "Asia/Kabul",
-    "Asia/Kamchatka",
-    "Asia/Karachi",
-    "Asia/Kashgar",
-    "Asia/Kathmandu",
-    "Asia/Kolkata",
-    "Asia/Krasnoyarsk",
-    "Asia/Kuala_Lumpur",
-    "Asia/Kuching",
-    "Asia/Kuwait",
-    "Asia/Macau",
-    "Asia/Magadan",
-    "Asia/Makassar",
-    "Asia/Manila",
-    "Asia/Muscat",
-    "Asia/Nicosia",
-    "Asia/Novokuznetsk",
-    "Asia/Novosibirsk",
-    "Asia/Omsk",
-    "Asia/Oral",
-    "Asia/Phnom_Penh",
-    "Asia/Pontianak",
-    "Asia/Pyongyang",
-    "Asia/Qatar",
-    "Asia/Qyzylorda",
-    "Asia/Rangoon",
-    "Asia/Riyadh",
-    "Asia/Sakhalin",
-    "Asia/Samarkand",
-    "Asia/Seoul",
-    "Asia/Shanghai",
-    "Asia/Singapore",
-    "Asia/Taipei",
-    "Asia/Tashkent",
-    "Asia/Tbilisi",
-    "Asia/Tehran",
-    "Asia/Thimphu",
-    "Asia/Tokyo",
-    "Asia/Ulaanbaatar",
-    "Asia/Urumqi",
-    "Asia/Vientiane",
-    "Asia/Vladivostok",
-    "Asia/Yakutsk",
-    "Asia/Yekaterinburg",
-    "Asia/Yerevan",
-    "Atlantic/Azores",
-    "Atlantic/Bermuda",
-    "Atlantic/Canary",
-    "Atlantic/Cape_Verde",
-    "Atlantic/Faroe",
-    "Atlantic/Madeira",
-    "Atlantic/Reykjavik",
-    "Atlantic/South_Georgia",
-    "Atlantic/St_Helena",
-    "Atlantic/Stanley",
-    "Australia/Adelaide",
-    "Australia/Brisbane",
-    "Australia/Broken_Hill",
-    "Australia/Currie",
-    "Australia/Darwin",
-    "Australia/Eucla",
-    "Australia/Hobart",
-    "Australia/Lindeman",
-    "Australia/Lord_Howe",
-    "Australia/Melbourne",
-    "Australia/Perth",
-    "Australia/Sydney",
-    "Canada/Atlantic",
-    "Canada/Central",
-    "Canada/Eastern",
-    "Canada/Mountain",
-    "Canada/Newfoundland",
-    "Canada/Pacific",
-    "Europe/Amsterdam",
-    "Europe/Andorra",
-    "Europe/Athens",
-    "Europe/Belgrade",
-    "Europe/Berlin",
-    "Europe/Bratislava",
-    "Europe/Brussels",
-    "Europe/Bucharest",
-    "Europe/Budapest",
-    "Europe/Chisinau",
-    "Europe/Copenhagen",
-    "Europe/Dublin",
-    "Europe/Gibraltar",
-    "Europe/Guernsey",
-    "Europe/Helsinki",
-    "Europe/Isle_of_Man",
-    "Europe/Istanbul",
-    "Europe/Jersey",
-    "Europe/Kaliningrad",
-    "Europe/Kiev",
-    "Europe/Lisbon",
-    "Europe/Ljubljana",
-    "Europe/London",
-    "Europe/Luxembourg",
-    "Europe/Madrid",
-    "Europe/Malta",
-    "Europe/Mariehamn",
-    "Europe/Minsk",
-    "Europe/Monaco",
-    "Europe/Moscow",
-    "Europe/Oslo",
-    "Europe/Paris",
-    "Europe/Podgorica",
-    "Europe/Prague",
-    "Europe/Riga",
-    "Europe/Rome",
-    "Europe/Samara",
-    "Europe/San_Marino",
-    "Europe/Sarajevo",
-    "Europe/Simferopol",
-    "Europe/Skopje",
-    "Europe/Sofia",
-    "Europe/Stockholm",
-    "Europe/Tallinn",
-    "Europe/Tirane",
-    "Europe/Uzhgorod",
-    "Europe/Vaduz",
-    "Europe/Vatican",
-    "Europe/Vienna",
-    "Europe/Vilnius",
-    "Europe/Volgograd",
-    "Europe/Warsaw",
-    "Europe/Zagreb",
-    "Europe/Zaporozhye",
-    "Europe/Zurich",
-    "GMT",
-    "Indian/Antananarivo",
-    "Indian/Chagos",
-    "Indian/Christmas",
-    "Indian/Cocos",
-    "Indian/Comoro",
-    "Indian/Kerguelen",
-    "Indian/Mahe",
-    "Indian/Maldives",
-    "Indian/Mauritius",
-    "Indian/Mayotte",
-    "Indian/Reunion",
-    "Pacific/Apia",
-    "Pacific/Auckland",
-    "Pacific/Chatham",
-    "Pacific/Chuuk",
-    "Pacific/Easter",
-    "Pacific/Efate",
-    "Pacific/Enderbury",
-    "Pacific/Fakaofo",
-    "Pacific/Fiji",
-    "Pacific/Funafuti",
-    "Pacific/Galapagos",
-    "Pacific/Gambier",
-    "Pacific/Guadalcanal",
-    "Pacific/Guam",
-    "Pacific/Honolulu",
-    "Pacific/Johnston",
-    "Pacific/Kiritimati",
-    "Pacific/Kosrae",
-    "Pacific/Kwajalein",
-    "Pacific/Majuro",
-    "Pacific/Marquesas",
-    "Pacific/Midway",
-    "Pacific/Nauru",
-    "Pacific/Niue",
-    "Pacific/Norfolk",
-    "Pacific/Noumea",
-    "Pacific/Pago_Pago",
-    "Pacific/Palau",
-    "Pacific/Pitcairn",
-    "Pacific/Pohnpei",
-    "Pacific/Port_Moresby",
-    "Pacific/Rarotonga",
-    "Pacific/Saipan",
-    "Pacific/Tahiti",
-    "Pacific/Tarawa",
-    "Pacific/Tongatapu",
-    "Pacific/Wake",
-    "Pacific/Wallis",
-    "US/Alaska",
-    "US/Arizona",
-    "US/Central",
-    "US/Eastern",
-    "US/Hawaii",
-    "US/Mountain",
-    "US/Pacific",
-    "UTC",
-]
diff --git a/src/legalesign/types/unsubscribe_delete_webhook_params.py b/src/legalesign/types/unsubscribe_delete_webhook_params.py
deleted file mode 100644
index 69aaf1c..0000000
--- a/src/legalesign/types/unsubscribe_delete_webhook_params.py
+++ /dev/null
@@ -1,20 +0,0 @@
-# File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.
-
-from __future__ import annotations
-
-from typing_extensions import Required, Annotated, TypedDict
-
-from .._utils import PropertyInfo
-from .webhook_event_filter_enum import WebhookEventFilterEnum
-
-__all__ = ["UnsubscribeDeleteWebhookParams"]
-
-
-class UnsubscribeDeleteWebhookParams(TypedDict, total=False):
-    url: Required[str]
-    """URL to remove, it must match any registered callback exactly"""
-
-    event_filter: Annotated[WebhookEventFilterEnum, PropertyInfo(alias="eventFilter")]
-
-    group: int
-    """if a group filter is applied refer to it with slug or resource_uri"""
diff --git a/src/legalesign/types/user_create_params.py b/src/legalesign/types/user_create_params.py
deleted file mode 100644
index 02a89c0..0000000
--- a/src/legalesign/types/user_create_params.py
+++ /dev/null
@@ -1,40 +0,0 @@
-# File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.
-
-from __future__ import annotations
-
-from typing_extensions import Literal, Required, TypedDict
-
-from .timezone_enum import TimezoneEnum
-
-__all__ = ["UserCreateParams"]
-
-
-class UserCreateParams(TypedDict, total=False):
-    email: Required[str]
-
-    first_name: Required[str]
-
-    last_name: Required[str]
-
-    groups: str
-    """
-    comma delimited list of groups to add user to, can be full group resource_uri or
-    groupId
-    """
-
-    password: str
-    """If not set a verification email is sent.
-
-    Password must be at least 8 chars, include upper and lower case, with a number
-    and a special character
-    """
-
-    permission: Literal["1", "2", "3", "4", "5", "6"]
-    """
-    set user permissions _ 1 - admin _ 2 - create and send docs, team user _ 3 -
-    readonly, team user _ 4 - send only, team user _ 5 - send only, individual user
-    _ 6 - create and send docs, invidual user
-    """
-
-    timezone: TimezoneEnum
-    """List of available timezones"""
diff --git a/src/legalesign/types/user_retrieve_response.py b/src/legalesign/types/user_retrieve_response.py
deleted file mode 100644
index 2f5fadd..0000000
--- a/src/legalesign/types/user_retrieve_response.py
+++ /dev/null
@@ -1,30 +0,0 @@
-# File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.
-
-from typing import List, Optional
-from datetime import datetime
-
-from .._models import BaseModel
-from .timezone_enum import TimezoneEnum
-
-__all__ = ["UserRetrieveResponse"]
-
-
-class UserRetrieveResponse(BaseModel):
-    date_joined: Optional[datetime] = None
-
-    email: Optional[str] = None
-
-    first_name: Optional[str] = None
-
-    groups: Optional[List[str]] = None
-
-    last_login: Optional[datetime] = None
-
-    last_name: Optional[str] = None
-
-    resource_uri: Optional[str] = None
-
-    timezone: Optional[TimezoneEnum] = None
-    """List of available timezones"""
-
-    username: Optional[str] = None
diff --git a/src/legalesign/types/user_update_params.py b/src/legalesign/types/user_update_params.py
deleted file mode 100644
index 1ad903d..0000000
--- a/src/legalesign/types/user_update_params.py
+++ /dev/null
@@ -1,13 +0,0 @@
-# File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.
-
-from __future__ import annotations
-
-from typing_extensions import TypedDict
-
-__all__ = ["UserUpdateParams"]
-
-
-class UserUpdateParams(TypedDict, total=False):
-    first_name: str
-
-    last_name: str
diff --git a/src/legalesign/types/webhook_event_filter_enum.py b/src/legalesign/types/webhook_event_filter_enum.py
deleted file mode 100644
index ed616a2..0000000
--- a/src/legalesign/types/webhook_event_filter_enum.py
+++ /dev/null
@@ -1,19 +0,0 @@
-# File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.
-
-from typing_extensions import Literal, TypeAlias
-
-__all__ = ["WebhookEventFilterEnum"]
-
-WebhookEventFilterEnum: TypeAlias = Literal[
-    "",
-    "document.*",
-    "document.created",
-    "document.rejected",
-    "document.finalPdfCreated",
-    "recipient.*",
-    "recipient.completed",
-    "recipient.rejected",
-    "recipient.emailOpened",
-    "recipient.visiting",
-    "recipient.bounced",
-]
diff --git a/src/legalesign/__init__.py b/src/legalesign_sdk/__init__.py
similarity index 89%
rename from src/legalesign/__init__.py
rename to src/legalesign_sdk/__init__.py
index efc1c80..160bcf3 100644
--- a/src/legalesign/__init__.py
+++ b/src/legalesign_sdk/__init__.py
@@ -10,11 +10,11 @@
     Stream,
     Timeout,
     Transport,
-    Legalesign,
     AsyncClient,
     AsyncStream,
+    LegalesignSDK,
     RequestOptions,
-    AsyncLegalesign,
+    AsyncLegalesignSDK,
 )
 from ._models import BaseModel
 from ._version import __title__, __version__
@@ -28,8 +28,8 @@
     RateLimitError,
     APITimeoutError,
     BadRequestError,
-    LegalesignError,
     APIConnectionError,
+    LegalesignSDKError,
     AuthenticationError,
     InternalServerError,
     PermissionDeniedError,
@@ -51,7 +51,7 @@
     "not_given",
     "Omit",
     "omit",
-    "LegalesignError",
+    "LegalesignSDKError",
     "APIError",
     "APIStatusError",
     "APITimeoutError",
@@ -71,8 +71,8 @@
     "AsyncClient",
     "Stream",
     "AsyncStream",
-    "Legalesign",
-    "AsyncLegalesign",
+    "LegalesignSDK",
+    "AsyncLegalesignSDK",
     "file_from_path",
     "BaseModel",
     "DEFAULT_TIMEOUT",
@@ -91,12 +91,12 @@
 # Update the __module__ attribute for exported symbols so that
 # error messages point to this module instead of the module
 # it was originally defined in, e.g.
-# legalesign._exceptions.NotFoundError -> legalesign.NotFoundError
+# legalesign_sdk._exceptions.NotFoundError -> legalesign_sdk.NotFoundError
 __locals = locals()
 for __name in __all__:
     if not __name.startswith("__"):
         try:
-            __locals[__name].__module__ = "legalesign"
+            __locals[__name].__module__ = "legalesign_sdk"
         except (TypeError, AttributeError):
             # Some of our exported symbols are builtins which we can't set attributes for.
             pass
diff --git a/src/legalesign/_base_client.py b/src/legalesign_sdk/_base_client.py
similarity index 99%
rename from src/legalesign/_base_client.py
rename to src/legalesign_sdk/_base_client.py
index f893c9b..f0c6396 100644
--- a/src/legalesign/_base_client.py
+++ b/src/legalesign_sdk/_base_client.py
@@ -389,7 +389,7 @@ def __init__(
 
         if max_retries is None:  # pyright: ignore[reportUnnecessaryComparison]
             raise TypeError(
-                "max_retries cannot be None. If you want to disable retries, pass `0`; if you want unlimited retries, pass `math.inf` or a very high number; if you want the default behavior, pass `legalesign.DEFAULT_MAX_RETRIES`"
+                "max_retries cannot be None. If you want to disable retries, pass `0`; if you want unlimited retries, pass `math.inf` or a very high number; if you want the default behavior, pass `legalesign_sdk.DEFAULT_MAX_RETRIES`"
             )
 
     def _enforce_trailing_slash(self, url: URL) -> URL:
diff --git a/src/legalesign/_client.py b/src/legalesign_sdk/_client.py
similarity index 72%
rename from src/legalesign/_client.py
rename to src/legalesign_sdk/_client.py
index c1b540d..47c4cc7 100644
--- a/src/legalesign/_client.py
+++ b/src/legalesign_sdk/_client.py
@@ -21,23 +21,9 @@
 )
 from ._utils import is_given, get_async_library
 from ._version import __version__
-from .resources import (
-    pdf,
-    user,
-    group,
-    member,
-    signer,
-    status,
-    invited,
-    document,
-    template,
-    subscribe,
-    attachment,
-    unsubscribe,
-    notifications,
-)
+from .resources import pdf, group, signer, status, document, template
 from ._streaming import Stream as Stream, AsyncStream as AsyncStream
-from ._exceptions import APIStatusError, LegalesignError
+from ._exceptions import APIStatusError, LegalesignSDKError
 from ._base_client import (
     DEFAULT_MAX_RETRIES,
     SyncAPIClient,
@@ -50,30 +36,23 @@
     "Transport",
     "ProxiesTypes",
     "RequestOptions",
-    "Legalesign",
-    "AsyncLegalesign",
+    "LegalesignSDK",
+    "AsyncLegalesignSDK",
     "Client",
     "AsyncClient",
 ]
 
 
-class Legalesign(SyncAPIClient):
-    attachment: attachment.AttachmentResource
+class LegalesignSDK(SyncAPIClient):
     document: document.DocumentResource
     group: group.GroupResource
-    invited: invited.InvitedResource
-    member: member.MemberResource
-    notifications: notifications.NotificationsResource
     pdf: pdf.PdfResource
     signer: signer.SignerResource
     status: status.StatusResource
-    subscribe: subscribe.SubscribeResource
     template: template.TemplateResource
     templatepdf: templatepdf.TemplatepdfResource
-    unsubscribe: unsubscribe.UnsubscribeResource
-    user: user.UserResource
-    with_raw_response: LegalesignWithRawResponse
-    with_streaming_response: LegalesignWithStreamedResponse
+    with_raw_response: LegalesignSDKWithRawResponse
+    with_streaming_response: LegalesignSDKWithStreamedResponse
 
     # client options
     api_key: str
@@ -101,22 +80,22 @@ def __init__(
         # part of our public interface in the future.
         _strict_response_validation: bool = False,
     ) -> None:
-        """Construct a new synchronous Legalesign client instance.
+        """Construct a new synchronous LegalesignSDK client instance.
 
-        This automatically infers the `api_key` argument from the `LEGALESIGN_API_KEY` environment variable if it is not provided.
+        This automatically infers the `api_key` argument from the `LEGALESIGN_SDK_API_KEY` environment variable if it is not provided.
         """
         if api_key is None:
-            api_key = os.environ.get("LEGALESIGN_API_KEY")
+            api_key = os.environ.get("LEGALESIGN_SDK_API_KEY")
         if api_key is None:
-            raise LegalesignError(
-                "The api_key client option must be set either by passing api_key to the client or by setting the LEGALESIGN_API_KEY environment variable"
+            raise LegalesignSDKError(
+                "The api_key client option must be set either by passing api_key to the client or by setting the LEGALESIGN_SDK_API_KEY environment variable"
             )
         self.api_key = api_key
 
         if base_url is None:
-            base_url = os.environ.get("LEGALESIGN_BASE_URL")
+            base_url = os.environ.get("LEGALESIGN_SDK_BASE_URL")
         if base_url is None:
-            base_url = f"https://lon-dev.legalesign.com/api/v1"
+            base_url = f"https://eu-api.legalesign.com/api/v1"
 
         super().__init__(
             version=__version__,
@@ -129,22 +108,15 @@ def __init__(
             _strict_response_validation=_strict_response_validation,
         )
 
-        self.attachment = attachment.AttachmentResource(self)
         self.document = document.DocumentResource(self)
         self.group = group.GroupResource(self)
-        self.invited = invited.InvitedResource(self)
-        self.member = member.MemberResource(self)
-        self.notifications = notifications.NotificationsResource(self)
         self.pdf = pdf.PdfResource(self)
         self.signer = signer.SignerResource(self)
         self.status = status.StatusResource(self)
-        self.subscribe = subscribe.SubscribeResource(self)
         self.template = template.TemplateResource(self)
         self.templatepdf = templatepdf.TemplatepdfResource(self)
-        self.unsubscribe = unsubscribe.UnsubscribeResource(self)
-        self.user = user.UserResource(self)
-        self.with_raw_response = LegalesignWithRawResponse(self)
-        self.with_streaming_response = LegalesignWithStreamedResponse(self)
+        self.with_raw_response = LegalesignSDKWithRawResponse(self)
+        self.with_streaming_response = LegalesignSDKWithStreamedResponse(self)
 
     @property
     @override
@@ -251,23 +223,16 @@ def _make_status_error(
         return APIStatusError(err_msg, response=response, body=body)
 
 
-class AsyncLegalesign(AsyncAPIClient):
-    attachment: attachment.AsyncAttachmentResource
+class AsyncLegalesignSDK(AsyncAPIClient):
     document: document.AsyncDocumentResource
     group: group.AsyncGroupResource
-    invited: invited.AsyncInvitedResource
-    member: member.AsyncMemberResource
-    notifications: notifications.AsyncNotificationsResource
     pdf: pdf.AsyncPdfResource
     signer: signer.AsyncSignerResource
     status: status.AsyncStatusResource
-    subscribe: subscribe.AsyncSubscribeResource
     template: template.AsyncTemplateResource
     templatepdf: templatepdf.AsyncTemplatepdfResource
-    unsubscribe: unsubscribe.AsyncUnsubscribeResource
-    user: user.AsyncUserResource
-    with_raw_response: AsyncLegalesignWithRawResponse
-    with_streaming_response: AsyncLegalesignWithStreamedResponse
+    with_raw_response: AsyncLegalesignSDKWithRawResponse
+    with_streaming_response: AsyncLegalesignSDKWithStreamedResponse
 
     # client options
     api_key: str
@@ -295,22 +260,22 @@ def __init__(
         # part of our public interface in the future.
         _strict_response_validation: bool = False,
     ) -> None:
-        """Construct a new async AsyncLegalesign client instance.
+        """Construct a new async AsyncLegalesignSDK client instance.
 
-        This automatically infers the `api_key` argument from the `LEGALESIGN_API_KEY` environment variable if it is not provided.
+        This automatically infers the `api_key` argument from the `LEGALESIGN_SDK_API_KEY` environment variable if it is not provided.
         """
         if api_key is None:
-            api_key = os.environ.get("LEGALESIGN_API_KEY")
+            api_key = os.environ.get("LEGALESIGN_SDK_API_KEY")
         if api_key is None:
-            raise LegalesignError(
-                "The api_key client option must be set either by passing api_key to the client or by setting the LEGALESIGN_API_KEY environment variable"
+            raise LegalesignSDKError(
+                "The api_key client option must be set either by passing api_key to the client or by setting the LEGALESIGN_SDK_API_KEY environment variable"
             )
         self.api_key = api_key
 
         if base_url is None:
-            base_url = os.environ.get("LEGALESIGN_BASE_URL")
+            base_url = os.environ.get("LEGALESIGN_SDK_BASE_URL")
         if base_url is None:
-            base_url = f"https://lon-dev.legalesign.com/api/v1"
+            base_url = f"https://eu-api.legalesign.com/api/v1"
 
         super().__init__(
             version=__version__,
@@ -323,22 +288,15 @@ def __init__(
             _strict_response_validation=_strict_response_validation,
         )
 
-        self.attachment = attachment.AsyncAttachmentResource(self)
         self.document = document.AsyncDocumentResource(self)
         self.group = group.AsyncGroupResource(self)
-        self.invited = invited.AsyncInvitedResource(self)
-        self.member = member.AsyncMemberResource(self)
-        self.notifications = notifications.AsyncNotificationsResource(self)
         self.pdf = pdf.AsyncPdfResource(self)
         self.signer = signer.AsyncSignerResource(self)
         self.status = status.AsyncStatusResource(self)
-        self.subscribe = subscribe.AsyncSubscribeResource(self)
         self.template = template.AsyncTemplateResource(self)
         self.templatepdf = templatepdf.AsyncTemplatepdfResource(self)
-        self.unsubscribe = unsubscribe.AsyncUnsubscribeResource(self)
-        self.user = user.AsyncUserResource(self)
-        self.with_raw_response = AsyncLegalesignWithRawResponse(self)
-        self.with_streaming_response = AsyncLegalesignWithStreamedResponse(self)
+        self.with_raw_response = AsyncLegalesignSDKWithRawResponse(self)
+        self.with_streaming_response = AsyncLegalesignSDKWithStreamedResponse(self)
 
     @property
     @override
@@ -445,78 +403,50 @@ def _make_status_error(
         return APIStatusError(err_msg, response=response, body=body)
 
 
-class LegalesignWithRawResponse:
-    def __init__(self, client: Legalesign) -> None:
-        self.attachment = attachment.AttachmentResourceWithRawResponse(client.attachment)
+class LegalesignSDKWithRawResponse:
+    def __init__(self, client: LegalesignSDK) -> None:
         self.document = document.DocumentResourceWithRawResponse(client.document)
         self.group = group.GroupResourceWithRawResponse(client.group)
-        self.invited = invited.InvitedResourceWithRawResponse(client.invited)
-        self.member = member.MemberResourceWithRawResponse(client.member)
-        self.notifications = notifications.NotificationsResourceWithRawResponse(client.notifications)
         self.pdf = pdf.PdfResourceWithRawResponse(client.pdf)
         self.signer = signer.SignerResourceWithRawResponse(client.signer)
         self.status = status.StatusResourceWithRawResponse(client.status)
-        self.subscribe = subscribe.SubscribeResourceWithRawResponse(client.subscribe)
         self.template = template.TemplateResourceWithRawResponse(client.template)
         self.templatepdf = templatepdf.TemplatepdfResourceWithRawResponse(client.templatepdf)
-        self.unsubscribe = unsubscribe.UnsubscribeResourceWithRawResponse(client.unsubscribe)
-        self.user = user.UserResourceWithRawResponse(client.user)
 
 
-class AsyncLegalesignWithRawResponse:
-    def __init__(self, client: AsyncLegalesign) -> None:
-        self.attachment = attachment.AsyncAttachmentResourceWithRawResponse(client.attachment)
+class AsyncLegalesignSDKWithRawResponse:
+    def __init__(self, client: AsyncLegalesignSDK) -> None:
         self.document = document.AsyncDocumentResourceWithRawResponse(client.document)
         self.group = group.AsyncGroupResourceWithRawResponse(client.group)
-        self.invited = invited.AsyncInvitedResourceWithRawResponse(client.invited)
-        self.member = member.AsyncMemberResourceWithRawResponse(client.member)
-        self.notifications = notifications.AsyncNotificationsResourceWithRawResponse(client.notifications)
         self.pdf = pdf.AsyncPdfResourceWithRawResponse(client.pdf)
         self.signer = signer.AsyncSignerResourceWithRawResponse(client.signer)
         self.status = status.AsyncStatusResourceWithRawResponse(client.status)
-        self.subscribe = subscribe.AsyncSubscribeResourceWithRawResponse(client.subscribe)
         self.template = template.AsyncTemplateResourceWithRawResponse(client.template)
         self.templatepdf = templatepdf.AsyncTemplatepdfResourceWithRawResponse(client.templatepdf)
-        self.unsubscribe = unsubscribe.AsyncUnsubscribeResourceWithRawResponse(client.unsubscribe)
-        self.user = user.AsyncUserResourceWithRawResponse(client.user)
 
 
-class LegalesignWithStreamedResponse:
-    def __init__(self, client: Legalesign) -> None:
-        self.attachment = attachment.AttachmentResourceWithStreamingResponse(client.attachment)
+class LegalesignSDKWithStreamedResponse:
+    def __init__(self, client: LegalesignSDK) -> None:
         self.document = document.DocumentResourceWithStreamingResponse(client.document)
         self.group = group.GroupResourceWithStreamingResponse(client.group)
-        self.invited = invited.InvitedResourceWithStreamingResponse(client.invited)
-        self.member = member.MemberResourceWithStreamingResponse(client.member)
-        self.notifications = notifications.NotificationsResourceWithStreamingResponse(client.notifications)
         self.pdf = pdf.PdfResourceWithStreamingResponse(client.pdf)
         self.signer = signer.SignerResourceWithStreamingResponse(client.signer)
         self.status = status.StatusResourceWithStreamingResponse(client.status)
-        self.subscribe = subscribe.SubscribeResourceWithStreamingResponse(client.subscribe)
         self.template = template.TemplateResourceWithStreamingResponse(client.template)
         self.templatepdf = templatepdf.TemplatepdfResourceWithStreamingResponse(client.templatepdf)
-        self.unsubscribe = unsubscribe.UnsubscribeResourceWithStreamingResponse(client.unsubscribe)
-        self.user = user.UserResourceWithStreamingResponse(client.user)
 
 
-class AsyncLegalesignWithStreamedResponse:
-    def __init__(self, client: AsyncLegalesign) -> None:
-        self.attachment = attachment.AsyncAttachmentResourceWithStreamingResponse(client.attachment)
+class AsyncLegalesignSDKWithStreamedResponse:
+    def __init__(self, client: AsyncLegalesignSDK) -> None:
         self.document = document.AsyncDocumentResourceWithStreamingResponse(client.document)
         self.group = group.AsyncGroupResourceWithStreamingResponse(client.group)
-        self.invited = invited.AsyncInvitedResourceWithStreamingResponse(client.invited)
-        self.member = member.AsyncMemberResourceWithStreamingResponse(client.member)
-        self.notifications = notifications.AsyncNotificationsResourceWithStreamingResponse(client.notifications)
         self.pdf = pdf.AsyncPdfResourceWithStreamingResponse(client.pdf)
         self.signer = signer.AsyncSignerResourceWithStreamingResponse(client.signer)
         self.status = status.AsyncStatusResourceWithStreamingResponse(client.status)
-        self.subscribe = subscribe.AsyncSubscribeResourceWithStreamingResponse(client.subscribe)
         self.template = template.AsyncTemplateResourceWithStreamingResponse(client.template)
         self.templatepdf = templatepdf.AsyncTemplatepdfResourceWithStreamingResponse(client.templatepdf)
-        self.unsubscribe = unsubscribe.AsyncUnsubscribeResourceWithStreamingResponse(client.unsubscribe)
-        self.user = user.AsyncUserResourceWithStreamingResponse(client.user)
 
 
-Client = Legalesign
+Client = LegalesignSDK
 
-AsyncClient = AsyncLegalesign
+AsyncClient = AsyncLegalesignSDK
diff --git a/src/legalesign/_compat.py b/src/legalesign_sdk/_compat.py
similarity index 100%
rename from src/legalesign/_compat.py
rename to src/legalesign_sdk/_compat.py
diff --git a/src/legalesign/_constants.py b/src/legalesign_sdk/_constants.py
similarity index 100%
rename from src/legalesign/_constants.py
rename to src/legalesign_sdk/_constants.py
diff --git a/src/legalesign/_exceptions.py b/src/legalesign_sdk/_exceptions.py
similarity index 97%
rename from src/legalesign/_exceptions.py
rename to src/legalesign_sdk/_exceptions.py
index 50d1c56..1d4afee 100644
--- a/src/legalesign/_exceptions.py
+++ b/src/legalesign_sdk/_exceptions.py
@@ -18,11 +18,11 @@
 ]
 
 
-class LegalesignError(Exception):
+class LegalesignSDKError(Exception):
     pass
 
 
-class APIError(LegalesignError):
+class APIError(LegalesignSDKError):
     message: str
     request: httpx.Request
 
diff --git a/src/legalesign/_files.py b/src/legalesign_sdk/_files.py
similarity index 100%
rename from src/legalesign/_files.py
rename to src/legalesign_sdk/_files.py
diff --git a/src/legalesign/_models.py b/src/legalesign_sdk/_models.py
similarity index 100%
rename from src/legalesign/_models.py
rename to src/legalesign_sdk/_models.py
diff --git a/src/legalesign/_qs.py b/src/legalesign_sdk/_qs.py
similarity index 100%
rename from src/legalesign/_qs.py
rename to src/legalesign_sdk/_qs.py
diff --git a/src/legalesign/_resource.py b/src/legalesign_sdk/_resource.py
similarity index 79%
rename from src/legalesign/_resource.py
rename to src/legalesign_sdk/_resource.py
index a9607e0..7981999 100644
--- a/src/legalesign/_resource.py
+++ b/src/legalesign_sdk/_resource.py
@@ -8,13 +8,13 @@
 import anyio
 
 if TYPE_CHECKING:
-    from ._client import Legalesign, AsyncLegalesign
+    from ._client import LegalesignSDK, AsyncLegalesignSDK
 
 
 class SyncAPIResource:
-    _client: Legalesign
+    _client: LegalesignSDK
 
-    def __init__(self, client: Legalesign) -> None:
+    def __init__(self, client: LegalesignSDK) -> None:
         self._client = client
         self._get = client.get
         self._post = client.post
@@ -28,9 +28,9 @@ def _sleep(self, seconds: float) -> None:
 
 
 class AsyncAPIResource:
-    _client: AsyncLegalesign
+    _client: AsyncLegalesignSDK
 
-    def __init__(self, client: AsyncLegalesign) -> None:
+    def __init__(self, client: AsyncLegalesignSDK) -> None:
         self._client = client
         self._get = client.get
         self._post = client.post
diff --git a/src/legalesign/_response.py b/src/legalesign_sdk/_response.py
similarity index 98%
rename from src/legalesign/_response.py
rename to src/legalesign_sdk/_response.py
index 0663c4b..ae6e1a1 100644
--- a/src/legalesign/_response.py
+++ b/src/legalesign_sdk/_response.py
@@ -29,7 +29,7 @@
 from ._models import BaseModel, is_basemodel
 from ._constants import RAW_RESPONSE_HEADER, OVERRIDE_CAST_TO_HEADER
 from ._streaming import Stream, AsyncStream, is_stream_class_type, extract_stream_chunk_type
-from ._exceptions import LegalesignError, APIResponseValidationError
+from ._exceptions import LegalesignSDKError, APIResponseValidationError
 
 if TYPE_CHECKING:
     from ._models import FinalRequestOptions
@@ -218,7 +218,7 @@ def _parse(self, *, to: type[_T] | None = None) -> R | _T:
             and issubclass(origin, pydantic.BaseModel)
         ):
             raise TypeError(
-                "Pydantic models must subclass our base model type, e.g. `from legalesign import BaseModel`"
+                "Pydantic models must subclass our base model type, e.g. `from legalesign_sdk import BaseModel`"
             )
 
         if (
@@ -285,7 +285,7 @@ def parse(self, *, to: type[_T] | None = None) -> R | _T:
         the `to` argument, e.g.
 
         ```py
-        from legalesign import BaseModel
+        from legalesign_sdk import BaseModel
 
 
         class MyModel(BaseModel):
@@ -387,7 +387,7 @@ async def parse(self, *, to: type[_T] | None = None) -> R | _T:
         the `to` argument, e.g.
 
         ```py
-        from legalesign import BaseModel
+        from legalesign_sdk import BaseModel
 
 
         class MyModel(BaseModel):
@@ -558,11 +558,11 @@ async def stream_to_file(
 class MissingStreamClassError(TypeError):
     def __init__(self) -> None:
         super().__init__(
-            "The `stream` argument was set to `True` but the `stream_cls` argument was not given. See `legalesign._streaming` for reference",
+            "The `stream` argument was set to `True` but the `stream_cls` argument was not given. See `legalesign_sdk._streaming` for reference",
         )
 
 
-class StreamAlreadyConsumed(LegalesignError):
+class StreamAlreadyConsumed(LegalesignSDKError):
     """
     Attempted to read or stream content, but the content has already
     been streamed.
diff --git a/src/legalesign/_streaming.py b/src/legalesign_sdk/_streaming.py
similarity index 98%
rename from src/legalesign/_streaming.py
rename to src/legalesign_sdk/_streaming.py
index 48243df..d04ddf3 100644
--- a/src/legalesign/_streaming.py
+++ b/src/legalesign_sdk/_streaming.py
@@ -12,7 +12,7 @@
 from ._utils import extract_type_var_from_base
 
 if TYPE_CHECKING:
-    from ._client import Legalesign, AsyncLegalesign
+    from ._client import LegalesignSDK, AsyncLegalesignSDK
 
 
 _T = TypeVar("_T")
@@ -30,7 +30,7 @@ def __init__(
         *,
         cast_to: type[_T],
         response: httpx.Response,
-        client: Legalesign,
+        client: LegalesignSDK,
     ) -> None:
         self.response = response
         self._cast_to = cast_to
@@ -93,7 +93,7 @@ def __init__(
         *,
         cast_to: type[_T],
         response: httpx.Response,
-        client: AsyncLegalesign,
+        client: AsyncLegalesignSDK,
     ) -> None:
         self.response = response
         self._cast_to = cast_to
diff --git a/src/legalesign/_types.py b/src/legalesign_sdk/_types.py
similarity index 99%
rename from src/legalesign/_types.py
rename to src/legalesign_sdk/_types.py
index e18b304..ff85178 100644
--- a/src/legalesign/_types.py
+++ b/src/legalesign_sdk/_types.py
@@ -92,7 +92,7 @@
 # This unfortunately means that you will either have
 # to import this type and pass it explicitly:
 #
-# from legalesign import NoneType
+# from legalesign_sdk import NoneType
 # client.get('/foo', cast_to=NoneType)
 #
 # or build it yourself:
diff --git a/src/legalesign/_utils/__init__.py b/src/legalesign_sdk/_utils/__init__.py
similarity index 100%
rename from src/legalesign/_utils/__init__.py
rename to src/legalesign_sdk/_utils/__init__.py
diff --git a/src/legalesign/_utils/_compat.py b/src/legalesign_sdk/_utils/_compat.py
similarity index 100%
rename from src/legalesign/_utils/_compat.py
rename to src/legalesign_sdk/_utils/_compat.py
diff --git a/src/legalesign/_utils/_datetime_parse.py b/src/legalesign_sdk/_utils/_datetime_parse.py
similarity index 100%
rename from src/legalesign/_utils/_datetime_parse.py
rename to src/legalesign_sdk/_utils/_datetime_parse.py
diff --git a/src/legalesign/_utils/_logs.py b/src/legalesign_sdk/_utils/_logs.py
similarity index 69%
rename from src/legalesign/_utils/_logs.py
rename to src/legalesign_sdk/_utils/_logs.py
index 4d8c74f..4dd4df4 100644
--- a/src/legalesign/_utils/_logs.py
+++ b/src/legalesign_sdk/_utils/_logs.py
@@ -1,12 +1,12 @@
 import os
 import logging
 
-logger: logging.Logger = logging.getLogger("legalesign")
+logger: logging.Logger = logging.getLogger("legalesign_sdk")
 httpx_logger: logging.Logger = logging.getLogger("httpx")
 
 
 def _basic_config() -> None:
-    # e.g. [2023-10-05 14:12:26 - legalesign._base_client:818 - DEBUG] HTTP Request: POST http://127.0.0.1:4010/foo/bar "200 OK"
+    # e.g. [2023-10-05 14:12:26 - legalesign_sdk._base_client:818 - DEBUG] HTTP Request: POST http://127.0.0.1:4010/foo/bar "200 OK"
     logging.basicConfig(
         format="[%(asctime)s - %(name)s:%(lineno)d - %(levelname)s] %(message)s",
         datefmt="%Y-%m-%d %H:%M:%S",
@@ -14,7 +14,7 @@ def _basic_config() -> None:
 
 
 def setup_logging() -> None:
-    env = os.environ.get("LEGALESIGN_LOG")
+    env = os.environ.get("LEGALESIGN_SDK_LOG")
     if env == "debug":
         _basic_config()
         logger.setLevel(logging.DEBUG)
diff --git a/src/legalesign/_utils/_proxy.py b/src/legalesign_sdk/_utils/_proxy.py
similarity index 100%
rename from src/legalesign/_utils/_proxy.py
rename to src/legalesign_sdk/_utils/_proxy.py
diff --git a/src/legalesign/_utils/_reflection.py b/src/legalesign_sdk/_utils/_reflection.py
similarity index 100%
rename from src/legalesign/_utils/_reflection.py
rename to src/legalesign_sdk/_utils/_reflection.py
diff --git a/src/legalesign/_utils/_resources_proxy.py b/src/legalesign_sdk/_utils/_resources_proxy.py
similarity index 50%
rename from src/legalesign/_utils/_resources_proxy.py
rename to src/legalesign_sdk/_utils/_resources_proxy.py
index fa6c0fe..a6bd35e 100644
--- a/src/legalesign/_utils/_resources_proxy.py
+++ b/src/legalesign_sdk/_utils/_resources_proxy.py
@@ -7,17 +7,17 @@
 
 
 class ResourcesProxy(LazyProxy[Any]):
-    """A proxy for the `legalesign.resources` module.
+    """A proxy for the `legalesign_sdk.resources` module.
 
-    This is used so that we can lazily import `legalesign.resources` only when
-    needed *and* so that users can just import `legalesign` and reference `legalesign.resources`
+    This is used so that we can lazily import `legalesign_sdk.resources` only when
+    needed *and* so that users can just import `legalesign_sdk` and reference `legalesign_sdk.resources`
     """
 
     @override
     def __load__(self) -> Any:
         import importlib
 
-        mod = importlib.import_module("legalesign.resources")
+        mod = importlib.import_module("legalesign_sdk.resources")
         return mod
 
 
diff --git a/src/legalesign/_utils/_streams.py b/src/legalesign_sdk/_utils/_streams.py
similarity index 100%
rename from src/legalesign/_utils/_streams.py
rename to src/legalesign_sdk/_utils/_streams.py
diff --git a/src/legalesign/_utils/_sync.py b/src/legalesign_sdk/_utils/_sync.py
similarity index 100%
rename from src/legalesign/_utils/_sync.py
rename to src/legalesign_sdk/_utils/_sync.py
diff --git a/src/legalesign/_utils/_transform.py b/src/legalesign_sdk/_utils/_transform.py
similarity index 100%
rename from src/legalesign/_utils/_transform.py
rename to src/legalesign_sdk/_utils/_transform.py
diff --git a/src/legalesign/_utils/_typing.py b/src/legalesign_sdk/_utils/_typing.py
similarity index 100%
rename from src/legalesign/_utils/_typing.py
rename to src/legalesign_sdk/_utils/_typing.py
diff --git a/src/legalesign/_utils/_utils.py b/src/legalesign_sdk/_utils/_utils.py
similarity index 100%
rename from src/legalesign/_utils/_utils.py
rename to src/legalesign_sdk/_utils/_utils.py
diff --git a/src/legalesign/_version.py b/src/legalesign_sdk/_version.py
similarity index 100%
rename from src/legalesign/_version.py
rename to src/legalesign_sdk/_version.py
diff --git a/src/legalesign/lib/.keep b/src/legalesign_sdk/lib/.keep
similarity index 100%
rename from src/legalesign/lib/.keep
rename to src/legalesign_sdk/lib/.keep
diff --git a/src/legalesign/py.typed b/src/legalesign_sdk/py.typed
similarity index 100%
rename from src/legalesign/py.typed
rename to src/legalesign_sdk/py.typed
diff --git a/src/legalesign_sdk/resources/__init__.py b/src/legalesign_sdk/resources/__init__.py
new file mode 100644
index 0000000..ef3fc21
--- /dev/null
+++ b/src/legalesign_sdk/resources/__init__.py
@@ -0,0 +1,103 @@
+# File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.
+
+from .pdf import (
+    PdfResource,
+    AsyncPdfResource,
+    PdfResourceWithRawResponse,
+    AsyncPdfResourceWithRawResponse,
+    PdfResourceWithStreamingResponse,
+    AsyncPdfResourceWithStreamingResponse,
+)
+from .group import (
+    GroupResource,
+    AsyncGroupResource,
+    GroupResourceWithRawResponse,
+    AsyncGroupResourceWithRawResponse,
+    GroupResourceWithStreamingResponse,
+    AsyncGroupResourceWithStreamingResponse,
+)
+from .signer import (
+    SignerResource,
+    AsyncSignerResource,
+    SignerResourceWithRawResponse,
+    AsyncSignerResourceWithRawResponse,
+    SignerResourceWithStreamingResponse,
+    AsyncSignerResourceWithStreamingResponse,
+)
+from .status import (
+    StatusResource,
+    AsyncStatusResource,
+    StatusResourceWithRawResponse,
+    AsyncStatusResourceWithRawResponse,
+    StatusResourceWithStreamingResponse,
+    AsyncStatusResourceWithStreamingResponse,
+)
+from .document import (
+    DocumentResource,
+    AsyncDocumentResource,
+    DocumentResourceWithRawResponse,
+    AsyncDocumentResourceWithRawResponse,
+    DocumentResourceWithStreamingResponse,
+    AsyncDocumentResourceWithStreamingResponse,
+)
+from .template import (
+    TemplateResource,
+    AsyncTemplateResource,
+    TemplateResourceWithRawResponse,
+    AsyncTemplateResourceWithRawResponse,
+    TemplateResourceWithStreamingResponse,
+    AsyncTemplateResourceWithStreamingResponse,
+)
+from .templatepdf import (
+    TemplatepdfResource,
+    AsyncTemplatepdfResource,
+    TemplatepdfResourceWithRawResponse,
+    AsyncTemplatepdfResourceWithRawResponse,
+    TemplatepdfResourceWithStreamingResponse,
+    AsyncTemplatepdfResourceWithStreamingResponse,
+)
+
+__all__ = [
+    "DocumentResource",
+    "AsyncDocumentResource",
+    "DocumentResourceWithRawResponse",
+    "AsyncDocumentResourceWithRawResponse",
+    "DocumentResourceWithStreamingResponse",
+    "AsyncDocumentResourceWithStreamingResponse",
+    "GroupResource",
+    "AsyncGroupResource",
+    "GroupResourceWithRawResponse",
+    "AsyncGroupResourceWithRawResponse",
+    "GroupResourceWithStreamingResponse",
+    "AsyncGroupResourceWithStreamingResponse",
+    "PdfResource",
+    "AsyncPdfResource",
+    "PdfResourceWithRawResponse",
+    "AsyncPdfResourceWithRawResponse",
+    "PdfResourceWithStreamingResponse",
+    "AsyncPdfResourceWithStreamingResponse",
+    "SignerResource",
+    "AsyncSignerResource",
+    "SignerResourceWithRawResponse",
+    "AsyncSignerResourceWithRawResponse",
+    "SignerResourceWithStreamingResponse",
+    "AsyncSignerResourceWithStreamingResponse",
+    "StatusResource",
+    "AsyncStatusResource",
+    "StatusResourceWithRawResponse",
+    "AsyncStatusResourceWithRawResponse",
+    "StatusResourceWithStreamingResponse",
+    "AsyncStatusResourceWithStreamingResponse",
+    "TemplateResource",
+    "AsyncTemplateResource",
+    "TemplateResourceWithRawResponse",
+    "AsyncTemplateResourceWithRawResponse",
+    "TemplateResourceWithStreamingResponse",
+    "AsyncTemplateResourceWithStreamingResponse",
+    "TemplatepdfResource",
+    "AsyncTemplatepdfResource",
+    "TemplatepdfResourceWithRawResponse",
+    "AsyncTemplatepdfResourceWithRawResponse",
+    "TemplatepdfResourceWithStreamingResponse",
+    "AsyncTemplatepdfResourceWithStreamingResponse",
+]
diff --git a/src/legalesign/resources/document.py b/src/legalesign_sdk/resources/document.py
similarity index 79%
rename from src/legalesign/resources/document.py
rename to src/legalesign_sdk/resources/document.py
index facfa48..a384df0 100644
--- a/src/legalesign/resources/document.py
+++ b/src/legalesign_sdk/resources/document.py
@@ -8,24 +8,16 @@
 
 import httpx
 
-from ..types import document_list_params, document_create_params, document_preview_params
+from ..types import document_list_params, document_create_params
 from .._types import Body, Omit, Query, Headers, NoneType, NotGiven, omit, not_given
 from .._utils import maybe_transform, async_maybe_transform
 from .._compat import cached_property
 from .._resource import SyncAPIResource, AsyncAPIResource
 from .._response import (
-    BinaryAPIResponse,
-    AsyncBinaryAPIResponse,
-    StreamedBinaryAPIResponse,
-    AsyncStreamedBinaryAPIResponse,
     to_raw_response_wrapper,
     to_streamed_response_wrapper,
     async_to_raw_response_wrapper,
-    to_custom_raw_response_wrapper,
     async_to_streamed_response_wrapper,
-    to_custom_streamed_response_wrapper,
-    async_to_custom_raw_response_wrapper,
-    async_to_custom_streamed_response_wrapper,
 )
 from .._base_client import make_request_options
 from ..types.document_list_response import DocumentListResponse
@@ -43,7 +35,7 @@ def with_raw_response(self) -> DocumentResourceWithRawResponse:
         This property can be used as a prefix for any HTTP method call to return
         the raw response object instead of the parsed content.
 
-        For more information, see https://www.github.com/legalesign/legalesign-rest-python#accessing-raw-response-data-eg-headers
+        For more information, see https://www.github.com/stainless-sdks/legalesign-sdk-python#accessing-raw-response-data-eg-headers
         """
         return DocumentResourceWithRawResponse(self)
 
@@ -52,7 +44,7 @@ def with_streaming_response(self) -> DocumentResourceWithStreamingResponse:
         """
         An alternative to `.with_raw_response` that doesn't eagerly read the response body.
 
-        For more information, see https://www.github.com/legalesign/legalesign-rest-python#with_streaming_response
+        For more information, see https://www.github.com/stainless-sdks/legalesign-sdk-python#with_streaming_response
         """
         return DocumentResourceWithStreamingResponse(self)
 
@@ -357,76 +349,6 @@ def archive(
             cast_to=NoneType,
         )
 
-    def delete_permanently(
-        self,
-        doc_id: str,
-        *,
-        # Use the following arguments if you need to pass additional parameters to the API that aren't available via kwargs.
-        # The extra values given here take precedence over values defined on the client or passed to this method.
-        extra_headers: Headers | None = None,
-        extra_query: Query | None = None,
-        extra_body: Body | None = None,
-        timeout: float | httpx.Timeout | None | NotGiven = not_given,
-    ) -> None:
-        """Permanently deletes data and files.
-
-        You must enable group automated deletion. We
-        recommend archiveDocument.
-
-        Args:
-          extra_headers: Send extra headers
-
-          extra_query: Add additional query parameters to the request
-
-          extra_body: Add additional JSON properties to the request
-
-          timeout: Override the client-level default timeout for this request, in seconds
-        """
-        if not doc_id:
-            raise ValueError(f"Expected a non-empty value for `doc_id` but received {doc_id!r}")
-        extra_headers = {"Accept": "*/*", **(extra_headers or {})}
-        return self._delete(
-            f"/document/{doc_id}/delete/",
-            options=make_request_options(
-                extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout
-            ),
-            cast_to=NoneType,
-        )
-
-    def download_audit_log(
-        self,
-        doc_id: str,
-        *,
-        # Use the following arguments if you need to pass additional parameters to the API that aren't available via kwargs.
-        # The extra values given here take precedence over values defined on the client or passed to this method.
-        extra_headers: Headers | None = None,
-        extra_query: Query | None = None,
-        extra_body: Body | None = None,
-        timeout: float | httpx.Timeout | None | NotGiven = not_given,
-    ) -> BinaryAPIResponse:
-        """
-        Download pdf of audit log
-
-        Args:
-          extra_headers: Send extra headers
-
-          extra_query: Add additional query parameters to the request
-
-          extra_body: Add additional JSON properties to the request
-
-          timeout: Override the client-level default timeout for this request, in seconds
-        """
-        if not doc_id:
-            raise ValueError(f"Expected a non-empty value for `doc_id` but received {doc_id!r}")
-        extra_headers = {"Accept": "application/pdf", **(extra_headers or {})}
-        return self._get(
-            f"/document/{doc_id}/auditlog/",
-            options=make_request_options(
-                extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout
-            ),
-            cast_to=BinaryAPIResponse,
-        )
-
     def get_fields(
         self,
         doc_id: str,
@@ -460,13 +382,10 @@ def get_fields(
             cast_to=DocumentGetFieldsResponse,
         )
 
-    def preview(
+    def permanently_delete(
         self,
+        doc_id: str,
         *,
-        group: str | Omit = omit,
-        signee_count: int | Omit = omit,
-        text: str | Omit = omit,
-        title: str | Omit = omit,
         # Use the following arguments if you need to pass additional parameters to the API that aren't available via kwargs.
         # The extra values given here take precedence over values defined on the client or passed to this method.
         extra_headers: Headers | None = None,
@@ -474,10 +393,10 @@ def preview(
         extra_body: Body | None = None,
         timeout: float | httpx.Timeout | None | NotGiven = not_given,
     ) -> None:
-        """
-        Returns a redirect response (302) with link in the Location header to a one-use
-        temporary URL you can redirect to, to see a preview of the signing page. Follow
-        the redirect immediately since it expires after a few seconds.
+        """Permanently deletes data and files.
+
+        You must enable group automated deletion. We
+        recommend archiveDocument.
 
         Args:
           extra_headers: Send extra headers
@@ -488,18 +407,11 @@ def preview(
 
           timeout: Override the client-level default timeout for this request, in seconds
         """
+        if not doc_id:
+            raise ValueError(f"Expected a non-empty value for `doc_id` but received {doc_id!r}")
         extra_headers = {"Accept": "*/*", **(extra_headers or {})}
-        return self._post(
-            "/document/preview/",
-            body=maybe_transform(
-                {
-                    "group": group,
-                    "signee_count": signee_count,
-                    "text": text,
-                    "title": title,
-                },
-                document_preview_params.DocumentPreviewParams,
-            ),
+        return self._delete(
+            f"/document/{doc_id}/delete/",
             options=make_request_options(
                 extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout
             ),
@@ -514,7 +426,7 @@ def with_raw_response(self) -> AsyncDocumentResourceWithRawResponse:
         This property can be used as a prefix for any HTTP method call to return
         the raw response object instead of the parsed content.
 
-        For more information, see https://www.github.com/legalesign/legalesign-rest-python#accessing-raw-response-data-eg-headers
+        For more information, see https://www.github.com/stainless-sdks/legalesign-sdk-python#accessing-raw-response-data-eg-headers
         """
         return AsyncDocumentResourceWithRawResponse(self)
 
@@ -523,7 +435,7 @@ def with_streaming_response(self) -> AsyncDocumentResourceWithStreamingResponse:
         """
         An alternative to `.with_raw_response` that doesn't eagerly read the response body.
 
-        For more information, see https://www.github.com/legalesign/legalesign-rest-python#with_streaming_response
+        For more information, see https://www.github.com/stainless-sdks/legalesign-sdk-python#with_streaming_response
         """
         return AsyncDocumentResourceWithStreamingResponse(self)
 
@@ -828,76 +740,6 @@ async def archive(
             cast_to=NoneType,
         )
 
-    async def delete_permanently(
-        self,
-        doc_id: str,
-        *,
-        # Use the following arguments if you need to pass additional parameters to the API that aren't available via kwargs.
-        # The extra values given here take precedence over values defined on the client or passed to this method.
-        extra_headers: Headers | None = None,
-        extra_query: Query | None = None,
-        extra_body: Body | None = None,
-        timeout: float | httpx.Timeout | None | NotGiven = not_given,
-    ) -> None:
-        """Permanently deletes data and files.
-
-        You must enable group automated deletion. We
-        recommend archiveDocument.
-
-        Args:
-          extra_headers: Send extra headers
-
-          extra_query: Add additional query parameters to the request
-
-          extra_body: Add additional JSON properties to the request
-
-          timeout: Override the client-level default timeout for this request, in seconds
-        """
-        if not doc_id:
-            raise ValueError(f"Expected a non-empty value for `doc_id` but received {doc_id!r}")
-        extra_headers = {"Accept": "*/*", **(extra_headers or {})}
-        return await self._delete(
-            f"/document/{doc_id}/delete/",
-            options=make_request_options(
-                extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout
-            ),
-            cast_to=NoneType,
-        )
-
-    async def download_audit_log(
-        self,
-        doc_id: str,
-        *,
-        # Use the following arguments if you need to pass additional parameters to the API that aren't available via kwargs.
-        # The extra values given here take precedence over values defined on the client or passed to this method.
-        extra_headers: Headers | None = None,
-        extra_query: Query | None = None,
-        extra_body: Body | None = None,
-        timeout: float | httpx.Timeout | None | NotGiven = not_given,
-    ) -> AsyncBinaryAPIResponse:
-        """
-        Download pdf of audit log
-
-        Args:
-          extra_headers: Send extra headers
-
-          extra_query: Add additional query parameters to the request
-
-          extra_body: Add additional JSON properties to the request
-
-          timeout: Override the client-level default timeout for this request, in seconds
-        """
-        if not doc_id:
-            raise ValueError(f"Expected a non-empty value for `doc_id` but received {doc_id!r}")
-        extra_headers = {"Accept": "application/pdf", **(extra_headers or {})}
-        return await self._get(
-            f"/document/{doc_id}/auditlog/",
-            options=make_request_options(
-                extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout
-            ),
-            cast_to=AsyncBinaryAPIResponse,
-        )
-
     async def get_fields(
         self,
         doc_id: str,
@@ -931,13 +773,10 @@ async def get_fields(
             cast_to=DocumentGetFieldsResponse,
         )
 
-    async def preview(
+    async def permanently_delete(
         self,
+        doc_id: str,
         *,
-        group: str | Omit = omit,
-        signee_count: int | Omit = omit,
-        text: str | Omit = omit,
-        title: str | Omit = omit,
         # Use the following arguments if you need to pass additional parameters to the API that aren't available via kwargs.
         # The extra values given here take precedence over values defined on the client or passed to this method.
         extra_headers: Headers | None = None,
@@ -945,10 +784,10 @@ async def preview(
         extra_body: Body | None = None,
         timeout: float | httpx.Timeout | None | NotGiven = not_given,
     ) -> None:
-        """
-        Returns a redirect response (302) with link in the Location header to a one-use
-        temporary URL you can redirect to, to see a preview of the signing page. Follow
-        the redirect immediately since it expires after a few seconds.
+        """Permanently deletes data and files.
+
+        You must enable group automated deletion. We
+        recommend archiveDocument.
 
         Args:
           extra_headers: Send extra headers
@@ -959,18 +798,11 @@ async def preview(
 
           timeout: Override the client-level default timeout for this request, in seconds
         """
+        if not doc_id:
+            raise ValueError(f"Expected a non-empty value for `doc_id` but received {doc_id!r}")
         extra_headers = {"Accept": "*/*", **(extra_headers or {})}
-        return await self._post(
-            "/document/preview/",
-            body=await async_maybe_transform(
-                {
-                    "group": group,
-                    "signee_count": signee_count,
-                    "text": text,
-                    "title": title,
-                },
-                document_preview_params.DocumentPreviewParams,
-            ),
+        return await self._delete(
+            f"/document/{doc_id}/delete/",
             options=make_request_options(
                 extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout
             ),
@@ -994,18 +826,11 @@ def __init__(self, document: DocumentResource) -> None:
         self.archive = to_raw_response_wrapper(
             document.archive,
         )
-        self.delete_permanently = to_raw_response_wrapper(
-            document.delete_permanently,
-        )
-        self.download_audit_log = to_custom_raw_response_wrapper(
-            document.download_audit_log,
-            BinaryAPIResponse,
-        )
         self.get_fields = to_raw_response_wrapper(
             document.get_fields,
         )
-        self.preview = to_raw_response_wrapper(
-            document.preview,
+        self.permanently_delete = to_raw_response_wrapper(
+            document.permanently_delete,
         )
 
 
@@ -1025,18 +850,11 @@ def __init__(self, document: AsyncDocumentResource) -> None:
         self.archive = async_to_raw_response_wrapper(
             document.archive,
         )
-        self.delete_permanently = async_to_raw_response_wrapper(
-            document.delete_permanently,
-        )
-        self.download_audit_log = async_to_custom_raw_response_wrapper(
-            document.download_audit_log,
-            AsyncBinaryAPIResponse,
-        )
         self.get_fields = async_to_raw_response_wrapper(
             document.get_fields,
         )
-        self.preview = async_to_raw_response_wrapper(
-            document.preview,
+        self.permanently_delete = async_to_raw_response_wrapper(
+            document.permanently_delete,
         )
 
 
@@ -1056,18 +874,11 @@ def __init__(self, document: DocumentResource) -> None:
         self.archive = to_streamed_response_wrapper(
             document.archive,
         )
-        self.delete_permanently = to_streamed_response_wrapper(
-            document.delete_permanently,
-        )
-        self.download_audit_log = to_custom_streamed_response_wrapper(
-            document.download_audit_log,
-            StreamedBinaryAPIResponse,
-        )
         self.get_fields = to_streamed_response_wrapper(
             document.get_fields,
         )
-        self.preview = to_streamed_response_wrapper(
-            document.preview,
+        self.permanently_delete = to_streamed_response_wrapper(
+            document.permanently_delete,
         )
 
 
@@ -1087,16 +898,9 @@ def __init__(self, document: AsyncDocumentResource) -> None:
         self.archive = async_to_streamed_response_wrapper(
             document.archive,
         )
-        self.delete_permanently = async_to_streamed_response_wrapper(
-            document.delete_permanently,
-        )
-        self.download_audit_log = async_to_custom_streamed_response_wrapper(
-            document.download_audit_log,
-            AsyncStreamedBinaryAPIResponse,
-        )
         self.get_fields = async_to_streamed_response_wrapper(
             document.get_fields,
         )
-        self.preview = async_to_streamed_response_wrapper(
-            document.preview,
+        self.permanently_delete = async_to_streamed_response_wrapper(
+            document.permanently_delete,
         )
diff --git a/src/legalesign/resources/group.py b/src/legalesign_sdk/resources/group.py
similarity index 76%
rename from src/legalesign/resources/group.py
rename to src/legalesign_sdk/resources/group.py
index 841bf66..91a23c5 100644
--- a/src/legalesign/resources/group.py
+++ b/src/legalesign_sdk/resources/group.py
@@ -4,7 +4,7 @@
 
 import httpx
 
-from ..types import group_list_params, group_create_params, group_update_params
+from ..types import group_list_params, group_create_params
 from .._types import Body, Omit, Query, Headers, NoneType, NotGiven, omit, not_given
 from .._utils import maybe_transform, async_maybe_transform
 from .._compat import cached_property
@@ -29,7 +29,7 @@ def with_raw_response(self) -> GroupResourceWithRawResponse:
         This property can be used as a prefix for any HTTP method call to return
         the raw response object instead of the parsed content.
 
-        For more information, see https://www.github.com/legalesign/legalesign-rest-python#accessing-raw-response-data-eg-headers
+        For more information, see https://www.github.com/stainless-sdks/legalesign-sdk-python#accessing-raw-response-data-eg-headers
         """
         return GroupResourceWithRawResponse(self)
 
@@ -38,7 +38,7 @@ def with_streaming_response(self) -> GroupResourceWithStreamingResponse:
         """
         An alternative to `.with_raw_response` that doesn't eagerly read the response body.
 
-        For more information, see https://www.github.com/legalesign/legalesign-rest-python#with_streaming_response
+        For more information, see https://www.github.com/stainless-sdks/legalesign-sdk-python#with_streaming_response
         """
         return GroupResourceWithStreamingResponse(self)
 
@@ -117,42 +117,6 @@ def retrieve(
             cast_to=GroupRetrieveResponse,
         )
 
-    def update(
-        self,
-        group_id: str,
-        *,
-        public_name: str | Omit = omit,
-        # Use the following arguments if you need to pass additional parameters to the API that aren't available via kwargs.
-        # The extra values given here take precedence over values defined on the client or passed to this method.
-        extra_headers: Headers | None = None,
-        extra_query: Query | None = None,
-        extra_body: Body | None = None,
-        timeout: float | httpx.Timeout | None | NotGiven = not_given,
-    ) -> None:
-        """
-        Update group
-
-        Args:
-          extra_headers: Send extra headers
-
-          extra_query: Add additional query parameters to the request
-
-          extra_body: Add additional JSON properties to the request
-
-          timeout: Override the client-level default timeout for this request, in seconds
-        """
-        if not group_id:
-            raise ValueError(f"Expected a non-empty value for `group_id` but received {group_id!r}")
-        extra_headers = {"Accept": "*/*", **(extra_headers or {})}
-        return self._patch(
-            f"/group/{group_id}/",
-            body=maybe_transform({"public_name": public_name}, group_update_params.GroupUpdateParams),
-            options=make_request_options(
-                extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout
-            ),
-            cast_to=NoneType,
-        )
-
     def list(
         self,
         *,
@@ -209,7 +173,7 @@ def with_raw_response(self) -> AsyncGroupResourceWithRawResponse:
         This property can be used as a prefix for any HTTP method call to return
         the raw response object instead of the parsed content.
 
-        For more information, see https://www.github.com/legalesign/legalesign-rest-python#accessing-raw-response-data-eg-headers
+        For more information, see https://www.github.com/stainless-sdks/legalesign-sdk-python#accessing-raw-response-data-eg-headers
         """
         return AsyncGroupResourceWithRawResponse(self)
 
@@ -218,7 +182,7 @@ def with_streaming_response(self) -> AsyncGroupResourceWithStreamingResponse:
         """
         An alternative to `.with_raw_response` that doesn't eagerly read the response body.
 
-        For more information, see https://www.github.com/legalesign/legalesign-rest-python#with_streaming_response
+        For more information, see https://www.github.com/stainless-sdks/legalesign-sdk-python#with_streaming_response
         """
         return AsyncGroupResourceWithStreamingResponse(self)
 
@@ -297,42 +261,6 @@ async def retrieve(
             cast_to=GroupRetrieveResponse,
         )
 
-    async def update(
-        self,
-        group_id: str,
-        *,
-        public_name: str | Omit = omit,
-        # Use the following arguments if you need to pass additional parameters to the API that aren't available via kwargs.
-        # The extra values given here take precedence over values defined on the client or passed to this method.
-        extra_headers: Headers | None = None,
-        extra_query: Query | None = None,
-        extra_body: Body | None = None,
-        timeout: float | httpx.Timeout | None | NotGiven = not_given,
-    ) -> None:
-        """
-        Update group
-
-        Args:
-          extra_headers: Send extra headers
-
-          extra_query: Add additional query parameters to the request
-
-          extra_body: Add additional JSON properties to the request
-
-          timeout: Override the client-level default timeout for this request, in seconds
-        """
-        if not group_id:
-            raise ValueError(f"Expected a non-empty value for `group_id` but received {group_id!r}")
-        extra_headers = {"Accept": "*/*", **(extra_headers or {})}
-        return await self._patch(
-            f"/group/{group_id}/",
-            body=await async_maybe_transform({"public_name": public_name}, group_update_params.GroupUpdateParams),
-            options=make_request_options(
-                extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout
-            ),
-            cast_to=NoneType,
-        )
-
     async def list(
         self,
         *,
@@ -392,9 +320,6 @@ def __init__(self, group: GroupResource) -> None:
         self.retrieve = to_raw_response_wrapper(
             group.retrieve,
         )
-        self.update = to_raw_response_wrapper(
-            group.update,
-        )
         self.list = to_raw_response_wrapper(
             group.list,
         )
@@ -410,9 +335,6 @@ def __init__(self, group: AsyncGroupResource) -> None:
         self.retrieve = async_to_raw_response_wrapper(
             group.retrieve,
         )
-        self.update = async_to_raw_response_wrapper(
-            group.update,
-        )
         self.list = async_to_raw_response_wrapper(
             group.list,
         )
@@ -428,9 +350,6 @@ def __init__(self, group: GroupResource) -> None:
         self.retrieve = to_streamed_response_wrapper(
             group.retrieve,
         )
-        self.update = to_streamed_response_wrapper(
-            group.update,
-        )
         self.list = to_streamed_response_wrapper(
             group.list,
         )
@@ -446,9 +365,6 @@ def __init__(self, group: AsyncGroupResource) -> None:
         self.retrieve = async_to_streamed_response_wrapper(
             group.retrieve,
         )
-        self.update = async_to_streamed_response_wrapper(
-            group.update,
-        )
         self.list = async_to_streamed_response_wrapper(
             group.list,
         )
diff --git a/src/legalesign_sdk/resources/pdf.py b/src/legalesign_sdk/resources/pdf.py
new file mode 100644
index 0000000..ced370b
--- /dev/null
+++ b/src/legalesign_sdk/resources/pdf.py
@@ -0,0 +1,172 @@
+# File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.
+
+from __future__ import annotations
+
+import httpx
+
+from .._types import Body, Query, Headers, NotGiven, not_given
+from .._compat import cached_property
+from .._resource import SyncAPIResource, AsyncAPIResource
+from .._response import (
+    BinaryAPIResponse,
+    AsyncBinaryAPIResponse,
+    StreamedBinaryAPIResponse,
+    AsyncStreamedBinaryAPIResponse,
+    to_custom_raw_response_wrapper,
+    to_custom_streamed_response_wrapper,
+    async_to_custom_raw_response_wrapper,
+    async_to_custom_streamed_response_wrapper,
+)
+from .._base_client import make_request_options
+
+__all__ = ["PdfResource", "AsyncPdfResource"]
+
+
+class PdfResource(SyncAPIResource):
+    @cached_property
+    def with_raw_response(self) -> PdfResourceWithRawResponse:
+        """
+        This property can be used as a prefix for any HTTP method call to return
+        the raw response object instead of the parsed content.
+
+        For more information, see https://www.github.com/stainless-sdks/legalesign-sdk-python#accessing-raw-response-data-eg-headers
+        """
+        return PdfResourceWithRawResponse(self)
+
+    @cached_property
+    def with_streaming_response(self) -> PdfResourceWithStreamingResponse:
+        """
+        An alternative to `.with_raw_response` that doesn't eagerly read the response body.
+
+        For more information, see https://www.github.com/stainless-sdks/legalesign-sdk-python#with_streaming_response
+        """
+        return PdfResourceWithStreamingResponse(self)
+
+    def retrieve(
+        self,
+        doc_id: str,
+        *,
+        # Use the following arguments if you need to pass additional parameters to the API that aren't available via kwargs.
+        # The extra values given here take precedence over values defined on the client or passed to this method.
+        extra_headers: Headers | None = None,
+        extra_query: Query | None = None,
+        extra_body: Body | None = None,
+        timeout: float | httpx.Timeout | None | NotGiven = not_given,
+    ) -> BinaryAPIResponse:
+        """
+        Get the PDF for a signing document
+
+        Args:
+          extra_headers: Send extra headers
+
+          extra_query: Add additional query parameters to the request
+
+          extra_body: Add additional JSON properties to the request
+
+          timeout: Override the client-level default timeout for this request, in seconds
+        """
+        if not doc_id:
+            raise ValueError(f"Expected a non-empty value for `doc_id` but received {doc_id!r}")
+        extra_headers = {"Accept": "application/pdf", **(extra_headers or {})}
+        return self._get(
+            f"/pdf/{doc_id}/",
+            options=make_request_options(
+                extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout
+            ),
+            cast_to=BinaryAPIResponse,
+        )
+
+
+class AsyncPdfResource(AsyncAPIResource):
+    @cached_property
+    def with_raw_response(self) -> AsyncPdfResourceWithRawResponse:
+        """
+        This property can be used as a prefix for any HTTP method call to return
+        the raw response object instead of the parsed content.
+
+        For more information, see https://www.github.com/stainless-sdks/legalesign-sdk-python#accessing-raw-response-data-eg-headers
+        """
+        return AsyncPdfResourceWithRawResponse(self)
+
+    @cached_property
+    def with_streaming_response(self) -> AsyncPdfResourceWithStreamingResponse:
+        """
+        An alternative to `.with_raw_response` that doesn't eagerly read the response body.
+
+        For more information, see https://www.github.com/stainless-sdks/legalesign-sdk-python#with_streaming_response
+        """
+        return AsyncPdfResourceWithStreamingResponse(self)
+
+    async def retrieve(
+        self,
+        doc_id: str,
+        *,
+        # Use the following arguments if you need to pass additional parameters to the API that aren't available via kwargs.
+        # The extra values given here take precedence over values defined on the client or passed to this method.
+        extra_headers: Headers | None = None,
+        extra_query: Query | None = None,
+        extra_body: Body | None = None,
+        timeout: float | httpx.Timeout | None | NotGiven = not_given,
+    ) -> AsyncBinaryAPIResponse:
+        """
+        Get the PDF for a signing document
+
+        Args:
+          extra_headers: Send extra headers
+
+          extra_query: Add additional query parameters to the request
+
+          extra_body: Add additional JSON properties to the request
+
+          timeout: Override the client-level default timeout for this request, in seconds
+        """
+        if not doc_id:
+            raise ValueError(f"Expected a non-empty value for `doc_id` but received {doc_id!r}")
+        extra_headers = {"Accept": "application/pdf", **(extra_headers or {})}
+        return await self._get(
+            f"/pdf/{doc_id}/",
+            options=make_request_options(
+                extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout
+            ),
+            cast_to=AsyncBinaryAPIResponse,
+        )
+
+
+class PdfResourceWithRawResponse:
+    def __init__(self, pdf: PdfResource) -> None:
+        self._pdf = pdf
+
+        self.retrieve = to_custom_raw_response_wrapper(
+            pdf.retrieve,
+            BinaryAPIResponse,
+        )
+
+
+class AsyncPdfResourceWithRawResponse:
+    def __init__(self, pdf: AsyncPdfResource) -> None:
+        self._pdf = pdf
+
+        self.retrieve = async_to_custom_raw_response_wrapper(
+            pdf.retrieve,
+            AsyncBinaryAPIResponse,
+        )
+
+
+class PdfResourceWithStreamingResponse:
+    def __init__(self, pdf: PdfResource) -> None:
+        self._pdf = pdf
+
+        self.retrieve = to_custom_streamed_response_wrapper(
+            pdf.retrieve,
+            StreamedBinaryAPIResponse,
+        )
+
+
+class AsyncPdfResourceWithStreamingResponse:
+    def __init__(self, pdf: AsyncPdfResource) -> None:
+        self._pdf = pdf
+
+        self.retrieve = async_to_custom_streamed_response_wrapper(
+            pdf.retrieve,
+            AsyncStreamedBinaryAPIResponse,
+        )
diff --git a/src/legalesign/resources/signer.py b/src/legalesign_sdk/resources/signer.py
similarity index 66%
rename from src/legalesign/resources/signer.py
rename to src/legalesign_sdk/resources/signer.py
index 19eb012..6690f48 100644
--- a/src/legalesign/resources/signer.py
+++ b/src/legalesign_sdk/resources/signer.py
@@ -4,7 +4,7 @@
 
 import httpx
 
-from ..types import signer_reset_params, signer_send_reminder_params
+from ..types import signer_send_reminder_params
 from .._types import Body, Omit, Query, Headers, NoneType, NotGiven, omit, not_given
 from .._utils import maybe_transform, async_maybe_transform
 from .._compat import cached_property
@@ -18,7 +18,6 @@
 from .._base_client import make_request_options
 from ..types.signer_retrieve_response import SignerRetrieveResponse
 from ..types.signer_retrieve_fields_response import SignerRetrieveFieldsResponse
-from ..types.signer_get_rejection_reason_response import SignerGetRejectionReasonResponse
 
 __all__ = ["SignerResource", "AsyncSignerResource"]
 
@@ -30,7 +29,7 @@ def with_raw_response(self) -> SignerResourceWithRawResponse:
         This property can be used as a prefix for any HTTP method call to return
         the raw response object instead of the parsed content.
 
-        For more information, see https://www.github.com/legalesign/legalesign-rest-python#accessing-raw-response-data-eg-headers
+        For more information, see https://www.github.com/stainless-sdks/legalesign-sdk-python#accessing-raw-response-data-eg-headers
         """
         return SignerResourceWithRawResponse(self)
 
@@ -39,7 +38,7 @@ def with_streaming_response(self) -> SignerResourceWithStreamingResponse:
         """
         An alternative to `.with_raw_response` that doesn't eagerly read the response body.
 
-        For more information, see https://www.github.com/legalesign/legalesign-rest-python#with_streaming_response
+        For more information, see https://www.github.com/stainless-sdks/legalesign-sdk-python#with_streaming_response
         """
         return SignerResourceWithStreamingResponse(self)
 
@@ -110,86 +109,6 @@ def get_access_link(
             cast_to=NoneType,
         )
 
-    def get_rejection_reason(
-        self,
-        signer_id: str,
-        *,
-        # Use the following arguments if you need to pass additional parameters to the API that aren't available via kwargs.
-        # The extra values given here take precedence over values defined on the client or passed to this method.
-        extra_headers: Headers | None = None,
-        extra_query: Query | None = None,
-        extra_body: Body | None = None,
-        timeout: float | httpx.Timeout | None | NotGiven = not_given,
-    ) -> SignerGetRejectionReasonResponse:
-        """
-        Returns reason signer gave for rejecting a document, if given
-
-        Args:
-          extra_headers: Send extra headers
-
-          extra_query: Add additional query parameters to the request
-
-          extra_body: Add additional JSON properties to the request
-
-          timeout: Override the client-level default timeout for this request, in seconds
-        """
-        if not signer_id:
-            raise ValueError(f"Expected a non-empty value for `signer_id` but received {signer_id!r}")
-        return self._get(
-            f"/signer/{signer_id}/rejection/",
-            options=make_request_options(
-                extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout
-            ),
-            cast_to=SignerGetRejectionReasonResponse,
-        )
-
-    def reset(
-        self,
-        signer_id: str,
-        *,
-        email: str,
-        notify: bool | Omit = omit,
-        # Use the following arguments if you need to pass additional parameters to the API that aren't available via kwargs.
-        # The extra values given here take precedence over values defined on the client or passed to this method.
-        extra_headers: Headers | None = None,
-        extra_query: Query | None = None,
-        extra_body: Body | None = None,
-        timeout: float | httpx.Timeout | None | NotGiven = not_given,
-    ) -> None:
-        """
-        Reset to an earlier signer if forwarded
-
-        Args:
-          email: Email of signer to revert to.
-
-          notify: Email notify current signer access is being withdrawn
-
-          extra_headers: Send extra headers
-
-          extra_query: Add additional query parameters to the request
-
-          extra_body: Add additional JSON properties to the request
-
-          timeout: Override the client-level default timeout for this request, in seconds
-        """
-        if not signer_id:
-            raise ValueError(f"Expected a non-empty value for `signer_id` but received {signer_id!r}")
-        extra_headers = {"Accept": "*/*", **(extra_headers or {})}
-        return self._post(
-            f"/signer/{signer_id}/reset/",
-            body=maybe_transform(
-                {
-                    "email": email,
-                    "notify": notify,
-                },
-                signer_reset_params.SignerResetParams,
-            ),
-            options=make_request_options(
-                extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout
-            ),
-            cast_to=NoneType,
-        )
-
     def retrieve_fields(
         self,
         signer_id: str,
@@ -269,7 +188,7 @@ def with_raw_response(self) -> AsyncSignerResourceWithRawResponse:
         This property can be used as a prefix for any HTTP method call to return
         the raw response object instead of the parsed content.
 
-        For more information, see https://www.github.com/legalesign/legalesign-rest-python#accessing-raw-response-data-eg-headers
+        For more information, see https://www.github.com/stainless-sdks/legalesign-sdk-python#accessing-raw-response-data-eg-headers
         """
         return AsyncSignerResourceWithRawResponse(self)
 
@@ -278,7 +197,7 @@ def with_streaming_response(self) -> AsyncSignerResourceWithStreamingResponse:
         """
         An alternative to `.with_raw_response` that doesn't eagerly read the response body.
 
-        For more information, see https://www.github.com/legalesign/legalesign-rest-python#with_streaming_response
+        For more information, see https://www.github.com/stainless-sdks/legalesign-sdk-python#with_streaming_response
         """
         return AsyncSignerResourceWithStreamingResponse(self)
 
@@ -349,86 +268,6 @@ async def get_access_link(
             cast_to=NoneType,
         )
 
-    async def get_rejection_reason(
-        self,
-        signer_id: str,
-        *,
-        # Use the following arguments if you need to pass additional parameters to the API that aren't available via kwargs.
-        # The extra values given here take precedence over values defined on the client or passed to this method.
-        extra_headers: Headers | None = None,
-        extra_query: Query | None = None,
-        extra_body: Body | None = None,
-        timeout: float | httpx.Timeout | None | NotGiven = not_given,
-    ) -> SignerGetRejectionReasonResponse:
-        """
-        Returns reason signer gave for rejecting a document, if given
-
-        Args:
-          extra_headers: Send extra headers
-
-          extra_query: Add additional query parameters to the request
-
-          extra_body: Add additional JSON properties to the request
-
-          timeout: Override the client-level default timeout for this request, in seconds
-        """
-        if not signer_id:
-            raise ValueError(f"Expected a non-empty value for `signer_id` but received {signer_id!r}")
-        return await self._get(
-            f"/signer/{signer_id}/rejection/",
-            options=make_request_options(
-                extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout
-            ),
-            cast_to=SignerGetRejectionReasonResponse,
-        )
-
-    async def reset(
-        self,
-        signer_id: str,
-        *,
-        email: str,
-        notify: bool | Omit = omit,
-        # Use the following arguments if you need to pass additional parameters to the API that aren't available via kwargs.
-        # The extra values given here take precedence over values defined on the client or passed to this method.
-        extra_headers: Headers | None = None,
-        extra_query: Query | None = None,
-        extra_body: Body | None = None,
-        timeout: float | httpx.Timeout | None | NotGiven = not_given,
-    ) -> None:
-        """
-        Reset to an earlier signer if forwarded
-
-        Args:
-          email: Email of signer to revert to.
-
-          notify: Email notify current signer access is being withdrawn
-
-          extra_headers: Send extra headers
-
-          extra_query: Add additional query parameters to the request
-
-          extra_body: Add additional JSON properties to the request
-
-          timeout: Override the client-level default timeout for this request, in seconds
-        """
-        if not signer_id:
-            raise ValueError(f"Expected a non-empty value for `signer_id` but received {signer_id!r}")
-        extra_headers = {"Accept": "*/*", **(extra_headers or {})}
-        return await self._post(
-            f"/signer/{signer_id}/reset/",
-            body=await async_maybe_transform(
-                {
-                    "email": email,
-                    "notify": notify,
-                },
-                signer_reset_params.SignerResetParams,
-            ),
-            options=make_request_options(
-                extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout
-            ),
-            cast_to=NoneType,
-        )
-
     async def retrieve_fields(
         self,
         signer_id: str,
@@ -511,12 +350,6 @@ def __init__(self, signer: SignerResource) -> None:
         self.get_access_link = to_raw_response_wrapper(
             signer.get_access_link,
         )
-        self.get_rejection_reason = to_raw_response_wrapper(
-            signer.get_rejection_reason,
-        )
-        self.reset = to_raw_response_wrapper(
-            signer.reset,
-        )
         self.retrieve_fields = to_raw_response_wrapper(
             signer.retrieve_fields,
         )
@@ -535,12 +368,6 @@ def __init__(self, signer: AsyncSignerResource) -> None:
         self.get_access_link = async_to_raw_response_wrapper(
             signer.get_access_link,
         )
-        self.get_rejection_reason = async_to_raw_response_wrapper(
-            signer.get_rejection_reason,
-        )
-        self.reset = async_to_raw_response_wrapper(
-            signer.reset,
-        )
         self.retrieve_fields = async_to_raw_response_wrapper(
             signer.retrieve_fields,
         )
@@ -559,12 +386,6 @@ def __init__(self, signer: SignerResource) -> None:
         self.get_access_link = to_streamed_response_wrapper(
             signer.get_access_link,
         )
-        self.get_rejection_reason = to_streamed_response_wrapper(
-            signer.get_rejection_reason,
-        )
-        self.reset = to_streamed_response_wrapper(
-            signer.reset,
-        )
         self.retrieve_fields = to_streamed_response_wrapper(
             signer.retrieve_fields,
         )
@@ -583,12 +404,6 @@ def __init__(self, signer: AsyncSignerResource) -> None:
         self.get_access_link = async_to_streamed_response_wrapper(
             signer.get_access_link,
         )
-        self.get_rejection_reason = async_to_streamed_response_wrapper(
-            signer.get_rejection_reason,
-        )
-        self.reset = async_to_streamed_response_wrapper(
-            signer.reset,
-        )
         self.retrieve_fields = async_to_streamed_response_wrapper(
             signer.retrieve_fields,
         )
diff --git a/src/legalesign_sdk/resources/status.py b/src/legalesign_sdk/resources/status.py
new file mode 100644
index 0000000..e64011c
--- /dev/null
+++ b/src/legalesign_sdk/resources/status.py
@@ -0,0 +1,163 @@
+# File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.
+
+from __future__ import annotations
+
+import httpx
+
+from .._types import Body, Query, Headers, NotGiven, not_given
+from .._compat import cached_property
+from .._resource import SyncAPIResource, AsyncAPIResource
+from .._response import (
+    to_raw_response_wrapper,
+    to_streamed_response_wrapper,
+    async_to_raw_response_wrapper,
+    async_to_streamed_response_wrapper,
+)
+from .._base_client import make_request_options
+from ..types.status_retrieve_response import StatusRetrieveResponse
+
+__all__ = ["StatusResource", "AsyncStatusResource"]
+
+
+class StatusResource(SyncAPIResource):
+    @cached_property
+    def with_raw_response(self) -> StatusResourceWithRawResponse:
+        """
+        This property can be used as a prefix for any HTTP method call to return
+        the raw response object instead of the parsed content.
+
+        For more information, see https://www.github.com/stainless-sdks/legalesign-sdk-python#accessing-raw-response-data-eg-headers
+        """
+        return StatusResourceWithRawResponse(self)
+
+    @cached_property
+    def with_streaming_response(self) -> StatusResourceWithStreamingResponse:
+        """
+        An alternative to `.with_raw_response` that doesn't eagerly read the response body.
+
+        For more information, see https://www.github.com/stainless-sdks/legalesign-sdk-python#with_streaming_response
+        """
+        return StatusResourceWithStreamingResponse(self)
+
+    def retrieve(
+        self,
+        doc_id: str,
+        *,
+        # Use the following arguments if you need to pass additional parameters to the API that aren't available via kwargs.
+        # The extra values given here take precedence over values defined on the client or passed to this method.
+        extra_headers: Headers | None = None,
+        extra_query: Query | None = None,
+        extra_body: Body | None = None,
+        timeout: float | httpx.Timeout | None | NotGiven = not_given,
+    ) -> StatusRetrieveResponse:
+        """
+        Faster short query for a document status
+
+        Args:
+          extra_headers: Send extra headers
+
+          extra_query: Add additional query parameters to the request
+
+          extra_body: Add additional JSON properties to the request
+
+          timeout: Override the client-level default timeout for this request, in seconds
+        """
+        if not doc_id:
+            raise ValueError(f"Expected a non-empty value for `doc_id` but received {doc_id!r}")
+        return self._get(
+            f"/status/{doc_id}/",
+            options=make_request_options(
+                extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout
+            ),
+            cast_to=StatusRetrieveResponse,
+        )
+
+
+class AsyncStatusResource(AsyncAPIResource):
+    @cached_property
+    def with_raw_response(self) -> AsyncStatusResourceWithRawResponse:
+        """
+        This property can be used as a prefix for any HTTP method call to return
+        the raw response object instead of the parsed content.
+
+        For more information, see https://www.github.com/stainless-sdks/legalesign-sdk-python#accessing-raw-response-data-eg-headers
+        """
+        return AsyncStatusResourceWithRawResponse(self)
+
+    @cached_property
+    def with_streaming_response(self) -> AsyncStatusResourceWithStreamingResponse:
+        """
+        An alternative to `.with_raw_response` that doesn't eagerly read the response body.
+
+        For more information, see https://www.github.com/stainless-sdks/legalesign-sdk-python#with_streaming_response
+        """
+        return AsyncStatusResourceWithStreamingResponse(self)
+
+    async def retrieve(
+        self,
+        doc_id: str,
+        *,
+        # Use the following arguments if you need to pass additional parameters to the API that aren't available via kwargs.
+        # The extra values given here take precedence over values defined on the client or passed to this method.
+        extra_headers: Headers | None = None,
+        extra_query: Query | None = None,
+        extra_body: Body | None = None,
+        timeout: float | httpx.Timeout | None | NotGiven = not_given,
+    ) -> StatusRetrieveResponse:
+        """
+        Faster short query for a document status
+
+        Args:
+          extra_headers: Send extra headers
+
+          extra_query: Add additional query parameters to the request
+
+          extra_body: Add additional JSON properties to the request
+
+          timeout: Override the client-level default timeout for this request, in seconds
+        """
+        if not doc_id:
+            raise ValueError(f"Expected a non-empty value for `doc_id` but received {doc_id!r}")
+        return await self._get(
+            f"/status/{doc_id}/",
+            options=make_request_options(
+                extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout
+            ),
+            cast_to=StatusRetrieveResponse,
+        )
+
+
+class StatusResourceWithRawResponse:
+    def __init__(self, status: StatusResource) -> None:
+        self._status = status
+
+        self.retrieve = to_raw_response_wrapper(
+            status.retrieve,
+        )
+
+
+class AsyncStatusResourceWithRawResponse:
+    def __init__(self, status: AsyncStatusResource) -> None:
+        self._status = status
+
+        self.retrieve = async_to_raw_response_wrapper(
+            status.retrieve,
+        )
+
+
+class StatusResourceWithStreamingResponse:
+    def __init__(self, status: StatusResource) -> None:
+        self._status = status
+
+        self.retrieve = to_streamed_response_wrapper(
+            status.retrieve,
+        )
+
+
+class AsyncStatusResourceWithStreamingResponse:
+    def __init__(self, status: AsyncStatusResource) -> None:
+        self._status = status
+
+        self.retrieve = async_to_streamed_response_wrapper(
+            status.retrieve,
+        )
diff --git a/src/legalesign/resources/template.py b/src/legalesign_sdk/resources/template.py
similarity index 82%
rename from src/legalesign/resources/template.py
rename to src/legalesign_sdk/resources/template.py
index 05452b9..7276095 100644
--- a/src/legalesign/resources/template.py
+++ b/src/legalesign_sdk/resources/template.py
@@ -29,7 +29,7 @@ def with_raw_response(self) -> TemplateResourceWithRawResponse:
         This property can be used as a prefix for any HTTP method call to return
         the raw response object instead of the parsed content.
 
-        For more information, see https://www.github.com/legalesign/legalesign-rest-python#accessing-raw-response-data-eg-headers
+        For more information, see https://www.github.com/stainless-sdks/legalesign-sdk-python#accessing-raw-response-data-eg-headers
         """
         return TemplateResourceWithRawResponse(self)
 
@@ -38,7 +38,7 @@ def with_streaming_response(self) -> TemplateResourceWithStreamingResponse:
         """
         An alternative to `.with_raw_response` that doesn't eagerly read the response body.
 
-        For more information, see https://www.github.com/legalesign/legalesign-rest-python#with_streaming_response
+        For more information, see https://www.github.com/stainless-sdks/legalesign-sdk-python#with_streaming_response
         """
         return TemplateResourceWithStreamingResponse(self)
 
@@ -217,42 +217,6 @@ def list(
             cast_to=TemplateListResponse,
         )
 
-    def archive(
-        self,
-        template_id: str,
-        *,
-        # Use the following arguments if you need to pass additional parameters to the API that aren't available via kwargs.
-        # The extra values given here take precedence over values defined on the client or passed to this method.
-        extra_headers: Headers | None = None,
-        extra_query: Query | None = None,
-        extra_body: Body | None = None,
-        timeout: float | httpx.Timeout | None | NotGiven = not_given,
-    ) -> None:
-        """Archives a template (is recoverable, i.e.
-
-        not fully deleted, if you need true
-        data deletion contact us).
-
-        Args:
-          extra_headers: Send extra headers
-
-          extra_query: Add additional query parameters to the request
-
-          extra_body: Add additional JSON properties to the request
-
-          timeout: Override the client-level default timeout for this request, in seconds
-        """
-        if not template_id:
-            raise ValueError(f"Expected a non-empty value for `template_id` but received {template_id!r}")
-        extra_headers = {"Accept": "*/*", **(extra_headers or {})}
-        return self._delete(
-            f"/template/{template_id}/",
-            options=make_request_options(
-                extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout
-            ),
-            cast_to=NoneType,
-        )
-
 
 class AsyncTemplateResource(AsyncAPIResource):
     @cached_property
@@ -261,7 +225,7 @@ def with_raw_response(self) -> AsyncTemplateResourceWithRawResponse:
         This property can be used as a prefix for any HTTP method call to return
         the raw response object instead of the parsed content.
 
-        For more information, see https://www.github.com/legalesign/legalesign-rest-python#accessing-raw-response-data-eg-headers
+        For more information, see https://www.github.com/stainless-sdks/legalesign-sdk-python#accessing-raw-response-data-eg-headers
         """
         return AsyncTemplateResourceWithRawResponse(self)
 
@@ -270,7 +234,7 @@ def with_streaming_response(self) -> AsyncTemplateResourceWithStreamingResponse:
         """
         An alternative to `.with_raw_response` that doesn't eagerly read the response body.
 
-        For more information, see https://www.github.com/legalesign/legalesign-rest-python#with_streaming_response
+        For more information, see https://www.github.com/stainless-sdks/legalesign-sdk-python#with_streaming_response
         """
         return AsyncTemplateResourceWithStreamingResponse(self)
 
@@ -449,42 +413,6 @@ async def list(
             cast_to=TemplateListResponse,
         )
 
-    async def archive(
-        self,
-        template_id: str,
-        *,
-        # Use the following arguments if you need to pass additional parameters to the API that aren't available via kwargs.
-        # The extra values given here take precedence over values defined on the client or passed to this method.
-        extra_headers: Headers | None = None,
-        extra_query: Query | None = None,
-        extra_body: Body | None = None,
-        timeout: float | httpx.Timeout | None | NotGiven = not_given,
-    ) -> None:
-        """Archives a template (is recoverable, i.e.
-
-        not fully deleted, if you need true
-        data deletion contact us).
-
-        Args:
-          extra_headers: Send extra headers
-
-          extra_query: Add additional query parameters to the request
-
-          extra_body: Add additional JSON properties to the request
-
-          timeout: Override the client-level default timeout for this request, in seconds
-        """
-        if not template_id:
-            raise ValueError(f"Expected a non-empty value for `template_id` but received {template_id!r}")
-        extra_headers = {"Accept": "*/*", **(extra_headers or {})}
-        return await self._delete(
-            f"/template/{template_id}/",
-            options=make_request_options(
-                extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout
-            ),
-            cast_to=NoneType,
-        )
-
 
 class TemplateResourceWithRawResponse:
     def __init__(self, template: TemplateResource) -> None:
@@ -502,9 +430,6 @@ def __init__(self, template: TemplateResource) -> None:
         self.list = to_raw_response_wrapper(
             template.list,
         )
-        self.archive = to_raw_response_wrapper(
-            template.archive,
-        )
 
 
 class AsyncTemplateResourceWithRawResponse:
@@ -523,9 +448,6 @@ def __init__(self, template: AsyncTemplateResource) -> None:
         self.list = async_to_raw_response_wrapper(
             template.list,
         )
-        self.archive = async_to_raw_response_wrapper(
-            template.archive,
-        )
 
 
 class TemplateResourceWithStreamingResponse:
@@ -544,9 +466,6 @@ def __init__(self, template: TemplateResource) -> None:
         self.list = to_streamed_response_wrapper(
             template.list,
         )
-        self.archive = to_streamed_response_wrapper(
-            template.archive,
-        )
 
 
 class AsyncTemplateResourceWithStreamingResponse:
@@ -565,6 +484,3 @@ def __init__(self, template: AsyncTemplateResource) -> None:
         self.list = async_to_streamed_response_wrapper(
             template.list,
         )
-        self.archive = async_to_streamed_response_wrapper(
-            template.archive,
-        )
diff --git a/src/legalesign/resources/templatepdf/__init__.py b/src/legalesign_sdk/resources/templatepdf/__init__.py
similarity index 100%
rename from src/legalesign/resources/templatepdf/__init__.py
rename to src/legalesign_sdk/resources/templatepdf/__init__.py
diff --git a/src/legalesign/resources/templatepdf/fields.py b/src/legalesign_sdk/resources/templatepdf/fields.py
similarity index 94%
rename from src/legalesign/resources/templatepdf/fields.py
rename to src/legalesign_sdk/resources/templatepdf/fields.py
index b7e1225..0ddc100 100644
--- a/src/legalesign/resources/templatepdf/fields.py
+++ b/src/legalesign_sdk/resources/templatepdf/fields.py
@@ -30,7 +30,7 @@ def with_raw_response(self) -> FieldsResourceWithRawResponse:
         This property can be used as a prefix for any HTTP method call to return
         the raw response object instead of the parsed content.
 
-        For more information, see https://www.github.com/legalesign/legalesign-rest-python#accessing-raw-response-data-eg-headers
+        For more information, see https://www.github.com/stainless-sdks/legalesign-sdk-python#accessing-raw-response-data-eg-headers
         """
         return FieldsResourceWithRawResponse(self)
 
@@ -39,7 +39,7 @@ def with_streaming_response(self) -> FieldsResourceWithStreamingResponse:
         """
         An alternative to `.with_raw_response` that doesn't eagerly read the response body.
 
-        For more information, see https://www.github.com/legalesign/legalesign-rest-python#with_streaming_response
+        For more information, see https://www.github.com/stainless-sdks/legalesign-sdk-python#with_streaming_response
         """
         return FieldsResourceWithStreamingResponse(self)
 
@@ -120,7 +120,7 @@ def with_raw_response(self) -> AsyncFieldsResourceWithRawResponse:
         This property can be used as a prefix for any HTTP method call to return
         the raw response object instead of the parsed content.
 
-        For more information, see https://www.github.com/legalesign/legalesign-rest-python#accessing-raw-response-data-eg-headers
+        For more information, see https://www.github.com/stainless-sdks/legalesign-sdk-python#accessing-raw-response-data-eg-headers
         """
         return AsyncFieldsResourceWithRawResponse(self)
 
@@ -129,7 +129,7 @@ def with_streaming_response(self) -> AsyncFieldsResourceWithStreamingResponse:
         """
         An alternative to `.with_raw_response` that doesn't eagerly read the response body.
 
-        For more information, see https://www.github.com/legalesign/legalesign-rest-python#with_streaming_response
+        For more information, see https://www.github.com/stainless-sdks/legalesign-sdk-python#with_streaming_response
         """
         return AsyncFieldsResourceWithStreamingResponse(self)
 
diff --git a/src/legalesign/resources/templatepdf/templatepdf.py b/src/legalesign_sdk/resources/templatepdf/templatepdf.py
similarity index 73%
rename from src/legalesign/resources/templatepdf/templatepdf.py
rename to src/legalesign_sdk/resources/templatepdf/templatepdf.py
index bb7c615..ef13615 100644
--- a/src/legalesign/resources/templatepdf/templatepdf.py
+++ b/src/legalesign_sdk/resources/templatepdf/templatepdf.py
@@ -43,7 +43,7 @@ def with_raw_response(self) -> TemplatepdfResourceWithRawResponse:
         This property can be used as a prefix for any HTTP method call to return
         the raw response object instead of the parsed content.
 
-        For more information, see https://www.github.com/legalesign/legalesign-rest-python#accessing-raw-response-data-eg-headers
+        For more information, see https://www.github.com/stainless-sdks/legalesign-sdk-python#accessing-raw-response-data-eg-headers
         """
         return TemplatepdfResourceWithRawResponse(self)
 
@@ -52,7 +52,7 @@ def with_streaming_response(self) -> TemplatepdfResourceWithStreamingResponse:
         """
         An alternative to `.with_raw_response` that doesn't eagerly read the response body.
 
-        For more information, see https://www.github.com/legalesign/legalesign-rest-python#with_streaming_response
+        For more information, see https://www.github.com/stainless-sdks/legalesign-sdk-python#with_streaming_response
         """
         return TemplatepdfResourceWithStreamingResponse(self)
 
@@ -196,74 +196,6 @@ def list(
             cast_to=TemplatepdfListResponse,
         )
 
-    def archive(
-        self,
-        pdf_id: str,
-        *,
-        # Use the following arguments if you need to pass additional parameters to the API that aren't available via kwargs.
-        # The extra values given here take precedence over values defined on the client or passed to this method.
-        extra_headers: Headers | None = None,
-        extra_query: Query | None = None,
-        extra_body: Body | None = None,
-        timeout: float | httpx.Timeout | None | NotGiven = not_given,
-    ) -> None:
-        """
-        Delists the PDF
-
-        Args:
-          extra_headers: Send extra headers
-
-          extra_query: Add additional query parameters to the request
-
-          extra_body: Add additional JSON properties to the request
-
-          timeout: Override the client-level default timeout for this request, in seconds
-        """
-        if not pdf_id:
-            raise ValueError(f"Expected a non-empty value for `pdf_id` but received {pdf_id!r}")
-        extra_headers = {"Accept": "*/*", **(extra_headers or {})}
-        return self._post(
-            f"/templatepdf/{pdf_id}/archive/",
-            options=make_request_options(
-                extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout
-            ),
-            cast_to=NoneType,
-        )
-
-    def convert_tags(
-        self,
-        pdf_id: str,
-        *,
-        # Use the following arguments if you need to pass additional parameters to the API that aren't available via kwargs.
-        # The extra values given here take precedence over values defined on the client or passed to this method.
-        extra_headers: Headers | None = None,
-        extra_query: Query | None = None,
-        extra_body: Body | None = None,
-        timeout: float | httpx.Timeout | None | NotGiven = not_given,
-    ) -> None:
-        """
-        Convert any text tags in the PDF into fields
-
-        Args:
-          extra_headers: Send extra headers
-
-          extra_query: Add additional query parameters to the request
-
-          extra_body: Add additional JSON properties to the request
-
-          timeout: Override the client-level default timeout for this request, in seconds
-        """
-        if not pdf_id:
-            raise ValueError(f"Expected a non-empty value for `pdf_id` but received {pdf_id!r}")
-        extra_headers = {"Accept": "*/*", **(extra_headers or {})}
-        return self._post(
-            f"/templatepdf/{pdf_id}/tags/",
-            options=make_request_options(
-                extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout
-            ),
-            cast_to=NoneType,
-        )
-
     def get_edit_link(
         self,
         pdf_id: str,
@@ -309,7 +241,7 @@ def with_raw_response(self) -> AsyncTemplatepdfResourceWithRawResponse:
         This property can be used as a prefix for any HTTP method call to return
         the raw response object instead of the parsed content.
 
-        For more information, see https://www.github.com/legalesign/legalesign-rest-python#accessing-raw-response-data-eg-headers
+        For more information, see https://www.github.com/stainless-sdks/legalesign-sdk-python#accessing-raw-response-data-eg-headers
         """
         return AsyncTemplatepdfResourceWithRawResponse(self)
 
@@ -318,7 +250,7 @@ def with_streaming_response(self) -> AsyncTemplatepdfResourceWithStreamingRespon
         """
         An alternative to `.with_raw_response` that doesn't eagerly read the response body.
 
-        For more information, see https://www.github.com/legalesign/legalesign-rest-python#with_streaming_response
+        For more information, see https://www.github.com/stainless-sdks/legalesign-sdk-python#with_streaming_response
         """
         return AsyncTemplatepdfResourceWithStreamingResponse(self)
 
@@ -462,74 +394,6 @@ async def list(
             cast_to=TemplatepdfListResponse,
         )
 
-    async def archive(
-        self,
-        pdf_id: str,
-        *,
-        # Use the following arguments if you need to pass additional parameters to the API that aren't available via kwargs.
-        # The extra values given here take precedence over values defined on the client or passed to this method.
-        extra_headers: Headers | None = None,
-        extra_query: Query | None = None,
-        extra_body: Body | None = None,
-        timeout: float | httpx.Timeout | None | NotGiven = not_given,
-    ) -> None:
-        """
-        Delists the PDF
-
-        Args:
-          extra_headers: Send extra headers
-
-          extra_query: Add additional query parameters to the request
-
-          extra_body: Add additional JSON properties to the request
-
-          timeout: Override the client-level default timeout for this request, in seconds
-        """
-        if not pdf_id:
-            raise ValueError(f"Expected a non-empty value for `pdf_id` but received {pdf_id!r}")
-        extra_headers = {"Accept": "*/*", **(extra_headers or {})}
-        return await self._post(
-            f"/templatepdf/{pdf_id}/archive/",
-            options=make_request_options(
-                extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout
-            ),
-            cast_to=NoneType,
-        )
-
-    async def convert_tags(
-        self,
-        pdf_id: str,
-        *,
-        # Use the following arguments if you need to pass additional parameters to the API that aren't available via kwargs.
-        # The extra values given here take precedence over values defined on the client or passed to this method.
-        extra_headers: Headers | None = None,
-        extra_query: Query | None = None,
-        extra_body: Body | None = None,
-        timeout: float | httpx.Timeout | None | NotGiven = not_given,
-    ) -> None:
-        """
-        Convert any text tags in the PDF into fields
-
-        Args:
-          extra_headers: Send extra headers
-
-          extra_query: Add additional query parameters to the request
-
-          extra_body: Add additional JSON properties to the request
-
-          timeout: Override the client-level default timeout for this request, in seconds
-        """
-        if not pdf_id:
-            raise ValueError(f"Expected a non-empty value for `pdf_id` but received {pdf_id!r}")
-        extra_headers = {"Accept": "*/*", **(extra_headers or {})}
-        return await self._post(
-            f"/templatepdf/{pdf_id}/tags/",
-            options=make_request_options(
-                extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout
-            ),
-            cast_to=NoneType,
-        )
-
     async def get_edit_link(
         self,
         pdf_id: str,
@@ -577,12 +441,6 @@ def __init__(self, templatepdf: TemplatepdfResource) -> None:
         self.list = to_raw_response_wrapper(
             templatepdf.list,
         )
-        self.archive = to_raw_response_wrapper(
-            templatepdf.archive,
-        )
-        self.convert_tags = to_raw_response_wrapper(
-            templatepdf.convert_tags,
-        )
         self.get_edit_link = to_raw_response_wrapper(
             templatepdf.get_edit_link,
         )
@@ -605,12 +463,6 @@ def __init__(self, templatepdf: AsyncTemplatepdfResource) -> None:
         self.list = async_to_raw_response_wrapper(
             templatepdf.list,
         )
-        self.archive = async_to_raw_response_wrapper(
-            templatepdf.archive,
-        )
-        self.convert_tags = async_to_raw_response_wrapper(
-            templatepdf.convert_tags,
-        )
         self.get_edit_link = async_to_raw_response_wrapper(
             templatepdf.get_edit_link,
         )
@@ -633,12 +485,6 @@ def __init__(self, templatepdf: TemplatepdfResource) -> None:
         self.list = to_streamed_response_wrapper(
             templatepdf.list,
         )
-        self.archive = to_streamed_response_wrapper(
-            templatepdf.archive,
-        )
-        self.convert_tags = to_streamed_response_wrapper(
-            templatepdf.convert_tags,
-        )
         self.get_edit_link = to_streamed_response_wrapper(
             templatepdf.get_edit_link,
         )
@@ -661,12 +507,6 @@ def __init__(self, templatepdf: AsyncTemplatepdfResource) -> None:
         self.list = async_to_streamed_response_wrapper(
             templatepdf.list,
         )
-        self.archive = async_to_streamed_response_wrapper(
-            templatepdf.archive,
-        )
-        self.convert_tags = async_to_streamed_response_wrapper(
-            templatepdf.convert_tags,
-        )
         self.get_edit_link = async_to_streamed_response_wrapper(
             templatepdf.get_edit_link,
         )
diff --git a/src/legalesign/types/__init__.py b/src/legalesign_sdk/types/__init__.py
similarity index 51%
rename from src/legalesign/types/__init__.py
rename to src/legalesign_sdk/types/__init__.py
index c54a629..cfd5366 100644
--- a/src/legalesign/types/__init__.py
+++ b/src/legalesign_sdk/types/__init__.py
@@ -4,55 +4,29 @@
 
 from .list_meta import ListMeta as ListMeta
 from .template_pdf import TemplatePdf as TemplatePdf
-from .timezone_enum import TimezoneEnum as TimezoneEnum
-from .member_response import MemberResponse as MemberResponse
-from .status_response import StatusResponse as StatusResponse
-from .permissions_enum import PermissionsEnum as PermissionsEnum
 from .group_list_params import GroupListParams as GroupListParams
-from .member_list_params import MemberListParams as MemberListParams
 from .signer_status_enum import SignerStatusEnum as SignerStatusEnum
-from .user_create_params import UserCreateParams as UserCreateParams
-from .user_update_params import UserUpdateParams as UserUpdateParams
-from .attachment_response import AttachmentResponse as AttachmentResponse
 from .group_create_params import GroupCreateParams as GroupCreateParams
 from .group_list_response import GroupListResponse as GroupListResponse
-from .group_update_params import GroupUpdateParams as GroupUpdateParams
-from .invited_list_params import InvitedListParams as InvitedListParams
-from .signer_reset_params import SignerResetParams as SignerResetParams
 from .document_list_params import DocumentListParams as DocumentListParams
 from .document_status_enum import DocumentStatusEnum as DocumentStatusEnum
-from .member_create_params import MemberCreateParams as MemberCreateParams
-from .member_list_response import MemberListResponse as MemberListResponse
 from .template_list_params import TemplateListParams as TemplateListParams
-from .invited_list_response import InvitedListResponse as InvitedListResponse
-from .attachment_list_params import AttachmentListParams as AttachmentListParams
 from .document_create_params import DocumentCreateParams as DocumentCreateParams
 from .document_list_response import DocumentListResponse as DocumentListResponse
 from .template_create_params import TemplateCreateParams as TemplateCreateParams
 from .template_list_response import TemplateListResponse as TemplateListResponse
 from .template_update_params import TemplateUpdateParams as TemplateUpdateParams
-from .user_retrieve_response import UserRetrieveResponse as UserRetrieveResponse
-from .document_preview_params import DocumentPreviewParams as DocumentPreviewParams
 from .group_retrieve_response import GroupRetrieveResponse as GroupRetrieveResponse
 from .templatepdf_list_params import TemplatepdfListParams as TemplatepdfListParams
-from .attachment_list_response import AttachmentListResponse as AttachmentListResponse
-from .attachment_upload_params import AttachmentUploadParams as AttachmentUploadParams
 from .document_create_response import DocumentCreateResponse as DocumentCreateResponse
 from .signer_retrieve_response import SignerRetrieveResponse as SignerRetrieveResponse
-from .pdf_create_preview_params import PdfCreatePreviewParams as PdfCreatePreviewParams
+from .status_retrieve_response import StatusRetrieveResponse as StatusRetrieveResponse
 from .pdf_field_validation_enum import PdfFieldValidationEnum as PdfFieldValidationEnum
 from .templatepdf_create_params import TemplatepdfCreateParams as TemplatepdfCreateParams
 from .templatepdf_list_response import TemplatepdfListResponse as TemplatepdfListResponse
-from .webhook_event_filter_enum import WebhookEventFilterEnum as WebhookEventFilterEnum
 from .document_retrieve_response import DocumentRetrieveResponse as DocumentRetrieveResponse
-from .notification_list_response import NotificationListResponse as NotificationListResponse
-from .status_retrieve_all_params import StatusRetrieveAllParams as StatusRetrieveAllParams
 from .template_retrieve_response import TemplateRetrieveResponse as TemplateRetrieveResponse
 from .signer_send_reminder_params import SignerSendReminderParams as SignerSendReminderParams
 from .document_get_fields_response import DocumentGetFieldsResponse as DocumentGetFieldsResponse
-from .status_retrieve_all_response import StatusRetrieveAllResponse as StatusRetrieveAllResponse
 from .signer_retrieve_fields_response import SignerRetrieveFieldsResponse as SignerRetrieveFieldsResponse
-from .subscribe_create_webhook_params import SubscribeCreateWebhookParams as SubscribeCreateWebhookParams
-from .unsubscribe_delete_webhook_params import UnsubscribeDeleteWebhookParams as UnsubscribeDeleteWebhookParams
 from .templatepdf_get_edit_link_response import TemplatepdfGetEditLinkResponse as TemplatepdfGetEditLinkResponse
-from .signer_get_rejection_reason_response import SignerGetRejectionReasonResponse as SignerGetRejectionReasonResponse
diff --git a/src/legalesign/types/document_create_params.py b/src/legalesign_sdk/types/document_create_params.py
similarity index 100%
rename from src/legalesign/types/document_create_params.py
rename to src/legalesign_sdk/types/document_create_params.py
diff --git a/src/legalesign/types/document_create_response.py b/src/legalesign_sdk/types/document_create_response.py
similarity index 100%
rename from src/legalesign/types/document_create_response.py
rename to src/legalesign_sdk/types/document_create_response.py
diff --git a/src/legalesign/types/document_get_fields_response.py b/src/legalesign_sdk/types/document_get_fields_response.py
similarity index 100%
rename from src/legalesign/types/document_get_fields_response.py
rename to src/legalesign_sdk/types/document_get_fields_response.py
diff --git a/src/legalesign/types/document_list_params.py b/src/legalesign_sdk/types/document_list_params.py
similarity index 100%
rename from src/legalesign/types/document_list_params.py
rename to src/legalesign_sdk/types/document_list_params.py
diff --git a/src/legalesign/types/document_list_response.py b/src/legalesign_sdk/types/document_list_response.py
similarity index 100%
rename from src/legalesign/types/document_list_response.py
rename to src/legalesign_sdk/types/document_list_response.py
diff --git a/src/legalesign/types/document_retrieve_response.py b/src/legalesign_sdk/types/document_retrieve_response.py
similarity index 100%
rename from src/legalesign/types/document_retrieve_response.py
rename to src/legalesign_sdk/types/document_retrieve_response.py
diff --git a/src/legalesign/types/document_status_enum.py b/src/legalesign_sdk/types/document_status_enum.py
similarity index 100%
rename from src/legalesign/types/document_status_enum.py
rename to src/legalesign_sdk/types/document_status_enum.py
diff --git a/src/legalesign/types/group_create_params.py b/src/legalesign_sdk/types/group_create_params.py
similarity index 100%
rename from src/legalesign/types/group_create_params.py
rename to src/legalesign_sdk/types/group_create_params.py
diff --git a/src/legalesign/types/group_list_params.py b/src/legalesign_sdk/types/group_list_params.py
similarity index 100%
rename from src/legalesign/types/group_list_params.py
rename to src/legalesign_sdk/types/group_list_params.py
diff --git a/src/legalesign/types/group_list_response.py b/src/legalesign_sdk/types/group_list_response.py
similarity index 100%
rename from src/legalesign/types/group_list_response.py
rename to src/legalesign_sdk/types/group_list_response.py
diff --git a/src/legalesign/types/group_retrieve_response.py b/src/legalesign_sdk/types/group_retrieve_response.py
similarity index 100%
rename from src/legalesign/types/group_retrieve_response.py
rename to src/legalesign_sdk/types/group_retrieve_response.py
diff --git a/src/legalesign/types/list_meta.py b/src/legalesign_sdk/types/list_meta.py
similarity index 100%
rename from src/legalesign/types/list_meta.py
rename to src/legalesign_sdk/types/list_meta.py
diff --git a/src/legalesign/types/pdf_field_validation_enum.py b/src/legalesign_sdk/types/pdf_field_validation_enum.py
similarity index 100%
rename from src/legalesign/types/pdf_field_validation_enum.py
rename to src/legalesign_sdk/types/pdf_field_validation_enum.py
diff --git a/src/legalesign/types/signer_retrieve_fields_response.py b/src/legalesign_sdk/types/signer_retrieve_fields_response.py
similarity index 100%
rename from src/legalesign/types/signer_retrieve_fields_response.py
rename to src/legalesign_sdk/types/signer_retrieve_fields_response.py
diff --git a/src/legalesign/types/signer_retrieve_response.py b/src/legalesign_sdk/types/signer_retrieve_response.py
similarity index 100%
rename from src/legalesign/types/signer_retrieve_response.py
rename to src/legalesign_sdk/types/signer_retrieve_response.py
diff --git a/src/legalesign/types/signer_send_reminder_params.py b/src/legalesign_sdk/types/signer_send_reminder_params.py
similarity index 100%
rename from src/legalesign/types/signer_send_reminder_params.py
rename to src/legalesign_sdk/types/signer_send_reminder_params.py
diff --git a/src/legalesign/types/signer_status_enum.py b/src/legalesign_sdk/types/signer_status_enum.py
similarity index 100%
rename from src/legalesign/types/signer_status_enum.py
rename to src/legalesign_sdk/types/signer_status_enum.py
diff --git a/src/legalesign/types/status_response.py b/src/legalesign_sdk/types/status_retrieve_response.py
similarity index 90%
rename from src/legalesign/types/status_response.py
rename to src/legalesign_sdk/types/status_retrieve_response.py
index 99a5821..4a81d0a 100644
--- a/src/legalesign/types/status_response.py
+++ b/src/legalesign_sdk/types/status_retrieve_response.py
@@ -5,10 +5,10 @@
 from .._models import BaseModel
 from .signer_status_enum import SignerStatusEnum
 
-__all__ = ["StatusResponse"]
+__all__ = ["StatusRetrieveResponse"]
 
 
-class StatusResponse(BaseModel):
+class StatusRetrieveResponse(BaseModel):
     archived: Optional[bool] = None
 
     download_final: Optional[bool] = None
diff --git a/src/legalesign/types/template_create_params.py b/src/legalesign_sdk/types/template_create_params.py
similarity index 100%
rename from src/legalesign/types/template_create_params.py
rename to src/legalesign_sdk/types/template_create_params.py
diff --git a/src/legalesign/types/template_list_params.py b/src/legalesign_sdk/types/template_list_params.py
similarity index 100%
rename from src/legalesign/types/template_list_params.py
rename to src/legalesign_sdk/types/template_list_params.py
diff --git a/src/legalesign/types/template_list_response.py b/src/legalesign_sdk/types/template_list_response.py
similarity index 100%
rename from src/legalesign/types/template_list_response.py
rename to src/legalesign_sdk/types/template_list_response.py
diff --git a/src/legalesign/types/template_pdf.py b/src/legalesign_sdk/types/template_pdf.py
similarity index 100%
rename from src/legalesign/types/template_pdf.py
rename to src/legalesign_sdk/types/template_pdf.py
diff --git a/src/legalesign/types/template_retrieve_response.py b/src/legalesign_sdk/types/template_retrieve_response.py
similarity index 100%
rename from src/legalesign/types/template_retrieve_response.py
rename to src/legalesign_sdk/types/template_retrieve_response.py
diff --git a/src/legalesign/types/template_update_params.py b/src/legalesign_sdk/types/template_update_params.py
similarity index 100%
rename from src/legalesign/types/template_update_params.py
rename to src/legalesign_sdk/types/template_update_params.py
diff --git a/src/legalesign/types/templatepdf/__init__.py b/src/legalesign_sdk/types/templatepdf/__init__.py
similarity index 100%
rename from src/legalesign/types/templatepdf/__init__.py
rename to src/legalesign_sdk/types/templatepdf/__init__.py
diff --git a/src/legalesign/types/templatepdf/field_create_params.py b/src/legalesign_sdk/types/templatepdf/field_create_params.py
similarity index 100%
rename from src/legalesign/types/templatepdf/field_create_params.py
rename to src/legalesign_sdk/types/templatepdf/field_create_params.py
diff --git a/src/legalesign/types/templatepdf/field_list_response.py b/src/legalesign_sdk/types/templatepdf/field_list_response.py
similarity index 100%
rename from src/legalesign/types/templatepdf/field_list_response.py
rename to src/legalesign_sdk/types/templatepdf/field_list_response.py
diff --git a/src/legalesign/types/templatepdf_create_params.py b/src/legalesign_sdk/types/templatepdf_create_params.py
similarity index 100%
rename from src/legalesign/types/templatepdf_create_params.py
rename to src/legalesign_sdk/types/templatepdf_create_params.py
diff --git a/src/legalesign/types/templatepdf_get_edit_link_response.py b/src/legalesign_sdk/types/templatepdf_get_edit_link_response.py
similarity index 100%
rename from src/legalesign/types/templatepdf_get_edit_link_response.py
rename to src/legalesign_sdk/types/templatepdf_get_edit_link_response.py
diff --git a/src/legalesign/types/templatepdf_list_params.py b/src/legalesign_sdk/types/templatepdf_list_params.py
similarity index 100%
rename from src/legalesign/types/templatepdf_list_params.py
rename to src/legalesign_sdk/types/templatepdf_list_params.py
diff --git a/src/legalesign/types/templatepdf_list_response.py b/src/legalesign_sdk/types/templatepdf_list_response.py
similarity index 100%
rename from src/legalesign/types/templatepdf_list_response.py
rename to src/legalesign_sdk/types/templatepdf_list_response.py
diff --git a/tests/api_resources/templatepdf/test_fields.py b/tests/api_resources/templatepdf/test_fields.py
index 3c8cda0..41bbe8e 100644
--- a/tests/api_resources/templatepdf/test_fields.py
+++ b/tests/api_resources/templatepdf/test_fields.py
@@ -7,9 +7,9 @@
 
 import pytest
 
-from legalesign import Legalesign, AsyncLegalesign
 from tests.utils import assert_matches_type
-from legalesign.types.templatepdf import FieldListResponse
+from legalesign_sdk import LegalesignSDK, AsyncLegalesignSDK
+from legalesign_sdk.types.templatepdf import FieldListResponse
 
 base_url = os.environ.get("TEST_API_BASE_URL", "http://127.0.0.1:4010")
 
@@ -19,7 +19,7 @@ class TestFields:
 
     @pytest.mark.skip(reason="Prism tests are disabled")
     @parametrize
-    def test_method_create(self, client: Legalesign) -> None:
+    def test_method_create(self, client: LegalesignSDK) -> None:
         field = client.templatepdf.fields.create(
             pdf_id="182bd5e5-6e1a-4fe4-a799-aa6d9a6ab26e",
             body=[
@@ -38,7 +38,7 @@ def test_method_create(self, client: Legalesign) -> None:
 
     @pytest.mark.skip(reason="Prism tests are disabled")
     @parametrize
-    def test_raw_response_create(self, client: Legalesign) -> None:
+    def test_raw_response_create(self, client: LegalesignSDK) -> None:
         response = client.templatepdf.fields.with_raw_response.create(
             pdf_id="182bd5e5-6e1a-4fe4-a799-aa6d9a6ab26e",
             body=[
@@ -61,7 +61,7 @@ def test_raw_response_create(self, client: Legalesign) -> None:
 
     @pytest.mark.skip(reason="Prism tests are disabled")
     @parametrize
-    def test_streaming_response_create(self, client: Legalesign) -> None:
+    def test_streaming_response_create(self, client: LegalesignSDK) -> None:
         with client.templatepdf.fields.with_streaming_response.create(
             pdf_id="182bd5e5-6e1a-4fe4-a799-aa6d9a6ab26e",
             body=[
@@ -86,7 +86,7 @@ def test_streaming_response_create(self, client: Legalesign) -> None:
 
     @pytest.mark.skip(reason="Prism tests are disabled")
     @parametrize
-    def test_path_params_create(self, client: Legalesign) -> None:
+    def test_path_params_create(self, client: LegalesignSDK) -> None:
         with pytest.raises(ValueError, match=r"Expected a non-empty value for `pdf_id` but received ''"):
             client.templatepdf.fields.with_raw_response.create(
                 pdf_id="",
@@ -105,7 +105,7 @@ def test_path_params_create(self, client: Legalesign) -> None:
 
     @pytest.mark.skip(reason="Prism tests are disabled")
     @parametrize
-    def test_method_list(self, client: Legalesign) -> None:
+    def test_method_list(self, client: LegalesignSDK) -> None:
         field = client.templatepdf.fields.list(
             "182bd5e5-6e1a-4fe4-a799-aa6d9a6ab26e",
         )
@@ -113,7 +113,7 @@ def test_method_list(self, client: Legalesign) -> None:
 
     @pytest.mark.skip(reason="Prism tests are disabled")
     @parametrize
-    def test_raw_response_list(self, client: Legalesign) -> None:
+    def test_raw_response_list(self, client: LegalesignSDK) -> None:
         response = client.templatepdf.fields.with_raw_response.list(
             "182bd5e5-6e1a-4fe4-a799-aa6d9a6ab26e",
         )
@@ -125,7 +125,7 @@ def test_raw_response_list(self, client: Legalesign) -> None:
 
     @pytest.mark.skip(reason="Prism tests are disabled")
     @parametrize
-    def test_streaming_response_list(self, client: Legalesign) -> None:
+    def test_streaming_response_list(self, client: LegalesignSDK) -> None:
         with client.templatepdf.fields.with_streaming_response.list(
             "182bd5e5-6e1a-4fe4-a799-aa6d9a6ab26e",
         ) as response:
@@ -139,7 +139,7 @@ def test_streaming_response_list(self, client: Legalesign) -> None:
 
     @pytest.mark.skip(reason="Prism tests are disabled")
     @parametrize
-    def test_path_params_list(self, client: Legalesign) -> None:
+    def test_path_params_list(self, client: LegalesignSDK) -> None:
         with pytest.raises(ValueError, match=r"Expected a non-empty value for `pdf_id` but received ''"):
             client.templatepdf.fields.with_raw_response.list(
                 "",
@@ -153,7 +153,7 @@ class TestAsyncFields:
 
     @pytest.mark.skip(reason="Prism tests are disabled")
     @parametrize
-    async def test_method_create(self, async_client: AsyncLegalesign) -> None:
+    async def test_method_create(self, async_client: AsyncLegalesignSDK) -> None:
         field = await async_client.templatepdf.fields.create(
             pdf_id="182bd5e5-6e1a-4fe4-a799-aa6d9a6ab26e",
             body=[
@@ -172,7 +172,7 @@ async def test_method_create(self, async_client: AsyncLegalesign) -> None:
 
     @pytest.mark.skip(reason="Prism tests are disabled")
     @parametrize
-    async def test_raw_response_create(self, async_client: AsyncLegalesign) -> None:
+    async def test_raw_response_create(self, async_client: AsyncLegalesignSDK) -> None:
         response = await async_client.templatepdf.fields.with_raw_response.create(
             pdf_id="182bd5e5-6e1a-4fe4-a799-aa6d9a6ab26e",
             body=[
@@ -195,7 +195,7 @@ async def test_raw_response_create(self, async_client: AsyncLegalesign) -> None:
 
     @pytest.mark.skip(reason="Prism tests are disabled")
     @parametrize
-    async def test_streaming_response_create(self, async_client: AsyncLegalesign) -> None:
+    async def test_streaming_response_create(self, async_client: AsyncLegalesignSDK) -> None:
         async with async_client.templatepdf.fields.with_streaming_response.create(
             pdf_id="182bd5e5-6e1a-4fe4-a799-aa6d9a6ab26e",
             body=[
@@ -220,7 +220,7 @@ async def test_streaming_response_create(self, async_client: AsyncLegalesign) ->
 
     @pytest.mark.skip(reason="Prism tests are disabled")
     @parametrize
-    async def test_path_params_create(self, async_client: AsyncLegalesign) -> None:
+    async def test_path_params_create(self, async_client: AsyncLegalesignSDK) -> None:
         with pytest.raises(ValueError, match=r"Expected a non-empty value for `pdf_id` but received ''"):
             await async_client.templatepdf.fields.with_raw_response.create(
                 pdf_id="",
@@ -239,7 +239,7 @@ async def test_path_params_create(self, async_client: AsyncLegalesign) -> None:
 
     @pytest.mark.skip(reason="Prism tests are disabled")
     @parametrize
-    async def test_method_list(self, async_client: AsyncLegalesign) -> None:
+    async def test_method_list(self, async_client: AsyncLegalesignSDK) -> None:
         field = await async_client.templatepdf.fields.list(
             "182bd5e5-6e1a-4fe4-a799-aa6d9a6ab26e",
         )
@@ -247,7 +247,7 @@ async def test_method_list(self, async_client: AsyncLegalesign) -> None:
 
     @pytest.mark.skip(reason="Prism tests are disabled")
     @parametrize
-    async def test_raw_response_list(self, async_client: AsyncLegalesign) -> None:
+    async def test_raw_response_list(self, async_client: AsyncLegalesignSDK) -> None:
         response = await async_client.templatepdf.fields.with_raw_response.list(
             "182bd5e5-6e1a-4fe4-a799-aa6d9a6ab26e",
         )
@@ -259,7 +259,7 @@ async def test_raw_response_list(self, async_client: AsyncLegalesign) -> None:
 
     @pytest.mark.skip(reason="Prism tests are disabled")
     @parametrize
-    async def test_streaming_response_list(self, async_client: AsyncLegalesign) -> None:
+    async def test_streaming_response_list(self, async_client: AsyncLegalesignSDK) -> None:
         async with async_client.templatepdf.fields.with_streaming_response.list(
             "182bd5e5-6e1a-4fe4-a799-aa6d9a6ab26e",
         ) as response:
@@ -273,7 +273,7 @@ async def test_streaming_response_list(self, async_client: AsyncLegalesign) -> N
 
     @pytest.mark.skip(reason="Prism tests are disabled")
     @parametrize
-    async def test_path_params_list(self, async_client: AsyncLegalesign) -> None:
+    async def test_path_params_list(self, async_client: AsyncLegalesignSDK) -> None:
         with pytest.raises(ValueError, match=r"Expected a non-empty value for `pdf_id` but received ''"):
             await async_client.templatepdf.fields.with_raw_response.list(
                 "",
diff --git a/tests/api_resources/test_attachment.py b/tests/api_resources/test_attachment.py
deleted file mode 100644
index 237637d..0000000
--- a/tests/api_resources/test_attachment.py
+++ /dev/null
@@ -1,375 +0,0 @@
-# File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.
-
-from __future__ import annotations
-
-import os
-from typing import Any, cast
-
-import pytest
-
-from legalesign import Legalesign, AsyncLegalesign
-from tests.utils import assert_matches_type
-from legalesign.types import (
-    AttachmentResponse,
-    AttachmentListResponse,
-)
-
-base_url = os.environ.get("TEST_API_BASE_URL", "http://127.0.0.1:4010")
-
-
-class TestAttachment:
-    parametrize = pytest.mark.parametrize("client", [False, True], indirect=True, ids=["loose", "strict"])
-
-    @pytest.mark.skip(reason="Prism tests are disabled")
-    @parametrize
-    def test_method_retrieve(self, client: Legalesign) -> None:
-        attachment = client.attachment.retrieve(
-            "182bd5e5-6e1a-4fe4-a799-aa6d9a6ab26e",
-        )
-        assert_matches_type(AttachmentResponse, attachment, path=["response"])
-
-    @pytest.mark.skip(reason="Prism tests are disabled")
-    @parametrize
-    def test_raw_response_retrieve(self, client: Legalesign) -> None:
-        response = client.attachment.with_raw_response.retrieve(
-            "182bd5e5-6e1a-4fe4-a799-aa6d9a6ab26e",
-        )
-
-        assert response.is_closed is True
-        assert response.http_request.headers.get("X-Stainless-Lang") == "python"
-        attachment = response.parse()
-        assert_matches_type(AttachmentResponse, attachment, path=["response"])
-
-    @pytest.mark.skip(reason="Prism tests are disabled")
-    @parametrize
-    def test_streaming_response_retrieve(self, client: Legalesign) -> None:
-        with client.attachment.with_streaming_response.retrieve(
-            "182bd5e5-6e1a-4fe4-a799-aa6d9a6ab26e",
-        ) as response:
-            assert not response.is_closed
-            assert response.http_request.headers.get("X-Stainless-Lang") == "python"
-
-            attachment = response.parse()
-            assert_matches_type(AttachmentResponse, attachment, path=["response"])
-
-        assert cast(Any, response.is_closed) is True
-
-    @pytest.mark.skip(reason="Prism tests are disabled")
-    @parametrize
-    def test_path_params_retrieve(self, client: Legalesign) -> None:
-        with pytest.raises(ValueError, match=r"Expected a non-empty value for `attachment_id` but received ''"):
-            client.attachment.with_raw_response.retrieve(
-                "",
-            )
-
-    @pytest.mark.skip(reason="Prism tests are disabled")
-    @parametrize
-    def test_method_list(self, client: Legalesign) -> None:
-        attachment = client.attachment.list()
-        assert_matches_type(AttachmentListResponse, attachment, path=["response"])
-
-    @pytest.mark.skip(reason="Prism tests are disabled")
-    @parametrize
-    def test_method_list_with_all_params(self, client: Legalesign) -> None:
-        attachment = client.attachment.list(
-            group="my-group",
-            limit=0,
-            offset=0,
-        )
-        assert_matches_type(AttachmentListResponse, attachment, path=["response"])
-
-    @pytest.mark.skip(reason="Prism tests are disabled")
-    @parametrize
-    def test_raw_response_list(self, client: Legalesign) -> None:
-        response = client.attachment.with_raw_response.list()
-
-        assert response.is_closed is True
-        assert response.http_request.headers.get("X-Stainless-Lang") == "python"
-        attachment = response.parse()
-        assert_matches_type(AttachmentListResponse, attachment, path=["response"])
-
-    @pytest.mark.skip(reason="Prism tests are disabled")
-    @parametrize
-    def test_streaming_response_list(self, client: Legalesign) -> None:
-        with client.attachment.with_streaming_response.list() as response:
-            assert not response.is_closed
-            assert response.http_request.headers.get("X-Stainless-Lang") == "python"
-
-            attachment = response.parse()
-            assert_matches_type(AttachmentListResponse, attachment, path=["response"])
-
-        assert cast(Any, response.is_closed) is True
-
-    @pytest.mark.skip(reason="Prism tests are disabled")
-    @parametrize
-    def test_method_delete(self, client: Legalesign) -> None:
-        attachment = client.attachment.delete(
-            "182bd5e5-6e1a-4fe4-a799-aa6d9a6ab26e",
-        )
-        assert attachment is None
-
-    @pytest.mark.skip(reason="Prism tests are disabled")
-    @parametrize
-    def test_raw_response_delete(self, client: Legalesign) -> None:
-        response = client.attachment.with_raw_response.delete(
-            "182bd5e5-6e1a-4fe4-a799-aa6d9a6ab26e",
-        )
-
-        assert response.is_closed is True
-        assert response.http_request.headers.get("X-Stainless-Lang") == "python"
-        attachment = response.parse()
-        assert attachment is None
-
-    @pytest.mark.skip(reason="Prism tests are disabled")
-    @parametrize
-    def test_streaming_response_delete(self, client: Legalesign) -> None:
-        with client.attachment.with_streaming_response.delete(
-            "182bd5e5-6e1a-4fe4-a799-aa6d9a6ab26e",
-        ) as response:
-            assert not response.is_closed
-            assert response.http_request.headers.get("X-Stainless-Lang") == "python"
-
-            attachment = response.parse()
-            assert attachment is None
-
-        assert cast(Any, response.is_closed) is True
-
-    @pytest.mark.skip(reason="Prism tests are disabled")
-    @parametrize
-    def test_path_params_delete(self, client: Legalesign) -> None:
-        with pytest.raises(ValueError, match=r"Expected a non-empty value for `attachment_id` but received ''"):
-            client.attachment.with_raw_response.delete(
-                "",
-            )
-
-    @pytest.mark.skip(reason="Prism tests are disabled")
-    @parametrize
-    def test_method_upload(self, client: Legalesign) -> None:
-        attachment = client.attachment.upload(
-            filename="IK-GV--w1tvt7pdf",
-            group="/api/v1/group/IK-GV--w1tvt/",
-            pdf_file="U3RhaW5sZXNzIHJvY2tz",
-        )
-        assert attachment is None
-
-    @pytest.mark.skip(reason="Prism tests are disabled")
-    @parametrize
-    def test_method_upload_with_all_params(self, client: Legalesign) -> None:
-        attachment = client.attachment.upload(
-            filename="IK-GV--w1tvt7pdf",
-            group="/api/v1/group/IK-GV--w1tvt/",
-            pdf_file="U3RhaW5sZXNzIHJvY2tz",
-            description="description",
-            user="/api/v1/user/IK-GV--w1tvt/",
-        )
-        assert attachment is None
-
-    @pytest.mark.skip(reason="Prism tests are disabled")
-    @parametrize
-    def test_raw_response_upload(self, client: Legalesign) -> None:
-        response = client.attachment.with_raw_response.upload(
-            filename="IK-GV--w1tvt7pdf",
-            group="/api/v1/group/IK-GV--w1tvt/",
-            pdf_file="U3RhaW5sZXNzIHJvY2tz",
-        )
-
-        assert response.is_closed is True
-        assert response.http_request.headers.get("X-Stainless-Lang") == "python"
-        attachment = response.parse()
-        assert attachment is None
-
-    @pytest.mark.skip(reason="Prism tests are disabled")
-    @parametrize
-    def test_streaming_response_upload(self, client: Legalesign) -> None:
-        with client.attachment.with_streaming_response.upload(
-            filename="IK-GV--w1tvt7pdf",
-            group="/api/v1/group/IK-GV--w1tvt/",
-            pdf_file="U3RhaW5sZXNzIHJvY2tz",
-        ) as response:
-            assert not response.is_closed
-            assert response.http_request.headers.get("X-Stainless-Lang") == "python"
-
-            attachment = response.parse()
-            assert attachment is None
-
-        assert cast(Any, response.is_closed) is True
-
-
-class TestAsyncAttachment:
-    parametrize = pytest.mark.parametrize(
-        "async_client", [False, True, {"http_client": "aiohttp"}], indirect=True, ids=["loose", "strict", "aiohttp"]
-    )
-
-    @pytest.mark.skip(reason="Prism tests are disabled")
-    @parametrize
-    async def test_method_retrieve(self, async_client: AsyncLegalesign) -> None:
-        attachment = await async_client.attachment.retrieve(
-            "182bd5e5-6e1a-4fe4-a799-aa6d9a6ab26e",
-        )
-        assert_matches_type(AttachmentResponse, attachment, path=["response"])
-
-    @pytest.mark.skip(reason="Prism tests are disabled")
-    @parametrize
-    async def test_raw_response_retrieve(self, async_client: AsyncLegalesign) -> None:
-        response = await async_client.attachment.with_raw_response.retrieve(
-            "182bd5e5-6e1a-4fe4-a799-aa6d9a6ab26e",
-        )
-
-        assert response.is_closed is True
-        assert response.http_request.headers.get("X-Stainless-Lang") == "python"
-        attachment = await response.parse()
-        assert_matches_type(AttachmentResponse, attachment, path=["response"])
-
-    @pytest.mark.skip(reason="Prism tests are disabled")
-    @parametrize
-    async def test_streaming_response_retrieve(self, async_client: AsyncLegalesign) -> None:
-        async with async_client.attachment.with_streaming_response.retrieve(
-            "182bd5e5-6e1a-4fe4-a799-aa6d9a6ab26e",
-        ) as response:
-            assert not response.is_closed
-            assert response.http_request.headers.get("X-Stainless-Lang") == "python"
-
-            attachment = await response.parse()
-            assert_matches_type(AttachmentResponse, attachment, path=["response"])
-
-        assert cast(Any, response.is_closed) is True
-
-    @pytest.mark.skip(reason="Prism tests are disabled")
-    @parametrize
-    async def test_path_params_retrieve(self, async_client: AsyncLegalesign) -> None:
-        with pytest.raises(ValueError, match=r"Expected a non-empty value for `attachment_id` but received ''"):
-            await async_client.attachment.with_raw_response.retrieve(
-                "",
-            )
-
-    @pytest.mark.skip(reason="Prism tests are disabled")
-    @parametrize
-    async def test_method_list(self, async_client: AsyncLegalesign) -> None:
-        attachment = await async_client.attachment.list()
-        assert_matches_type(AttachmentListResponse, attachment, path=["response"])
-
-    @pytest.mark.skip(reason="Prism tests are disabled")
-    @parametrize
-    async def test_method_list_with_all_params(self, async_client: AsyncLegalesign) -> None:
-        attachment = await async_client.attachment.list(
-            group="my-group",
-            limit=0,
-            offset=0,
-        )
-        assert_matches_type(AttachmentListResponse, attachment, path=["response"])
-
-    @pytest.mark.skip(reason="Prism tests are disabled")
-    @parametrize
-    async def test_raw_response_list(self, async_client: AsyncLegalesign) -> None:
-        response = await async_client.attachment.with_raw_response.list()
-
-        assert response.is_closed is True
-        assert response.http_request.headers.get("X-Stainless-Lang") == "python"
-        attachment = await response.parse()
-        assert_matches_type(AttachmentListResponse, attachment, path=["response"])
-
-    @pytest.mark.skip(reason="Prism tests are disabled")
-    @parametrize
-    async def test_streaming_response_list(self, async_client: AsyncLegalesign) -> None:
-        async with async_client.attachment.with_streaming_response.list() as response:
-            assert not response.is_closed
-            assert response.http_request.headers.get("X-Stainless-Lang") == "python"
-
-            attachment = await response.parse()
-            assert_matches_type(AttachmentListResponse, attachment, path=["response"])
-
-        assert cast(Any, response.is_closed) is True
-
-    @pytest.mark.skip(reason="Prism tests are disabled")
-    @parametrize
-    async def test_method_delete(self, async_client: AsyncLegalesign) -> None:
-        attachment = await async_client.attachment.delete(
-            "182bd5e5-6e1a-4fe4-a799-aa6d9a6ab26e",
-        )
-        assert attachment is None
-
-    @pytest.mark.skip(reason="Prism tests are disabled")
-    @parametrize
-    async def test_raw_response_delete(self, async_client: AsyncLegalesign) -> None:
-        response = await async_client.attachment.with_raw_response.delete(
-            "182bd5e5-6e1a-4fe4-a799-aa6d9a6ab26e",
-        )
-
-        assert response.is_closed is True
-        assert response.http_request.headers.get("X-Stainless-Lang") == "python"
-        attachment = await response.parse()
-        assert attachment is None
-
-    @pytest.mark.skip(reason="Prism tests are disabled")
-    @parametrize
-    async def test_streaming_response_delete(self, async_client: AsyncLegalesign) -> None:
-        async with async_client.attachment.with_streaming_response.delete(
-            "182bd5e5-6e1a-4fe4-a799-aa6d9a6ab26e",
-        ) as response:
-            assert not response.is_closed
-            assert response.http_request.headers.get("X-Stainless-Lang") == "python"
-
-            attachment = await response.parse()
-            assert attachment is None
-
-        assert cast(Any, response.is_closed) is True
-
-    @pytest.mark.skip(reason="Prism tests are disabled")
-    @parametrize
-    async def test_path_params_delete(self, async_client: AsyncLegalesign) -> None:
-        with pytest.raises(ValueError, match=r"Expected a non-empty value for `attachment_id` but received ''"):
-            await async_client.attachment.with_raw_response.delete(
-                "",
-            )
-
-    @pytest.mark.skip(reason="Prism tests are disabled")
-    @parametrize
-    async def test_method_upload(self, async_client: AsyncLegalesign) -> None:
-        attachment = await async_client.attachment.upload(
-            filename="IK-GV--w1tvt7pdf",
-            group="/api/v1/group/IK-GV--w1tvt/",
-            pdf_file="U3RhaW5sZXNzIHJvY2tz",
-        )
-        assert attachment is None
-
-    @pytest.mark.skip(reason="Prism tests are disabled")
-    @parametrize
-    async def test_method_upload_with_all_params(self, async_client: AsyncLegalesign) -> None:
-        attachment = await async_client.attachment.upload(
-            filename="IK-GV--w1tvt7pdf",
-            group="/api/v1/group/IK-GV--w1tvt/",
-            pdf_file="U3RhaW5sZXNzIHJvY2tz",
-            description="description",
-            user="/api/v1/user/IK-GV--w1tvt/",
-        )
-        assert attachment is None
-
-    @pytest.mark.skip(reason="Prism tests are disabled")
-    @parametrize
-    async def test_raw_response_upload(self, async_client: AsyncLegalesign) -> None:
-        response = await async_client.attachment.with_raw_response.upload(
-            filename="IK-GV--w1tvt7pdf",
-            group="/api/v1/group/IK-GV--w1tvt/",
-            pdf_file="U3RhaW5sZXNzIHJvY2tz",
-        )
-
-        assert response.is_closed is True
-        assert response.http_request.headers.get("X-Stainless-Lang") == "python"
-        attachment = await response.parse()
-        assert attachment is None
-
-    @pytest.mark.skip(reason="Prism tests are disabled")
-    @parametrize
-    async def test_streaming_response_upload(self, async_client: AsyncLegalesign) -> None:
-        async with async_client.attachment.with_streaming_response.upload(
-            filename="IK-GV--w1tvt7pdf",
-            group="/api/v1/group/IK-GV--w1tvt/",
-            pdf_file="U3RhaW5sZXNzIHJvY2tz",
-        ) as response:
-            assert not response.is_closed
-            assert response.http_request.headers.get("X-Stainless-Lang") == "python"
-
-            attachment = await response.parse()
-            assert attachment is None
-
-        assert cast(Any, response.is_closed) is True
diff --git a/tests/api_resources/test_document.py b/tests/api_resources/test_document.py
index 8fbd808..49f5efb 100644
--- a/tests/api_resources/test_document.py
+++ b/tests/api_resources/test_document.py
@@ -5,25 +5,17 @@
 import os
 from typing import Any, cast
 
-import httpx
 import pytest
-from respx import MockRouter
 
-from legalesign import Legalesign, AsyncLegalesign
 from tests.utils import assert_matches_type
-from legalesign.types import (
+from legalesign_sdk import LegalesignSDK, AsyncLegalesignSDK
+from legalesign_sdk.types import (
     DocumentListResponse,
     DocumentCreateResponse,
     DocumentRetrieveResponse,
     DocumentGetFieldsResponse,
 )
-from legalesign._utils import parse_datetime
-from legalesign._response import (
-    BinaryAPIResponse,
-    AsyncBinaryAPIResponse,
-    StreamedBinaryAPIResponse,
-    AsyncStreamedBinaryAPIResponse,
-)
+from legalesign_sdk._utils import parse_datetime
 
 base_url = os.environ.get("TEST_API_BASE_URL", "http://127.0.0.1:4010")
 
@@ -33,7 +25,7 @@ class TestDocument:
 
     @pytest.mark.skip(reason="Prism tests are disabled")
     @parametrize
-    def test_method_create(self, client: Legalesign) -> None:
+    def test_method_create(self, client: LegalesignSDK) -> None:
         document = client.document.create(
             group="https://example.com",
             name="x",
@@ -49,7 +41,7 @@ def test_method_create(self, client: Legalesign) -> None:
 
     @pytest.mark.skip(reason="Prism tests are disabled")
     @parametrize
-    def test_method_create_with_all_params(self, client: Legalesign) -> None:
+    def test_method_create_with_all_params(self, client: LegalesignSDK) -> None:
         document = client.document.create(
             group="https://example.com",
             name="x",
@@ -109,7 +101,7 @@ def test_method_create_with_all_params(self, client: Legalesign) -> None:
 
     @pytest.mark.skip(reason="Prism tests are disabled")
     @parametrize
-    def test_raw_response_create(self, client: Legalesign) -> None:
+    def test_raw_response_create(self, client: LegalesignSDK) -> None:
         response = client.document.with_raw_response.create(
             group="https://example.com",
             name="x",
@@ -129,7 +121,7 @@ def test_raw_response_create(self, client: Legalesign) -> None:
 
     @pytest.mark.skip(reason="Prism tests are disabled")
     @parametrize
-    def test_streaming_response_create(self, client: Legalesign) -> None:
+    def test_streaming_response_create(self, client: LegalesignSDK) -> None:
         with client.document.with_streaming_response.create(
             group="https://example.com",
             name="x",
@@ -151,7 +143,7 @@ def test_streaming_response_create(self, client: Legalesign) -> None:
 
     @pytest.mark.skip(reason="Prism tests are disabled")
     @parametrize
-    def test_method_retrieve(self, client: Legalesign) -> None:
+    def test_method_retrieve(self, client: LegalesignSDK) -> None:
         document = client.document.retrieve(
             "182bd5e5-6e1a-4fe4-a799-aa6d9a6ab26e",
         )
@@ -159,7 +151,7 @@ def test_method_retrieve(self, client: Legalesign) -> None:
 
     @pytest.mark.skip(reason="Prism tests are disabled")
     @parametrize
-    def test_raw_response_retrieve(self, client: Legalesign) -> None:
+    def test_raw_response_retrieve(self, client: LegalesignSDK) -> None:
         response = client.document.with_raw_response.retrieve(
             "182bd5e5-6e1a-4fe4-a799-aa6d9a6ab26e",
         )
@@ -171,7 +163,7 @@ def test_raw_response_retrieve(self, client: Legalesign) -> None:
 
     @pytest.mark.skip(reason="Prism tests are disabled")
     @parametrize
-    def test_streaming_response_retrieve(self, client: Legalesign) -> None:
+    def test_streaming_response_retrieve(self, client: LegalesignSDK) -> None:
         with client.document.with_streaming_response.retrieve(
             "182bd5e5-6e1a-4fe4-a799-aa6d9a6ab26e",
         ) as response:
@@ -185,7 +177,7 @@ def test_streaming_response_retrieve(self, client: Legalesign) -> None:
 
     @pytest.mark.skip(reason="Prism tests are disabled")
     @parametrize
-    def test_path_params_retrieve(self, client: Legalesign) -> None:
+    def test_path_params_retrieve(self, client: LegalesignSDK) -> None:
         with pytest.raises(ValueError, match=r"Expected a non-empty value for `doc_id` but received ''"):
             client.document.with_raw_response.retrieve(
                 "",
@@ -193,7 +185,7 @@ def test_path_params_retrieve(self, client: Legalesign) -> None:
 
     @pytest.mark.skip(reason="Prism tests are disabled")
     @parametrize
-    def test_method_list(self, client: Legalesign) -> None:
+    def test_method_list(self, client: LegalesignSDK) -> None:
         document = client.document.list(
             group="group",
         )
@@ -201,7 +193,7 @@ def test_method_list(self, client: Legalesign) -> None:
 
     @pytest.mark.skip(reason="Prism tests are disabled")
     @parametrize
-    def test_method_list_with_all_params(self, client: Legalesign) -> None:
+    def test_method_list_with_all_params(self, client: LegalesignSDK) -> None:
         document = client.document.list(
             group="group",
             archived="archived",
@@ -217,7 +209,7 @@ def test_method_list_with_all_params(self, client: Legalesign) -> None:
 
     @pytest.mark.skip(reason="Prism tests are disabled")
     @parametrize
-    def test_raw_response_list(self, client: Legalesign) -> None:
+    def test_raw_response_list(self, client: LegalesignSDK) -> None:
         response = client.document.with_raw_response.list(
             group="group",
         )
@@ -229,7 +221,7 @@ def test_raw_response_list(self, client: Legalesign) -> None:
 
     @pytest.mark.skip(reason="Prism tests are disabled")
     @parametrize
-    def test_streaming_response_list(self, client: Legalesign) -> None:
+    def test_streaming_response_list(self, client: LegalesignSDK) -> None:
         with client.document.with_streaming_response.list(
             group="group",
         ) as response:
@@ -243,7 +235,7 @@ def test_streaming_response_list(self, client: Legalesign) -> None:
 
     @pytest.mark.skip(reason="Prism tests are disabled")
     @parametrize
-    def test_method_archive(self, client: Legalesign) -> None:
+    def test_method_archive(self, client: LegalesignSDK) -> None:
         document = client.document.archive(
             "182bd5e5-6e1a-4fe4-a799-aa6d9a6ab26e",
         )
@@ -251,7 +243,7 @@ def test_method_archive(self, client: Legalesign) -> None:
 
     @pytest.mark.skip(reason="Prism tests are disabled")
     @parametrize
-    def test_raw_response_archive(self, client: Legalesign) -> None:
+    def test_raw_response_archive(self, client: LegalesignSDK) -> None:
         response = client.document.with_raw_response.archive(
             "182bd5e5-6e1a-4fe4-a799-aa6d9a6ab26e",
         )
@@ -263,7 +255,7 @@ def test_raw_response_archive(self, client: Legalesign) -> None:
 
     @pytest.mark.skip(reason="Prism tests are disabled")
     @parametrize
-    def test_streaming_response_archive(self, client: Legalesign) -> None:
+    def test_streaming_response_archive(self, client: LegalesignSDK) -> None:
         with client.document.with_streaming_response.archive(
             "182bd5e5-6e1a-4fe4-a799-aa6d9a6ab26e",
         ) as response:
@@ -277,7 +269,7 @@ def test_streaming_response_archive(self, client: Legalesign) -> None:
 
     @pytest.mark.skip(reason="Prism tests are disabled")
     @parametrize
-    def test_path_params_archive(self, client: Legalesign) -> None:
+    def test_path_params_archive(self, client: LegalesignSDK) -> None:
         with pytest.raises(ValueError, match=r"Expected a non-empty value for `doc_id` but received ''"):
             client.document.with_raw_response.archive(
                 "",
@@ -285,183 +277,88 @@ def test_path_params_archive(self, client: Legalesign) -> None:
 
     @pytest.mark.skip(reason="Prism tests are disabled")
     @parametrize
-    def test_method_delete_permanently(self, client: Legalesign) -> None:
-        document = client.document.delete_permanently(
+    def test_method_get_fields(self, client: LegalesignSDK) -> None:
+        document = client.document.get_fields(
             "182bd5e5-6e1a-4fe4-a799-aa6d9a6ab26e",
         )
-        assert document is None
+        assert_matches_type(DocumentGetFieldsResponse, document, path=["response"])
 
     @pytest.mark.skip(reason="Prism tests are disabled")
     @parametrize
-    def test_raw_response_delete_permanently(self, client: Legalesign) -> None:
-        response = client.document.with_raw_response.delete_permanently(
+    def test_raw_response_get_fields(self, client: LegalesignSDK) -> None:
+        response = client.document.with_raw_response.get_fields(
             "182bd5e5-6e1a-4fe4-a799-aa6d9a6ab26e",
         )
 
         assert response.is_closed is True
         assert response.http_request.headers.get("X-Stainless-Lang") == "python"
         document = response.parse()
-        assert document is None
+        assert_matches_type(DocumentGetFieldsResponse, document, path=["response"])
 
     @pytest.mark.skip(reason="Prism tests are disabled")
     @parametrize
-    def test_streaming_response_delete_permanently(self, client: Legalesign) -> None:
-        with client.document.with_streaming_response.delete_permanently(
+    def test_streaming_response_get_fields(self, client: LegalesignSDK) -> None:
+        with client.document.with_streaming_response.get_fields(
             "182bd5e5-6e1a-4fe4-a799-aa6d9a6ab26e",
         ) as response:
             assert not response.is_closed
             assert response.http_request.headers.get("X-Stainless-Lang") == "python"
 
             document = response.parse()
-            assert document is None
+            assert_matches_type(DocumentGetFieldsResponse, document, path=["response"])
 
         assert cast(Any, response.is_closed) is True
 
     @pytest.mark.skip(reason="Prism tests are disabled")
     @parametrize
-    def test_path_params_delete_permanently(self, client: Legalesign) -> None:
-        with pytest.raises(ValueError, match=r"Expected a non-empty value for `doc_id` but received ''"):
-            client.document.with_raw_response.delete_permanently(
-                "",
-            )
-
-    @parametrize
-    @pytest.mark.respx(base_url=base_url)
-    def test_method_download_audit_log(self, client: Legalesign, respx_mock: MockRouter) -> None:
-        respx_mock.get("/document/182bd5e5-6e1a-4fe4-a799-aa6d9a6ab26e/auditlog/").mock(
-            return_value=httpx.Response(200, json={"foo": "bar"})
-        )
-        document = client.document.download_audit_log(
-            "182bd5e5-6e1a-4fe4-a799-aa6d9a6ab26e",
-        )
-        assert document.is_closed
-        assert document.json() == {"foo": "bar"}
-        assert cast(Any, document.is_closed) is True
-        assert isinstance(document, BinaryAPIResponse)
-
-    @parametrize
-    @pytest.mark.respx(base_url=base_url)
-    def test_raw_response_download_audit_log(self, client: Legalesign, respx_mock: MockRouter) -> None:
-        respx_mock.get("/document/182bd5e5-6e1a-4fe4-a799-aa6d9a6ab26e/auditlog/").mock(
-            return_value=httpx.Response(200, json={"foo": "bar"})
-        )
-
-        document = client.document.with_raw_response.download_audit_log(
-            "182bd5e5-6e1a-4fe4-a799-aa6d9a6ab26e",
-        )
-
-        assert document.is_closed is True
-        assert document.http_request.headers.get("X-Stainless-Lang") == "python"
-        assert document.json() == {"foo": "bar"}
-        assert isinstance(document, BinaryAPIResponse)
-
-    @parametrize
-    @pytest.mark.respx(base_url=base_url)
-    def test_streaming_response_download_audit_log(self, client: Legalesign, respx_mock: MockRouter) -> None:
-        respx_mock.get("/document/182bd5e5-6e1a-4fe4-a799-aa6d9a6ab26e/auditlog/").mock(
-            return_value=httpx.Response(200, json={"foo": "bar"})
-        )
-        with client.document.with_streaming_response.download_audit_log(
-            "182bd5e5-6e1a-4fe4-a799-aa6d9a6ab26e",
-        ) as document:
-            assert not document.is_closed
-            assert document.http_request.headers.get("X-Stainless-Lang") == "python"
-
-            assert document.json() == {"foo": "bar"}
-            assert cast(Any, document.is_closed) is True
-            assert isinstance(document, StreamedBinaryAPIResponse)
-
-        assert cast(Any, document.is_closed) is True
-
-    @parametrize
-    @pytest.mark.respx(base_url=base_url)
-    def test_path_params_download_audit_log(self, client: Legalesign) -> None:
+    def test_path_params_get_fields(self, client: LegalesignSDK) -> None:
         with pytest.raises(ValueError, match=r"Expected a non-empty value for `doc_id` but received ''"):
-            client.document.with_raw_response.download_audit_log(
+            client.document.with_raw_response.get_fields(
                 "",
             )
 
     @pytest.mark.skip(reason="Prism tests are disabled")
     @parametrize
-    def test_method_get_fields(self, client: Legalesign) -> None:
-        document = client.document.get_fields(
+    def test_method_permanently_delete(self, client: LegalesignSDK) -> None:
+        document = client.document.permanently_delete(
             "182bd5e5-6e1a-4fe4-a799-aa6d9a6ab26e",
         )
-        assert_matches_type(DocumentGetFieldsResponse, document, path=["response"])
+        assert document is None
 
     @pytest.mark.skip(reason="Prism tests are disabled")
     @parametrize
-    def test_raw_response_get_fields(self, client: Legalesign) -> None:
-        response = client.document.with_raw_response.get_fields(
+    def test_raw_response_permanently_delete(self, client: LegalesignSDK) -> None:
+        response = client.document.with_raw_response.permanently_delete(
             "182bd5e5-6e1a-4fe4-a799-aa6d9a6ab26e",
         )
 
         assert response.is_closed is True
         assert response.http_request.headers.get("X-Stainless-Lang") == "python"
         document = response.parse()
-        assert_matches_type(DocumentGetFieldsResponse, document, path=["response"])
+        assert document is None
 
     @pytest.mark.skip(reason="Prism tests are disabled")
     @parametrize
-    def test_streaming_response_get_fields(self, client: Legalesign) -> None:
-        with client.document.with_streaming_response.get_fields(
+    def test_streaming_response_permanently_delete(self, client: LegalesignSDK) -> None:
+        with client.document.with_streaming_response.permanently_delete(
             "182bd5e5-6e1a-4fe4-a799-aa6d9a6ab26e",
         ) as response:
             assert not response.is_closed
             assert response.http_request.headers.get("X-Stainless-Lang") == "python"
 
             document = response.parse()
-            assert_matches_type(DocumentGetFieldsResponse, document, path=["response"])
+            assert document is None
 
         assert cast(Any, response.is_closed) is True
 
     @pytest.mark.skip(reason="Prism tests are disabled")
     @parametrize
-    def test_path_params_get_fields(self, client: Legalesign) -> None:
+    def test_path_params_permanently_delete(self, client: LegalesignSDK) -> None:
         with pytest.raises(ValueError, match=r"Expected a non-empty value for `doc_id` but received ''"):
-            client.document.with_raw_response.get_fields(
+            client.document.with_raw_response.permanently_delete(
                 "",
             )
 
-    @pytest.mark.skip(reason="Prism doesn't properly handle redirects")
-    @parametrize
-    def test_method_preview(self, client: Legalesign) -> None:
-        document = client.document.preview()
-        assert document is None
-
-    @pytest.mark.skip(reason="Prism doesn't properly handle redirects")
-    @parametrize
-    def test_method_preview_with_all_params(self, client: Legalesign) -> None:
-        document = client.document.preview(
-            group="/api/v1/group/IK-GV--w1tvt/",
-            signee_count=0,
-            text="text",
-            title="title",
-        )
-        assert document is None
-
-    @pytest.mark.skip(reason="Prism doesn't properly handle redirects")
-    @parametrize
-    def test_raw_response_preview(self, client: Legalesign) -> None:
-        response = client.document.with_raw_response.preview()
-
-        assert response.is_closed is True
-        assert response.http_request.headers.get("X-Stainless-Lang") == "python"
-        document = response.parse()
-        assert document is None
-
-    @pytest.mark.skip(reason="Prism doesn't properly handle redirects")
-    @parametrize
-    def test_streaming_response_preview(self, client: Legalesign) -> None:
-        with client.document.with_streaming_response.preview() as response:
-            assert not response.is_closed
-            assert response.http_request.headers.get("X-Stainless-Lang") == "python"
-
-            document = response.parse()
-            assert document is None
-
-        assert cast(Any, response.is_closed) is True
-
 
 class TestAsyncDocument:
     parametrize = pytest.mark.parametrize(
@@ -470,7 +367,7 @@ class TestAsyncDocument:
 
     @pytest.mark.skip(reason="Prism tests are disabled")
     @parametrize
-    async def test_method_create(self, async_client: AsyncLegalesign) -> None:
+    async def test_method_create(self, async_client: AsyncLegalesignSDK) -> None:
         document = await async_client.document.create(
             group="https://example.com",
             name="x",
@@ -486,7 +383,7 @@ async def test_method_create(self, async_client: AsyncLegalesign) -> None:
 
     @pytest.mark.skip(reason="Prism tests are disabled")
     @parametrize
-    async def test_method_create_with_all_params(self, async_client: AsyncLegalesign) -> None:
+    async def test_method_create_with_all_params(self, async_client: AsyncLegalesignSDK) -> None:
         document = await async_client.document.create(
             group="https://example.com",
             name="x",
@@ -546,7 +443,7 @@ async def test_method_create_with_all_params(self, async_client: AsyncLegalesign
 
     @pytest.mark.skip(reason="Prism tests are disabled")
     @parametrize
-    async def test_raw_response_create(self, async_client: AsyncLegalesign) -> None:
+    async def test_raw_response_create(self, async_client: AsyncLegalesignSDK) -> None:
         response = await async_client.document.with_raw_response.create(
             group="https://example.com",
             name="x",
@@ -566,7 +463,7 @@ async def test_raw_response_create(self, async_client: AsyncLegalesign) -> None:
 
     @pytest.mark.skip(reason="Prism tests are disabled")
     @parametrize
-    async def test_streaming_response_create(self, async_client: AsyncLegalesign) -> None:
+    async def test_streaming_response_create(self, async_client: AsyncLegalesignSDK) -> None:
         async with async_client.document.with_streaming_response.create(
             group="https://example.com",
             name="x",
@@ -588,7 +485,7 @@ async def test_streaming_response_create(self, async_client: AsyncLegalesign) ->
 
     @pytest.mark.skip(reason="Prism tests are disabled")
     @parametrize
-    async def test_method_retrieve(self, async_client: AsyncLegalesign) -> None:
+    async def test_method_retrieve(self, async_client: AsyncLegalesignSDK) -> None:
         document = await async_client.document.retrieve(
             "182bd5e5-6e1a-4fe4-a799-aa6d9a6ab26e",
         )
@@ -596,7 +493,7 @@ async def test_method_retrieve(self, async_client: AsyncLegalesign) -> None:
 
     @pytest.mark.skip(reason="Prism tests are disabled")
     @parametrize
-    async def test_raw_response_retrieve(self, async_client: AsyncLegalesign) -> None:
+    async def test_raw_response_retrieve(self, async_client: AsyncLegalesignSDK) -> None:
         response = await async_client.document.with_raw_response.retrieve(
             "182bd5e5-6e1a-4fe4-a799-aa6d9a6ab26e",
         )
@@ -608,7 +505,7 @@ async def test_raw_response_retrieve(self, async_client: AsyncLegalesign) -> Non
 
     @pytest.mark.skip(reason="Prism tests are disabled")
     @parametrize
-    async def test_streaming_response_retrieve(self, async_client: AsyncLegalesign) -> None:
+    async def test_streaming_response_retrieve(self, async_client: AsyncLegalesignSDK) -> None:
         async with async_client.document.with_streaming_response.retrieve(
             "182bd5e5-6e1a-4fe4-a799-aa6d9a6ab26e",
         ) as response:
@@ -622,7 +519,7 @@ async def test_streaming_response_retrieve(self, async_client: AsyncLegalesign)
 
     @pytest.mark.skip(reason="Prism tests are disabled")
     @parametrize
-    async def test_path_params_retrieve(self, async_client: AsyncLegalesign) -> None:
+    async def test_path_params_retrieve(self, async_client: AsyncLegalesignSDK) -> None:
         with pytest.raises(ValueError, match=r"Expected a non-empty value for `doc_id` but received ''"):
             await async_client.document.with_raw_response.retrieve(
                 "",
@@ -630,7 +527,7 @@ async def test_path_params_retrieve(self, async_client: AsyncLegalesign) -> None
 
     @pytest.mark.skip(reason="Prism tests are disabled")
     @parametrize
-    async def test_method_list(self, async_client: AsyncLegalesign) -> None:
+    async def test_method_list(self, async_client: AsyncLegalesignSDK) -> None:
         document = await async_client.document.list(
             group="group",
         )
@@ -638,7 +535,7 @@ async def test_method_list(self, async_client: AsyncLegalesign) -> None:
 
     @pytest.mark.skip(reason="Prism tests are disabled")
     @parametrize
-    async def test_method_list_with_all_params(self, async_client: AsyncLegalesign) -> None:
+    async def test_method_list_with_all_params(self, async_client: AsyncLegalesignSDK) -> None:
         document = await async_client.document.list(
             group="group",
             archived="archived",
@@ -654,7 +551,7 @@ async def test_method_list_with_all_params(self, async_client: AsyncLegalesign)
 
     @pytest.mark.skip(reason="Prism tests are disabled")
     @parametrize
-    async def test_raw_response_list(self, async_client: AsyncLegalesign) -> None:
+    async def test_raw_response_list(self, async_client: AsyncLegalesignSDK) -> None:
         response = await async_client.document.with_raw_response.list(
             group="group",
         )
@@ -666,7 +563,7 @@ async def test_raw_response_list(self, async_client: AsyncLegalesign) -> None:
 
     @pytest.mark.skip(reason="Prism tests are disabled")
     @parametrize
-    async def test_streaming_response_list(self, async_client: AsyncLegalesign) -> None:
+    async def test_streaming_response_list(self, async_client: AsyncLegalesignSDK) -> None:
         async with async_client.document.with_streaming_response.list(
             group="group",
         ) as response:
@@ -680,7 +577,7 @@ async def test_streaming_response_list(self, async_client: AsyncLegalesign) -> N
 
     @pytest.mark.skip(reason="Prism tests are disabled")
     @parametrize
-    async def test_method_archive(self, async_client: AsyncLegalesign) -> None:
+    async def test_method_archive(self, async_client: AsyncLegalesignSDK) -> None:
         document = await async_client.document.archive(
             "182bd5e5-6e1a-4fe4-a799-aa6d9a6ab26e",
         )
@@ -688,7 +585,7 @@ async def test_method_archive(self, async_client: AsyncLegalesign) -> None:
 
     @pytest.mark.skip(reason="Prism tests are disabled")
     @parametrize
-    async def test_raw_response_archive(self, async_client: AsyncLegalesign) -> None:
+    async def test_raw_response_archive(self, async_client: AsyncLegalesignSDK) -> None:
         response = await async_client.document.with_raw_response.archive(
             "182bd5e5-6e1a-4fe4-a799-aa6d9a6ab26e",
         )
@@ -700,7 +597,7 @@ async def test_raw_response_archive(self, async_client: AsyncLegalesign) -> None
 
     @pytest.mark.skip(reason="Prism tests are disabled")
     @parametrize
-    async def test_streaming_response_archive(self, async_client: AsyncLegalesign) -> None:
+    async def test_streaming_response_archive(self, async_client: AsyncLegalesignSDK) -> None:
         async with async_client.document.with_streaming_response.archive(
             "182bd5e5-6e1a-4fe4-a799-aa6d9a6ab26e",
         ) as response:
@@ -714,7 +611,7 @@ async def test_streaming_response_archive(self, async_client: AsyncLegalesign) -
 
     @pytest.mark.skip(reason="Prism tests are disabled")
     @parametrize
-    async def test_path_params_archive(self, async_client: AsyncLegalesign) -> None:
+    async def test_path_params_archive(self, async_client: AsyncLegalesignSDK) -> None:
         with pytest.raises(ValueError, match=r"Expected a non-empty value for `doc_id` but received ''"):
             await async_client.document.with_raw_response.archive(
                 "",
@@ -722,181 +619,84 @@ async def test_path_params_archive(self, async_client: AsyncLegalesign) -> None:
 
     @pytest.mark.skip(reason="Prism tests are disabled")
     @parametrize
-    async def test_method_delete_permanently(self, async_client: AsyncLegalesign) -> None:
-        document = await async_client.document.delete_permanently(
+    async def test_method_get_fields(self, async_client: AsyncLegalesignSDK) -> None:
+        document = await async_client.document.get_fields(
             "182bd5e5-6e1a-4fe4-a799-aa6d9a6ab26e",
         )
-        assert document is None
+        assert_matches_type(DocumentGetFieldsResponse, document, path=["response"])
 
     @pytest.mark.skip(reason="Prism tests are disabled")
     @parametrize
-    async def test_raw_response_delete_permanently(self, async_client: AsyncLegalesign) -> None:
-        response = await async_client.document.with_raw_response.delete_permanently(
+    async def test_raw_response_get_fields(self, async_client: AsyncLegalesignSDK) -> None:
+        response = await async_client.document.with_raw_response.get_fields(
             "182bd5e5-6e1a-4fe4-a799-aa6d9a6ab26e",
         )
 
         assert response.is_closed is True
         assert response.http_request.headers.get("X-Stainless-Lang") == "python"
         document = await response.parse()
-        assert document is None
+        assert_matches_type(DocumentGetFieldsResponse, document, path=["response"])
 
     @pytest.mark.skip(reason="Prism tests are disabled")
     @parametrize
-    async def test_streaming_response_delete_permanently(self, async_client: AsyncLegalesign) -> None:
-        async with async_client.document.with_streaming_response.delete_permanently(
+    async def test_streaming_response_get_fields(self, async_client: AsyncLegalesignSDK) -> None:
+        async with async_client.document.with_streaming_response.get_fields(
             "182bd5e5-6e1a-4fe4-a799-aa6d9a6ab26e",
         ) as response:
             assert not response.is_closed
             assert response.http_request.headers.get("X-Stainless-Lang") == "python"
 
             document = await response.parse()
-            assert document is None
+            assert_matches_type(DocumentGetFieldsResponse, document, path=["response"])
 
         assert cast(Any, response.is_closed) is True
 
     @pytest.mark.skip(reason="Prism tests are disabled")
     @parametrize
-    async def test_path_params_delete_permanently(self, async_client: AsyncLegalesign) -> None:
-        with pytest.raises(ValueError, match=r"Expected a non-empty value for `doc_id` but received ''"):
-            await async_client.document.with_raw_response.delete_permanently(
-                "",
-            )
-
-    @parametrize
-    @pytest.mark.respx(base_url=base_url)
-    async def test_method_download_audit_log(self, async_client: AsyncLegalesign, respx_mock: MockRouter) -> None:
-        respx_mock.get("/document/182bd5e5-6e1a-4fe4-a799-aa6d9a6ab26e/auditlog/").mock(
-            return_value=httpx.Response(200, json={"foo": "bar"})
-        )
-        document = await async_client.document.download_audit_log(
-            "182bd5e5-6e1a-4fe4-a799-aa6d9a6ab26e",
-        )
-        assert document.is_closed
-        assert await document.json() == {"foo": "bar"}
-        assert cast(Any, document.is_closed) is True
-        assert isinstance(document, AsyncBinaryAPIResponse)
-
-    @parametrize
-    @pytest.mark.respx(base_url=base_url)
-    async def test_raw_response_download_audit_log(self, async_client: AsyncLegalesign, respx_mock: MockRouter) -> None:
-        respx_mock.get("/document/182bd5e5-6e1a-4fe4-a799-aa6d9a6ab26e/auditlog/").mock(
-            return_value=httpx.Response(200, json={"foo": "bar"})
-        )
-
-        document = await async_client.document.with_raw_response.download_audit_log(
-            "182bd5e5-6e1a-4fe4-a799-aa6d9a6ab26e",
-        )
-
-        assert document.is_closed is True
-        assert document.http_request.headers.get("X-Stainless-Lang") == "python"
-        assert await document.json() == {"foo": "bar"}
-        assert isinstance(document, AsyncBinaryAPIResponse)
-
-    @parametrize
-    @pytest.mark.respx(base_url=base_url)
-    async def test_streaming_response_download_audit_log(
-        self, async_client: AsyncLegalesign, respx_mock: MockRouter
-    ) -> None:
-        respx_mock.get("/document/182bd5e5-6e1a-4fe4-a799-aa6d9a6ab26e/auditlog/").mock(
-            return_value=httpx.Response(200, json={"foo": "bar"})
-        )
-        async with async_client.document.with_streaming_response.download_audit_log(
-            "182bd5e5-6e1a-4fe4-a799-aa6d9a6ab26e",
-        ) as document:
-            assert not document.is_closed
-            assert document.http_request.headers.get("X-Stainless-Lang") == "python"
-
-            assert await document.json() == {"foo": "bar"}
-            assert cast(Any, document.is_closed) is True
-            assert isinstance(document, AsyncStreamedBinaryAPIResponse)
-
-        assert cast(Any, document.is_closed) is True
-
-    @parametrize
-    @pytest.mark.respx(base_url=base_url)
-    async def test_path_params_download_audit_log(self, async_client: AsyncLegalesign) -> None:
+    async def test_path_params_get_fields(self, async_client: AsyncLegalesignSDK) -> None:
         with pytest.raises(ValueError, match=r"Expected a non-empty value for `doc_id` but received ''"):
-            await async_client.document.with_raw_response.download_audit_log(
+            await async_client.document.with_raw_response.get_fields(
                 "",
             )
 
     @pytest.mark.skip(reason="Prism tests are disabled")
     @parametrize
-    async def test_method_get_fields(self, async_client: AsyncLegalesign) -> None:
-        document = await async_client.document.get_fields(
+    async def test_method_permanently_delete(self, async_client: AsyncLegalesignSDK) -> None:
+        document = await async_client.document.permanently_delete(
             "182bd5e5-6e1a-4fe4-a799-aa6d9a6ab26e",
         )
-        assert_matches_type(DocumentGetFieldsResponse, document, path=["response"])
+        assert document is None
 
     @pytest.mark.skip(reason="Prism tests are disabled")
     @parametrize
-    async def test_raw_response_get_fields(self, async_client: AsyncLegalesign) -> None:
-        response = await async_client.document.with_raw_response.get_fields(
+    async def test_raw_response_permanently_delete(self, async_client: AsyncLegalesignSDK) -> None:
+        response = await async_client.document.with_raw_response.permanently_delete(
             "182bd5e5-6e1a-4fe4-a799-aa6d9a6ab26e",
         )
 
         assert response.is_closed is True
         assert response.http_request.headers.get("X-Stainless-Lang") == "python"
         document = await response.parse()
-        assert_matches_type(DocumentGetFieldsResponse, document, path=["response"])
+        assert document is None
 
     @pytest.mark.skip(reason="Prism tests are disabled")
     @parametrize
-    async def test_streaming_response_get_fields(self, async_client: AsyncLegalesign) -> None:
-        async with async_client.document.with_streaming_response.get_fields(
+    async def test_streaming_response_permanently_delete(self, async_client: AsyncLegalesignSDK) -> None:
+        async with async_client.document.with_streaming_response.permanently_delete(
             "182bd5e5-6e1a-4fe4-a799-aa6d9a6ab26e",
         ) as response:
             assert not response.is_closed
             assert response.http_request.headers.get("X-Stainless-Lang") == "python"
 
             document = await response.parse()
-            assert_matches_type(DocumentGetFieldsResponse, document, path=["response"])
+            assert document is None
 
         assert cast(Any, response.is_closed) is True
 
     @pytest.mark.skip(reason="Prism tests are disabled")
     @parametrize
-    async def test_path_params_get_fields(self, async_client: AsyncLegalesign) -> None:
+    async def test_path_params_permanently_delete(self, async_client: AsyncLegalesignSDK) -> None:
         with pytest.raises(ValueError, match=r"Expected a non-empty value for `doc_id` but received ''"):
-            await async_client.document.with_raw_response.get_fields(
+            await async_client.document.with_raw_response.permanently_delete(
                 "",
             )
-
-    @pytest.mark.skip(reason="Prism doesn't properly handle redirects")
-    @parametrize
-    async def test_method_preview(self, async_client: AsyncLegalesign) -> None:
-        document = await async_client.document.preview()
-        assert document is None
-
-    @pytest.mark.skip(reason="Prism doesn't properly handle redirects")
-    @parametrize
-    async def test_method_preview_with_all_params(self, async_client: AsyncLegalesign) -> None:
-        document = await async_client.document.preview(
-            group="/api/v1/group/IK-GV--w1tvt/",
-            signee_count=0,
-            text="text",
-            title="title",
-        )
-        assert document is None
-
-    @pytest.mark.skip(reason="Prism doesn't properly handle redirects")
-    @parametrize
-    async def test_raw_response_preview(self, async_client: AsyncLegalesign) -> None:
-        response = await async_client.document.with_raw_response.preview()
-
-        assert response.is_closed is True
-        assert response.http_request.headers.get("X-Stainless-Lang") == "python"
-        document = await response.parse()
-        assert document is None
-
-    @pytest.mark.skip(reason="Prism doesn't properly handle redirects")
-    @parametrize
-    async def test_streaming_response_preview(self, async_client: AsyncLegalesign) -> None:
-        async with async_client.document.with_streaming_response.preview() as response:
-            assert not response.is_closed
-            assert response.http_request.headers.get("X-Stainless-Lang") == "python"
-
-            document = await response.parse()
-            assert document is None
-
-        assert cast(Any, response.is_closed) is True
diff --git a/tests/api_resources/test_group.py b/tests/api_resources/test_group.py
index 056fc4d..d91cc78 100644
--- a/tests/api_resources/test_group.py
+++ b/tests/api_resources/test_group.py
@@ -7,12 +7,9 @@
 
 import pytest
 
-from legalesign import Legalesign, AsyncLegalesign
 from tests.utils import assert_matches_type
-from legalesign.types import (
-    GroupListResponse,
-    GroupRetrieveResponse,
-)
+from legalesign_sdk import LegalesignSDK, AsyncLegalesignSDK
+from legalesign_sdk.types import GroupListResponse, GroupRetrieveResponse
 
 base_url = os.environ.get("TEST_API_BASE_URL", "http://127.0.0.1:4010")
 
@@ -22,7 +19,7 @@ class TestGroup:
 
     @pytest.mark.skip(reason="Prism tests are disabled")
     @parametrize
-    def test_method_create(self, client: Legalesign) -> None:
+    def test_method_create(self, client: LegalesignSDK) -> None:
         group = client.group.create(
             name="xxxx",
         )
@@ -30,7 +27,7 @@ def test_method_create(self, client: Legalesign) -> None:
 
     @pytest.mark.skip(reason="Prism tests are disabled")
     @parametrize
-    def test_method_create_with_all_params(self, client: Legalesign) -> None:
+    def test_method_create_with_all_params(self, client: LegalesignSDK) -> None:
         group = client.group.create(
             name="xxxx",
             xframe_allow=True,
@@ -39,7 +36,7 @@ def test_method_create_with_all_params(self, client: Legalesign) -> None:
 
     @pytest.mark.skip(reason="Prism tests are disabled")
     @parametrize
-    def test_raw_response_create(self, client: Legalesign) -> None:
+    def test_raw_response_create(self, client: LegalesignSDK) -> None:
         response = client.group.with_raw_response.create(
             name="xxxx",
         )
@@ -51,7 +48,7 @@ def test_raw_response_create(self, client: Legalesign) -> None:
 
     @pytest.mark.skip(reason="Prism tests are disabled")
     @parametrize
-    def test_streaming_response_create(self, client: Legalesign) -> None:
+    def test_streaming_response_create(self, client: LegalesignSDK) -> None:
         with client.group.with_streaming_response.create(
             name="xxxx",
         ) as response:
@@ -65,7 +62,7 @@ def test_streaming_response_create(self, client: Legalesign) -> None:
 
     @pytest.mark.skip(reason="Prism tests are disabled")
     @parametrize
-    def test_method_retrieve(self, client: Legalesign) -> None:
+    def test_method_retrieve(self, client: LegalesignSDK) -> None:
         group = client.group.retrieve(
             "groupId",
         )
@@ -73,7 +70,7 @@ def test_method_retrieve(self, client: Legalesign) -> None:
 
     @pytest.mark.skip(reason="Prism tests are disabled")
     @parametrize
-    def test_raw_response_retrieve(self, client: Legalesign) -> None:
+    def test_raw_response_retrieve(self, client: LegalesignSDK) -> None:
         response = client.group.with_raw_response.retrieve(
             "groupId",
         )
@@ -85,7 +82,7 @@ def test_raw_response_retrieve(self, client: Legalesign) -> None:
 
     @pytest.mark.skip(reason="Prism tests are disabled")
     @parametrize
-    def test_streaming_response_retrieve(self, client: Legalesign) -> None:
+    def test_streaming_response_retrieve(self, client: LegalesignSDK) -> None:
         with client.group.with_streaming_response.retrieve(
             "groupId",
         ) as response:
@@ -99,7 +96,7 @@ def test_streaming_response_retrieve(self, client: Legalesign) -> None:
 
     @pytest.mark.skip(reason="Prism tests are disabled")
     @parametrize
-    def test_path_params_retrieve(self, client: Legalesign) -> None:
+    def test_path_params_retrieve(self, client: LegalesignSDK) -> None:
         with pytest.raises(ValueError, match=r"Expected a non-empty value for `group_id` but received ''"):
             client.group.with_raw_response.retrieve(
                 "",
@@ -107,64 +104,13 @@ def test_path_params_retrieve(self, client: Legalesign) -> None:
 
     @pytest.mark.skip(reason="Prism tests are disabled")
     @parametrize
-    def test_method_update(self, client: Legalesign) -> None:
-        group = client.group.update(
-            group_id="groupId",
-        )
-        assert group is None
-
-    @pytest.mark.skip(reason="Prism tests are disabled")
-    @parametrize
-    def test_method_update_with_all_params(self, client: Legalesign) -> None:
-        group = client.group.update(
-            group_id="groupId",
-            public_name="public_name",
-        )
-        assert group is None
-
-    @pytest.mark.skip(reason="Prism tests are disabled")
-    @parametrize
-    def test_raw_response_update(self, client: Legalesign) -> None:
-        response = client.group.with_raw_response.update(
-            group_id="groupId",
-        )
-
-        assert response.is_closed is True
-        assert response.http_request.headers.get("X-Stainless-Lang") == "python"
-        group = response.parse()
-        assert group is None
-
-    @pytest.mark.skip(reason="Prism tests are disabled")
-    @parametrize
-    def test_streaming_response_update(self, client: Legalesign) -> None:
-        with client.group.with_streaming_response.update(
-            group_id="groupId",
-        ) as response:
-            assert not response.is_closed
-            assert response.http_request.headers.get("X-Stainless-Lang") == "python"
-
-            group = response.parse()
-            assert group is None
-
-        assert cast(Any, response.is_closed) is True
-
-    @pytest.mark.skip(reason="Prism tests are disabled")
-    @parametrize
-    def test_path_params_update(self, client: Legalesign) -> None:
-        with pytest.raises(ValueError, match=r"Expected a non-empty value for `group_id` but received ''"):
-            client.group.with_raw_response.update(
-                group_id="",
-            )
-
-    @pytest.mark.skip(reason="Prism tests are disabled")
-    @parametrize
-    def test_method_list(self, client: Legalesign) -> None:
+    def test_method_list(self, client: LegalesignSDK) -> None:
         group = client.group.list()
         assert_matches_type(GroupListResponse, group, path=["response"])
 
     @pytest.mark.skip(reason="Prism tests are disabled")
     @parametrize
-    def test_method_list_with_all_params(self, client: Legalesign) -> None:
+    def test_method_list_with_all_params(self, client: LegalesignSDK) -> None:
         group = client.group.list(
             limit=0,
             offset=0,
@@ -173,7 +119,7 @@ def test_method_list_with_all_params(self, client: Legalesign) -> None:
 
     @pytest.mark.skip(reason="Prism tests are disabled")
     @parametrize
-    def test_raw_response_list(self, client: Legalesign) -> None:
+    def test_raw_response_list(self, client: LegalesignSDK) -> None:
         response = client.group.with_raw_response.list()
 
         assert response.is_closed is True
@@ -183,7 +129,7 @@ def test_raw_response_list(self, client: Legalesign) -> None:
 
     @pytest.mark.skip(reason="Prism tests are disabled")
     @parametrize
-    def test_streaming_response_list(self, client: Legalesign) -> None:
+    def test_streaming_response_list(self, client: LegalesignSDK) -> None:
         with client.group.with_streaming_response.list() as response:
             assert not response.is_closed
             assert response.http_request.headers.get("X-Stainless-Lang") == "python"
@@ -201,7 +147,7 @@ class TestAsyncGroup:
 
     @pytest.mark.skip(reason="Prism tests are disabled")
     @parametrize
-    async def test_method_create(self, async_client: AsyncLegalesign) -> None:
+    async def test_method_create(self, async_client: AsyncLegalesignSDK) -> None:
         group = await async_client.group.create(
             name="xxxx",
         )
@@ -209,7 +155,7 @@ async def test_method_create(self, async_client: AsyncLegalesign) -> None:
 
     @pytest.mark.skip(reason="Prism tests are disabled")
     @parametrize
-    async def test_method_create_with_all_params(self, async_client: AsyncLegalesign) -> None:
+    async def test_method_create_with_all_params(self, async_client: AsyncLegalesignSDK) -> None:
         group = await async_client.group.create(
             name="xxxx",
             xframe_allow=True,
@@ -218,7 +164,7 @@ async def test_method_create_with_all_params(self, async_client: AsyncLegalesign
 
     @pytest.mark.skip(reason="Prism tests are disabled")
     @parametrize
-    async def test_raw_response_create(self, async_client: AsyncLegalesign) -> None:
+    async def test_raw_response_create(self, async_client: AsyncLegalesignSDK) -> None:
         response = await async_client.group.with_raw_response.create(
             name="xxxx",
         )
@@ -230,7 +176,7 @@ async def test_raw_response_create(self, async_client: AsyncLegalesign) -> None:
 
     @pytest.mark.skip(reason="Prism tests are disabled")
     @parametrize
-    async def test_streaming_response_create(self, async_client: AsyncLegalesign) -> None:
+    async def test_streaming_response_create(self, async_client: AsyncLegalesignSDK) -> None:
         async with async_client.group.with_streaming_response.create(
             name="xxxx",
         ) as response:
@@ -244,7 +190,7 @@ async def test_streaming_response_create(self, async_client: AsyncLegalesign) ->
 
     @pytest.mark.skip(reason="Prism tests are disabled")
     @parametrize
-    async def test_method_retrieve(self, async_client: AsyncLegalesign) -> None:
+    async def test_method_retrieve(self, async_client: AsyncLegalesignSDK) -> None:
         group = await async_client.group.retrieve(
             "groupId",
         )
@@ -252,7 +198,7 @@ async def test_method_retrieve(self, async_client: AsyncLegalesign) -> None:
 
     @pytest.mark.skip(reason="Prism tests are disabled")
     @parametrize
-    async def test_raw_response_retrieve(self, async_client: AsyncLegalesign) -> None:
+    async def test_raw_response_retrieve(self, async_client: AsyncLegalesignSDK) -> None:
         response = await async_client.group.with_raw_response.retrieve(
             "groupId",
         )
@@ -264,7 +210,7 @@ async def test_raw_response_retrieve(self, async_client: AsyncLegalesign) -> Non
 
     @pytest.mark.skip(reason="Prism tests are disabled")
     @parametrize
-    async def test_streaming_response_retrieve(self, async_client: AsyncLegalesign) -> None:
+    async def test_streaming_response_retrieve(self, async_client: AsyncLegalesignSDK) -> None:
         async with async_client.group.with_streaming_response.retrieve(
             "groupId",
         ) as response:
@@ -278,7 +224,7 @@ async def test_streaming_response_retrieve(self, async_client: AsyncLegalesign)
 
     @pytest.mark.skip(reason="Prism tests are disabled")
     @parametrize
-    async def test_path_params_retrieve(self, async_client: AsyncLegalesign) -> None:
+    async def test_path_params_retrieve(self, async_client: AsyncLegalesignSDK) -> None:
         with pytest.raises(ValueError, match=r"Expected a non-empty value for `group_id` but received ''"):
             await async_client.group.with_raw_response.retrieve(
                 "",
@@ -286,64 +232,13 @@ async def test_path_params_retrieve(self, async_client: AsyncLegalesign) -> None
 
     @pytest.mark.skip(reason="Prism tests are disabled")
     @parametrize
-    async def test_method_update(self, async_client: AsyncLegalesign) -> None:
-        group = await async_client.group.update(
-            group_id="groupId",
-        )
-        assert group is None
-
-    @pytest.mark.skip(reason="Prism tests are disabled")
-    @parametrize
-    async def test_method_update_with_all_params(self, async_client: AsyncLegalesign) -> None:
-        group = await async_client.group.update(
-            group_id="groupId",
-            public_name="public_name",
-        )
-        assert group is None
-
-    @pytest.mark.skip(reason="Prism tests are disabled")
-    @parametrize
-    async def test_raw_response_update(self, async_client: AsyncLegalesign) -> None:
-        response = await async_client.group.with_raw_response.update(
-            group_id="groupId",
-        )
-
-        assert response.is_closed is True
-        assert response.http_request.headers.get("X-Stainless-Lang") == "python"
-        group = await response.parse()
-        assert group is None
-
-    @pytest.mark.skip(reason="Prism tests are disabled")
-    @parametrize
-    async def test_streaming_response_update(self, async_client: AsyncLegalesign) -> None:
-        async with async_client.group.with_streaming_response.update(
-            group_id="groupId",
-        ) as response:
-            assert not response.is_closed
-            assert response.http_request.headers.get("X-Stainless-Lang") == "python"
-
-            group = await response.parse()
-            assert group is None
-
-        assert cast(Any, response.is_closed) is True
-
-    @pytest.mark.skip(reason="Prism tests are disabled")
-    @parametrize
-    async def test_path_params_update(self, async_client: AsyncLegalesign) -> None:
-        with pytest.raises(ValueError, match=r"Expected a non-empty value for `group_id` but received ''"):
-            await async_client.group.with_raw_response.update(
-                group_id="",
-            )
-
-    @pytest.mark.skip(reason="Prism tests are disabled")
-    @parametrize
-    async def test_method_list(self, async_client: AsyncLegalesign) -> None:
+    async def test_method_list(self, async_client: AsyncLegalesignSDK) -> None:
         group = await async_client.group.list()
         assert_matches_type(GroupListResponse, group, path=["response"])
 
     @pytest.mark.skip(reason="Prism tests are disabled")
     @parametrize
-    async def test_method_list_with_all_params(self, async_client: AsyncLegalesign) -> None:
+    async def test_method_list_with_all_params(self, async_client: AsyncLegalesignSDK) -> None:
         group = await async_client.group.list(
             limit=0,
             offset=0,
@@ -352,7 +247,7 @@ async def test_method_list_with_all_params(self, async_client: AsyncLegalesign)
 
     @pytest.mark.skip(reason="Prism tests are disabled")
     @parametrize
-    async def test_raw_response_list(self, async_client: AsyncLegalesign) -> None:
+    async def test_raw_response_list(self, async_client: AsyncLegalesignSDK) -> None:
         response = await async_client.group.with_raw_response.list()
 
         assert response.is_closed is True
@@ -362,7 +257,7 @@ async def test_raw_response_list(self, async_client: AsyncLegalesign) -> None:
 
     @pytest.mark.skip(reason="Prism tests are disabled")
     @parametrize
-    async def test_streaming_response_list(self, async_client: AsyncLegalesign) -> None:
+    async def test_streaming_response_list(self, async_client: AsyncLegalesignSDK) -> None:
         async with async_client.group.with_streaming_response.list() as response:
             assert not response.is_closed
             assert response.http_request.headers.get("X-Stainless-Lang") == "python"
diff --git a/tests/api_resources/test_invited.py b/tests/api_resources/test_invited.py
deleted file mode 100644
index 37a8e6d..0000000
--- a/tests/api_resources/test_invited.py
+++ /dev/null
@@ -1,180 +0,0 @@
-# File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.
-
-from __future__ import annotations
-
-import os
-from typing import Any, cast
-
-import pytest
-
-from legalesign import Legalesign, AsyncLegalesign
-from tests.utils import assert_matches_type
-from legalesign.types import InvitedListResponse
-
-base_url = os.environ.get("TEST_API_BASE_URL", "http://127.0.0.1:4010")
-
-
-class TestInvited:
-    parametrize = pytest.mark.parametrize("client", [False, True], indirect=True, ids=["loose", "strict"])
-
-    @pytest.mark.skip(reason="Prism tests are disabled")
-    @parametrize
-    def test_method_list(self, client: Legalesign) -> None:
-        invited = client.invited.list()
-        assert_matches_type(InvitedListResponse, invited, path=["response"])
-
-    @pytest.mark.skip(reason="Prism tests are disabled")
-    @parametrize
-    def test_method_list_with_all_params(self, client: Legalesign) -> None:
-        invited = client.invited.list(
-            group="group",
-        )
-        assert_matches_type(InvitedListResponse, invited, path=["response"])
-
-    @pytest.mark.skip(reason="Prism tests are disabled")
-    @parametrize
-    def test_raw_response_list(self, client: Legalesign) -> None:
-        response = client.invited.with_raw_response.list()
-
-        assert response.is_closed is True
-        assert response.http_request.headers.get("X-Stainless-Lang") == "python"
-        invited = response.parse()
-        assert_matches_type(InvitedListResponse, invited, path=["response"])
-
-    @pytest.mark.skip(reason="Prism tests are disabled")
-    @parametrize
-    def test_streaming_response_list(self, client: Legalesign) -> None:
-        with client.invited.with_streaming_response.list() as response:
-            assert not response.is_closed
-            assert response.http_request.headers.get("X-Stainless-Lang") == "python"
-
-            invited = response.parse()
-            assert_matches_type(InvitedListResponse, invited, path=["response"])
-
-        assert cast(Any, response.is_closed) is True
-
-    @pytest.mark.skip(reason="Prism tests are disabled")
-    @parametrize
-    def test_method_delete(self, client: Legalesign) -> None:
-        invited = client.invited.delete(
-            "182bd5e5-6e1a-4fe4-a799-aa6d9a6ab26e",
-        )
-        assert invited is None
-
-    @pytest.mark.skip(reason="Prism tests are disabled")
-    @parametrize
-    def test_raw_response_delete(self, client: Legalesign) -> None:
-        response = client.invited.with_raw_response.delete(
-            "182bd5e5-6e1a-4fe4-a799-aa6d9a6ab26e",
-        )
-
-        assert response.is_closed is True
-        assert response.http_request.headers.get("X-Stainless-Lang") == "python"
-        invited = response.parse()
-        assert invited is None
-
-    @pytest.mark.skip(reason="Prism tests are disabled")
-    @parametrize
-    def test_streaming_response_delete(self, client: Legalesign) -> None:
-        with client.invited.with_streaming_response.delete(
-            "182bd5e5-6e1a-4fe4-a799-aa6d9a6ab26e",
-        ) as response:
-            assert not response.is_closed
-            assert response.http_request.headers.get("X-Stainless-Lang") == "python"
-
-            invited = response.parse()
-            assert invited is None
-
-        assert cast(Any, response.is_closed) is True
-
-    @pytest.mark.skip(reason="Prism tests are disabled")
-    @parametrize
-    def test_path_params_delete(self, client: Legalesign) -> None:
-        with pytest.raises(ValueError, match=r"Expected a non-empty value for `invited_id` but received ''"):
-            client.invited.with_raw_response.delete(
-                "",
-            )
-
-
-class TestAsyncInvited:
-    parametrize = pytest.mark.parametrize(
-        "async_client", [False, True, {"http_client": "aiohttp"}], indirect=True, ids=["loose", "strict", "aiohttp"]
-    )
-
-    @pytest.mark.skip(reason="Prism tests are disabled")
-    @parametrize
-    async def test_method_list(self, async_client: AsyncLegalesign) -> None:
-        invited = await async_client.invited.list()
-        assert_matches_type(InvitedListResponse, invited, path=["response"])
-
-    @pytest.mark.skip(reason="Prism tests are disabled")
-    @parametrize
-    async def test_method_list_with_all_params(self, async_client: AsyncLegalesign) -> None:
-        invited = await async_client.invited.list(
-            group="group",
-        )
-        assert_matches_type(InvitedListResponse, invited, path=["response"])
-
-    @pytest.mark.skip(reason="Prism tests are disabled")
-    @parametrize
-    async def test_raw_response_list(self, async_client: AsyncLegalesign) -> None:
-        response = await async_client.invited.with_raw_response.list()
-
-        assert response.is_closed is True
-        assert response.http_request.headers.get("X-Stainless-Lang") == "python"
-        invited = await response.parse()
-        assert_matches_type(InvitedListResponse, invited, path=["response"])
-
-    @pytest.mark.skip(reason="Prism tests are disabled")
-    @parametrize
-    async def test_streaming_response_list(self, async_client: AsyncLegalesign) -> None:
-        async with async_client.invited.with_streaming_response.list() as response:
-            assert not response.is_closed
-            assert response.http_request.headers.get("X-Stainless-Lang") == "python"
-
-            invited = await response.parse()
-            assert_matches_type(InvitedListResponse, invited, path=["response"])
-
-        assert cast(Any, response.is_closed) is True
-
-    @pytest.mark.skip(reason="Prism tests are disabled")
-    @parametrize
-    async def test_method_delete(self, async_client: AsyncLegalesign) -> None:
-        invited = await async_client.invited.delete(
-            "182bd5e5-6e1a-4fe4-a799-aa6d9a6ab26e",
-        )
-        assert invited is None
-
-    @pytest.mark.skip(reason="Prism tests are disabled")
-    @parametrize
-    async def test_raw_response_delete(self, async_client: AsyncLegalesign) -> None:
-        response = await async_client.invited.with_raw_response.delete(
-            "182bd5e5-6e1a-4fe4-a799-aa6d9a6ab26e",
-        )
-
-        assert response.is_closed is True
-        assert response.http_request.headers.get("X-Stainless-Lang") == "python"
-        invited = await response.parse()
-        assert invited is None
-
-    @pytest.mark.skip(reason="Prism tests are disabled")
-    @parametrize
-    async def test_streaming_response_delete(self, async_client: AsyncLegalesign) -> None:
-        async with async_client.invited.with_streaming_response.delete(
-            "182bd5e5-6e1a-4fe4-a799-aa6d9a6ab26e",
-        ) as response:
-            assert not response.is_closed
-            assert response.http_request.headers.get("X-Stainless-Lang") == "python"
-
-            invited = await response.parse()
-            assert invited is None
-
-        assert cast(Any, response.is_closed) is True
-
-    @pytest.mark.skip(reason="Prism tests are disabled")
-    @parametrize
-    async def test_path_params_delete(self, async_client: AsyncLegalesign) -> None:
-        with pytest.raises(ValueError, match=r"Expected a non-empty value for `invited_id` but received ''"):
-            await async_client.invited.with_raw_response.delete(
-                "",
-            )
diff --git a/tests/api_resources/test_member.py b/tests/api_resources/test_member.py
deleted file mode 100644
index 5682abe..0000000
--- a/tests/api_resources/test_member.py
+++ /dev/null
@@ -1,367 +0,0 @@
-# File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.
-
-from __future__ import annotations
-
-import os
-from typing import Any, cast
-
-import pytest
-
-from legalesign import Legalesign, AsyncLegalesign
-from tests.utils import assert_matches_type
-from legalesign.types import (
-    MemberResponse,
-    MemberListResponse,
-)
-
-base_url = os.environ.get("TEST_API_BASE_URL", "http://127.0.0.1:4010")
-
-
-class TestMember:
-    parametrize = pytest.mark.parametrize("client", [False, True], indirect=True, ids=["loose", "strict"])
-
-    @pytest.mark.skip(reason="Prism tests are disabled")
-    @parametrize
-    def test_method_create(self, client: Legalesign) -> None:
-        member = client.member.create(
-            email="dev@stainless.com",
-            group="/api/v1/group/IK-GV--w1tvt/",
-        )
-        assert member is None
-
-    @pytest.mark.skip(reason="Prism tests are disabled")
-    @parametrize
-    def test_method_create_with_all_params(self, client: Legalesign) -> None:
-        member = client.member.create(
-            email="dev@stainless.com",
-            group="/api/v1/group/IK-GV--w1tvt/",
-            do_email=True,
-            permission=1,
-        )
-        assert member is None
-
-    @pytest.mark.skip(reason="Prism tests are disabled")
-    @parametrize
-    def test_raw_response_create(self, client: Legalesign) -> None:
-        response = client.member.with_raw_response.create(
-            email="dev@stainless.com",
-            group="/api/v1/group/IK-GV--w1tvt/",
-        )
-
-        assert response.is_closed is True
-        assert response.http_request.headers.get("X-Stainless-Lang") == "python"
-        member = response.parse()
-        assert member is None
-
-    @pytest.mark.skip(reason="Prism tests are disabled")
-    @parametrize
-    def test_streaming_response_create(self, client: Legalesign) -> None:
-        with client.member.with_streaming_response.create(
-            email="dev@stainless.com",
-            group="/api/v1/group/IK-GV--w1tvt/",
-        ) as response:
-            assert not response.is_closed
-            assert response.http_request.headers.get("X-Stainless-Lang") == "python"
-
-            member = response.parse()
-            assert member is None
-
-        assert cast(Any, response.is_closed) is True
-
-    @pytest.mark.skip(reason="Prism tests are disabled")
-    @parametrize
-    def test_method_retrieve(self, client: Legalesign) -> None:
-        member = client.member.retrieve(
-            "182bd5e5-6e1a-4fe4-a799-aa6d9a6ab26e",
-        )
-        assert_matches_type(MemberResponse, member, path=["response"])
-
-    @pytest.mark.skip(reason="Prism tests are disabled")
-    @parametrize
-    def test_raw_response_retrieve(self, client: Legalesign) -> None:
-        response = client.member.with_raw_response.retrieve(
-            "182bd5e5-6e1a-4fe4-a799-aa6d9a6ab26e",
-        )
-
-        assert response.is_closed is True
-        assert response.http_request.headers.get("X-Stainless-Lang") == "python"
-        member = response.parse()
-        assert_matches_type(MemberResponse, member, path=["response"])
-
-    @pytest.mark.skip(reason="Prism tests are disabled")
-    @parametrize
-    def test_streaming_response_retrieve(self, client: Legalesign) -> None:
-        with client.member.with_streaming_response.retrieve(
-            "182bd5e5-6e1a-4fe4-a799-aa6d9a6ab26e",
-        ) as response:
-            assert not response.is_closed
-            assert response.http_request.headers.get("X-Stainless-Lang") == "python"
-
-            member = response.parse()
-            assert_matches_type(MemberResponse, member, path=["response"])
-
-        assert cast(Any, response.is_closed) is True
-
-    @pytest.mark.skip(reason="Prism tests are disabled")
-    @parametrize
-    def test_path_params_retrieve(self, client: Legalesign) -> None:
-        with pytest.raises(ValueError, match=r"Expected a non-empty value for `member_id` but received ''"):
-            client.member.with_raw_response.retrieve(
-                "",
-            )
-
-    @pytest.mark.skip(reason="Prism tests are disabled")
-    @parametrize
-    def test_method_list(self, client: Legalesign) -> None:
-        member = client.member.list()
-        assert_matches_type(MemberListResponse, member, path=["response"])
-
-    @pytest.mark.skip(reason="Prism tests are disabled")
-    @parametrize
-    def test_method_list_with_all_params(self, client: Legalesign) -> None:
-        member = client.member.list(
-            group="group",
-            limit=0,
-            offset=0,
-        )
-        assert_matches_type(MemberListResponse, member, path=["response"])
-
-    @pytest.mark.skip(reason="Prism tests are disabled")
-    @parametrize
-    def test_raw_response_list(self, client: Legalesign) -> None:
-        response = client.member.with_raw_response.list()
-
-        assert response.is_closed is True
-        assert response.http_request.headers.get("X-Stainless-Lang") == "python"
-        member = response.parse()
-        assert_matches_type(MemberListResponse, member, path=["response"])
-
-    @pytest.mark.skip(reason="Prism tests are disabled")
-    @parametrize
-    def test_streaming_response_list(self, client: Legalesign) -> None:
-        with client.member.with_streaming_response.list() as response:
-            assert not response.is_closed
-            assert response.http_request.headers.get("X-Stainless-Lang") == "python"
-
-            member = response.parse()
-            assert_matches_type(MemberListResponse, member, path=["response"])
-
-        assert cast(Any, response.is_closed) is True
-
-    @pytest.mark.skip(reason="Prism tests are disabled")
-    @parametrize
-    def test_method_delete(self, client: Legalesign) -> None:
-        member = client.member.delete(
-            "182bd5e5-6e1a-4fe4-a799-aa6d9a6ab26e",
-        )
-        assert member is None
-
-    @pytest.mark.skip(reason="Prism tests are disabled")
-    @parametrize
-    def test_raw_response_delete(self, client: Legalesign) -> None:
-        response = client.member.with_raw_response.delete(
-            "182bd5e5-6e1a-4fe4-a799-aa6d9a6ab26e",
-        )
-
-        assert response.is_closed is True
-        assert response.http_request.headers.get("X-Stainless-Lang") == "python"
-        member = response.parse()
-        assert member is None
-
-    @pytest.mark.skip(reason="Prism tests are disabled")
-    @parametrize
-    def test_streaming_response_delete(self, client: Legalesign) -> None:
-        with client.member.with_streaming_response.delete(
-            "182bd5e5-6e1a-4fe4-a799-aa6d9a6ab26e",
-        ) as response:
-            assert not response.is_closed
-            assert response.http_request.headers.get("X-Stainless-Lang") == "python"
-
-            member = response.parse()
-            assert member is None
-
-        assert cast(Any, response.is_closed) is True
-
-    @pytest.mark.skip(reason="Prism tests are disabled")
-    @parametrize
-    def test_path_params_delete(self, client: Legalesign) -> None:
-        with pytest.raises(ValueError, match=r"Expected a non-empty value for `member_id` but received ''"):
-            client.member.with_raw_response.delete(
-                "",
-            )
-
-
-class TestAsyncMember:
-    parametrize = pytest.mark.parametrize(
-        "async_client", [False, True, {"http_client": "aiohttp"}], indirect=True, ids=["loose", "strict", "aiohttp"]
-    )
-
-    @pytest.mark.skip(reason="Prism tests are disabled")
-    @parametrize
-    async def test_method_create(self, async_client: AsyncLegalesign) -> None:
-        member = await async_client.member.create(
-            email="dev@stainless.com",
-            group="/api/v1/group/IK-GV--w1tvt/",
-        )
-        assert member is None
-
-    @pytest.mark.skip(reason="Prism tests are disabled")
-    @parametrize
-    async def test_method_create_with_all_params(self, async_client: AsyncLegalesign) -> None:
-        member = await async_client.member.create(
-            email="dev@stainless.com",
-            group="/api/v1/group/IK-GV--w1tvt/",
-            do_email=True,
-            permission=1,
-        )
-        assert member is None
-
-    @pytest.mark.skip(reason="Prism tests are disabled")
-    @parametrize
-    async def test_raw_response_create(self, async_client: AsyncLegalesign) -> None:
-        response = await async_client.member.with_raw_response.create(
-            email="dev@stainless.com",
-            group="/api/v1/group/IK-GV--w1tvt/",
-        )
-
-        assert response.is_closed is True
-        assert response.http_request.headers.get("X-Stainless-Lang") == "python"
-        member = await response.parse()
-        assert member is None
-
-    @pytest.mark.skip(reason="Prism tests are disabled")
-    @parametrize
-    async def test_streaming_response_create(self, async_client: AsyncLegalesign) -> None:
-        async with async_client.member.with_streaming_response.create(
-            email="dev@stainless.com",
-            group="/api/v1/group/IK-GV--w1tvt/",
-        ) as response:
-            assert not response.is_closed
-            assert response.http_request.headers.get("X-Stainless-Lang") == "python"
-
-            member = await response.parse()
-            assert member is None
-
-        assert cast(Any, response.is_closed) is True
-
-    @pytest.mark.skip(reason="Prism tests are disabled")
-    @parametrize
-    async def test_method_retrieve(self, async_client: AsyncLegalesign) -> None:
-        member = await async_client.member.retrieve(
-            "182bd5e5-6e1a-4fe4-a799-aa6d9a6ab26e",
-        )
-        assert_matches_type(MemberResponse, member, path=["response"])
-
-    @pytest.mark.skip(reason="Prism tests are disabled")
-    @parametrize
-    async def test_raw_response_retrieve(self, async_client: AsyncLegalesign) -> None:
-        response = await async_client.member.with_raw_response.retrieve(
-            "182bd5e5-6e1a-4fe4-a799-aa6d9a6ab26e",
-        )
-
-        assert response.is_closed is True
-        assert response.http_request.headers.get("X-Stainless-Lang") == "python"
-        member = await response.parse()
-        assert_matches_type(MemberResponse, member, path=["response"])
-
-    @pytest.mark.skip(reason="Prism tests are disabled")
-    @parametrize
-    async def test_streaming_response_retrieve(self, async_client: AsyncLegalesign) -> None:
-        async with async_client.member.with_streaming_response.retrieve(
-            "182bd5e5-6e1a-4fe4-a799-aa6d9a6ab26e",
-        ) as response:
-            assert not response.is_closed
-            assert response.http_request.headers.get("X-Stainless-Lang") == "python"
-
-            member = await response.parse()
-            assert_matches_type(MemberResponse, member, path=["response"])
-
-        assert cast(Any, response.is_closed) is True
-
-    @pytest.mark.skip(reason="Prism tests are disabled")
-    @parametrize
-    async def test_path_params_retrieve(self, async_client: AsyncLegalesign) -> None:
-        with pytest.raises(ValueError, match=r"Expected a non-empty value for `member_id` but received ''"):
-            await async_client.member.with_raw_response.retrieve(
-                "",
-            )
-
-    @pytest.mark.skip(reason="Prism tests are disabled")
-    @parametrize
-    async def test_method_list(self, async_client: AsyncLegalesign) -> None:
-        member = await async_client.member.list()
-        assert_matches_type(MemberListResponse, member, path=["response"])
-
-    @pytest.mark.skip(reason="Prism tests are disabled")
-    @parametrize
-    async def test_method_list_with_all_params(self, async_client: AsyncLegalesign) -> None:
-        member = await async_client.member.list(
-            group="group",
-            limit=0,
-            offset=0,
-        )
-        assert_matches_type(MemberListResponse, member, path=["response"])
-
-    @pytest.mark.skip(reason="Prism tests are disabled")
-    @parametrize
-    async def test_raw_response_list(self, async_client: AsyncLegalesign) -> None:
-        response = await async_client.member.with_raw_response.list()
-
-        assert response.is_closed is True
-        assert response.http_request.headers.get("X-Stainless-Lang") == "python"
-        member = await response.parse()
-        assert_matches_type(MemberListResponse, member, path=["response"])
-
-    @pytest.mark.skip(reason="Prism tests are disabled")
-    @parametrize
-    async def test_streaming_response_list(self, async_client: AsyncLegalesign) -> None:
-        async with async_client.member.with_streaming_response.list() as response:
-            assert not response.is_closed
-            assert response.http_request.headers.get("X-Stainless-Lang") == "python"
-
-            member = await response.parse()
-            assert_matches_type(MemberListResponse, member, path=["response"])
-
-        assert cast(Any, response.is_closed) is True
-
-    @pytest.mark.skip(reason="Prism tests are disabled")
-    @parametrize
-    async def test_method_delete(self, async_client: AsyncLegalesign) -> None:
-        member = await async_client.member.delete(
-            "182bd5e5-6e1a-4fe4-a799-aa6d9a6ab26e",
-        )
-        assert member is None
-
-    @pytest.mark.skip(reason="Prism tests are disabled")
-    @parametrize
-    async def test_raw_response_delete(self, async_client: AsyncLegalesign) -> None:
-        response = await async_client.member.with_raw_response.delete(
-            "182bd5e5-6e1a-4fe4-a799-aa6d9a6ab26e",
-        )
-
-        assert response.is_closed is True
-        assert response.http_request.headers.get("X-Stainless-Lang") == "python"
-        member = await response.parse()
-        assert member is None
-
-    @pytest.mark.skip(reason="Prism tests are disabled")
-    @parametrize
-    async def test_streaming_response_delete(self, async_client: AsyncLegalesign) -> None:
-        async with async_client.member.with_streaming_response.delete(
-            "182bd5e5-6e1a-4fe4-a799-aa6d9a6ab26e",
-        ) as response:
-            assert not response.is_closed
-            assert response.http_request.headers.get("X-Stainless-Lang") == "python"
-
-            member = await response.parse()
-            assert member is None
-
-        assert cast(Any, response.is_closed) is True
-
-    @pytest.mark.skip(reason="Prism tests are disabled")
-    @parametrize
-    async def test_path_params_delete(self, async_client: AsyncLegalesign) -> None:
-        with pytest.raises(ValueError, match=r"Expected a non-empty value for `member_id` but received ''"):
-            await async_client.member.with_raw_response.delete(
-                "",
-            )
diff --git a/tests/api_resources/test_notifications.py b/tests/api_resources/test_notifications.py
deleted file mode 100644
index 9405129..0000000
--- a/tests/api_resources/test_notifications.py
+++ /dev/null
@@ -1,80 +0,0 @@
-# File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.
-
-from __future__ import annotations
-
-import os
-from typing import Any, cast
-
-import pytest
-
-from legalesign import Legalesign, AsyncLegalesign
-from tests.utils import assert_matches_type
-from legalesign.types import NotificationListResponse
-
-base_url = os.environ.get("TEST_API_BASE_URL", "http://127.0.0.1:4010")
-
-
-class TestNotifications:
-    parametrize = pytest.mark.parametrize("client", [False, True], indirect=True, ids=["loose", "strict"])
-
-    @pytest.mark.skip(reason="Prism tests are disabled")
-    @parametrize
-    def test_method_list(self, client: Legalesign) -> None:
-        notification = client.notifications.list()
-        assert_matches_type(NotificationListResponse, notification, path=["response"])
-
-    @pytest.mark.skip(reason="Prism tests are disabled")
-    @parametrize
-    def test_raw_response_list(self, client: Legalesign) -> None:
-        response = client.notifications.with_raw_response.list()
-
-        assert response.is_closed is True
-        assert response.http_request.headers.get("X-Stainless-Lang") == "python"
-        notification = response.parse()
-        assert_matches_type(NotificationListResponse, notification, path=["response"])
-
-    @pytest.mark.skip(reason="Prism tests are disabled")
-    @parametrize
-    def test_streaming_response_list(self, client: Legalesign) -> None:
-        with client.notifications.with_streaming_response.list() as response:
-            assert not response.is_closed
-            assert response.http_request.headers.get("X-Stainless-Lang") == "python"
-
-            notification = response.parse()
-            assert_matches_type(NotificationListResponse, notification, path=["response"])
-
-        assert cast(Any, response.is_closed) is True
-
-
-class TestAsyncNotifications:
-    parametrize = pytest.mark.parametrize(
-        "async_client", [False, True, {"http_client": "aiohttp"}], indirect=True, ids=["loose", "strict", "aiohttp"]
-    )
-
-    @pytest.mark.skip(reason="Prism tests are disabled")
-    @parametrize
-    async def test_method_list(self, async_client: AsyncLegalesign) -> None:
-        notification = await async_client.notifications.list()
-        assert_matches_type(NotificationListResponse, notification, path=["response"])
-
-    @pytest.mark.skip(reason="Prism tests are disabled")
-    @parametrize
-    async def test_raw_response_list(self, async_client: AsyncLegalesign) -> None:
-        response = await async_client.notifications.with_raw_response.list()
-
-        assert response.is_closed is True
-        assert response.http_request.headers.get("X-Stainless-Lang") == "python"
-        notification = await response.parse()
-        assert_matches_type(NotificationListResponse, notification, path=["response"])
-
-    @pytest.mark.skip(reason="Prism tests are disabled")
-    @parametrize
-    async def test_streaming_response_list(self, async_client: AsyncLegalesign) -> None:
-        async with async_client.notifications.with_streaming_response.list() as response:
-            assert not response.is_closed
-            assert response.http_request.headers.get("X-Stainless-Lang") == "python"
-
-            notification = await response.parse()
-            assert_matches_type(NotificationListResponse, notification, path=["response"])
-
-        assert cast(Any, response.is_closed) is True
diff --git a/tests/api_resources/test_pdf.py b/tests/api_resources/test_pdf.py
index 9340121..b2e960f 100644
--- a/tests/api_resources/test_pdf.py
+++ b/tests/api_resources/test_pdf.py
@@ -9,8 +9,8 @@
 import pytest
 from respx import MockRouter
 
-from legalesign import Legalesign, AsyncLegalesign
-from legalesign._response import (
+from legalesign_sdk import LegalesignSDK, AsyncLegalesignSDK
+from legalesign_sdk._response import (
     BinaryAPIResponse,
     AsyncBinaryAPIResponse,
     StreamedBinaryAPIResponse,
@@ -25,7 +25,7 @@ class TestPdf:
 
     @parametrize
     @pytest.mark.respx(base_url=base_url)
-    def test_method_retrieve(self, client: Legalesign, respx_mock: MockRouter) -> None:
+    def test_method_retrieve(self, client: LegalesignSDK, respx_mock: MockRouter) -> None:
         respx_mock.get("/pdf/docId/").mock(return_value=httpx.Response(200, json={"foo": "bar"}))
         pdf = client.pdf.retrieve(
             "docId",
@@ -37,7 +37,7 @@ def test_method_retrieve(self, client: Legalesign, respx_mock: MockRouter) -> No
 
     @parametrize
     @pytest.mark.respx(base_url=base_url)
-    def test_raw_response_retrieve(self, client: Legalesign, respx_mock: MockRouter) -> None:
+    def test_raw_response_retrieve(self, client: LegalesignSDK, respx_mock: MockRouter) -> None:
         respx_mock.get("/pdf/docId/").mock(return_value=httpx.Response(200, json={"foo": "bar"}))
 
         pdf = client.pdf.with_raw_response.retrieve(
@@ -51,7 +51,7 @@ def test_raw_response_retrieve(self, client: Legalesign, respx_mock: MockRouter)
 
     @parametrize
     @pytest.mark.respx(base_url=base_url)
-    def test_streaming_response_retrieve(self, client: Legalesign, respx_mock: MockRouter) -> None:
+    def test_streaming_response_retrieve(self, client: LegalesignSDK, respx_mock: MockRouter) -> None:
         respx_mock.get("/pdf/docId/").mock(return_value=httpx.Response(200, json={"foo": "bar"}))
         with client.pdf.with_streaming_response.retrieve(
             "docId",
@@ -67,88 +67,12 @@ def test_streaming_response_retrieve(self, client: Legalesign, respx_mock: MockR
 
     @parametrize
     @pytest.mark.respx(base_url=base_url)
-    def test_path_params_retrieve(self, client: Legalesign) -> None:
+    def test_path_params_retrieve(self, client: LegalesignSDK) -> None:
         with pytest.raises(ValueError, match=r"Expected a non-empty value for `doc_id` but received ''"):
             client.pdf.with_raw_response.retrieve(
                 "",
             )
 
-    @parametrize
-    @pytest.mark.respx(base_url=base_url)
-    def test_method_create_preview(self, client: Legalesign, respx_mock: MockRouter) -> None:
-        respx_mock.post("/pdf/preview/").mock(return_value=httpx.Response(200, json={"foo": "bar"}))
-        pdf = client.pdf.create_preview(
-            group="/api/v1/group/IK-GV--w1tvt/",
-            is_signature_per_page=0,
-            signature_type=0,
-            signee_count=0,
-            text="text",
-        )
-        assert pdf.is_closed
-        assert pdf.json() == {"foo": "bar"}
-        assert cast(Any, pdf.is_closed) is True
-        assert isinstance(pdf, BinaryAPIResponse)
-
-    @parametrize
-    @pytest.mark.respx(base_url=base_url)
-    def test_method_create_preview_with_all_params(self, client: Legalesign, respx_mock: MockRouter) -> None:
-        respx_mock.post("/pdf/preview/").mock(return_value=httpx.Response(200, json={"foo": "bar"}))
-        pdf = client.pdf.create_preview(
-            group="/api/v1/group/IK-GV--w1tvt/",
-            is_signature_per_page=0,
-            signature_type=0,
-            signee_count=0,
-            text="text",
-            footer="footer",
-            footer_height=0,
-            header="header",
-            header_height=0,
-            pdfheader=True,
-            title="title",
-        )
-        assert pdf.is_closed
-        assert pdf.json() == {"foo": "bar"}
-        assert cast(Any, pdf.is_closed) is True
-        assert isinstance(pdf, BinaryAPIResponse)
-
-    @parametrize
-    @pytest.mark.respx(base_url=base_url)
-    def test_raw_response_create_preview(self, client: Legalesign, respx_mock: MockRouter) -> None:
-        respx_mock.post("/pdf/preview/").mock(return_value=httpx.Response(200, json={"foo": "bar"}))
-
-        pdf = client.pdf.with_raw_response.create_preview(
-            group="/api/v1/group/IK-GV--w1tvt/",
-            is_signature_per_page=0,
-            signature_type=0,
-            signee_count=0,
-            text="text",
-        )
-
-        assert pdf.is_closed is True
-        assert pdf.http_request.headers.get("X-Stainless-Lang") == "python"
-        assert pdf.json() == {"foo": "bar"}
-        assert isinstance(pdf, BinaryAPIResponse)
-
-    @parametrize
-    @pytest.mark.respx(base_url=base_url)
-    def test_streaming_response_create_preview(self, client: Legalesign, respx_mock: MockRouter) -> None:
-        respx_mock.post("/pdf/preview/").mock(return_value=httpx.Response(200, json={"foo": "bar"}))
-        with client.pdf.with_streaming_response.create_preview(
-            group="/api/v1/group/IK-GV--w1tvt/",
-            is_signature_per_page=0,
-            signature_type=0,
-            signee_count=0,
-            text="text",
-        ) as pdf:
-            assert not pdf.is_closed
-            assert pdf.http_request.headers.get("X-Stainless-Lang") == "python"
-
-            assert pdf.json() == {"foo": "bar"}
-            assert cast(Any, pdf.is_closed) is True
-            assert isinstance(pdf, StreamedBinaryAPIResponse)
-
-        assert cast(Any, pdf.is_closed) is True
-
 
 class TestAsyncPdf:
     parametrize = pytest.mark.parametrize(
@@ -157,7 +81,7 @@ class TestAsyncPdf:
 
     @parametrize
     @pytest.mark.respx(base_url=base_url)
-    async def test_method_retrieve(self, async_client: AsyncLegalesign, respx_mock: MockRouter) -> None:
+    async def test_method_retrieve(self, async_client: AsyncLegalesignSDK, respx_mock: MockRouter) -> None:
         respx_mock.get("/pdf/docId/").mock(return_value=httpx.Response(200, json={"foo": "bar"}))
         pdf = await async_client.pdf.retrieve(
             "docId",
@@ -169,7 +93,7 @@ async def test_method_retrieve(self, async_client: AsyncLegalesign, respx_mock:
 
     @parametrize
     @pytest.mark.respx(base_url=base_url)
-    async def test_raw_response_retrieve(self, async_client: AsyncLegalesign, respx_mock: MockRouter) -> None:
+    async def test_raw_response_retrieve(self, async_client: AsyncLegalesignSDK, respx_mock: MockRouter) -> None:
         respx_mock.get("/pdf/docId/").mock(return_value=httpx.Response(200, json={"foo": "bar"}))
 
         pdf = await async_client.pdf.with_raw_response.retrieve(
@@ -183,7 +107,7 @@ async def test_raw_response_retrieve(self, async_client: AsyncLegalesign, respx_
 
     @parametrize
     @pytest.mark.respx(base_url=base_url)
-    async def test_streaming_response_retrieve(self, async_client: AsyncLegalesign, respx_mock: MockRouter) -> None:
+    async def test_streaming_response_retrieve(self, async_client: AsyncLegalesignSDK, respx_mock: MockRouter) -> None:
         respx_mock.get("/pdf/docId/").mock(return_value=httpx.Response(200, json={"foo": "bar"}))
         async with async_client.pdf.with_streaming_response.retrieve(
             "docId",
@@ -199,88 +123,8 @@ async def test_streaming_response_retrieve(self, async_client: AsyncLegalesign,
 
     @parametrize
     @pytest.mark.respx(base_url=base_url)
-    async def test_path_params_retrieve(self, async_client: AsyncLegalesign) -> None:
+    async def test_path_params_retrieve(self, async_client: AsyncLegalesignSDK) -> None:
         with pytest.raises(ValueError, match=r"Expected a non-empty value for `doc_id` but received ''"):
             await async_client.pdf.with_raw_response.retrieve(
                 "",
             )
-
-    @parametrize
-    @pytest.mark.respx(base_url=base_url)
-    async def test_method_create_preview(self, async_client: AsyncLegalesign, respx_mock: MockRouter) -> None:
-        respx_mock.post("/pdf/preview/").mock(return_value=httpx.Response(200, json={"foo": "bar"}))
-        pdf = await async_client.pdf.create_preview(
-            group="/api/v1/group/IK-GV--w1tvt/",
-            is_signature_per_page=0,
-            signature_type=0,
-            signee_count=0,
-            text="text",
-        )
-        assert pdf.is_closed
-        assert await pdf.json() == {"foo": "bar"}
-        assert cast(Any, pdf.is_closed) is True
-        assert isinstance(pdf, AsyncBinaryAPIResponse)
-
-    @parametrize
-    @pytest.mark.respx(base_url=base_url)
-    async def test_method_create_preview_with_all_params(
-        self, async_client: AsyncLegalesign, respx_mock: MockRouter
-    ) -> None:
-        respx_mock.post("/pdf/preview/").mock(return_value=httpx.Response(200, json={"foo": "bar"}))
-        pdf = await async_client.pdf.create_preview(
-            group="/api/v1/group/IK-GV--w1tvt/",
-            is_signature_per_page=0,
-            signature_type=0,
-            signee_count=0,
-            text="text",
-            footer="footer",
-            footer_height=0,
-            header="header",
-            header_height=0,
-            pdfheader=True,
-            title="title",
-        )
-        assert pdf.is_closed
-        assert await pdf.json() == {"foo": "bar"}
-        assert cast(Any, pdf.is_closed) is True
-        assert isinstance(pdf, AsyncBinaryAPIResponse)
-
-    @parametrize
-    @pytest.mark.respx(base_url=base_url)
-    async def test_raw_response_create_preview(self, async_client: AsyncLegalesign, respx_mock: MockRouter) -> None:
-        respx_mock.post("/pdf/preview/").mock(return_value=httpx.Response(200, json={"foo": "bar"}))
-
-        pdf = await async_client.pdf.with_raw_response.create_preview(
-            group="/api/v1/group/IK-GV--w1tvt/",
-            is_signature_per_page=0,
-            signature_type=0,
-            signee_count=0,
-            text="text",
-        )
-
-        assert pdf.is_closed is True
-        assert pdf.http_request.headers.get("X-Stainless-Lang") == "python"
-        assert await pdf.json() == {"foo": "bar"}
-        assert isinstance(pdf, AsyncBinaryAPIResponse)
-
-    @parametrize
-    @pytest.mark.respx(base_url=base_url)
-    async def test_streaming_response_create_preview(
-        self, async_client: AsyncLegalesign, respx_mock: MockRouter
-    ) -> None:
-        respx_mock.post("/pdf/preview/").mock(return_value=httpx.Response(200, json={"foo": "bar"}))
-        async with async_client.pdf.with_streaming_response.create_preview(
-            group="/api/v1/group/IK-GV--w1tvt/",
-            is_signature_per_page=0,
-            signature_type=0,
-            signee_count=0,
-            text="text",
-        ) as pdf:
-            assert not pdf.is_closed
-            assert pdf.http_request.headers.get("X-Stainless-Lang") == "python"
-
-            assert await pdf.json() == {"foo": "bar"}
-            assert cast(Any, pdf.is_closed) is True
-            assert isinstance(pdf, AsyncStreamedBinaryAPIResponse)
-
-        assert cast(Any, pdf.is_closed) is True
diff --git a/tests/api_resources/test_signer.py b/tests/api_resources/test_signer.py
index ea26cae..f433618 100644
--- a/tests/api_resources/test_signer.py
+++ b/tests/api_resources/test_signer.py
@@ -7,13 +7,9 @@
 
 import pytest
 
-from legalesign import Legalesign, AsyncLegalesign
 from tests.utils import assert_matches_type
-from legalesign.types import (
-    SignerRetrieveResponse,
-    SignerRetrieveFieldsResponse,
-    SignerGetRejectionReasonResponse,
-)
+from legalesign_sdk import LegalesignSDK, AsyncLegalesignSDK
+from legalesign_sdk.types import SignerRetrieveResponse, SignerRetrieveFieldsResponse
 
 base_url = os.environ.get("TEST_API_BASE_URL", "http://127.0.0.1:4010")
 
@@ -23,7 +19,7 @@ class TestSigner:
 
     @pytest.mark.skip(reason="Prism tests are disabled")
     @parametrize
-    def test_method_retrieve(self, client: Legalesign) -> None:
+    def test_method_retrieve(self, client: LegalesignSDK) -> None:
         signer = client.signer.retrieve(
             "signerId",
         )
@@ -31,7 +27,7 @@ def test_method_retrieve(self, client: Legalesign) -> None:
 
     @pytest.mark.skip(reason="Prism tests are disabled")
     @parametrize
-    def test_raw_response_retrieve(self, client: Legalesign) -> None:
+    def test_raw_response_retrieve(self, client: LegalesignSDK) -> None:
         response = client.signer.with_raw_response.retrieve(
             "signerId",
         )
@@ -43,7 +39,7 @@ def test_raw_response_retrieve(self, client: Legalesign) -> None:
 
     @pytest.mark.skip(reason="Prism tests are disabled")
     @parametrize
-    def test_streaming_response_retrieve(self, client: Legalesign) -> None:
+    def test_streaming_response_retrieve(self, client: LegalesignSDK) -> None:
         with client.signer.with_streaming_response.retrieve(
             "signerId",
         ) as response:
@@ -57,7 +53,7 @@ def test_streaming_response_retrieve(self, client: Legalesign) -> None:
 
     @pytest.mark.skip(reason="Prism tests are disabled")
     @parametrize
-    def test_path_params_retrieve(self, client: Legalesign) -> None:
+    def test_path_params_retrieve(self, client: LegalesignSDK) -> None:
         with pytest.raises(ValueError, match=r"Expected a non-empty value for `signer_id` but received ''"):
             client.signer.with_raw_response.retrieve(
                 "",
@@ -65,7 +61,7 @@ def test_path_params_retrieve(self, client: Legalesign) -> None:
 
     @pytest.mark.skip(reason="Prism tests are disabled")
     @parametrize
-    def test_method_get_access_link(self, client: Legalesign) -> None:
+    def test_method_get_access_link(self, client: LegalesignSDK) -> None:
         signer = client.signer.get_access_link(
             "signerId",
         )
@@ -73,7 +69,7 @@ def test_method_get_access_link(self, client: Legalesign) -> None:
 
     @pytest.mark.skip(reason="Prism tests are disabled")
     @parametrize
-    def test_raw_response_get_access_link(self, client: Legalesign) -> None:
+    def test_raw_response_get_access_link(self, client: LegalesignSDK) -> None:
         response = client.signer.with_raw_response.get_access_link(
             "signerId",
         )
@@ -85,7 +81,7 @@ def test_raw_response_get_access_link(self, client: Legalesign) -> None:
 
     @pytest.mark.skip(reason="Prism tests are disabled")
     @parametrize
-    def test_streaming_response_get_access_link(self, client: Legalesign) -> None:
+    def test_streaming_response_get_access_link(self, client: LegalesignSDK) -> None:
         with client.signer.with_streaming_response.get_access_link(
             "signerId",
         ) as response:
@@ -99,7 +95,7 @@ def test_streaming_response_get_access_link(self, client: Legalesign) -> None:
 
     @pytest.mark.skip(reason="Prism tests are disabled")
     @parametrize
-    def test_path_params_get_access_link(self, client: Legalesign) -> None:
+    def test_path_params_get_access_link(self, client: LegalesignSDK) -> None:
         with pytest.raises(ValueError, match=r"Expected a non-empty value for `signer_id` but received ''"):
             client.signer.with_raw_response.get_access_link(
                 "",
@@ -107,105 +103,7 @@ def test_path_params_get_access_link(self, client: Legalesign) -> None:
 
     @pytest.mark.skip(reason="Prism tests are disabled")
     @parametrize
-    def test_method_get_rejection_reason(self, client: Legalesign) -> None:
-        signer = client.signer.get_rejection_reason(
-            "signerId",
-        )
-        assert_matches_type(SignerGetRejectionReasonResponse, signer, path=["response"])
-
-    @pytest.mark.skip(reason="Prism tests are disabled")
-    @parametrize
-    def test_raw_response_get_rejection_reason(self, client: Legalesign) -> None:
-        response = client.signer.with_raw_response.get_rejection_reason(
-            "signerId",
-        )
-
-        assert response.is_closed is True
-        assert response.http_request.headers.get("X-Stainless-Lang") == "python"
-        signer = response.parse()
-        assert_matches_type(SignerGetRejectionReasonResponse, signer, path=["response"])
-
-    @pytest.mark.skip(reason="Prism tests are disabled")
-    @parametrize
-    def test_streaming_response_get_rejection_reason(self, client: Legalesign) -> None:
-        with client.signer.with_streaming_response.get_rejection_reason(
-            "signerId",
-        ) as response:
-            assert not response.is_closed
-            assert response.http_request.headers.get("X-Stainless-Lang") == "python"
-
-            signer = response.parse()
-            assert_matches_type(SignerGetRejectionReasonResponse, signer, path=["response"])
-
-        assert cast(Any, response.is_closed) is True
-
-    @pytest.mark.skip(reason="Prism tests are disabled")
-    @parametrize
-    def test_path_params_get_rejection_reason(self, client: Legalesign) -> None:
-        with pytest.raises(ValueError, match=r"Expected a non-empty value for `signer_id` but received ''"):
-            client.signer.with_raw_response.get_rejection_reason(
-                "",
-            )
-
-    @pytest.mark.skip(reason="Prism tests are disabled")
-    @parametrize
-    def test_method_reset(self, client: Legalesign) -> None:
-        signer = client.signer.reset(
-            signer_id="signerId",
-            email="email",
-        )
-        assert signer is None
-
-    @pytest.mark.skip(reason="Prism tests are disabled")
-    @parametrize
-    def test_method_reset_with_all_params(self, client: Legalesign) -> None:
-        signer = client.signer.reset(
-            signer_id="signerId",
-            email="email",
-            notify=True,
-        )
-        assert signer is None
-
-    @pytest.mark.skip(reason="Prism tests are disabled")
-    @parametrize
-    def test_raw_response_reset(self, client: Legalesign) -> None:
-        response = client.signer.with_raw_response.reset(
-            signer_id="signerId",
-            email="email",
-        )
-
-        assert response.is_closed is True
-        assert response.http_request.headers.get("X-Stainless-Lang") == "python"
-        signer = response.parse()
-        assert signer is None
-
-    @pytest.mark.skip(reason="Prism tests are disabled")
-    @parametrize
-    def test_streaming_response_reset(self, client: Legalesign) -> None:
-        with client.signer.with_streaming_response.reset(
-            signer_id="signerId",
-            email="email",
-        ) as response:
-            assert not response.is_closed
-            assert response.http_request.headers.get("X-Stainless-Lang") == "python"
-
-            signer = response.parse()
-            assert signer is None
-
-        assert cast(Any, response.is_closed) is True
-
-    @pytest.mark.skip(reason="Prism tests are disabled")
-    @parametrize
-    def test_path_params_reset(self, client: Legalesign) -> None:
-        with pytest.raises(ValueError, match=r"Expected a non-empty value for `signer_id` but received ''"):
-            client.signer.with_raw_response.reset(
-                signer_id="",
-                email="email",
-            )
-
-    @pytest.mark.skip(reason="Prism tests are disabled")
-    @parametrize
-    def test_method_retrieve_fields(self, client: Legalesign) -> None:
+    def test_method_retrieve_fields(self, client: LegalesignSDK) -> None:
         signer = client.signer.retrieve_fields(
             "signerId",
         )
@@ -213,7 +111,7 @@ def test_method_retrieve_fields(self, client: Legalesign) -> None:
 
     @pytest.mark.skip(reason="Prism tests are disabled")
     @parametrize
-    def test_raw_response_retrieve_fields(self, client: Legalesign) -> None:
+    def test_raw_response_retrieve_fields(self, client: LegalesignSDK) -> None:
         response = client.signer.with_raw_response.retrieve_fields(
             "signerId",
         )
@@ -225,7 +123,7 @@ def test_raw_response_retrieve_fields(self, client: Legalesign) -> None:
 
     @pytest.mark.skip(reason="Prism tests are disabled")
     @parametrize
-    def test_streaming_response_retrieve_fields(self, client: Legalesign) -> None:
+    def test_streaming_response_retrieve_fields(self, client: LegalesignSDK) -> None:
         with client.signer.with_streaming_response.retrieve_fields(
             "signerId",
         ) as response:
@@ -239,7 +137,7 @@ def test_streaming_response_retrieve_fields(self, client: Legalesign) -> None:
 
     @pytest.mark.skip(reason="Prism tests are disabled")
     @parametrize
-    def test_path_params_retrieve_fields(self, client: Legalesign) -> None:
+    def test_path_params_retrieve_fields(self, client: LegalesignSDK) -> None:
         with pytest.raises(ValueError, match=r"Expected a non-empty value for `signer_id` but received ''"):
             client.signer.with_raw_response.retrieve_fields(
                 "",
@@ -247,7 +145,7 @@ def test_path_params_retrieve_fields(self, client: Legalesign) -> None:
 
     @pytest.mark.skip(reason="Prism tests are disabled")
     @parametrize
-    def test_method_send_reminder(self, client: Legalesign) -> None:
+    def test_method_send_reminder(self, client: LegalesignSDK) -> None:
         signer = client.signer.send_reminder(
             signer_id="signerId",
         )
@@ -255,7 +153,7 @@ def test_method_send_reminder(self, client: Legalesign) -> None:
 
     @pytest.mark.skip(reason="Prism tests are disabled")
     @parametrize
-    def test_method_send_reminder_with_all_params(self, client: Legalesign) -> None:
+    def test_method_send_reminder_with_all_params(self, client: LegalesignSDK) -> None:
         signer = client.signer.send_reminder(
             signer_id="signerId",
             text="text",
@@ -264,7 +162,7 @@ def test_method_send_reminder_with_all_params(self, client: Legalesign) -> None:
 
     @pytest.mark.skip(reason="Prism tests are disabled")
     @parametrize
-    def test_raw_response_send_reminder(self, client: Legalesign) -> None:
+    def test_raw_response_send_reminder(self, client: LegalesignSDK) -> None:
         response = client.signer.with_raw_response.send_reminder(
             signer_id="signerId",
         )
@@ -276,7 +174,7 @@ def test_raw_response_send_reminder(self, client: Legalesign) -> None:
 
     @pytest.mark.skip(reason="Prism tests are disabled")
     @parametrize
-    def test_streaming_response_send_reminder(self, client: Legalesign) -> None:
+    def test_streaming_response_send_reminder(self, client: LegalesignSDK) -> None:
         with client.signer.with_streaming_response.send_reminder(
             signer_id="signerId",
         ) as response:
@@ -290,7 +188,7 @@ def test_streaming_response_send_reminder(self, client: Legalesign) -> None:
 
     @pytest.mark.skip(reason="Prism tests are disabled")
     @parametrize
-    def test_path_params_send_reminder(self, client: Legalesign) -> None:
+    def test_path_params_send_reminder(self, client: LegalesignSDK) -> None:
         with pytest.raises(ValueError, match=r"Expected a non-empty value for `signer_id` but received ''"):
             client.signer.with_raw_response.send_reminder(
                 signer_id="",
@@ -304,7 +202,7 @@ class TestAsyncSigner:
 
     @pytest.mark.skip(reason="Prism tests are disabled")
     @parametrize
-    async def test_method_retrieve(self, async_client: AsyncLegalesign) -> None:
+    async def test_method_retrieve(self, async_client: AsyncLegalesignSDK) -> None:
         signer = await async_client.signer.retrieve(
             "signerId",
         )
@@ -312,7 +210,7 @@ async def test_method_retrieve(self, async_client: AsyncLegalesign) -> None:
 
     @pytest.mark.skip(reason="Prism tests are disabled")
     @parametrize
-    async def test_raw_response_retrieve(self, async_client: AsyncLegalesign) -> None:
+    async def test_raw_response_retrieve(self, async_client: AsyncLegalesignSDK) -> None:
         response = await async_client.signer.with_raw_response.retrieve(
             "signerId",
         )
@@ -324,7 +222,7 @@ async def test_raw_response_retrieve(self, async_client: AsyncLegalesign) -> Non
 
     @pytest.mark.skip(reason="Prism tests are disabled")
     @parametrize
-    async def test_streaming_response_retrieve(self, async_client: AsyncLegalesign) -> None:
+    async def test_streaming_response_retrieve(self, async_client: AsyncLegalesignSDK) -> None:
         async with async_client.signer.with_streaming_response.retrieve(
             "signerId",
         ) as response:
@@ -338,7 +236,7 @@ async def test_streaming_response_retrieve(self, async_client: AsyncLegalesign)
 
     @pytest.mark.skip(reason="Prism tests are disabled")
     @parametrize
-    async def test_path_params_retrieve(self, async_client: AsyncLegalesign) -> None:
+    async def test_path_params_retrieve(self, async_client: AsyncLegalesignSDK) -> None:
         with pytest.raises(ValueError, match=r"Expected a non-empty value for `signer_id` but received ''"):
             await async_client.signer.with_raw_response.retrieve(
                 "",
@@ -346,7 +244,7 @@ async def test_path_params_retrieve(self, async_client: AsyncLegalesign) -> None
 
     @pytest.mark.skip(reason="Prism tests are disabled")
     @parametrize
-    async def test_method_get_access_link(self, async_client: AsyncLegalesign) -> None:
+    async def test_method_get_access_link(self, async_client: AsyncLegalesignSDK) -> None:
         signer = await async_client.signer.get_access_link(
             "signerId",
         )
@@ -354,7 +252,7 @@ async def test_method_get_access_link(self, async_client: AsyncLegalesign) -> No
 
     @pytest.mark.skip(reason="Prism tests are disabled")
     @parametrize
-    async def test_raw_response_get_access_link(self, async_client: AsyncLegalesign) -> None:
+    async def test_raw_response_get_access_link(self, async_client: AsyncLegalesignSDK) -> None:
         response = await async_client.signer.with_raw_response.get_access_link(
             "signerId",
         )
@@ -366,7 +264,7 @@ async def test_raw_response_get_access_link(self, async_client: AsyncLegalesign)
 
     @pytest.mark.skip(reason="Prism tests are disabled")
     @parametrize
-    async def test_streaming_response_get_access_link(self, async_client: AsyncLegalesign) -> None:
+    async def test_streaming_response_get_access_link(self, async_client: AsyncLegalesignSDK) -> None:
         async with async_client.signer.with_streaming_response.get_access_link(
             "signerId",
         ) as response:
@@ -380,7 +278,7 @@ async def test_streaming_response_get_access_link(self, async_client: AsyncLegal
 
     @pytest.mark.skip(reason="Prism tests are disabled")
     @parametrize
-    async def test_path_params_get_access_link(self, async_client: AsyncLegalesign) -> None:
+    async def test_path_params_get_access_link(self, async_client: AsyncLegalesignSDK) -> None:
         with pytest.raises(ValueError, match=r"Expected a non-empty value for `signer_id` but received ''"):
             await async_client.signer.with_raw_response.get_access_link(
                 "",
@@ -388,105 +286,7 @@ async def test_path_params_get_access_link(self, async_client: AsyncLegalesign)
 
     @pytest.mark.skip(reason="Prism tests are disabled")
     @parametrize
-    async def test_method_get_rejection_reason(self, async_client: AsyncLegalesign) -> None:
-        signer = await async_client.signer.get_rejection_reason(
-            "signerId",
-        )
-        assert_matches_type(SignerGetRejectionReasonResponse, signer, path=["response"])
-
-    @pytest.mark.skip(reason="Prism tests are disabled")
-    @parametrize
-    async def test_raw_response_get_rejection_reason(self, async_client: AsyncLegalesign) -> None:
-        response = await async_client.signer.with_raw_response.get_rejection_reason(
-            "signerId",
-        )
-
-        assert response.is_closed is True
-        assert response.http_request.headers.get("X-Stainless-Lang") == "python"
-        signer = await response.parse()
-        assert_matches_type(SignerGetRejectionReasonResponse, signer, path=["response"])
-
-    @pytest.mark.skip(reason="Prism tests are disabled")
-    @parametrize
-    async def test_streaming_response_get_rejection_reason(self, async_client: AsyncLegalesign) -> None:
-        async with async_client.signer.with_streaming_response.get_rejection_reason(
-            "signerId",
-        ) as response:
-            assert not response.is_closed
-            assert response.http_request.headers.get("X-Stainless-Lang") == "python"
-
-            signer = await response.parse()
-            assert_matches_type(SignerGetRejectionReasonResponse, signer, path=["response"])
-
-        assert cast(Any, response.is_closed) is True
-
-    @pytest.mark.skip(reason="Prism tests are disabled")
-    @parametrize
-    async def test_path_params_get_rejection_reason(self, async_client: AsyncLegalesign) -> None:
-        with pytest.raises(ValueError, match=r"Expected a non-empty value for `signer_id` but received ''"):
-            await async_client.signer.with_raw_response.get_rejection_reason(
-                "",
-            )
-
-    @pytest.mark.skip(reason="Prism tests are disabled")
-    @parametrize
-    async def test_method_reset(self, async_client: AsyncLegalesign) -> None:
-        signer = await async_client.signer.reset(
-            signer_id="signerId",
-            email="email",
-        )
-        assert signer is None
-
-    @pytest.mark.skip(reason="Prism tests are disabled")
-    @parametrize
-    async def test_method_reset_with_all_params(self, async_client: AsyncLegalesign) -> None:
-        signer = await async_client.signer.reset(
-            signer_id="signerId",
-            email="email",
-            notify=True,
-        )
-        assert signer is None
-
-    @pytest.mark.skip(reason="Prism tests are disabled")
-    @parametrize
-    async def test_raw_response_reset(self, async_client: AsyncLegalesign) -> None:
-        response = await async_client.signer.with_raw_response.reset(
-            signer_id="signerId",
-            email="email",
-        )
-
-        assert response.is_closed is True
-        assert response.http_request.headers.get("X-Stainless-Lang") == "python"
-        signer = await response.parse()
-        assert signer is None
-
-    @pytest.mark.skip(reason="Prism tests are disabled")
-    @parametrize
-    async def test_streaming_response_reset(self, async_client: AsyncLegalesign) -> None:
-        async with async_client.signer.with_streaming_response.reset(
-            signer_id="signerId",
-            email="email",
-        ) as response:
-            assert not response.is_closed
-            assert response.http_request.headers.get("X-Stainless-Lang") == "python"
-
-            signer = await response.parse()
-            assert signer is None
-
-        assert cast(Any, response.is_closed) is True
-
-    @pytest.mark.skip(reason="Prism tests are disabled")
-    @parametrize
-    async def test_path_params_reset(self, async_client: AsyncLegalesign) -> None:
-        with pytest.raises(ValueError, match=r"Expected a non-empty value for `signer_id` but received ''"):
-            await async_client.signer.with_raw_response.reset(
-                signer_id="",
-                email="email",
-            )
-
-    @pytest.mark.skip(reason="Prism tests are disabled")
-    @parametrize
-    async def test_method_retrieve_fields(self, async_client: AsyncLegalesign) -> None:
+    async def test_method_retrieve_fields(self, async_client: AsyncLegalesignSDK) -> None:
         signer = await async_client.signer.retrieve_fields(
             "signerId",
         )
@@ -494,7 +294,7 @@ async def test_method_retrieve_fields(self, async_client: AsyncLegalesign) -> No
 
     @pytest.mark.skip(reason="Prism tests are disabled")
     @parametrize
-    async def test_raw_response_retrieve_fields(self, async_client: AsyncLegalesign) -> None:
+    async def test_raw_response_retrieve_fields(self, async_client: AsyncLegalesignSDK) -> None:
         response = await async_client.signer.with_raw_response.retrieve_fields(
             "signerId",
         )
@@ -506,7 +306,7 @@ async def test_raw_response_retrieve_fields(self, async_client: AsyncLegalesign)
 
     @pytest.mark.skip(reason="Prism tests are disabled")
     @parametrize
-    async def test_streaming_response_retrieve_fields(self, async_client: AsyncLegalesign) -> None:
+    async def test_streaming_response_retrieve_fields(self, async_client: AsyncLegalesignSDK) -> None:
         async with async_client.signer.with_streaming_response.retrieve_fields(
             "signerId",
         ) as response:
@@ -520,7 +320,7 @@ async def test_streaming_response_retrieve_fields(self, async_client: AsyncLegal
 
     @pytest.mark.skip(reason="Prism tests are disabled")
     @parametrize
-    async def test_path_params_retrieve_fields(self, async_client: AsyncLegalesign) -> None:
+    async def test_path_params_retrieve_fields(self, async_client: AsyncLegalesignSDK) -> None:
         with pytest.raises(ValueError, match=r"Expected a non-empty value for `signer_id` but received ''"):
             await async_client.signer.with_raw_response.retrieve_fields(
                 "",
@@ -528,7 +328,7 @@ async def test_path_params_retrieve_fields(self, async_client: AsyncLegalesign)
 
     @pytest.mark.skip(reason="Prism tests are disabled")
     @parametrize
-    async def test_method_send_reminder(self, async_client: AsyncLegalesign) -> None:
+    async def test_method_send_reminder(self, async_client: AsyncLegalesignSDK) -> None:
         signer = await async_client.signer.send_reminder(
             signer_id="signerId",
         )
@@ -536,7 +336,7 @@ async def test_method_send_reminder(self, async_client: AsyncLegalesign) -> None
 
     @pytest.mark.skip(reason="Prism tests are disabled")
     @parametrize
-    async def test_method_send_reminder_with_all_params(self, async_client: AsyncLegalesign) -> None:
+    async def test_method_send_reminder_with_all_params(self, async_client: AsyncLegalesignSDK) -> None:
         signer = await async_client.signer.send_reminder(
             signer_id="signerId",
             text="text",
@@ -545,7 +345,7 @@ async def test_method_send_reminder_with_all_params(self, async_client: AsyncLeg
 
     @pytest.mark.skip(reason="Prism tests are disabled")
     @parametrize
-    async def test_raw_response_send_reminder(self, async_client: AsyncLegalesign) -> None:
+    async def test_raw_response_send_reminder(self, async_client: AsyncLegalesignSDK) -> None:
         response = await async_client.signer.with_raw_response.send_reminder(
             signer_id="signerId",
         )
@@ -557,7 +357,7 @@ async def test_raw_response_send_reminder(self, async_client: AsyncLegalesign) -
 
     @pytest.mark.skip(reason="Prism tests are disabled")
     @parametrize
-    async def test_streaming_response_send_reminder(self, async_client: AsyncLegalesign) -> None:
+    async def test_streaming_response_send_reminder(self, async_client: AsyncLegalesignSDK) -> None:
         async with async_client.signer.with_streaming_response.send_reminder(
             signer_id="signerId",
         ) as response:
@@ -571,7 +371,7 @@ async def test_streaming_response_send_reminder(self, async_client: AsyncLegales
 
     @pytest.mark.skip(reason="Prism tests are disabled")
     @parametrize
-    async def test_path_params_send_reminder(self, async_client: AsyncLegalesign) -> None:
+    async def test_path_params_send_reminder(self, async_client: AsyncLegalesignSDK) -> None:
         with pytest.raises(ValueError, match=r"Expected a non-empty value for `signer_id` but received ''"):
             await async_client.signer.with_raw_response.send_reminder(
                 signer_id="",
diff --git a/tests/api_resources/test_status.py b/tests/api_resources/test_status.py
index 2fb3d45..0aae363 100644
--- a/tests/api_resources/test_status.py
+++ b/tests/api_resources/test_status.py
@@ -7,9 +7,9 @@
 
 import pytest
 
-from legalesign import Legalesign, AsyncLegalesign
 from tests.utils import assert_matches_type
-from legalesign.types import StatusResponse, StatusRetrieveAllResponse
+from legalesign_sdk import LegalesignSDK, AsyncLegalesignSDK
+from legalesign_sdk.types import StatusRetrieveResponse
 
 base_url = os.environ.get("TEST_API_BASE_URL", "http://127.0.0.1:4010")
 
@@ -19,15 +19,15 @@ class TestStatus:
 
     @pytest.mark.skip(reason="Prism tests are disabled")
     @parametrize
-    def test_method_retrieve(self, client: Legalesign) -> None:
+    def test_method_retrieve(self, client: LegalesignSDK) -> None:
         status = client.status.retrieve(
             "docId",
         )
-        assert_matches_type(StatusResponse, status, path=["response"])
+        assert_matches_type(StatusRetrieveResponse, status, path=["response"])
 
     @pytest.mark.skip(reason="Prism tests are disabled")
     @parametrize
-    def test_raw_response_retrieve(self, client: Legalesign) -> None:
+    def test_raw_response_retrieve(self, client: LegalesignSDK) -> None:
         response = client.status.with_raw_response.retrieve(
             "docId",
         )
@@ -35,11 +35,11 @@ def test_raw_response_retrieve(self, client: Legalesign) -> None:
         assert response.is_closed is True
         assert response.http_request.headers.get("X-Stainless-Lang") == "python"
         status = response.parse()
-        assert_matches_type(StatusResponse, status, path=["response"])
+        assert_matches_type(StatusRetrieveResponse, status, path=["response"])
 
     @pytest.mark.skip(reason="Prism tests are disabled")
     @parametrize
-    def test_streaming_response_retrieve(self, client: Legalesign) -> None:
+    def test_streaming_response_retrieve(self, client: LegalesignSDK) -> None:
         with client.status.with_streaming_response.retrieve(
             "docId",
         ) as response:
@@ -47,56 +47,18 @@ def test_streaming_response_retrieve(self, client: Legalesign) -> None:
             assert response.http_request.headers.get("X-Stainless-Lang") == "python"
 
             status = response.parse()
-            assert_matches_type(StatusResponse, status, path=["response"])
+            assert_matches_type(StatusRetrieveResponse, status, path=["response"])
 
         assert cast(Any, response.is_closed) is True
 
     @pytest.mark.skip(reason="Prism tests are disabled")
     @parametrize
-    def test_path_params_retrieve(self, client: Legalesign) -> None:
+    def test_path_params_retrieve(self, client: LegalesignSDK) -> None:
         with pytest.raises(ValueError, match=r"Expected a non-empty value for `doc_id` but received ''"):
             client.status.with_raw_response.retrieve(
                 "",
             )
 
-    @pytest.mark.skip(reason="Prism tests are disabled")
-    @parametrize
-    def test_method_retrieve_all(self, client: Legalesign) -> None:
-        status = client.status.retrieve_all()
-        assert_matches_type(StatusRetrieveAllResponse, status, path=["response"])
-
-    @pytest.mark.skip(reason="Prism tests are disabled")
-    @parametrize
-    def test_method_retrieve_all_with_all_params(self, client: Legalesign) -> None:
-        status = client.status.retrieve_all(
-            filter="filter",
-            limit=0,
-            offset=0,
-        )
-        assert_matches_type(StatusRetrieveAllResponse, status, path=["response"])
-
-    @pytest.mark.skip(reason="Prism tests are disabled")
-    @parametrize
-    def test_raw_response_retrieve_all(self, client: Legalesign) -> None:
-        response = client.status.with_raw_response.retrieve_all()
-
-        assert response.is_closed is True
-        assert response.http_request.headers.get("X-Stainless-Lang") == "python"
-        status = response.parse()
-        assert_matches_type(StatusRetrieveAllResponse, status, path=["response"])
-
-    @pytest.mark.skip(reason="Prism tests are disabled")
-    @parametrize
-    def test_streaming_response_retrieve_all(self, client: Legalesign) -> None:
-        with client.status.with_streaming_response.retrieve_all() as response:
-            assert not response.is_closed
-            assert response.http_request.headers.get("X-Stainless-Lang") == "python"
-
-            status = response.parse()
-            assert_matches_type(StatusRetrieveAllResponse, status, path=["response"])
-
-        assert cast(Any, response.is_closed) is True
-
 
 class TestAsyncStatus:
     parametrize = pytest.mark.parametrize(
@@ -105,15 +67,15 @@ class TestAsyncStatus:
 
     @pytest.mark.skip(reason="Prism tests are disabled")
     @parametrize
-    async def test_method_retrieve(self, async_client: AsyncLegalesign) -> None:
+    async def test_method_retrieve(self, async_client: AsyncLegalesignSDK) -> None:
         status = await async_client.status.retrieve(
             "docId",
         )
-        assert_matches_type(StatusResponse, status, path=["response"])
+        assert_matches_type(StatusRetrieveResponse, status, path=["response"])
 
     @pytest.mark.skip(reason="Prism tests are disabled")
     @parametrize
-    async def test_raw_response_retrieve(self, async_client: AsyncLegalesign) -> None:
+    async def test_raw_response_retrieve(self, async_client: AsyncLegalesignSDK) -> None:
         response = await async_client.status.with_raw_response.retrieve(
             "docId",
         )
@@ -121,11 +83,11 @@ async def test_raw_response_retrieve(self, async_client: AsyncLegalesign) -> Non
         assert response.is_closed is True
         assert response.http_request.headers.get("X-Stainless-Lang") == "python"
         status = await response.parse()
-        assert_matches_type(StatusResponse, status, path=["response"])
+        assert_matches_type(StatusRetrieveResponse, status, path=["response"])
 
     @pytest.mark.skip(reason="Prism tests are disabled")
     @parametrize
-    async def test_streaming_response_retrieve(self, async_client: AsyncLegalesign) -> None:
+    async def test_streaming_response_retrieve(self, async_client: AsyncLegalesignSDK) -> None:
         async with async_client.status.with_streaming_response.retrieve(
             "docId",
         ) as response:
@@ -133,52 +95,14 @@ async def test_streaming_response_retrieve(self, async_client: AsyncLegalesign)
             assert response.http_request.headers.get("X-Stainless-Lang") == "python"
 
             status = await response.parse()
-            assert_matches_type(StatusResponse, status, path=["response"])
+            assert_matches_type(StatusRetrieveResponse, status, path=["response"])
 
         assert cast(Any, response.is_closed) is True
 
     @pytest.mark.skip(reason="Prism tests are disabled")
     @parametrize
-    async def test_path_params_retrieve(self, async_client: AsyncLegalesign) -> None:
+    async def test_path_params_retrieve(self, async_client: AsyncLegalesignSDK) -> None:
         with pytest.raises(ValueError, match=r"Expected a non-empty value for `doc_id` but received ''"):
             await async_client.status.with_raw_response.retrieve(
                 "",
             )
-
-    @pytest.mark.skip(reason="Prism tests are disabled")
-    @parametrize
-    async def test_method_retrieve_all(self, async_client: AsyncLegalesign) -> None:
-        status = await async_client.status.retrieve_all()
-        assert_matches_type(StatusRetrieveAllResponse, status, path=["response"])
-
-    @pytest.mark.skip(reason="Prism tests are disabled")
-    @parametrize
-    async def test_method_retrieve_all_with_all_params(self, async_client: AsyncLegalesign) -> None:
-        status = await async_client.status.retrieve_all(
-            filter="filter",
-            limit=0,
-            offset=0,
-        )
-        assert_matches_type(StatusRetrieveAllResponse, status, path=["response"])
-
-    @pytest.mark.skip(reason="Prism tests are disabled")
-    @parametrize
-    async def test_raw_response_retrieve_all(self, async_client: AsyncLegalesign) -> None:
-        response = await async_client.status.with_raw_response.retrieve_all()
-
-        assert response.is_closed is True
-        assert response.http_request.headers.get("X-Stainless-Lang") == "python"
-        status = await response.parse()
-        assert_matches_type(StatusRetrieveAllResponse, status, path=["response"])
-
-    @pytest.mark.skip(reason="Prism tests are disabled")
-    @parametrize
-    async def test_streaming_response_retrieve_all(self, async_client: AsyncLegalesign) -> None:
-        async with async_client.status.with_streaming_response.retrieve_all() as response:
-            assert not response.is_closed
-            assert response.http_request.headers.get("X-Stainless-Lang") == "python"
-
-            status = await response.parse()
-            assert_matches_type(StatusRetrieveAllResponse, status, path=["response"])
-
-        assert cast(Any, response.is_closed) is True
diff --git a/tests/api_resources/test_subscribe.py b/tests/api_resources/test_subscribe.py
deleted file mode 100644
index 2a33a8b..0000000
--- a/tests/api_resources/test_subscribe.py
+++ /dev/null
@@ -1,118 +0,0 @@
-# File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.
-
-from __future__ import annotations
-
-import os
-from typing import Any, cast
-
-import pytest
-
-from legalesign import Legalesign, AsyncLegalesign
-
-base_url = os.environ.get("TEST_API_BASE_URL", "http://127.0.0.1:4010")
-
-
-class TestSubscribe:
-    parametrize = pytest.mark.parametrize("client", [False, True], indirect=True, ids=["loose", "strict"])
-
-    @pytest.mark.skip(reason="Prism tests are disabled")
-    @parametrize
-    def test_method_create_webhook(self, client: Legalesign) -> None:
-        subscribe = client.subscribe.create_webhook(
-            notify="realtime",
-            url="https://",
-        )
-        assert subscribe is None
-
-    @pytest.mark.skip(reason="Prism tests are disabled")
-    @parametrize
-    def test_method_create_webhook_with_all_params(self, client: Legalesign) -> None:
-        subscribe = client.subscribe.create_webhook(
-            notify="realtime",
-            url="https://",
-            event_filter="",
-            group="group",
-        )
-        assert subscribe is None
-
-    @pytest.mark.skip(reason="Prism tests are disabled")
-    @parametrize
-    def test_raw_response_create_webhook(self, client: Legalesign) -> None:
-        response = client.subscribe.with_raw_response.create_webhook(
-            notify="realtime",
-            url="https://",
-        )
-
-        assert response.is_closed is True
-        assert response.http_request.headers.get("X-Stainless-Lang") == "python"
-        subscribe = response.parse()
-        assert subscribe is None
-
-    @pytest.mark.skip(reason="Prism tests are disabled")
-    @parametrize
-    def test_streaming_response_create_webhook(self, client: Legalesign) -> None:
-        with client.subscribe.with_streaming_response.create_webhook(
-            notify="realtime",
-            url="https://",
-        ) as response:
-            assert not response.is_closed
-            assert response.http_request.headers.get("X-Stainless-Lang") == "python"
-
-            subscribe = response.parse()
-            assert subscribe is None
-
-        assert cast(Any, response.is_closed) is True
-
-
-class TestAsyncSubscribe:
-    parametrize = pytest.mark.parametrize(
-        "async_client", [False, True, {"http_client": "aiohttp"}], indirect=True, ids=["loose", "strict", "aiohttp"]
-    )
-
-    @pytest.mark.skip(reason="Prism tests are disabled")
-    @parametrize
-    async def test_method_create_webhook(self, async_client: AsyncLegalesign) -> None:
-        subscribe = await async_client.subscribe.create_webhook(
-            notify="realtime",
-            url="https://",
-        )
-        assert subscribe is None
-
-    @pytest.mark.skip(reason="Prism tests are disabled")
-    @parametrize
-    async def test_method_create_webhook_with_all_params(self, async_client: AsyncLegalesign) -> None:
-        subscribe = await async_client.subscribe.create_webhook(
-            notify="realtime",
-            url="https://",
-            event_filter="",
-            group="group",
-        )
-        assert subscribe is None
-
-    @pytest.mark.skip(reason="Prism tests are disabled")
-    @parametrize
-    async def test_raw_response_create_webhook(self, async_client: AsyncLegalesign) -> None:
-        response = await async_client.subscribe.with_raw_response.create_webhook(
-            notify="realtime",
-            url="https://",
-        )
-
-        assert response.is_closed is True
-        assert response.http_request.headers.get("X-Stainless-Lang") == "python"
-        subscribe = await response.parse()
-        assert subscribe is None
-
-    @pytest.mark.skip(reason="Prism tests are disabled")
-    @parametrize
-    async def test_streaming_response_create_webhook(self, async_client: AsyncLegalesign) -> None:
-        async with async_client.subscribe.with_streaming_response.create_webhook(
-            notify="realtime",
-            url="https://",
-        ) as response:
-            assert not response.is_closed
-            assert response.http_request.headers.get("X-Stainless-Lang") == "python"
-
-            subscribe = await response.parse()
-            assert subscribe is None
-
-        assert cast(Any, response.is_closed) is True
diff --git a/tests/api_resources/test_template.py b/tests/api_resources/test_template.py
index be69f5e..c1a3c3c 100644
--- a/tests/api_resources/test_template.py
+++ b/tests/api_resources/test_template.py
@@ -7,9 +7,9 @@
 
 import pytest
 
-from legalesign import Legalesign, AsyncLegalesign
 from tests.utils import assert_matches_type
-from legalesign.types import (
+from legalesign_sdk import LegalesignSDK, AsyncLegalesignSDK
+from legalesign_sdk.types import (
     TemplateListResponse,
     TemplateRetrieveResponse,
 )
@@ -22,7 +22,7 @@ class TestTemplate:
 
     @pytest.mark.skip(reason="Prism tests are disabled")
     @parametrize
-    def test_method_create(self, client: Legalesign) -> None:
+    def test_method_create(self, client: LegalesignSDK) -> None:
         template = client.template.create(
             group="/api/v1/group/IK-GV--w1tvt/",
             latest_text="latest_text",
@@ -32,7 +32,7 @@ def test_method_create(self, client: Legalesign) -> None:
 
     @pytest.mark.skip(reason="Prism tests are disabled")
     @parametrize
-    def test_method_create_with_all_params(self, client: Legalesign) -> None:
+    def test_method_create_with_all_params(self, client: LegalesignSDK) -> None:
         template = client.template.create(
             group="/api/v1/group/IK-GV--w1tvt/",
             latest_text="latest_text",
@@ -43,7 +43,7 @@ def test_method_create_with_all_params(self, client: Legalesign) -> None:
 
     @pytest.mark.skip(reason="Prism tests are disabled")
     @parametrize
-    def test_raw_response_create(self, client: Legalesign) -> None:
+    def test_raw_response_create(self, client: LegalesignSDK) -> None:
         response = client.template.with_raw_response.create(
             group="/api/v1/group/IK-GV--w1tvt/",
             latest_text="latest_text",
@@ -57,7 +57,7 @@ def test_raw_response_create(self, client: Legalesign) -> None:
 
     @pytest.mark.skip(reason="Prism tests are disabled")
     @parametrize
-    def test_streaming_response_create(self, client: Legalesign) -> None:
+    def test_streaming_response_create(self, client: LegalesignSDK) -> None:
         with client.template.with_streaming_response.create(
             group="/api/v1/group/IK-GV--w1tvt/",
             latest_text="latest_text",
@@ -73,7 +73,7 @@ def test_streaming_response_create(self, client: Legalesign) -> None:
 
     @pytest.mark.skip(reason="Prism tests are disabled")
     @parametrize
-    def test_method_retrieve(self, client: Legalesign) -> None:
+    def test_method_retrieve(self, client: LegalesignSDK) -> None:
         template = client.template.retrieve(
             "182bd5e5-6e1a-4fe4-a799-aa6d9a6ab26e",
         )
@@ -81,7 +81,7 @@ def test_method_retrieve(self, client: Legalesign) -> None:
 
     @pytest.mark.skip(reason="Prism tests are disabled")
     @parametrize
-    def test_raw_response_retrieve(self, client: Legalesign) -> None:
+    def test_raw_response_retrieve(self, client: LegalesignSDK) -> None:
         response = client.template.with_raw_response.retrieve(
             "182bd5e5-6e1a-4fe4-a799-aa6d9a6ab26e",
         )
@@ -93,7 +93,7 @@ def test_raw_response_retrieve(self, client: Legalesign) -> None:
 
     @pytest.mark.skip(reason="Prism tests are disabled")
     @parametrize
-    def test_streaming_response_retrieve(self, client: Legalesign) -> None:
+    def test_streaming_response_retrieve(self, client: LegalesignSDK) -> None:
         with client.template.with_streaming_response.retrieve(
             "182bd5e5-6e1a-4fe4-a799-aa6d9a6ab26e",
         ) as response:
@@ -107,7 +107,7 @@ def test_streaming_response_retrieve(self, client: Legalesign) -> None:
 
     @pytest.mark.skip(reason="Prism tests are disabled")
     @parametrize
-    def test_path_params_retrieve(self, client: Legalesign) -> None:
+    def test_path_params_retrieve(self, client: LegalesignSDK) -> None:
         with pytest.raises(ValueError, match=r"Expected a non-empty value for `template_id` but received ''"):
             client.template.with_raw_response.retrieve(
                 "",
@@ -115,7 +115,7 @@ def test_path_params_retrieve(self, client: Legalesign) -> None:
 
     @pytest.mark.skip(reason="Prism tests are disabled")
     @parametrize
-    def test_method_update(self, client: Legalesign) -> None:
+    def test_method_update(self, client: LegalesignSDK) -> None:
         template = client.template.update(
             template_id="182bd5e5-6e1a-4fe4-a799-aa6d9a6ab26e",
             body="body",
@@ -124,7 +124,7 @@ def test_method_update(self, client: Legalesign) -> None:
 
     @pytest.mark.skip(reason="Prism tests are disabled")
     @parametrize
-    def test_raw_response_update(self, client: Legalesign) -> None:
+    def test_raw_response_update(self, client: LegalesignSDK) -> None:
         response = client.template.with_raw_response.update(
             template_id="182bd5e5-6e1a-4fe4-a799-aa6d9a6ab26e",
             body="body",
@@ -137,7 +137,7 @@ def test_raw_response_update(self, client: Legalesign) -> None:
 
     @pytest.mark.skip(reason="Prism tests are disabled")
     @parametrize
-    def test_streaming_response_update(self, client: Legalesign) -> None:
+    def test_streaming_response_update(self, client: LegalesignSDK) -> None:
         with client.template.with_streaming_response.update(
             template_id="182bd5e5-6e1a-4fe4-a799-aa6d9a6ab26e",
             body="body",
@@ -152,7 +152,7 @@ def test_streaming_response_update(self, client: Legalesign) -> None:
 
     @pytest.mark.skip(reason="Prism tests are disabled")
     @parametrize
-    def test_path_params_update(self, client: Legalesign) -> None:
+    def test_path_params_update(self, client: LegalesignSDK) -> None:
         with pytest.raises(ValueError, match=r"Expected a non-empty value for `template_id` but received ''"):
             client.template.with_raw_response.update(
                 template_id="",
@@ -161,13 +161,13 @@ def test_path_params_update(self, client: Legalesign) -> None:
 
     @pytest.mark.skip(reason="Prism tests are disabled")
     @parametrize
-    def test_method_list(self, client: Legalesign) -> None:
+    def test_method_list(self, client: LegalesignSDK) -> None:
         template = client.template.list()
         assert_matches_type(TemplateListResponse, template, path=["response"])
 
     @pytest.mark.skip(reason="Prism tests are disabled")
     @parametrize
-    def test_method_list_with_all_params(self, client: Legalesign) -> None:
+    def test_method_list_with_all_params(self, client: LegalesignSDK) -> None:
         template = client.template.list(
             archive="archive",
             group="group",
@@ -178,7 +178,7 @@ def test_method_list_with_all_params(self, client: Legalesign) -> None:
 
     @pytest.mark.skip(reason="Prism tests are disabled")
     @parametrize
-    def test_raw_response_list(self, client: Legalesign) -> None:
+    def test_raw_response_list(self, client: LegalesignSDK) -> None:
         response = client.template.with_raw_response.list()
 
         assert response.is_closed is True
@@ -188,7 +188,7 @@ def test_raw_response_list(self, client: Legalesign) -> None:
 
     @pytest.mark.skip(reason="Prism tests are disabled")
     @parametrize
-    def test_streaming_response_list(self, client: Legalesign) -> None:
+    def test_streaming_response_list(self, client: LegalesignSDK) -> None:
         with client.template.with_streaming_response.list() as response:
             assert not response.is_closed
             assert response.http_request.headers.get("X-Stainless-Lang") == "python"
@@ -198,48 +198,6 @@ def test_streaming_response_list(self, client: Legalesign) -> None:
 
         assert cast(Any, response.is_closed) is True
 
-    @pytest.mark.skip(reason="Prism tests are disabled")
-    @parametrize
-    def test_method_archive(self, client: Legalesign) -> None:
-        template = client.template.archive(
-            "182bd5e5-6e1a-4fe4-a799-aa6d9a6ab26e",
-        )
-        assert template is None
-
-    @pytest.mark.skip(reason="Prism tests are disabled")
-    @parametrize
-    def test_raw_response_archive(self, client: Legalesign) -> None:
-        response = client.template.with_raw_response.archive(
-            "182bd5e5-6e1a-4fe4-a799-aa6d9a6ab26e",
-        )
-
-        assert response.is_closed is True
-        assert response.http_request.headers.get("X-Stainless-Lang") == "python"
-        template = response.parse()
-        assert template is None
-
-    @pytest.mark.skip(reason="Prism tests are disabled")
-    @parametrize
-    def test_streaming_response_archive(self, client: Legalesign) -> None:
-        with client.template.with_streaming_response.archive(
-            "182bd5e5-6e1a-4fe4-a799-aa6d9a6ab26e",
-        ) as response:
-            assert not response.is_closed
-            assert response.http_request.headers.get("X-Stainless-Lang") == "python"
-
-            template = response.parse()
-            assert template is None
-
-        assert cast(Any, response.is_closed) is True
-
-    @pytest.mark.skip(reason="Prism tests are disabled")
-    @parametrize
-    def test_path_params_archive(self, client: Legalesign) -> None:
-        with pytest.raises(ValueError, match=r"Expected a non-empty value for `template_id` but received ''"):
-            client.template.with_raw_response.archive(
-                "",
-            )
-
 
 class TestAsyncTemplate:
     parametrize = pytest.mark.parametrize(
@@ -248,7 +206,7 @@ class TestAsyncTemplate:
 
     @pytest.mark.skip(reason="Prism tests are disabled")
     @parametrize
-    async def test_method_create(self, async_client: AsyncLegalesign) -> None:
+    async def test_method_create(self, async_client: AsyncLegalesignSDK) -> None:
         template = await async_client.template.create(
             group="/api/v1/group/IK-GV--w1tvt/",
             latest_text="latest_text",
@@ -258,7 +216,7 @@ async def test_method_create(self, async_client: AsyncLegalesign) -> None:
 
     @pytest.mark.skip(reason="Prism tests are disabled")
     @parametrize
-    async def test_method_create_with_all_params(self, async_client: AsyncLegalesign) -> None:
+    async def test_method_create_with_all_params(self, async_client: AsyncLegalesignSDK) -> None:
         template = await async_client.template.create(
             group="/api/v1/group/IK-GV--w1tvt/",
             latest_text="latest_text",
@@ -269,7 +227,7 @@ async def test_method_create_with_all_params(self, async_client: AsyncLegalesign
 
     @pytest.mark.skip(reason="Prism tests are disabled")
     @parametrize
-    async def test_raw_response_create(self, async_client: AsyncLegalesign) -> None:
+    async def test_raw_response_create(self, async_client: AsyncLegalesignSDK) -> None:
         response = await async_client.template.with_raw_response.create(
             group="/api/v1/group/IK-GV--w1tvt/",
             latest_text="latest_text",
@@ -283,7 +241,7 @@ async def test_raw_response_create(self, async_client: AsyncLegalesign) -> None:
 
     @pytest.mark.skip(reason="Prism tests are disabled")
     @parametrize
-    async def test_streaming_response_create(self, async_client: AsyncLegalesign) -> None:
+    async def test_streaming_response_create(self, async_client: AsyncLegalesignSDK) -> None:
         async with async_client.template.with_streaming_response.create(
             group="/api/v1/group/IK-GV--w1tvt/",
             latest_text="latest_text",
@@ -299,7 +257,7 @@ async def test_streaming_response_create(self, async_client: AsyncLegalesign) ->
 
     @pytest.mark.skip(reason="Prism tests are disabled")
     @parametrize
-    async def test_method_retrieve(self, async_client: AsyncLegalesign) -> None:
+    async def test_method_retrieve(self, async_client: AsyncLegalesignSDK) -> None:
         template = await async_client.template.retrieve(
             "182bd5e5-6e1a-4fe4-a799-aa6d9a6ab26e",
         )
@@ -307,7 +265,7 @@ async def test_method_retrieve(self, async_client: AsyncLegalesign) -> None:
 
     @pytest.mark.skip(reason="Prism tests are disabled")
     @parametrize
-    async def test_raw_response_retrieve(self, async_client: AsyncLegalesign) -> None:
+    async def test_raw_response_retrieve(self, async_client: AsyncLegalesignSDK) -> None:
         response = await async_client.template.with_raw_response.retrieve(
             "182bd5e5-6e1a-4fe4-a799-aa6d9a6ab26e",
         )
@@ -319,7 +277,7 @@ async def test_raw_response_retrieve(self, async_client: AsyncLegalesign) -> Non
 
     @pytest.mark.skip(reason="Prism tests are disabled")
     @parametrize
-    async def test_streaming_response_retrieve(self, async_client: AsyncLegalesign) -> None:
+    async def test_streaming_response_retrieve(self, async_client: AsyncLegalesignSDK) -> None:
         async with async_client.template.with_streaming_response.retrieve(
             "182bd5e5-6e1a-4fe4-a799-aa6d9a6ab26e",
         ) as response:
@@ -333,7 +291,7 @@ async def test_streaming_response_retrieve(self, async_client: AsyncLegalesign)
 
     @pytest.mark.skip(reason="Prism tests are disabled")
     @parametrize
-    async def test_path_params_retrieve(self, async_client: AsyncLegalesign) -> None:
+    async def test_path_params_retrieve(self, async_client: AsyncLegalesignSDK) -> None:
         with pytest.raises(ValueError, match=r"Expected a non-empty value for `template_id` but received ''"):
             await async_client.template.with_raw_response.retrieve(
                 "",
@@ -341,7 +299,7 @@ async def test_path_params_retrieve(self, async_client: AsyncLegalesign) -> None
 
     @pytest.mark.skip(reason="Prism tests are disabled")
     @parametrize
-    async def test_method_update(self, async_client: AsyncLegalesign) -> None:
+    async def test_method_update(self, async_client: AsyncLegalesignSDK) -> None:
         template = await async_client.template.update(
             template_id="182bd5e5-6e1a-4fe4-a799-aa6d9a6ab26e",
             body="body",
@@ -350,7 +308,7 @@ async def test_method_update(self, async_client: AsyncLegalesign) -> None:
 
     @pytest.mark.skip(reason="Prism tests are disabled")
     @parametrize
-    async def test_raw_response_update(self, async_client: AsyncLegalesign) -> None:
+    async def test_raw_response_update(self, async_client: AsyncLegalesignSDK) -> None:
         response = await async_client.template.with_raw_response.update(
             template_id="182bd5e5-6e1a-4fe4-a799-aa6d9a6ab26e",
             body="body",
@@ -363,7 +321,7 @@ async def test_raw_response_update(self, async_client: AsyncLegalesign) -> None:
 
     @pytest.mark.skip(reason="Prism tests are disabled")
     @parametrize
-    async def test_streaming_response_update(self, async_client: AsyncLegalesign) -> None:
+    async def test_streaming_response_update(self, async_client: AsyncLegalesignSDK) -> None:
         async with async_client.template.with_streaming_response.update(
             template_id="182bd5e5-6e1a-4fe4-a799-aa6d9a6ab26e",
             body="body",
@@ -378,7 +336,7 @@ async def test_streaming_response_update(self, async_client: AsyncLegalesign) ->
 
     @pytest.mark.skip(reason="Prism tests are disabled")
     @parametrize
-    async def test_path_params_update(self, async_client: AsyncLegalesign) -> None:
+    async def test_path_params_update(self, async_client: AsyncLegalesignSDK) -> None:
         with pytest.raises(ValueError, match=r"Expected a non-empty value for `template_id` but received ''"):
             await async_client.template.with_raw_response.update(
                 template_id="",
@@ -387,13 +345,13 @@ async def test_path_params_update(self, async_client: AsyncLegalesign) -> None:
 
     @pytest.mark.skip(reason="Prism tests are disabled")
     @parametrize
-    async def test_method_list(self, async_client: AsyncLegalesign) -> None:
+    async def test_method_list(self, async_client: AsyncLegalesignSDK) -> None:
         template = await async_client.template.list()
         assert_matches_type(TemplateListResponse, template, path=["response"])
 
     @pytest.mark.skip(reason="Prism tests are disabled")
     @parametrize
-    async def test_method_list_with_all_params(self, async_client: AsyncLegalesign) -> None:
+    async def test_method_list_with_all_params(self, async_client: AsyncLegalesignSDK) -> None:
         template = await async_client.template.list(
             archive="archive",
             group="group",
@@ -404,7 +362,7 @@ async def test_method_list_with_all_params(self, async_client: AsyncLegalesign)
 
     @pytest.mark.skip(reason="Prism tests are disabled")
     @parametrize
-    async def test_raw_response_list(self, async_client: AsyncLegalesign) -> None:
+    async def test_raw_response_list(self, async_client: AsyncLegalesignSDK) -> None:
         response = await async_client.template.with_raw_response.list()
 
         assert response.is_closed is True
@@ -414,7 +372,7 @@ async def test_raw_response_list(self, async_client: AsyncLegalesign) -> None:
 
     @pytest.mark.skip(reason="Prism tests are disabled")
     @parametrize
-    async def test_streaming_response_list(self, async_client: AsyncLegalesign) -> None:
+    async def test_streaming_response_list(self, async_client: AsyncLegalesignSDK) -> None:
         async with async_client.template.with_streaming_response.list() as response:
             assert not response.is_closed
             assert response.http_request.headers.get("X-Stainless-Lang") == "python"
@@ -423,45 +381,3 @@ async def test_streaming_response_list(self, async_client: AsyncLegalesign) -> N
             assert_matches_type(TemplateListResponse, template, path=["response"])
 
         assert cast(Any, response.is_closed) is True
-
-    @pytest.mark.skip(reason="Prism tests are disabled")
-    @parametrize
-    async def test_method_archive(self, async_client: AsyncLegalesign) -> None:
-        template = await async_client.template.archive(
-            "182bd5e5-6e1a-4fe4-a799-aa6d9a6ab26e",
-        )
-        assert template is None
-
-    @pytest.mark.skip(reason="Prism tests are disabled")
-    @parametrize
-    async def test_raw_response_archive(self, async_client: AsyncLegalesign) -> None:
-        response = await async_client.template.with_raw_response.archive(
-            "182bd5e5-6e1a-4fe4-a799-aa6d9a6ab26e",
-        )
-
-        assert response.is_closed is True
-        assert response.http_request.headers.get("X-Stainless-Lang") == "python"
-        template = await response.parse()
-        assert template is None
-
-    @pytest.mark.skip(reason="Prism tests are disabled")
-    @parametrize
-    async def test_streaming_response_archive(self, async_client: AsyncLegalesign) -> None:
-        async with async_client.template.with_streaming_response.archive(
-            "182bd5e5-6e1a-4fe4-a799-aa6d9a6ab26e",
-        ) as response:
-            assert not response.is_closed
-            assert response.http_request.headers.get("X-Stainless-Lang") == "python"
-
-            template = await response.parse()
-            assert template is None
-
-        assert cast(Any, response.is_closed) is True
-
-    @pytest.mark.skip(reason="Prism tests are disabled")
-    @parametrize
-    async def test_path_params_archive(self, async_client: AsyncLegalesign) -> None:
-        with pytest.raises(ValueError, match=r"Expected a non-empty value for `template_id` but received ''"):
-            await async_client.template.with_raw_response.archive(
-                "",
-            )
diff --git a/tests/api_resources/test_templatepdf.py b/tests/api_resources/test_templatepdf.py
index 86e2873..8cadc48 100644
--- a/tests/api_resources/test_templatepdf.py
+++ b/tests/api_resources/test_templatepdf.py
@@ -7,9 +7,9 @@
 
 import pytest
 
-from legalesign import Legalesign, AsyncLegalesign
 from tests.utils import assert_matches_type
-from legalesign.types import (
+from legalesign_sdk import LegalesignSDK, AsyncLegalesignSDK
+from legalesign_sdk.types import (
     TemplatePdf,
     TemplatepdfListResponse,
 )
@@ -22,7 +22,7 @@ class TestTemplatepdf:
 
     @pytest.mark.skip(reason="Prism tests are disabled")
     @parametrize
-    def test_method_create(self, client: Legalesign) -> None:
+    def test_method_create(self, client: LegalesignSDK) -> None:
         templatepdf = client.templatepdf.create(
             group="/api/v1/group/IK-GV--w1tvt/",
             pdf_file="U3RhaW5sZXNzIHJvY2tz",
@@ -31,7 +31,7 @@ def test_method_create(self, client: Legalesign) -> None:
 
     @pytest.mark.skip(reason="Prism tests are disabled")
     @parametrize
-    def test_method_create_with_all_params(self, client: Legalesign) -> None:
+    def test_method_create_with_all_params(self, client: LegalesignSDK) -> None:
         templatepdf = client.templatepdf.create(
             group="/api/v1/group/IK-GV--w1tvt/",
             pdf_file="U3RhaW5sZXNzIHJvY2tz",
@@ -44,7 +44,7 @@ def test_method_create_with_all_params(self, client: Legalesign) -> None:
 
     @pytest.mark.skip(reason="Prism tests are disabled")
     @parametrize
-    def test_raw_response_create(self, client: Legalesign) -> None:
+    def test_raw_response_create(self, client: LegalesignSDK) -> None:
         response = client.templatepdf.with_raw_response.create(
             group="/api/v1/group/IK-GV--w1tvt/",
             pdf_file="U3RhaW5sZXNzIHJvY2tz",
@@ -57,7 +57,7 @@ def test_raw_response_create(self, client: Legalesign) -> None:
 
     @pytest.mark.skip(reason="Prism tests are disabled")
     @parametrize
-    def test_streaming_response_create(self, client: Legalesign) -> None:
+    def test_streaming_response_create(self, client: LegalesignSDK) -> None:
         with client.templatepdf.with_streaming_response.create(
             group="/api/v1/group/IK-GV--w1tvt/",
             pdf_file="U3RhaW5sZXNzIHJvY2tz",
@@ -72,7 +72,7 @@ def test_streaming_response_create(self, client: Legalesign) -> None:
 
     @pytest.mark.skip(reason="Prism tests are disabled")
     @parametrize
-    def test_method_retrieve(self, client: Legalesign) -> None:
+    def test_method_retrieve(self, client: LegalesignSDK) -> None:
         templatepdf = client.templatepdf.retrieve(
             "182bd5e5-6e1a-4fe4-a799-aa6d9a6ab26e",
         )
@@ -80,7 +80,7 @@ def test_method_retrieve(self, client: Legalesign) -> None:
 
     @pytest.mark.skip(reason="Prism tests are disabled")
     @parametrize
-    def test_raw_response_retrieve(self, client: Legalesign) -> None:
+    def test_raw_response_retrieve(self, client: LegalesignSDK) -> None:
         response = client.templatepdf.with_raw_response.retrieve(
             "182bd5e5-6e1a-4fe4-a799-aa6d9a6ab26e",
         )
@@ -92,7 +92,7 @@ def test_raw_response_retrieve(self, client: Legalesign) -> None:
 
     @pytest.mark.skip(reason="Prism tests are disabled")
     @parametrize
-    def test_streaming_response_retrieve(self, client: Legalesign) -> None:
+    def test_streaming_response_retrieve(self, client: LegalesignSDK) -> None:
         with client.templatepdf.with_streaming_response.retrieve(
             "182bd5e5-6e1a-4fe4-a799-aa6d9a6ab26e",
         ) as response:
@@ -106,7 +106,7 @@ def test_streaming_response_retrieve(self, client: Legalesign) -> None:
 
     @pytest.mark.skip(reason="Prism tests are disabled")
     @parametrize
-    def test_path_params_retrieve(self, client: Legalesign) -> None:
+    def test_path_params_retrieve(self, client: LegalesignSDK) -> None:
         with pytest.raises(ValueError, match=r"Expected a non-empty value for `pdf_id` but received ''"):
             client.templatepdf.with_raw_response.retrieve(
                 "",
@@ -114,13 +114,13 @@ def test_path_params_retrieve(self, client: Legalesign) -> None:
 
     @pytest.mark.skip(reason="Prism tests are disabled")
     @parametrize
-    def test_method_list(self, client: Legalesign) -> None:
+    def test_method_list(self, client: LegalesignSDK) -> None:
         templatepdf = client.templatepdf.list()
         assert_matches_type(TemplatepdfListResponse, templatepdf, path=["response"])
 
     @pytest.mark.skip(reason="Prism tests are disabled")
     @parametrize
-    def test_method_list_with_all_params(self, client: Legalesign) -> None:
+    def test_method_list_with_all_params(self, client: LegalesignSDK) -> None:
         templatepdf = client.templatepdf.list(
             archive="archive",
             group="group",
@@ -131,7 +131,7 @@ def test_method_list_with_all_params(self, client: Legalesign) -> None:
 
     @pytest.mark.skip(reason="Prism tests are disabled")
     @parametrize
-    def test_raw_response_list(self, client: Legalesign) -> None:
+    def test_raw_response_list(self, client: LegalesignSDK) -> None:
         response = client.templatepdf.with_raw_response.list()
 
         assert response.is_closed is True
@@ -141,7 +141,7 @@ def test_raw_response_list(self, client: Legalesign) -> None:
 
     @pytest.mark.skip(reason="Prism tests are disabled")
     @parametrize
-    def test_streaming_response_list(self, client: Legalesign) -> None:
+    def test_streaming_response_list(self, client: LegalesignSDK) -> None:
         with client.templatepdf.with_streaming_response.list() as response:
             assert not response.is_closed
             assert response.http_request.headers.get("X-Stainless-Lang") == "python"
@@ -153,91 +153,7 @@ def test_streaming_response_list(self, client: Legalesign) -> None:
 
     @pytest.mark.skip(reason="Prism tests are disabled")
     @parametrize
-    def test_method_archive(self, client: Legalesign) -> None:
-        templatepdf = client.templatepdf.archive(
-            "pdfId",
-        )
-        assert templatepdf is None
-
-    @pytest.mark.skip(reason="Prism tests are disabled")
-    @parametrize
-    def test_raw_response_archive(self, client: Legalesign) -> None:
-        response = client.templatepdf.with_raw_response.archive(
-            "pdfId",
-        )
-
-        assert response.is_closed is True
-        assert response.http_request.headers.get("X-Stainless-Lang") == "python"
-        templatepdf = response.parse()
-        assert templatepdf is None
-
-    @pytest.mark.skip(reason="Prism tests are disabled")
-    @parametrize
-    def test_streaming_response_archive(self, client: Legalesign) -> None:
-        with client.templatepdf.with_streaming_response.archive(
-            "pdfId",
-        ) as response:
-            assert not response.is_closed
-            assert response.http_request.headers.get("X-Stainless-Lang") == "python"
-
-            templatepdf = response.parse()
-            assert templatepdf is None
-
-        assert cast(Any, response.is_closed) is True
-
-    @pytest.mark.skip(reason="Prism tests are disabled")
-    @parametrize
-    def test_path_params_archive(self, client: Legalesign) -> None:
-        with pytest.raises(ValueError, match=r"Expected a non-empty value for `pdf_id` but received ''"):
-            client.templatepdf.with_raw_response.archive(
-                "",
-            )
-
-    @pytest.mark.skip(reason="Prism tests are disabled")
-    @parametrize
-    def test_method_convert_tags(self, client: Legalesign) -> None:
-        templatepdf = client.templatepdf.convert_tags(
-            "pdfId",
-        )
-        assert templatepdf is None
-
-    @pytest.mark.skip(reason="Prism tests are disabled")
-    @parametrize
-    def test_raw_response_convert_tags(self, client: Legalesign) -> None:
-        response = client.templatepdf.with_raw_response.convert_tags(
-            "pdfId",
-        )
-
-        assert response.is_closed is True
-        assert response.http_request.headers.get("X-Stainless-Lang") == "python"
-        templatepdf = response.parse()
-        assert templatepdf is None
-
-    @pytest.mark.skip(reason="Prism tests are disabled")
-    @parametrize
-    def test_streaming_response_convert_tags(self, client: Legalesign) -> None:
-        with client.templatepdf.with_streaming_response.convert_tags(
-            "pdfId",
-        ) as response:
-            assert not response.is_closed
-            assert response.http_request.headers.get("X-Stainless-Lang") == "python"
-
-            templatepdf = response.parse()
-            assert templatepdf is None
-
-        assert cast(Any, response.is_closed) is True
-
-    @pytest.mark.skip(reason="Prism tests are disabled")
-    @parametrize
-    def test_path_params_convert_tags(self, client: Legalesign) -> None:
-        with pytest.raises(ValueError, match=r"Expected a non-empty value for `pdf_id` but received ''"):
-            client.templatepdf.with_raw_response.convert_tags(
-                "",
-            )
-
-    @pytest.mark.skip(reason="Prism tests are disabled")
-    @parametrize
-    def test_method_get_edit_link(self, client: Legalesign) -> None:
+    def test_method_get_edit_link(self, client: LegalesignSDK) -> None:
         templatepdf = client.templatepdf.get_edit_link(
             "182bd5e5-6e1a-4fe4-a799-aa6d9a6ab26e",
         )
@@ -245,7 +161,7 @@ def test_method_get_edit_link(self, client: Legalesign) -> None:
 
     @pytest.mark.skip(reason="Prism tests are disabled")
     @parametrize
-    def test_raw_response_get_edit_link(self, client: Legalesign) -> None:
+    def test_raw_response_get_edit_link(self, client: LegalesignSDK) -> None:
         response = client.templatepdf.with_raw_response.get_edit_link(
             "182bd5e5-6e1a-4fe4-a799-aa6d9a6ab26e",
         )
@@ -257,7 +173,7 @@ def test_raw_response_get_edit_link(self, client: Legalesign) -> None:
 
     @pytest.mark.skip(reason="Prism tests are disabled")
     @parametrize
-    def test_streaming_response_get_edit_link(self, client: Legalesign) -> None:
+    def test_streaming_response_get_edit_link(self, client: LegalesignSDK) -> None:
         with client.templatepdf.with_streaming_response.get_edit_link(
             "182bd5e5-6e1a-4fe4-a799-aa6d9a6ab26e",
         ) as response:
@@ -271,7 +187,7 @@ def test_streaming_response_get_edit_link(self, client: Legalesign) -> None:
 
     @pytest.mark.skip(reason="Prism tests are disabled")
     @parametrize
-    def test_path_params_get_edit_link(self, client: Legalesign) -> None:
+    def test_path_params_get_edit_link(self, client: LegalesignSDK) -> None:
         with pytest.raises(ValueError, match=r"Expected a non-empty value for `pdf_id` but received ''"):
             client.templatepdf.with_raw_response.get_edit_link(
                 "",
@@ -285,7 +201,7 @@ class TestAsyncTemplatepdf:
 
     @pytest.mark.skip(reason="Prism tests are disabled")
     @parametrize
-    async def test_method_create(self, async_client: AsyncLegalesign) -> None:
+    async def test_method_create(self, async_client: AsyncLegalesignSDK) -> None:
         templatepdf = await async_client.templatepdf.create(
             group="/api/v1/group/IK-GV--w1tvt/",
             pdf_file="U3RhaW5sZXNzIHJvY2tz",
@@ -294,7 +210,7 @@ async def test_method_create(self, async_client: AsyncLegalesign) -> None:
 
     @pytest.mark.skip(reason="Prism tests are disabled")
     @parametrize
-    async def test_method_create_with_all_params(self, async_client: AsyncLegalesign) -> None:
+    async def test_method_create_with_all_params(self, async_client: AsyncLegalesignSDK) -> None:
         templatepdf = await async_client.templatepdf.create(
             group="/api/v1/group/IK-GV--w1tvt/",
             pdf_file="U3RhaW5sZXNzIHJvY2tz",
@@ -307,7 +223,7 @@ async def test_method_create_with_all_params(self, async_client: AsyncLegalesign
 
     @pytest.mark.skip(reason="Prism tests are disabled")
     @parametrize
-    async def test_raw_response_create(self, async_client: AsyncLegalesign) -> None:
+    async def test_raw_response_create(self, async_client: AsyncLegalesignSDK) -> None:
         response = await async_client.templatepdf.with_raw_response.create(
             group="/api/v1/group/IK-GV--w1tvt/",
             pdf_file="U3RhaW5sZXNzIHJvY2tz",
@@ -320,7 +236,7 @@ async def test_raw_response_create(self, async_client: AsyncLegalesign) -> None:
 
     @pytest.mark.skip(reason="Prism tests are disabled")
     @parametrize
-    async def test_streaming_response_create(self, async_client: AsyncLegalesign) -> None:
+    async def test_streaming_response_create(self, async_client: AsyncLegalesignSDK) -> None:
         async with async_client.templatepdf.with_streaming_response.create(
             group="/api/v1/group/IK-GV--w1tvt/",
             pdf_file="U3RhaW5sZXNzIHJvY2tz",
@@ -335,7 +251,7 @@ async def test_streaming_response_create(self, async_client: AsyncLegalesign) ->
 
     @pytest.mark.skip(reason="Prism tests are disabled")
     @parametrize
-    async def test_method_retrieve(self, async_client: AsyncLegalesign) -> None:
+    async def test_method_retrieve(self, async_client: AsyncLegalesignSDK) -> None:
         templatepdf = await async_client.templatepdf.retrieve(
             "182bd5e5-6e1a-4fe4-a799-aa6d9a6ab26e",
         )
@@ -343,7 +259,7 @@ async def test_method_retrieve(self, async_client: AsyncLegalesign) -> None:
 
     @pytest.mark.skip(reason="Prism tests are disabled")
     @parametrize
-    async def test_raw_response_retrieve(self, async_client: AsyncLegalesign) -> None:
+    async def test_raw_response_retrieve(self, async_client: AsyncLegalesignSDK) -> None:
         response = await async_client.templatepdf.with_raw_response.retrieve(
             "182bd5e5-6e1a-4fe4-a799-aa6d9a6ab26e",
         )
@@ -355,7 +271,7 @@ async def test_raw_response_retrieve(self, async_client: AsyncLegalesign) -> Non
 
     @pytest.mark.skip(reason="Prism tests are disabled")
     @parametrize
-    async def test_streaming_response_retrieve(self, async_client: AsyncLegalesign) -> None:
+    async def test_streaming_response_retrieve(self, async_client: AsyncLegalesignSDK) -> None:
         async with async_client.templatepdf.with_streaming_response.retrieve(
             "182bd5e5-6e1a-4fe4-a799-aa6d9a6ab26e",
         ) as response:
@@ -369,7 +285,7 @@ async def test_streaming_response_retrieve(self, async_client: AsyncLegalesign)
 
     @pytest.mark.skip(reason="Prism tests are disabled")
     @parametrize
-    async def test_path_params_retrieve(self, async_client: AsyncLegalesign) -> None:
+    async def test_path_params_retrieve(self, async_client: AsyncLegalesignSDK) -> None:
         with pytest.raises(ValueError, match=r"Expected a non-empty value for `pdf_id` but received ''"):
             await async_client.templatepdf.with_raw_response.retrieve(
                 "",
@@ -377,13 +293,13 @@ async def test_path_params_retrieve(self, async_client: AsyncLegalesign) -> None
 
     @pytest.mark.skip(reason="Prism tests are disabled")
     @parametrize
-    async def test_method_list(self, async_client: AsyncLegalesign) -> None:
+    async def test_method_list(self, async_client: AsyncLegalesignSDK) -> None:
         templatepdf = await async_client.templatepdf.list()
         assert_matches_type(TemplatepdfListResponse, templatepdf, path=["response"])
 
     @pytest.mark.skip(reason="Prism tests are disabled")
     @parametrize
-    async def test_method_list_with_all_params(self, async_client: AsyncLegalesign) -> None:
+    async def test_method_list_with_all_params(self, async_client: AsyncLegalesignSDK) -> None:
         templatepdf = await async_client.templatepdf.list(
             archive="archive",
             group="group",
@@ -394,7 +310,7 @@ async def test_method_list_with_all_params(self, async_client: AsyncLegalesign)
 
     @pytest.mark.skip(reason="Prism tests are disabled")
     @parametrize
-    async def test_raw_response_list(self, async_client: AsyncLegalesign) -> None:
+    async def test_raw_response_list(self, async_client: AsyncLegalesignSDK) -> None:
         response = await async_client.templatepdf.with_raw_response.list()
 
         assert response.is_closed is True
@@ -404,7 +320,7 @@ async def test_raw_response_list(self, async_client: AsyncLegalesign) -> None:
 
     @pytest.mark.skip(reason="Prism tests are disabled")
     @parametrize
-    async def test_streaming_response_list(self, async_client: AsyncLegalesign) -> None:
+    async def test_streaming_response_list(self, async_client: AsyncLegalesignSDK) -> None:
         async with async_client.templatepdf.with_streaming_response.list() as response:
             assert not response.is_closed
             assert response.http_request.headers.get("X-Stainless-Lang") == "python"
@@ -416,91 +332,7 @@ async def test_streaming_response_list(self, async_client: AsyncLegalesign) -> N
 
     @pytest.mark.skip(reason="Prism tests are disabled")
     @parametrize
-    async def test_method_archive(self, async_client: AsyncLegalesign) -> None:
-        templatepdf = await async_client.templatepdf.archive(
-            "pdfId",
-        )
-        assert templatepdf is None
-
-    @pytest.mark.skip(reason="Prism tests are disabled")
-    @parametrize
-    async def test_raw_response_archive(self, async_client: AsyncLegalesign) -> None:
-        response = await async_client.templatepdf.with_raw_response.archive(
-            "pdfId",
-        )
-
-        assert response.is_closed is True
-        assert response.http_request.headers.get("X-Stainless-Lang") == "python"
-        templatepdf = await response.parse()
-        assert templatepdf is None
-
-    @pytest.mark.skip(reason="Prism tests are disabled")
-    @parametrize
-    async def test_streaming_response_archive(self, async_client: AsyncLegalesign) -> None:
-        async with async_client.templatepdf.with_streaming_response.archive(
-            "pdfId",
-        ) as response:
-            assert not response.is_closed
-            assert response.http_request.headers.get("X-Stainless-Lang") == "python"
-
-            templatepdf = await response.parse()
-            assert templatepdf is None
-
-        assert cast(Any, response.is_closed) is True
-
-    @pytest.mark.skip(reason="Prism tests are disabled")
-    @parametrize
-    async def test_path_params_archive(self, async_client: AsyncLegalesign) -> None:
-        with pytest.raises(ValueError, match=r"Expected a non-empty value for `pdf_id` but received ''"):
-            await async_client.templatepdf.with_raw_response.archive(
-                "",
-            )
-
-    @pytest.mark.skip(reason="Prism tests are disabled")
-    @parametrize
-    async def test_method_convert_tags(self, async_client: AsyncLegalesign) -> None:
-        templatepdf = await async_client.templatepdf.convert_tags(
-            "pdfId",
-        )
-        assert templatepdf is None
-
-    @pytest.mark.skip(reason="Prism tests are disabled")
-    @parametrize
-    async def test_raw_response_convert_tags(self, async_client: AsyncLegalesign) -> None:
-        response = await async_client.templatepdf.with_raw_response.convert_tags(
-            "pdfId",
-        )
-
-        assert response.is_closed is True
-        assert response.http_request.headers.get("X-Stainless-Lang") == "python"
-        templatepdf = await response.parse()
-        assert templatepdf is None
-
-    @pytest.mark.skip(reason="Prism tests are disabled")
-    @parametrize
-    async def test_streaming_response_convert_tags(self, async_client: AsyncLegalesign) -> None:
-        async with async_client.templatepdf.with_streaming_response.convert_tags(
-            "pdfId",
-        ) as response:
-            assert not response.is_closed
-            assert response.http_request.headers.get("X-Stainless-Lang") == "python"
-
-            templatepdf = await response.parse()
-            assert templatepdf is None
-
-        assert cast(Any, response.is_closed) is True
-
-    @pytest.mark.skip(reason="Prism tests are disabled")
-    @parametrize
-    async def test_path_params_convert_tags(self, async_client: AsyncLegalesign) -> None:
-        with pytest.raises(ValueError, match=r"Expected a non-empty value for `pdf_id` but received ''"):
-            await async_client.templatepdf.with_raw_response.convert_tags(
-                "",
-            )
-
-    @pytest.mark.skip(reason="Prism tests are disabled")
-    @parametrize
-    async def test_method_get_edit_link(self, async_client: AsyncLegalesign) -> None:
+    async def test_method_get_edit_link(self, async_client: AsyncLegalesignSDK) -> None:
         templatepdf = await async_client.templatepdf.get_edit_link(
             "182bd5e5-6e1a-4fe4-a799-aa6d9a6ab26e",
         )
@@ -508,7 +340,7 @@ async def test_method_get_edit_link(self, async_client: AsyncLegalesign) -> None
 
     @pytest.mark.skip(reason="Prism tests are disabled")
     @parametrize
-    async def test_raw_response_get_edit_link(self, async_client: AsyncLegalesign) -> None:
+    async def test_raw_response_get_edit_link(self, async_client: AsyncLegalesignSDK) -> None:
         response = await async_client.templatepdf.with_raw_response.get_edit_link(
             "182bd5e5-6e1a-4fe4-a799-aa6d9a6ab26e",
         )
@@ -520,7 +352,7 @@ async def test_raw_response_get_edit_link(self, async_client: AsyncLegalesign) -
 
     @pytest.mark.skip(reason="Prism tests are disabled")
     @parametrize
-    async def test_streaming_response_get_edit_link(self, async_client: AsyncLegalesign) -> None:
+    async def test_streaming_response_get_edit_link(self, async_client: AsyncLegalesignSDK) -> None:
         async with async_client.templatepdf.with_streaming_response.get_edit_link(
             "182bd5e5-6e1a-4fe4-a799-aa6d9a6ab26e",
         ) as response:
@@ -534,7 +366,7 @@ async def test_streaming_response_get_edit_link(self, async_client: AsyncLegales
 
     @pytest.mark.skip(reason="Prism tests are disabled")
     @parametrize
-    async def test_path_params_get_edit_link(self, async_client: AsyncLegalesign) -> None:
+    async def test_path_params_get_edit_link(self, async_client: AsyncLegalesignSDK) -> None:
         with pytest.raises(ValueError, match=r"Expected a non-empty value for `pdf_id` but received ''"):
             await async_client.templatepdf.with_raw_response.get_edit_link(
                 "",
diff --git a/tests/api_resources/test_unsubscribe.py b/tests/api_resources/test_unsubscribe.py
deleted file mode 100644
index 94d843d..0000000
--- a/tests/api_resources/test_unsubscribe.py
+++ /dev/null
@@ -1,110 +0,0 @@
-# File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.
-
-from __future__ import annotations
-
-import os
-from typing import Any, cast
-
-import pytest
-
-from legalesign import Legalesign, AsyncLegalesign
-
-base_url = os.environ.get("TEST_API_BASE_URL", "http://127.0.0.1:4010")
-
-
-class TestUnsubscribe:
-    parametrize = pytest.mark.parametrize("client", [False, True], indirect=True, ids=["loose", "strict"])
-
-    @pytest.mark.skip(reason="Prism tests are disabled")
-    @parametrize
-    def test_method_delete_webhook(self, client: Legalesign) -> None:
-        unsubscribe = client.unsubscribe.delete_webhook(
-            url="https://",
-        )
-        assert unsubscribe is None
-
-    @pytest.mark.skip(reason="Prism tests are disabled")
-    @parametrize
-    def test_method_delete_webhook_with_all_params(self, client: Legalesign) -> None:
-        unsubscribe = client.unsubscribe.delete_webhook(
-            url="https://",
-            event_filter="",
-            group=0,
-        )
-        assert unsubscribe is None
-
-    @pytest.mark.skip(reason="Prism tests are disabled")
-    @parametrize
-    def test_raw_response_delete_webhook(self, client: Legalesign) -> None:
-        response = client.unsubscribe.with_raw_response.delete_webhook(
-            url="https://",
-        )
-
-        assert response.is_closed is True
-        assert response.http_request.headers.get("X-Stainless-Lang") == "python"
-        unsubscribe = response.parse()
-        assert unsubscribe is None
-
-    @pytest.mark.skip(reason="Prism tests are disabled")
-    @parametrize
-    def test_streaming_response_delete_webhook(self, client: Legalesign) -> None:
-        with client.unsubscribe.with_streaming_response.delete_webhook(
-            url="https://",
-        ) as response:
-            assert not response.is_closed
-            assert response.http_request.headers.get("X-Stainless-Lang") == "python"
-
-            unsubscribe = response.parse()
-            assert unsubscribe is None
-
-        assert cast(Any, response.is_closed) is True
-
-
-class TestAsyncUnsubscribe:
-    parametrize = pytest.mark.parametrize(
-        "async_client", [False, True, {"http_client": "aiohttp"}], indirect=True, ids=["loose", "strict", "aiohttp"]
-    )
-
-    @pytest.mark.skip(reason="Prism tests are disabled")
-    @parametrize
-    async def test_method_delete_webhook(self, async_client: AsyncLegalesign) -> None:
-        unsubscribe = await async_client.unsubscribe.delete_webhook(
-            url="https://",
-        )
-        assert unsubscribe is None
-
-    @pytest.mark.skip(reason="Prism tests are disabled")
-    @parametrize
-    async def test_method_delete_webhook_with_all_params(self, async_client: AsyncLegalesign) -> None:
-        unsubscribe = await async_client.unsubscribe.delete_webhook(
-            url="https://",
-            event_filter="",
-            group=0,
-        )
-        assert unsubscribe is None
-
-    @pytest.mark.skip(reason="Prism tests are disabled")
-    @parametrize
-    async def test_raw_response_delete_webhook(self, async_client: AsyncLegalesign) -> None:
-        response = await async_client.unsubscribe.with_raw_response.delete_webhook(
-            url="https://",
-        )
-
-        assert response.is_closed is True
-        assert response.http_request.headers.get("X-Stainless-Lang") == "python"
-        unsubscribe = await response.parse()
-        assert unsubscribe is None
-
-    @pytest.mark.skip(reason="Prism tests are disabled")
-    @parametrize
-    async def test_streaming_response_delete_webhook(self, async_client: AsyncLegalesign) -> None:
-        async with async_client.unsubscribe.with_streaming_response.delete_webhook(
-            url="https://",
-        ) as response:
-            assert not response.is_closed
-            assert response.http_request.headers.get("X-Stainless-Lang") == "python"
-
-            unsubscribe = await response.parse()
-            assert unsubscribe is None
-
-        assert cast(Any, response.is_closed) is True
diff --git a/tests/api_resources/test_user.py b/tests/api_resources/test_user.py
deleted file mode 100644
index c7dec47..0000000
--- a/tests/api_resources/test_user.py
+++ /dev/null
@@ -1,320 +0,0 @@
-# File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.
-
-from __future__ import annotations
-
-import os
-from typing import Any, cast
-
-import pytest
-
-from legalesign import Legalesign, AsyncLegalesign
-from tests.utils import assert_matches_type
-from legalesign.types import UserRetrieveResponse
-
-base_url = os.environ.get("TEST_API_BASE_URL", "http://127.0.0.1:4010")
-
-
-class TestUser:
-    parametrize = pytest.mark.parametrize("client", [False, True], indirect=True, ids=["loose", "strict"])
-
-    @pytest.mark.skip(reason="Prism tests are disabled")
-    @parametrize
-    def test_method_create(self, client: Legalesign) -> None:
-        user = client.user.create(
-            email="dev@stainless.com",
-            first_name="first_name",
-            last_name="last_name",
-        )
-        assert user is None
-
-    @pytest.mark.skip(reason="Prism tests are disabled")
-    @parametrize
-    def test_method_create_with_all_params(self, client: Legalesign) -> None:
-        user = client.user.create(
-            email="dev@stainless.com",
-            first_name="first_name",
-            last_name="last_name",
-            groups="/api/v1/group/IK-GV--w1tvt/",
-            password="password",
-            permission="1",
-            timezone="Africa/Abidjan",
-        )
-        assert user is None
-
-    @pytest.mark.skip(reason="Prism tests are disabled")
-    @parametrize
-    def test_raw_response_create(self, client: Legalesign) -> None:
-        response = client.user.with_raw_response.create(
-            email="dev@stainless.com",
-            first_name="first_name",
-            last_name="last_name",
-        )
-
-        assert response.is_closed is True
-        assert response.http_request.headers.get("X-Stainless-Lang") == "python"
-        user = response.parse()
-        assert user is None
-
-    @pytest.mark.skip(reason="Prism tests are disabled")
-    @parametrize
-    def test_streaming_response_create(self, client: Legalesign) -> None:
-        with client.user.with_streaming_response.create(
-            email="dev@stainless.com",
-            first_name="first_name",
-            last_name="last_name",
-        ) as response:
-            assert not response.is_closed
-            assert response.http_request.headers.get("X-Stainless-Lang") == "python"
-
-            user = response.parse()
-            assert user is None
-
-        assert cast(Any, response.is_closed) is True
-
-    @pytest.mark.skip(reason="Prism tests are disabled")
-    @parametrize
-    def test_method_retrieve(self, client: Legalesign) -> None:
-        user = client.user.retrieve(
-            "userId",
-        )
-        assert_matches_type(UserRetrieveResponse, user, path=["response"])
-
-    @pytest.mark.skip(reason="Prism tests are disabled")
-    @parametrize
-    def test_raw_response_retrieve(self, client: Legalesign) -> None:
-        response = client.user.with_raw_response.retrieve(
-            "userId",
-        )
-
-        assert response.is_closed is True
-        assert response.http_request.headers.get("X-Stainless-Lang") == "python"
-        user = response.parse()
-        assert_matches_type(UserRetrieveResponse, user, path=["response"])
-
-    @pytest.mark.skip(reason="Prism tests are disabled")
-    @parametrize
-    def test_streaming_response_retrieve(self, client: Legalesign) -> None:
-        with client.user.with_streaming_response.retrieve(
-            "userId",
-        ) as response:
-            assert not response.is_closed
-            assert response.http_request.headers.get("X-Stainless-Lang") == "python"
-
-            user = response.parse()
-            assert_matches_type(UserRetrieveResponse, user, path=["response"])
-
-        assert cast(Any, response.is_closed) is True
-
-    @pytest.mark.skip(reason="Prism tests are disabled")
-    @parametrize
-    def test_path_params_retrieve(self, client: Legalesign) -> None:
-        with pytest.raises(ValueError, match=r"Expected a non-empty value for `user_id` but received ''"):
-            client.user.with_raw_response.retrieve(
-                "",
-            )
-
-    @pytest.mark.skip(reason="Prism tests are disabled")
-    @parametrize
-    def test_method_update(self, client: Legalesign) -> None:
-        user = client.user.update(
-            user_id="userId",
-        )
-        assert user is None
-
-    @pytest.mark.skip(reason="Prism tests are disabled")
-    @parametrize
-    def test_method_update_with_all_params(self, client: Legalesign) -> None:
-        user = client.user.update(
-            user_id="userId",
-            first_name="first_name",
-            last_name="last_name",
-        )
-        assert user is None
-
-    @pytest.mark.skip(reason="Prism tests are disabled")
-    @parametrize
-    def test_raw_response_update(self, client: Legalesign) -> None:
-        response = client.user.with_raw_response.update(
-            user_id="userId",
-        )
-
-        assert response.is_closed is True
-        assert response.http_request.headers.get("X-Stainless-Lang") == "python"
-        user = response.parse()
-        assert user is None
-
-    @pytest.mark.skip(reason="Prism tests are disabled")
-    @parametrize
-    def test_streaming_response_update(self, client: Legalesign) -> None:
-        with client.user.with_streaming_response.update(
-            user_id="userId",
-        ) as response:
-            assert not response.is_closed
-            assert response.http_request.headers.get("X-Stainless-Lang") == "python"
-
-            user = response.parse()
-            assert user is None
-
-        assert cast(Any, response.is_closed) is True
-
-    @pytest.mark.skip(reason="Prism tests are disabled")
-    @parametrize
-    def test_path_params_update(self, client: Legalesign) -> None:
-        with pytest.raises(ValueError, match=r"Expected a non-empty value for `user_id` but received ''"):
-            client.user.with_raw_response.update(
-                user_id="",
-            )
-
-
-class TestAsyncUser:
-    parametrize = pytest.mark.parametrize(
-        "async_client", [False, True, {"http_client": "aiohttp"}], indirect=True, ids=["loose", "strict", "aiohttp"]
-    )
-
-    @pytest.mark.skip(reason="Prism tests are disabled")
-    @parametrize
-    async def test_method_create(self, async_client: AsyncLegalesign) -> None:
-        user = await async_client.user.create(
-            email="dev@stainless.com",
-            first_name="first_name",
-            last_name="last_name",
-        )
-        assert user is None
-
-    @pytest.mark.skip(reason="Prism tests are disabled")
-    @parametrize
-    async def test_method_create_with_all_params(self, async_client: AsyncLegalesign) -> None:
-        user = await async_client.user.create(
-            email="dev@stainless.com",
-            first_name="first_name",
-            last_name="last_name",
-            groups="/api/v1/group/IK-GV--w1tvt/",
-            password="password",
-            permission="1",
-            timezone="Africa/Abidjan",
-        )
-        assert user is None
-
-    @pytest.mark.skip(reason="Prism tests are disabled")
-    @parametrize
-    async def test_raw_response_create(self, async_client: AsyncLegalesign) -> None:
-        response = await async_client.user.with_raw_response.create(
-            email="dev@stainless.com",
-            first_name="first_name",
-            last_name="last_name",
-        )
-
-        assert response.is_closed is True
-        assert response.http_request.headers.get("X-Stainless-Lang") == "python"
-        user = await response.parse()
-        assert user is None
-
-    @pytest.mark.skip(reason="Prism tests are disabled")
-    @parametrize
-    async def test_streaming_response_create(self, async_client: AsyncLegalesign) -> None:
-        async with async_client.user.with_streaming_response.create(
-            email="dev@stainless.com",
-            first_name="first_name",
-            last_name="last_name",
-        ) as response:
-            assert not response.is_closed
-            assert response.http_request.headers.get("X-Stainless-Lang") == "python"
-
-            user = await response.parse()
-            assert user is None
-
-        assert cast(Any, response.is_closed) is True
-
-    @pytest.mark.skip(reason="Prism tests are disabled")
-    @parametrize
-    async def test_method_retrieve(self, async_client: AsyncLegalesign) -> None:
-        user = await async_client.user.retrieve(
-            "userId",
-        )
-        assert_matches_type(UserRetrieveResponse, user, path=["response"])
-
-    @pytest.mark.skip(reason="Prism tests are disabled")
-    @parametrize
-    async def test_raw_response_retrieve(self, async_client: AsyncLegalesign) -> None:
-        response = await async_client.user.with_raw_response.retrieve(
-            "userId",
-        )
-
-        assert response.is_closed is True
-        assert response.http_request.headers.get("X-Stainless-Lang") == "python"
-        user = await response.parse()
-        assert_matches_type(UserRetrieveResponse, user, path=["response"])
-
-    @pytest.mark.skip(reason="Prism tests are disabled")
-    @parametrize
-    async def test_streaming_response_retrieve(self, async_client: AsyncLegalesign) -> None:
-        async with async_client.user.with_streaming_response.retrieve(
-            "userId",
-        ) as response:
-            assert not response.is_closed
-            assert response.http_request.headers.get("X-Stainless-Lang") == "python"
-
-            user = await response.parse()
-            assert_matches_type(UserRetrieveResponse, user, path=["response"])
-
-        assert cast(Any, response.is_closed) is True
-
-    @pytest.mark.skip(reason="Prism tests are disabled")
-    @parametrize
-    async def test_path_params_retrieve(self, async_client: AsyncLegalesign) -> None:
-        with pytest.raises(ValueError, match=r"Expected a non-empty value for `user_id` but received ''"):
-            await async_client.user.with_raw_response.retrieve(
-                "",
-            )
-
-    @pytest.mark.skip(reason="Prism tests are disabled")
-    @parametrize
-    async def test_method_update(self, async_client: AsyncLegalesign) -> None:
-        user = await async_client.user.update(
-            user_id="userId",
-        )
-        assert user is None
-
-    @pytest.mark.skip(reason="Prism tests are disabled")
-    @parametrize
-    async def test_method_update_with_all_params(self, async_client: AsyncLegalesign) -> None:
-        user = await async_client.user.update(
-            user_id="userId",
-            first_name="first_name",
-            last_name="last_name",
-        )
-        assert user is None
-
-    @pytest.mark.skip(reason="Prism tests are disabled")
-    @parametrize
-    async def test_raw_response_update(self, async_client: AsyncLegalesign) -> None:
-        response = await async_client.user.with_raw_response.update(
-            user_id="userId",
-        )
-
-        assert response.is_closed is True
-        assert response.http_request.headers.get("X-Stainless-Lang") == "python"
-        user = await response.parse()
-        assert user is None
-
-    @pytest.mark.skip(reason="Prism tests are disabled")
-    @parametrize
-    async def test_streaming_response_update(self, async_client: AsyncLegalesign) -> None:
-        async with async_client.user.with_streaming_response.update(
-            user_id="userId",
-        ) as response:
-            assert not response.is_closed
-            assert response.http_request.headers.get("X-Stainless-Lang") == "python"
-
-            user = await response.parse()
-            assert user is None
-
-        assert cast(Any, response.is_closed) is True
-
-    @pytest.mark.skip(reason="Prism tests are disabled")
-    @parametrize
-    async def test_path_params_update(self, async_client: AsyncLegalesign) -> None:
-        with pytest.raises(ValueError, match=r"Expected a non-empty value for `user_id` but received ''"):
-            await async_client.user.with_raw_response.update(
-                user_id="",
-            )
diff --git a/tests/conftest.py b/tests/conftest.py
index de99803..0a9be39 100644
--- a/tests/conftest.py
+++ b/tests/conftest.py
@@ -10,15 +10,15 @@
 import pytest
 from pytest_asyncio import is_async_test
 
-from legalesign import Legalesign, AsyncLegalesign, DefaultAioHttpClient
-from legalesign._utils import is_dict
+from legalesign_sdk import LegalesignSDK, AsyncLegalesignSDK, DefaultAioHttpClient
+from legalesign_sdk._utils import is_dict
 
 if TYPE_CHECKING:
     from _pytest.fixtures import FixtureRequest  # pyright: ignore[reportPrivateImportUsage]
 
 pytest.register_assert_rewrite("tests.utils")
 
-logging.getLogger("legalesign").setLevel(logging.DEBUG)
+logging.getLogger("legalesign_sdk").setLevel(logging.DEBUG)
 
 
 # automatically add `pytest.mark.asyncio()` to all of our async tests
@@ -49,17 +49,17 @@ def pytest_collection_modifyitems(items: list[pytest.Function]) -> None:
 
 
 @pytest.fixture(scope="session")
-def client(request: FixtureRequest) -> Iterator[Legalesign]:
+def client(request: FixtureRequest) -> Iterator[LegalesignSDK]:
     strict = getattr(request, "param", True)
     if not isinstance(strict, bool):
         raise TypeError(f"Unexpected fixture parameter type {type(strict)}, expected {bool}")
 
-    with Legalesign(base_url=base_url, api_key=api_key, _strict_response_validation=strict) as client:
+    with LegalesignSDK(base_url=base_url, api_key=api_key, _strict_response_validation=strict) as client:
         yield client
 
 
 @pytest.fixture(scope="session")
-async def async_client(request: FixtureRequest) -> AsyncIterator[AsyncLegalesign]:
+async def async_client(request: FixtureRequest) -> AsyncIterator[AsyncLegalesignSDK]:
     param = getattr(request, "param", True)
 
     # defaults
@@ -78,7 +78,7 @@ async def async_client(request: FixtureRequest) -> AsyncIterator[AsyncLegalesign
     else:
         raise TypeError(f"Unexpected fixture parameter type {type(param)}, expected bool or dict")
 
-    async with AsyncLegalesign(
+    async with AsyncLegalesignSDK(
         base_url=base_url, api_key=api_key, _strict_response_validation=strict, http_client=http_client
     ) as client:
         yield client
diff --git a/tests/test_client.py b/tests/test_client.py
index ef87041..2553f89 100644
--- a/tests/test_client.py
+++ b/tests/test_client.py
@@ -18,12 +18,12 @@
 from respx import MockRouter
 from pydantic import ValidationError
 
-from legalesign import Legalesign, AsyncLegalesign, APIResponseValidationError
-from legalesign._types import Omit
-from legalesign._utils import asyncify
-from legalesign._models import BaseModel, FinalRequestOptions
-from legalesign._exceptions import APIStatusError, APITimeoutError, LegalesignError, APIResponseValidationError
-from legalesign._base_client import (
+from legalesign_sdk import LegalesignSDK, AsyncLegalesignSDK, APIResponseValidationError
+from legalesign_sdk._types import Omit
+from legalesign_sdk._utils import asyncify
+from legalesign_sdk._models import BaseModel, FinalRequestOptions
+from legalesign_sdk._exceptions import APIStatusError, APITimeoutError, LegalesignSDKError, APIResponseValidationError
+from legalesign_sdk._base_client import (
     DEFAULT_TIMEOUT,
     HTTPX_DEFAULT_TIMEOUT,
     BaseClient,
@@ -50,7 +50,7 @@ def _low_retry_timeout(*_args: Any, **_kwargs: Any) -> float:
     return 0.1
 
 
-def _get_open_connections(client: Legalesign | AsyncLegalesign) -> int:
+def _get_open_connections(client: LegalesignSDK | AsyncLegalesignSDK) -> int:
     transport = client._client._transport
     assert isinstance(transport, httpx.HTTPTransport) or isinstance(transport, httpx.AsyncHTTPTransport)
 
@@ -58,8 +58,8 @@ def _get_open_connections(client: Legalesign | AsyncLegalesign) -> int:
     return len(pool._requests)
 
 
-class TestLegalesign:
-    client = Legalesign(base_url=base_url, api_key=api_key, _strict_response_validation=True)
+class TestLegalesignSDK:
+    client = LegalesignSDK(base_url=base_url, api_key=api_key, _strict_response_validation=True)
 
     @pytest.mark.respx(base_url=base_url)
     def test_raw_response(self, respx_mock: MockRouter) -> None:
@@ -106,7 +106,7 @@ def test_copy_default_options(self) -> None:
         assert isinstance(self.client.timeout, httpx.Timeout)
 
     def test_copy_default_headers(self) -> None:
-        client = Legalesign(
+        client = LegalesignSDK(
             base_url=base_url, api_key=api_key, _strict_response_validation=True, default_headers={"X-Foo": "bar"}
         )
         assert client.default_headers["X-Foo"] == "bar"
@@ -140,7 +140,7 @@ def test_copy_default_headers(self) -> None:
             client.copy(set_default_headers={}, default_headers={"X-Foo": "Bar"})
 
     def test_copy_default_query(self) -> None:
-        client = Legalesign(
+        client = LegalesignSDK(
             base_url=base_url, api_key=api_key, _strict_response_validation=True, default_query={"foo": "bar"}
         )
         assert _get_params(client)["foo"] == "bar"
@@ -232,10 +232,10 @@ def add_leak(leaks: list[tracemalloc.StatisticDiff], diff: tracemalloc.Statistic
                         # to_raw_response_wrapper leaks through the @functools.wraps() decorator.
                         #
                         # removing the decorator fixes the leak for reasons we don't understand.
-                        "legalesign/_legacy_response.py",
-                        "legalesign/_response.py",
+                        "legalesign_sdk/_legacy_response.py",
+                        "legalesign_sdk/_response.py",
                         # pydantic.BaseModel.model_dump || pydantic.BaseModel.dict leak memory for some reason.
-                        "legalesign/_compat.py",
+                        "legalesign_sdk/_compat.py",
                         # Standard library leaks we don't care about.
                         "/logging/__init__.py",
                     ]
@@ -266,7 +266,7 @@ def test_request_timeout(self) -> None:
         assert timeout == httpx.Timeout(100.0)
 
     def test_client_timeout_option(self) -> None:
-        client = Legalesign(
+        client = LegalesignSDK(
             base_url=base_url, api_key=api_key, _strict_response_validation=True, timeout=httpx.Timeout(0)
         )
 
@@ -277,7 +277,7 @@ def test_client_timeout_option(self) -> None:
     def test_http_client_timeout_option(self) -> None:
         # custom timeout given to the httpx client should be used
         with httpx.Client(timeout=None) as http_client:
-            client = Legalesign(
+            client = LegalesignSDK(
                 base_url=base_url, api_key=api_key, _strict_response_validation=True, http_client=http_client
             )
 
@@ -287,7 +287,7 @@ def test_http_client_timeout_option(self) -> None:
 
         # no timeout given to the httpx client should not use the httpx default
         with httpx.Client() as http_client:
-            client = Legalesign(
+            client = LegalesignSDK(
                 base_url=base_url, api_key=api_key, _strict_response_validation=True, http_client=http_client
             )
 
@@ -297,7 +297,7 @@ def test_http_client_timeout_option(self) -> None:
 
         # explicitly passing the default timeout currently results in it being ignored
         with httpx.Client(timeout=HTTPX_DEFAULT_TIMEOUT) as http_client:
-            client = Legalesign(
+            client = LegalesignSDK(
                 base_url=base_url, api_key=api_key, _strict_response_validation=True, http_client=http_client
             )
 
@@ -308,7 +308,7 @@ def test_http_client_timeout_option(self) -> None:
     async def test_invalid_http_client(self) -> None:
         with pytest.raises(TypeError, match="Invalid `http_client` arg"):
             async with httpx.AsyncClient() as http_client:
-                Legalesign(
+                LegalesignSDK(
                     base_url=base_url,
                     api_key=api_key,
                     _strict_response_validation=True,
@@ -316,14 +316,14 @@ async def test_invalid_http_client(self) -> None:
                 )
 
     def test_default_headers_option(self) -> None:
-        client = Legalesign(
+        client = LegalesignSDK(
             base_url=base_url, api_key=api_key, _strict_response_validation=True, default_headers={"X-Foo": "bar"}
         )
         request = client._build_request(FinalRequestOptions(method="get", url="/foo"))
         assert request.headers.get("x-foo") == "bar"
         assert request.headers.get("x-stainless-lang") == "python"
 
-        client2 = Legalesign(
+        client2 = LegalesignSDK(
             base_url=base_url,
             api_key=api_key,
             _strict_response_validation=True,
@@ -337,17 +337,17 @@ def test_default_headers_option(self) -> None:
         assert request.headers.get("x-stainless-lang") == "my-overriding-header"
 
     def test_validate_headers(self) -> None:
-        client = Legalesign(base_url=base_url, api_key=api_key, _strict_response_validation=True)
+        client = LegalesignSDK(base_url=base_url, api_key=api_key, _strict_response_validation=True)
         request = client._build_request(FinalRequestOptions(method="get", url="/foo"))
         assert request.headers.get("Authorization") == api_key
 
-        with pytest.raises(LegalesignError):
-            with update_env(**{"LEGALESIGN_API_KEY": Omit()}):
-                client2 = Legalesign(base_url=base_url, api_key=None, _strict_response_validation=True)
+        with pytest.raises(LegalesignSDKError):
+            with update_env(**{"LEGALESIGN_SDK_API_KEY": Omit()}):
+                client2 = LegalesignSDK(base_url=base_url, api_key=None, _strict_response_validation=True)
             _ = client2
 
     def test_default_query_option(self) -> None:
-        client = Legalesign(
+        client = LegalesignSDK(
             base_url=base_url, api_key=api_key, _strict_response_validation=True, default_query={"query_param": "bar"}
         )
         request = client._build_request(FinalRequestOptions(method="get", url="/foo"))
@@ -461,7 +461,7 @@ def test_request_extra_query(self) -> None:
         params = dict(request.url.params)
         assert params == {"foo": "2"}
 
-    def test_multipart_repeating_array(self, client: Legalesign) -> None:
+    def test_multipart_repeating_array(self, client: LegalesignSDK) -> None:
         request = client._build_request(
             FinalRequestOptions.construct(
                 method="post",
@@ -548,7 +548,9 @@ class Model(BaseModel):
         assert response.foo == 2
 
     def test_base_url_setter(self) -> None:
-        client = Legalesign(base_url="https://example.com/from_init", api_key=api_key, _strict_response_validation=True)
+        client = LegalesignSDK(
+            base_url="https://example.com/from_init", api_key=api_key, _strict_response_validation=True
+        )
         assert client.base_url == "https://example.com/from_init/"
 
         client.base_url = "https://example.com/from_setter"  # type: ignore[assignment]
@@ -556,17 +558,17 @@ def test_base_url_setter(self) -> None:
         assert client.base_url == "https://example.com/from_setter/"
 
     def test_base_url_env(self) -> None:
-        with update_env(LEGALESIGN_BASE_URL="http://localhost:5000/from/env"):
-            client = Legalesign(api_key=api_key, _strict_response_validation=True)
+        with update_env(LEGALESIGN_SDK_BASE_URL="http://localhost:5000/from/env"):
+            client = LegalesignSDK(api_key=api_key, _strict_response_validation=True)
             assert client.base_url == "http://localhost:5000/from/env/"
 
     @pytest.mark.parametrize(
         "client",
         [
-            Legalesign(
+            LegalesignSDK(
                 base_url="http://localhost:5000/custom/path/", api_key=api_key, _strict_response_validation=True
             ),
-            Legalesign(
+            LegalesignSDK(
                 base_url="http://localhost:5000/custom/path/",
                 api_key=api_key,
                 _strict_response_validation=True,
@@ -575,7 +577,7 @@ def test_base_url_env(self) -> None:
         ],
         ids=["standard", "custom http client"],
     )
-    def test_base_url_trailing_slash(self, client: Legalesign) -> None:
+    def test_base_url_trailing_slash(self, client: LegalesignSDK) -> None:
         request = client._build_request(
             FinalRequestOptions(
                 method="post",
@@ -588,10 +590,10 @@ def test_base_url_trailing_slash(self, client: Legalesign) -> None:
     @pytest.mark.parametrize(
         "client",
         [
-            Legalesign(
+            LegalesignSDK(
                 base_url="http://localhost:5000/custom/path/", api_key=api_key, _strict_response_validation=True
             ),
-            Legalesign(
+            LegalesignSDK(
                 base_url="http://localhost:5000/custom/path/",
                 api_key=api_key,
                 _strict_response_validation=True,
@@ -600,7 +602,7 @@ def test_base_url_trailing_slash(self, client: Legalesign) -> None:
         ],
         ids=["standard", "custom http client"],
     )
-    def test_base_url_no_trailing_slash(self, client: Legalesign) -> None:
+    def test_base_url_no_trailing_slash(self, client: LegalesignSDK) -> None:
         request = client._build_request(
             FinalRequestOptions(
                 method="post",
@@ -613,10 +615,10 @@ def test_base_url_no_trailing_slash(self, client: Legalesign) -> None:
     @pytest.mark.parametrize(
         "client",
         [
-            Legalesign(
+            LegalesignSDK(
                 base_url="http://localhost:5000/custom/path/", api_key=api_key, _strict_response_validation=True
             ),
-            Legalesign(
+            LegalesignSDK(
                 base_url="http://localhost:5000/custom/path/",
                 api_key=api_key,
                 _strict_response_validation=True,
@@ -625,7 +627,7 @@ def test_base_url_no_trailing_slash(self, client: Legalesign) -> None:
         ],
         ids=["standard", "custom http client"],
     )
-    def test_absolute_request_url(self, client: Legalesign) -> None:
+    def test_absolute_request_url(self, client: LegalesignSDK) -> None:
         request = client._build_request(
             FinalRequestOptions(
                 method="post",
@@ -636,7 +638,7 @@ def test_absolute_request_url(self, client: Legalesign) -> None:
         assert request.url == "https://myapi.com/foo"
 
     def test_copied_client_does_not_close_http(self) -> None:
-        client = Legalesign(base_url=base_url, api_key=api_key, _strict_response_validation=True)
+        client = LegalesignSDK(base_url=base_url, api_key=api_key, _strict_response_validation=True)
         assert not client.is_closed()
 
         copied = client.copy()
@@ -647,7 +649,7 @@ def test_copied_client_does_not_close_http(self) -> None:
         assert not client.is_closed()
 
     def test_client_context_manager(self) -> None:
-        client = Legalesign(base_url=base_url, api_key=api_key, _strict_response_validation=True)
+        client = LegalesignSDK(base_url=base_url, api_key=api_key, _strict_response_validation=True)
         with client as c2:
             assert c2 is client
             assert not c2.is_closed()
@@ -668,7 +670,7 @@ class Model(BaseModel):
 
     def test_client_max_retries_validation(self) -> None:
         with pytest.raises(TypeError, match=r"max_retries cannot be None"):
-            Legalesign(
+            LegalesignSDK(
                 base_url=base_url, api_key=api_key, _strict_response_validation=True, max_retries=cast(Any, None)
             )
 
@@ -679,12 +681,12 @@ class Model(BaseModel):
 
         respx_mock.get("/foo").mock(return_value=httpx.Response(200, text="my-custom-format"))
 
-        strict_client = Legalesign(base_url=base_url, api_key=api_key, _strict_response_validation=True)
+        strict_client = LegalesignSDK(base_url=base_url, api_key=api_key, _strict_response_validation=True)
 
         with pytest.raises(APIResponseValidationError):
             strict_client.get("/foo", cast_to=Model)
 
-        client = Legalesign(base_url=base_url, api_key=api_key, _strict_response_validation=False)
+        client = LegalesignSDK(base_url=base_url, api_key=api_key, _strict_response_validation=False)
 
         response = client.get("/foo", cast_to=Model)
         assert isinstance(response, str)  # type: ignore[unreachable]
@@ -712,39 +714,39 @@ class Model(BaseModel):
     )
     @mock.patch("time.time", mock.MagicMock(return_value=1696004797))
     def test_parse_retry_after_header(self, remaining_retries: int, retry_after: str, timeout: float) -> None:
-        client = Legalesign(base_url=base_url, api_key=api_key, _strict_response_validation=True)
+        client = LegalesignSDK(base_url=base_url, api_key=api_key, _strict_response_validation=True)
 
         headers = httpx.Headers({"retry-after": retry_after})
         options = FinalRequestOptions(method="get", url="/foo", max_retries=3)
         calculated = client._calculate_retry_timeout(remaining_retries, options, headers)
         assert calculated == pytest.approx(timeout, 0.5 * 0.875)  # pyright: ignore[reportUnknownMemberType]
 
-    @mock.patch("legalesign._base_client.BaseClient._calculate_retry_timeout", _low_retry_timeout)
+    @mock.patch("legalesign_sdk._base_client.BaseClient._calculate_retry_timeout", _low_retry_timeout)
     @pytest.mark.respx(base_url=base_url)
-    def test_retrying_timeout_errors_doesnt_leak(self, respx_mock: MockRouter, client: Legalesign) -> None:
-        respx_mock.get("/group/").mock(side_effect=httpx.TimeoutException("Test timeout error"))
+    def test_retrying_timeout_errors_doesnt_leak(self, respx_mock: MockRouter, client: LegalesignSDK) -> None:
+        respx_mock.get("/document/").mock(side_effect=httpx.TimeoutException("Test timeout error"))
 
         with pytest.raises(APITimeoutError):
-            client.group.with_streaming_response.list().__enter__()
+            client.document.with_streaming_response.list(group="group").__enter__()
 
         assert _get_open_connections(self.client) == 0
 
-    @mock.patch("legalesign._base_client.BaseClient._calculate_retry_timeout", _low_retry_timeout)
+    @mock.patch("legalesign_sdk._base_client.BaseClient._calculate_retry_timeout", _low_retry_timeout)
     @pytest.mark.respx(base_url=base_url)
-    def test_retrying_status_errors_doesnt_leak(self, respx_mock: MockRouter, client: Legalesign) -> None:
-        respx_mock.get("/group/").mock(return_value=httpx.Response(500))
+    def test_retrying_status_errors_doesnt_leak(self, respx_mock: MockRouter, client: LegalesignSDK) -> None:
+        respx_mock.get("/document/").mock(return_value=httpx.Response(500))
 
         with pytest.raises(APIStatusError):
-            client.group.with_streaming_response.list().__enter__()
+            client.document.with_streaming_response.list(group="group").__enter__()
         assert _get_open_connections(self.client) == 0
 
     @pytest.mark.parametrize("failures_before_success", [0, 2, 4])
-    @mock.patch("legalesign._base_client.BaseClient._calculate_retry_timeout", _low_retry_timeout)
+    @mock.patch("legalesign_sdk._base_client.BaseClient._calculate_retry_timeout", _low_retry_timeout)
     @pytest.mark.respx(base_url=base_url)
     @pytest.mark.parametrize("failure_mode", ["status", "exception"])
     def test_retries_taken(
         self,
-        client: Legalesign,
+        client: LegalesignSDK,
         failures_before_success: int,
         failure_mode: Literal["status", "exception"],
         respx_mock: MockRouter,
@@ -762,18 +764,18 @@ def retry_handler(_request: httpx.Request) -> httpx.Response:
                 return httpx.Response(500)
             return httpx.Response(200)
 
-        respx_mock.get("/group/").mock(side_effect=retry_handler)
+        respx_mock.get("/document/").mock(side_effect=retry_handler)
 
-        response = client.group.with_raw_response.list()
+        response = client.document.with_raw_response.list(group="group")
 
         assert response.retries_taken == failures_before_success
         assert int(response.http_request.headers.get("x-stainless-retry-count")) == failures_before_success
 
     @pytest.mark.parametrize("failures_before_success", [0, 2, 4])
-    @mock.patch("legalesign._base_client.BaseClient._calculate_retry_timeout", _low_retry_timeout)
+    @mock.patch("legalesign_sdk._base_client.BaseClient._calculate_retry_timeout", _low_retry_timeout)
     @pytest.mark.respx(base_url=base_url)
     def test_omit_retry_count_header(
-        self, client: Legalesign, failures_before_success: int, respx_mock: MockRouter
+        self, client: LegalesignSDK, failures_before_success: int, respx_mock: MockRouter
     ) -> None:
         client = client.with_options(max_retries=4)
 
@@ -786,17 +788,19 @@ def retry_handler(_request: httpx.Request) -> httpx.Response:
                 return httpx.Response(500)
             return httpx.Response(200)
 
-        respx_mock.get("/group/").mock(side_effect=retry_handler)
+        respx_mock.get("/document/").mock(side_effect=retry_handler)
 
-        response = client.group.with_raw_response.list(extra_headers={"x-stainless-retry-count": Omit()})
+        response = client.document.with_raw_response.list(
+            group="group", extra_headers={"x-stainless-retry-count": Omit()}
+        )
 
         assert len(response.http_request.headers.get_list("x-stainless-retry-count")) == 0
 
     @pytest.mark.parametrize("failures_before_success", [0, 2, 4])
-    @mock.patch("legalesign._base_client.BaseClient._calculate_retry_timeout", _low_retry_timeout)
+    @mock.patch("legalesign_sdk._base_client.BaseClient._calculate_retry_timeout", _low_retry_timeout)
     @pytest.mark.respx(base_url=base_url)
     def test_overwrite_retry_count_header(
-        self, client: Legalesign, failures_before_success: int, respx_mock: MockRouter
+        self, client: LegalesignSDK, failures_before_success: int, respx_mock: MockRouter
     ) -> None:
         client = client.with_options(max_retries=4)
 
@@ -809,9 +813,11 @@ def retry_handler(_request: httpx.Request) -> httpx.Response:
                 return httpx.Response(500)
             return httpx.Response(200)
 
-        respx_mock.get("/group/").mock(side_effect=retry_handler)
+        respx_mock.get("/document/").mock(side_effect=retry_handler)
 
-        response = client.group.with_raw_response.list(extra_headers={"x-stainless-retry-count": "42"})
+        response = client.document.with_raw_response.list(
+            group="group", extra_headers={"x-stainless-retry-count": "42"}
+        )
 
         assert response.http_request.headers.get("x-stainless-retry-count") == "42"
 
@@ -865,8 +871,8 @@ def test_follow_redirects_disabled(self, respx_mock: MockRouter) -> None:
         assert exc_info.value.response.headers["Location"] == f"{base_url}/redirected"
 
 
-class TestAsyncLegalesign:
-    client = AsyncLegalesign(base_url=base_url, api_key=api_key, _strict_response_validation=True)
+class TestAsyncLegalesignSDK:
+    client = AsyncLegalesignSDK(base_url=base_url, api_key=api_key, _strict_response_validation=True)
 
     @pytest.mark.respx(base_url=base_url)
     @pytest.mark.asyncio
@@ -915,7 +921,7 @@ def test_copy_default_options(self) -> None:
         assert isinstance(self.client.timeout, httpx.Timeout)
 
     def test_copy_default_headers(self) -> None:
-        client = AsyncLegalesign(
+        client = AsyncLegalesignSDK(
             base_url=base_url, api_key=api_key, _strict_response_validation=True, default_headers={"X-Foo": "bar"}
         )
         assert client.default_headers["X-Foo"] == "bar"
@@ -949,7 +955,7 @@ def test_copy_default_headers(self) -> None:
             client.copy(set_default_headers={}, default_headers={"X-Foo": "Bar"})
 
     def test_copy_default_query(self) -> None:
-        client = AsyncLegalesign(
+        client = AsyncLegalesignSDK(
             base_url=base_url, api_key=api_key, _strict_response_validation=True, default_query={"foo": "bar"}
         )
         assert _get_params(client)["foo"] == "bar"
@@ -1041,10 +1047,10 @@ def add_leak(leaks: list[tracemalloc.StatisticDiff], diff: tracemalloc.Statistic
                         # to_raw_response_wrapper leaks through the @functools.wraps() decorator.
                         #
                         # removing the decorator fixes the leak for reasons we don't understand.
-                        "legalesign/_legacy_response.py",
-                        "legalesign/_response.py",
+                        "legalesign_sdk/_legacy_response.py",
+                        "legalesign_sdk/_response.py",
                         # pydantic.BaseModel.model_dump || pydantic.BaseModel.dict leak memory for some reason.
-                        "legalesign/_compat.py",
+                        "legalesign_sdk/_compat.py",
                         # Standard library leaks we don't care about.
                         "/logging/__init__.py",
                     ]
@@ -1075,7 +1081,7 @@ async def test_request_timeout(self) -> None:
         assert timeout == httpx.Timeout(100.0)
 
     async def test_client_timeout_option(self) -> None:
-        client = AsyncLegalesign(
+        client = AsyncLegalesignSDK(
             base_url=base_url, api_key=api_key, _strict_response_validation=True, timeout=httpx.Timeout(0)
         )
 
@@ -1086,7 +1092,7 @@ async def test_client_timeout_option(self) -> None:
     async def test_http_client_timeout_option(self) -> None:
         # custom timeout given to the httpx client should be used
         async with httpx.AsyncClient(timeout=None) as http_client:
-            client = AsyncLegalesign(
+            client = AsyncLegalesignSDK(
                 base_url=base_url, api_key=api_key, _strict_response_validation=True, http_client=http_client
             )
 
@@ -1096,7 +1102,7 @@ async def test_http_client_timeout_option(self) -> None:
 
         # no timeout given to the httpx client should not use the httpx default
         async with httpx.AsyncClient() as http_client:
-            client = AsyncLegalesign(
+            client = AsyncLegalesignSDK(
                 base_url=base_url, api_key=api_key, _strict_response_validation=True, http_client=http_client
             )
 
@@ -1106,7 +1112,7 @@ async def test_http_client_timeout_option(self) -> None:
 
         # explicitly passing the default timeout currently results in it being ignored
         async with httpx.AsyncClient(timeout=HTTPX_DEFAULT_TIMEOUT) as http_client:
-            client = AsyncLegalesign(
+            client = AsyncLegalesignSDK(
                 base_url=base_url, api_key=api_key, _strict_response_validation=True, http_client=http_client
             )
 
@@ -1117,7 +1123,7 @@ async def test_http_client_timeout_option(self) -> None:
     def test_invalid_http_client(self) -> None:
         with pytest.raises(TypeError, match="Invalid `http_client` arg"):
             with httpx.Client() as http_client:
-                AsyncLegalesign(
+                AsyncLegalesignSDK(
                     base_url=base_url,
                     api_key=api_key,
                     _strict_response_validation=True,
@@ -1125,14 +1131,14 @@ def test_invalid_http_client(self) -> None:
                 )
 
     def test_default_headers_option(self) -> None:
-        client = AsyncLegalesign(
+        client = AsyncLegalesignSDK(
             base_url=base_url, api_key=api_key, _strict_response_validation=True, default_headers={"X-Foo": "bar"}
         )
         request = client._build_request(FinalRequestOptions(method="get", url="/foo"))
         assert request.headers.get("x-foo") == "bar"
         assert request.headers.get("x-stainless-lang") == "python"
 
-        client2 = AsyncLegalesign(
+        client2 = AsyncLegalesignSDK(
             base_url=base_url,
             api_key=api_key,
             _strict_response_validation=True,
@@ -1146,17 +1152,17 @@ def test_default_headers_option(self) -> None:
         assert request.headers.get("x-stainless-lang") == "my-overriding-header"
 
     def test_validate_headers(self) -> None:
-        client = AsyncLegalesign(base_url=base_url, api_key=api_key, _strict_response_validation=True)
+        client = AsyncLegalesignSDK(base_url=base_url, api_key=api_key, _strict_response_validation=True)
         request = client._build_request(FinalRequestOptions(method="get", url="/foo"))
         assert request.headers.get("Authorization") == api_key
 
-        with pytest.raises(LegalesignError):
-            with update_env(**{"LEGALESIGN_API_KEY": Omit()}):
-                client2 = AsyncLegalesign(base_url=base_url, api_key=None, _strict_response_validation=True)
+        with pytest.raises(LegalesignSDKError):
+            with update_env(**{"LEGALESIGN_SDK_API_KEY": Omit()}):
+                client2 = AsyncLegalesignSDK(base_url=base_url, api_key=None, _strict_response_validation=True)
             _ = client2
 
     def test_default_query_option(self) -> None:
-        client = AsyncLegalesign(
+        client = AsyncLegalesignSDK(
             base_url=base_url, api_key=api_key, _strict_response_validation=True, default_query={"query_param": "bar"}
         )
         request = client._build_request(FinalRequestOptions(method="get", url="/foo"))
@@ -1270,7 +1276,7 @@ def test_request_extra_query(self) -> None:
         params = dict(request.url.params)
         assert params == {"foo": "2"}
 
-    def test_multipart_repeating_array(self, async_client: AsyncLegalesign) -> None:
+    def test_multipart_repeating_array(self, async_client: AsyncLegalesignSDK) -> None:
         request = async_client._build_request(
             FinalRequestOptions.construct(
                 method="post",
@@ -1357,7 +1363,7 @@ class Model(BaseModel):
         assert response.foo == 2
 
     def test_base_url_setter(self) -> None:
-        client = AsyncLegalesign(
+        client = AsyncLegalesignSDK(
             base_url="https://example.com/from_init", api_key=api_key, _strict_response_validation=True
         )
         assert client.base_url == "https://example.com/from_init/"
@@ -1367,17 +1373,17 @@ def test_base_url_setter(self) -> None:
         assert client.base_url == "https://example.com/from_setter/"
 
     def test_base_url_env(self) -> None:
-        with update_env(LEGALESIGN_BASE_URL="http://localhost:5000/from/env"):
-            client = AsyncLegalesign(api_key=api_key, _strict_response_validation=True)
+        with update_env(LEGALESIGN_SDK_BASE_URL="http://localhost:5000/from/env"):
+            client = AsyncLegalesignSDK(api_key=api_key, _strict_response_validation=True)
             assert client.base_url == "http://localhost:5000/from/env/"
 
     @pytest.mark.parametrize(
         "client",
         [
-            AsyncLegalesign(
+            AsyncLegalesignSDK(
                 base_url="http://localhost:5000/custom/path/", api_key=api_key, _strict_response_validation=True
             ),
-            AsyncLegalesign(
+            AsyncLegalesignSDK(
                 base_url="http://localhost:5000/custom/path/",
                 api_key=api_key,
                 _strict_response_validation=True,
@@ -1386,7 +1392,7 @@ def test_base_url_env(self) -> None:
         ],
         ids=["standard", "custom http client"],
     )
-    def test_base_url_trailing_slash(self, client: AsyncLegalesign) -> None:
+    def test_base_url_trailing_slash(self, client: AsyncLegalesignSDK) -> None:
         request = client._build_request(
             FinalRequestOptions(
                 method="post",
@@ -1399,10 +1405,10 @@ def test_base_url_trailing_slash(self, client: AsyncLegalesign) -> None:
     @pytest.mark.parametrize(
         "client",
         [
-            AsyncLegalesign(
+            AsyncLegalesignSDK(
                 base_url="http://localhost:5000/custom/path/", api_key=api_key, _strict_response_validation=True
             ),
-            AsyncLegalesign(
+            AsyncLegalesignSDK(
                 base_url="http://localhost:5000/custom/path/",
                 api_key=api_key,
                 _strict_response_validation=True,
@@ -1411,7 +1417,7 @@ def test_base_url_trailing_slash(self, client: AsyncLegalesign) -> None:
         ],
         ids=["standard", "custom http client"],
     )
-    def test_base_url_no_trailing_slash(self, client: AsyncLegalesign) -> None:
+    def test_base_url_no_trailing_slash(self, client: AsyncLegalesignSDK) -> None:
         request = client._build_request(
             FinalRequestOptions(
                 method="post",
@@ -1424,10 +1430,10 @@ def test_base_url_no_trailing_slash(self, client: AsyncLegalesign) -> None:
     @pytest.mark.parametrize(
         "client",
         [
-            AsyncLegalesign(
+            AsyncLegalesignSDK(
                 base_url="http://localhost:5000/custom/path/", api_key=api_key, _strict_response_validation=True
             ),
-            AsyncLegalesign(
+            AsyncLegalesignSDK(
                 base_url="http://localhost:5000/custom/path/",
                 api_key=api_key,
                 _strict_response_validation=True,
@@ -1436,7 +1442,7 @@ def test_base_url_no_trailing_slash(self, client: AsyncLegalesign) -> None:
         ],
         ids=["standard", "custom http client"],
     )
-    def test_absolute_request_url(self, client: AsyncLegalesign) -> None:
+    def test_absolute_request_url(self, client: AsyncLegalesignSDK) -> None:
         request = client._build_request(
             FinalRequestOptions(
                 method="post",
@@ -1447,7 +1453,7 @@ def test_absolute_request_url(self, client: AsyncLegalesign) -> None:
         assert request.url == "https://myapi.com/foo"
 
     async def test_copied_client_does_not_close_http(self) -> None:
-        client = AsyncLegalesign(base_url=base_url, api_key=api_key, _strict_response_validation=True)
+        client = AsyncLegalesignSDK(base_url=base_url, api_key=api_key, _strict_response_validation=True)
         assert not client.is_closed()
 
         copied = client.copy()
@@ -1459,7 +1465,7 @@ async def test_copied_client_does_not_close_http(self) -> None:
         assert not client.is_closed()
 
     async def test_client_context_manager(self) -> None:
-        client = AsyncLegalesign(base_url=base_url, api_key=api_key, _strict_response_validation=True)
+        client = AsyncLegalesignSDK(base_url=base_url, api_key=api_key, _strict_response_validation=True)
         async with client as c2:
             assert c2 is client
             assert not c2.is_closed()
@@ -1481,7 +1487,7 @@ class Model(BaseModel):
 
     async def test_client_max_retries_validation(self) -> None:
         with pytest.raises(TypeError, match=r"max_retries cannot be None"):
-            AsyncLegalesign(
+            AsyncLegalesignSDK(
                 base_url=base_url, api_key=api_key, _strict_response_validation=True, max_retries=cast(Any, None)
             )
 
@@ -1493,12 +1499,12 @@ class Model(BaseModel):
 
         respx_mock.get("/foo").mock(return_value=httpx.Response(200, text="my-custom-format"))
 
-        strict_client = AsyncLegalesign(base_url=base_url, api_key=api_key, _strict_response_validation=True)
+        strict_client = AsyncLegalesignSDK(base_url=base_url, api_key=api_key, _strict_response_validation=True)
 
         with pytest.raises(APIResponseValidationError):
             await strict_client.get("/foo", cast_to=Model)
 
-        client = AsyncLegalesign(base_url=base_url, api_key=api_key, _strict_response_validation=False)
+        client = AsyncLegalesignSDK(base_url=base_url, api_key=api_key, _strict_response_validation=False)
 
         response = await client.get("/foo", cast_to=Model)
         assert isinstance(response, str)  # type: ignore[unreachable]
@@ -1527,44 +1533,44 @@ class Model(BaseModel):
     @mock.patch("time.time", mock.MagicMock(return_value=1696004797))
     @pytest.mark.asyncio
     async def test_parse_retry_after_header(self, remaining_retries: int, retry_after: str, timeout: float) -> None:
-        client = AsyncLegalesign(base_url=base_url, api_key=api_key, _strict_response_validation=True)
+        client = AsyncLegalesignSDK(base_url=base_url, api_key=api_key, _strict_response_validation=True)
 
         headers = httpx.Headers({"retry-after": retry_after})
         options = FinalRequestOptions(method="get", url="/foo", max_retries=3)
         calculated = client._calculate_retry_timeout(remaining_retries, options, headers)
         assert calculated == pytest.approx(timeout, 0.5 * 0.875)  # pyright: ignore[reportUnknownMemberType]
 
-    @mock.patch("legalesign._base_client.BaseClient._calculate_retry_timeout", _low_retry_timeout)
+    @mock.patch("legalesign_sdk._base_client.BaseClient._calculate_retry_timeout", _low_retry_timeout)
     @pytest.mark.respx(base_url=base_url)
     async def test_retrying_timeout_errors_doesnt_leak(
-        self, respx_mock: MockRouter, async_client: AsyncLegalesign
+        self, respx_mock: MockRouter, async_client: AsyncLegalesignSDK
     ) -> None:
-        respx_mock.get("/group/").mock(side_effect=httpx.TimeoutException("Test timeout error"))
+        respx_mock.get("/document/").mock(side_effect=httpx.TimeoutException("Test timeout error"))
 
         with pytest.raises(APITimeoutError):
-            await async_client.group.with_streaming_response.list().__aenter__()
+            await async_client.document.with_streaming_response.list(group="group").__aenter__()
 
         assert _get_open_connections(self.client) == 0
 
-    @mock.patch("legalesign._base_client.BaseClient._calculate_retry_timeout", _low_retry_timeout)
+    @mock.patch("legalesign_sdk._base_client.BaseClient._calculate_retry_timeout", _low_retry_timeout)
     @pytest.mark.respx(base_url=base_url)
     async def test_retrying_status_errors_doesnt_leak(
-        self, respx_mock: MockRouter, async_client: AsyncLegalesign
+        self, respx_mock: MockRouter, async_client: AsyncLegalesignSDK
     ) -> None:
-        respx_mock.get("/group/").mock(return_value=httpx.Response(500))
+        respx_mock.get("/document/").mock(return_value=httpx.Response(500))
 
         with pytest.raises(APIStatusError):
-            await async_client.group.with_streaming_response.list().__aenter__()
+            await async_client.document.with_streaming_response.list(group="group").__aenter__()
         assert _get_open_connections(self.client) == 0
 
     @pytest.mark.parametrize("failures_before_success", [0, 2, 4])
-    @mock.patch("legalesign._base_client.BaseClient._calculate_retry_timeout", _low_retry_timeout)
+    @mock.patch("legalesign_sdk._base_client.BaseClient._calculate_retry_timeout", _low_retry_timeout)
     @pytest.mark.respx(base_url=base_url)
     @pytest.mark.asyncio
     @pytest.mark.parametrize("failure_mode", ["status", "exception"])
     async def test_retries_taken(
         self,
-        async_client: AsyncLegalesign,
+        async_client: AsyncLegalesignSDK,
         failures_before_success: int,
         failure_mode: Literal["status", "exception"],
         respx_mock: MockRouter,
@@ -1582,19 +1588,19 @@ def retry_handler(_request: httpx.Request) -> httpx.Response:
                 return httpx.Response(500)
             return httpx.Response(200)
 
-        respx_mock.get("/group/").mock(side_effect=retry_handler)
+        respx_mock.get("/document/").mock(side_effect=retry_handler)
 
-        response = await client.group.with_raw_response.list()
+        response = await client.document.with_raw_response.list(group="group")
 
         assert response.retries_taken == failures_before_success
         assert int(response.http_request.headers.get("x-stainless-retry-count")) == failures_before_success
 
     @pytest.mark.parametrize("failures_before_success", [0, 2, 4])
-    @mock.patch("legalesign._base_client.BaseClient._calculate_retry_timeout", _low_retry_timeout)
+    @mock.patch("legalesign_sdk._base_client.BaseClient._calculate_retry_timeout", _low_retry_timeout)
     @pytest.mark.respx(base_url=base_url)
     @pytest.mark.asyncio
     async def test_omit_retry_count_header(
-        self, async_client: AsyncLegalesign, failures_before_success: int, respx_mock: MockRouter
+        self, async_client: AsyncLegalesignSDK, failures_before_success: int, respx_mock: MockRouter
     ) -> None:
         client = async_client.with_options(max_retries=4)
 
@@ -1607,18 +1613,20 @@ def retry_handler(_request: httpx.Request) -> httpx.Response:
                 return httpx.Response(500)
             return httpx.Response(200)
 
-        respx_mock.get("/group/").mock(side_effect=retry_handler)
+        respx_mock.get("/document/").mock(side_effect=retry_handler)
 
-        response = await client.group.with_raw_response.list(extra_headers={"x-stainless-retry-count": Omit()})
+        response = await client.document.with_raw_response.list(
+            group="group", extra_headers={"x-stainless-retry-count": Omit()}
+        )
 
         assert len(response.http_request.headers.get_list("x-stainless-retry-count")) == 0
 
     @pytest.mark.parametrize("failures_before_success", [0, 2, 4])
-    @mock.patch("legalesign._base_client.BaseClient._calculate_retry_timeout", _low_retry_timeout)
+    @mock.patch("legalesign_sdk._base_client.BaseClient._calculate_retry_timeout", _low_retry_timeout)
     @pytest.mark.respx(base_url=base_url)
     @pytest.mark.asyncio
     async def test_overwrite_retry_count_header(
-        self, async_client: AsyncLegalesign, failures_before_success: int, respx_mock: MockRouter
+        self, async_client: AsyncLegalesignSDK, failures_before_success: int, respx_mock: MockRouter
     ) -> None:
         client = async_client.with_options(max_retries=4)
 
@@ -1631,9 +1639,11 @@ def retry_handler(_request: httpx.Request) -> httpx.Response:
                 return httpx.Response(500)
             return httpx.Response(200)
 
-        respx_mock.get("/group/").mock(side_effect=retry_handler)
+        respx_mock.get("/document/").mock(side_effect=retry_handler)
 
-        response = await client.group.with_raw_response.list(extra_headers={"x-stainless-retry-count": "42"})
+        response = await client.document.with_raw_response.list(
+            group="group", extra_headers={"x-stainless-retry-count": "42"}
+        )
 
         assert response.http_request.headers.get("x-stainless-retry-count") == "42"
 
diff --git a/tests/test_deepcopy.py b/tests/test_deepcopy.py
index b706b8d..f6d11e5 100644
--- a/tests/test_deepcopy.py
+++ b/tests/test_deepcopy.py
@@ -1,4 +1,4 @@
-from legalesign._utils import deepcopy_minimal
+from legalesign_sdk._utils import deepcopy_minimal
 
 
 def assert_different_identities(obj1: object, obj2: object) -> None:
diff --git a/tests/test_extract_files.py b/tests/test_extract_files.py
index 76b479f..462ea56 100644
--- a/tests/test_extract_files.py
+++ b/tests/test_extract_files.py
@@ -4,8 +4,8 @@
 
 import pytest
 
-from legalesign._types import FileTypes
-from legalesign._utils import extract_files
+from legalesign_sdk._types import FileTypes
+from legalesign_sdk._utils import extract_files
 
 
 def test_removes_files_from_input() -> None:
diff --git a/tests/test_files.py b/tests/test_files.py
index b4f646a..b8394ed 100644
--- a/tests/test_files.py
+++ b/tests/test_files.py
@@ -4,7 +4,7 @@
 import pytest
 from dirty_equals import IsDict, IsList, IsBytes, IsTuple
 
-from legalesign._files import to_httpx_files, async_to_httpx_files
+from legalesign_sdk._files import to_httpx_files, async_to_httpx_files
 
 readme_path = Path(__file__).parent.parent.joinpath("README.md")
 
diff --git a/tests/test_models.py b/tests/test_models.py
index 032143b..8d6ac85 100644
--- a/tests/test_models.py
+++ b/tests/test_models.py
@@ -7,9 +7,9 @@
 import pydantic
 from pydantic import Field
 
-from legalesign._utils import PropertyInfo
-from legalesign._compat import PYDANTIC_V1, parse_obj, model_dump, model_json
-from legalesign._models import BaseModel, construct_type
+from legalesign_sdk._utils import PropertyInfo
+from legalesign_sdk._compat import PYDANTIC_V1, parse_obj, model_dump, model_json
+from legalesign_sdk._models import BaseModel, construct_type
 
 
 class BasicModel(BaseModel):
diff --git a/tests/test_qs.py b/tests/test_qs.py
index c1930b1..023f00c 100644
--- a/tests/test_qs.py
+++ b/tests/test_qs.py
@@ -4,7 +4,7 @@
 
 import pytest
 
-from legalesign._qs import Querystring, stringify
+from legalesign_sdk._qs import Querystring, stringify
 
 
 def test_empty() -> None:
diff --git a/tests/test_required_args.py b/tests/test_required_args.py
index e1698d3..49a102a 100644
--- a/tests/test_required_args.py
+++ b/tests/test_required_args.py
@@ -2,7 +2,7 @@
 
 import pytest
 
-from legalesign._utils import required_args
+from legalesign_sdk._utils import required_args
 
 
 def test_too_many_positional_params() -> None:
diff --git a/tests/test_response.py b/tests/test_response.py
index 9bc796e..80483bf 100644
--- a/tests/test_response.py
+++ b/tests/test_response.py
@@ -6,8 +6,8 @@
 import pytest
 import pydantic
 
-from legalesign import BaseModel, Legalesign, AsyncLegalesign
-from legalesign._response import (
+from legalesign_sdk import BaseModel, LegalesignSDK, AsyncLegalesignSDK
+from legalesign_sdk._response import (
     APIResponse,
     BaseAPIResponse,
     AsyncAPIResponse,
@@ -15,8 +15,8 @@
     AsyncBinaryAPIResponse,
     extract_response_type,
 )
-from legalesign._streaming import Stream
-from legalesign._base_client import FinalRequestOptions
+from legalesign_sdk._streaming import Stream
+from legalesign_sdk._base_client import FinalRequestOptions
 
 
 class ConcreteBaseAPIResponse(APIResponse[bytes]): ...
@@ -37,7 +37,7 @@ def test_extract_response_type_direct_classes() -> None:
 def test_extract_response_type_direct_class_missing_type_arg() -> None:
     with pytest.raises(
         RuntimeError,
-        match="Expected type  to have a type argument at index 0 but it did not",
+        match="Expected type  to have a type argument at index 0 but it did not",
     ):
         extract_response_type(AsyncAPIResponse)
 
@@ -56,7 +56,7 @@ def test_extract_response_type_binary_response() -> None:
 class PydanticModel(pydantic.BaseModel): ...
 
 
-def test_response_parse_mismatched_basemodel(client: Legalesign) -> None:
+def test_response_parse_mismatched_basemodel(client: LegalesignSDK) -> None:
     response = APIResponse(
         raw=httpx.Response(200, content=b"foo"),
         client=client,
@@ -68,13 +68,13 @@ def test_response_parse_mismatched_basemodel(client: Legalesign) -> None:
 
     with pytest.raises(
         TypeError,
-        match="Pydantic models must subclass our base model type, e.g. `from legalesign import BaseModel`",
+        match="Pydantic models must subclass our base model type, e.g. `from legalesign_sdk import BaseModel`",
     ):
         response.parse(to=PydanticModel)
 
 
 @pytest.mark.asyncio
-async def test_async_response_parse_mismatched_basemodel(async_client: AsyncLegalesign) -> None:
+async def test_async_response_parse_mismatched_basemodel(async_client: AsyncLegalesignSDK) -> None:
     response = AsyncAPIResponse(
         raw=httpx.Response(200, content=b"foo"),
         client=async_client,
@@ -86,12 +86,12 @@ async def test_async_response_parse_mismatched_basemodel(async_client: AsyncLega
 
     with pytest.raises(
         TypeError,
-        match="Pydantic models must subclass our base model type, e.g. `from legalesign import BaseModel`",
+        match="Pydantic models must subclass our base model type, e.g. `from legalesign_sdk import BaseModel`",
     ):
         await response.parse(to=PydanticModel)
 
 
-def test_response_parse_custom_stream(client: Legalesign) -> None:
+def test_response_parse_custom_stream(client: LegalesignSDK) -> None:
     response = APIResponse(
         raw=httpx.Response(200, content=b"foo"),
         client=client,
@@ -106,7 +106,7 @@ def test_response_parse_custom_stream(client: Legalesign) -> None:
 
 
 @pytest.mark.asyncio
-async def test_async_response_parse_custom_stream(async_client: AsyncLegalesign) -> None:
+async def test_async_response_parse_custom_stream(async_client: AsyncLegalesignSDK) -> None:
     response = AsyncAPIResponse(
         raw=httpx.Response(200, content=b"foo"),
         client=async_client,
@@ -125,7 +125,7 @@ class CustomModel(BaseModel):
     bar: int
 
 
-def test_response_parse_custom_model(client: Legalesign) -> None:
+def test_response_parse_custom_model(client: LegalesignSDK) -> None:
     response = APIResponse(
         raw=httpx.Response(200, content=json.dumps({"foo": "hello!", "bar": 2})),
         client=client,
@@ -141,7 +141,7 @@ def test_response_parse_custom_model(client: Legalesign) -> None:
 
 
 @pytest.mark.asyncio
-async def test_async_response_parse_custom_model(async_client: AsyncLegalesign) -> None:
+async def test_async_response_parse_custom_model(async_client: AsyncLegalesignSDK) -> None:
     response = AsyncAPIResponse(
         raw=httpx.Response(200, content=json.dumps({"foo": "hello!", "bar": 2})),
         client=async_client,
@@ -156,7 +156,7 @@ async def test_async_response_parse_custom_model(async_client: AsyncLegalesign)
     assert obj.bar == 2
 
 
-def test_response_parse_annotated_type(client: Legalesign) -> None:
+def test_response_parse_annotated_type(client: LegalesignSDK) -> None:
     response = APIResponse(
         raw=httpx.Response(200, content=json.dumps({"foo": "hello!", "bar": 2})),
         client=client,
@@ -173,7 +173,7 @@ def test_response_parse_annotated_type(client: Legalesign) -> None:
     assert obj.bar == 2
 
 
-async def test_async_response_parse_annotated_type(async_client: AsyncLegalesign) -> None:
+async def test_async_response_parse_annotated_type(async_client: AsyncLegalesignSDK) -> None:
     response = AsyncAPIResponse(
         raw=httpx.Response(200, content=json.dumps({"foo": "hello!", "bar": 2})),
         client=async_client,
@@ -201,7 +201,7 @@ async def test_async_response_parse_annotated_type(async_client: AsyncLegalesign
         ("FalSe", False),
     ],
 )
-def test_response_parse_bool(client: Legalesign, content: str, expected: bool) -> None:
+def test_response_parse_bool(client: LegalesignSDK, content: str, expected: bool) -> None:
     response = APIResponse(
         raw=httpx.Response(200, content=content),
         client=client,
@@ -226,7 +226,7 @@ def test_response_parse_bool(client: Legalesign, content: str, expected: bool) -
         ("FalSe", False),
     ],
 )
-async def test_async_response_parse_bool(client: AsyncLegalesign, content: str, expected: bool) -> None:
+async def test_async_response_parse_bool(client: AsyncLegalesignSDK, content: str, expected: bool) -> None:
     response = AsyncAPIResponse(
         raw=httpx.Response(200, content=content),
         client=client,
@@ -245,7 +245,7 @@ class OtherModel(BaseModel):
 
 
 @pytest.mark.parametrize("client", [False], indirect=True)  # loose validation
-def test_response_parse_expect_model_union_non_json_content(client: Legalesign) -> None:
+def test_response_parse_expect_model_union_non_json_content(client: LegalesignSDK) -> None:
     response = APIResponse(
         raw=httpx.Response(200, content=b"foo", headers={"Content-Type": "application/text"}),
         client=client,
@@ -262,7 +262,7 @@ def test_response_parse_expect_model_union_non_json_content(client: Legalesign)
 
 @pytest.mark.asyncio
 @pytest.mark.parametrize("async_client", [False], indirect=True)  # loose validation
-async def test_async_response_parse_expect_model_union_non_json_content(async_client: AsyncLegalesign) -> None:
+async def test_async_response_parse_expect_model_union_non_json_content(async_client: AsyncLegalesignSDK) -> None:
     response = AsyncAPIResponse(
         raw=httpx.Response(200, content=b"foo", headers={"Content-Type": "application/text"}),
         client=async_client,
diff --git a/tests/test_streaming.py b/tests/test_streaming.py
index e94c232..7c7a947 100644
--- a/tests/test_streaming.py
+++ b/tests/test_streaming.py
@@ -5,13 +5,13 @@
 import httpx
 import pytest
 
-from legalesign import Legalesign, AsyncLegalesign
-from legalesign._streaming import Stream, AsyncStream, ServerSentEvent
+from legalesign_sdk import LegalesignSDK, AsyncLegalesignSDK
+from legalesign_sdk._streaming import Stream, AsyncStream, ServerSentEvent
 
 
 @pytest.mark.asyncio
 @pytest.mark.parametrize("sync", [True, False], ids=["sync", "async"])
-async def test_basic(sync: bool, client: Legalesign, async_client: AsyncLegalesign) -> None:
+async def test_basic(sync: bool, client: LegalesignSDK, async_client: AsyncLegalesignSDK) -> None:
     def body() -> Iterator[bytes]:
         yield b"event: completion\n"
         yield b'data: {"foo":true}\n'
@@ -28,7 +28,7 @@ def body() -> Iterator[bytes]:
 
 @pytest.mark.asyncio
 @pytest.mark.parametrize("sync", [True, False], ids=["sync", "async"])
-async def test_data_missing_event(sync: bool, client: Legalesign, async_client: AsyncLegalesign) -> None:
+async def test_data_missing_event(sync: bool, client: LegalesignSDK, async_client: AsyncLegalesignSDK) -> None:
     def body() -> Iterator[bytes]:
         yield b'data: {"foo":true}\n'
         yield b"\n"
@@ -44,7 +44,7 @@ def body() -> Iterator[bytes]:
 
 @pytest.mark.asyncio
 @pytest.mark.parametrize("sync", [True, False], ids=["sync", "async"])
-async def test_event_missing_data(sync: bool, client: Legalesign, async_client: AsyncLegalesign) -> None:
+async def test_event_missing_data(sync: bool, client: LegalesignSDK, async_client: AsyncLegalesignSDK) -> None:
     def body() -> Iterator[bytes]:
         yield b"event: ping\n"
         yield b"\n"
@@ -60,7 +60,7 @@ def body() -> Iterator[bytes]:
 
 @pytest.mark.asyncio
 @pytest.mark.parametrize("sync", [True, False], ids=["sync", "async"])
-async def test_multiple_events(sync: bool, client: Legalesign, async_client: AsyncLegalesign) -> None:
+async def test_multiple_events(sync: bool, client: LegalesignSDK, async_client: AsyncLegalesignSDK) -> None:
     def body() -> Iterator[bytes]:
         yield b"event: ping\n"
         yield b"\n"
@@ -82,7 +82,7 @@ def body() -> Iterator[bytes]:
 
 @pytest.mark.asyncio
 @pytest.mark.parametrize("sync", [True, False], ids=["sync", "async"])
-async def test_multiple_events_with_data(sync: bool, client: Legalesign, async_client: AsyncLegalesign) -> None:
+async def test_multiple_events_with_data(sync: bool, client: LegalesignSDK, async_client: AsyncLegalesignSDK) -> None:
     def body() -> Iterator[bytes]:
         yield b"event: ping\n"
         yield b'data: {"foo":true}\n'
@@ -107,7 +107,7 @@ def body() -> Iterator[bytes]:
 @pytest.mark.asyncio
 @pytest.mark.parametrize("sync", [True, False], ids=["sync", "async"])
 async def test_multiple_data_lines_with_empty_line(
-    sync: bool, client: Legalesign, async_client: AsyncLegalesign
+    sync: bool, client: LegalesignSDK, async_client: AsyncLegalesignSDK
 ) -> None:
     def body() -> Iterator[bytes]:
         yield b"event: ping\n"
@@ -130,7 +130,9 @@ def body() -> Iterator[bytes]:
 
 @pytest.mark.asyncio
 @pytest.mark.parametrize("sync", [True, False], ids=["sync", "async"])
-async def test_data_json_escaped_double_new_line(sync: bool, client: Legalesign, async_client: AsyncLegalesign) -> None:
+async def test_data_json_escaped_double_new_line(
+    sync: bool, client: LegalesignSDK, async_client: AsyncLegalesignSDK
+) -> None:
     def body() -> Iterator[bytes]:
         yield b"event: ping\n"
         yield b'data: {"foo": "my long\\n\\ncontent"}'
@@ -147,7 +149,7 @@ def body() -> Iterator[bytes]:
 
 @pytest.mark.asyncio
 @pytest.mark.parametrize("sync", [True, False], ids=["sync", "async"])
-async def test_multiple_data_lines(sync: bool, client: Legalesign, async_client: AsyncLegalesign) -> None:
+async def test_multiple_data_lines(sync: bool, client: LegalesignSDK, async_client: AsyncLegalesignSDK) -> None:
     def body() -> Iterator[bytes]:
         yield b"event: ping\n"
         yield b"data: {\n"
@@ -167,8 +169,8 @@ def body() -> Iterator[bytes]:
 @pytest.mark.parametrize("sync", [True, False], ids=["sync", "async"])
 async def test_special_new_line_character(
     sync: bool,
-    client: Legalesign,
-    async_client: AsyncLegalesign,
+    client: LegalesignSDK,
+    async_client: AsyncLegalesignSDK,
 ) -> None:
     def body() -> Iterator[bytes]:
         yield b'data: {"content":" culpa"}\n'
@@ -198,8 +200,8 @@ def body() -> Iterator[bytes]:
 @pytest.mark.parametrize("sync", [True, False], ids=["sync", "async"])
 async def test_multi_byte_character_multiple_chunks(
     sync: bool,
-    client: Legalesign,
-    async_client: AsyncLegalesign,
+    client: LegalesignSDK,
+    async_client: AsyncLegalesignSDK,
 ) -> None:
     def body() -> Iterator[bytes]:
         yield b'data: {"content":"'
@@ -239,8 +241,8 @@ def make_event_iterator(
     content: Iterator[bytes],
     *,
     sync: bool,
-    client: Legalesign,
-    async_client: AsyncLegalesign,
+    client: LegalesignSDK,
+    async_client: AsyncLegalesignSDK,
 ) -> Iterator[ServerSentEvent] | AsyncIterator[ServerSentEvent]:
     if sync:
         return Stream(cast_to=object, client=client, response=httpx.Response(200, content=content))._iter_events()
diff --git a/tests/test_transform.py b/tests/test_transform.py
index decb91a..2b47046 100644
--- a/tests/test_transform.py
+++ b/tests/test_transform.py
@@ -8,15 +8,15 @@
 
 import pytest
 
-from legalesign._types import Base64FileInput, omit, not_given
-from legalesign._utils import (
+from legalesign_sdk._types import Base64FileInput, omit, not_given
+from legalesign_sdk._utils import (
     PropertyInfo,
     transform as _transform,
     parse_datetime,
     async_transform as _async_transform,
 )
-from legalesign._compat import PYDANTIC_V1
-from legalesign._models import BaseModel
+from legalesign_sdk._compat import PYDANTIC_V1
+from legalesign_sdk._models import BaseModel
 
 _T = TypeVar("_T")
 
diff --git a/tests/test_utils/test_datetime_parse.py b/tests/test_utils/test_datetime_parse.py
index 4761817..c733376 100644
--- a/tests/test_utils/test_datetime_parse.py
+++ b/tests/test_utils/test_datetime_parse.py
@@ -8,7 +8,7 @@
 
 import pytest
 
-from legalesign._utils import parse_date, parse_datetime
+from legalesign_sdk._utils import parse_date, parse_datetime
 
 
 def create_tz(minutes: int) -> timezone:
diff --git a/tests/test_utils/test_proxy.py b/tests/test_utils/test_proxy.py
index 88a6cd3..a05f364 100644
--- a/tests/test_utils/test_proxy.py
+++ b/tests/test_utils/test_proxy.py
@@ -2,7 +2,7 @@
 from typing import Any
 from typing_extensions import override
 
-from legalesign._utils import LazyProxy
+from legalesign_sdk._utils import LazyProxy
 
 
 class RecursiveLazyProxy(LazyProxy[Any]):
diff --git a/tests/test_utils/test_typing.py b/tests/test_utils/test_typing.py
index ef4101a..4d8dd9c 100644
--- a/tests/test_utils/test_typing.py
+++ b/tests/test_utils/test_typing.py
@@ -2,7 +2,7 @@
 
 from typing import Generic, TypeVar, cast
 
-from legalesign._utils import extract_type_var_from_base
+from legalesign_sdk._utils import extract_type_var_from_base
 
 _T = TypeVar("_T")
 _T2 = TypeVar("_T2")
diff --git a/tests/utils.py b/tests/utils.py
index 2020a4a..9a120cf 100644
--- a/tests/utils.py
+++ b/tests/utils.py
@@ -8,8 +8,8 @@
 from datetime import date, datetime
 from typing_extensions import Literal, get_args, get_origin, assert_type
 
-from legalesign._types import Omit, NoneType
-from legalesign._utils import (
+from legalesign_sdk._types import Omit, NoneType
+from legalesign_sdk._utils import (
     is_dict,
     is_list,
     is_list_type,
@@ -19,8 +19,8 @@
     is_annotated_type,
     is_type_alias_type,
 )
-from legalesign._compat import PYDANTIC_V1, field_outer_type, get_model_fields
-from legalesign._models import BaseModel
+from legalesign_sdk._compat import PYDANTIC_V1, field_outer_type, get_model_fields
+from legalesign_sdk._models import BaseModel
 
 BaseModelT = TypeVar("BaseModelT", bound=BaseModel)
 
From 825250b8d77a09bc829cc9083351063098857613 Mon Sep 17 00:00:00 2001
From: "stainless-app[bot]"
 <142633134+stainless-app[bot]@users.noreply.github.com>
Date: Tue, 23 Sep 2025 11:10:33 +0000
Subject: [PATCH 2/7] chore: update SDK settings
---
 .github/workflows/publish-pypi.yml            | 31 +++++++++
 .github/workflows/release-doctor.yml          | 21 ++++++
 .release-please-manifest.json                 |  3 +
 CONTRIBUTING.md                               |  4 +-
 README.md                                     | 19 +++---
 bin/check-release-environment                 | 21 ++++++
 pyproject.toml                                | 12 ++--
 release-please-config.json                    | 66 +++++++++++++++++++
 requirements-dev.lock                         | 16 ++---
 requirements.lock                             | 16 ++---
 src/legalesign_sdk/_version.py                |  2 +-
 src/legalesign_sdk/resources/document.py      |  8 +--
 src/legalesign_sdk/resources/group.py         |  8 +--
 src/legalesign_sdk/resources/pdf.py           |  8 +--
 src/legalesign_sdk/resources/signer.py        |  8 +--
 src/legalesign_sdk/resources/status.py        |  8 +--
 src/legalesign_sdk/resources/template.py      |  8 +--
 .../resources/templatepdf/fields.py           |  8 +--
 .../resources/templatepdf/templatepdf.py      |  8 +--
 19 files changed, 207 insertions(+), 68 deletions(-)
 create mode 100644 .github/workflows/publish-pypi.yml
 create mode 100644 .github/workflows/release-doctor.yml
 create mode 100644 .release-please-manifest.json
 create mode 100644 bin/check-release-environment
 create mode 100644 release-please-config.json
diff --git a/.github/workflows/publish-pypi.yml b/.github/workflows/publish-pypi.yml
new file mode 100644
index 0000000..3755daa
--- /dev/null
+++ b/.github/workflows/publish-pypi.yml
@@ -0,0 +1,31 @@
+# This workflow is triggered when a GitHub release is created.
+# It can also be run manually to re-publish to PyPI in case it failed for some reason.
+# You can run this workflow by navigating to https://www.github.com/legalesign/legalesign-rest-python/actions/workflows/publish-pypi.yml
+name: Publish PyPI
+on:
+  workflow_dispatch:
+
+  release:
+    types: [published]
+
+jobs:
+  publish:
+    name: publish
+    runs-on: ubuntu-latest
+
+    steps:
+      - uses: actions/checkout@v4
+
+      - name: Install Rye
+        run: |
+          curl -sSf https://rye.astral.sh/get | bash
+          echo "$HOME/.rye/shims" >> $GITHUB_PATH
+        env:
+          RYE_VERSION: '0.44.0'
+          RYE_INSTALL_OPTION: '--yes'
+
+      - name: Publish to PyPI
+        run: |
+          bash ./bin/publish-pypi
+        env:
+          PYPI_TOKEN: ${{ secrets.LEGALESIGN_SDK_PYPI_TOKEN || secrets.PYPI_TOKEN }}
diff --git a/.github/workflows/release-doctor.yml b/.github/workflows/release-doctor.yml
new file mode 100644
index 0000000..9b16671
--- /dev/null
+++ b/.github/workflows/release-doctor.yml
@@ -0,0 +1,21 @@
+name: Release Doctor
+on:
+  pull_request:
+    branches:
+      - main
+  workflow_dispatch:
+
+jobs:
+  release_doctor:
+    name: release doctor
+    runs-on: ubuntu-latest
+    if: github.repository == 'legalesign/legalesign-rest-python' && (github.event_name == 'push' || github.event_name == 'workflow_dispatch' || startsWith(github.head_ref, 'release-please') || github.head_ref == 'next')
+
+    steps:
+      - uses: actions/checkout@v4
+
+      - name: Check release environment
+        run: |
+          bash ./bin/check-release-environment
+        env:
+          PYPI_TOKEN: ${{ secrets.LEGALESIGN_SDK_PYPI_TOKEN || secrets.PYPI_TOKEN }}
diff --git a/.release-please-manifest.json b/.release-please-manifest.json
new file mode 100644
index 0000000..b55c11f
--- /dev/null
+++ b/.release-please-manifest.json
@@ -0,0 +1,3 @@
+{
+  ".": "1.1.1"
+}
\ No newline at end of file
diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md
index d4304ec..9396942 100644
--- a/CONTRIBUTING.md
+++ b/CONTRIBUTING.md
@@ -62,7 +62,7 @@ If you’d like to use the repository from source, you can either install from g
 To install via git:
 
 ```sh
-$ pip install git+ssh://git@github.com/stainless-sdks/legalesign-sdk-python.git
+$ pip install git+ssh://git@github.com/legalesign/legalesign-rest-python.git
 ```
 
 Alternatively, you can build from source and install the wheel file:
@@ -120,7 +120,7 @@ the changes aren't made through the automated pipeline, you may want to make rel
 
 ### Publish with a GitHub workflow
 
-You can release to package managers by using [the `Publish PyPI` GitHub action](https://www.github.com/stainless-sdks/legalesign-sdk-python/actions/workflows/publish-pypi.yml). This requires a setup organization or repository secret to be set up.
+You can release to package managers by using [the `Publish PyPI` GitHub action](https://www.github.com/legalesign/legalesign-rest-python/actions/workflows/publish-pypi.yml). This requires a setup organization or repository secret to be set up.
 
 ### Publish manually
 
diff --git a/README.md b/README.md
index c7a408f..265dbcf 100644
--- a/README.md
+++ b/README.md
@@ -1,7 +1,7 @@
 # Legalesign SDK Python API library
 
 
-[)](https://pypi.org/project/legalesign_sdk/)
+[)](https://pypi.org/project/legalesign/)
 
 The Legalesign SDK Python library provides convenient access to the Legalesign SDK REST API from any Python 3.8+
 application. The library includes type definitions for all request params and response fields,
@@ -16,13 +16,10 @@ The REST API documentation can be found on [legalesign.com](https://legalesign.c
 ## Installation
 
 ```sh
-# install from this staging repo
-pip install git+ssh://git@github.com/stainless-sdks/legalesign-sdk-python.git
+# install from PyPI
+pip install legalesign
 ```
 
-> [!NOTE]
-> Once this package is [published to PyPI](https://www.stainless.com/docs/guides/publish), this will become: `pip install legalesign_sdk`
-
 ## Usage
 
 The full API of this library can be found in [api.md](api.md).
@@ -79,8 +76,8 @@ By default, the async client uses `httpx` for HTTP requests. However, for improv
 You can enable this by installing `aiohttp`:
 
 ```sh
-# install from this staging repo
-pip install 'legalesign_sdk[aiohttp] @ git+ssh://git@github.com/stainless-sdks/legalesign-sdk-python.git'
+# install from PyPI
+pip install legalesign[aiohttp]
 ```
 
 Then you can enable it by instantiating the client with `http_client=DefaultAioHttpClient()`:
@@ -252,9 +249,9 @@ document = response.parse()  # get the object that `document.list()` would have
 print(document.meta)
 ```
 
-These methods return an [`APIResponse`](https://github.com/stainless-sdks/legalesign-sdk-python/tree/main/src/legalesign_sdk/_response.py) object.
+These methods return an [`APIResponse`](https://github.com/legalesign/legalesign-rest-python/tree/main/src/legalesign_sdk/_response.py) object.
 
-The async client returns an [`AsyncAPIResponse`](https://github.com/stainless-sdks/legalesign-sdk-python/tree/main/src/legalesign_sdk/_response.py) with the same structure, the only difference being `await`able methods for reading the response content.
+The async client returns an [`AsyncAPIResponse`](https://github.com/legalesign/legalesign-rest-python/tree/main/src/legalesign_sdk/_response.py) with the same structure, the only difference being `await`able methods for reading the response content.
 
 #### `.with_streaming_response`
 
@@ -360,7 +357,7 @@ This package generally follows [SemVer](https://semver.org/spec/v2.0.0.html) con
 
 We take backwards-compatibility seriously and work hard to ensure you can rely on a smooth upgrade experience.
 
-We are keen for your feedback; please open an [issue](https://www.github.com/stainless-sdks/legalesign-sdk-python/issues) with questions, bugs, or suggestions.
+We are keen for your feedback; please open an [issue](https://www.github.com/legalesign/legalesign-rest-python/issues) with questions, bugs, or suggestions.
 
 ### Determining the installed version
 
diff --git a/bin/check-release-environment b/bin/check-release-environment
new file mode 100644
index 0000000..b845b0f
--- /dev/null
+++ b/bin/check-release-environment
@@ -0,0 +1,21 @@
+#!/usr/bin/env bash
+
+errors=()
+
+if [ -z "${PYPI_TOKEN}" ]; then
+  errors+=("The PYPI_TOKEN secret has not been set. Please set it in either this repository's secrets or your organization secrets.")
+fi
+
+lenErrors=${#errors[@]}
+
+if [[ lenErrors -gt 0 ]]; then
+  echo -e "Found the following errors in the release environment:\n"
+
+  for error in "${errors[@]}"; do
+    echo -e "- $error\n"
+  done
+
+  exit 1
+fi
+
+echo "The environment is ready to push releases!"
diff --git a/pyproject.toml b/pyproject.toml
index 2288eae..f417e43 100644
--- a/pyproject.toml
+++ b/pyproject.toml
@@ -1,7 +1,7 @@
 [project]
 name = "legalesign"
 version = "1.1.1"
-description = "The official Python library for the legalesign API"
+description = "The official Python library for the legalesign-sdk API"
 dynamic = ["readme"]
 license = "Apache-2.0"
 authors = [
@@ -78,14 +78,14 @@ format = { chain = [
 "check:ruff" = "ruff check ."
 "fix:ruff" = "ruff check --fix ."
 
-"check:importable" = "python -c 'import legalesign'"
+"check:importable" = "python -c 'import legalesign_sdk'"
 
 typecheck = { chain = [
   "typecheck:pyright",
   "typecheck:mypy"
 ]}
 "typecheck:pyright" = "pyright"
-"typecheck:verify-types" = "pyright --verifytypes legalesign --ignoreexternal"
+"typecheck:verify-types" = "pyright --verifytypes legalesign_sdk --ignoreexternal"
 "typecheck:mypy" = "mypy ."
 
 [build-system]
@@ -98,7 +98,7 @@ include = [
 ]
 
 [tool.hatch.build.targets.wheel]
-packages = ["src/legalesign"]
+packages = ["src/legalesign_sdk"]
 
 [tool.hatch.build.targets.sdist]
 # Basically everything except hidden files/directories (such as .github, .devcontainers, .python-version, etc)
@@ -166,7 +166,7 @@ show_error_codes = true
 #
 # We also exclude our `tests` as mypy doesn't always infer
 # types correctly and Pyright will still catch any type errors.
-exclude = ['src/legalesign/_files.py', '_dev/.*.py', 'tests/.*']
+exclude = ['src/legalesign_sdk/_files.py', '_dev/.*.py', 'tests/.*']
 
 strict_equality = true
 implicit_reexport = true
@@ -254,7 +254,7 @@ length-sort = true
 length-sort-straight = true
 combine-as-imports = true
 extra-standard-library = ["typing_extensions"]
-known-first-party = ["legalesign", "tests"]
+known-first-party = ["legalesign_sdk", "tests"]
 
 [tool.ruff.lint.per-file-ignores]
 "bin/**.py" = ["T201", "T203"]
diff --git a/release-please-config.json b/release-please-config.json
new file mode 100644
index 0000000..0ef32d9
--- /dev/null
+++ b/release-please-config.json
@@ -0,0 +1,66 @@
+{
+  "packages": {
+    ".": {}
+  },
+  "$schema": "https://raw.githubusercontent.com/stainless-api/release-please/main/schemas/config.json",
+  "include-v-in-tag": true,
+  "include-component-in-tag": false,
+  "versioning": "prerelease",
+  "prerelease": true,
+  "bump-minor-pre-major": true,
+  "bump-patch-for-minor-pre-major": false,
+  "pull-request-header": "Automated Release PR",
+  "pull-request-title-pattern": "release: ${version}",
+  "changelog-sections": [
+    {
+      "type": "feat",
+      "section": "Features"
+    },
+    {
+      "type": "fix",
+      "section": "Bug Fixes"
+    },
+    {
+      "type": "perf",
+      "section": "Performance Improvements"
+    },
+    {
+      "type": "revert",
+      "section": "Reverts"
+    },
+    {
+      "type": "chore",
+      "section": "Chores"
+    },
+    {
+      "type": "docs",
+      "section": "Documentation"
+    },
+    {
+      "type": "style",
+      "section": "Styles"
+    },
+    {
+      "type": "refactor",
+      "section": "Refactors"
+    },
+    {
+      "type": "test",
+      "section": "Tests",
+      "hidden": true
+    },
+    {
+      "type": "build",
+      "section": "Build System"
+    },
+    {
+      "type": "ci",
+      "section": "Continuous Integration",
+      "hidden": true
+    }
+  ],
+  "release-type": "python",
+  "extra-files": [
+    "src/legalesign_sdk/_version.py"
+  ]
+}
\ No newline at end of file
diff --git a/requirements-dev.lock b/requirements-dev.lock
index 7964cd8..a55834a 100644
--- a/requirements-dev.lock
+++ b/requirements-dev.lock
@@ -14,14 +14,14 @@ aiohappyeyeballs==2.6.1
     # via aiohttp
 aiohttp==3.12.8
     # via httpx-aiohttp
-    # via legalesign-sdk
+    # via legalesign
 aiosignal==1.3.2
     # via aiohttp
 annotated-types==0.6.0
     # via pydantic
 anyio==4.4.0
     # via httpx
-    # via legalesign-sdk
+    # via legalesign
 argcomplete==3.1.2
     # via nox
 async-timeout==5.0.1
@@ -37,7 +37,7 @@ dirty-equals==0.6.0
 distlib==0.3.7
     # via virtualenv
 distro==1.8.0
-    # via legalesign-sdk
+    # via legalesign
 exceptiongroup==1.2.2
     # via anyio
     # via pytest
@@ -54,10 +54,10 @@ httpcore==1.0.9
     # via httpx
 httpx==0.28.1
     # via httpx-aiohttp
-    # via legalesign-sdk
+    # via legalesign
     # via respx
 httpx-aiohttp==0.1.8
-    # via legalesign-sdk
+    # via legalesign
 idna==3.4
     # via anyio
     # via httpx
@@ -89,7 +89,7 @@ propcache==0.3.1
     # via aiohttp
     # via yarl
 pydantic==2.11.9
-    # via legalesign-sdk
+    # via legalesign
 pydantic-core==2.33.2
     # via pydantic
 pygments==2.18.0
@@ -113,14 +113,14 @@ six==1.16.0
     # via python-dateutil
 sniffio==1.3.0
     # via anyio
-    # via legalesign-sdk
+    # via legalesign
 time-machine==2.9.0
 tomli==2.0.2
     # via mypy
     # via pytest
 typing-extensions==4.12.2
     # via anyio
-    # via legalesign-sdk
+    # via legalesign
     # via multidict
     # via mypy
     # via pydantic
diff --git a/requirements.lock b/requirements.lock
index 2abc4a9..735fadc 100644
--- a/requirements.lock
+++ b/requirements.lock
@@ -14,14 +14,14 @@ aiohappyeyeballs==2.6.1
     # via aiohttp
 aiohttp==3.12.8
     # via httpx-aiohttp
-    # via legalesign-sdk
+    # via legalesign
 aiosignal==1.3.2
     # via aiohttp
 annotated-types==0.6.0
     # via pydantic
 anyio==4.4.0
     # via httpx
-    # via legalesign-sdk
+    # via legalesign
 async-timeout==5.0.1
     # via aiohttp
 attrs==25.3.0
@@ -30,7 +30,7 @@ certifi==2023.7.22
     # via httpcore
     # via httpx
 distro==1.8.0
-    # via legalesign-sdk
+    # via legalesign
 exceptiongroup==1.2.2
     # via anyio
 frozenlist==1.6.2
@@ -42,9 +42,9 @@ httpcore==1.0.9
     # via httpx
 httpx==0.28.1
     # via httpx-aiohttp
-    # via legalesign-sdk
+    # via legalesign
 httpx-aiohttp==0.1.8
-    # via legalesign-sdk
+    # via legalesign
 idna==3.4
     # via anyio
     # via httpx
@@ -56,15 +56,15 @@ propcache==0.3.1
     # via aiohttp
     # via yarl
 pydantic==2.11.9
-    # via legalesign-sdk
+    # via legalesign
 pydantic-core==2.33.2
     # via pydantic
 sniffio==1.3.0
     # via anyio
-    # via legalesign-sdk
+    # via legalesign
 typing-extensions==4.12.2
     # via anyio
-    # via legalesign-sdk
+    # via legalesign
     # via multidict
     # via pydantic
     # via pydantic-core
diff --git a/src/legalesign_sdk/_version.py b/src/legalesign_sdk/_version.py
index dd0fb66..4b649a4 100644
--- a/src/legalesign_sdk/_version.py
+++ b/src/legalesign_sdk/_version.py
@@ -1,4 +1,4 @@
 # File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.
 
-__title__ = "legalesign"
+__title__ = "legalesign_sdk"
 __version__ = "1.1.1"  # x-release-please-version
diff --git a/src/legalesign_sdk/resources/document.py b/src/legalesign_sdk/resources/document.py
index a384df0..76f4bb7 100644
--- a/src/legalesign_sdk/resources/document.py
+++ b/src/legalesign_sdk/resources/document.py
@@ -35,7 +35,7 @@ def with_raw_response(self) -> DocumentResourceWithRawResponse:
         This property can be used as a prefix for any HTTP method call to return
         the raw response object instead of the parsed content.
 
-        For more information, see https://www.github.com/stainless-sdks/legalesign-sdk-python#accessing-raw-response-data-eg-headers
+        For more information, see https://www.github.com/legalesign/legalesign-rest-python#accessing-raw-response-data-eg-headers
         """
         return DocumentResourceWithRawResponse(self)
 
@@ -44,7 +44,7 @@ def with_streaming_response(self) -> DocumentResourceWithStreamingResponse:
         """
         An alternative to `.with_raw_response` that doesn't eagerly read the response body.
 
-        For more information, see https://www.github.com/stainless-sdks/legalesign-sdk-python#with_streaming_response
+        For more information, see https://www.github.com/legalesign/legalesign-rest-python#with_streaming_response
         """
         return DocumentResourceWithStreamingResponse(self)
 
@@ -426,7 +426,7 @@ def with_raw_response(self) -> AsyncDocumentResourceWithRawResponse:
         This property can be used as a prefix for any HTTP method call to return
         the raw response object instead of the parsed content.
 
-        For more information, see https://www.github.com/stainless-sdks/legalesign-sdk-python#accessing-raw-response-data-eg-headers
+        For more information, see https://www.github.com/legalesign/legalesign-rest-python#accessing-raw-response-data-eg-headers
         """
         return AsyncDocumentResourceWithRawResponse(self)
 
@@ -435,7 +435,7 @@ def with_streaming_response(self) -> AsyncDocumentResourceWithStreamingResponse:
         """
         An alternative to `.with_raw_response` that doesn't eagerly read the response body.
 
-        For more information, see https://www.github.com/stainless-sdks/legalesign-sdk-python#with_streaming_response
+        For more information, see https://www.github.com/legalesign/legalesign-rest-python#with_streaming_response
         """
         return AsyncDocumentResourceWithStreamingResponse(self)
 
diff --git a/src/legalesign_sdk/resources/group.py b/src/legalesign_sdk/resources/group.py
index 91a23c5..800adf6 100644
--- a/src/legalesign_sdk/resources/group.py
+++ b/src/legalesign_sdk/resources/group.py
@@ -29,7 +29,7 @@ def with_raw_response(self) -> GroupResourceWithRawResponse:
         This property can be used as a prefix for any HTTP method call to return
         the raw response object instead of the parsed content.
 
-        For more information, see https://www.github.com/stainless-sdks/legalesign-sdk-python#accessing-raw-response-data-eg-headers
+        For more information, see https://www.github.com/legalesign/legalesign-rest-python#accessing-raw-response-data-eg-headers
         """
         return GroupResourceWithRawResponse(self)
 
@@ -38,7 +38,7 @@ def with_streaming_response(self) -> GroupResourceWithStreamingResponse:
         """
         An alternative to `.with_raw_response` that doesn't eagerly read the response body.
 
-        For more information, see https://www.github.com/stainless-sdks/legalesign-sdk-python#with_streaming_response
+        For more information, see https://www.github.com/legalesign/legalesign-rest-python#with_streaming_response
         """
         return GroupResourceWithStreamingResponse(self)
 
@@ -173,7 +173,7 @@ def with_raw_response(self) -> AsyncGroupResourceWithRawResponse:
         This property can be used as a prefix for any HTTP method call to return
         the raw response object instead of the parsed content.
 
-        For more information, see https://www.github.com/stainless-sdks/legalesign-sdk-python#accessing-raw-response-data-eg-headers
+        For more information, see https://www.github.com/legalesign/legalesign-rest-python#accessing-raw-response-data-eg-headers
         """
         return AsyncGroupResourceWithRawResponse(self)
 
@@ -182,7 +182,7 @@ def with_streaming_response(self) -> AsyncGroupResourceWithStreamingResponse:
         """
         An alternative to `.with_raw_response` that doesn't eagerly read the response body.
 
-        For more information, see https://www.github.com/stainless-sdks/legalesign-sdk-python#with_streaming_response
+        For more information, see https://www.github.com/legalesign/legalesign-rest-python#with_streaming_response
         """
         return AsyncGroupResourceWithStreamingResponse(self)
 
diff --git a/src/legalesign_sdk/resources/pdf.py b/src/legalesign_sdk/resources/pdf.py
index ced370b..71d3891 100644
--- a/src/legalesign_sdk/resources/pdf.py
+++ b/src/legalesign_sdk/resources/pdf.py
@@ -29,7 +29,7 @@ def with_raw_response(self) -> PdfResourceWithRawResponse:
         This property can be used as a prefix for any HTTP method call to return
         the raw response object instead of the parsed content.
 
-        For more information, see https://www.github.com/stainless-sdks/legalesign-sdk-python#accessing-raw-response-data-eg-headers
+        For more information, see https://www.github.com/legalesign/legalesign-rest-python#accessing-raw-response-data-eg-headers
         """
         return PdfResourceWithRawResponse(self)
 
@@ -38,7 +38,7 @@ def with_streaming_response(self) -> PdfResourceWithStreamingResponse:
         """
         An alternative to `.with_raw_response` that doesn't eagerly read the response body.
 
-        For more information, see https://www.github.com/stainless-sdks/legalesign-sdk-python#with_streaming_response
+        For more information, see https://www.github.com/legalesign/legalesign-rest-python#with_streaming_response
         """
         return PdfResourceWithStreamingResponse(self)
 
@@ -84,7 +84,7 @@ def with_raw_response(self) -> AsyncPdfResourceWithRawResponse:
         This property can be used as a prefix for any HTTP method call to return
         the raw response object instead of the parsed content.
 
-        For more information, see https://www.github.com/stainless-sdks/legalesign-sdk-python#accessing-raw-response-data-eg-headers
+        For more information, see https://www.github.com/legalesign/legalesign-rest-python#accessing-raw-response-data-eg-headers
         """
         return AsyncPdfResourceWithRawResponse(self)
 
@@ -93,7 +93,7 @@ def with_streaming_response(self) -> AsyncPdfResourceWithStreamingResponse:
         """
         An alternative to `.with_raw_response` that doesn't eagerly read the response body.
 
-        For more information, see https://www.github.com/stainless-sdks/legalesign-sdk-python#with_streaming_response
+        For more information, see https://www.github.com/legalesign/legalesign-rest-python#with_streaming_response
         """
         return AsyncPdfResourceWithStreamingResponse(self)
 
diff --git a/src/legalesign_sdk/resources/signer.py b/src/legalesign_sdk/resources/signer.py
index 6690f48..04727fc 100644
--- a/src/legalesign_sdk/resources/signer.py
+++ b/src/legalesign_sdk/resources/signer.py
@@ -29,7 +29,7 @@ def with_raw_response(self) -> SignerResourceWithRawResponse:
         This property can be used as a prefix for any HTTP method call to return
         the raw response object instead of the parsed content.
 
-        For more information, see https://www.github.com/stainless-sdks/legalesign-sdk-python#accessing-raw-response-data-eg-headers
+        For more information, see https://www.github.com/legalesign/legalesign-rest-python#accessing-raw-response-data-eg-headers
         """
         return SignerResourceWithRawResponse(self)
 
@@ -38,7 +38,7 @@ def with_streaming_response(self) -> SignerResourceWithStreamingResponse:
         """
         An alternative to `.with_raw_response` that doesn't eagerly read the response body.
 
-        For more information, see https://www.github.com/stainless-sdks/legalesign-sdk-python#with_streaming_response
+        For more information, see https://www.github.com/legalesign/legalesign-rest-python#with_streaming_response
         """
         return SignerResourceWithStreamingResponse(self)
 
@@ -188,7 +188,7 @@ def with_raw_response(self) -> AsyncSignerResourceWithRawResponse:
         This property can be used as a prefix for any HTTP method call to return
         the raw response object instead of the parsed content.
 
-        For more information, see https://www.github.com/stainless-sdks/legalesign-sdk-python#accessing-raw-response-data-eg-headers
+        For more information, see https://www.github.com/legalesign/legalesign-rest-python#accessing-raw-response-data-eg-headers
         """
         return AsyncSignerResourceWithRawResponse(self)
 
@@ -197,7 +197,7 @@ def with_streaming_response(self) -> AsyncSignerResourceWithStreamingResponse:
         """
         An alternative to `.with_raw_response` that doesn't eagerly read the response body.
 
-        For more information, see https://www.github.com/stainless-sdks/legalesign-sdk-python#with_streaming_response
+        For more information, see https://www.github.com/legalesign/legalesign-rest-python#with_streaming_response
         """
         return AsyncSignerResourceWithStreamingResponse(self)
 
diff --git a/src/legalesign_sdk/resources/status.py b/src/legalesign_sdk/resources/status.py
index e64011c..ea44157 100644
--- a/src/legalesign_sdk/resources/status.py
+++ b/src/legalesign_sdk/resources/status.py
@@ -26,7 +26,7 @@ def with_raw_response(self) -> StatusResourceWithRawResponse:
         This property can be used as a prefix for any HTTP method call to return
         the raw response object instead of the parsed content.
 
-        For more information, see https://www.github.com/stainless-sdks/legalesign-sdk-python#accessing-raw-response-data-eg-headers
+        For more information, see https://www.github.com/legalesign/legalesign-rest-python#accessing-raw-response-data-eg-headers
         """
         return StatusResourceWithRawResponse(self)
 
@@ -35,7 +35,7 @@ def with_streaming_response(self) -> StatusResourceWithStreamingResponse:
         """
         An alternative to `.with_raw_response` that doesn't eagerly read the response body.
 
-        For more information, see https://www.github.com/stainless-sdks/legalesign-sdk-python#with_streaming_response
+        For more information, see https://www.github.com/legalesign/legalesign-rest-python#with_streaming_response
         """
         return StatusResourceWithStreamingResponse(self)
 
@@ -80,7 +80,7 @@ def with_raw_response(self) -> AsyncStatusResourceWithRawResponse:
         This property can be used as a prefix for any HTTP method call to return
         the raw response object instead of the parsed content.
 
-        For more information, see https://www.github.com/stainless-sdks/legalesign-sdk-python#accessing-raw-response-data-eg-headers
+        For more information, see https://www.github.com/legalesign/legalesign-rest-python#accessing-raw-response-data-eg-headers
         """
         return AsyncStatusResourceWithRawResponse(self)
 
@@ -89,7 +89,7 @@ def with_streaming_response(self) -> AsyncStatusResourceWithStreamingResponse:
         """
         An alternative to `.with_raw_response` that doesn't eagerly read the response body.
 
-        For more information, see https://www.github.com/stainless-sdks/legalesign-sdk-python#with_streaming_response
+        For more information, see https://www.github.com/legalesign/legalesign-rest-python#with_streaming_response
         """
         return AsyncStatusResourceWithStreamingResponse(self)
 
diff --git a/src/legalesign_sdk/resources/template.py b/src/legalesign_sdk/resources/template.py
index 7276095..343653c 100644
--- a/src/legalesign_sdk/resources/template.py
+++ b/src/legalesign_sdk/resources/template.py
@@ -29,7 +29,7 @@ def with_raw_response(self) -> TemplateResourceWithRawResponse:
         This property can be used as a prefix for any HTTP method call to return
         the raw response object instead of the parsed content.
 
-        For more information, see https://www.github.com/stainless-sdks/legalesign-sdk-python#accessing-raw-response-data-eg-headers
+        For more information, see https://www.github.com/legalesign/legalesign-rest-python#accessing-raw-response-data-eg-headers
         """
         return TemplateResourceWithRawResponse(self)
 
@@ -38,7 +38,7 @@ def with_streaming_response(self) -> TemplateResourceWithStreamingResponse:
         """
         An alternative to `.with_raw_response` that doesn't eagerly read the response body.
 
-        For more information, see https://www.github.com/stainless-sdks/legalesign-sdk-python#with_streaming_response
+        For more information, see https://www.github.com/legalesign/legalesign-rest-python#with_streaming_response
         """
         return TemplateResourceWithStreamingResponse(self)
 
@@ -225,7 +225,7 @@ def with_raw_response(self) -> AsyncTemplateResourceWithRawResponse:
         This property can be used as a prefix for any HTTP method call to return
         the raw response object instead of the parsed content.
 
-        For more information, see https://www.github.com/stainless-sdks/legalesign-sdk-python#accessing-raw-response-data-eg-headers
+        For more information, see https://www.github.com/legalesign/legalesign-rest-python#accessing-raw-response-data-eg-headers
         """
         return AsyncTemplateResourceWithRawResponse(self)
 
@@ -234,7 +234,7 @@ def with_streaming_response(self) -> AsyncTemplateResourceWithStreamingResponse:
         """
         An alternative to `.with_raw_response` that doesn't eagerly read the response body.
 
-        For more information, see https://www.github.com/stainless-sdks/legalesign-sdk-python#with_streaming_response
+        For more information, see https://www.github.com/legalesign/legalesign-rest-python#with_streaming_response
         """
         return AsyncTemplateResourceWithStreamingResponse(self)
 
diff --git a/src/legalesign_sdk/resources/templatepdf/fields.py b/src/legalesign_sdk/resources/templatepdf/fields.py
index 0ddc100..b7e1225 100644
--- a/src/legalesign_sdk/resources/templatepdf/fields.py
+++ b/src/legalesign_sdk/resources/templatepdf/fields.py
@@ -30,7 +30,7 @@ def with_raw_response(self) -> FieldsResourceWithRawResponse:
         This property can be used as a prefix for any HTTP method call to return
         the raw response object instead of the parsed content.
 
-        For more information, see https://www.github.com/stainless-sdks/legalesign-sdk-python#accessing-raw-response-data-eg-headers
+        For more information, see https://www.github.com/legalesign/legalesign-rest-python#accessing-raw-response-data-eg-headers
         """
         return FieldsResourceWithRawResponse(self)
 
@@ -39,7 +39,7 @@ def with_streaming_response(self) -> FieldsResourceWithStreamingResponse:
         """
         An alternative to `.with_raw_response` that doesn't eagerly read the response body.
 
-        For more information, see https://www.github.com/stainless-sdks/legalesign-sdk-python#with_streaming_response
+        For more information, see https://www.github.com/legalesign/legalesign-rest-python#with_streaming_response
         """
         return FieldsResourceWithStreamingResponse(self)
 
@@ -120,7 +120,7 @@ def with_raw_response(self) -> AsyncFieldsResourceWithRawResponse:
         This property can be used as a prefix for any HTTP method call to return
         the raw response object instead of the parsed content.
 
-        For more information, see https://www.github.com/stainless-sdks/legalesign-sdk-python#accessing-raw-response-data-eg-headers
+        For more information, see https://www.github.com/legalesign/legalesign-rest-python#accessing-raw-response-data-eg-headers
         """
         return AsyncFieldsResourceWithRawResponse(self)
 
@@ -129,7 +129,7 @@ def with_streaming_response(self) -> AsyncFieldsResourceWithStreamingResponse:
         """
         An alternative to `.with_raw_response` that doesn't eagerly read the response body.
 
-        For more information, see https://www.github.com/stainless-sdks/legalesign-sdk-python#with_streaming_response
+        For more information, see https://www.github.com/legalesign/legalesign-rest-python#with_streaming_response
         """
         return AsyncFieldsResourceWithStreamingResponse(self)
 
diff --git a/src/legalesign_sdk/resources/templatepdf/templatepdf.py b/src/legalesign_sdk/resources/templatepdf/templatepdf.py
index ef13615..598775e 100644
--- a/src/legalesign_sdk/resources/templatepdf/templatepdf.py
+++ b/src/legalesign_sdk/resources/templatepdf/templatepdf.py
@@ -43,7 +43,7 @@ def with_raw_response(self) -> TemplatepdfResourceWithRawResponse:
         This property can be used as a prefix for any HTTP method call to return
         the raw response object instead of the parsed content.
 
-        For more information, see https://www.github.com/stainless-sdks/legalesign-sdk-python#accessing-raw-response-data-eg-headers
+        For more information, see https://www.github.com/legalesign/legalesign-rest-python#accessing-raw-response-data-eg-headers
         """
         return TemplatepdfResourceWithRawResponse(self)
 
@@ -52,7 +52,7 @@ def with_streaming_response(self) -> TemplatepdfResourceWithStreamingResponse:
         """
         An alternative to `.with_raw_response` that doesn't eagerly read the response body.
 
-        For more information, see https://www.github.com/stainless-sdks/legalesign-sdk-python#with_streaming_response
+        For more information, see https://www.github.com/legalesign/legalesign-rest-python#with_streaming_response
         """
         return TemplatepdfResourceWithStreamingResponse(self)
 
@@ -241,7 +241,7 @@ def with_raw_response(self) -> AsyncTemplatepdfResourceWithRawResponse:
         This property can be used as a prefix for any HTTP method call to return
         the raw response object instead of the parsed content.
 
-        For more information, see https://www.github.com/stainless-sdks/legalesign-sdk-python#accessing-raw-response-data-eg-headers
+        For more information, see https://www.github.com/legalesign/legalesign-rest-python#accessing-raw-response-data-eg-headers
         """
         return AsyncTemplatepdfResourceWithRawResponse(self)
 
@@ -250,7 +250,7 @@ def with_streaming_response(self) -> AsyncTemplatepdfResourceWithStreamingRespon
         """
         An alternative to `.with_raw_response` that doesn't eagerly read the response body.
 
-        For more information, see https://www.github.com/stainless-sdks/legalesign-sdk-python#with_streaming_response
+        For more information, see https://www.github.com/legalesign/legalesign-rest-python#with_streaming_response
         """
         return AsyncTemplatepdfResourceWithStreamingResponse(self)
 
From 4b624cf077421fe7c8b67f919853d30956ca1778 Mon Sep 17 00:00:00 2001
From: "stainless-app[bot]"
 <142633134+stainless-app[bot]@users.noreply.github.com>
Date: Sat, 11 Oct 2025 02:38:56 +0000
Subject: [PATCH 3/7] chore(internal): detect missing future annotations with
 ruff
---
 pyproject.toml | 4 ++++
 1 file changed, 4 insertions(+)
diff --git a/pyproject.toml b/pyproject.toml
index f417e43..0dc8eb0 100644
--- a/pyproject.toml
+++ b/pyproject.toml
@@ -224,6 +224,8 @@ select = [
   "B",
   # remove unused imports
   "F401",
+  # check for missing future annotations
+  "FA102",
   # bare except statements
   "E722",
   # unused arguments
@@ -246,6 +248,8 @@ unfixable = [
   "T203",
 ]
 
+extend-safe-fixes = ["FA102"]
+
 [tool.ruff.lint.flake8-tidy-imports.banned-api]
 "functools.lru_cache".msg = "This function does not retain type information for the wrapped function's arguments; The `lru_cache` function from `_utils` should be used instead"
 
From 0cd299896e81a5353a47b96b8537b3d5e7e7ca14 Mon Sep 17 00:00:00 2001
From: "stainless-app[bot]"
 <142633134+stainless-app[bot]@users.noreply.github.com>
Date: Sat, 18 Oct 2025 02:24:16 +0000
Subject: [PATCH 4/7] chore: bump `httpx-aiohttp` version to 0.1.9
---
 pyproject.toml        | 2 +-
 requirements-dev.lock | 2 +-
 requirements.lock     | 2 +-
 3 files changed, 3 insertions(+), 3 deletions(-)
diff --git a/pyproject.toml b/pyproject.toml
index 0dc8eb0..6e76f77 100644
--- a/pyproject.toml
+++ b/pyproject.toml
@@ -39,7 +39,7 @@ Homepage = "https://legalesign.com/products/api/"
 Repository = "https://github.com/legalesign/legalesign-rest-python"
 
 [project.optional-dependencies]
-aiohttp = ["aiohttp", "httpx_aiohttp>=0.1.8"]
+aiohttp = ["aiohttp", "httpx_aiohttp>=0.1.9"]
 
 [tool.rye]
 managed = true
diff --git a/requirements-dev.lock b/requirements-dev.lock
index a55834a..8f09acb 100644
--- a/requirements-dev.lock
+++ b/requirements-dev.lock
@@ -56,7 +56,7 @@ httpx==0.28.1
     # via httpx-aiohttp
     # via legalesign
     # via respx
-httpx-aiohttp==0.1.8
+httpx-aiohttp==0.1.9
     # via legalesign
 idna==3.4
     # via anyio
diff --git a/requirements.lock b/requirements.lock
index 735fadc..00e823a 100644
--- a/requirements.lock
+++ b/requirements.lock
@@ -43,7 +43,7 @@ httpcore==1.0.9
 httpx==0.28.1
     # via httpx-aiohttp
     # via legalesign
-httpx-aiohttp==0.1.8
+httpx-aiohttp==0.1.9
     # via legalesign
 idna==3.4
     # via anyio
From 0e21d9f752891c00414a4238e4a5ed4b4599aa55 Mon Sep 17 00:00:00 2001
From: "stainless-app[bot]"
 <142633134+stainless-app[bot]@users.noreply.github.com>
Date: Thu, 30 Oct 2025 02:53:41 +0000
Subject: [PATCH 5/7] fix(client): close streams without requiring full
 consumption
---
 src/legalesign_sdk/_streaming.py | 10 ++++------
 1 file changed, 4 insertions(+), 6 deletions(-)
diff --git a/src/legalesign_sdk/_streaming.py b/src/legalesign_sdk/_streaming.py
index d04ddf3..8dccad7 100644
--- a/src/legalesign_sdk/_streaming.py
+++ b/src/legalesign_sdk/_streaming.py
@@ -57,9 +57,8 @@ def __stream__(self) -> Iterator[_T]:
         for sse in iterator:
             yield process_data(data=sse.json(), cast_to=cast_to, response=response)
 
-        # Ensure the entire stream is consumed
-        for _sse in iterator:
-            ...
+        # As we might not fully consume the response stream, we need to close it explicitly
+        response.close()
 
     def __enter__(self) -> Self:
         return self
@@ -121,9 +120,8 @@ async def __stream__(self) -> AsyncIterator[_T]:
         async for sse in iterator:
             yield process_data(data=sse.json(), cast_to=cast_to, response=response)
 
-        # Ensure the entire stream is consumed
-        async for _sse in iterator:
-            ...
+        # As we might not fully consume the response stream, we need to close it explicitly
+        await response.aclose()
 
     async def __aenter__(self) -> Self:
         return self
From ea7d42ac5829bb26a5da8490f13d98bc43e1e553 Mon Sep 17 00:00:00 2001
From: "stainless-app[bot]"
 <142633134+stainless-app[bot]@users.noreply.github.com>
Date: Fri, 31 Oct 2025 04:14:53 +0000
Subject: [PATCH 6/7] chore(internal/tests): avoid race condition with implicit
 client cleanup
---
 tests/test_client.py | 368 ++++++++++++++++++++++++-------------------
 1 file changed, 204 insertions(+), 164 deletions(-)
diff --git a/tests/test_client.py b/tests/test_client.py
index 2553f89..64d73ee 100644
--- a/tests/test_client.py
+++ b/tests/test_client.py
@@ -59,51 +59,49 @@ def _get_open_connections(client: LegalesignSDK | AsyncLegalesignSDK) -> int:
 
 
 class TestLegalesignSDK:
-    client = LegalesignSDK(base_url=base_url, api_key=api_key, _strict_response_validation=True)
-
     @pytest.mark.respx(base_url=base_url)
-    def test_raw_response(self, respx_mock: MockRouter) -> None:
+    def test_raw_response(self, respx_mock: MockRouter, client: LegalesignSDK) -> None:
         respx_mock.post("/foo").mock(return_value=httpx.Response(200, json={"foo": "bar"}))
 
-        response = self.client.post("/foo", cast_to=httpx.Response)
+        response = client.post("/foo", cast_to=httpx.Response)
         assert response.status_code == 200
         assert isinstance(response, httpx.Response)
         assert response.json() == {"foo": "bar"}
 
     @pytest.mark.respx(base_url=base_url)
-    def test_raw_response_for_binary(self, respx_mock: MockRouter) -> None:
+    def test_raw_response_for_binary(self, respx_mock: MockRouter, client: LegalesignSDK) -> None:
         respx_mock.post("/foo").mock(
             return_value=httpx.Response(200, headers={"Content-Type": "application/binary"}, content='{"foo": "bar"}')
         )
 
-        response = self.client.post("/foo", cast_to=httpx.Response)
+        response = client.post("/foo", cast_to=httpx.Response)
         assert response.status_code == 200
         assert isinstance(response, httpx.Response)
         assert response.json() == {"foo": "bar"}
 
-    def test_copy(self) -> None:
-        copied = self.client.copy()
-        assert id(copied) != id(self.client)
+    def test_copy(self, client: LegalesignSDK) -> None:
+        copied = client.copy()
+        assert id(copied) != id(client)
 
-        copied = self.client.copy(api_key="another My API Key")
+        copied = client.copy(api_key="another My API Key")
         assert copied.api_key == "another My API Key"
-        assert self.client.api_key == "My API Key"
+        assert client.api_key == "My API Key"
 
-    def test_copy_default_options(self) -> None:
+    def test_copy_default_options(self, client: LegalesignSDK) -> None:
         # options that have a default are overridden correctly
-        copied = self.client.copy(max_retries=7)
+        copied = client.copy(max_retries=7)
         assert copied.max_retries == 7
-        assert self.client.max_retries == 2
+        assert client.max_retries == 2
 
         copied2 = copied.copy(max_retries=6)
         assert copied2.max_retries == 6
         assert copied.max_retries == 7
 
         # timeout
-        assert isinstance(self.client.timeout, httpx.Timeout)
-        copied = self.client.copy(timeout=None)
+        assert isinstance(client.timeout, httpx.Timeout)
+        copied = client.copy(timeout=None)
         assert copied.timeout is None
-        assert isinstance(self.client.timeout, httpx.Timeout)
+        assert isinstance(client.timeout, httpx.Timeout)
 
     def test_copy_default_headers(self) -> None:
         client = LegalesignSDK(
@@ -138,6 +136,7 @@ def test_copy_default_headers(self) -> None:
             match="`default_headers` and `set_default_headers` arguments are mutually exclusive",
         ):
             client.copy(set_default_headers={}, default_headers={"X-Foo": "Bar"})
+        client.close()
 
     def test_copy_default_query(self) -> None:
         client = LegalesignSDK(
@@ -175,13 +174,15 @@ def test_copy_default_query(self) -> None:
         ):
             client.copy(set_default_query={}, default_query={"foo": "Bar"})
 
-    def test_copy_signature(self) -> None:
+        client.close()
+
+    def test_copy_signature(self, client: LegalesignSDK) -> None:
         # ensure the same parameters that can be passed to the client are defined in the `.copy()` method
         init_signature = inspect.signature(
             # mypy doesn't like that we access the `__init__` property.
-            self.client.__init__,  # type: ignore[misc]
+            client.__init__,  # type: ignore[misc]
         )
-        copy_signature = inspect.signature(self.client.copy)
+        copy_signature = inspect.signature(client.copy)
         exclude_params = {"transport", "proxies", "_strict_response_validation"}
 
         for name in init_signature.parameters.keys():
@@ -192,12 +193,12 @@ def test_copy_signature(self) -> None:
             assert copy_param is not None, f"copy() signature is missing the {name} param"
 
     @pytest.mark.skipif(sys.version_info >= (3, 10), reason="fails because of a memory leak that started from 3.12")
-    def test_copy_build_request(self) -> None:
+    def test_copy_build_request(self, client: LegalesignSDK) -> None:
         options = FinalRequestOptions(method="get", url="/foo")
 
         def build_request(options: FinalRequestOptions) -> None:
-            client = self.client.copy()
-            client._build_request(options)
+            client_copy = client.copy()
+            client_copy._build_request(options)
 
         # ensure that the machinery is warmed up before tracing starts.
         build_request(options)
@@ -254,14 +255,12 @@ def add_leak(leaks: list[tracemalloc.StatisticDiff], diff: tracemalloc.Statistic
                     print(frame)
             raise AssertionError()
 
-    def test_request_timeout(self) -> None:
-        request = self.client._build_request(FinalRequestOptions(method="get", url="/foo"))
+    def test_request_timeout(self, client: LegalesignSDK) -> None:
+        request = client._build_request(FinalRequestOptions(method="get", url="/foo"))
         timeout = httpx.Timeout(**request.extensions["timeout"])  # type: ignore
         assert timeout == DEFAULT_TIMEOUT
 
-        request = self.client._build_request(
-            FinalRequestOptions(method="get", url="/foo", timeout=httpx.Timeout(100.0))
-        )
+        request = client._build_request(FinalRequestOptions(method="get", url="/foo", timeout=httpx.Timeout(100.0)))
         timeout = httpx.Timeout(**request.extensions["timeout"])  # type: ignore
         assert timeout == httpx.Timeout(100.0)
 
@@ -274,6 +273,8 @@ def test_client_timeout_option(self) -> None:
         timeout = httpx.Timeout(**request.extensions["timeout"])  # type: ignore
         assert timeout == httpx.Timeout(0)
 
+        client.close()
+
     def test_http_client_timeout_option(self) -> None:
         # custom timeout given to the httpx client should be used
         with httpx.Client(timeout=None) as http_client:
@@ -285,6 +286,8 @@ def test_http_client_timeout_option(self) -> None:
             timeout = httpx.Timeout(**request.extensions["timeout"])  # type: ignore
             assert timeout == httpx.Timeout(None)
 
+            client.close()
+
         # no timeout given to the httpx client should not use the httpx default
         with httpx.Client() as http_client:
             client = LegalesignSDK(
@@ -295,6 +298,8 @@ def test_http_client_timeout_option(self) -> None:
             timeout = httpx.Timeout(**request.extensions["timeout"])  # type: ignore
             assert timeout == DEFAULT_TIMEOUT
 
+            client.close()
+
         # explicitly passing the default timeout currently results in it being ignored
         with httpx.Client(timeout=HTTPX_DEFAULT_TIMEOUT) as http_client:
             client = LegalesignSDK(
@@ -305,6 +310,8 @@ def test_http_client_timeout_option(self) -> None:
             timeout = httpx.Timeout(**request.extensions["timeout"])  # type: ignore
             assert timeout == DEFAULT_TIMEOUT  # our default
 
+            client.close()
+
     async def test_invalid_http_client(self) -> None:
         with pytest.raises(TypeError, match="Invalid `http_client` arg"):
             async with httpx.AsyncClient() as http_client:
@@ -316,14 +323,14 @@ async def test_invalid_http_client(self) -> None:
                 )
 
     def test_default_headers_option(self) -> None:
-        client = LegalesignSDK(
+        test_client = LegalesignSDK(
             base_url=base_url, api_key=api_key, _strict_response_validation=True, default_headers={"X-Foo": "bar"}
         )
-        request = client._build_request(FinalRequestOptions(method="get", url="/foo"))
+        request = test_client._build_request(FinalRequestOptions(method="get", url="/foo"))
         assert request.headers.get("x-foo") == "bar"
         assert request.headers.get("x-stainless-lang") == "python"
 
-        client2 = LegalesignSDK(
+        test_client2 = LegalesignSDK(
             base_url=base_url,
             api_key=api_key,
             _strict_response_validation=True,
@@ -332,10 +339,13 @@ def test_default_headers_option(self) -> None:
                 "X-Stainless-Lang": "my-overriding-header",
             },
         )
-        request = client2._build_request(FinalRequestOptions(method="get", url="/foo"))
+        request = test_client2._build_request(FinalRequestOptions(method="get", url="/foo"))
         assert request.headers.get("x-foo") == "stainless"
         assert request.headers.get("x-stainless-lang") == "my-overriding-header"
 
+        test_client.close()
+        test_client2.close()
+
     def test_validate_headers(self) -> None:
         client = LegalesignSDK(base_url=base_url, api_key=api_key, _strict_response_validation=True)
         request = client._build_request(FinalRequestOptions(method="get", url="/foo"))
@@ -364,8 +374,10 @@ def test_default_query_option(self) -> None:
         url = httpx.URL(request.url)
         assert dict(url.params) == {"foo": "baz", "query_param": "overridden"}
 
-    def test_request_extra_json(self) -> None:
-        request = self.client._build_request(
+        client.close()
+
+    def test_request_extra_json(self, client: LegalesignSDK) -> None:
+        request = client._build_request(
             FinalRequestOptions(
                 method="post",
                 url="/foo",
@@ -376,7 +388,7 @@ def test_request_extra_json(self) -> None:
         data = json.loads(request.content.decode("utf-8"))
         assert data == {"foo": "bar", "baz": False}
 
-        request = self.client._build_request(
+        request = client._build_request(
             FinalRequestOptions(
                 method="post",
                 url="/foo",
@@ -387,7 +399,7 @@ def test_request_extra_json(self) -> None:
         assert data == {"baz": False}
 
         # `extra_json` takes priority over `json_data` when keys clash
-        request = self.client._build_request(
+        request = client._build_request(
             FinalRequestOptions(
                 method="post",
                 url="/foo",
@@ -398,8 +410,8 @@ def test_request_extra_json(self) -> None:
         data = json.loads(request.content.decode("utf-8"))
         assert data == {"foo": "bar", "baz": None}
 
-    def test_request_extra_headers(self) -> None:
-        request = self.client._build_request(
+    def test_request_extra_headers(self, client: LegalesignSDK) -> None:
+        request = client._build_request(
             FinalRequestOptions(
                 method="post",
                 url="/foo",
@@ -409,7 +421,7 @@ def test_request_extra_headers(self) -> None:
         assert request.headers.get("X-Foo") == "Foo"
 
         # `extra_headers` takes priority over `default_headers` when keys clash
-        request = self.client.with_options(default_headers={"X-Bar": "true"})._build_request(
+        request = client.with_options(default_headers={"X-Bar": "true"})._build_request(
             FinalRequestOptions(
                 method="post",
                 url="/foo",
@@ -420,8 +432,8 @@ def test_request_extra_headers(self) -> None:
         )
         assert request.headers.get("X-Bar") == "false"
 
-    def test_request_extra_query(self) -> None:
-        request = self.client._build_request(
+    def test_request_extra_query(self, client: LegalesignSDK) -> None:
+        request = client._build_request(
             FinalRequestOptions(
                 method="post",
                 url="/foo",
@@ -434,7 +446,7 @@ def test_request_extra_query(self) -> None:
         assert params == {"my_query_param": "Foo"}
 
         # if both `query` and `extra_query` are given, they are merged
-        request = self.client._build_request(
+        request = client._build_request(
             FinalRequestOptions(
                 method="post",
                 url="/foo",
@@ -448,7 +460,7 @@ def test_request_extra_query(self) -> None:
         assert params == {"bar": "1", "foo": "2"}
 
         # `extra_query` takes priority over `query` when keys clash
-        request = self.client._build_request(
+        request = client._build_request(
             FinalRequestOptions(
                 method="post",
                 url="/foo",
@@ -491,7 +503,7 @@ def test_multipart_repeating_array(self, client: LegalesignSDK) -> None:
         ]
 
     @pytest.mark.respx(base_url=base_url)
-    def test_basic_union_response(self, respx_mock: MockRouter) -> None:
+    def test_basic_union_response(self, respx_mock: MockRouter, client: LegalesignSDK) -> None:
         class Model1(BaseModel):
             name: str
 
@@ -500,12 +512,12 @@ class Model2(BaseModel):
 
         respx_mock.get("/foo").mock(return_value=httpx.Response(200, json={"foo": "bar"}))
 
-        response = self.client.get("/foo", cast_to=cast(Any, Union[Model1, Model2]))
+        response = client.get("/foo", cast_to=cast(Any, Union[Model1, Model2]))
         assert isinstance(response, Model2)
         assert response.foo == "bar"
 
     @pytest.mark.respx(base_url=base_url)
-    def test_union_response_different_types(self, respx_mock: MockRouter) -> None:
+    def test_union_response_different_types(self, respx_mock: MockRouter, client: LegalesignSDK) -> None:
         """Union of objects with the same field name using a different type"""
 
         class Model1(BaseModel):
@@ -516,18 +528,20 @@ class Model2(BaseModel):
 
         respx_mock.get("/foo").mock(return_value=httpx.Response(200, json={"foo": "bar"}))
 
-        response = self.client.get("/foo", cast_to=cast(Any, Union[Model1, Model2]))
+        response = client.get("/foo", cast_to=cast(Any, Union[Model1, Model2]))
         assert isinstance(response, Model2)
         assert response.foo == "bar"
 
         respx_mock.get("/foo").mock(return_value=httpx.Response(200, json={"foo": 1}))
 
-        response = self.client.get("/foo", cast_to=cast(Any, Union[Model1, Model2]))
+        response = client.get("/foo", cast_to=cast(Any, Union[Model1, Model2]))
         assert isinstance(response, Model1)
         assert response.foo == 1
 
     @pytest.mark.respx(base_url=base_url)
-    def test_non_application_json_content_type_for_json_data(self, respx_mock: MockRouter) -> None:
+    def test_non_application_json_content_type_for_json_data(
+        self, respx_mock: MockRouter, client: LegalesignSDK
+    ) -> None:
         """
         Response that sets Content-Type to something other than application/json but returns json data
         """
@@ -543,7 +557,7 @@ class Model(BaseModel):
             )
         )
 
-        response = self.client.get("/foo", cast_to=Model)
+        response = client.get("/foo", cast_to=Model)
         assert isinstance(response, Model)
         assert response.foo == 2
 
@@ -557,6 +571,8 @@ def test_base_url_setter(self) -> None:
 
         assert client.base_url == "https://example.com/from_setter/"
 
+        client.close()
+
     def test_base_url_env(self) -> None:
         with update_env(LEGALESIGN_SDK_BASE_URL="http://localhost:5000/from/env"):
             client = LegalesignSDK(api_key=api_key, _strict_response_validation=True)
@@ -586,6 +602,7 @@ def test_base_url_trailing_slash(self, client: LegalesignSDK) -> None:
             ),
         )
         assert request.url == "http://localhost:5000/custom/path/foo"
+        client.close()
 
     @pytest.mark.parametrize(
         "client",
@@ -611,6 +628,7 @@ def test_base_url_no_trailing_slash(self, client: LegalesignSDK) -> None:
             ),
         )
         assert request.url == "http://localhost:5000/custom/path/foo"
+        client.close()
 
     @pytest.mark.parametrize(
         "client",
@@ -636,35 +654,36 @@ def test_absolute_request_url(self, client: LegalesignSDK) -> None:
             ),
         )
         assert request.url == "https://myapi.com/foo"
+        client.close()
 
     def test_copied_client_does_not_close_http(self) -> None:
-        client = LegalesignSDK(base_url=base_url, api_key=api_key, _strict_response_validation=True)
-        assert not client.is_closed()
+        test_client = LegalesignSDK(base_url=base_url, api_key=api_key, _strict_response_validation=True)
+        assert not test_client.is_closed()
 
-        copied = client.copy()
-        assert copied is not client
+        copied = test_client.copy()
+        assert copied is not test_client
 
         del copied
 
-        assert not client.is_closed()
+        assert not test_client.is_closed()
 
     def test_client_context_manager(self) -> None:
-        client = LegalesignSDK(base_url=base_url, api_key=api_key, _strict_response_validation=True)
-        with client as c2:
-            assert c2 is client
+        test_client = LegalesignSDK(base_url=base_url, api_key=api_key, _strict_response_validation=True)
+        with test_client as c2:
+            assert c2 is test_client
             assert not c2.is_closed()
-            assert not client.is_closed()
-        assert client.is_closed()
+            assert not test_client.is_closed()
+        assert test_client.is_closed()
 
     @pytest.mark.respx(base_url=base_url)
-    def test_client_response_validation_error(self, respx_mock: MockRouter) -> None:
+    def test_client_response_validation_error(self, respx_mock: MockRouter, client: LegalesignSDK) -> None:
         class Model(BaseModel):
             foo: str
 
         respx_mock.get("/foo").mock(return_value=httpx.Response(200, json={"foo": {"invalid": True}}))
 
         with pytest.raises(APIResponseValidationError) as exc:
-            self.client.get("/foo", cast_to=Model)
+            client.get("/foo", cast_to=Model)
 
         assert isinstance(exc.value.__cause__, ValidationError)
 
@@ -686,11 +705,14 @@ class Model(BaseModel):
         with pytest.raises(APIResponseValidationError):
             strict_client.get("/foo", cast_to=Model)
 
-        client = LegalesignSDK(base_url=base_url, api_key=api_key, _strict_response_validation=False)
+        non_strict_client = LegalesignSDK(base_url=base_url, api_key=api_key, _strict_response_validation=False)
 
-        response = client.get("/foo", cast_to=Model)
+        response = non_strict_client.get("/foo", cast_to=Model)
         assert isinstance(response, str)  # type: ignore[unreachable]
 
+        strict_client.close()
+        non_strict_client.close()
+
     @pytest.mark.parametrize(
         "remaining_retries,retry_after,timeout",
         [
@@ -713,9 +735,9 @@ class Model(BaseModel):
         ],
     )
     @mock.patch("time.time", mock.MagicMock(return_value=1696004797))
-    def test_parse_retry_after_header(self, remaining_retries: int, retry_after: str, timeout: float) -> None:
-        client = LegalesignSDK(base_url=base_url, api_key=api_key, _strict_response_validation=True)
-
+    def test_parse_retry_after_header(
+        self, remaining_retries: int, retry_after: str, timeout: float, client: LegalesignSDK
+    ) -> None:
         headers = httpx.Headers({"retry-after": retry_after})
         options = FinalRequestOptions(method="get", url="/foo", max_retries=3)
         calculated = client._calculate_retry_timeout(remaining_retries, options, headers)
@@ -729,7 +751,7 @@ def test_retrying_timeout_errors_doesnt_leak(self, respx_mock: MockRouter, clien
         with pytest.raises(APITimeoutError):
             client.document.with_streaming_response.list(group="group").__enter__()
 
-        assert _get_open_connections(self.client) == 0
+        assert _get_open_connections(client) == 0
 
     @mock.patch("legalesign_sdk._base_client.BaseClient._calculate_retry_timeout", _low_retry_timeout)
     @pytest.mark.respx(base_url=base_url)
@@ -738,7 +760,7 @@ def test_retrying_status_errors_doesnt_leak(self, respx_mock: MockRouter, client
 
         with pytest.raises(APIStatusError):
             client.document.with_streaming_response.list(group="group").__enter__()
-        assert _get_open_connections(self.client) == 0
+        assert _get_open_connections(client) == 0
 
     @pytest.mark.parametrize("failures_before_success", [0, 2, 4])
     @mock.patch("legalesign_sdk._base_client.BaseClient._calculate_retry_timeout", _low_retry_timeout)
@@ -844,83 +866,77 @@ def test_default_client_creation(self) -> None:
         )
 
     @pytest.mark.respx(base_url=base_url)
-    def test_follow_redirects(self, respx_mock: MockRouter) -> None:
+    def test_follow_redirects(self, respx_mock: MockRouter, client: LegalesignSDK) -> None:
         # Test that the default follow_redirects=True allows following redirects
         respx_mock.post("/redirect").mock(
             return_value=httpx.Response(302, headers={"Location": f"{base_url}/redirected"})
         )
         respx_mock.get("/redirected").mock(return_value=httpx.Response(200, json={"status": "ok"}))
 
-        response = self.client.post("/redirect", body={"key": "value"}, cast_to=httpx.Response)
+        response = client.post("/redirect", body={"key": "value"}, cast_to=httpx.Response)
         assert response.status_code == 200
         assert response.json() == {"status": "ok"}
 
     @pytest.mark.respx(base_url=base_url)
-    def test_follow_redirects_disabled(self, respx_mock: MockRouter) -> None:
+    def test_follow_redirects_disabled(self, respx_mock: MockRouter, client: LegalesignSDK) -> None:
         # Test that follow_redirects=False prevents following redirects
         respx_mock.post("/redirect").mock(
             return_value=httpx.Response(302, headers={"Location": f"{base_url}/redirected"})
         )
 
         with pytest.raises(APIStatusError) as exc_info:
-            self.client.post(
-                "/redirect", body={"key": "value"}, options={"follow_redirects": False}, cast_to=httpx.Response
-            )
+            client.post("/redirect", body={"key": "value"}, options={"follow_redirects": False}, cast_to=httpx.Response)
 
         assert exc_info.value.response.status_code == 302
         assert exc_info.value.response.headers["Location"] == f"{base_url}/redirected"
 
 
 class TestAsyncLegalesignSDK:
-    client = AsyncLegalesignSDK(base_url=base_url, api_key=api_key, _strict_response_validation=True)
-
     @pytest.mark.respx(base_url=base_url)
-    @pytest.mark.asyncio
-    async def test_raw_response(self, respx_mock: MockRouter) -> None:
+    async def test_raw_response(self, respx_mock: MockRouter, async_client: AsyncLegalesignSDK) -> None:
         respx_mock.post("/foo").mock(return_value=httpx.Response(200, json={"foo": "bar"}))
 
-        response = await self.client.post("/foo", cast_to=httpx.Response)
+        response = await async_client.post("/foo", cast_to=httpx.Response)
         assert response.status_code == 200
         assert isinstance(response, httpx.Response)
         assert response.json() == {"foo": "bar"}
 
     @pytest.mark.respx(base_url=base_url)
-    @pytest.mark.asyncio
-    async def test_raw_response_for_binary(self, respx_mock: MockRouter) -> None:
+    async def test_raw_response_for_binary(self, respx_mock: MockRouter, async_client: AsyncLegalesignSDK) -> None:
         respx_mock.post("/foo").mock(
             return_value=httpx.Response(200, headers={"Content-Type": "application/binary"}, content='{"foo": "bar"}')
         )
 
-        response = await self.client.post("/foo", cast_to=httpx.Response)
+        response = await async_client.post("/foo", cast_to=httpx.Response)
         assert response.status_code == 200
         assert isinstance(response, httpx.Response)
         assert response.json() == {"foo": "bar"}
 
-    def test_copy(self) -> None:
-        copied = self.client.copy()
-        assert id(copied) != id(self.client)
+    def test_copy(self, async_client: AsyncLegalesignSDK) -> None:
+        copied = async_client.copy()
+        assert id(copied) != id(async_client)
 
-        copied = self.client.copy(api_key="another My API Key")
+        copied = async_client.copy(api_key="another My API Key")
         assert copied.api_key == "another My API Key"
-        assert self.client.api_key == "My API Key"
+        assert async_client.api_key == "My API Key"
 
-    def test_copy_default_options(self) -> None:
+    def test_copy_default_options(self, async_client: AsyncLegalesignSDK) -> None:
         # options that have a default are overridden correctly
-        copied = self.client.copy(max_retries=7)
+        copied = async_client.copy(max_retries=7)
         assert copied.max_retries == 7
-        assert self.client.max_retries == 2
+        assert async_client.max_retries == 2
 
         copied2 = copied.copy(max_retries=6)
         assert copied2.max_retries == 6
         assert copied.max_retries == 7
 
         # timeout
-        assert isinstance(self.client.timeout, httpx.Timeout)
-        copied = self.client.copy(timeout=None)
+        assert isinstance(async_client.timeout, httpx.Timeout)
+        copied = async_client.copy(timeout=None)
         assert copied.timeout is None
-        assert isinstance(self.client.timeout, httpx.Timeout)
+        assert isinstance(async_client.timeout, httpx.Timeout)
 
-    def test_copy_default_headers(self) -> None:
+    async def test_copy_default_headers(self) -> None:
         client = AsyncLegalesignSDK(
             base_url=base_url, api_key=api_key, _strict_response_validation=True, default_headers={"X-Foo": "bar"}
         )
@@ -953,8 +969,9 @@ def test_copy_default_headers(self) -> None:
             match="`default_headers` and `set_default_headers` arguments are mutually exclusive",
         ):
             client.copy(set_default_headers={}, default_headers={"X-Foo": "Bar"})
+        await client.close()
 
-    def test_copy_default_query(self) -> None:
+    async def test_copy_default_query(self) -> None:
         client = AsyncLegalesignSDK(
             base_url=base_url, api_key=api_key, _strict_response_validation=True, default_query={"foo": "bar"}
         )
@@ -990,13 +1007,15 @@ def test_copy_default_query(self) -> None:
         ):
             client.copy(set_default_query={}, default_query={"foo": "Bar"})
 
-    def test_copy_signature(self) -> None:
+        await client.close()
+
+    def test_copy_signature(self, async_client: AsyncLegalesignSDK) -> None:
         # ensure the same parameters that can be passed to the client are defined in the `.copy()` method
         init_signature = inspect.signature(
             # mypy doesn't like that we access the `__init__` property.
-            self.client.__init__,  # type: ignore[misc]
+            async_client.__init__,  # type: ignore[misc]
         )
-        copy_signature = inspect.signature(self.client.copy)
+        copy_signature = inspect.signature(async_client.copy)
         exclude_params = {"transport", "proxies", "_strict_response_validation"}
 
         for name in init_signature.parameters.keys():
@@ -1007,12 +1026,12 @@ def test_copy_signature(self) -> None:
             assert copy_param is not None, f"copy() signature is missing the {name} param"
 
     @pytest.mark.skipif(sys.version_info >= (3, 10), reason="fails because of a memory leak that started from 3.12")
-    def test_copy_build_request(self) -> None:
+    def test_copy_build_request(self, async_client: AsyncLegalesignSDK) -> None:
         options = FinalRequestOptions(method="get", url="/foo")
 
         def build_request(options: FinalRequestOptions) -> None:
-            client = self.client.copy()
-            client._build_request(options)
+            client_copy = async_client.copy()
+            client_copy._build_request(options)
 
         # ensure that the machinery is warmed up before tracing starts.
         build_request(options)
@@ -1069,12 +1088,12 @@ def add_leak(leaks: list[tracemalloc.StatisticDiff], diff: tracemalloc.Statistic
                     print(frame)
             raise AssertionError()
 
-    async def test_request_timeout(self) -> None:
-        request = self.client._build_request(FinalRequestOptions(method="get", url="/foo"))
+    async def test_request_timeout(self, async_client: AsyncLegalesignSDK) -> None:
+        request = async_client._build_request(FinalRequestOptions(method="get", url="/foo"))
         timeout = httpx.Timeout(**request.extensions["timeout"])  # type: ignore
         assert timeout == DEFAULT_TIMEOUT
 
-        request = self.client._build_request(
+        request = async_client._build_request(
             FinalRequestOptions(method="get", url="/foo", timeout=httpx.Timeout(100.0))
         )
         timeout = httpx.Timeout(**request.extensions["timeout"])  # type: ignore
@@ -1089,6 +1108,8 @@ async def test_client_timeout_option(self) -> None:
         timeout = httpx.Timeout(**request.extensions["timeout"])  # type: ignore
         assert timeout == httpx.Timeout(0)
 
+        await client.close()
+
     async def test_http_client_timeout_option(self) -> None:
         # custom timeout given to the httpx client should be used
         async with httpx.AsyncClient(timeout=None) as http_client:
@@ -1100,6 +1121,8 @@ async def test_http_client_timeout_option(self) -> None:
             timeout = httpx.Timeout(**request.extensions["timeout"])  # type: ignore
             assert timeout == httpx.Timeout(None)
 
+            await client.close()
+
         # no timeout given to the httpx client should not use the httpx default
         async with httpx.AsyncClient() as http_client:
             client = AsyncLegalesignSDK(
@@ -1110,6 +1133,8 @@ async def test_http_client_timeout_option(self) -> None:
             timeout = httpx.Timeout(**request.extensions["timeout"])  # type: ignore
             assert timeout == DEFAULT_TIMEOUT
 
+            await client.close()
+
         # explicitly passing the default timeout currently results in it being ignored
         async with httpx.AsyncClient(timeout=HTTPX_DEFAULT_TIMEOUT) as http_client:
             client = AsyncLegalesignSDK(
@@ -1120,6 +1145,8 @@ async def test_http_client_timeout_option(self) -> None:
             timeout = httpx.Timeout(**request.extensions["timeout"])  # type: ignore
             assert timeout == DEFAULT_TIMEOUT  # our default
 
+            await client.close()
+
     def test_invalid_http_client(self) -> None:
         with pytest.raises(TypeError, match="Invalid `http_client` arg"):
             with httpx.Client() as http_client:
@@ -1130,15 +1157,15 @@ def test_invalid_http_client(self) -> None:
                     http_client=cast(Any, http_client),
                 )
 
-    def test_default_headers_option(self) -> None:
-        client = AsyncLegalesignSDK(
+    async def test_default_headers_option(self) -> None:
+        test_client = AsyncLegalesignSDK(
             base_url=base_url, api_key=api_key, _strict_response_validation=True, default_headers={"X-Foo": "bar"}
         )
-        request = client._build_request(FinalRequestOptions(method="get", url="/foo"))
+        request = test_client._build_request(FinalRequestOptions(method="get", url="/foo"))
         assert request.headers.get("x-foo") == "bar"
         assert request.headers.get("x-stainless-lang") == "python"
 
-        client2 = AsyncLegalesignSDK(
+        test_client2 = AsyncLegalesignSDK(
             base_url=base_url,
             api_key=api_key,
             _strict_response_validation=True,
@@ -1147,10 +1174,13 @@ def test_default_headers_option(self) -> None:
                 "X-Stainless-Lang": "my-overriding-header",
             },
         )
-        request = client2._build_request(FinalRequestOptions(method="get", url="/foo"))
+        request = test_client2._build_request(FinalRequestOptions(method="get", url="/foo"))
         assert request.headers.get("x-foo") == "stainless"
         assert request.headers.get("x-stainless-lang") == "my-overriding-header"
 
+        await test_client.close()
+        await test_client2.close()
+
     def test_validate_headers(self) -> None:
         client = AsyncLegalesignSDK(base_url=base_url, api_key=api_key, _strict_response_validation=True)
         request = client._build_request(FinalRequestOptions(method="get", url="/foo"))
@@ -1161,7 +1191,7 @@ def test_validate_headers(self) -> None:
                 client2 = AsyncLegalesignSDK(base_url=base_url, api_key=None, _strict_response_validation=True)
             _ = client2
 
-    def test_default_query_option(self) -> None:
+    async def test_default_query_option(self) -> None:
         client = AsyncLegalesignSDK(
             base_url=base_url, api_key=api_key, _strict_response_validation=True, default_query={"query_param": "bar"}
         )
@@ -1179,8 +1209,10 @@ def test_default_query_option(self) -> None:
         url = httpx.URL(request.url)
         assert dict(url.params) == {"foo": "baz", "query_param": "overridden"}
 
-    def test_request_extra_json(self) -> None:
-        request = self.client._build_request(
+        await client.close()
+
+    def test_request_extra_json(self, client: LegalesignSDK) -> None:
+        request = client._build_request(
             FinalRequestOptions(
                 method="post",
                 url="/foo",
@@ -1191,7 +1223,7 @@ def test_request_extra_json(self) -> None:
         data = json.loads(request.content.decode("utf-8"))
         assert data == {"foo": "bar", "baz": False}
 
-        request = self.client._build_request(
+        request = client._build_request(
             FinalRequestOptions(
                 method="post",
                 url="/foo",
@@ -1202,7 +1234,7 @@ def test_request_extra_json(self) -> None:
         assert data == {"baz": False}
 
         # `extra_json` takes priority over `json_data` when keys clash
-        request = self.client._build_request(
+        request = client._build_request(
             FinalRequestOptions(
                 method="post",
                 url="/foo",
@@ -1213,8 +1245,8 @@ def test_request_extra_json(self) -> None:
         data = json.loads(request.content.decode("utf-8"))
         assert data == {"foo": "bar", "baz": None}
 
-    def test_request_extra_headers(self) -> None:
-        request = self.client._build_request(
+    def test_request_extra_headers(self, client: LegalesignSDK) -> None:
+        request = client._build_request(
             FinalRequestOptions(
                 method="post",
                 url="/foo",
@@ -1224,7 +1256,7 @@ def test_request_extra_headers(self) -> None:
         assert request.headers.get("X-Foo") == "Foo"
 
         # `extra_headers` takes priority over `default_headers` when keys clash
-        request = self.client.with_options(default_headers={"X-Bar": "true"})._build_request(
+        request = client.with_options(default_headers={"X-Bar": "true"})._build_request(
             FinalRequestOptions(
                 method="post",
                 url="/foo",
@@ -1235,8 +1267,8 @@ def test_request_extra_headers(self) -> None:
         )
         assert request.headers.get("X-Bar") == "false"
 
-    def test_request_extra_query(self) -> None:
-        request = self.client._build_request(
+    def test_request_extra_query(self, client: LegalesignSDK) -> None:
+        request = client._build_request(
             FinalRequestOptions(
                 method="post",
                 url="/foo",
@@ -1249,7 +1281,7 @@ def test_request_extra_query(self) -> None:
         assert params == {"my_query_param": "Foo"}
 
         # if both `query` and `extra_query` are given, they are merged
-        request = self.client._build_request(
+        request = client._build_request(
             FinalRequestOptions(
                 method="post",
                 url="/foo",
@@ -1263,7 +1295,7 @@ def test_request_extra_query(self) -> None:
         assert params == {"bar": "1", "foo": "2"}
 
         # `extra_query` takes priority over `query` when keys clash
-        request = self.client._build_request(
+        request = client._build_request(
             FinalRequestOptions(
                 method="post",
                 url="/foo",
@@ -1306,7 +1338,7 @@ def test_multipart_repeating_array(self, async_client: AsyncLegalesignSDK) -> No
         ]
 
     @pytest.mark.respx(base_url=base_url)
-    async def test_basic_union_response(self, respx_mock: MockRouter) -> None:
+    async def test_basic_union_response(self, respx_mock: MockRouter, async_client: AsyncLegalesignSDK) -> None:
         class Model1(BaseModel):
             name: str
 
@@ -1315,12 +1347,14 @@ class Model2(BaseModel):
 
         respx_mock.get("/foo").mock(return_value=httpx.Response(200, json={"foo": "bar"}))
 
-        response = await self.client.get("/foo", cast_to=cast(Any, Union[Model1, Model2]))
+        response = await async_client.get("/foo", cast_to=cast(Any, Union[Model1, Model2]))
         assert isinstance(response, Model2)
         assert response.foo == "bar"
 
     @pytest.mark.respx(base_url=base_url)
-    async def test_union_response_different_types(self, respx_mock: MockRouter) -> None:
+    async def test_union_response_different_types(
+        self, respx_mock: MockRouter, async_client: AsyncLegalesignSDK
+    ) -> None:
         """Union of objects with the same field name using a different type"""
 
         class Model1(BaseModel):
@@ -1331,18 +1365,20 @@ class Model2(BaseModel):
 
         respx_mock.get("/foo").mock(return_value=httpx.Response(200, json={"foo": "bar"}))
 
-        response = await self.client.get("/foo", cast_to=cast(Any, Union[Model1, Model2]))
+        response = await async_client.get("/foo", cast_to=cast(Any, Union[Model1, Model2]))
         assert isinstance(response, Model2)
         assert response.foo == "bar"
 
         respx_mock.get("/foo").mock(return_value=httpx.Response(200, json={"foo": 1}))
 
-        response = await self.client.get("/foo", cast_to=cast(Any, Union[Model1, Model2]))
+        response = await async_client.get("/foo", cast_to=cast(Any, Union[Model1, Model2]))
         assert isinstance(response, Model1)
         assert response.foo == 1
 
     @pytest.mark.respx(base_url=base_url)
-    async def test_non_application_json_content_type_for_json_data(self, respx_mock: MockRouter) -> None:
+    async def test_non_application_json_content_type_for_json_data(
+        self, respx_mock: MockRouter, async_client: AsyncLegalesignSDK
+    ) -> None:
         """
         Response that sets Content-Type to something other than application/json but returns json data
         """
@@ -1358,11 +1394,11 @@ class Model(BaseModel):
             )
         )
 
-        response = await self.client.get("/foo", cast_to=Model)
+        response = await async_client.get("/foo", cast_to=Model)
         assert isinstance(response, Model)
         assert response.foo == 2
 
-    def test_base_url_setter(self) -> None:
+    async def test_base_url_setter(self) -> None:
         client = AsyncLegalesignSDK(
             base_url="https://example.com/from_init", api_key=api_key, _strict_response_validation=True
         )
@@ -1372,7 +1408,9 @@ def test_base_url_setter(self) -> None:
 
         assert client.base_url == "https://example.com/from_setter/"
 
-    def test_base_url_env(self) -> None:
+        await client.close()
+
+    async def test_base_url_env(self) -> None:
         with update_env(LEGALESIGN_SDK_BASE_URL="http://localhost:5000/from/env"):
             client = AsyncLegalesignSDK(api_key=api_key, _strict_response_validation=True)
             assert client.base_url == "http://localhost:5000/from/env/"
@@ -1392,7 +1430,7 @@ def test_base_url_env(self) -> None:
         ],
         ids=["standard", "custom http client"],
     )
-    def test_base_url_trailing_slash(self, client: AsyncLegalesignSDK) -> None:
+    async def test_base_url_trailing_slash(self, client: AsyncLegalesignSDK) -> None:
         request = client._build_request(
             FinalRequestOptions(
                 method="post",
@@ -1401,6 +1439,7 @@ def test_base_url_trailing_slash(self, client: AsyncLegalesignSDK) -> None:
             ),
         )
         assert request.url == "http://localhost:5000/custom/path/foo"
+        await client.close()
 
     @pytest.mark.parametrize(
         "client",
@@ -1417,7 +1456,7 @@ def test_base_url_trailing_slash(self, client: AsyncLegalesignSDK) -> None:
         ],
         ids=["standard", "custom http client"],
     )
-    def test_base_url_no_trailing_slash(self, client: AsyncLegalesignSDK) -> None:
+    async def test_base_url_no_trailing_slash(self, client: AsyncLegalesignSDK) -> None:
         request = client._build_request(
             FinalRequestOptions(
                 method="post",
@@ -1426,6 +1465,7 @@ def test_base_url_no_trailing_slash(self, client: AsyncLegalesignSDK) -> None:
             ),
         )
         assert request.url == "http://localhost:5000/custom/path/foo"
+        await client.close()
 
     @pytest.mark.parametrize(
         "client",
@@ -1442,7 +1482,7 @@ def test_base_url_no_trailing_slash(self, client: AsyncLegalesignSDK) -> None:
         ],
         ids=["standard", "custom http client"],
     )
-    def test_absolute_request_url(self, client: AsyncLegalesignSDK) -> None:
+    async def test_absolute_request_url(self, client: AsyncLegalesignSDK) -> None:
         request = client._build_request(
             FinalRequestOptions(
                 method="post",
@@ -1451,37 +1491,39 @@ def test_absolute_request_url(self, client: AsyncLegalesignSDK) -> None:
             ),
         )
         assert request.url == "https://myapi.com/foo"
+        await client.close()
 
     async def test_copied_client_does_not_close_http(self) -> None:
-        client = AsyncLegalesignSDK(base_url=base_url, api_key=api_key, _strict_response_validation=True)
-        assert not client.is_closed()
+        test_client = AsyncLegalesignSDK(base_url=base_url, api_key=api_key, _strict_response_validation=True)
+        assert not test_client.is_closed()
 
-        copied = client.copy()
-        assert copied is not client
+        copied = test_client.copy()
+        assert copied is not test_client
 
         del copied
 
         await asyncio.sleep(0.2)
-        assert not client.is_closed()
+        assert not test_client.is_closed()
 
     async def test_client_context_manager(self) -> None:
-        client = AsyncLegalesignSDK(base_url=base_url, api_key=api_key, _strict_response_validation=True)
-        async with client as c2:
-            assert c2 is client
+        test_client = AsyncLegalesignSDK(base_url=base_url, api_key=api_key, _strict_response_validation=True)
+        async with test_client as c2:
+            assert c2 is test_client
             assert not c2.is_closed()
-            assert not client.is_closed()
-        assert client.is_closed()
+            assert not test_client.is_closed()
+        assert test_client.is_closed()
 
     @pytest.mark.respx(base_url=base_url)
-    @pytest.mark.asyncio
-    async def test_client_response_validation_error(self, respx_mock: MockRouter) -> None:
+    async def test_client_response_validation_error(
+        self, respx_mock: MockRouter, async_client: AsyncLegalesignSDK
+    ) -> None:
         class Model(BaseModel):
             foo: str
 
         respx_mock.get("/foo").mock(return_value=httpx.Response(200, json={"foo": {"invalid": True}}))
 
         with pytest.raises(APIResponseValidationError) as exc:
-            await self.client.get("/foo", cast_to=Model)
+            await async_client.get("/foo", cast_to=Model)
 
         assert isinstance(exc.value.__cause__, ValidationError)
 
@@ -1492,7 +1534,6 @@ async def test_client_max_retries_validation(self) -> None:
             )
 
     @pytest.mark.respx(base_url=base_url)
-    @pytest.mark.asyncio
     async def test_received_text_for_expected_json(self, respx_mock: MockRouter) -> None:
         class Model(BaseModel):
             name: str
@@ -1504,11 +1545,14 @@ class Model(BaseModel):
         with pytest.raises(APIResponseValidationError):
             await strict_client.get("/foo", cast_to=Model)
 
-        client = AsyncLegalesignSDK(base_url=base_url, api_key=api_key, _strict_response_validation=False)
+        non_strict_client = AsyncLegalesignSDK(base_url=base_url, api_key=api_key, _strict_response_validation=False)
 
-        response = await client.get("/foo", cast_to=Model)
+        response = await non_strict_client.get("/foo", cast_to=Model)
         assert isinstance(response, str)  # type: ignore[unreachable]
 
+        await strict_client.close()
+        await non_strict_client.close()
+
     @pytest.mark.parametrize(
         "remaining_retries,retry_after,timeout",
         [
@@ -1531,13 +1575,12 @@ class Model(BaseModel):
         ],
     )
     @mock.patch("time.time", mock.MagicMock(return_value=1696004797))
-    @pytest.mark.asyncio
-    async def test_parse_retry_after_header(self, remaining_retries: int, retry_after: str, timeout: float) -> None:
-        client = AsyncLegalesignSDK(base_url=base_url, api_key=api_key, _strict_response_validation=True)
-
+    async def test_parse_retry_after_header(
+        self, remaining_retries: int, retry_after: str, timeout: float, async_client: AsyncLegalesignSDK
+    ) -> None:
         headers = httpx.Headers({"retry-after": retry_after})
         options = FinalRequestOptions(method="get", url="/foo", max_retries=3)
-        calculated = client._calculate_retry_timeout(remaining_retries, options, headers)
+        calculated = async_client._calculate_retry_timeout(remaining_retries, options, headers)
         assert calculated == pytest.approx(timeout, 0.5 * 0.875)  # pyright: ignore[reportUnknownMemberType]
 
     @mock.patch("legalesign_sdk._base_client.BaseClient._calculate_retry_timeout", _low_retry_timeout)
@@ -1550,7 +1593,7 @@ async def test_retrying_timeout_errors_doesnt_leak(
         with pytest.raises(APITimeoutError):
             await async_client.document.with_streaming_response.list(group="group").__aenter__()
 
-        assert _get_open_connections(self.client) == 0
+        assert _get_open_connections(async_client) == 0
 
     @mock.patch("legalesign_sdk._base_client.BaseClient._calculate_retry_timeout", _low_retry_timeout)
     @pytest.mark.respx(base_url=base_url)
@@ -1561,12 +1604,11 @@ async def test_retrying_status_errors_doesnt_leak(
 
         with pytest.raises(APIStatusError):
             await async_client.document.with_streaming_response.list(group="group").__aenter__()
-        assert _get_open_connections(self.client) == 0
+        assert _get_open_connections(async_client) == 0
 
     @pytest.mark.parametrize("failures_before_success", [0, 2, 4])
     @mock.patch("legalesign_sdk._base_client.BaseClient._calculate_retry_timeout", _low_retry_timeout)
     @pytest.mark.respx(base_url=base_url)
-    @pytest.mark.asyncio
     @pytest.mark.parametrize("failure_mode", ["status", "exception"])
     async def test_retries_taken(
         self,
@@ -1598,7 +1640,6 @@ def retry_handler(_request: httpx.Request) -> httpx.Response:
     @pytest.mark.parametrize("failures_before_success", [0, 2, 4])
     @mock.patch("legalesign_sdk._base_client.BaseClient._calculate_retry_timeout", _low_retry_timeout)
     @pytest.mark.respx(base_url=base_url)
-    @pytest.mark.asyncio
     async def test_omit_retry_count_header(
         self, async_client: AsyncLegalesignSDK, failures_before_success: int, respx_mock: MockRouter
     ) -> None:
@@ -1624,7 +1665,6 @@ def retry_handler(_request: httpx.Request) -> httpx.Response:
     @pytest.mark.parametrize("failures_before_success", [0, 2, 4])
     @mock.patch("legalesign_sdk._base_client.BaseClient._calculate_retry_timeout", _low_retry_timeout)
     @pytest.mark.respx(base_url=base_url)
-    @pytest.mark.asyncio
     async def test_overwrite_retry_count_header(
         self, async_client: AsyncLegalesignSDK, failures_before_success: int, respx_mock: MockRouter
     ) -> None:
@@ -1674,26 +1714,26 @@ async def test_default_client_creation(self) -> None:
         )
 
     @pytest.mark.respx(base_url=base_url)
-    async def test_follow_redirects(self, respx_mock: MockRouter) -> None:
+    async def test_follow_redirects(self, respx_mock: MockRouter, async_client: AsyncLegalesignSDK) -> None:
         # Test that the default follow_redirects=True allows following redirects
         respx_mock.post("/redirect").mock(
             return_value=httpx.Response(302, headers={"Location": f"{base_url}/redirected"})
         )
         respx_mock.get("/redirected").mock(return_value=httpx.Response(200, json={"status": "ok"}))
 
-        response = await self.client.post("/redirect", body={"key": "value"}, cast_to=httpx.Response)
+        response = await async_client.post("/redirect", body={"key": "value"}, cast_to=httpx.Response)
         assert response.status_code == 200
         assert response.json() == {"status": "ok"}
 
     @pytest.mark.respx(base_url=base_url)
-    async def test_follow_redirects_disabled(self, respx_mock: MockRouter) -> None:
+    async def test_follow_redirects_disabled(self, respx_mock: MockRouter, async_client: AsyncLegalesignSDK) -> None:
         # Test that follow_redirects=False prevents following redirects
         respx_mock.post("/redirect").mock(
             return_value=httpx.Response(302, headers={"Location": f"{base_url}/redirected"})
         )
 
         with pytest.raises(APIStatusError) as exc_info:
-            await self.client.post(
+            await async_client.post(
                 "/redirect", body={"key": "value"}, options={"follow_redirects": False}, cast_to=httpx.Response
             )
 
From 43804f1cb745b987ba33e17611039a131a7bf982 Mon Sep 17 00:00:00 2001
From: "stainless-app[bot]"
 <142633134+stainless-app[bot]@users.noreply.github.com>
Date: Fri, 31 Oct 2025 04:15:09 +0000
Subject: [PATCH 7/7] release: 1.1.2
---
 .release-please-manifest.json  |  2 +-
 CHANGELOG.md                   | 18 ++++++++++++++++++
 pyproject.toml                 |  2 +-
 src/legalesign_sdk/_version.py |  2 +-
 4 files changed, 21 insertions(+), 3 deletions(-)
 create mode 100644 CHANGELOG.md
diff --git a/.release-please-manifest.json b/.release-please-manifest.json
index b55c11f..9c6a481 100644
--- a/.release-please-manifest.json
+++ b/.release-please-manifest.json
@@ -1,3 +1,3 @@
 {
-  ".": "1.1.1"
+  ".": "1.1.2"
 }
\ No newline at end of file
diff --git a/CHANGELOG.md b/CHANGELOG.md
new file mode 100644
index 0000000..84e9e16
--- /dev/null
+++ b/CHANGELOG.md
@@ -0,0 +1,18 @@
+# Changelog
+
+## 1.1.2 (2025-10-31)
+
+Full Changelog: [v1.1.1...v1.1.2](https://github.com/legalesign/legalesign-rest-python/compare/v1.1.1...v1.1.2)
+
+### Bug Fixes
+
+* **client:** close streams without requiring full consumption ([0e21d9f](https://github.com/legalesign/legalesign-rest-python/commit/0e21d9f752891c00414a4238e4a5ed4b4599aa55))
+
+
+### Chores
+
+* bump `httpx-aiohttp` version to 0.1.9 ([0cd2998](https://github.com/legalesign/legalesign-rest-python/commit/0cd299896e81a5353a47b96b8537b3d5e7e7ca14))
+* **internal/tests:** avoid race condition with implicit client cleanup ([ea7d42a](https://github.com/legalesign/legalesign-rest-python/commit/ea7d42ac5829bb26a5da8490f13d98bc43e1e553))
+* **internal:** detect missing future annotations with ruff ([4b624cf](https://github.com/legalesign/legalesign-rest-python/commit/4b624cf077421fe7c8b67f919853d30956ca1778))
+* sync repo ([64564cd](https://github.com/legalesign/legalesign-rest-python/commit/64564cd3df8ac0da223aa31f43eb08a532d0c1cd))
+* update SDK settings ([825250b](https://github.com/legalesign/legalesign-rest-python/commit/825250b8d77a09bc829cc9083351063098857613))
diff --git a/pyproject.toml b/pyproject.toml
index 6e76f77..f165d44 100644
--- a/pyproject.toml
+++ b/pyproject.toml
@@ -1,6 +1,6 @@
 [project]
 name = "legalesign"
-version = "1.1.1"
+version = "1.1.2"
 description = "The official Python library for the legalesign-sdk API"
 dynamic = ["readme"]
 license = "Apache-2.0"
diff --git a/src/legalesign_sdk/_version.py b/src/legalesign_sdk/_version.py
index 4b649a4..00a5c7f 100644
--- a/src/legalesign_sdk/_version.py
+++ b/src/legalesign_sdk/_version.py
@@ -1,4 +1,4 @@
 # File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.
 
 __title__ = "legalesign_sdk"
-__version__ = "1.1.1"  # x-release-please-version
+__version__ = "1.1.2"  # x-release-please-version