From fc59c6018a3ff8c9e1a667ece0021676062fbed3 Mon Sep 17 00:00:00 2001
From: "stainless-app[bot]"
<142633134+stainless-app[bot]@users.noreply.github.com>
Date: Thu, 16 Oct 2025 15:16:45 +0000
Subject: [PATCH 01/17] chore: update SDK settings
---
.github/workflows/publish-pypi.yml | 31 +++++++++
.github/workflows/release-doctor.yml | 21 ++++++
.release-please-manifest.json | 3 +
.stats.yml | 2 +-
CONTRIBUTING.md | 4 +-
README.md | 14 ++--
bin/check-release-environment | 21 ++++++
pyproject.toml | 6 +-
release-please-config.json | 66 +++++++++++++++++++
src/whopsdk/_version.py | 2 +-
src/whopsdk/resources/app_builds.py | 8 +--
src/whopsdk/resources/apps.py | 8 +--
src/whopsdk/resources/authorized_users.py | 8 +--
src/whopsdk/resources/chat_channels.py | 8 +--
.../resources/checkout_configurations.py | 8 +--
src/whopsdk/resources/companies.py | 8 +--
.../resources/course_lesson_interactions.py | 8 +--
src/whopsdk/resources/entries.py | 8 +--
src/whopsdk/resources/experiences.py | 8 +--
src/whopsdk/resources/forum_posts.py | 8 +--
src/whopsdk/resources/invoices.py | 8 +--
src/whopsdk/resources/ledger_accounts.py | 8 +--
src/whopsdk/resources/memberships.py | 8 +--
src/whopsdk/resources/messages.py | 8 +--
src/whopsdk/resources/payments.py | 8 +--
src/whopsdk/resources/plans.py | 8 +--
src/whopsdk/resources/products.py | 8 +--
src/whopsdk/resources/reactions.py | 8 +--
src/whopsdk/resources/shipments.py | 8 +--
src/whopsdk/resources/support_channels.py | 8 +--
src/whopsdk/resources/transfers.py | 8 +--
src/whopsdk/resources/users.py | 8 +--
32 files changed, 244 insertions(+), 102 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 00000000..64a890ec
--- /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/whopio/whopsdk-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.WHOP_PYPI_TOKEN || secrets.PYPI_TOKEN }}
diff --git a/.github/workflows/release-doctor.yml b/.github/workflows/release-doctor.yml
new file mode 100644
index 00000000..b63c0b62
--- /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 == 'whopio/whopsdk-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.WHOP_PYPI_TOKEN || secrets.PYPI_TOKEN }}
diff --git a/.release-please-manifest.json b/.release-please-manifest.json
new file mode 100644
index 00000000..1332969b
--- /dev/null
+++ b/.release-please-manifest.json
@@ -0,0 +1,3 @@
+{
+ ".": "0.0.1"
+}
\ No newline at end of file
diff --git a/.stats.yml b/.stats.yml
index 56f3239f..63738059 100644
--- a/.stats.yml
+++ b/.stats.yml
@@ -1,4 +1,4 @@
configured_endpoints: 76
openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/frostedinc%2Fwhopsdk-493b08fc2ae996eaf1758fa74f56163b2e40d4e1abeaa9672b8d1a039df30d75.yml
openapi_spec_hash: 212470480a88cabb38a58b5b6867c733
-config_hash: 544517bd5d21c8f0df57292359ed31e4
+config_hash: 7dfb88bc41d1a03044fa2b1f21ffdb6d
diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md
index a68778bb..435024a3 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/whopsdk-python.git
+$ pip install git+ssh://git@github.com/whopio/whopsdk-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/whopsdk-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/whopio/whopsdk-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 714ccec7..943a53b5 100644
--- a/README.md
+++ b/README.md
@@ -16,8 +16,8 @@ The REST API documentation can be found on [docs.whop.com](https://docs.whop.com
## Installation
```sh
-# install from this staging repo
-pip install git+ssh://git@github.com/stainless-sdks/whopsdk-python.git
+# install from the production repo
+pip install git+ssh://git@github.com/whopio/whopsdk-python.git
```
> [!NOTE]
@@ -81,8 +81,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 'whopsdk[aiohttp] @ git+ssh://git@github.com/stainless-sdks/whopsdk-python.git'
+# install from the production repo
+pip install 'whopsdk[aiohttp] @ git+ssh://git@github.com/whopio/whopsdk-python.git'
```
Then you can enable it by instantiating the client with `http_client=DefaultAioHttpClient()`:
@@ -355,9 +355,9 @@ payment = response.parse() # get the object that `payments.list()` would have r
print(payment.id)
```
-These methods return an [`APIResponse`](https://github.com/stainless-sdks/whopsdk-python/tree/main/src/whopsdk/_response.py) object.
+These methods return an [`APIResponse`](https://github.com/whopio/whopsdk-python/tree/main/src/whopsdk/_response.py) object.
-The async client returns an [`AsyncAPIResponse`](https://github.com/stainless-sdks/whopsdk-python/tree/main/src/whopsdk/_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/whopio/whopsdk-python/tree/main/src/whopsdk/_response.py) with the same structure, the only difference being `await`able methods for reading the response content.
#### `.with_streaming_response`
@@ -466,7 +466,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/whopsdk-python/issues) with questions, bugs, or suggestions.
+We are keen for your feedback; please open an [issue](https://www.github.com/whopio/whopsdk-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 00000000..b845b0f4
--- /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 ce4cffb7..e7268335 100644
--- a/pyproject.toml
+++ b/pyproject.toml
@@ -35,8 +35,8 @@ classifiers = [
]
[project.urls]
-Homepage = "https://github.com/stainless-sdks/whopsdk-python"
-Repository = "https://github.com/stainless-sdks/whopsdk-python"
+Homepage = "https://github.com/whopio/whopsdk-python"
+Repository = "https://github.com/whopio/whopsdk-python"
[project.optional-dependencies]
aiohttp = ["aiohttp", "httpx_aiohttp>=0.1.8"]
@@ -125,7 +125,7 @@ path = "README.md"
[[tool.hatch.metadata.hooks.fancy-pypi-readme.substitutions]]
# replace relative links with absolute links
pattern = '\[(.+?)\]\(((?!https?://)\S+?)\)'
-replacement = '[\1](https://github.com/stainless-sdks/whopsdk-python/tree/main/\g<2>)'
+replacement = '[\1](https://github.com/whopio/whopsdk-python/tree/main/\g<2>)'
[tool.pytest.ini_options]
testpaths = ["tests"]
diff --git a/release-please-config.json b/release-please-config.json
new file mode 100644
index 00000000..694109b6
--- /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/whopsdk/_version.py"
+ ]
+}
\ No newline at end of file
diff --git a/src/whopsdk/_version.py b/src/whopsdk/_version.py
index 15354f7d..5a479d33 100644
--- a/src/whopsdk/_version.py
+++ b/src/whopsdk/_version.py
@@ -1,4 +1,4 @@
# File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.
__title__ = "whopsdk"
-__version__ = "0.0.1"
+__version__ = "0.0.1" # x-release-please-version
diff --git a/src/whopsdk/resources/app_builds.py b/src/whopsdk/resources/app_builds.py
index 4e6aa0da..627a4ff4 100644
--- a/src/whopsdk/resources/app_builds.py
+++ b/src/whopsdk/resources/app_builds.py
@@ -35,7 +35,7 @@ def with_raw_response(self) -> AppBuildsResourceWithRawResponse:
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/whopsdk-python#accessing-raw-response-data-eg-headers
+ For more information, see https://www.github.com/whopio/whopsdk-python#accessing-raw-response-data-eg-headers
"""
return AppBuildsResourceWithRawResponse(self)
@@ -44,7 +44,7 @@ def with_streaming_response(self) -> AppBuildsResourceWithStreamingResponse:
"""
An alternative to `.with_raw_response` that doesn't eagerly read the response body.
- For more information, see https://www.github.com/stainless-sdks/whopsdk-python#with_streaming_response
+ For more information, see https://www.github.com/whopio/whopsdk-python#with_streaming_response
"""
return AppBuildsResourceWithStreamingResponse(self)
@@ -266,7 +266,7 @@ def with_raw_response(self) -> AsyncAppBuildsResourceWithRawResponse:
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/whopsdk-python#accessing-raw-response-data-eg-headers
+ For more information, see https://www.github.com/whopio/whopsdk-python#accessing-raw-response-data-eg-headers
"""
return AsyncAppBuildsResourceWithRawResponse(self)
@@ -275,7 +275,7 @@ def with_streaming_response(self) -> AsyncAppBuildsResourceWithStreamingResponse
"""
An alternative to `.with_raw_response` that doesn't eagerly read the response body.
- For more information, see https://www.github.com/stainless-sdks/whopsdk-python#with_streaming_response
+ For more information, see https://www.github.com/whopio/whopsdk-python#with_streaming_response
"""
return AsyncAppBuildsResourceWithStreamingResponse(self)
diff --git a/src/whopsdk/resources/apps.py b/src/whopsdk/resources/apps.py
index ecf48d3c..09cd0d33 100644
--- a/src/whopsdk/resources/apps.py
+++ b/src/whopsdk/resources/apps.py
@@ -36,7 +36,7 @@ def with_raw_response(self) -> AppsResourceWithRawResponse:
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/whopsdk-python#accessing-raw-response-data-eg-headers
+ For more information, see https://www.github.com/whopio/whopsdk-python#accessing-raw-response-data-eg-headers
"""
return AppsResourceWithRawResponse(self)
@@ -45,7 +45,7 @@ def with_streaming_response(self) -> AppsResourceWithStreamingResponse:
"""
An alternative to `.with_raw_response` that doesn't eagerly read the response body.
- For more information, see https://www.github.com/stainless-sdks/whopsdk-python#with_streaming_response
+ For more information, see https://www.github.com/whopio/whopsdk-python#with_streaming_response
"""
return AppsResourceWithStreamingResponse(self)
@@ -318,7 +318,7 @@ def with_raw_response(self) -> AsyncAppsResourceWithRawResponse:
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/whopsdk-python#accessing-raw-response-data-eg-headers
+ For more information, see https://www.github.com/whopio/whopsdk-python#accessing-raw-response-data-eg-headers
"""
return AsyncAppsResourceWithRawResponse(self)
@@ -327,7 +327,7 @@ def with_streaming_response(self) -> AsyncAppsResourceWithStreamingResponse:
"""
An alternative to `.with_raw_response` that doesn't eagerly read the response body.
- For more information, see https://www.github.com/stainless-sdks/whopsdk-python#with_streaming_response
+ For more information, see https://www.github.com/whopio/whopsdk-python#with_streaming_response
"""
return AsyncAppsResourceWithStreamingResponse(self)
diff --git a/src/whopsdk/resources/authorized_users.py b/src/whopsdk/resources/authorized_users.py
index 79160372..35e5daff 100644
--- a/src/whopsdk/resources/authorized_users.py
+++ b/src/whopsdk/resources/authorized_users.py
@@ -33,7 +33,7 @@ def with_raw_response(self) -> AuthorizedUsersResourceWithRawResponse:
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/whopsdk-python#accessing-raw-response-data-eg-headers
+ For more information, see https://www.github.com/whopio/whopsdk-python#accessing-raw-response-data-eg-headers
"""
return AuthorizedUsersResourceWithRawResponse(self)
@@ -42,7 +42,7 @@ def with_streaming_response(self) -> AuthorizedUsersResourceWithStreamingRespons
"""
An alternative to `.with_raw_response` that doesn't eagerly read the response body.
- For more information, see https://www.github.com/stainless-sdks/whopsdk-python#with_streaming_response
+ For more information, see https://www.github.com/whopio/whopsdk-python#with_streaming_response
"""
return AuthorizedUsersResourceWithStreamingResponse(self)
@@ -164,7 +164,7 @@ def with_raw_response(self) -> AsyncAuthorizedUsersResourceWithRawResponse:
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/whopsdk-python#accessing-raw-response-data-eg-headers
+ For more information, see https://www.github.com/whopio/whopsdk-python#accessing-raw-response-data-eg-headers
"""
return AsyncAuthorizedUsersResourceWithRawResponse(self)
@@ -173,7 +173,7 @@ def with_streaming_response(self) -> AsyncAuthorizedUsersResourceWithStreamingRe
"""
An alternative to `.with_raw_response` that doesn't eagerly read the response body.
- For more information, see https://www.github.com/stainless-sdks/whopsdk-python#with_streaming_response
+ For more information, see https://www.github.com/whopio/whopsdk-python#with_streaming_response
"""
return AsyncAuthorizedUsersResourceWithStreamingResponse(self)
diff --git a/src/whopsdk/resources/chat_channels.py b/src/whopsdk/resources/chat_channels.py
index ea7a2039..5c30f6c4 100644
--- a/src/whopsdk/resources/chat_channels.py
+++ b/src/whopsdk/resources/chat_channels.py
@@ -34,7 +34,7 @@ def with_raw_response(self) -> ChatChannelsResourceWithRawResponse:
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/whopsdk-python#accessing-raw-response-data-eg-headers
+ For more information, see https://www.github.com/whopio/whopsdk-python#accessing-raw-response-data-eg-headers
"""
return ChatChannelsResourceWithRawResponse(self)
@@ -43,7 +43,7 @@ def with_streaming_response(self) -> ChatChannelsResourceWithStreamingResponse:
"""
An alternative to `.with_raw_response` that doesn't eagerly read the response body.
- For more information, see https://www.github.com/stainless-sdks/whopsdk-python#with_streaming_response
+ For more information, see https://www.github.com/whopio/whopsdk-python#with_streaming_response
"""
return ChatChannelsResourceWithStreamingResponse(self)
@@ -225,7 +225,7 @@ def with_raw_response(self) -> AsyncChatChannelsResourceWithRawResponse:
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/whopsdk-python#accessing-raw-response-data-eg-headers
+ For more information, see https://www.github.com/whopio/whopsdk-python#accessing-raw-response-data-eg-headers
"""
return AsyncChatChannelsResourceWithRawResponse(self)
@@ -234,7 +234,7 @@ def with_streaming_response(self) -> AsyncChatChannelsResourceWithStreamingRespo
"""
An alternative to `.with_raw_response` that doesn't eagerly read the response body.
- For more information, see https://www.github.com/stainless-sdks/whopsdk-python#with_streaming_response
+ For more information, see https://www.github.com/whopio/whopsdk-python#with_streaming_response
"""
return AsyncChatChannelsResourceWithStreamingResponse(self)
diff --git a/src/whopsdk/resources/checkout_configurations.py b/src/whopsdk/resources/checkout_configurations.py
index 08e0c695..d2a63268 100644
--- a/src/whopsdk/resources/checkout_configurations.py
+++ b/src/whopsdk/resources/checkout_configurations.py
@@ -33,7 +33,7 @@ def with_raw_response(self) -> CheckoutConfigurationsResourceWithRawResponse:
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/whopsdk-python#accessing-raw-response-data-eg-headers
+ For more information, see https://www.github.com/whopio/whopsdk-python#accessing-raw-response-data-eg-headers
"""
return CheckoutConfigurationsResourceWithRawResponse(self)
@@ -42,7 +42,7 @@ def with_streaming_response(self) -> CheckoutConfigurationsResourceWithStreaming
"""
An alternative to `.with_raw_response` that doesn't eagerly read the response body.
- For more information, see https://www.github.com/stainless-sdks/whopsdk-python#with_streaming_response
+ For more information, see https://www.github.com/whopio/whopsdk-python#with_streaming_response
"""
return CheckoutConfigurationsResourceWithStreamingResponse(self)
@@ -222,7 +222,7 @@ def with_raw_response(self) -> AsyncCheckoutConfigurationsResourceWithRawRespons
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/whopsdk-python#accessing-raw-response-data-eg-headers
+ For more information, see https://www.github.com/whopio/whopsdk-python#accessing-raw-response-data-eg-headers
"""
return AsyncCheckoutConfigurationsResourceWithRawResponse(self)
@@ -231,7 +231,7 @@ def with_streaming_response(self) -> AsyncCheckoutConfigurationsResourceWithStre
"""
An alternative to `.with_raw_response` that doesn't eagerly read the response body.
- For more information, see https://www.github.com/stainless-sdks/whopsdk-python#with_streaming_response
+ For more information, see https://www.github.com/whopio/whopsdk-python#with_streaming_response
"""
return AsyncCheckoutConfigurationsResourceWithStreamingResponse(self)
diff --git a/src/whopsdk/resources/companies.py b/src/whopsdk/resources/companies.py
index b0fc36b4..be4d3a74 100644
--- a/src/whopsdk/resources/companies.py
+++ b/src/whopsdk/resources/companies.py
@@ -26,7 +26,7 @@ def with_raw_response(self) -> CompaniesResourceWithRawResponse:
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/whopsdk-python#accessing-raw-response-data-eg-headers
+ For more information, see https://www.github.com/whopio/whopsdk-python#accessing-raw-response-data-eg-headers
"""
return CompaniesResourceWithRawResponse(self)
@@ -35,7 +35,7 @@ def with_streaming_response(self) -> CompaniesResourceWithStreamingResponse:
"""
An alternative to `.with_raw_response` that doesn't eagerly read the response body.
- For more information, see https://www.github.com/stainless-sdks/whopsdk-python#with_streaming_response
+ For more information, see https://www.github.com/whopio/whopsdk-python#with_streaming_response
"""
return CompaniesResourceWithStreamingResponse(self)
@@ -84,7 +84,7 @@ def with_raw_response(self) -> AsyncCompaniesResourceWithRawResponse:
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/whopsdk-python#accessing-raw-response-data-eg-headers
+ For more information, see https://www.github.com/whopio/whopsdk-python#accessing-raw-response-data-eg-headers
"""
return AsyncCompaniesResourceWithRawResponse(self)
@@ -93,7 +93,7 @@ def with_streaming_response(self) -> AsyncCompaniesResourceWithStreamingResponse
"""
An alternative to `.with_raw_response` that doesn't eagerly read the response body.
- For more information, see https://www.github.com/stainless-sdks/whopsdk-python#with_streaming_response
+ For more information, see https://www.github.com/whopio/whopsdk-python#with_streaming_response
"""
return AsyncCompaniesResourceWithStreamingResponse(self)
diff --git a/src/whopsdk/resources/course_lesson_interactions.py b/src/whopsdk/resources/course_lesson_interactions.py
index ed639ce8..4a329239 100644
--- a/src/whopsdk/resources/course_lesson_interactions.py
+++ b/src/whopsdk/resources/course_lesson_interactions.py
@@ -32,7 +32,7 @@ def with_raw_response(self) -> CourseLessonInteractionsResourceWithRawResponse:
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/whopsdk-python#accessing-raw-response-data-eg-headers
+ For more information, see https://www.github.com/whopio/whopsdk-python#accessing-raw-response-data-eg-headers
"""
return CourseLessonInteractionsResourceWithRawResponse(self)
@@ -41,7 +41,7 @@ def with_streaming_response(self) -> CourseLessonInteractionsResourceWithStreami
"""
An alternative to `.with_raw_response` that doesn't eagerly read the response body.
- For more information, see https://www.github.com/stainless-sdks/whopsdk-python#with_streaming_response
+ For more information, see https://www.github.com/whopio/whopsdk-python#with_streaming_response
"""
return CourseLessonInteractionsResourceWithStreamingResponse(self)
@@ -167,7 +167,7 @@ def with_raw_response(self) -> AsyncCourseLessonInteractionsResourceWithRawRespo
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/whopsdk-python#accessing-raw-response-data-eg-headers
+ For more information, see https://www.github.com/whopio/whopsdk-python#accessing-raw-response-data-eg-headers
"""
return AsyncCourseLessonInteractionsResourceWithRawResponse(self)
@@ -176,7 +176,7 @@ def with_streaming_response(self) -> AsyncCourseLessonInteractionsResourceWithSt
"""
An alternative to `.with_raw_response` that doesn't eagerly read the response body.
- For more information, see https://www.github.com/stainless-sdks/whopsdk-python#with_streaming_response
+ For more information, see https://www.github.com/whopio/whopsdk-python#with_streaming_response
"""
return AsyncCourseLessonInteractionsResourceWithStreamingResponse(self)
diff --git a/src/whopsdk/resources/entries.py b/src/whopsdk/resources/entries.py
index 5f18eec0..66225d15 100644
--- a/src/whopsdk/resources/entries.py
+++ b/src/whopsdk/resources/entries.py
@@ -36,7 +36,7 @@ def with_raw_response(self) -> EntriesResourceWithRawResponse:
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/whopsdk-python#accessing-raw-response-data-eg-headers
+ For more information, see https://www.github.com/whopio/whopsdk-python#accessing-raw-response-data-eg-headers
"""
return EntriesResourceWithRawResponse(self)
@@ -45,7 +45,7 @@ def with_streaming_response(self) -> EntriesResourceWithStreamingResponse:
"""
An alternative to `.with_raw_response` that doesn't eagerly read the response body.
- For more information, see https://www.github.com/stainless-sdks/whopsdk-python#with_streaming_response
+ For more information, see https://www.github.com/whopio/whopsdk-python#with_streaming_response
"""
return EntriesResourceWithStreamingResponse(self)
@@ -255,7 +255,7 @@ def with_raw_response(self) -> AsyncEntriesResourceWithRawResponse:
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/whopsdk-python#accessing-raw-response-data-eg-headers
+ For more information, see https://www.github.com/whopio/whopsdk-python#accessing-raw-response-data-eg-headers
"""
return AsyncEntriesResourceWithRawResponse(self)
@@ -264,7 +264,7 @@ def with_streaming_response(self) -> AsyncEntriesResourceWithStreamingResponse:
"""
An alternative to `.with_raw_response` that doesn't eagerly read the response body.
- For more information, see https://www.github.com/stainless-sdks/whopsdk-python#with_streaming_response
+ For more information, see https://www.github.com/whopio/whopsdk-python#with_streaming_response
"""
return AsyncEntriesResourceWithStreamingResponse(self)
diff --git a/src/whopsdk/resources/experiences.py b/src/whopsdk/resources/experiences.py
index a2c2db3d..41e06c65 100644
--- a/src/whopsdk/resources/experiences.py
+++ b/src/whopsdk/resources/experiences.py
@@ -40,7 +40,7 @@ def with_raw_response(self) -> ExperiencesResourceWithRawResponse:
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/whopsdk-python#accessing-raw-response-data-eg-headers
+ For more information, see https://www.github.com/whopio/whopsdk-python#accessing-raw-response-data-eg-headers
"""
return ExperiencesResourceWithRawResponse(self)
@@ -49,7 +49,7 @@ def with_streaming_response(self) -> ExperiencesResourceWithStreamingResponse:
"""
An alternative to `.with_raw_response` that doesn't eagerly read the response body.
- For more information, see https://www.github.com/stainless-sdks/whopsdk-python#with_streaming_response
+ For more information, see https://www.github.com/whopio/whopsdk-python#with_streaming_response
"""
return ExperiencesResourceWithStreamingResponse(self)
@@ -397,7 +397,7 @@ def with_raw_response(self) -> AsyncExperiencesResourceWithRawResponse:
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/whopsdk-python#accessing-raw-response-data-eg-headers
+ For more information, see https://www.github.com/whopio/whopsdk-python#accessing-raw-response-data-eg-headers
"""
return AsyncExperiencesResourceWithRawResponse(self)
@@ -406,7 +406,7 @@ def with_streaming_response(self) -> AsyncExperiencesResourceWithStreamingRespon
"""
An alternative to `.with_raw_response` that doesn't eagerly read the response body.
- For more information, see https://www.github.com/stainless-sdks/whopsdk-python#with_streaming_response
+ For more information, see https://www.github.com/whopio/whopsdk-python#with_streaming_response
"""
return AsyncExperiencesResourceWithStreamingResponse(self)
diff --git a/src/whopsdk/resources/forum_posts.py b/src/whopsdk/resources/forum_posts.py
index fbf475e5..8b744103 100644
--- a/src/whopsdk/resources/forum_posts.py
+++ b/src/whopsdk/resources/forum_posts.py
@@ -33,7 +33,7 @@ def with_raw_response(self) -> ForumPostsResourceWithRawResponse:
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/whopsdk-python#accessing-raw-response-data-eg-headers
+ For more information, see https://www.github.com/whopio/whopsdk-python#accessing-raw-response-data-eg-headers
"""
return ForumPostsResourceWithRawResponse(self)
@@ -42,7 +42,7 @@ def with_streaming_response(self) -> ForumPostsResourceWithStreamingResponse:
"""
An alternative to `.with_raw_response` that doesn't eagerly read the response body.
- For more information, see https://www.github.com/stainless-sdks/whopsdk-python#with_streaming_response
+ For more information, see https://www.github.com/whopio/whopsdk-python#with_streaming_response
"""
return ForumPostsResourceWithStreamingResponse(self)
@@ -246,7 +246,7 @@ def with_raw_response(self) -> AsyncForumPostsResourceWithRawResponse:
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/whopsdk-python#accessing-raw-response-data-eg-headers
+ For more information, see https://www.github.com/whopio/whopsdk-python#accessing-raw-response-data-eg-headers
"""
return AsyncForumPostsResourceWithRawResponse(self)
@@ -255,7 +255,7 @@ def with_streaming_response(self) -> AsyncForumPostsResourceWithStreamingRespons
"""
An alternative to `.with_raw_response` that doesn't eagerly read the response body.
- For more information, see https://www.github.com/stainless-sdks/whopsdk-python#with_streaming_response
+ For more information, see https://www.github.com/whopio/whopsdk-python#with_streaming_response
"""
return AsyncForumPostsResourceWithStreamingResponse(self)
diff --git a/src/whopsdk/resources/invoices.py b/src/whopsdk/resources/invoices.py
index 37161aee..db15ac59 100644
--- a/src/whopsdk/resources/invoices.py
+++ b/src/whopsdk/resources/invoices.py
@@ -38,7 +38,7 @@ def with_raw_response(self) -> InvoicesResourceWithRawResponse:
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/whopsdk-python#accessing-raw-response-data-eg-headers
+ For more information, see https://www.github.com/whopio/whopsdk-python#accessing-raw-response-data-eg-headers
"""
return InvoicesResourceWithRawResponse(self)
@@ -47,7 +47,7 @@ def with_streaming_response(self) -> InvoicesResourceWithStreamingResponse:
"""
An alternative to `.with_raw_response` that doesn't eagerly read the response body.
- For more information, see https://www.github.com/stainless-sdks/whopsdk-python#with_streaming_response
+ For more information, see https://www.github.com/whopio/whopsdk-python#with_streaming_response
"""
return InvoicesResourceWithStreamingResponse(self)
@@ -303,7 +303,7 @@ def with_raw_response(self) -> AsyncInvoicesResourceWithRawResponse:
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/whopsdk-python#accessing-raw-response-data-eg-headers
+ For more information, see https://www.github.com/whopio/whopsdk-python#accessing-raw-response-data-eg-headers
"""
return AsyncInvoicesResourceWithRawResponse(self)
@@ -312,7 +312,7 @@ def with_streaming_response(self) -> AsyncInvoicesResourceWithStreamingResponse:
"""
An alternative to `.with_raw_response` that doesn't eagerly read the response body.
- For more information, see https://www.github.com/stainless-sdks/whopsdk-python#with_streaming_response
+ For more information, see https://www.github.com/whopio/whopsdk-python#with_streaming_response
"""
return AsyncInvoicesResourceWithStreamingResponse(self)
diff --git a/src/whopsdk/resources/ledger_accounts.py b/src/whopsdk/resources/ledger_accounts.py
index efc90146..039b6c02 100644
--- a/src/whopsdk/resources/ledger_accounts.py
+++ b/src/whopsdk/resources/ledger_accounts.py
@@ -26,7 +26,7 @@ def with_raw_response(self) -> LedgerAccountsResourceWithRawResponse:
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/whopsdk-python#accessing-raw-response-data-eg-headers
+ For more information, see https://www.github.com/whopio/whopsdk-python#accessing-raw-response-data-eg-headers
"""
return LedgerAccountsResourceWithRawResponse(self)
@@ -35,7 +35,7 @@ def with_streaming_response(self) -> LedgerAccountsResourceWithStreamingResponse
"""
An alternative to `.with_raw_response` that doesn't eagerly read the response body.
- For more information, see https://www.github.com/stainless-sdks/whopsdk-python#with_streaming_response
+ For more information, see https://www.github.com/whopio/whopsdk-python#with_streaming_response
"""
return LedgerAccountsResourceWithStreamingResponse(self)
@@ -84,7 +84,7 @@ def with_raw_response(self) -> AsyncLedgerAccountsResourceWithRawResponse:
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/whopsdk-python#accessing-raw-response-data-eg-headers
+ For more information, see https://www.github.com/whopio/whopsdk-python#accessing-raw-response-data-eg-headers
"""
return AsyncLedgerAccountsResourceWithRawResponse(self)
@@ -93,7 +93,7 @@ def with_streaming_response(self) -> AsyncLedgerAccountsResourceWithStreamingRes
"""
An alternative to `.with_raw_response` that doesn't eagerly read the response body.
- For more information, see https://www.github.com/stainless-sdks/whopsdk-python#with_streaming_response
+ For more information, see https://www.github.com/whopio/whopsdk-python#with_streaming_response
"""
return AsyncLedgerAccountsResourceWithStreamingResponse(self)
diff --git a/src/whopsdk/resources/memberships.py b/src/whopsdk/resources/memberships.py
index c8b74b00..907f9efa 100644
--- a/src/whopsdk/resources/memberships.py
+++ b/src/whopsdk/resources/memberships.py
@@ -41,7 +41,7 @@ def with_raw_response(self) -> MembershipsResourceWithRawResponse:
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/whopsdk-python#accessing-raw-response-data-eg-headers
+ For more information, see https://www.github.com/whopio/whopsdk-python#accessing-raw-response-data-eg-headers
"""
return MembershipsResourceWithRawResponse(self)
@@ -50,7 +50,7 @@ def with_streaming_response(self) -> MembershipsResourceWithStreamingResponse:
"""
An alternative to `.with_raw_response` that doesn't eagerly read the response body.
- For more information, see https://www.github.com/stainless-sdks/whopsdk-python#with_streaming_response
+ For more information, see https://www.github.com/whopio/whopsdk-python#with_streaming_response
"""
return MembershipsResourceWithStreamingResponse(self)
@@ -380,7 +380,7 @@ def with_raw_response(self) -> AsyncMembershipsResourceWithRawResponse:
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/whopsdk-python#accessing-raw-response-data-eg-headers
+ For more information, see https://www.github.com/whopio/whopsdk-python#accessing-raw-response-data-eg-headers
"""
return AsyncMembershipsResourceWithRawResponse(self)
@@ -389,7 +389,7 @@ def with_streaming_response(self) -> AsyncMembershipsResourceWithStreamingRespon
"""
An alternative to `.with_raw_response` that doesn't eagerly read the response body.
- For more information, see https://www.github.com/stainless-sdks/whopsdk-python#with_streaming_response
+ For more information, see https://www.github.com/whopio/whopsdk-python#with_streaming_response
"""
return AsyncMembershipsResourceWithStreamingResponse(self)
diff --git a/src/whopsdk/resources/messages.py b/src/whopsdk/resources/messages.py
index c4f8a5ff..a5f5aed5 100644
--- a/src/whopsdk/resources/messages.py
+++ b/src/whopsdk/resources/messages.py
@@ -33,7 +33,7 @@ def with_raw_response(self) -> MessagesResourceWithRawResponse:
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/whopsdk-python#accessing-raw-response-data-eg-headers
+ For more information, see https://www.github.com/whopio/whopsdk-python#accessing-raw-response-data-eg-headers
"""
return MessagesResourceWithRawResponse(self)
@@ -42,7 +42,7 @@ def with_streaming_response(self) -> MessagesResourceWithStreamingResponse:
"""
An alternative to `.with_raw_response` that doesn't eagerly read the response body.
- For more information, see https://www.github.com/stainless-sdks/whopsdk-python#with_streaming_response
+ For more information, see https://www.github.com/whopio/whopsdk-python#with_streaming_response
"""
return MessagesResourceWithStreamingResponse(self)
@@ -213,7 +213,7 @@ def with_raw_response(self) -> AsyncMessagesResourceWithRawResponse:
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/whopsdk-python#accessing-raw-response-data-eg-headers
+ For more information, see https://www.github.com/whopio/whopsdk-python#accessing-raw-response-data-eg-headers
"""
return AsyncMessagesResourceWithRawResponse(self)
@@ -222,7 +222,7 @@ def with_streaming_response(self) -> AsyncMessagesResourceWithStreamingResponse:
"""
An alternative to `.with_raw_response` that doesn't eagerly read the response body.
- For more information, see https://www.github.com/stainless-sdks/whopsdk-python#with_streaming_response
+ For more information, see https://www.github.com/whopio/whopsdk-python#with_streaming_response
"""
return AsyncMessagesResourceWithStreamingResponse(self)
diff --git a/src/whopsdk/resources/payments.py b/src/whopsdk/resources/payments.py
index b037781c..a1b5ddde 100644
--- a/src/whopsdk/resources/payments.py
+++ b/src/whopsdk/resources/payments.py
@@ -38,7 +38,7 @@ def with_raw_response(self) -> PaymentsResourceWithRawResponse:
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/whopsdk-python#accessing-raw-response-data-eg-headers
+ For more information, see https://www.github.com/whopio/whopsdk-python#accessing-raw-response-data-eg-headers
"""
return PaymentsResourceWithRawResponse(self)
@@ -47,7 +47,7 @@ def with_streaming_response(self) -> PaymentsResourceWithStreamingResponse:
"""
An alternative to `.with_raw_response` that doesn't eagerly read the response body.
- For more information, see https://www.github.com/stainless-sdks/whopsdk-python#with_streaming_response
+ For more information, see https://www.github.com/whopio/whopsdk-python#with_streaming_response
"""
return PaymentsResourceWithStreamingResponse(self)
@@ -360,7 +360,7 @@ def with_raw_response(self) -> AsyncPaymentsResourceWithRawResponse:
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/whopsdk-python#accessing-raw-response-data-eg-headers
+ For more information, see https://www.github.com/whopio/whopsdk-python#accessing-raw-response-data-eg-headers
"""
return AsyncPaymentsResourceWithRawResponse(self)
@@ -369,7 +369,7 @@ def with_streaming_response(self) -> AsyncPaymentsResourceWithStreamingResponse:
"""
An alternative to `.with_raw_response` that doesn't eagerly read the response body.
- For more information, see https://www.github.com/stainless-sdks/whopsdk-python#with_streaming_response
+ For more information, see https://www.github.com/whopio/whopsdk-python#with_streaming_response
"""
return AsyncPaymentsResourceWithStreamingResponse(self)
diff --git a/src/whopsdk/resources/plans.py b/src/whopsdk/resources/plans.py
index 2a637717..d536a330 100644
--- a/src/whopsdk/resources/plans.py
+++ b/src/whopsdk/resources/plans.py
@@ -41,7 +41,7 @@ def with_raw_response(self) -> PlansResourceWithRawResponse:
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/whopsdk-python#accessing-raw-response-data-eg-headers
+ For more information, see https://www.github.com/whopio/whopsdk-python#accessing-raw-response-data-eg-headers
"""
return PlansResourceWithRawResponse(self)
@@ -50,7 +50,7 @@ def with_streaming_response(self) -> PlansResourceWithStreamingResponse:
"""
An alternative to `.with_raw_response` that doesn't eagerly read the response body.
- For more information, see https://www.github.com/stainless-sdks/whopsdk-python#with_streaming_response
+ For more information, see https://www.github.com/whopio/whopsdk-python#with_streaming_response
"""
return PlansResourceWithStreamingResponse(self)
@@ -435,7 +435,7 @@ def with_raw_response(self) -> AsyncPlansResourceWithRawResponse:
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/whopsdk-python#accessing-raw-response-data-eg-headers
+ For more information, see https://www.github.com/whopio/whopsdk-python#accessing-raw-response-data-eg-headers
"""
return AsyncPlansResourceWithRawResponse(self)
@@ -444,7 +444,7 @@ def with_streaming_response(self) -> AsyncPlansResourceWithStreamingResponse:
"""
An alternative to `.with_raw_response` that doesn't eagerly read the response body.
- For more information, see https://www.github.com/stainless-sdks/whopsdk-python#with_streaming_response
+ For more information, see https://www.github.com/whopio/whopsdk-python#with_streaming_response
"""
return AsyncPlansResourceWithStreamingResponse(self)
diff --git a/src/whopsdk/resources/products.py b/src/whopsdk/resources/products.py
index bfa0ba56..0c9cba7c 100644
--- a/src/whopsdk/resources/products.py
+++ b/src/whopsdk/resources/products.py
@@ -42,7 +42,7 @@ def with_raw_response(self) -> ProductsResourceWithRawResponse:
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/whopsdk-python#accessing-raw-response-data-eg-headers
+ For more information, see https://www.github.com/whopio/whopsdk-python#accessing-raw-response-data-eg-headers
"""
return ProductsResourceWithRawResponse(self)
@@ -51,7 +51,7 @@ def with_streaming_response(self) -> ProductsResourceWithStreamingResponse:
"""
An alternative to `.with_raw_response` that doesn't eagerly read the response body.
- For more information, see https://www.github.com/stainless-sdks/whopsdk-python#with_streaming_response
+ For more information, see https://www.github.com/whopio/whopsdk-python#with_streaming_response
"""
return ProductsResourceWithStreamingResponse(self)
@@ -467,7 +467,7 @@ def with_raw_response(self) -> AsyncProductsResourceWithRawResponse:
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/whopsdk-python#accessing-raw-response-data-eg-headers
+ For more information, see https://www.github.com/whopio/whopsdk-python#accessing-raw-response-data-eg-headers
"""
return AsyncProductsResourceWithRawResponse(self)
@@ -476,7 +476,7 @@ def with_streaming_response(self) -> AsyncProductsResourceWithStreamingResponse:
"""
An alternative to `.with_raw_response` that doesn't eagerly read the response body.
- For more information, see https://www.github.com/stainless-sdks/whopsdk-python#with_streaming_response
+ For more information, see https://www.github.com/whopio/whopsdk-python#with_streaming_response
"""
return AsyncProductsResourceWithStreamingResponse(self)
diff --git a/src/whopsdk/resources/reactions.py b/src/whopsdk/resources/reactions.py
index 80281318..1070c458 100644
--- a/src/whopsdk/resources/reactions.py
+++ b/src/whopsdk/resources/reactions.py
@@ -32,7 +32,7 @@ def with_raw_response(self) -> ReactionsResourceWithRawResponse:
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/whopsdk-python#accessing-raw-response-data-eg-headers
+ For more information, see https://www.github.com/whopio/whopsdk-python#accessing-raw-response-data-eg-headers
"""
return ReactionsResourceWithRawResponse(self)
@@ -41,7 +41,7 @@ def with_streaming_response(self) -> ReactionsResourceWithStreamingResponse:
"""
An alternative to `.with_raw_response` that doesn't eagerly read the response body.
- For more information, see https://www.github.com/stainless-sdks/whopsdk-python#with_streaming_response
+ For more information, see https://www.github.com/whopio/whopsdk-python#with_streaming_response
"""
return ReactionsResourceWithStreamingResponse(self)
@@ -201,7 +201,7 @@ def with_raw_response(self) -> AsyncReactionsResourceWithRawResponse:
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/whopsdk-python#accessing-raw-response-data-eg-headers
+ For more information, see https://www.github.com/whopio/whopsdk-python#accessing-raw-response-data-eg-headers
"""
return AsyncReactionsResourceWithRawResponse(self)
@@ -210,7 +210,7 @@ def with_streaming_response(self) -> AsyncReactionsResourceWithStreamingResponse
"""
An alternative to `.with_raw_response` that doesn't eagerly read the response body.
- For more information, see https://www.github.com/stainless-sdks/whopsdk-python#with_streaming_response
+ For more information, see https://www.github.com/whopio/whopsdk-python#with_streaming_response
"""
return AsyncReactionsResourceWithStreamingResponse(self)
diff --git a/src/whopsdk/resources/shipments.py b/src/whopsdk/resources/shipments.py
index 9aaa360e..2090a247 100644
--- a/src/whopsdk/resources/shipments.py
+++ b/src/whopsdk/resources/shipments.py
@@ -32,7 +32,7 @@ def with_raw_response(self) -> ShipmentsResourceWithRawResponse:
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/whopsdk-python#accessing-raw-response-data-eg-headers
+ For more information, see https://www.github.com/whopio/whopsdk-python#accessing-raw-response-data-eg-headers
"""
return ShipmentsResourceWithRawResponse(self)
@@ -41,7 +41,7 @@ def with_streaming_response(self) -> ShipmentsResourceWithStreamingResponse:
"""
An alternative to `.with_raw_response` that doesn't eagerly read the response body.
- For more information, see https://www.github.com/stainless-sdks/whopsdk-python#with_streaming_response
+ For more information, see https://www.github.com/whopio/whopsdk-python#with_streaming_response
"""
return ShipmentsResourceWithStreamingResponse(self)
@@ -215,7 +215,7 @@ def with_raw_response(self) -> AsyncShipmentsResourceWithRawResponse:
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/whopsdk-python#accessing-raw-response-data-eg-headers
+ For more information, see https://www.github.com/whopio/whopsdk-python#accessing-raw-response-data-eg-headers
"""
return AsyncShipmentsResourceWithRawResponse(self)
@@ -224,7 +224,7 @@ def with_streaming_response(self) -> AsyncShipmentsResourceWithStreamingResponse
"""
An alternative to `.with_raw_response` that doesn't eagerly read the response body.
- For more information, see https://www.github.com/stainless-sdks/whopsdk-python#with_streaming_response
+ For more information, see https://www.github.com/whopio/whopsdk-python#with_streaming_response
"""
return AsyncShipmentsResourceWithStreamingResponse(self)
diff --git a/src/whopsdk/resources/support_channels.py b/src/whopsdk/resources/support_channels.py
index fe22e2af..d0a3cb3a 100644
--- a/src/whopsdk/resources/support_channels.py
+++ b/src/whopsdk/resources/support_channels.py
@@ -34,7 +34,7 @@ def with_raw_response(self) -> SupportChannelsResourceWithRawResponse:
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/whopsdk-python#accessing-raw-response-data-eg-headers
+ For more information, see https://www.github.com/whopio/whopsdk-python#accessing-raw-response-data-eg-headers
"""
return SupportChannelsResourceWithRawResponse(self)
@@ -43,7 +43,7 @@ def with_streaming_response(self) -> SupportChannelsResourceWithStreamingRespons
"""
An alternative to `.with_raw_response` that doesn't eagerly read the response body.
- For more information, see https://www.github.com/stainless-sdks/whopsdk-python#with_streaming_response
+ For more information, see https://www.github.com/whopio/whopsdk-python#with_streaming_response
"""
return SupportChannelsResourceWithStreamingResponse(self)
@@ -218,7 +218,7 @@ def with_raw_response(self) -> AsyncSupportChannelsResourceWithRawResponse:
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/whopsdk-python#accessing-raw-response-data-eg-headers
+ For more information, see https://www.github.com/whopio/whopsdk-python#accessing-raw-response-data-eg-headers
"""
return AsyncSupportChannelsResourceWithRawResponse(self)
@@ -227,7 +227,7 @@ def with_streaming_response(self) -> AsyncSupportChannelsResourceWithStreamingRe
"""
An alternative to `.with_raw_response` that doesn't eagerly read the response body.
- For more information, see https://www.github.com/stainless-sdks/whopsdk-python#with_streaming_response
+ For more information, see https://www.github.com/whopio/whopsdk-python#with_streaming_response
"""
return AsyncSupportChannelsResourceWithStreamingResponse(self)
diff --git a/src/whopsdk/resources/transfers.py b/src/whopsdk/resources/transfers.py
index c0416c2e..16494328 100644
--- a/src/whopsdk/resources/transfers.py
+++ b/src/whopsdk/resources/transfers.py
@@ -35,7 +35,7 @@ def with_raw_response(self) -> TransfersResourceWithRawResponse:
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/whopsdk-python#accessing-raw-response-data-eg-headers
+ For more information, see https://www.github.com/whopio/whopsdk-python#accessing-raw-response-data-eg-headers
"""
return TransfersResourceWithRawResponse(self)
@@ -44,7 +44,7 @@ def with_streaming_response(self) -> TransfersResourceWithStreamingResponse:
"""
An alternative to `.with_raw_response` that doesn't eagerly read the response body.
- For more information, see https://www.github.com/stainless-sdks/whopsdk-python#with_streaming_response
+ For more information, see https://www.github.com/whopio/whopsdk-python#with_streaming_response
"""
return TransfersResourceWithStreamingResponse(self)
@@ -235,7 +235,7 @@ def with_raw_response(self) -> AsyncTransfersResourceWithRawResponse:
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/whopsdk-python#accessing-raw-response-data-eg-headers
+ For more information, see https://www.github.com/whopio/whopsdk-python#accessing-raw-response-data-eg-headers
"""
return AsyncTransfersResourceWithRawResponse(self)
@@ -244,7 +244,7 @@ def with_streaming_response(self) -> AsyncTransfersResourceWithStreamingResponse
"""
An alternative to `.with_raw_response` that doesn't eagerly read the response body.
- For more information, see https://www.github.com/stainless-sdks/whopsdk-python#with_streaming_response
+ For more information, see https://www.github.com/whopio/whopsdk-python#with_streaming_response
"""
return AsyncTransfersResourceWithStreamingResponse(self)
diff --git a/src/whopsdk/resources/users.py b/src/whopsdk/resources/users.py
index beb56896..513eb235 100644
--- a/src/whopsdk/resources/users.py
+++ b/src/whopsdk/resources/users.py
@@ -27,7 +27,7 @@ def with_raw_response(self) -> UsersResourceWithRawResponse:
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/whopsdk-python#accessing-raw-response-data-eg-headers
+ For more information, see https://www.github.com/whopio/whopsdk-python#accessing-raw-response-data-eg-headers
"""
return UsersResourceWithRawResponse(self)
@@ -36,7 +36,7 @@ def with_streaming_response(self) -> UsersResourceWithStreamingResponse:
"""
An alternative to `.with_raw_response` that doesn't eagerly read the response body.
- For more information, see https://www.github.com/stainless-sdks/whopsdk-python#with_streaming_response
+ For more information, see https://www.github.com/whopio/whopsdk-python#with_streaming_response
"""
return UsersResourceWithStreamingResponse(self)
@@ -117,7 +117,7 @@ def with_raw_response(self) -> AsyncUsersResourceWithRawResponse:
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/whopsdk-python#accessing-raw-response-data-eg-headers
+ For more information, see https://www.github.com/whopio/whopsdk-python#accessing-raw-response-data-eg-headers
"""
return AsyncUsersResourceWithRawResponse(self)
@@ -126,7 +126,7 @@ def with_streaming_response(self) -> AsyncUsersResourceWithStreamingResponse:
"""
An alternative to `.with_raw_response` that doesn't eagerly read the response body.
- For more information, see https://www.github.com/stainless-sdks/whopsdk-python#with_streaming_response
+ For more information, see https://www.github.com/whopio/whopsdk-python#with_streaming_response
"""
return AsyncUsersResourceWithStreamingResponse(self)
From 02c299327d251f9ec977af50ccd2504d0956a7e2 Mon Sep 17 00:00:00 2001
From: "stainless-app[bot]"
<142633134+stainless-app[bot]@users.noreply.github.com>
Date: Thu, 16 Oct 2025 15:17:07 +0000
Subject: [PATCH 02/17] codegen metadata
---
.stats.yml | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/.stats.yml b/.stats.yml
index 63738059..3c1c43c4 100644
--- a/.stats.yml
+++ b/.stats.yml
@@ -1,4 +1,4 @@
configured_endpoints: 76
openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/frostedinc%2Fwhopsdk-493b08fc2ae996eaf1758fa74f56163b2e40d4e1abeaa9672b8d1a039df30d75.yml
openapi_spec_hash: 212470480a88cabb38a58b5b6867c733
-config_hash: 7dfb88bc41d1a03044fa2b1f21ffdb6d
+config_hash: ff53778e477537f207ad8e97435ffdf4
From c9b049612845640f2637e2139a4e6a5e61b960d8 Mon Sep 17 00:00:00 2001
From: "stainless-app[bot]"
<142633134+stainless-app[bot]@users.noreply.github.com>
Date: Thu, 16 Oct 2025 15:33:37 +0000
Subject: [PATCH 03/17] chore: update SDK settings
---
.stats.yml | 2 +-
README.md | 13 +++++--------
pyproject.toml | 2 +-
requirements-dev.lock | 18 +++++++++---------
requirements.lock | 18 +++++++++---------
src/whopsdk/resources/webhooks.py | 4 ++--
6 files changed, 27 insertions(+), 30 deletions(-)
diff --git a/.stats.yml b/.stats.yml
index 3c1c43c4..08430ca9 100644
--- a/.stats.yml
+++ b/.stats.yml
@@ -1,4 +1,4 @@
configured_endpoints: 76
openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/frostedinc%2Fwhopsdk-493b08fc2ae996eaf1758fa74f56163b2e40d4e1abeaa9672b8d1a039df30d75.yml
openapi_spec_hash: 212470480a88cabb38a58b5b6867c733
-config_hash: ff53778e477537f207ad8e97435ffdf4
+config_hash: 9628427c59e4953508565376fc44ab35
diff --git a/README.md b/README.md
index 943a53b5..aae5084c 100644
--- a/README.md
+++ b/README.md
@@ -1,7 +1,7 @@
# Whop Python API library
-[)](https://pypi.org/project/whopsdk/)
+[)](https://pypi.org/project/whop-sdk/)
The Whop Python library provides convenient access to the Whop 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 [docs.whop.com](https://docs.whop.com
## Installation
```sh
-# install from the production repo
-pip install git+ssh://git@github.com/whopio/whopsdk-python.git
+# install from PyPI
+pip install whop-sdk
```
-> [!NOTE]
-> Once this package is [published to PyPI](https://www.stainless.com/docs/guides/publish), this will become: `pip install whopsdk`
-
## Usage
The full API of this library can be found in [api.md](api.md).
@@ -81,8 +78,8 @@ By default, the async client uses `httpx` for HTTP requests. However, for improv
You can enable this by installing `aiohttp`:
```sh
-# install from the production repo
-pip install 'whopsdk[aiohttp] @ git+ssh://git@github.com/whopio/whopsdk-python.git'
+# install from PyPI
+pip install whop-sdk[aiohttp]
```
Then you can enable it by instantiating the client with `http_client=DefaultAioHttpClient()`:
diff --git a/pyproject.toml b/pyproject.toml
index e7268335..1eed9d04 100644
--- a/pyproject.toml
+++ b/pyproject.toml
@@ -1,5 +1,5 @@
[project]
-name = "whopsdk"
+name = "whop-sdk"
version = "0.0.1"
description = "The official Python library for the Whop API"
dynamic = ["readme"]
diff --git a/requirements-dev.lock b/requirements-dev.lock
index cbd7fcfb..a64267f8 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 whopsdk
+ # via whop-sdk
aiosignal==1.3.2
# via aiohttp
annotated-types==0.6.0
# via pydantic
anyio==4.4.0
# via httpx
- # via whopsdk
+ # via whop-sdk
argcomplete==3.1.2
# via nox
async-timeout==5.0.1
@@ -40,7 +40,7 @@ dirty-equals==0.6.0
distlib==0.3.7
# via virtualenv
distro==1.8.0
- # via whopsdk
+ # via whop-sdk
exceptiongroup==1.2.2
# via anyio
# via pytest
@@ -59,9 +59,9 @@ httpx==0.28.1
# via httpx-aiohttp
# via respx
# via standardwebhooks
- # via whopsdk
+ # via whop-sdk
httpx-aiohttp==0.1.8
- # via whopsdk
+ # via whop-sdk
idna==3.4
# via anyio
# via httpx
@@ -93,7 +93,7 @@ propcache==0.3.1
# via aiohttp
# via yarl
pydantic==2.11.9
- # via whopsdk
+ # via whop-sdk
pydantic-core==2.33.2
# via pydantic
pygments==2.18.0
@@ -118,9 +118,9 @@ six==1.16.0
# via python-dateutil
sniffio==1.3.0
# via anyio
- # via whopsdk
+ # via whop-sdk
standardwebhooks==1.0.0
- # via whopsdk
+ # via whop-sdk
time-machine==2.9.0
tomli==2.0.2
# via mypy
@@ -137,7 +137,7 @@ typing-extensions==4.12.2
# via pydantic-core
# via pyright
# via typing-inspection
- # via whopsdk
+ # via whop-sdk
typing-inspection==0.4.1
# via pydantic
virtualenv==20.24.5
diff --git a/requirements.lock b/requirements.lock
index 1a1289da..62e1973c 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 whopsdk
+ # via whop-sdk
aiosignal==1.3.2
# via aiohttp
annotated-types==0.6.0
# via pydantic
anyio==4.4.0
# via httpx
- # via whopsdk
+ # via whop-sdk
async-timeout==5.0.1
# via aiohttp
attrs==25.3.0
@@ -33,7 +33,7 @@ certifi==2023.7.22
deprecated==1.2.18
# via standardwebhooks
distro==1.8.0
- # via whopsdk
+ # via whop-sdk
exceptiongroup==1.2.2
# via anyio
frozenlist==1.6.2
@@ -46,9 +46,9 @@ httpcore==1.0.9
httpx==0.28.1
# via httpx-aiohttp
# via standardwebhooks
- # via whopsdk
+ # via whop-sdk
httpx-aiohttp==0.1.8
- # via whopsdk
+ # via whop-sdk
idna==3.4
# via anyio
# via httpx
@@ -60,7 +60,7 @@ propcache==0.3.1
# via aiohttp
# via yarl
pydantic==2.11.9
- # via whopsdk
+ # via whop-sdk
pydantic-core==2.33.2
# via pydantic
python-dateutil==2.9.0.post0
@@ -69,9 +69,9 @@ six==1.17.0
# via python-dateutil
sniffio==1.3.0
# via anyio
- # via whopsdk
+ # via whop-sdk
standardwebhooks==1.0.0
- # via whopsdk
+ # via whop-sdk
types-deprecated==1.2.15.20250304
# via standardwebhooks
types-python-dateutil==2.9.0.20251008
@@ -82,7 +82,7 @@ typing-extensions==4.12.2
# via pydantic
# via pydantic-core
# via typing-inspection
- # via whopsdk
+ # via whop-sdk
typing-inspection==0.4.1
# via pydantic
wrapt==1.17.3
diff --git a/src/whopsdk/resources/webhooks.py b/src/whopsdk/resources/webhooks.py
index 5232f84c..2753ec22 100644
--- a/src/whopsdk/resources/webhooks.py
+++ b/src/whopsdk/resources/webhooks.py
@@ -18,7 +18,7 @@ def unwrap(self, payload: str, *, headers: Mapping[str, str], key: str | bytes |
try:
from standardwebhooks import Webhook
except ImportError as exc:
- raise WhopError("You need to install `whopsdk[webhooks]` to use this method") from exc
+ raise WhopError("You need to install `whop-sdk[webhooks]` to use this method") from exc
if key is None:
key = self._client.webhook_key
@@ -46,7 +46,7 @@ def unwrap(self, payload: str, *, headers: Mapping[str, str], key: str | bytes |
try:
from standardwebhooks import Webhook
except ImportError as exc:
- raise WhopError("You need to install `whopsdk[webhooks]` to use this method") from exc
+ raise WhopError("You need to install `whop-sdk[webhooks]` to use this method") from exc
if key is None:
key = self._client.webhook_key
From 8bd5020184f7188182bd6bbefed5b57612576c0d Mon Sep 17 00:00:00 2001
From: "stainless-app[bot]"
<142633134+stainless-app[bot]@users.noreply.github.com>
Date: Thu, 16 Oct 2025 15:35:28 +0000
Subject: [PATCH 04/17] feat(api): manual updates
---
.stats.yml | 2 +-
CONTRIBUTING.md | 2 +-
README.md | 48 ++---
api.md | 196 +++++++++---------
pyproject.toml | 10 +-
release-please-config.json | 2 +-
scripts/lint | 2 +-
src/{whopsdk => whop_sdk}/__init__.py | 4 +-
src/{whopsdk => whop_sdk}/_base_client.py | 2 +-
src/{whopsdk => whop_sdk}/_client.py | 0
src/{whopsdk => whop_sdk}/_compat.py | 0
src/{whopsdk => whop_sdk}/_constants.py | 0
src/{whopsdk => whop_sdk}/_exceptions.py | 0
src/{whopsdk => whop_sdk}/_files.py | 0
src/{whopsdk => whop_sdk}/_models.py | 0
src/{whopsdk => whop_sdk}/_qs.py | 0
src/{whopsdk => whop_sdk}/_resource.py | 0
src/{whopsdk => whop_sdk}/_response.py | 8 +-
src/{whopsdk => whop_sdk}/_streaming.py | 0
src/{whopsdk => whop_sdk}/_types.py | 2 +-
src/{whopsdk => whop_sdk}/_utils/__init__.py | 0
src/{whopsdk => whop_sdk}/_utils/_compat.py | 0
.../_utils/_datetime_parse.py | 0
src/{whopsdk => whop_sdk}/_utils/_logs.py | 4 +-
src/{whopsdk => whop_sdk}/_utils/_proxy.py | 0
.../_utils/_reflection.py | 0
.../_utils/_resources_proxy.py | 8 +-
src/{whopsdk => whop_sdk}/_utils/_streams.py | 0
src/{whopsdk => whop_sdk}/_utils/_sync.py | 0
.../_utils/_transform.py | 0
src/{whopsdk => whop_sdk}/_utils/_typing.py | 0
src/{whopsdk => whop_sdk}/_utils/_utils.py | 0
src/{whopsdk => whop_sdk}/_version.py | 2 +-
src/whop_sdk/lib/.keep | 4 +
src/{whopsdk => whop_sdk}/pagination.py | 0
src/{whopsdk => whop_sdk}/py.typed | 0
.../resources/__init__.py | 0
.../resources/app_builds.py | 0
src/{whopsdk => whop_sdk}/resources/apps.py | 0
.../resources/authorized_users.py | 0
.../resources/chat_channels.py | 0
.../resources/checkout_configurations.py | 0
.../resources/companies.py | 0
.../resources/course_lesson_interactions.py | 0
.../resources/entries.py | 0
.../resources/experiences.py | 0
.../resources/forum_posts.py | 0
.../resources/invoices.py | 0
.../resources/ledger_accounts.py | 0
.../resources/memberships.py | 0
.../resources/messages.py | 0
.../resources/payments.py | 0
src/{whopsdk => whop_sdk}/resources/plans.py | 0
.../resources/products.py | 0
.../resources/reactions.py | 0
.../resources/shipments.py | 0
.../resources/support_channels.py | 0
.../resources/transfers.py | 0
src/{whopsdk => whop_sdk}/resources/users.py | 0
.../resources/webhooks.py | 0
src/{whopsdk => whop_sdk}/types/__init__.py | 0
.../types/app_build_create_params.py | 0
.../types/app_build_list_params.py | 0
.../types/app_build_list_response.py | 0
.../types/app_create_params.py | 0
.../types/app_list_params.py | 0
.../types/app_list_response.py | 0
.../types/app_update_params.py | 0
.../types/authorized_user_list_params.py | 0
.../types/authorized_user_list_response.py | 0
.../authorized_user_retrieve_response.py | 0
.../types/chat_channel_list_params.py | 0
.../types/chat_channel_list_response.py | 0
.../types/chat_channel_update_params.py | 0
.../checkout_configuration_create_params.py | 0
.../checkout_configuration_list_params.py | 0
.../checkout_configuration_list_response.py | 0
.../course_lesson_interaction_list_params.py | 0
.../types/entry_approve_response.py | 0
.../types/entry_list_params.py | 0
.../types/entry_list_response.py | 0
.../types/experience_attach_params.py | 0
.../types/experience_create_params.py | 0
.../types/experience_delete_response.py | 0
.../types/experience_detach_params.py | 0
.../types/experience_list_params.py | 0
.../types/experience_list_response.py | 0
.../types/experience_update_params.py | 0
.../types/forum_post_create_params.py | 0
.../types/forum_post_list_params.py | 0
.../types/forum_post_list_response.py | 0
.../types/invoice_create_params.py | 0
.../types/invoice_create_response.py | 0
.../types/invoice_created_webhook_event.py | 0
.../types/invoice_list_params.py | 0
.../types/invoice_paid_webhook_event.py | 0
.../types/invoice_past_due_webhook_event.py | 0
.../types/invoice_void_response.py | 0
.../types/invoice_voided_webhook_event.py | 0
.../types/ledger_account_retrieve_response.py | 0
.../types/membership_cancel_params.py | 0
.../types/membership_list_params.py | 0
.../types/membership_list_response.py | 0
.../types/membership_pause_params.py | 0
.../types/membership_update_params.py | 0
.../types/message_create_params.py | 0
.../types/message_list_params.py | 0
.../types/message_list_response.py | 0
.../types/payment_list_params.py | 0
.../types/payment_list_response.py | 0
.../types/payment_refund_params.py | 0
.../types/plan_create_params.py | 0
.../types/plan_delete_response.py | 0
.../types/plan_list_params.py | 0
.../types/plan_list_response.py | 0
.../types/plan_update_params.py | 0
.../types/product_create_params.py | 0
.../types/product_delete_response.py | 0
.../types/product_list_params.py | 0
.../types/product_update_params.py | 0
.../types/reaction_create_params.py | 0
.../types/reaction_list_params.py | 0
.../types/reaction_list_response.py | 0
.../types/shared/__init__.py | 0
.../types/shared/access_pass_type.py | 0
src/{whopsdk => whop_sdk}/types/shared/app.py | 0
.../types/shared/app_build.py | 0
.../types/shared/app_build_platforms.py | 0
.../types/shared/app_build_statuses.py | 0
.../types/shared/app_statuses.py | 0
.../types/shared/app_view_type.py | 0
.../types/shared/authorized_user_roles.py | 0
.../types/shared/business_types.py | 0
.../types/shared/chat_channel.py | 0
.../types/shared/checkout_configuration.py | 0
.../types/shared/collection_method.py | 0
.../types/shared/company.py | 0
.../types/shared/course_lesson_interaction.py | 0
.../course_lesson_interaction_list_item.py | 0
.../types/shared/currency.py | 0
.../types/shared/custom_cta.py | 0
.../types/shared/direction.py | 0
.../types/shared/dms_post_types.py | 0
.../types/shared/entry.py | 0
.../types/shared/entry_status.py | 0
.../types/shared/experience.py | 0
.../types/shared/forum_post.py | 0
.../types/shared/friendly_receipt_status.py | 0
.../types/shared/global_affiliate_status.py | 0
.../types/shared/industry_types.py | 0
.../types/shared/invoice.py | 0
.../types/shared/invoice_list_item.py | 0
.../types/shared/invoice_status.py | 0
.../types/shared/membership.py | 0
.../types/shared/membership_status.py | 0
.../types/shared/message.py | 0
.../types/shared/page_info.py | 0
.../types/shared/payment.py | 0
.../types/shared/plan.py | 0
.../types/shared/plan_type.py | 0
.../types/shared/product.py | 0
.../types/shared/product_list_item.py | 0
.../types/shared/promo_type.py | 0
.../types/shared/reaction.py | 0
.../types/shared/receipt_status.py | 0
.../types/shared/release_method.py | 0
.../types/shared/shipment.py | 0
.../types/shared/shipment_carrier.py | 0
.../types/shared/shipment_status.py | 0
.../types/shared/shipment_substatus.py | 0
.../types/shared/support_channel.py | 0
.../types/shared/tax_type.py | 0
.../types/shared/transfer.py | 0
.../types/shared/visibility.py | 0
.../types/shared/visibility_filter.py | 0
.../types/shared/who_can_post.py | 0
.../types/shared/who_can_react.py | 0
.../types/shared_params/__init__.py | 0
.../types/shared_params/access_pass_type.py | 0
.../shared_params/app_build_platforms.py | 0
.../types/shared_params/app_build_statuses.py | 0
.../types/shared_params/app_statuses.py | 0
.../types/shared_params/app_view_type.py | 0
.../shared_params/authorized_user_roles.py | 0
.../types/shared_params/business_types.py | 0
.../types/shared_params/collection_method.py | 0
.../types/shared_params/currency.py | 0
.../types/shared_params/custom_cta.py | 0
.../types/shared_params/direction.py | 0
.../types/shared_params/entry_status.py | 0
.../shared_params/friendly_receipt_status.py | 0
.../shared_params/global_affiliate_status.py | 0
.../types/shared_params/industry_types.py | 0
.../types/shared_params/invoice_status.py | 0
.../types/shared_params/membership_status.py | 0
.../types/shared_params/plan_type.py | 0
.../types/shared_params/receipt_status.py | 0
.../types/shared_params/release_method.py | 0
.../types/shared_params/tax_type.py | 0
.../types/shared_params/visibility.py | 0
.../types/shared_params/visibility_filter.py | 0
.../types/shared_params/who_can_post.py | 0
.../types/shared_params/who_can_react.py | 0
.../types/shipment_create_params.py | 0
.../types/shipment_list_params.py | 0
.../types/shipment_list_response.py | 0
.../types/support_channel_create_params.py | 0
.../types/support_channel_list_params.py | 0
.../types/support_channel_list_response.py | 0
.../types/transfer_create_params.py | 0
.../types/transfer_list_params.py | 0
.../types/transfer_list_response.py | 0
.../types/unwrap_webhook_event.py | 0
.../types/user_check_access_response.py | 0
.../types/user_retrieve_response.py | 0
tests/api_resources/test_app_builds.py | 8 +-
tests/api_resources/test_apps.py | 8 +-
tests/api_resources/test_authorized_users.py | 6 +-
tests/api_resources/test_chat_channels.py | 8 +-
.../test_checkout_configurations.py | 8 +-
tests/api_resources/test_companies.py | 4 +-
.../test_course_lesson_interactions.py | 6 +-
tests/api_resources/test_entries.py | 8 +-
tests/api_resources/test_experiences.py | 8 +-
tests/api_resources/test_forum_posts.py | 8 +-
tests/api_resources/test_invoices.py | 13 +-
tests/api_resources/test_ledger_accounts.py | 4 +-
tests/api_resources/test_memberships.py | 10 +-
tests/api_resources/test_messages.py | 8 +-
tests/api_resources/test_payments.py | 10 +-
tests/api_resources/test_plans.py | 8 +-
tests/api_resources/test_products.py | 8 +-
tests/api_resources/test_reactions.py | 8 +-
tests/api_resources/test_shipments.py | 8 +-
tests/api_resources/test_support_channels.py | 10 +-
tests/api_resources/test_transfers.py | 8 +-
tests/api_resources/test_users.py | 4 +-
tests/api_resources/test_webhooks.py | 2 +-
tests/conftest.py | 6 +-
tests/test_client.py | 36 ++--
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 | 14 +-
tests/test_streaming.py | 4 +-
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 +-
253 files changed, 289 insertions(+), 280 deletions(-)
rename src/{whopsdk => whop_sdk}/__init__.py (95%)
rename src/{whopsdk => whop_sdk}/_base_client.py (99%)
rename src/{whopsdk => whop_sdk}/_client.py (100%)
rename src/{whopsdk => whop_sdk}/_compat.py (100%)
rename src/{whopsdk => whop_sdk}/_constants.py (100%)
rename src/{whopsdk => whop_sdk}/_exceptions.py (100%)
rename src/{whopsdk => whop_sdk}/_files.py (100%)
rename src/{whopsdk => whop_sdk}/_models.py (100%)
rename src/{whopsdk => whop_sdk}/_qs.py (100%)
rename src/{whopsdk => whop_sdk}/_resource.py (100%)
rename src/{whopsdk => whop_sdk}/_response.py (99%)
rename src/{whopsdk => whop_sdk}/_streaming.py (100%)
rename src/{whopsdk => whop_sdk}/_types.py (99%)
rename src/{whopsdk => whop_sdk}/_utils/__init__.py (100%)
rename src/{whopsdk => whop_sdk}/_utils/_compat.py (100%)
rename src/{whopsdk => whop_sdk}/_utils/_datetime_parse.py (100%)
rename src/{whopsdk => whop_sdk}/_utils/_logs.py (76%)
rename src/{whopsdk => whop_sdk}/_utils/_proxy.py (100%)
rename src/{whopsdk => whop_sdk}/_utils/_reflection.py (100%)
rename src/{whopsdk => whop_sdk}/_utils/_resources_proxy.py (52%)
rename src/{whopsdk => whop_sdk}/_utils/_streams.py (100%)
rename src/{whopsdk => whop_sdk}/_utils/_sync.py (100%)
rename src/{whopsdk => whop_sdk}/_utils/_transform.py (100%)
rename src/{whopsdk => whop_sdk}/_utils/_typing.py (100%)
rename src/{whopsdk => whop_sdk}/_utils/_utils.py (100%)
rename src/{whopsdk => whop_sdk}/_version.py (85%)
create mode 100644 src/whop_sdk/lib/.keep
rename src/{whopsdk => whop_sdk}/pagination.py (100%)
rename src/{whopsdk => whop_sdk}/py.typed (100%)
rename src/{whopsdk => whop_sdk}/resources/__init__.py (100%)
rename src/{whopsdk => whop_sdk}/resources/app_builds.py (100%)
rename src/{whopsdk => whop_sdk}/resources/apps.py (100%)
rename src/{whopsdk => whop_sdk}/resources/authorized_users.py (100%)
rename src/{whopsdk => whop_sdk}/resources/chat_channels.py (100%)
rename src/{whopsdk => whop_sdk}/resources/checkout_configurations.py (100%)
rename src/{whopsdk => whop_sdk}/resources/companies.py (100%)
rename src/{whopsdk => whop_sdk}/resources/course_lesson_interactions.py (100%)
rename src/{whopsdk => whop_sdk}/resources/entries.py (100%)
rename src/{whopsdk => whop_sdk}/resources/experiences.py (100%)
rename src/{whopsdk => whop_sdk}/resources/forum_posts.py (100%)
rename src/{whopsdk => whop_sdk}/resources/invoices.py (100%)
rename src/{whopsdk => whop_sdk}/resources/ledger_accounts.py (100%)
rename src/{whopsdk => whop_sdk}/resources/memberships.py (100%)
rename src/{whopsdk => whop_sdk}/resources/messages.py (100%)
rename src/{whopsdk => whop_sdk}/resources/payments.py (100%)
rename src/{whopsdk => whop_sdk}/resources/plans.py (100%)
rename src/{whopsdk => whop_sdk}/resources/products.py (100%)
rename src/{whopsdk => whop_sdk}/resources/reactions.py (100%)
rename src/{whopsdk => whop_sdk}/resources/shipments.py (100%)
rename src/{whopsdk => whop_sdk}/resources/support_channels.py (100%)
rename src/{whopsdk => whop_sdk}/resources/transfers.py (100%)
rename src/{whopsdk => whop_sdk}/resources/users.py (100%)
rename src/{whopsdk => whop_sdk}/resources/webhooks.py (100%)
rename src/{whopsdk => whop_sdk}/types/__init__.py (100%)
rename src/{whopsdk => whop_sdk}/types/app_build_create_params.py (100%)
rename src/{whopsdk => whop_sdk}/types/app_build_list_params.py (100%)
rename src/{whopsdk => whop_sdk}/types/app_build_list_response.py (100%)
rename src/{whopsdk => whop_sdk}/types/app_create_params.py (100%)
rename src/{whopsdk => whop_sdk}/types/app_list_params.py (100%)
rename src/{whopsdk => whop_sdk}/types/app_list_response.py (100%)
rename src/{whopsdk => whop_sdk}/types/app_update_params.py (100%)
rename src/{whopsdk => whop_sdk}/types/authorized_user_list_params.py (100%)
rename src/{whopsdk => whop_sdk}/types/authorized_user_list_response.py (100%)
rename src/{whopsdk => whop_sdk}/types/authorized_user_retrieve_response.py (100%)
rename src/{whopsdk => whop_sdk}/types/chat_channel_list_params.py (100%)
rename src/{whopsdk => whop_sdk}/types/chat_channel_list_response.py (100%)
rename src/{whopsdk => whop_sdk}/types/chat_channel_update_params.py (100%)
rename src/{whopsdk => whop_sdk}/types/checkout_configuration_create_params.py (100%)
rename src/{whopsdk => whop_sdk}/types/checkout_configuration_list_params.py (100%)
rename src/{whopsdk => whop_sdk}/types/checkout_configuration_list_response.py (100%)
rename src/{whopsdk => whop_sdk}/types/course_lesson_interaction_list_params.py (100%)
rename src/{whopsdk => whop_sdk}/types/entry_approve_response.py (100%)
rename src/{whopsdk => whop_sdk}/types/entry_list_params.py (100%)
rename src/{whopsdk => whop_sdk}/types/entry_list_response.py (100%)
rename src/{whopsdk => whop_sdk}/types/experience_attach_params.py (100%)
rename src/{whopsdk => whop_sdk}/types/experience_create_params.py (100%)
rename src/{whopsdk => whop_sdk}/types/experience_delete_response.py (100%)
rename src/{whopsdk => whop_sdk}/types/experience_detach_params.py (100%)
rename src/{whopsdk => whop_sdk}/types/experience_list_params.py (100%)
rename src/{whopsdk => whop_sdk}/types/experience_list_response.py (100%)
rename src/{whopsdk => whop_sdk}/types/experience_update_params.py (100%)
rename src/{whopsdk => whop_sdk}/types/forum_post_create_params.py (100%)
rename src/{whopsdk => whop_sdk}/types/forum_post_list_params.py (100%)
rename src/{whopsdk => whop_sdk}/types/forum_post_list_response.py (100%)
rename src/{whopsdk => whop_sdk}/types/invoice_create_params.py (100%)
rename src/{whopsdk => whop_sdk}/types/invoice_create_response.py (100%)
rename src/{whopsdk => whop_sdk}/types/invoice_created_webhook_event.py (100%)
rename src/{whopsdk => whop_sdk}/types/invoice_list_params.py (100%)
rename src/{whopsdk => whop_sdk}/types/invoice_paid_webhook_event.py (100%)
rename src/{whopsdk => whop_sdk}/types/invoice_past_due_webhook_event.py (100%)
rename src/{whopsdk => whop_sdk}/types/invoice_void_response.py (100%)
rename src/{whopsdk => whop_sdk}/types/invoice_voided_webhook_event.py (100%)
rename src/{whopsdk => whop_sdk}/types/ledger_account_retrieve_response.py (100%)
rename src/{whopsdk => whop_sdk}/types/membership_cancel_params.py (100%)
rename src/{whopsdk => whop_sdk}/types/membership_list_params.py (100%)
rename src/{whopsdk => whop_sdk}/types/membership_list_response.py (100%)
rename src/{whopsdk => whop_sdk}/types/membership_pause_params.py (100%)
rename src/{whopsdk => whop_sdk}/types/membership_update_params.py (100%)
rename src/{whopsdk => whop_sdk}/types/message_create_params.py (100%)
rename src/{whopsdk => whop_sdk}/types/message_list_params.py (100%)
rename src/{whopsdk => whop_sdk}/types/message_list_response.py (100%)
rename src/{whopsdk => whop_sdk}/types/payment_list_params.py (100%)
rename src/{whopsdk => whop_sdk}/types/payment_list_response.py (100%)
rename src/{whopsdk => whop_sdk}/types/payment_refund_params.py (100%)
rename src/{whopsdk => whop_sdk}/types/plan_create_params.py (100%)
rename src/{whopsdk => whop_sdk}/types/plan_delete_response.py (100%)
rename src/{whopsdk => whop_sdk}/types/plan_list_params.py (100%)
rename src/{whopsdk => whop_sdk}/types/plan_list_response.py (100%)
rename src/{whopsdk => whop_sdk}/types/plan_update_params.py (100%)
rename src/{whopsdk => whop_sdk}/types/product_create_params.py (100%)
rename src/{whopsdk => whop_sdk}/types/product_delete_response.py (100%)
rename src/{whopsdk => whop_sdk}/types/product_list_params.py (100%)
rename src/{whopsdk => whop_sdk}/types/product_update_params.py (100%)
rename src/{whopsdk => whop_sdk}/types/reaction_create_params.py (100%)
rename src/{whopsdk => whop_sdk}/types/reaction_list_params.py (100%)
rename src/{whopsdk => whop_sdk}/types/reaction_list_response.py (100%)
rename src/{whopsdk => whop_sdk}/types/shared/__init__.py (100%)
rename src/{whopsdk => whop_sdk}/types/shared/access_pass_type.py (100%)
rename src/{whopsdk => whop_sdk}/types/shared/app.py (100%)
rename src/{whopsdk => whop_sdk}/types/shared/app_build.py (100%)
rename src/{whopsdk => whop_sdk}/types/shared/app_build_platforms.py (100%)
rename src/{whopsdk => whop_sdk}/types/shared/app_build_statuses.py (100%)
rename src/{whopsdk => whop_sdk}/types/shared/app_statuses.py (100%)
rename src/{whopsdk => whop_sdk}/types/shared/app_view_type.py (100%)
rename src/{whopsdk => whop_sdk}/types/shared/authorized_user_roles.py (100%)
rename src/{whopsdk => whop_sdk}/types/shared/business_types.py (100%)
rename src/{whopsdk => whop_sdk}/types/shared/chat_channel.py (100%)
rename src/{whopsdk => whop_sdk}/types/shared/checkout_configuration.py (100%)
rename src/{whopsdk => whop_sdk}/types/shared/collection_method.py (100%)
rename src/{whopsdk => whop_sdk}/types/shared/company.py (100%)
rename src/{whopsdk => whop_sdk}/types/shared/course_lesson_interaction.py (100%)
rename src/{whopsdk => whop_sdk}/types/shared/course_lesson_interaction_list_item.py (100%)
rename src/{whopsdk => whop_sdk}/types/shared/currency.py (100%)
rename src/{whopsdk => whop_sdk}/types/shared/custom_cta.py (100%)
rename src/{whopsdk => whop_sdk}/types/shared/direction.py (100%)
rename src/{whopsdk => whop_sdk}/types/shared/dms_post_types.py (100%)
rename src/{whopsdk => whop_sdk}/types/shared/entry.py (100%)
rename src/{whopsdk => whop_sdk}/types/shared/entry_status.py (100%)
rename src/{whopsdk => whop_sdk}/types/shared/experience.py (100%)
rename src/{whopsdk => whop_sdk}/types/shared/forum_post.py (100%)
rename src/{whopsdk => whop_sdk}/types/shared/friendly_receipt_status.py (100%)
rename src/{whopsdk => whop_sdk}/types/shared/global_affiliate_status.py (100%)
rename src/{whopsdk => whop_sdk}/types/shared/industry_types.py (100%)
rename src/{whopsdk => whop_sdk}/types/shared/invoice.py (100%)
rename src/{whopsdk => whop_sdk}/types/shared/invoice_list_item.py (100%)
rename src/{whopsdk => whop_sdk}/types/shared/invoice_status.py (100%)
rename src/{whopsdk => whop_sdk}/types/shared/membership.py (100%)
rename src/{whopsdk => whop_sdk}/types/shared/membership_status.py (100%)
rename src/{whopsdk => whop_sdk}/types/shared/message.py (100%)
rename src/{whopsdk => whop_sdk}/types/shared/page_info.py (100%)
rename src/{whopsdk => whop_sdk}/types/shared/payment.py (100%)
rename src/{whopsdk => whop_sdk}/types/shared/plan.py (100%)
rename src/{whopsdk => whop_sdk}/types/shared/plan_type.py (100%)
rename src/{whopsdk => whop_sdk}/types/shared/product.py (100%)
rename src/{whopsdk => whop_sdk}/types/shared/product_list_item.py (100%)
rename src/{whopsdk => whop_sdk}/types/shared/promo_type.py (100%)
rename src/{whopsdk => whop_sdk}/types/shared/reaction.py (100%)
rename src/{whopsdk => whop_sdk}/types/shared/receipt_status.py (100%)
rename src/{whopsdk => whop_sdk}/types/shared/release_method.py (100%)
rename src/{whopsdk => whop_sdk}/types/shared/shipment.py (100%)
rename src/{whopsdk => whop_sdk}/types/shared/shipment_carrier.py (100%)
rename src/{whopsdk => whop_sdk}/types/shared/shipment_status.py (100%)
rename src/{whopsdk => whop_sdk}/types/shared/shipment_substatus.py (100%)
rename src/{whopsdk => whop_sdk}/types/shared/support_channel.py (100%)
rename src/{whopsdk => whop_sdk}/types/shared/tax_type.py (100%)
rename src/{whopsdk => whop_sdk}/types/shared/transfer.py (100%)
rename src/{whopsdk => whop_sdk}/types/shared/visibility.py (100%)
rename src/{whopsdk => whop_sdk}/types/shared/visibility_filter.py (100%)
rename src/{whopsdk => whop_sdk}/types/shared/who_can_post.py (100%)
rename src/{whopsdk => whop_sdk}/types/shared/who_can_react.py (100%)
rename src/{whopsdk => whop_sdk}/types/shared_params/__init__.py (100%)
rename src/{whopsdk => whop_sdk}/types/shared_params/access_pass_type.py (100%)
rename src/{whopsdk => whop_sdk}/types/shared_params/app_build_platforms.py (100%)
rename src/{whopsdk => whop_sdk}/types/shared_params/app_build_statuses.py (100%)
rename src/{whopsdk => whop_sdk}/types/shared_params/app_statuses.py (100%)
rename src/{whopsdk => whop_sdk}/types/shared_params/app_view_type.py (100%)
rename src/{whopsdk => whop_sdk}/types/shared_params/authorized_user_roles.py (100%)
rename src/{whopsdk => whop_sdk}/types/shared_params/business_types.py (100%)
rename src/{whopsdk => whop_sdk}/types/shared_params/collection_method.py (100%)
rename src/{whopsdk => whop_sdk}/types/shared_params/currency.py (100%)
rename src/{whopsdk => whop_sdk}/types/shared_params/custom_cta.py (100%)
rename src/{whopsdk => whop_sdk}/types/shared_params/direction.py (100%)
rename src/{whopsdk => whop_sdk}/types/shared_params/entry_status.py (100%)
rename src/{whopsdk => whop_sdk}/types/shared_params/friendly_receipt_status.py (100%)
rename src/{whopsdk => whop_sdk}/types/shared_params/global_affiliate_status.py (100%)
rename src/{whopsdk => whop_sdk}/types/shared_params/industry_types.py (100%)
rename src/{whopsdk => whop_sdk}/types/shared_params/invoice_status.py (100%)
rename src/{whopsdk => whop_sdk}/types/shared_params/membership_status.py (100%)
rename src/{whopsdk => whop_sdk}/types/shared_params/plan_type.py (100%)
rename src/{whopsdk => whop_sdk}/types/shared_params/receipt_status.py (100%)
rename src/{whopsdk => whop_sdk}/types/shared_params/release_method.py (100%)
rename src/{whopsdk => whop_sdk}/types/shared_params/tax_type.py (100%)
rename src/{whopsdk => whop_sdk}/types/shared_params/visibility.py (100%)
rename src/{whopsdk => whop_sdk}/types/shared_params/visibility_filter.py (100%)
rename src/{whopsdk => whop_sdk}/types/shared_params/who_can_post.py (100%)
rename src/{whopsdk => whop_sdk}/types/shared_params/who_can_react.py (100%)
rename src/{whopsdk => whop_sdk}/types/shipment_create_params.py (100%)
rename src/{whopsdk => whop_sdk}/types/shipment_list_params.py (100%)
rename src/{whopsdk => whop_sdk}/types/shipment_list_response.py (100%)
rename src/{whopsdk => whop_sdk}/types/support_channel_create_params.py (100%)
rename src/{whopsdk => whop_sdk}/types/support_channel_list_params.py (100%)
rename src/{whopsdk => whop_sdk}/types/support_channel_list_response.py (100%)
rename src/{whopsdk => whop_sdk}/types/transfer_create_params.py (100%)
rename src/{whopsdk => whop_sdk}/types/transfer_list_params.py (100%)
rename src/{whopsdk => whop_sdk}/types/transfer_list_response.py (100%)
rename src/{whopsdk => whop_sdk}/types/unwrap_webhook_event.py (100%)
rename src/{whopsdk => whop_sdk}/types/user_check_access_response.py (100%)
rename src/{whopsdk => whop_sdk}/types/user_retrieve_response.py (100%)
diff --git a/.stats.yml b/.stats.yml
index 08430ca9..f528b1c0 100644
--- a/.stats.yml
+++ b/.stats.yml
@@ -1,4 +1,4 @@
configured_endpoints: 76
openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/frostedinc%2Fwhopsdk-493b08fc2ae996eaf1758fa74f56163b2e40d4e1abeaa9672b8d1a039df30d75.yml
openapi_spec_hash: 212470480a88cabb38a58b5b6867c733
-config_hash: 9628427c59e4953508565376fc44ab35
+config_hash: d8da61cbd45bbc6c4ada7c0663afce12
diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md
index 435024a3..76fde4c1 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/whopsdk/lib/` and `examples/` directories.
+modify the contents of the `src/whop_sdk/lib/` and `examples/` directories.
## Adding and running examples
diff --git a/README.md b/README.md
index aae5084c..d1dc47e3 100644
--- a/README.md
+++ b/README.md
@@ -26,7 +26,7 @@ The full API of this library can be found in [api.md](api.md).
```python
import os
-from whopsdk import Whop
+from whop_sdk import Whop
client = Whop(
app_id="app_xxxxxxxxxxxxxx",
@@ -51,7 +51,7 @@ Simply import `AsyncWhop` instead of `Whop` and use `await` with each API call:
```python
import os
import asyncio
-from whopsdk import AsyncWhop
+from whop_sdk import AsyncWhop
client = AsyncWhop(
app_id="app_xxxxxxxxxxxxxx",
@@ -86,8 +86,8 @@ Then you can enable it by instantiating the client with `http_client=DefaultAioH
```python
import asyncio
-from whopsdk import DefaultAioHttpClient
-from whopsdk import AsyncWhop
+from whop_sdk import DefaultAioHttpClient
+from whop_sdk import AsyncWhop
async def main() -> None:
@@ -121,7 +121,7 @@ List methods in the Whop API are paginated.
This library provides auto-paginating iterators with each list response, so you do not have to request successive pages manually:
```python
-from whopsdk import Whop
+from whop_sdk import Whop
client = Whop(
app_id="app_xxxxxxxxxxxxxx",
@@ -141,7 +141,7 @@ Or, asynchronously:
```python
import asyncio
-from whopsdk import AsyncWhop
+from whop_sdk import AsyncWhop
client = AsyncWhop(
app_id="app_xxxxxxxxxxxxxx",
@@ -194,7 +194,7 @@ for payment in first_page.data:
Nested parameters are dictionaries, typed using `TypedDict`, for example:
```python
-from whopsdk import Whop
+from whop_sdk import Whop
client = Whop(
app_id="app_xxxxxxxxxxxxxx",
@@ -209,16 +209,16 @@ print(app.icon)
## 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 `whopsdk.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 `whop_sdk.APIConnectionError` is raised.
When the API returns a non-success status code (that is, 4xx or 5xx
-response), a subclass of `whopsdk.APIStatusError` is raised, containing `status_code` and `response` properties.
+response), a subclass of `whop_sdk.APIStatusError` is raised, containing `status_code` and `response` properties.
-All errors inherit from `whopsdk.APIError`.
+All errors inherit from `whop_sdk.APIError`.
```python
-import whopsdk
-from whopsdk import Whop
+import whop_sdk
+from whop_sdk import Whop
client = Whop(
app_id="app_xxxxxxxxxxxxxx",
@@ -228,12 +228,12 @@ try:
client.payments.list(
company_id="biz_xxxxxxxxxxxxxx",
)
-except whopsdk.APIConnectionError as e:
+except whop_sdk.APIConnectionError as e:
print("The server could not be reached")
print(e.__cause__) # an underlying Exception, likely raised within httpx.
-except whopsdk.RateLimitError as e:
+except whop_sdk.RateLimitError as e:
print("A 429 status code was received; we should back off a bit.")
-except whopsdk.APIStatusError as e:
+except whop_sdk.APIStatusError as e:
print("Another non-200-range status code was received")
print(e.status_code)
print(e.response)
@@ -261,7 +261,7 @@ 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 whopsdk import Whop
+from whop_sdk import Whop
# Configure the default for all requests:
client = Whop(
@@ -282,7 +282,7 @@ 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 whopsdk import Whop
+from whop_sdk import Whop
# Configure the default for all requests:
client = Whop(
@@ -338,7 +338,7 @@ 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 whopsdk import Whop
+from whop_sdk import Whop
client = Whop(
app_id="app_xxxxxxxxxxxxxx",
@@ -352,9 +352,9 @@ payment = response.parse() # get the object that `payments.list()` would have r
print(payment.id)
```
-These methods return an [`APIResponse`](https://github.com/whopio/whopsdk-python/tree/main/src/whopsdk/_response.py) object.
+These methods return an [`APIResponse`](https://github.com/whopio/whopsdk-python/tree/main/src/whop_sdk/_response.py) object.
-The async client returns an [`AsyncAPIResponse`](https://github.com/whopio/whopsdk-python/tree/main/src/whopsdk/_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/whopio/whopsdk-python/tree/main/src/whop_sdk/_response.py) with the same structure, the only difference being `await`able methods for reading the response content.
#### `.with_streaming_response`
@@ -418,7 +418,7 @@ You can directly override the [httpx client](https://www.python-httpx.org/api/#c
```python
import httpx
-from whopsdk import Whop, DefaultHttpxClient
+from whop_sdk import Whop, DefaultHttpxClient
client = Whop(
app_id="app_xxxxxxxxxxxxxx",
@@ -442,7 +442,7 @@ 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 whopsdk import Whop
+from whop_sdk import Whop
with Whop(
app_id="app_xxxxxxxxxxxxxx",
@@ -472,8 +472,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 whopsdk
-print(whopsdk.__version__)
+import whop_sdk
+print(whop_sdk.__version__)
```
## Requirements
diff --git a/api.md b/api.md
index 63d30f4b..11565652 100644
--- a/api.md
+++ b/api.md
@@ -1,7 +1,7 @@
# Shared Types
```python
-from whopsdk.types import (
+from whop_sdk.types import (
AccessPassType,
App,
AppBuild,
@@ -63,66 +63,66 @@ from whopsdk.types import (
Types:
```python
-from whopsdk.types import AppListResponse
+from whop_sdk.types import AppListResponse
```
Methods:
-- client.apps.create(\*\*params) -> App
-- client.apps.retrieve(id) -> App
-- client.apps.update(id, \*\*params) -> App
-- client.apps.list(\*\*params) -> SyncCursorPage[AppListResponse]
+- client.apps.create(\*\*params) -> App
+- client.apps.retrieve(id) -> App
+- client.apps.update(id, \*\*params) -> App
+- client.apps.list(\*\*params) -> SyncCursorPage[AppListResponse]
# Invoices
Types:
```python
-from whopsdk.types import InvoiceCreateResponse, InvoiceVoidResponse
+from whop_sdk.types import InvoiceCreateResponse, InvoiceVoidResponse
```
Methods:
-- client.invoices.create(\*\*params) -> InvoiceCreateResponse
-- client.invoices.retrieve(id) -> Invoice
-- client.invoices.list(\*\*params) -> SyncCursorPage[InvoiceListItem]
-- client.invoices.void(id) -> InvoiceVoidResponse
+- client.invoices.create(\*\*params) -> InvoiceCreateResponse
+- client.invoices.retrieve(id) -> Invoice
+- client.invoices.list(\*\*params) -> SyncCursorPage[InvoiceListItem]
+- client.invoices.void(id) -> InvoiceVoidResponse
# CourseLessonInteractions
Methods:
-- client.course_lesson_interactions.retrieve(id) -> CourseLessonInteraction
-- client.course_lesson_interactions.list(\*\*params) -> SyncCursorPage[CourseLessonInteractionListItem]
+- client.course_lesson_interactions.retrieve(id) -> CourseLessonInteraction
+- client.course_lesson_interactions.list(\*\*params) -> SyncCursorPage[CourseLessonInteractionListItem]
# Products
Types:
```python
-from whopsdk.types import ProductDeleteResponse
+from whop_sdk.types import ProductDeleteResponse
```
Methods:
-- client.products.create(\*\*params) -> Product
-- client.products.retrieve(id) -> Product
-- client.products.update(id, \*\*params) -> Product
-- client.products.list(\*\*params) -> SyncCursorPage[ProductListItem]
-- client.products.delete(id) -> ProductDeleteResponse
+- client.products.create(\*\*params) -> Product
+- client.products.retrieve(id) -> Product
+- client.products.update(id, \*\*params) -> Product
+- client.products.list(\*\*params) -> SyncCursorPage[ProductListItem]
+- client.products.delete(id) -> ProductDeleteResponse
# Companies
Methods:
-- client.companies.retrieve(id) -> Company
+- client.companies.retrieve(id) -> Company
# Webhooks
Types:
```python
-from whopsdk.types import (
+from whop_sdk.types import (
InvoiceCreatedWebhookEvent,
InvoicePaidWebhookEvent,
InvoicePastDueWebhookEvent,
@@ -136,244 +136,244 @@ from whopsdk.types import (
Types:
```python
-from whopsdk.types import PlanListResponse, PlanDeleteResponse
+from whop_sdk.types import PlanListResponse, PlanDeleteResponse
```
Methods:
-- client.plans.create(\*\*params) -> Plan
-- client.plans.retrieve(id) -> Plan
-- client.plans.update(id, \*\*params) -> Plan
-- client.plans.list(\*\*params) -> SyncCursorPage[PlanListResponse]
-- client.plans.delete(id) -> PlanDeleteResponse
+- client.plans.create(\*\*params) -> Plan
+- client.plans.retrieve(id) -> Plan
+- client.plans.update(id, \*\*params) -> Plan
+- client.plans.list(\*\*params) -> SyncCursorPage[PlanListResponse]
+- client.plans.delete(id) -> PlanDeleteResponse
# Entries
Types:
```python
-from whopsdk.types import EntryListResponse, EntryApproveResponse
+from whop_sdk.types import EntryListResponse, EntryApproveResponse
```
Methods:
-- client.entries.retrieve(id) -> Entry
-- client.entries.list(\*\*params) -> SyncCursorPage[EntryListResponse]
-- client.entries.approve(id) -> EntryApproveResponse
-- client.entries.deny(id) -> Entry
+- client.entries.retrieve(id) -> Entry
+- client.entries.list(\*\*params) -> SyncCursorPage[EntryListResponse]
+- client.entries.approve(id) -> EntryApproveResponse
+- client.entries.deny(id) -> Entry
# ForumPosts
Types:
```python
-from whopsdk.types import ForumPostListResponse
+from whop_sdk.types import ForumPostListResponse
```
Methods:
-- client.forum_posts.create(\*\*params) -> ForumPost
-- client.forum_posts.retrieve(id) -> ForumPost
-- client.forum_posts.list(\*\*params) -> SyncCursorPage[ForumPostListResponse]
+- client.forum_posts.create(\*\*params) -> ForumPost
+- client.forum_posts.retrieve(id) -> ForumPost
+- client.forum_posts.list(\*\*params) -> SyncCursorPage[ForumPostListResponse]
# Transfers
Types:
```python
-from whopsdk.types import TransferListResponse
+from whop_sdk.types import TransferListResponse
```
Methods:
-- client.transfers.create(\*\*params) -> Transfer
-- client.transfers.retrieve(id) -> Transfer
-- client.transfers.list(\*\*params) -> SyncCursorPage[TransferListResponse]
+- client.transfers.create(\*\*params) -> Transfer
+- client.transfers.retrieve(id) -> Transfer
+- client.transfers.list(\*\*params) -> SyncCursorPage[TransferListResponse]
# LedgerAccounts
Types:
```python
-from whopsdk.types import LedgerAccountRetrieveResponse
+from whop_sdk.types import LedgerAccountRetrieveResponse
```
Methods:
-- client.ledger_accounts.retrieve(id) -> LedgerAccountRetrieveResponse
+- client.ledger_accounts.retrieve(id) -> LedgerAccountRetrieveResponse
# Memberships
Types:
```python
-from whopsdk.types import MembershipListResponse
+from whop_sdk.types import MembershipListResponse
```
Methods:
-- client.memberships.retrieve(id) -> Membership
-- client.memberships.update(id, \*\*params) -> Membership
-- client.memberships.list(\*\*params) -> SyncCursorPage[MembershipListResponse]
-- client.memberships.cancel(id, \*\*params) -> Membership
-- client.memberships.pause(id, \*\*params) -> Membership
-- client.memberships.resume(id) -> Membership
+- client.memberships.retrieve(id) -> Membership
+- client.memberships.update(id, \*\*params) -> Membership
+- client.memberships.list(\*\*params) -> SyncCursorPage[MembershipListResponse]
+- client.memberships.cancel(id, \*\*params) -> Membership
+- client.memberships.pause(id, \*\*params) -> Membership
+- client.memberships.resume(id) -> Membership
# AuthorizedUsers
Types:
```python
-from whopsdk.types import AuthorizedUserRetrieveResponse, AuthorizedUserListResponse
+from whop_sdk.types import AuthorizedUserRetrieveResponse, AuthorizedUserListResponse
```
Methods:
-- client.authorized_users.retrieve(id) -> AuthorizedUserRetrieveResponse
-- client.authorized_users.list(\*\*params) -> SyncCursorPage[AuthorizedUserListResponse]
+- client.authorized_users.retrieve(id) -> AuthorizedUserRetrieveResponse
+- client.authorized_users.list(\*\*params) -> SyncCursorPage[AuthorizedUserListResponse]
# AppBuilds
Types:
```python
-from whopsdk.types import AppBuildListResponse
+from whop_sdk.types import AppBuildListResponse
```
Methods:
-- client.app_builds.create(\*\*params) -> AppBuild
-- client.app_builds.retrieve(id) -> AppBuild
-- client.app_builds.list(\*\*params) -> SyncCursorPage[AppBuildListResponse]
-- client.app_builds.promote(id) -> AppBuild
+- client.app_builds.create(\*\*params) -> AppBuild
+- client.app_builds.retrieve(id) -> AppBuild
+- client.app_builds.list(\*\*params) -> SyncCursorPage[AppBuildListResponse]
+- client.app_builds.promote(id) -> AppBuild
# Shipments
Types:
```python
-from whopsdk.types import ShipmentListResponse
+from whop_sdk.types import ShipmentListResponse
```
Methods:
-- client.shipments.create(\*\*params) -> Shipment
-- client.shipments.retrieve(id) -> Shipment
-- client.shipments.list(\*\*params) -> SyncCursorPage[ShipmentListResponse]
+- client.shipments.create(\*\*params) -> Shipment
+- client.shipments.retrieve(id) -> Shipment
+- client.shipments.list(\*\*params) -> SyncCursorPage[ShipmentListResponse]
# CheckoutConfigurations
Types:
```python
-from whopsdk.types import CheckoutConfigurationListResponse
+from whop_sdk.types import CheckoutConfigurationListResponse
```
Methods:
-- client.checkout_configurations.create(\*\*params) -> CheckoutConfiguration
-- client.checkout_configurations.retrieve(id) -> CheckoutConfiguration
-- client.checkout_configurations.list(\*\*params) -> SyncCursorPage[CheckoutConfigurationListResponse]
+- client.checkout_configurations.create(\*\*params) -> CheckoutConfiguration
+- client.checkout_configurations.retrieve(id) -> CheckoutConfiguration
+- client.checkout_configurations.list(\*\*params) -> SyncCursorPage[CheckoutConfigurationListResponse]
# Messages
Types:
```python
-from whopsdk.types import MessageListResponse
+from whop_sdk.types import MessageListResponse
```
Methods:
-- client.messages.create(\*\*params) -> Message
-- client.messages.retrieve(id) -> Message
-- client.messages.list(\*\*params) -> SyncCursorPage[MessageListResponse]
+- client.messages.create(\*\*params) -> Message
+- client.messages.retrieve(id) -> Message
+- client.messages.list(\*\*params) -> SyncCursorPage[MessageListResponse]
# ChatChannels
Types:
```python
-from whopsdk.types import ChatChannelListResponse
+from whop_sdk.types import ChatChannelListResponse
```
Methods:
-- client.chat_channels.retrieve(id) -> ChatChannel
-- client.chat_channels.update(id, \*\*params) -> ChatChannel
-- client.chat_channels.list(\*\*params) -> SyncCursorPage[ChatChannelListResponse]
+- client.chat_channels.retrieve(id) -> ChatChannel
+- client.chat_channels.update(id, \*\*params) -> ChatChannel
+- client.chat_channels.list(\*\*params) -> SyncCursorPage[ChatChannelListResponse]
# Users
Types:
```python
-from whopsdk.types import UserRetrieveResponse, UserCheckAccessResponse
+from whop_sdk.types import UserRetrieveResponse, UserCheckAccessResponse
```
Methods:
-- client.users.retrieve(id) -> UserRetrieveResponse
-- client.users.check_access(resource_id, \*, id) -> UserCheckAccessResponse
+- client.users.retrieve(id) -> UserRetrieveResponse
+- client.users.check_access(resource_id, \*, id) -> UserCheckAccessResponse
# Payments
Types:
```python
-from whopsdk.types import PaymentListResponse
+from whop_sdk.types import PaymentListResponse
```
Methods:
-- client.payments.retrieve(id) -> Payment
-- client.payments.list(\*\*params) -> SyncCursorPage[PaymentListResponse]
-- client.payments.refund(id, \*\*params) -> Payment
-- client.payments.retry(id) -> Payment
-- client.payments.void(id) -> Payment
+- client.payments.retrieve(id) -> Payment
+- client.payments.list(\*\*params) -> SyncCursorPage[PaymentListResponse]
+- client.payments.refund(id, \*\*params) -> Payment
+- client.payments.retry(id) -> Payment
+- client.payments.void(id) -> Payment
# SupportChannels
Types:
```python
-from whopsdk.types import SupportChannelListResponse
+from whop_sdk.types import SupportChannelListResponse
```
Methods:
-- client.support_channels.create(\*\*params) -> SupportChannel
-- client.support_channels.retrieve(id) -> SupportChannel
-- client.support_channels.list(\*\*params) -> SyncCursorPage[SupportChannelListResponse]
+- client.support_channels.create(\*\*params) -> SupportChannel
+- client.support_channels.retrieve(id) -> SupportChannel
+- client.support_channels.list(\*\*params) -> SyncCursorPage[SupportChannelListResponse]
# Experiences
Types:
```python
-from whopsdk.types import ExperienceListResponse, ExperienceDeleteResponse
+from whop_sdk.types import ExperienceListResponse, ExperienceDeleteResponse
```
Methods:
-- client.experiences.create(\*\*params) -> Experience
-- client.experiences.retrieve(id) -> Experience
-- client.experiences.update(id, \*\*params) -> Experience
-- client.experiences.list(\*\*params) -> SyncCursorPage[ExperienceListResponse]
-- client.experiences.delete(id) -> ExperienceDeleteResponse
-- client.experiences.attach(id, \*\*params) -> Experience
-- client.experiences.detach(id, \*\*params) -> Experience
+- client.experiences.create(\*\*params) -> Experience
+- client.experiences.retrieve(id) -> Experience
+- client.experiences.update(id, \*\*params) -> Experience
+- client.experiences.list(\*\*params) -> SyncCursorPage[ExperienceListResponse]
+- client.experiences.delete(id) -> ExperienceDeleteResponse
+- client.experiences.attach(id, \*\*params) -> Experience
+- client.experiences.detach(id, \*\*params) -> Experience
# Reactions
Types:
```python
-from whopsdk.types import ReactionListResponse
+from whop_sdk.types import ReactionListResponse
```
Methods:
-- client.reactions.create(\*\*params) -> Reaction
-- client.reactions.retrieve(id) -> Reaction
-- client.reactions.list(\*\*params) -> SyncCursorPage[ReactionListResponse]
+- client.reactions.create(\*\*params) -> Reaction
+- client.reactions.retrieve(id) -> Reaction
+- client.reactions.list(\*\*params) -> SyncCursorPage[ReactionListResponse]
diff --git a/pyproject.toml b/pyproject.toml
index 1eed9d04..bc987eb1 100644
--- a/pyproject.toml
+++ b/pyproject.toml
@@ -79,14 +79,14 @@ format = { chain = [
"check:ruff" = "ruff check ."
"fix:ruff" = "ruff check --fix ."
-"check:importable" = "python -c 'import whopsdk'"
+"check:importable" = "python -c 'import whop_sdk'"
typecheck = { chain = [
"typecheck:pyright",
"typecheck:mypy"
]}
"typecheck:pyright" = "pyright"
-"typecheck:verify-types" = "pyright --verifytypes whopsdk --ignoreexternal"
+"typecheck:verify-types" = "pyright --verifytypes whop_sdk --ignoreexternal"
"typecheck:mypy" = "mypy ."
[build-system]
@@ -99,7 +99,7 @@ include = [
]
[tool.hatch.build.targets.wheel]
-packages = ["src/whopsdk"]
+packages = ["src/whop_sdk"]
[tool.hatch.build.targets.sdist]
# Basically everything except hidden files/directories (such as .github, .devcontainers, .python-version, etc)
@@ -167,7 +167,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/whopsdk/_files.py', '_dev/.*.py', 'tests/.*']
+exclude = ['src/whop_sdk/_files.py', '_dev/.*.py', 'tests/.*']
strict_equality = true
implicit_reexport = true
@@ -259,7 +259,7 @@ length-sort = true
length-sort-straight = true
combine-as-imports = true
extra-standard-library = ["typing_extensions"]
-known-first-party = ["whopsdk", "tests"]
+known-first-party = ["whop_sdk", "tests"]
[tool.ruff.lint.per-file-ignores]
"bin/**.py" = ["T201", "T203"]
diff --git a/release-please-config.json b/release-please-config.json
index 694109b6..48f67aed 100644
--- a/release-please-config.json
+++ b/release-please-config.json
@@ -61,6 +61,6 @@
],
"release-type": "python",
"extra-files": [
- "src/whopsdk/_version.py"
+ "src/whop_sdk/_version.py"
]
}
\ No newline at end of file
diff --git a/scripts/lint b/scripts/lint
index 83ac279b..8aa7eb94 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 whopsdk'
+rye run python -c 'import whop_sdk'
diff --git a/src/whopsdk/__init__.py b/src/whop_sdk/__init__.py
similarity index 95%
rename from src/whopsdk/__init__.py
rename to src/whop_sdk/__init__.py
index 983caeeb..20f3270e 100644
--- a/src/whopsdk/__init__.py
+++ b/src/whop_sdk/__init__.py
@@ -83,12 +83,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.
-# whopsdk._exceptions.NotFoundError -> whopsdk.NotFoundError
+# whop_sdk._exceptions.NotFoundError -> whop_sdk.NotFoundError
__locals = locals()
for __name in __all__:
if not __name.startswith("__"):
try:
- __locals[__name].__module__ = "whopsdk"
+ __locals[__name].__module__ = "whop_sdk"
except (TypeError, AttributeError):
# Some of our exported symbols are builtins which we can't set attributes for.
pass
diff --git a/src/whopsdk/_base_client.py b/src/whop_sdk/_base_client.py
similarity index 99%
rename from src/whopsdk/_base_client.py
rename to src/whop_sdk/_base_client.py
index 69e782a6..cb03fc5a 100644
--- a/src/whopsdk/_base_client.py
+++ b/src/whop_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 `whopsdk.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 `whop_sdk.DEFAULT_MAX_RETRIES`"
)
def _enforce_trailing_slash(self, url: URL) -> URL:
diff --git a/src/whopsdk/_client.py b/src/whop_sdk/_client.py
similarity index 100%
rename from src/whopsdk/_client.py
rename to src/whop_sdk/_client.py
diff --git a/src/whopsdk/_compat.py b/src/whop_sdk/_compat.py
similarity index 100%
rename from src/whopsdk/_compat.py
rename to src/whop_sdk/_compat.py
diff --git a/src/whopsdk/_constants.py b/src/whop_sdk/_constants.py
similarity index 100%
rename from src/whopsdk/_constants.py
rename to src/whop_sdk/_constants.py
diff --git a/src/whopsdk/_exceptions.py b/src/whop_sdk/_exceptions.py
similarity index 100%
rename from src/whopsdk/_exceptions.py
rename to src/whop_sdk/_exceptions.py
diff --git a/src/whopsdk/_files.py b/src/whop_sdk/_files.py
similarity index 100%
rename from src/whopsdk/_files.py
rename to src/whop_sdk/_files.py
diff --git a/src/whopsdk/_models.py b/src/whop_sdk/_models.py
similarity index 100%
rename from src/whopsdk/_models.py
rename to src/whop_sdk/_models.py
diff --git a/src/whopsdk/_qs.py b/src/whop_sdk/_qs.py
similarity index 100%
rename from src/whopsdk/_qs.py
rename to src/whop_sdk/_qs.py
diff --git a/src/whopsdk/_resource.py b/src/whop_sdk/_resource.py
similarity index 100%
rename from src/whopsdk/_resource.py
rename to src/whop_sdk/_resource.py
diff --git a/src/whopsdk/_response.py b/src/whop_sdk/_response.py
similarity index 99%
rename from src/whopsdk/_response.py
rename to src/whop_sdk/_response.py
index fe094a09..ea6a5009 100644
--- a/src/whopsdk/_response.py
+++ b/src/whop_sdk/_response.py
@@ -217,7 +217,7 @@ def _parse(self, *, to: type[_T] | None = None) -> R | _T:
and not issubclass(origin, BaseModel)
and issubclass(origin, pydantic.BaseModel)
):
- raise TypeError("Pydantic models must subclass our base model type, e.g. `from whopsdk import BaseModel`")
+ raise TypeError("Pydantic models must subclass our base model type, e.g. `from whop_sdk import BaseModel`")
if (
cast_to is not object
@@ -283,7 +283,7 @@ def parse(self, *, to: type[_T] | None = None) -> R | _T:
the `to` argument, e.g.
```py
- from whopsdk import BaseModel
+ from whop_sdk import BaseModel
class MyModel(BaseModel):
@@ -385,7 +385,7 @@ async def parse(self, *, to: type[_T] | None = None) -> R | _T:
the `to` argument, e.g.
```py
- from whopsdk import BaseModel
+ from whop_sdk import BaseModel
class MyModel(BaseModel):
@@ -556,7 +556,7 @@ 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 `whopsdk._streaming` for reference",
+ "The `stream` argument was set to `True` but the `stream_cls` argument was not given. See `whop_sdk._streaming` for reference",
)
diff --git a/src/whopsdk/_streaming.py b/src/whop_sdk/_streaming.py
similarity index 100%
rename from src/whopsdk/_streaming.py
rename to src/whop_sdk/_streaming.py
diff --git a/src/whopsdk/_types.py b/src/whop_sdk/_types.py
similarity index 99%
rename from src/whopsdk/_types.py
rename to src/whop_sdk/_types.py
index f4efa996..bff722fc 100644
--- a/src/whopsdk/_types.py
+++ b/src/whop_sdk/_types.py
@@ -92,7 +92,7 @@
# This unfortunately means that you will either have
# to import this type and pass it explicitly:
#
-# from whopsdk import NoneType
+# from whop_sdk import NoneType
# client.get('/foo', cast_to=NoneType)
#
# or build it yourself:
diff --git a/src/whopsdk/_utils/__init__.py b/src/whop_sdk/_utils/__init__.py
similarity index 100%
rename from src/whopsdk/_utils/__init__.py
rename to src/whop_sdk/_utils/__init__.py
diff --git a/src/whopsdk/_utils/_compat.py b/src/whop_sdk/_utils/_compat.py
similarity index 100%
rename from src/whopsdk/_utils/_compat.py
rename to src/whop_sdk/_utils/_compat.py
diff --git a/src/whopsdk/_utils/_datetime_parse.py b/src/whop_sdk/_utils/_datetime_parse.py
similarity index 100%
rename from src/whopsdk/_utils/_datetime_parse.py
rename to src/whop_sdk/_utils/_datetime_parse.py
diff --git a/src/whopsdk/_utils/_logs.py b/src/whop_sdk/_utils/_logs.py
similarity index 76%
rename from src/whopsdk/_utils/_logs.py
rename to src/whop_sdk/_utils/_logs.py
index f66e4efc..f82eedca 100644
--- a/src/whopsdk/_utils/_logs.py
+++ b/src/whop_sdk/_utils/_logs.py
@@ -1,12 +1,12 @@
import os
import logging
-logger: logging.Logger = logging.getLogger("whopsdk")
+logger: logging.Logger = logging.getLogger("whop_sdk")
httpx_logger: logging.Logger = logging.getLogger("httpx")
def _basic_config() -> None:
- # e.g. [2023-10-05 14:12:26 - whopsdk._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 - whop_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",
diff --git a/src/whopsdk/_utils/_proxy.py b/src/whop_sdk/_utils/_proxy.py
similarity index 100%
rename from src/whopsdk/_utils/_proxy.py
rename to src/whop_sdk/_utils/_proxy.py
diff --git a/src/whopsdk/_utils/_reflection.py b/src/whop_sdk/_utils/_reflection.py
similarity index 100%
rename from src/whopsdk/_utils/_reflection.py
rename to src/whop_sdk/_utils/_reflection.py
diff --git a/src/whopsdk/_utils/_resources_proxy.py b/src/whop_sdk/_utils/_resources_proxy.py
similarity index 52%
rename from src/whopsdk/_utils/_resources_proxy.py
rename to src/whop_sdk/_utils/_resources_proxy.py
index 85fa6320..c921f32c 100644
--- a/src/whopsdk/_utils/_resources_proxy.py
+++ b/src/whop_sdk/_utils/_resources_proxy.py
@@ -7,17 +7,17 @@
class ResourcesProxy(LazyProxy[Any]):
- """A proxy for the `whopsdk.resources` module.
+ """A proxy for the `whop_sdk.resources` module.
- This is used so that we can lazily import `whopsdk.resources` only when
- needed *and* so that users can just import `whopsdk` and reference `whopsdk.resources`
+ This is used so that we can lazily import `whop_sdk.resources` only when
+ needed *and* so that users can just import `whop_sdk` and reference `whop_sdk.resources`
"""
@override
def __load__(self) -> Any:
import importlib
- mod = importlib.import_module("whopsdk.resources")
+ mod = importlib.import_module("whop_sdk.resources")
return mod
diff --git a/src/whopsdk/_utils/_streams.py b/src/whop_sdk/_utils/_streams.py
similarity index 100%
rename from src/whopsdk/_utils/_streams.py
rename to src/whop_sdk/_utils/_streams.py
diff --git a/src/whopsdk/_utils/_sync.py b/src/whop_sdk/_utils/_sync.py
similarity index 100%
rename from src/whopsdk/_utils/_sync.py
rename to src/whop_sdk/_utils/_sync.py
diff --git a/src/whopsdk/_utils/_transform.py b/src/whop_sdk/_utils/_transform.py
similarity index 100%
rename from src/whopsdk/_utils/_transform.py
rename to src/whop_sdk/_utils/_transform.py
diff --git a/src/whopsdk/_utils/_typing.py b/src/whop_sdk/_utils/_typing.py
similarity index 100%
rename from src/whopsdk/_utils/_typing.py
rename to src/whop_sdk/_utils/_typing.py
diff --git a/src/whopsdk/_utils/_utils.py b/src/whop_sdk/_utils/_utils.py
similarity index 100%
rename from src/whopsdk/_utils/_utils.py
rename to src/whop_sdk/_utils/_utils.py
diff --git a/src/whopsdk/_version.py b/src/whop_sdk/_version.py
similarity index 85%
rename from src/whopsdk/_version.py
rename to src/whop_sdk/_version.py
index 5a479d33..35444f45 100644
--- a/src/whopsdk/_version.py
+++ b/src/whop_sdk/_version.py
@@ -1,4 +1,4 @@
# File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.
-__title__ = "whopsdk"
+__title__ = "whop_sdk"
__version__ = "0.0.1" # x-release-please-version
diff --git a/src/whop_sdk/lib/.keep b/src/whop_sdk/lib/.keep
new file mode 100644
index 00000000..5e2c99fd
--- /dev/null
+++ b/src/whop_sdk/lib/.keep
@@ -0,0 +1,4 @@
+File generated from our OpenAPI spec by Stainless.
+
+This directory can be used to store custom files to expand the SDK.
+It is ignored by Stainless code generation and its content (other than this keep file) won't be touched.
\ No newline at end of file
diff --git a/src/whopsdk/pagination.py b/src/whop_sdk/pagination.py
similarity index 100%
rename from src/whopsdk/pagination.py
rename to src/whop_sdk/pagination.py
diff --git a/src/whopsdk/py.typed b/src/whop_sdk/py.typed
similarity index 100%
rename from src/whopsdk/py.typed
rename to src/whop_sdk/py.typed
diff --git a/src/whopsdk/resources/__init__.py b/src/whop_sdk/resources/__init__.py
similarity index 100%
rename from src/whopsdk/resources/__init__.py
rename to src/whop_sdk/resources/__init__.py
diff --git a/src/whopsdk/resources/app_builds.py b/src/whop_sdk/resources/app_builds.py
similarity index 100%
rename from src/whopsdk/resources/app_builds.py
rename to src/whop_sdk/resources/app_builds.py
diff --git a/src/whopsdk/resources/apps.py b/src/whop_sdk/resources/apps.py
similarity index 100%
rename from src/whopsdk/resources/apps.py
rename to src/whop_sdk/resources/apps.py
diff --git a/src/whopsdk/resources/authorized_users.py b/src/whop_sdk/resources/authorized_users.py
similarity index 100%
rename from src/whopsdk/resources/authorized_users.py
rename to src/whop_sdk/resources/authorized_users.py
diff --git a/src/whopsdk/resources/chat_channels.py b/src/whop_sdk/resources/chat_channels.py
similarity index 100%
rename from src/whopsdk/resources/chat_channels.py
rename to src/whop_sdk/resources/chat_channels.py
diff --git a/src/whopsdk/resources/checkout_configurations.py b/src/whop_sdk/resources/checkout_configurations.py
similarity index 100%
rename from src/whopsdk/resources/checkout_configurations.py
rename to src/whop_sdk/resources/checkout_configurations.py
diff --git a/src/whopsdk/resources/companies.py b/src/whop_sdk/resources/companies.py
similarity index 100%
rename from src/whopsdk/resources/companies.py
rename to src/whop_sdk/resources/companies.py
diff --git a/src/whopsdk/resources/course_lesson_interactions.py b/src/whop_sdk/resources/course_lesson_interactions.py
similarity index 100%
rename from src/whopsdk/resources/course_lesson_interactions.py
rename to src/whop_sdk/resources/course_lesson_interactions.py
diff --git a/src/whopsdk/resources/entries.py b/src/whop_sdk/resources/entries.py
similarity index 100%
rename from src/whopsdk/resources/entries.py
rename to src/whop_sdk/resources/entries.py
diff --git a/src/whopsdk/resources/experiences.py b/src/whop_sdk/resources/experiences.py
similarity index 100%
rename from src/whopsdk/resources/experiences.py
rename to src/whop_sdk/resources/experiences.py
diff --git a/src/whopsdk/resources/forum_posts.py b/src/whop_sdk/resources/forum_posts.py
similarity index 100%
rename from src/whopsdk/resources/forum_posts.py
rename to src/whop_sdk/resources/forum_posts.py
diff --git a/src/whopsdk/resources/invoices.py b/src/whop_sdk/resources/invoices.py
similarity index 100%
rename from src/whopsdk/resources/invoices.py
rename to src/whop_sdk/resources/invoices.py
diff --git a/src/whopsdk/resources/ledger_accounts.py b/src/whop_sdk/resources/ledger_accounts.py
similarity index 100%
rename from src/whopsdk/resources/ledger_accounts.py
rename to src/whop_sdk/resources/ledger_accounts.py
diff --git a/src/whopsdk/resources/memberships.py b/src/whop_sdk/resources/memberships.py
similarity index 100%
rename from src/whopsdk/resources/memberships.py
rename to src/whop_sdk/resources/memberships.py
diff --git a/src/whopsdk/resources/messages.py b/src/whop_sdk/resources/messages.py
similarity index 100%
rename from src/whopsdk/resources/messages.py
rename to src/whop_sdk/resources/messages.py
diff --git a/src/whopsdk/resources/payments.py b/src/whop_sdk/resources/payments.py
similarity index 100%
rename from src/whopsdk/resources/payments.py
rename to src/whop_sdk/resources/payments.py
diff --git a/src/whopsdk/resources/plans.py b/src/whop_sdk/resources/plans.py
similarity index 100%
rename from src/whopsdk/resources/plans.py
rename to src/whop_sdk/resources/plans.py
diff --git a/src/whopsdk/resources/products.py b/src/whop_sdk/resources/products.py
similarity index 100%
rename from src/whopsdk/resources/products.py
rename to src/whop_sdk/resources/products.py
diff --git a/src/whopsdk/resources/reactions.py b/src/whop_sdk/resources/reactions.py
similarity index 100%
rename from src/whopsdk/resources/reactions.py
rename to src/whop_sdk/resources/reactions.py
diff --git a/src/whopsdk/resources/shipments.py b/src/whop_sdk/resources/shipments.py
similarity index 100%
rename from src/whopsdk/resources/shipments.py
rename to src/whop_sdk/resources/shipments.py
diff --git a/src/whopsdk/resources/support_channels.py b/src/whop_sdk/resources/support_channels.py
similarity index 100%
rename from src/whopsdk/resources/support_channels.py
rename to src/whop_sdk/resources/support_channels.py
diff --git a/src/whopsdk/resources/transfers.py b/src/whop_sdk/resources/transfers.py
similarity index 100%
rename from src/whopsdk/resources/transfers.py
rename to src/whop_sdk/resources/transfers.py
diff --git a/src/whopsdk/resources/users.py b/src/whop_sdk/resources/users.py
similarity index 100%
rename from src/whopsdk/resources/users.py
rename to src/whop_sdk/resources/users.py
diff --git a/src/whopsdk/resources/webhooks.py b/src/whop_sdk/resources/webhooks.py
similarity index 100%
rename from src/whopsdk/resources/webhooks.py
rename to src/whop_sdk/resources/webhooks.py
diff --git a/src/whopsdk/types/__init__.py b/src/whop_sdk/types/__init__.py
similarity index 100%
rename from src/whopsdk/types/__init__.py
rename to src/whop_sdk/types/__init__.py
diff --git a/src/whopsdk/types/app_build_create_params.py b/src/whop_sdk/types/app_build_create_params.py
similarity index 100%
rename from src/whopsdk/types/app_build_create_params.py
rename to src/whop_sdk/types/app_build_create_params.py
diff --git a/src/whopsdk/types/app_build_list_params.py b/src/whop_sdk/types/app_build_list_params.py
similarity index 100%
rename from src/whopsdk/types/app_build_list_params.py
rename to src/whop_sdk/types/app_build_list_params.py
diff --git a/src/whopsdk/types/app_build_list_response.py b/src/whop_sdk/types/app_build_list_response.py
similarity index 100%
rename from src/whopsdk/types/app_build_list_response.py
rename to src/whop_sdk/types/app_build_list_response.py
diff --git a/src/whopsdk/types/app_create_params.py b/src/whop_sdk/types/app_create_params.py
similarity index 100%
rename from src/whopsdk/types/app_create_params.py
rename to src/whop_sdk/types/app_create_params.py
diff --git a/src/whopsdk/types/app_list_params.py b/src/whop_sdk/types/app_list_params.py
similarity index 100%
rename from src/whopsdk/types/app_list_params.py
rename to src/whop_sdk/types/app_list_params.py
diff --git a/src/whopsdk/types/app_list_response.py b/src/whop_sdk/types/app_list_response.py
similarity index 100%
rename from src/whopsdk/types/app_list_response.py
rename to src/whop_sdk/types/app_list_response.py
diff --git a/src/whopsdk/types/app_update_params.py b/src/whop_sdk/types/app_update_params.py
similarity index 100%
rename from src/whopsdk/types/app_update_params.py
rename to src/whop_sdk/types/app_update_params.py
diff --git a/src/whopsdk/types/authorized_user_list_params.py b/src/whop_sdk/types/authorized_user_list_params.py
similarity index 100%
rename from src/whopsdk/types/authorized_user_list_params.py
rename to src/whop_sdk/types/authorized_user_list_params.py
diff --git a/src/whopsdk/types/authorized_user_list_response.py b/src/whop_sdk/types/authorized_user_list_response.py
similarity index 100%
rename from src/whopsdk/types/authorized_user_list_response.py
rename to src/whop_sdk/types/authorized_user_list_response.py
diff --git a/src/whopsdk/types/authorized_user_retrieve_response.py b/src/whop_sdk/types/authorized_user_retrieve_response.py
similarity index 100%
rename from src/whopsdk/types/authorized_user_retrieve_response.py
rename to src/whop_sdk/types/authorized_user_retrieve_response.py
diff --git a/src/whopsdk/types/chat_channel_list_params.py b/src/whop_sdk/types/chat_channel_list_params.py
similarity index 100%
rename from src/whopsdk/types/chat_channel_list_params.py
rename to src/whop_sdk/types/chat_channel_list_params.py
diff --git a/src/whopsdk/types/chat_channel_list_response.py b/src/whop_sdk/types/chat_channel_list_response.py
similarity index 100%
rename from src/whopsdk/types/chat_channel_list_response.py
rename to src/whop_sdk/types/chat_channel_list_response.py
diff --git a/src/whopsdk/types/chat_channel_update_params.py b/src/whop_sdk/types/chat_channel_update_params.py
similarity index 100%
rename from src/whopsdk/types/chat_channel_update_params.py
rename to src/whop_sdk/types/chat_channel_update_params.py
diff --git a/src/whopsdk/types/checkout_configuration_create_params.py b/src/whop_sdk/types/checkout_configuration_create_params.py
similarity index 100%
rename from src/whopsdk/types/checkout_configuration_create_params.py
rename to src/whop_sdk/types/checkout_configuration_create_params.py
diff --git a/src/whopsdk/types/checkout_configuration_list_params.py b/src/whop_sdk/types/checkout_configuration_list_params.py
similarity index 100%
rename from src/whopsdk/types/checkout_configuration_list_params.py
rename to src/whop_sdk/types/checkout_configuration_list_params.py
diff --git a/src/whopsdk/types/checkout_configuration_list_response.py b/src/whop_sdk/types/checkout_configuration_list_response.py
similarity index 100%
rename from src/whopsdk/types/checkout_configuration_list_response.py
rename to src/whop_sdk/types/checkout_configuration_list_response.py
diff --git a/src/whopsdk/types/course_lesson_interaction_list_params.py b/src/whop_sdk/types/course_lesson_interaction_list_params.py
similarity index 100%
rename from src/whopsdk/types/course_lesson_interaction_list_params.py
rename to src/whop_sdk/types/course_lesson_interaction_list_params.py
diff --git a/src/whopsdk/types/entry_approve_response.py b/src/whop_sdk/types/entry_approve_response.py
similarity index 100%
rename from src/whopsdk/types/entry_approve_response.py
rename to src/whop_sdk/types/entry_approve_response.py
diff --git a/src/whopsdk/types/entry_list_params.py b/src/whop_sdk/types/entry_list_params.py
similarity index 100%
rename from src/whopsdk/types/entry_list_params.py
rename to src/whop_sdk/types/entry_list_params.py
diff --git a/src/whopsdk/types/entry_list_response.py b/src/whop_sdk/types/entry_list_response.py
similarity index 100%
rename from src/whopsdk/types/entry_list_response.py
rename to src/whop_sdk/types/entry_list_response.py
diff --git a/src/whopsdk/types/experience_attach_params.py b/src/whop_sdk/types/experience_attach_params.py
similarity index 100%
rename from src/whopsdk/types/experience_attach_params.py
rename to src/whop_sdk/types/experience_attach_params.py
diff --git a/src/whopsdk/types/experience_create_params.py b/src/whop_sdk/types/experience_create_params.py
similarity index 100%
rename from src/whopsdk/types/experience_create_params.py
rename to src/whop_sdk/types/experience_create_params.py
diff --git a/src/whopsdk/types/experience_delete_response.py b/src/whop_sdk/types/experience_delete_response.py
similarity index 100%
rename from src/whopsdk/types/experience_delete_response.py
rename to src/whop_sdk/types/experience_delete_response.py
diff --git a/src/whopsdk/types/experience_detach_params.py b/src/whop_sdk/types/experience_detach_params.py
similarity index 100%
rename from src/whopsdk/types/experience_detach_params.py
rename to src/whop_sdk/types/experience_detach_params.py
diff --git a/src/whopsdk/types/experience_list_params.py b/src/whop_sdk/types/experience_list_params.py
similarity index 100%
rename from src/whopsdk/types/experience_list_params.py
rename to src/whop_sdk/types/experience_list_params.py
diff --git a/src/whopsdk/types/experience_list_response.py b/src/whop_sdk/types/experience_list_response.py
similarity index 100%
rename from src/whopsdk/types/experience_list_response.py
rename to src/whop_sdk/types/experience_list_response.py
diff --git a/src/whopsdk/types/experience_update_params.py b/src/whop_sdk/types/experience_update_params.py
similarity index 100%
rename from src/whopsdk/types/experience_update_params.py
rename to src/whop_sdk/types/experience_update_params.py
diff --git a/src/whopsdk/types/forum_post_create_params.py b/src/whop_sdk/types/forum_post_create_params.py
similarity index 100%
rename from src/whopsdk/types/forum_post_create_params.py
rename to src/whop_sdk/types/forum_post_create_params.py
diff --git a/src/whopsdk/types/forum_post_list_params.py b/src/whop_sdk/types/forum_post_list_params.py
similarity index 100%
rename from src/whopsdk/types/forum_post_list_params.py
rename to src/whop_sdk/types/forum_post_list_params.py
diff --git a/src/whopsdk/types/forum_post_list_response.py b/src/whop_sdk/types/forum_post_list_response.py
similarity index 100%
rename from src/whopsdk/types/forum_post_list_response.py
rename to src/whop_sdk/types/forum_post_list_response.py
diff --git a/src/whopsdk/types/invoice_create_params.py b/src/whop_sdk/types/invoice_create_params.py
similarity index 100%
rename from src/whopsdk/types/invoice_create_params.py
rename to src/whop_sdk/types/invoice_create_params.py
diff --git a/src/whopsdk/types/invoice_create_response.py b/src/whop_sdk/types/invoice_create_response.py
similarity index 100%
rename from src/whopsdk/types/invoice_create_response.py
rename to src/whop_sdk/types/invoice_create_response.py
diff --git a/src/whopsdk/types/invoice_created_webhook_event.py b/src/whop_sdk/types/invoice_created_webhook_event.py
similarity index 100%
rename from src/whopsdk/types/invoice_created_webhook_event.py
rename to src/whop_sdk/types/invoice_created_webhook_event.py
diff --git a/src/whopsdk/types/invoice_list_params.py b/src/whop_sdk/types/invoice_list_params.py
similarity index 100%
rename from src/whopsdk/types/invoice_list_params.py
rename to src/whop_sdk/types/invoice_list_params.py
diff --git a/src/whopsdk/types/invoice_paid_webhook_event.py b/src/whop_sdk/types/invoice_paid_webhook_event.py
similarity index 100%
rename from src/whopsdk/types/invoice_paid_webhook_event.py
rename to src/whop_sdk/types/invoice_paid_webhook_event.py
diff --git a/src/whopsdk/types/invoice_past_due_webhook_event.py b/src/whop_sdk/types/invoice_past_due_webhook_event.py
similarity index 100%
rename from src/whopsdk/types/invoice_past_due_webhook_event.py
rename to src/whop_sdk/types/invoice_past_due_webhook_event.py
diff --git a/src/whopsdk/types/invoice_void_response.py b/src/whop_sdk/types/invoice_void_response.py
similarity index 100%
rename from src/whopsdk/types/invoice_void_response.py
rename to src/whop_sdk/types/invoice_void_response.py
diff --git a/src/whopsdk/types/invoice_voided_webhook_event.py b/src/whop_sdk/types/invoice_voided_webhook_event.py
similarity index 100%
rename from src/whopsdk/types/invoice_voided_webhook_event.py
rename to src/whop_sdk/types/invoice_voided_webhook_event.py
diff --git a/src/whopsdk/types/ledger_account_retrieve_response.py b/src/whop_sdk/types/ledger_account_retrieve_response.py
similarity index 100%
rename from src/whopsdk/types/ledger_account_retrieve_response.py
rename to src/whop_sdk/types/ledger_account_retrieve_response.py
diff --git a/src/whopsdk/types/membership_cancel_params.py b/src/whop_sdk/types/membership_cancel_params.py
similarity index 100%
rename from src/whopsdk/types/membership_cancel_params.py
rename to src/whop_sdk/types/membership_cancel_params.py
diff --git a/src/whopsdk/types/membership_list_params.py b/src/whop_sdk/types/membership_list_params.py
similarity index 100%
rename from src/whopsdk/types/membership_list_params.py
rename to src/whop_sdk/types/membership_list_params.py
diff --git a/src/whopsdk/types/membership_list_response.py b/src/whop_sdk/types/membership_list_response.py
similarity index 100%
rename from src/whopsdk/types/membership_list_response.py
rename to src/whop_sdk/types/membership_list_response.py
diff --git a/src/whopsdk/types/membership_pause_params.py b/src/whop_sdk/types/membership_pause_params.py
similarity index 100%
rename from src/whopsdk/types/membership_pause_params.py
rename to src/whop_sdk/types/membership_pause_params.py
diff --git a/src/whopsdk/types/membership_update_params.py b/src/whop_sdk/types/membership_update_params.py
similarity index 100%
rename from src/whopsdk/types/membership_update_params.py
rename to src/whop_sdk/types/membership_update_params.py
diff --git a/src/whopsdk/types/message_create_params.py b/src/whop_sdk/types/message_create_params.py
similarity index 100%
rename from src/whopsdk/types/message_create_params.py
rename to src/whop_sdk/types/message_create_params.py
diff --git a/src/whopsdk/types/message_list_params.py b/src/whop_sdk/types/message_list_params.py
similarity index 100%
rename from src/whopsdk/types/message_list_params.py
rename to src/whop_sdk/types/message_list_params.py
diff --git a/src/whopsdk/types/message_list_response.py b/src/whop_sdk/types/message_list_response.py
similarity index 100%
rename from src/whopsdk/types/message_list_response.py
rename to src/whop_sdk/types/message_list_response.py
diff --git a/src/whopsdk/types/payment_list_params.py b/src/whop_sdk/types/payment_list_params.py
similarity index 100%
rename from src/whopsdk/types/payment_list_params.py
rename to src/whop_sdk/types/payment_list_params.py
diff --git a/src/whopsdk/types/payment_list_response.py b/src/whop_sdk/types/payment_list_response.py
similarity index 100%
rename from src/whopsdk/types/payment_list_response.py
rename to src/whop_sdk/types/payment_list_response.py
diff --git a/src/whopsdk/types/payment_refund_params.py b/src/whop_sdk/types/payment_refund_params.py
similarity index 100%
rename from src/whopsdk/types/payment_refund_params.py
rename to src/whop_sdk/types/payment_refund_params.py
diff --git a/src/whopsdk/types/plan_create_params.py b/src/whop_sdk/types/plan_create_params.py
similarity index 100%
rename from src/whopsdk/types/plan_create_params.py
rename to src/whop_sdk/types/plan_create_params.py
diff --git a/src/whopsdk/types/plan_delete_response.py b/src/whop_sdk/types/plan_delete_response.py
similarity index 100%
rename from src/whopsdk/types/plan_delete_response.py
rename to src/whop_sdk/types/plan_delete_response.py
diff --git a/src/whopsdk/types/plan_list_params.py b/src/whop_sdk/types/plan_list_params.py
similarity index 100%
rename from src/whopsdk/types/plan_list_params.py
rename to src/whop_sdk/types/plan_list_params.py
diff --git a/src/whopsdk/types/plan_list_response.py b/src/whop_sdk/types/plan_list_response.py
similarity index 100%
rename from src/whopsdk/types/plan_list_response.py
rename to src/whop_sdk/types/plan_list_response.py
diff --git a/src/whopsdk/types/plan_update_params.py b/src/whop_sdk/types/plan_update_params.py
similarity index 100%
rename from src/whopsdk/types/plan_update_params.py
rename to src/whop_sdk/types/plan_update_params.py
diff --git a/src/whopsdk/types/product_create_params.py b/src/whop_sdk/types/product_create_params.py
similarity index 100%
rename from src/whopsdk/types/product_create_params.py
rename to src/whop_sdk/types/product_create_params.py
diff --git a/src/whopsdk/types/product_delete_response.py b/src/whop_sdk/types/product_delete_response.py
similarity index 100%
rename from src/whopsdk/types/product_delete_response.py
rename to src/whop_sdk/types/product_delete_response.py
diff --git a/src/whopsdk/types/product_list_params.py b/src/whop_sdk/types/product_list_params.py
similarity index 100%
rename from src/whopsdk/types/product_list_params.py
rename to src/whop_sdk/types/product_list_params.py
diff --git a/src/whopsdk/types/product_update_params.py b/src/whop_sdk/types/product_update_params.py
similarity index 100%
rename from src/whopsdk/types/product_update_params.py
rename to src/whop_sdk/types/product_update_params.py
diff --git a/src/whopsdk/types/reaction_create_params.py b/src/whop_sdk/types/reaction_create_params.py
similarity index 100%
rename from src/whopsdk/types/reaction_create_params.py
rename to src/whop_sdk/types/reaction_create_params.py
diff --git a/src/whopsdk/types/reaction_list_params.py b/src/whop_sdk/types/reaction_list_params.py
similarity index 100%
rename from src/whopsdk/types/reaction_list_params.py
rename to src/whop_sdk/types/reaction_list_params.py
diff --git a/src/whopsdk/types/reaction_list_response.py b/src/whop_sdk/types/reaction_list_response.py
similarity index 100%
rename from src/whopsdk/types/reaction_list_response.py
rename to src/whop_sdk/types/reaction_list_response.py
diff --git a/src/whopsdk/types/shared/__init__.py b/src/whop_sdk/types/shared/__init__.py
similarity index 100%
rename from src/whopsdk/types/shared/__init__.py
rename to src/whop_sdk/types/shared/__init__.py
diff --git a/src/whopsdk/types/shared/access_pass_type.py b/src/whop_sdk/types/shared/access_pass_type.py
similarity index 100%
rename from src/whopsdk/types/shared/access_pass_type.py
rename to src/whop_sdk/types/shared/access_pass_type.py
diff --git a/src/whopsdk/types/shared/app.py b/src/whop_sdk/types/shared/app.py
similarity index 100%
rename from src/whopsdk/types/shared/app.py
rename to src/whop_sdk/types/shared/app.py
diff --git a/src/whopsdk/types/shared/app_build.py b/src/whop_sdk/types/shared/app_build.py
similarity index 100%
rename from src/whopsdk/types/shared/app_build.py
rename to src/whop_sdk/types/shared/app_build.py
diff --git a/src/whopsdk/types/shared/app_build_platforms.py b/src/whop_sdk/types/shared/app_build_platforms.py
similarity index 100%
rename from src/whopsdk/types/shared/app_build_platforms.py
rename to src/whop_sdk/types/shared/app_build_platforms.py
diff --git a/src/whopsdk/types/shared/app_build_statuses.py b/src/whop_sdk/types/shared/app_build_statuses.py
similarity index 100%
rename from src/whopsdk/types/shared/app_build_statuses.py
rename to src/whop_sdk/types/shared/app_build_statuses.py
diff --git a/src/whopsdk/types/shared/app_statuses.py b/src/whop_sdk/types/shared/app_statuses.py
similarity index 100%
rename from src/whopsdk/types/shared/app_statuses.py
rename to src/whop_sdk/types/shared/app_statuses.py
diff --git a/src/whopsdk/types/shared/app_view_type.py b/src/whop_sdk/types/shared/app_view_type.py
similarity index 100%
rename from src/whopsdk/types/shared/app_view_type.py
rename to src/whop_sdk/types/shared/app_view_type.py
diff --git a/src/whopsdk/types/shared/authorized_user_roles.py b/src/whop_sdk/types/shared/authorized_user_roles.py
similarity index 100%
rename from src/whopsdk/types/shared/authorized_user_roles.py
rename to src/whop_sdk/types/shared/authorized_user_roles.py
diff --git a/src/whopsdk/types/shared/business_types.py b/src/whop_sdk/types/shared/business_types.py
similarity index 100%
rename from src/whopsdk/types/shared/business_types.py
rename to src/whop_sdk/types/shared/business_types.py
diff --git a/src/whopsdk/types/shared/chat_channel.py b/src/whop_sdk/types/shared/chat_channel.py
similarity index 100%
rename from src/whopsdk/types/shared/chat_channel.py
rename to src/whop_sdk/types/shared/chat_channel.py
diff --git a/src/whopsdk/types/shared/checkout_configuration.py b/src/whop_sdk/types/shared/checkout_configuration.py
similarity index 100%
rename from src/whopsdk/types/shared/checkout_configuration.py
rename to src/whop_sdk/types/shared/checkout_configuration.py
diff --git a/src/whopsdk/types/shared/collection_method.py b/src/whop_sdk/types/shared/collection_method.py
similarity index 100%
rename from src/whopsdk/types/shared/collection_method.py
rename to src/whop_sdk/types/shared/collection_method.py
diff --git a/src/whopsdk/types/shared/company.py b/src/whop_sdk/types/shared/company.py
similarity index 100%
rename from src/whopsdk/types/shared/company.py
rename to src/whop_sdk/types/shared/company.py
diff --git a/src/whopsdk/types/shared/course_lesson_interaction.py b/src/whop_sdk/types/shared/course_lesson_interaction.py
similarity index 100%
rename from src/whopsdk/types/shared/course_lesson_interaction.py
rename to src/whop_sdk/types/shared/course_lesson_interaction.py
diff --git a/src/whopsdk/types/shared/course_lesson_interaction_list_item.py b/src/whop_sdk/types/shared/course_lesson_interaction_list_item.py
similarity index 100%
rename from src/whopsdk/types/shared/course_lesson_interaction_list_item.py
rename to src/whop_sdk/types/shared/course_lesson_interaction_list_item.py
diff --git a/src/whopsdk/types/shared/currency.py b/src/whop_sdk/types/shared/currency.py
similarity index 100%
rename from src/whopsdk/types/shared/currency.py
rename to src/whop_sdk/types/shared/currency.py
diff --git a/src/whopsdk/types/shared/custom_cta.py b/src/whop_sdk/types/shared/custom_cta.py
similarity index 100%
rename from src/whopsdk/types/shared/custom_cta.py
rename to src/whop_sdk/types/shared/custom_cta.py
diff --git a/src/whopsdk/types/shared/direction.py b/src/whop_sdk/types/shared/direction.py
similarity index 100%
rename from src/whopsdk/types/shared/direction.py
rename to src/whop_sdk/types/shared/direction.py
diff --git a/src/whopsdk/types/shared/dms_post_types.py b/src/whop_sdk/types/shared/dms_post_types.py
similarity index 100%
rename from src/whopsdk/types/shared/dms_post_types.py
rename to src/whop_sdk/types/shared/dms_post_types.py
diff --git a/src/whopsdk/types/shared/entry.py b/src/whop_sdk/types/shared/entry.py
similarity index 100%
rename from src/whopsdk/types/shared/entry.py
rename to src/whop_sdk/types/shared/entry.py
diff --git a/src/whopsdk/types/shared/entry_status.py b/src/whop_sdk/types/shared/entry_status.py
similarity index 100%
rename from src/whopsdk/types/shared/entry_status.py
rename to src/whop_sdk/types/shared/entry_status.py
diff --git a/src/whopsdk/types/shared/experience.py b/src/whop_sdk/types/shared/experience.py
similarity index 100%
rename from src/whopsdk/types/shared/experience.py
rename to src/whop_sdk/types/shared/experience.py
diff --git a/src/whopsdk/types/shared/forum_post.py b/src/whop_sdk/types/shared/forum_post.py
similarity index 100%
rename from src/whopsdk/types/shared/forum_post.py
rename to src/whop_sdk/types/shared/forum_post.py
diff --git a/src/whopsdk/types/shared/friendly_receipt_status.py b/src/whop_sdk/types/shared/friendly_receipt_status.py
similarity index 100%
rename from src/whopsdk/types/shared/friendly_receipt_status.py
rename to src/whop_sdk/types/shared/friendly_receipt_status.py
diff --git a/src/whopsdk/types/shared/global_affiliate_status.py b/src/whop_sdk/types/shared/global_affiliate_status.py
similarity index 100%
rename from src/whopsdk/types/shared/global_affiliate_status.py
rename to src/whop_sdk/types/shared/global_affiliate_status.py
diff --git a/src/whopsdk/types/shared/industry_types.py b/src/whop_sdk/types/shared/industry_types.py
similarity index 100%
rename from src/whopsdk/types/shared/industry_types.py
rename to src/whop_sdk/types/shared/industry_types.py
diff --git a/src/whopsdk/types/shared/invoice.py b/src/whop_sdk/types/shared/invoice.py
similarity index 100%
rename from src/whopsdk/types/shared/invoice.py
rename to src/whop_sdk/types/shared/invoice.py
diff --git a/src/whopsdk/types/shared/invoice_list_item.py b/src/whop_sdk/types/shared/invoice_list_item.py
similarity index 100%
rename from src/whopsdk/types/shared/invoice_list_item.py
rename to src/whop_sdk/types/shared/invoice_list_item.py
diff --git a/src/whopsdk/types/shared/invoice_status.py b/src/whop_sdk/types/shared/invoice_status.py
similarity index 100%
rename from src/whopsdk/types/shared/invoice_status.py
rename to src/whop_sdk/types/shared/invoice_status.py
diff --git a/src/whopsdk/types/shared/membership.py b/src/whop_sdk/types/shared/membership.py
similarity index 100%
rename from src/whopsdk/types/shared/membership.py
rename to src/whop_sdk/types/shared/membership.py
diff --git a/src/whopsdk/types/shared/membership_status.py b/src/whop_sdk/types/shared/membership_status.py
similarity index 100%
rename from src/whopsdk/types/shared/membership_status.py
rename to src/whop_sdk/types/shared/membership_status.py
diff --git a/src/whopsdk/types/shared/message.py b/src/whop_sdk/types/shared/message.py
similarity index 100%
rename from src/whopsdk/types/shared/message.py
rename to src/whop_sdk/types/shared/message.py
diff --git a/src/whopsdk/types/shared/page_info.py b/src/whop_sdk/types/shared/page_info.py
similarity index 100%
rename from src/whopsdk/types/shared/page_info.py
rename to src/whop_sdk/types/shared/page_info.py
diff --git a/src/whopsdk/types/shared/payment.py b/src/whop_sdk/types/shared/payment.py
similarity index 100%
rename from src/whopsdk/types/shared/payment.py
rename to src/whop_sdk/types/shared/payment.py
diff --git a/src/whopsdk/types/shared/plan.py b/src/whop_sdk/types/shared/plan.py
similarity index 100%
rename from src/whopsdk/types/shared/plan.py
rename to src/whop_sdk/types/shared/plan.py
diff --git a/src/whopsdk/types/shared/plan_type.py b/src/whop_sdk/types/shared/plan_type.py
similarity index 100%
rename from src/whopsdk/types/shared/plan_type.py
rename to src/whop_sdk/types/shared/plan_type.py
diff --git a/src/whopsdk/types/shared/product.py b/src/whop_sdk/types/shared/product.py
similarity index 100%
rename from src/whopsdk/types/shared/product.py
rename to src/whop_sdk/types/shared/product.py
diff --git a/src/whopsdk/types/shared/product_list_item.py b/src/whop_sdk/types/shared/product_list_item.py
similarity index 100%
rename from src/whopsdk/types/shared/product_list_item.py
rename to src/whop_sdk/types/shared/product_list_item.py
diff --git a/src/whopsdk/types/shared/promo_type.py b/src/whop_sdk/types/shared/promo_type.py
similarity index 100%
rename from src/whopsdk/types/shared/promo_type.py
rename to src/whop_sdk/types/shared/promo_type.py
diff --git a/src/whopsdk/types/shared/reaction.py b/src/whop_sdk/types/shared/reaction.py
similarity index 100%
rename from src/whopsdk/types/shared/reaction.py
rename to src/whop_sdk/types/shared/reaction.py
diff --git a/src/whopsdk/types/shared/receipt_status.py b/src/whop_sdk/types/shared/receipt_status.py
similarity index 100%
rename from src/whopsdk/types/shared/receipt_status.py
rename to src/whop_sdk/types/shared/receipt_status.py
diff --git a/src/whopsdk/types/shared/release_method.py b/src/whop_sdk/types/shared/release_method.py
similarity index 100%
rename from src/whopsdk/types/shared/release_method.py
rename to src/whop_sdk/types/shared/release_method.py
diff --git a/src/whopsdk/types/shared/shipment.py b/src/whop_sdk/types/shared/shipment.py
similarity index 100%
rename from src/whopsdk/types/shared/shipment.py
rename to src/whop_sdk/types/shared/shipment.py
diff --git a/src/whopsdk/types/shared/shipment_carrier.py b/src/whop_sdk/types/shared/shipment_carrier.py
similarity index 100%
rename from src/whopsdk/types/shared/shipment_carrier.py
rename to src/whop_sdk/types/shared/shipment_carrier.py
diff --git a/src/whopsdk/types/shared/shipment_status.py b/src/whop_sdk/types/shared/shipment_status.py
similarity index 100%
rename from src/whopsdk/types/shared/shipment_status.py
rename to src/whop_sdk/types/shared/shipment_status.py
diff --git a/src/whopsdk/types/shared/shipment_substatus.py b/src/whop_sdk/types/shared/shipment_substatus.py
similarity index 100%
rename from src/whopsdk/types/shared/shipment_substatus.py
rename to src/whop_sdk/types/shared/shipment_substatus.py
diff --git a/src/whopsdk/types/shared/support_channel.py b/src/whop_sdk/types/shared/support_channel.py
similarity index 100%
rename from src/whopsdk/types/shared/support_channel.py
rename to src/whop_sdk/types/shared/support_channel.py
diff --git a/src/whopsdk/types/shared/tax_type.py b/src/whop_sdk/types/shared/tax_type.py
similarity index 100%
rename from src/whopsdk/types/shared/tax_type.py
rename to src/whop_sdk/types/shared/tax_type.py
diff --git a/src/whopsdk/types/shared/transfer.py b/src/whop_sdk/types/shared/transfer.py
similarity index 100%
rename from src/whopsdk/types/shared/transfer.py
rename to src/whop_sdk/types/shared/transfer.py
diff --git a/src/whopsdk/types/shared/visibility.py b/src/whop_sdk/types/shared/visibility.py
similarity index 100%
rename from src/whopsdk/types/shared/visibility.py
rename to src/whop_sdk/types/shared/visibility.py
diff --git a/src/whopsdk/types/shared/visibility_filter.py b/src/whop_sdk/types/shared/visibility_filter.py
similarity index 100%
rename from src/whopsdk/types/shared/visibility_filter.py
rename to src/whop_sdk/types/shared/visibility_filter.py
diff --git a/src/whopsdk/types/shared/who_can_post.py b/src/whop_sdk/types/shared/who_can_post.py
similarity index 100%
rename from src/whopsdk/types/shared/who_can_post.py
rename to src/whop_sdk/types/shared/who_can_post.py
diff --git a/src/whopsdk/types/shared/who_can_react.py b/src/whop_sdk/types/shared/who_can_react.py
similarity index 100%
rename from src/whopsdk/types/shared/who_can_react.py
rename to src/whop_sdk/types/shared/who_can_react.py
diff --git a/src/whopsdk/types/shared_params/__init__.py b/src/whop_sdk/types/shared_params/__init__.py
similarity index 100%
rename from src/whopsdk/types/shared_params/__init__.py
rename to src/whop_sdk/types/shared_params/__init__.py
diff --git a/src/whopsdk/types/shared_params/access_pass_type.py b/src/whop_sdk/types/shared_params/access_pass_type.py
similarity index 100%
rename from src/whopsdk/types/shared_params/access_pass_type.py
rename to src/whop_sdk/types/shared_params/access_pass_type.py
diff --git a/src/whopsdk/types/shared_params/app_build_platforms.py b/src/whop_sdk/types/shared_params/app_build_platforms.py
similarity index 100%
rename from src/whopsdk/types/shared_params/app_build_platforms.py
rename to src/whop_sdk/types/shared_params/app_build_platforms.py
diff --git a/src/whopsdk/types/shared_params/app_build_statuses.py b/src/whop_sdk/types/shared_params/app_build_statuses.py
similarity index 100%
rename from src/whopsdk/types/shared_params/app_build_statuses.py
rename to src/whop_sdk/types/shared_params/app_build_statuses.py
diff --git a/src/whopsdk/types/shared_params/app_statuses.py b/src/whop_sdk/types/shared_params/app_statuses.py
similarity index 100%
rename from src/whopsdk/types/shared_params/app_statuses.py
rename to src/whop_sdk/types/shared_params/app_statuses.py
diff --git a/src/whopsdk/types/shared_params/app_view_type.py b/src/whop_sdk/types/shared_params/app_view_type.py
similarity index 100%
rename from src/whopsdk/types/shared_params/app_view_type.py
rename to src/whop_sdk/types/shared_params/app_view_type.py
diff --git a/src/whopsdk/types/shared_params/authorized_user_roles.py b/src/whop_sdk/types/shared_params/authorized_user_roles.py
similarity index 100%
rename from src/whopsdk/types/shared_params/authorized_user_roles.py
rename to src/whop_sdk/types/shared_params/authorized_user_roles.py
diff --git a/src/whopsdk/types/shared_params/business_types.py b/src/whop_sdk/types/shared_params/business_types.py
similarity index 100%
rename from src/whopsdk/types/shared_params/business_types.py
rename to src/whop_sdk/types/shared_params/business_types.py
diff --git a/src/whopsdk/types/shared_params/collection_method.py b/src/whop_sdk/types/shared_params/collection_method.py
similarity index 100%
rename from src/whopsdk/types/shared_params/collection_method.py
rename to src/whop_sdk/types/shared_params/collection_method.py
diff --git a/src/whopsdk/types/shared_params/currency.py b/src/whop_sdk/types/shared_params/currency.py
similarity index 100%
rename from src/whopsdk/types/shared_params/currency.py
rename to src/whop_sdk/types/shared_params/currency.py
diff --git a/src/whopsdk/types/shared_params/custom_cta.py b/src/whop_sdk/types/shared_params/custom_cta.py
similarity index 100%
rename from src/whopsdk/types/shared_params/custom_cta.py
rename to src/whop_sdk/types/shared_params/custom_cta.py
diff --git a/src/whopsdk/types/shared_params/direction.py b/src/whop_sdk/types/shared_params/direction.py
similarity index 100%
rename from src/whopsdk/types/shared_params/direction.py
rename to src/whop_sdk/types/shared_params/direction.py
diff --git a/src/whopsdk/types/shared_params/entry_status.py b/src/whop_sdk/types/shared_params/entry_status.py
similarity index 100%
rename from src/whopsdk/types/shared_params/entry_status.py
rename to src/whop_sdk/types/shared_params/entry_status.py
diff --git a/src/whopsdk/types/shared_params/friendly_receipt_status.py b/src/whop_sdk/types/shared_params/friendly_receipt_status.py
similarity index 100%
rename from src/whopsdk/types/shared_params/friendly_receipt_status.py
rename to src/whop_sdk/types/shared_params/friendly_receipt_status.py
diff --git a/src/whopsdk/types/shared_params/global_affiliate_status.py b/src/whop_sdk/types/shared_params/global_affiliate_status.py
similarity index 100%
rename from src/whopsdk/types/shared_params/global_affiliate_status.py
rename to src/whop_sdk/types/shared_params/global_affiliate_status.py
diff --git a/src/whopsdk/types/shared_params/industry_types.py b/src/whop_sdk/types/shared_params/industry_types.py
similarity index 100%
rename from src/whopsdk/types/shared_params/industry_types.py
rename to src/whop_sdk/types/shared_params/industry_types.py
diff --git a/src/whopsdk/types/shared_params/invoice_status.py b/src/whop_sdk/types/shared_params/invoice_status.py
similarity index 100%
rename from src/whopsdk/types/shared_params/invoice_status.py
rename to src/whop_sdk/types/shared_params/invoice_status.py
diff --git a/src/whopsdk/types/shared_params/membership_status.py b/src/whop_sdk/types/shared_params/membership_status.py
similarity index 100%
rename from src/whopsdk/types/shared_params/membership_status.py
rename to src/whop_sdk/types/shared_params/membership_status.py
diff --git a/src/whopsdk/types/shared_params/plan_type.py b/src/whop_sdk/types/shared_params/plan_type.py
similarity index 100%
rename from src/whopsdk/types/shared_params/plan_type.py
rename to src/whop_sdk/types/shared_params/plan_type.py
diff --git a/src/whopsdk/types/shared_params/receipt_status.py b/src/whop_sdk/types/shared_params/receipt_status.py
similarity index 100%
rename from src/whopsdk/types/shared_params/receipt_status.py
rename to src/whop_sdk/types/shared_params/receipt_status.py
diff --git a/src/whopsdk/types/shared_params/release_method.py b/src/whop_sdk/types/shared_params/release_method.py
similarity index 100%
rename from src/whopsdk/types/shared_params/release_method.py
rename to src/whop_sdk/types/shared_params/release_method.py
diff --git a/src/whopsdk/types/shared_params/tax_type.py b/src/whop_sdk/types/shared_params/tax_type.py
similarity index 100%
rename from src/whopsdk/types/shared_params/tax_type.py
rename to src/whop_sdk/types/shared_params/tax_type.py
diff --git a/src/whopsdk/types/shared_params/visibility.py b/src/whop_sdk/types/shared_params/visibility.py
similarity index 100%
rename from src/whopsdk/types/shared_params/visibility.py
rename to src/whop_sdk/types/shared_params/visibility.py
diff --git a/src/whopsdk/types/shared_params/visibility_filter.py b/src/whop_sdk/types/shared_params/visibility_filter.py
similarity index 100%
rename from src/whopsdk/types/shared_params/visibility_filter.py
rename to src/whop_sdk/types/shared_params/visibility_filter.py
diff --git a/src/whopsdk/types/shared_params/who_can_post.py b/src/whop_sdk/types/shared_params/who_can_post.py
similarity index 100%
rename from src/whopsdk/types/shared_params/who_can_post.py
rename to src/whop_sdk/types/shared_params/who_can_post.py
diff --git a/src/whopsdk/types/shared_params/who_can_react.py b/src/whop_sdk/types/shared_params/who_can_react.py
similarity index 100%
rename from src/whopsdk/types/shared_params/who_can_react.py
rename to src/whop_sdk/types/shared_params/who_can_react.py
diff --git a/src/whopsdk/types/shipment_create_params.py b/src/whop_sdk/types/shipment_create_params.py
similarity index 100%
rename from src/whopsdk/types/shipment_create_params.py
rename to src/whop_sdk/types/shipment_create_params.py
diff --git a/src/whopsdk/types/shipment_list_params.py b/src/whop_sdk/types/shipment_list_params.py
similarity index 100%
rename from src/whopsdk/types/shipment_list_params.py
rename to src/whop_sdk/types/shipment_list_params.py
diff --git a/src/whopsdk/types/shipment_list_response.py b/src/whop_sdk/types/shipment_list_response.py
similarity index 100%
rename from src/whopsdk/types/shipment_list_response.py
rename to src/whop_sdk/types/shipment_list_response.py
diff --git a/src/whopsdk/types/support_channel_create_params.py b/src/whop_sdk/types/support_channel_create_params.py
similarity index 100%
rename from src/whopsdk/types/support_channel_create_params.py
rename to src/whop_sdk/types/support_channel_create_params.py
diff --git a/src/whopsdk/types/support_channel_list_params.py b/src/whop_sdk/types/support_channel_list_params.py
similarity index 100%
rename from src/whopsdk/types/support_channel_list_params.py
rename to src/whop_sdk/types/support_channel_list_params.py
diff --git a/src/whopsdk/types/support_channel_list_response.py b/src/whop_sdk/types/support_channel_list_response.py
similarity index 100%
rename from src/whopsdk/types/support_channel_list_response.py
rename to src/whop_sdk/types/support_channel_list_response.py
diff --git a/src/whopsdk/types/transfer_create_params.py b/src/whop_sdk/types/transfer_create_params.py
similarity index 100%
rename from src/whopsdk/types/transfer_create_params.py
rename to src/whop_sdk/types/transfer_create_params.py
diff --git a/src/whopsdk/types/transfer_list_params.py b/src/whop_sdk/types/transfer_list_params.py
similarity index 100%
rename from src/whopsdk/types/transfer_list_params.py
rename to src/whop_sdk/types/transfer_list_params.py
diff --git a/src/whopsdk/types/transfer_list_response.py b/src/whop_sdk/types/transfer_list_response.py
similarity index 100%
rename from src/whopsdk/types/transfer_list_response.py
rename to src/whop_sdk/types/transfer_list_response.py
diff --git a/src/whopsdk/types/unwrap_webhook_event.py b/src/whop_sdk/types/unwrap_webhook_event.py
similarity index 100%
rename from src/whopsdk/types/unwrap_webhook_event.py
rename to src/whop_sdk/types/unwrap_webhook_event.py
diff --git a/src/whopsdk/types/user_check_access_response.py b/src/whop_sdk/types/user_check_access_response.py
similarity index 100%
rename from src/whopsdk/types/user_check_access_response.py
rename to src/whop_sdk/types/user_check_access_response.py
diff --git a/src/whopsdk/types/user_retrieve_response.py b/src/whop_sdk/types/user_retrieve_response.py
similarity index 100%
rename from src/whopsdk/types/user_retrieve_response.py
rename to src/whop_sdk/types/user_retrieve_response.py
diff --git a/tests/api_resources/test_app_builds.py b/tests/api_resources/test_app_builds.py
index c4e23886..ebf289c7 100644
--- a/tests/api_resources/test_app_builds.py
+++ b/tests/api_resources/test_app_builds.py
@@ -7,11 +7,11 @@
import pytest
-from whopsdk import Whop, AsyncWhop
+from whop_sdk import Whop, AsyncWhop
from tests.utils import assert_matches_type
-from whopsdk.types import AppBuildListResponse
-from whopsdk.pagination import SyncCursorPage, AsyncCursorPage
-from whopsdk.types.shared import AppBuild
+from whop_sdk.types import AppBuildListResponse
+from whop_sdk.pagination import SyncCursorPage, AsyncCursorPage
+from whop_sdk.types.shared import AppBuild
base_url = os.environ.get("TEST_API_BASE_URL", "http://127.0.0.1:4010")
diff --git a/tests/api_resources/test_apps.py b/tests/api_resources/test_apps.py
index f8a572c8..0e52d0b8 100644
--- a/tests/api_resources/test_apps.py
+++ b/tests/api_resources/test_apps.py
@@ -7,11 +7,11 @@
import pytest
-from whopsdk import Whop, AsyncWhop
+from whop_sdk import Whop, AsyncWhop
from tests.utils import assert_matches_type
-from whopsdk.types import AppListResponse
-from whopsdk.pagination import SyncCursorPage, AsyncCursorPage
-from whopsdk.types.shared import App
+from whop_sdk.types import AppListResponse
+from whop_sdk.pagination import SyncCursorPage, AsyncCursorPage
+from whop_sdk.types.shared import App
base_url = os.environ.get("TEST_API_BASE_URL", "http://127.0.0.1:4010")
diff --git a/tests/api_resources/test_authorized_users.py b/tests/api_resources/test_authorized_users.py
index 454da177..179cab59 100644
--- a/tests/api_resources/test_authorized_users.py
+++ b/tests/api_resources/test_authorized_users.py
@@ -7,13 +7,13 @@
import pytest
-from whopsdk import Whop, AsyncWhop
+from whop_sdk import Whop, AsyncWhop
from tests.utils import assert_matches_type
-from whopsdk.types import (
+from whop_sdk.types import (
AuthorizedUserListResponse,
AuthorizedUserRetrieveResponse,
)
-from whopsdk.pagination import SyncCursorPage, AsyncCursorPage
+from whop_sdk.pagination import SyncCursorPage, AsyncCursorPage
base_url = os.environ.get("TEST_API_BASE_URL", "http://127.0.0.1:4010")
diff --git a/tests/api_resources/test_chat_channels.py b/tests/api_resources/test_chat_channels.py
index 6243042c..5b9e217f 100644
--- a/tests/api_resources/test_chat_channels.py
+++ b/tests/api_resources/test_chat_channels.py
@@ -7,11 +7,11 @@
import pytest
-from whopsdk import Whop, AsyncWhop
+from whop_sdk import Whop, AsyncWhop
from tests.utils import assert_matches_type
-from whopsdk.types import ChatChannelListResponse
-from whopsdk.pagination import SyncCursorPage, AsyncCursorPage
-from whopsdk.types.shared import ChatChannel
+from whop_sdk.types import ChatChannelListResponse
+from whop_sdk.pagination import SyncCursorPage, AsyncCursorPage
+from whop_sdk.types.shared import ChatChannel
base_url = os.environ.get("TEST_API_BASE_URL", "http://127.0.0.1:4010")
diff --git a/tests/api_resources/test_checkout_configurations.py b/tests/api_resources/test_checkout_configurations.py
index 0918ecdb..13ad6753 100644
--- a/tests/api_resources/test_checkout_configurations.py
+++ b/tests/api_resources/test_checkout_configurations.py
@@ -7,13 +7,13 @@
import pytest
-from whopsdk import Whop, AsyncWhop
+from whop_sdk import Whop, AsyncWhop
from tests.utils import assert_matches_type
-from whopsdk.types import (
+from whop_sdk.types import (
CheckoutConfigurationListResponse,
)
-from whopsdk.pagination import SyncCursorPage, AsyncCursorPage
-from whopsdk.types.shared import CheckoutConfiguration
+from whop_sdk.pagination import SyncCursorPage, AsyncCursorPage
+from whop_sdk.types.shared import CheckoutConfiguration
base_url = os.environ.get("TEST_API_BASE_URL", "http://127.0.0.1:4010")
diff --git a/tests/api_resources/test_companies.py b/tests/api_resources/test_companies.py
index 495fb383..f6e41974 100644
--- a/tests/api_resources/test_companies.py
+++ b/tests/api_resources/test_companies.py
@@ -7,9 +7,9 @@
import pytest
-from whopsdk import Whop, AsyncWhop
+from whop_sdk import Whop, AsyncWhop
from tests.utils import assert_matches_type
-from whopsdk.types.shared import Company
+from whop_sdk.types.shared import Company
base_url = os.environ.get("TEST_API_BASE_URL", "http://127.0.0.1:4010")
diff --git a/tests/api_resources/test_course_lesson_interactions.py b/tests/api_resources/test_course_lesson_interactions.py
index 9394c582..f5025c1c 100644
--- a/tests/api_resources/test_course_lesson_interactions.py
+++ b/tests/api_resources/test_course_lesson_interactions.py
@@ -7,10 +7,10 @@
import pytest
-from whopsdk import Whop, AsyncWhop
+from whop_sdk import Whop, AsyncWhop
from tests.utils import assert_matches_type
-from whopsdk.pagination import SyncCursorPage, AsyncCursorPage
-from whopsdk.types.shared import CourseLessonInteraction, CourseLessonInteractionListItem
+from whop_sdk.pagination import SyncCursorPage, AsyncCursorPage
+from whop_sdk.types.shared import CourseLessonInteraction, CourseLessonInteractionListItem
base_url = os.environ.get("TEST_API_BASE_URL", "http://127.0.0.1:4010")
diff --git a/tests/api_resources/test_entries.py b/tests/api_resources/test_entries.py
index 73f19da5..3d549c16 100644
--- a/tests/api_resources/test_entries.py
+++ b/tests/api_resources/test_entries.py
@@ -7,11 +7,11 @@
import pytest
-from whopsdk import Whop, AsyncWhop
+from whop_sdk import Whop, AsyncWhop
from tests.utils import assert_matches_type
-from whopsdk.types import EntryListResponse, EntryApproveResponse
-from whopsdk.pagination import SyncCursorPage, AsyncCursorPage
-from whopsdk.types.shared import Entry
+from whop_sdk.types import EntryListResponse, EntryApproveResponse
+from whop_sdk.pagination import SyncCursorPage, AsyncCursorPage
+from whop_sdk.types.shared import Entry
base_url = os.environ.get("TEST_API_BASE_URL", "http://127.0.0.1:4010")
diff --git a/tests/api_resources/test_experiences.py b/tests/api_resources/test_experiences.py
index 7579b714..9112113c 100644
--- a/tests/api_resources/test_experiences.py
+++ b/tests/api_resources/test_experiences.py
@@ -7,14 +7,14 @@
import pytest
-from whopsdk import Whop, AsyncWhop
+from whop_sdk import Whop, AsyncWhop
from tests.utils import assert_matches_type
-from whopsdk.types import (
+from whop_sdk.types import (
ExperienceListResponse,
ExperienceDeleteResponse,
)
-from whopsdk.pagination import SyncCursorPage, AsyncCursorPage
-from whopsdk.types.shared import Experience
+from whop_sdk.pagination import SyncCursorPage, AsyncCursorPage
+from whop_sdk.types.shared import Experience
base_url = os.environ.get("TEST_API_BASE_URL", "http://127.0.0.1:4010")
diff --git a/tests/api_resources/test_forum_posts.py b/tests/api_resources/test_forum_posts.py
index ee2a3b95..9487c0de 100644
--- a/tests/api_resources/test_forum_posts.py
+++ b/tests/api_resources/test_forum_posts.py
@@ -7,11 +7,11 @@
import pytest
-from whopsdk import Whop, AsyncWhop
+from whop_sdk import Whop, AsyncWhop
from tests.utils import assert_matches_type
-from whopsdk.types import ForumPostListResponse
-from whopsdk.pagination import SyncCursorPage, AsyncCursorPage
-from whopsdk.types.shared import ForumPost
+from whop_sdk.types import ForumPostListResponse
+from whop_sdk.pagination import SyncCursorPage, AsyncCursorPage
+from whop_sdk.types.shared import ForumPost
base_url = os.environ.get("TEST_API_BASE_URL", "http://127.0.0.1:4010")
diff --git a/tests/api_resources/test_invoices.py b/tests/api_resources/test_invoices.py
index b117dd25..ab6c3c7c 100644
--- a/tests/api_resources/test_invoices.py
+++ b/tests/api_resources/test_invoices.py
@@ -7,12 +7,15 @@
import pytest
-from whopsdk import Whop, AsyncWhop
+from whop_sdk import Whop, AsyncWhop
from tests.utils import assert_matches_type
-from whopsdk.types import InvoiceVoidResponse, InvoiceCreateResponse
-from whopsdk._utils import parse_datetime
-from whopsdk.pagination import SyncCursorPage, AsyncCursorPage
-from whopsdk.types.shared import Invoice, InvoiceListItem
+from whop_sdk.types import (
+ InvoiceVoidResponse,
+ InvoiceCreateResponse,
+)
+from whop_sdk._utils import parse_datetime
+from whop_sdk.pagination import SyncCursorPage, AsyncCursorPage
+from whop_sdk.types.shared import Invoice, InvoiceListItem
base_url = os.environ.get("TEST_API_BASE_URL", "http://127.0.0.1:4010")
diff --git a/tests/api_resources/test_ledger_accounts.py b/tests/api_resources/test_ledger_accounts.py
index 6dfd4ae2..036a3034 100644
--- a/tests/api_resources/test_ledger_accounts.py
+++ b/tests/api_resources/test_ledger_accounts.py
@@ -7,9 +7,9 @@
import pytest
-from whopsdk import Whop, AsyncWhop
+from whop_sdk import Whop, AsyncWhop
from tests.utils import assert_matches_type
-from whopsdk.types import LedgerAccountRetrieveResponse
+from whop_sdk.types import LedgerAccountRetrieveResponse
base_url = os.environ.get("TEST_API_BASE_URL", "http://127.0.0.1:4010")
diff --git a/tests/api_resources/test_memberships.py b/tests/api_resources/test_memberships.py
index 8be7ce6a..f0edf0ab 100644
--- a/tests/api_resources/test_memberships.py
+++ b/tests/api_resources/test_memberships.py
@@ -7,14 +7,14 @@
import pytest
-from whopsdk import Whop, AsyncWhop
+from whop_sdk import Whop, AsyncWhop
from tests.utils import assert_matches_type
-from whopsdk.types import (
+from whop_sdk.types import (
MembershipListResponse,
)
-from whopsdk._utils import parse_datetime
-from whopsdk.pagination import SyncCursorPage, AsyncCursorPage
-from whopsdk.types.shared import Membership
+from whop_sdk._utils import parse_datetime
+from whop_sdk.pagination import SyncCursorPage, AsyncCursorPage
+from whop_sdk.types.shared import Membership
base_url = os.environ.get("TEST_API_BASE_URL", "http://127.0.0.1:4010")
diff --git a/tests/api_resources/test_messages.py b/tests/api_resources/test_messages.py
index f771eb7a..4e79462c 100644
--- a/tests/api_resources/test_messages.py
+++ b/tests/api_resources/test_messages.py
@@ -7,11 +7,11 @@
import pytest
-from whopsdk import Whop, AsyncWhop
+from whop_sdk import Whop, AsyncWhop
from tests.utils import assert_matches_type
-from whopsdk.types import MessageListResponse
-from whopsdk.pagination import SyncCursorPage, AsyncCursorPage
-from whopsdk.types.shared import Message
+from whop_sdk.types import MessageListResponse
+from whop_sdk.pagination import SyncCursorPage, AsyncCursorPage
+from whop_sdk.types.shared import Message
base_url = os.environ.get("TEST_API_BASE_URL", "http://127.0.0.1:4010")
diff --git a/tests/api_resources/test_payments.py b/tests/api_resources/test_payments.py
index a25e86d2..3ad24582 100644
--- a/tests/api_resources/test_payments.py
+++ b/tests/api_resources/test_payments.py
@@ -7,12 +7,12 @@
import pytest
-from whopsdk import Whop, AsyncWhop
+from whop_sdk import Whop, AsyncWhop
from tests.utils import assert_matches_type
-from whopsdk.types import PaymentListResponse
-from whopsdk._utils import parse_datetime
-from whopsdk.pagination import SyncCursorPage, AsyncCursorPage
-from whopsdk.types.shared import Payment
+from whop_sdk.types import PaymentListResponse
+from whop_sdk._utils import parse_datetime
+from whop_sdk.pagination import SyncCursorPage, AsyncCursorPage
+from whop_sdk.types.shared import Payment
base_url = os.environ.get("TEST_API_BASE_URL", "http://127.0.0.1:4010")
diff --git a/tests/api_resources/test_plans.py b/tests/api_resources/test_plans.py
index 7f91a249..b86a579f 100644
--- a/tests/api_resources/test_plans.py
+++ b/tests/api_resources/test_plans.py
@@ -7,14 +7,14 @@
import pytest
-from whopsdk import Whop, AsyncWhop
+from whop_sdk import Whop, AsyncWhop
from tests.utils import assert_matches_type
-from whopsdk.types import (
+from whop_sdk.types import (
PlanListResponse,
PlanDeleteResponse,
)
-from whopsdk.pagination import SyncCursorPage, AsyncCursorPage
-from whopsdk.types.shared import Plan
+from whop_sdk.pagination import SyncCursorPage, AsyncCursorPage
+from whop_sdk.types.shared import Plan
base_url = os.environ.get("TEST_API_BASE_URL", "http://127.0.0.1:4010")
diff --git a/tests/api_resources/test_products.py b/tests/api_resources/test_products.py
index 52b7dc7e..2d66be66 100644
--- a/tests/api_resources/test_products.py
+++ b/tests/api_resources/test_products.py
@@ -7,13 +7,13 @@
import pytest
-from whopsdk import Whop, AsyncWhop
+from whop_sdk import Whop, AsyncWhop
from tests.utils import assert_matches_type
-from whopsdk.types import (
+from whop_sdk.types import (
ProductDeleteResponse,
)
-from whopsdk.pagination import SyncCursorPage, AsyncCursorPage
-from whopsdk.types.shared import Product, ProductListItem
+from whop_sdk.pagination import SyncCursorPage, AsyncCursorPage
+from whop_sdk.types.shared import Product, ProductListItem
base_url = os.environ.get("TEST_API_BASE_URL", "http://127.0.0.1:4010")
diff --git a/tests/api_resources/test_reactions.py b/tests/api_resources/test_reactions.py
index 2286cccb..68b5b427 100644
--- a/tests/api_resources/test_reactions.py
+++ b/tests/api_resources/test_reactions.py
@@ -7,11 +7,11 @@
import pytest
-from whopsdk import Whop, AsyncWhop
+from whop_sdk import Whop, AsyncWhop
from tests.utils import assert_matches_type
-from whopsdk.types import ReactionListResponse
-from whopsdk.pagination import SyncCursorPage, AsyncCursorPage
-from whopsdk.types.shared import Reaction
+from whop_sdk.types import ReactionListResponse
+from whop_sdk.pagination import SyncCursorPage, AsyncCursorPage
+from whop_sdk.types.shared import Reaction
base_url = os.environ.get("TEST_API_BASE_URL", "http://127.0.0.1:4010")
diff --git a/tests/api_resources/test_shipments.py b/tests/api_resources/test_shipments.py
index 948593e8..41d72dbb 100644
--- a/tests/api_resources/test_shipments.py
+++ b/tests/api_resources/test_shipments.py
@@ -7,11 +7,11 @@
import pytest
-from whopsdk import Whop, AsyncWhop
+from whop_sdk import Whop, AsyncWhop
from tests.utils import assert_matches_type
-from whopsdk.types import ShipmentListResponse
-from whopsdk.pagination import SyncCursorPage, AsyncCursorPage
-from whopsdk.types.shared import Shipment
+from whop_sdk.types import ShipmentListResponse
+from whop_sdk.pagination import SyncCursorPage, AsyncCursorPage
+from whop_sdk.types.shared import Shipment
base_url = os.environ.get("TEST_API_BASE_URL", "http://127.0.0.1:4010")
diff --git a/tests/api_resources/test_support_channels.py b/tests/api_resources/test_support_channels.py
index bc89ed62..d449fdb0 100644
--- a/tests/api_resources/test_support_channels.py
+++ b/tests/api_resources/test_support_channels.py
@@ -7,11 +7,13 @@
import pytest
-from whopsdk import Whop, AsyncWhop
+from whop_sdk import Whop, AsyncWhop
from tests.utils import assert_matches_type
-from whopsdk.types import SupportChannelListResponse
-from whopsdk.pagination import SyncCursorPage, AsyncCursorPage
-from whopsdk.types.shared import SupportChannel
+from whop_sdk.types import (
+ SupportChannelListResponse,
+)
+from whop_sdk.pagination import SyncCursorPage, AsyncCursorPage
+from whop_sdk.types.shared import SupportChannel
base_url = os.environ.get("TEST_API_BASE_URL", "http://127.0.0.1:4010")
diff --git a/tests/api_resources/test_transfers.py b/tests/api_resources/test_transfers.py
index d50aaa8f..5afce84f 100644
--- a/tests/api_resources/test_transfers.py
+++ b/tests/api_resources/test_transfers.py
@@ -7,11 +7,11 @@
import pytest
-from whopsdk import Whop, AsyncWhop
+from whop_sdk import Whop, AsyncWhop
from tests.utils import assert_matches_type
-from whopsdk.types import TransferListResponse
-from whopsdk.pagination import SyncCursorPage, AsyncCursorPage
-from whopsdk.types.shared import Transfer
+from whop_sdk.types import TransferListResponse
+from whop_sdk.pagination import SyncCursorPage, AsyncCursorPage
+from whop_sdk.types.shared import Transfer
base_url = os.environ.get("TEST_API_BASE_URL", "http://127.0.0.1:4010")
diff --git a/tests/api_resources/test_users.py b/tests/api_resources/test_users.py
index dc0b13eb..924e77f6 100644
--- a/tests/api_resources/test_users.py
+++ b/tests/api_resources/test_users.py
@@ -7,9 +7,9 @@
import pytest
-from whopsdk import Whop, AsyncWhop
+from whop_sdk import Whop, AsyncWhop
from tests.utils import assert_matches_type
-from whopsdk.types import UserRetrieveResponse, UserCheckAccessResponse
+from whop_sdk.types import UserRetrieveResponse, UserCheckAccessResponse
base_url = os.environ.get("TEST_API_BASE_URL", "http://127.0.0.1:4010")
diff --git a/tests/api_resources/test_webhooks.py b/tests/api_resources/test_webhooks.py
index 2738aa36..deebdece 100644
--- a/tests/api_resources/test_webhooks.py
+++ b/tests/api_resources/test_webhooks.py
@@ -8,7 +8,7 @@
import pytest
import standardwebhooks
-from whopsdk import Whop
+from whop_sdk import Whop
base_url = os.environ.get("TEST_API_BASE_URL", "http://127.0.0.1:4010")
diff --git a/tests/conftest.py b/tests/conftest.py
index 00e86398..b2907519 100644
--- a/tests/conftest.py
+++ b/tests/conftest.py
@@ -10,15 +10,15 @@
import pytest
from pytest_asyncio import is_async_test
-from whopsdk import Whop, AsyncWhop, DefaultAioHttpClient
-from whopsdk._utils import is_dict
+from whop_sdk import Whop, AsyncWhop, DefaultAioHttpClient
+from whop_sdk._utils import is_dict
if TYPE_CHECKING:
from _pytest.fixtures import FixtureRequest # pyright: ignore[reportPrivateImportUsage]
pytest.register_assert_rewrite("tests.utils")
-logging.getLogger("whopsdk").setLevel(logging.DEBUG)
+logging.getLogger("whop_sdk").setLevel(logging.DEBUG)
# automatically add `pytest.mark.asyncio()` to all of our async tests
diff --git a/tests/test_client.py b/tests/test_client.py
index 08c528b7..70ee7fd0 100644
--- a/tests/test_client.py
+++ b/tests/test_client.py
@@ -18,12 +18,12 @@
from respx import MockRouter
from pydantic import ValidationError
-from whopsdk import Whop, AsyncWhop, APIResponseValidationError
-from whopsdk._types import Omit
-from whopsdk._utils import asyncify
-from whopsdk._models import BaseModel, FinalRequestOptions
-from whopsdk._exceptions import WhopError, APIStatusError, APIResponseValidationError
-from whopsdk._base_client import (
+from whop_sdk import Whop, AsyncWhop, APIResponseValidationError
+from whop_sdk._types import Omit
+from whop_sdk._utils import asyncify
+from whop_sdk._models import BaseModel, FinalRequestOptions
+from whop_sdk._exceptions import WhopError, APIStatusError, APIResponseValidationError
+from whop_sdk._base_client import (
DEFAULT_TIMEOUT,
HTTPX_DEFAULT_TIMEOUT,
BaseClient,
@@ -237,10 +237,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.
- "whopsdk/_legacy_response.py",
- "whopsdk/_response.py",
+ "whop_sdk/_legacy_response.py",
+ "whop_sdk/_response.py",
# pydantic.BaseModel.model_dump || pydantic.BaseModel.dict leak memory for some reason.
- "whopsdk/_compat.py",
+ "whop_sdk/_compat.py",
# Standard library leaks we don't care about.
"/logging/__init__.py",
]
@@ -769,7 +769,7 @@ def test_parse_retry_after_header(self, remaining_retries: int, retry_after: str
assert calculated == pytest.approx(timeout, 0.5 * 0.875) # pyright: ignore[reportUnknownMemberType]
@pytest.mark.parametrize("failures_before_success", [0, 2, 4])
- @mock.patch("whopsdk._base_client.BaseClient._calculate_retry_timeout", _low_retry_timeout)
+ @mock.patch("whop_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(
@@ -800,7 +800,7 @@ def retry_handler(_request: httpx.Request) -> httpx.Response:
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("whopsdk._base_client.BaseClient._calculate_retry_timeout", _low_retry_timeout)
+ @mock.patch("whop_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: Whop, failures_before_success: int, respx_mock: MockRouter) -> None:
client = client.with_options(max_retries=4)
@@ -823,7 +823,7 @@ def retry_handler(_request: httpx.Request) -> httpx.Response:
assert len(response.http_request.headers.get_list("x-stainless-retry-count")) == 0
@pytest.mark.parametrize("failures_before_success", [0, 2, 4])
- @mock.patch("whopsdk._base_client.BaseClient._calculate_retry_timeout", _low_retry_timeout)
+ @mock.patch("whop_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: Whop, failures_before_success: int, respx_mock: MockRouter
@@ -1085,10 +1085,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.
- "whopsdk/_legacy_response.py",
- "whopsdk/_response.py",
+ "whop_sdk/_legacy_response.py",
+ "whop_sdk/_response.py",
# pydantic.BaseModel.model_dump || pydantic.BaseModel.dict leak memory for some reason.
- "whopsdk/_compat.py",
+ "whop_sdk/_compat.py",
# Standard library leaks we don't care about.
"/logging/__init__.py",
]
@@ -1621,7 +1621,7 @@ async def test_parse_retry_after_header(self, remaining_retries: int, retry_afte
assert calculated == pytest.approx(timeout, 0.5 * 0.875) # pyright: ignore[reportUnknownMemberType]
@pytest.mark.parametrize("failures_before_success", [0, 2, 4])
- @mock.patch("whopsdk._base_client.BaseClient._calculate_retry_timeout", _low_retry_timeout)
+ @mock.patch("whop_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"])
@@ -1653,7 +1653,7 @@ def retry_handler(_request: httpx.Request) -> httpx.Response:
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("whopsdk._base_client.BaseClient._calculate_retry_timeout", _low_retry_timeout)
+ @mock.patch("whop_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(
@@ -1679,7 +1679,7 @@ def retry_handler(_request: httpx.Request) -> httpx.Response:
assert len(response.http_request.headers.get_list("x-stainless-retry-count")) == 0
@pytest.mark.parametrize("failures_before_success", [0, 2, 4])
- @mock.patch("whopsdk._base_client.BaseClient._calculate_retry_timeout", _low_retry_timeout)
+ @mock.patch("whop_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(
diff --git a/tests/test_deepcopy.py b/tests/test_deepcopy.py
index b627ef27..4fd36e32 100644
--- a/tests/test_deepcopy.py
+++ b/tests/test_deepcopy.py
@@ -1,4 +1,4 @@
-from whopsdk._utils import deepcopy_minimal
+from whop_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 350c2613..a737e4c4 100644
--- a/tests/test_extract_files.py
+++ b/tests/test_extract_files.py
@@ -4,8 +4,8 @@
import pytest
-from whopsdk._types import FileTypes
-from whopsdk._utils import extract_files
+from whop_sdk._types import FileTypes
+from whop_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 7143286b..eb04a93b 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 whopsdk._files import to_httpx_files, async_to_httpx_files
+from whop_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 37dce791..982f9b81 100644
--- a/tests/test_models.py
+++ b/tests/test_models.py
@@ -7,9 +7,9 @@
import pydantic
from pydantic import Field
-from whopsdk._utils import PropertyInfo
-from whopsdk._compat import PYDANTIC_V1, parse_obj, model_dump, model_json
-from whopsdk._models import BaseModel, construct_type
+from whop_sdk._utils import PropertyInfo
+from whop_sdk._compat import PYDANTIC_V1, parse_obj, model_dump, model_json
+from whop_sdk._models import BaseModel, construct_type
class BasicModel(BaseModel):
diff --git a/tests/test_qs.py b/tests/test_qs.py
index ed94ddb8..72377037 100644
--- a/tests/test_qs.py
+++ b/tests/test_qs.py
@@ -4,7 +4,7 @@
import pytest
-from whopsdk._qs import Querystring, stringify
+from whop_sdk._qs import Querystring, stringify
def test_empty() -> None:
diff --git a/tests/test_required_args.py b/tests/test_required_args.py
index ddd59ecc..6f850cf6 100644
--- a/tests/test_required_args.py
+++ b/tests/test_required_args.py
@@ -2,7 +2,7 @@
import pytest
-from whopsdk._utils import required_args
+from whop_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 aa15cb1e..028c6a20 100644
--- a/tests/test_response.py
+++ b/tests/test_response.py
@@ -6,8 +6,8 @@
import pytest
import pydantic
-from whopsdk import Whop, AsyncWhop, BaseModel
-from whopsdk._response import (
+from whop_sdk import Whop, AsyncWhop, BaseModel
+from whop_sdk._response import (
APIResponse,
BaseAPIResponse,
AsyncAPIResponse,
@@ -15,8 +15,8 @@
AsyncBinaryAPIResponse,
extract_response_type,
)
-from whopsdk._streaming import Stream
-from whopsdk._base_client import FinalRequestOptions
+from whop_sdk._streaming import Stream
+from whop_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)
@@ -68,7 +68,7 @@ def test_response_parse_mismatched_basemodel(client: Whop) -> None:
with pytest.raises(
TypeError,
- match="Pydantic models must subclass our base model type, e.g. `from whopsdk import BaseModel`",
+ match="Pydantic models must subclass our base model type, e.g. `from whop_sdk import BaseModel`",
):
response.parse(to=PydanticModel)
@@ -86,7 +86,7 @@ async def test_async_response_parse_mismatched_basemodel(async_client: AsyncWhop
with pytest.raises(
TypeError,
- match="Pydantic models must subclass our base model type, e.g. `from whopsdk import BaseModel`",
+ match="Pydantic models must subclass our base model type, e.g. `from whop_sdk import BaseModel`",
):
await response.parse(to=PydanticModel)
diff --git a/tests/test_streaming.py b/tests/test_streaming.py
index b56d9da8..9eeb70f9 100644
--- a/tests/test_streaming.py
+++ b/tests/test_streaming.py
@@ -5,8 +5,8 @@
import httpx
import pytest
-from whopsdk import Whop, AsyncWhop
-from whopsdk._streaming import Stream, AsyncStream, ServerSentEvent
+from whop_sdk import Whop, AsyncWhop
+from whop_sdk._streaming import Stream, AsyncStream, ServerSentEvent
@pytest.mark.asyncio
diff --git a/tests/test_transform.py b/tests/test_transform.py
index a201cd06..388f2f17 100644
--- a/tests/test_transform.py
+++ b/tests/test_transform.py
@@ -8,15 +8,15 @@
import pytest
-from whopsdk._types import Base64FileInput, omit, not_given
-from whopsdk._utils import (
+from whop_sdk._types import Base64FileInput, omit, not_given
+from whop_sdk._utils import (
PropertyInfo,
transform as _transform,
parse_datetime,
async_transform as _async_transform,
)
-from whopsdk._compat import PYDANTIC_V1
-from whopsdk._models import BaseModel
+from whop_sdk._compat import PYDANTIC_V1
+from whop_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 62b1064e..be05afd1 100644
--- a/tests/test_utils/test_datetime_parse.py
+++ b/tests/test_utils/test_datetime_parse.py
@@ -8,7 +8,7 @@
import pytest
-from whopsdk._utils import parse_date, parse_datetime
+from whop_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 b42ccaa6..e920bc5e 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 whopsdk._utils import LazyProxy
+from whop_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 1a902834..d88b700d 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 whopsdk._utils import extract_type_var_from_base
+from whop_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 95b18665..f279898c 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 whopsdk._types import Omit, NoneType
-from whopsdk._utils import (
+from whop_sdk._types import Omit, NoneType
+from whop_sdk._utils import (
is_dict,
is_list,
is_list_type,
@@ -19,8 +19,8 @@
is_annotated_type,
is_type_alias_type,
)
-from whopsdk._compat import PYDANTIC_V1, field_outer_type, get_model_fields
-from whopsdk._models import BaseModel
+from whop_sdk._compat import PYDANTIC_V1, field_outer_type, get_model_fields
+from whop_sdk._models import BaseModel
BaseModelT = TypeVar("BaseModelT", bound=BaseModel)
From 11fa531570957ba6602836ab07405cffee1b69a6 Mon Sep 17 00:00:00 2001
From: "stainless-app[bot]"
<142633134+stainless-app[bot]@users.noreply.github.com>
Date: Thu, 16 Oct 2025 15:37:06 +0000
Subject: [PATCH 05/17] codegen metadata
---
.stats.yml | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/.stats.yml b/.stats.yml
index f528b1c0..ad3ce4a5 100644
--- a/.stats.yml
+++ b/.stats.yml
@@ -1,4 +1,4 @@
configured_endpoints: 76
openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/frostedinc%2Fwhopsdk-493b08fc2ae996eaf1758fa74f56163b2e40d4e1abeaa9672b8d1a039df30d75.yml
openapi_spec_hash: 212470480a88cabb38a58b5b6867c733
-config_hash: d8da61cbd45bbc6c4ada7c0663afce12
+config_hash: 308f8c413397c11083a81dacbddd95f2
From d4e19c1fb58ee03e848c8ee36fcdc8272bb0bb9c Mon Sep 17 00:00:00 2001
From: "stainless-app[bot]"
<142633134+stainless-app[bot]@users.noreply.github.com>
Date: Thu, 16 Oct 2025 16:05:44 +0000
Subject: [PATCH 06/17] codegen metadata
---
.stats.yml | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/.stats.yml b/.stats.yml
index ad3ce4a5..3f7f73d5 100644
--- a/.stats.yml
+++ b/.stats.yml
@@ -1,4 +1,4 @@
configured_endpoints: 76
openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/frostedinc%2Fwhopsdk-493b08fc2ae996eaf1758fa74f56163b2e40d4e1abeaa9672b8d1a039df30d75.yml
openapi_spec_hash: 212470480a88cabb38a58b5b6867c733
-config_hash: 308f8c413397c11083a81dacbddd95f2
+config_hash: d72e5036b7f668d3a99a5a96248c4052
From d66c08873a123a5b65a5fa6f17e66ec6668e37a3 Mon Sep 17 00:00:00 2001
From: "stainless-app[bot]"
<142633134+stainless-app[bot]@users.noreply.github.com>
Date: Thu, 16 Oct 2025 18:24:44 +0000
Subject: [PATCH 07/17] feat(api): api update
---
.stats.yml | 4 ++--
.../resources/checkout_configurations.py | 24 +++++++++----------
.../checkout_configuration_create_params.py | 10 ++++----
.../checkout_configuration_list_response.py | 14 +++++------
.../types/shared/checkout_configuration.py | 14 +++++------
5 files changed, 33 insertions(+), 33 deletions(-)
diff --git a/.stats.yml b/.stats.yml
index 3f7f73d5..a7e90a63 100644
--- a/.stats.yml
+++ b/.stats.yml
@@ -1,4 +1,4 @@
configured_endpoints: 76
-openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/frostedinc%2Fwhopsdk-493b08fc2ae996eaf1758fa74f56163b2e40d4e1abeaa9672b8d1a039df30d75.yml
-openapi_spec_hash: 212470480a88cabb38a58b5b6867c733
+openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/frostedinc%2Fwhopsdk-3ae7c5724a6b6587099a0eb3b6f38d4e08f8e37d9496287446f05b8dd16b9eed.yml
+openapi_spec_hash: 983d5947e6bf06afdc833cec1d419881
config_hash: d72e5036b7f668d3a99a5a96248c4052
diff --git a/src/whop_sdk/resources/checkout_configurations.py b/src/whop_sdk/resources/checkout_configurations.py
index d2a63268..756aaa60 100644
--- a/src/whop_sdk/resources/checkout_configurations.py
+++ b/src/whop_sdk/resources/checkout_configurations.py
@@ -62,7 +62,7 @@ def create(
timeout: float | httpx.Timeout | None | NotGiven = not_given,
) -> CheckoutConfiguration:
"""
- Creates a new checkout session
+ Creates a new checkout configuration
Required permissions:
@@ -70,15 +70,15 @@ def create(
- `plan:create`
Args:
- affiliate_code: The affiliate code to use for the checkout session
+ affiliate_code: The affiliate code to use for the checkout configuration
- metadata: The metadata to use for the checkout session
+ metadata: The metadata to use for the checkout configuration
- plan: Pass this object to create a new plan for this checkout session
+ plan: Pass this object to create a new plan for this checkout configuration
- plan_id: The ID of the plan to use for the checkout session
+ plan_id: The ID of the plan to use for the checkout configuration
- redirect_url: The URL to redirect the user to after the checkout session is created
+ redirect_url: The URL to redirect the user to after the checkout configuration is created
extra_headers: Send extra headers
@@ -251,7 +251,7 @@ async def create(
timeout: float | httpx.Timeout | None | NotGiven = not_given,
) -> CheckoutConfiguration:
"""
- Creates a new checkout session
+ Creates a new checkout configuration
Required permissions:
@@ -259,15 +259,15 @@ async def create(
- `plan:create`
Args:
- affiliate_code: The affiliate code to use for the checkout session
+ affiliate_code: The affiliate code to use for the checkout configuration
- metadata: The metadata to use for the checkout session
+ metadata: The metadata to use for the checkout configuration
- plan: Pass this object to create a new plan for this checkout session
+ plan: Pass this object to create a new plan for this checkout configuration
- plan_id: The ID of the plan to use for the checkout session
+ plan_id: The ID of the plan to use for the checkout configuration
- redirect_url: The URL to redirect the user to after the checkout session is created
+ redirect_url: The URL to redirect the user to after the checkout configuration is created
extra_headers: Send extra headers
diff --git a/src/whop_sdk/types/checkout_configuration_create_params.py b/src/whop_sdk/types/checkout_configuration_create_params.py
index d20a63e6..4d40fff3 100644
--- a/src/whop_sdk/types/checkout_configuration_create_params.py
+++ b/src/whop_sdk/types/checkout_configuration_create_params.py
@@ -16,19 +16,19 @@
class CheckoutConfigurationCreateParams(TypedDict, total=False):
affiliate_code: Optional[str]
- """The affiliate code to use for the checkout session"""
+ """The affiliate code to use for the checkout configuration"""
metadata: Optional[Dict[str, object]]
- """The metadata to use for the checkout session"""
+ """The metadata to use for the checkout configuration"""
plan: Optional[Plan]
- """Pass this object to create a new plan for this checkout session"""
+ """Pass this object to create a new plan for this checkout configuration"""
plan_id: Optional[str]
- """The ID of the plan to use for the checkout session"""
+ """The ID of the plan to use for the checkout configuration"""
redirect_url: Optional[str]
- """The URL to redirect the user to after the checkout session is created"""
+ """The URL to redirect the user to after the checkout configuration is created"""
class PlanCustomField(TypedDict, total=False):
diff --git a/src/whop_sdk/types/checkout_configuration_list_response.py b/src/whop_sdk/types/checkout_configuration_list_response.py
index b8582b94..6f3d261b 100644
--- a/src/whop_sdk/types/checkout_configuration_list_response.py
+++ b/src/whop_sdk/types/checkout_configuration_list_response.py
@@ -45,22 +45,22 @@ class Plan(BaseModel):
class CheckoutConfigurationListResponse(BaseModel):
id: str
- """The ID of the checkout session"""
+ """The ID of the checkout configuration"""
affiliate_code: str
- """The affiliate code to use for the checkout session"""
+ """The affiliate code to use for the checkout configuration"""
company_id: str
- """The ID of the company to use for the checkout session"""
+ """The ID of the company to use for the checkout configuration"""
metadata: Dict[str, object]
- """The metadata to use for the checkout session"""
+ """The metadata to use for the checkout configuration"""
plan: Plan
- """The plan to use for the checkout session"""
+ """The plan to use for the checkout configuration"""
purchase_url: str
- """The URL to redirect the user to after the checkout session is created"""
+ """The URL to redirect the user to after the checkout configuration is created"""
redirect_url: str
- """The URL to redirect the user to after the checkout session is created"""
+ """The URL to redirect the user to after the checkout configuration is created"""
diff --git a/src/whop_sdk/types/shared/checkout_configuration.py b/src/whop_sdk/types/shared/checkout_configuration.py
index a30b9e9b..31f8eab2 100644
--- a/src/whop_sdk/types/shared/checkout_configuration.py
+++ b/src/whop_sdk/types/shared/checkout_configuration.py
@@ -45,22 +45,22 @@ class Plan(BaseModel):
class CheckoutConfiguration(BaseModel):
id: str
- """The ID of the checkout session"""
+ """The ID of the checkout configuration"""
affiliate_code: str
- """The affiliate code to use for the checkout session"""
+ """The affiliate code to use for the checkout configuration"""
company_id: str
- """The ID of the company to use for the checkout session"""
+ """The ID of the company to use for the checkout configuration"""
metadata: Dict[str, object]
- """The metadata to use for the checkout session"""
+ """The metadata to use for the checkout configuration"""
plan: Plan
- """The plan to use for the checkout session"""
+ """The plan to use for the checkout configuration"""
purchase_url: str
- """The URL to redirect the user to after the checkout session is created"""
+ """The URL to redirect the user to after the checkout configuration is created"""
redirect_url: str
- """The URL to redirect the user to after the checkout session is created"""
+ """The URL to redirect the user to after the checkout configuration is created"""
From af1c24bd7e8aab7c7d773574d79e208d25187829 Mon Sep 17 00:00:00 2001
From: "stainless-app[bot]"
<142633134+stainless-app[bot]@users.noreply.github.com>
Date: Thu, 16 Oct 2025 21:24:37 +0000
Subject: [PATCH 08/17] codegen metadata
---
.stats.yml | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/.stats.yml b/.stats.yml
index a7e90a63..4257150e 100644
--- a/.stats.yml
+++ b/.stats.yml
@@ -1,4 +1,4 @@
configured_endpoints: 76
-openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/frostedinc%2Fwhopsdk-3ae7c5724a6b6587099a0eb3b6f38d4e08f8e37d9496287446f05b8dd16b9eed.yml
-openapi_spec_hash: 983d5947e6bf06afdc833cec1d419881
+openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/frostedinc%2Fwhopsdk-5aff848f75cde8300a1b01c1ebebded1c34bcd85fafc8d26f4204734ddcd7033.yml
+openapi_spec_hash: 50a91399b8d58d89ca97d3007571a5fa
config_hash: d72e5036b7f668d3a99a5a96248c4052
From e0bea9ff169b03e85ba7111ccd7cbe1f4a1eb4cf Mon Sep 17 00:00:00 2001
From: "stainless-app[bot]"
<142633134+stainless-app[bot]@users.noreply.github.com>
Date: Thu, 16 Oct 2025 21:33:52 +0000
Subject: [PATCH 09/17] feat(api): manual updates
---
.stats.yml | 4 +-
api.md | 34 ++
src/whop_sdk/_client.py | 18 +
src/whop_sdk/resources/__init__.py | 28 ++
src/whop_sdk/resources/forums.py | 446 ++++++++++++++++++
src/whop_sdk/resources/members.py | 421 +++++++++++++++++
src/whop_sdk/types/__init__.py | 13 +
src/whop_sdk/types/forum_list_params.py | 28 ++
src/whop_sdk/types/forum_list_response.py | 33 ++
src/whop_sdk/types/forum_update_params.py | 23 +
src/whop_sdk/types/member_list_params.py | 70 +++
src/whop_sdk/types/member_list_response.py | 65 +++
.../types/member_retrieve_response.py | 79 ++++
src/whop_sdk/types/shared/__init__.py | 7 +
src/whop_sdk/types/shared/access_level.py | 7 +
.../shared/email_notification_preferences.py | 7 +
src/whop_sdk/types/shared/forum.py | 33 ++
.../shared/member_most_recent_actions.py | 22 +
src/whop_sdk/types/shared/member_statuses.py | 7 +
.../types/shared/who_can_comment_types.py | 7 +
.../types/shared/who_can_post_types.py | 7 +
src/whop_sdk/types/shared_params/__init__.py | 6 +
.../types/shared_params/access_level.py | 9 +
.../email_notification_preferences.py | 9 +
.../member_most_recent_actions.py | 24 +
.../types/shared_params/member_statuses.py | 9 +
.../shared_params/who_can_comment_types.py | 9 +
.../types/shared_params/who_can_post_types.py | 9 +
.../types/user_check_access_response.py | 5 +-
tests/api_resources/test_forums.py | 310 ++++++++++++
tests/api_resources/test_members.py | 224 +++++++++
31 files changed, 1968 insertions(+), 5 deletions(-)
create mode 100644 src/whop_sdk/resources/forums.py
create mode 100644 src/whop_sdk/resources/members.py
create mode 100644 src/whop_sdk/types/forum_list_params.py
create mode 100644 src/whop_sdk/types/forum_list_response.py
create mode 100644 src/whop_sdk/types/forum_update_params.py
create mode 100644 src/whop_sdk/types/member_list_params.py
create mode 100644 src/whop_sdk/types/member_list_response.py
create mode 100644 src/whop_sdk/types/member_retrieve_response.py
create mode 100644 src/whop_sdk/types/shared/access_level.py
create mode 100644 src/whop_sdk/types/shared/email_notification_preferences.py
create mode 100644 src/whop_sdk/types/shared/forum.py
create mode 100644 src/whop_sdk/types/shared/member_most_recent_actions.py
create mode 100644 src/whop_sdk/types/shared/member_statuses.py
create mode 100644 src/whop_sdk/types/shared/who_can_comment_types.py
create mode 100644 src/whop_sdk/types/shared/who_can_post_types.py
create mode 100644 src/whop_sdk/types/shared_params/access_level.py
create mode 100644 src/whop_sdk/types/shared_params/email_notification_preferences.py
create mode 100644 src/whop_sdk/types/shared_params/member_most_recent_actions.py
create mode 100644 src/whop_sdk/types/shared_params/member_statuses.py
create mode 100644 src/whop_sdk/types/shared_params/who_can_comment_types.py
create mode 100644 src/whop_sdk/types/shared_params/who_can_post_types.py
create mode 100644 tests/api_resources/test_forums.py
create mode 100644 tests/api_resources/test_members.py
diff --git a/.stats.yml b/.stats.yml
index 4257150e..225b5482 100644
--- a/.stats.yml
+++ b/.stats.yml
@@ -1,4 +1,4 @@
-configured_endpoints: 76
+configured_endpoints: 81
openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/frostedinc%2Fwhopsdk-5aff848f75cde8300a1b01c1ebebded1c34bcd85fafc8d26f4204734ddcd7033.yml
openapi_spec_hash: 50a91399b8d58d89ca97d3007571a5fa
-config_hash: d72e5036b7f668d3a99a5a96248c4052
+config_hash: 335abeb0dd84526555f7d83ddb84af97
diff --git a/api.md b/api.md
index 11565652..7f71baa3 100644
--- a/api.md
+++ b/api.md
@@ -2,6 +2,7 @@
```python
from whop_sdk.types import (
+ AccessLevel,
AccessPassType,
App,
AppBuild,
@@ -21,9 +22,11 @@ from whop_sdk.types import (
CustomCta,
Direction,
DmsPostTypes,
+ EmailNotificationPreferences,
Entry,
EntryStatus,
Experience,
+ Forum,
ForumPost,
FriendlyReceiptStatus,
GlobalAffiliateStatus,
@@ -31,6 +34,8 @@ from whop_sdk.types import (
Invoice,
InvoiceListItem,
InvoiceStatus,
+ MemberMostRecentActions,
+ MemberStatuses,
Membership,
MembershipStatus,
Message,
@@ -53,7 +58,9 @@ from whop_sdk.types import (
Transfer,
Visibility,
VisibilityFilter,
+ WhoCanCommentTypes,
WhoCanPost,
+ WhoCanPostTypes,
WhoCanReact,
)
```
@@ -377,3 +384,30 @@ Methods:
- client.reactions.create(\*\*params) -> Reaction
- client.reactions.retrieve(id) -> Reaction
- client.reactions.list(\*\*params) -> SyncCursorPage[ReactionListResponse]
+
+# Members
+
+Types:
+
+```python
+from whop_sdk.types import MemberRetrieveResponse, MemberListResponse
+```
+
+Methods:
+
+- client.members.retrieve(id) -> MemberRetrieveResponse
+- client.members.list(\*\*params) -> SyncCursorPage[MemberListResponse]
+
+# Forums
+
+Types:
+
+```python
+from whop_sdk.types import ForumListResponse
+```
+
+Methods:
+
+- client.forums.retrieve(id) -> Forum
+- client.forums.update(id, \*\*params) -> Forum
+- client.forums.list(\*\*params) -> SyncCursorPage[ForumListResponse]
diff --git a/src/whop_sdk/_client.py b/src/whop_sdk/_client.py
index 68216b31..196ca7fb 100644
--- a/src/whop_sdk/_client.py
+++ b/src/whop_sdk/_client.py
@@ -25,7 +25,9 @@
apps,
plans,
users,
+ forums,
entries,
+ members,
invoices,
messages,
payments,
@@ -81,6 +83,8 @@ class Whop(SyncAPIClient):
support_channels: support_channels.SupportChannelsResource
experiences: experiences.ExperiencesResource
reactions: reactions.ReactionsResource
+ members: members.MembersResource
+ forums: forums.ForumsResource
with_raw_response: WhopWithRawResponse
with_streaming_response: WhopWithStreamedResponse
@@ -180,6 +184,8 @@ def __init__(
self.support_channels = support_channels.SupportChannelsResource(self)
self.experiences = experiences.ExperiencesResource(self)
self.reactions = reactions.ReactionsResource(self)
+ self.members = members.MembersResource(self)
+ self.forums = forums.ForumsResource(self)
self.with_raw_response = WhopWithRawResponse(self)
self.with_streaming_response = WhopWithStreamedResponse(self)
@@ -317,6 +323,8 @@ class AsyncWhop(AsyncAPIClient):
support_channels: support_channels.AsyncSupportChannelsResource
experiences: experiences.AsyncExperiencesResource
reactions: reactions.AsyncReactionsResource
+ members: members.AsyncMembersResource
+ forums: forums.AsyncForumsResource
with_raw_response: AsyncWhopWithRawResponse
with_streaming_response: AsyncWhopWithStreamedResponse
@@ -416,6 +424,8 @@ def __init__(
self.support_channels = support_channels.AsyncSupportChannelsResource(self)
self.experiences = experiences.AsyncExperiencesResource(self)
self.reactions = reactions.AsyncReactionsResource(self)
+ self.members = members.AsyncMembersResource(self)
+ self.forums = forums.AsyncForumsResource(self)
self.with_raw_response = AsyncWhopWithRawResponse(self)
self.with_streaming_response = AsyncWhopWithStreamedResponse(self)
@@ -557,6 +567,8 @@ def __init__(self, client: Whop) -> None:
self.support_channels = support_channels.SupportChannelsResourceWithRawResponse(client.support_channels)
self.experiences = experiences.ExperiencesResourceWithRawResponse(client.experiences)
self.reactions = reactions.ReactionsResourceWithRawResponse(client.reactions)
+ self.members = members.MembersResourceWithRawResponse(client.members)
+ self.forums = forums.ForumsResourceWithRawResponse(client.forums)
class AsyncWhopWithRawResponse:
@@ -589,6 +601,8 @@ def __init__(self, client: AsyncWhop) -> None:
self.support_channels = support_channels.AsyncSupportChannelsResourceWithRawResponse(client.support_channels)
self.experiences = experiences.AsyncExperiencesResourceWithRawResponse(client.experiences)
self.reactions = reactions.AsyncReactionsResourceWithRawResponse(client.reactions)
+ self.members = members.AsyncMembersResourceWithRawResponse(client.members)
+ self.forums = forums.AsyncForumsResourceWithRawResponse(client.forums)
class WhopWithStreamedResponse:
@@ -621,6 +635,8 @@ def __init__(self, client: Whop) -> None:
self.support_channels = support_channels.SupportChannelsResourceWithStreamingResponse(client.support_channels)
self.experiences = experiences.ExperiencesResourceWithStreamingResponse(client.experiences)
self.reactions = reactions.ReactionsResourceWithStreamingResponse(client.reactions)
+ self.members = members.MembersResourceWithStreamingResponse(client.members)
+ self.forums = forums.ForumsResourceWithStreamingResponse(client.forums)
class AsyncWhopWithStreamedResponse:
@@ -657,6 +673,8 @@ def __init__(self, client: AsyncWhop) -> None:
)
self.experiences = experiences.AsyncExperiencesResourceWithStreamingResponse(client.experiences)
self.reactions = reactions.AsyncReactionsResourceWithStreamingResponse(client.reactions)
+ self.members = members.AsyncMembersResourceWithStreamingResponse(client.members)
+ self.forums = forums.AsyncForumsResourceWithStreamingResponse(client.forums)
Client = Whop
diff --git a/src/whop_sdk/resources/__init__.py b/src/whop_sdk/resources/__init__.py
index 44113820..f3d55211 100644
--- a/src/whop_sdk/resources/__init__.py
+++ b/src/whop_sdk/resources/__init__.py
@@ -24,6 +24,14 @@
UsersResourceWithStreamingResponse,
AsyncUsersResourceWithStreamingResponse,
)
+from .forums import (
+ ForumsResource,
+ AsyncForumsResource,
+ ForumsResourceWithRawResponse,
+ AsyncForumsResourceWithRawResponse,
+ ForumsResourceWithStreamingResponse,
+ AsyncForumsResourceWithStreamingResponse,
+)
from .entries import (
EntriesResource,
AsyncEntriesResource,
@@ -32,6 +40,14 @@
EntriesResourceWithStreamingResponse,
AsyncEntriesResourceWithStreamingResponse,
)
+from .members import (
+ MembersResource,
+ AsyncMembersResource,
+ MembersResourceWithRawResponse,
+ AsyncMembersResourceWithRawResponse,
+ MembersResourceWithStreamingResponse,
+ AsyncMembersResourceWithStreamingResponse,
+)
from .invoices import (
InvoicesResource,
AsyncInvoicesResource,
@@ -313,4 +329,16 @@
"AsyncReactionsResourceWithRawResponse",
"ReactionsResourceWithStreamingResponse",
"AsyncReactionsResourceWithStreamingResponse",
+ "MembersResource",
+ "AsyncMembersResource",
+ "MembersResourceWithRawResponse",
+ "AsyncMembersResourceWithRawResponse",
+ "MembersResourceWithStreamingResponse",
+ "AsyncMembersResourceWithStreamingResponse",
+ "ForumsResource",
+ "AsyncForumsResource",
+ "ForumsResourceWithRawResponse",
+ "AsyncForumsResourceWithRawResponse",
+ "ForumsResourceWithStreamingResponse",
+ "AsyncForumsResourceWithStreamingResponse",
]
diff --git a/src/whop_sdk/resources/forums.py b/src/whop_sdk/resources/forums.py
new file mode 100644
index 00000000..57c19dfa
--- /dev/null
+++ b/src/whop_sdk/resources/forums.py
@@ -0,0 +1,446 @@
+# File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.
+
+from __future__ import annotations
+
+from typing import Optional
+
+import httpx
+
+from ..types import forum_list_params, forum_update_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 ..pagination import SyncCursorPage, AsyncCursorPage
+from .._base_client import AsyncPaginator, make_request_options
+from ..types.shared.forum import Forum
+from ..types.forum_list_response import ForumListResponse
+from ..types.shared.who_can_post_types import WhoCanPostTypes
+from ..types.shared.who_can_comment_types import WhoCanCommentTypes
+from ..types.shared.email_notification_preferences import EmailNotificationPreferences
+
+__all__ = ["ForumsResource", "AsyncForumsResource"]
+
+
+class ForumsResource(SyncAPIResource):
+ @cached_property
+ def with_raw_response(self) -> ForumsResourceWithRawResponse:
+ """
+ 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/whopio/whopsdk-python#accessing-raw-response-data-eg-headers
+ """
+ return ForumsResourceWithRawResponse(self)
+
+ @cached_property
+ def with_streaming_response(self) -> ForumsResourceWithStreamingResponse:
+ """
+ An alternative to `.with_raw_response` that doesn't eagerly read the response body.
+
+ For more information, see https://www.github.com/whopio/whopsdk-python#with_streaming_response
+ """
+ return ForumsResourceWithStreamingResponse(self)
+
+ def retrieve(
+ self,
+ 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,
+ ) -> Forum:
+ """
+ Retrieves a forum
+
+ Required permissions:
+
+ - `forum:read`
+
+ 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 id:
+ raise ValueError(f"Expected a non-empty value for `id` but received {id!r}")
+ return self._get(
+ f"/forums/{id}",
+ options=make_request_options(
+ extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout
+ ),
+ cast_to=Forum,
+ )
+
+ def update(
+ self,
+ id: str,
+ *,
+ email_notification_preference: Optional[EmailNotificationPreferences] | Omit = omit,
+ who_can_comment: Optional[WhoCanCommentTypes] | Omit = omit,
+ who_can_post: Optional[WhoCanPostTypes] | 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,
+ ) -> Forum:
+ """
+ Updates a forum
+
+ Required permissions:
+
+ - `forum:moderate`
+
+ Args:
+ email_notification_preference: Email notification preference option for a forum feed
+
+ who_can_comment: Who can comment on a forum feed
+
+ who_can_post: Who can post on a forum feed
+
+ 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 id:
+ raise ValueError(f"Expected a non-empty value for `id` but received {id!r}")
+ return self._patch(
+ f"/forums/{id}",
+ body=maybe_transform(
+ {
+ "email_notification_preference": email_notification_preference,
+ "who_can_comment": who_can_comment,
+ "who_can_post": who_can_post,
+ },
+ forum_update_params.ForumUpdateParams,
+ ),
+ options=make_request_options(
+ extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout
+ ),
+ cast_to=Forum,
+ )
+
+ def list(
+ self,
+ *,
+ company_id: str,
+ after: Optional[str] | Omit = omit,
+ before: Optional[str] | Omit = omit,
+ first: Optional[int] | Omit = omit,
+ last: Optional[int] | Omit = omit,
+ product_id: Optional[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,
+ ) -> SyncCursorPage[ForumListResponse]:
+ """
+ Lists forums inside a company
+
+ Required permissions:
+
+ - `forum:read`
+
+ Args:
+ company_id: The ID of the company to list forums for
+
+ after: Returns the elements in the list that come after the specified cursor.
+
+ before: Returns the elements in the list that come before the specified cursor.
+
+ first: Returns the first _n_ elements from the list.
+
+ last: Returns the last _n_ elements from the list.
+
+ product_id: If provided, only forums connected to this product are returned
+
+ 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_api_list(
+ "/forums",
+ page=SyncCursorPage[ForumListResponse],
+ options=make_request_options(
+ extra_headers=extra_headers,
+ extra_query=extra_query,
+ extra_body=extra_body,
+ timeout=timeout,
+ query=maybe_transform(
+ {
+ "company_id": company_id,
+ "after": after,
+ "before": before,
+ "first": first,
+ "last": last,
+ "product_id": product_id,
+ },
+ forum_list_params.ForumListParams,
+ ),
+ ),
+ model=ForumListResponse,
+ )
+
+
+class AsyncForumsResource(AsyncAPIResource):
+ @cached_property
+ def with_raw_response(self) -> AsyncForumsResourceWithRawResponse:
+ """
+ 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/whopio/whopsdk-python#accessing-raw-response-data-eg-headers
+ """
+ return AsyncForumsResourceWithRawResponse(self)
+
+ @cached_property
+ def with_streaming_response(self) -> AsyncForumsResourceWithStreamingResponse:
+ """
+ An alternative to `.with_raw_response` that doesn't eagerly read the response body.
+
+ For more information, see https://www.github.com/whopio/whopsdk-python#with_streaming_response
+ """
+ return AsyncForumsResourceWithStreamingResponse(self)
+
+ async def retrieve(
+ self,
+ 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,
+ ) -> Forum:
+ """
+ Retrieves a forum
+
+ Required permissions:
+
+ - `forum:read`
+
+ 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 id:
+ raise ValueError(f"Expected a non-empty value for `id` but received {id!r}")
+ return await self._get(
+ f"/forums/{id}",
+ options=make_request_options(
+ extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout
+ ),
+ cast_to=Forum,
+ )
+
+ async def update(
+ self,
+ id: str,
+ *,
+ email_notification_preference: Optional[EmailNotificationPreferences] | Omit = omit,
+ who_can_comment: Optional[WhoCanCommentTypes] | Omit = omit,
+ who_can_post: Optional[WhoCanPostTypes] | 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,
+ ) -> Forum:
+ """
+ Updates a forum
+
+ Required permissions:
+
+ - `forum:moderate`
+
+ Args:
+ email_notification_preference: Email notification preference option for a forum feed
+
+ who_can_comment: Who can comment on a forum feed
+
+ who_can_post: Who can post on a forum feed
+
+ 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 id:
+ raise ValueError(f"Expected a non-empty value for `id` but received {id!r}")
+ return await self._patch(
+ f"/forums/{id}",
+ body=await async_maybe_transform(
+ {
+ "email_notification_preference": email_notification_preference,
+ "who_can_comment": who_can_comment,
+ "who_can_post": who_can_post,
+ },
+ forum_update_params.ForumUpdateParams,
+ ),
+ options=make_request_options(
+ extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout
+ ),
+ cast_to=Forum,
+ )
+
+ def list(
+ self,
+ *,
+ company_id: str,
+ after: Optional[str] | Omit = omit,
+ before: Optional[str] | Omit = omit,
+ first: Optional[int] | Omit = omit,
+ last: Optional[int] | Omit = omit,
+ product_id: Optional[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,
+ ) -> AsyncPaginator[ForumListResponse, AsyncCursorPage[ForumListResponse]]:
+ """
+ Lists forums inside a company
+
+ Required permissions:
+
+ - `forum:read`
+
+ Args:
+ company_id: The ID of the company to list forums for
+
+ after: Returns the elements in the list that come after the specified cursor.
+
+ before: Returns the elements in the list that come before the specified cursor.
+
+ first: Returns the first _n_ elements from the list.
+
+ last: Returns the last _n_ elements from the list.
+
+ product_id: If provided, only forums connected to this product are returned
+
+ 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_api_list(
+ "/forums",
+ page=AsyncCursorPage[ForumListResponse],
+ options=make_request_options(
+ extra_headers=extra_headers,
+ extra_query=extra_query,
+ extra_body=extra_body,
+ timeout=timeout,
+ query=maybe_transform(
+ {
+ "company_id": company_id,
+ "after": after,
+ "before": before,
+ "first": first,
+ "last": last,
+ "product_id": product_id,
+ },
+ forum_list_params.ForumListParams,
+ ),
+ ),
+ model=ForumListResponse,
+ )
+
+
+class ForumsResourceWithRawResponse:
+ def __init__(self, forums: ForumsResource) -> None:
+ self._forums = forums
+
+ self.retrieve = to_raw_response_wrapper(
+ forums.retrieve,
+ )
+ self.update = to_raw_response_wrapper(
+ forums.update,
+ )
+ self.list = to_raw_response_wrapper(
+ forums.list,
+ )
+
+
+class AsyncForumsResourceWithRawResponse:
+ def __init__(self, forums: AsyncForumsResource) -> None:
+ self._forums = forums
+
+ self.retrieve = async_to_raw_response_wrapper(
+ forums.retrieve,
+ )
+ self.update = async_to_raw_response_wrapper(
+ forums.update,
+ )
+ self.list = async_to_raw_response_wrapper(
+ forums.list,
+ )
+
+
+class ForumsResourceWithStreamingResponse:
+ def __init__(self, forums: ForumsResource) -> None:
+ self._forums = forums
+
+ self.retrieve = to_streamed_response_wrapper(
+ forums.retrieve,
+ )
+ self.update = to_streamed_response_wrapper(
+ forums.update,
+ )
+ self.list = to_streamed_response_wrapper(
+ forums.list,
+ )
+
+
+class AsyncForumsResourceWithStreamingResponse:
+ def __init__(self, forums: AsyncForumsResource) -> None:
+ self._forums = forums
+
+ self.retrieve = async_to_streamed_response_wrapper(
+ forums.retrieve,
+ )
+ self.update = async_to_streamed_response_wrapper(
+ forums.update,
+ )
+ self.list = async_to_streamed_response_wrapper(
+ forums.list,
+ )
diff --git a/src/whop_sdk/resources/members.py b/src/whop_sdk/resources/members.py
new file mode 100644
index 00000000..5cf6f0cf
--- /dev/null
+++ b/src/whop_sdk/resources/members.py
@@ -0,0 +1,421 @@
+# File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.
+
+from __future__ import annotations
+
+from typing import List, Union, Optional
+from datetime import datetime
+from typing_extensions import Literal
+
+import httpx
+
+from ..types import member_list_params
+from .._types import Body, Omit, Query, Headers, NotGiven, SequenceNotStr, omit, not_given
+from .._utils import 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 ..pagination import SyncCursorPage, AsyncCursorPage
+from .._base_client import AsyncPaginator, make_request_options
+from ..types.shared.direction import Direction
+from ..types.shared.access_level import AccessLevel
+from ..types.member_list_response import MemberListResponse
+from ..types.shared.member_statuses import MemberStatuses
+from ..types.member_retrieve_response import MemberRetrieveResponse
+from ..types.shared.member_most_recent_actions import MemberMostRecentActions
+
+__all__ = ["MembersResource", "AsyncMembersResource"]
+
+
+class MembersResource(SyncAPIResource):
+ @cached_property
+ def with_raw_response(self) -> MembersResourceWithRawResponse:
+ """
+ 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/whopio/whopsdk-python#accessing-raw-response-data-eg-headers
+ """
+ return MembersResourceWithRawResponse(self)
+
+ @cached_property
+ def with_streaming_response(self) -> MembersResourceWithStreamingResponse:
+ """
+ An alternative to `.with_raw_response` that doesn't eagerly read the response body.
+
+ For more information, see https://www.github.com/whopio/whopsdk-python#with_streaming_response
+ """
+ return MembersResourceWithStreamingResponse(self)
+
+ def retrieve(
+ self,
+ 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,
+ ) -> MemberRetrieveResponse:
+ """
+ Retrieves a member of a company by ID
+
+ Required permissions:
+
+ - `member:basic:read`
+ - `member:email:read`
+ - `member:phone:read`
+
+ 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 id:
+ raise ValueError(f"Expected a non-empty value for `id` but received {id!r}")
+ return self._get(
+ f"/members/{id}",
+ options=make_request_options(
+ extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout
+ ),
+ cast_to=MemberRetrieveResponse,
+ )
+
+ def list(
+ self,
+ *,
+ company_id: str,
+ access_level: Optional[AccessLevel] | Omit = omit,
+ access_pass_ids: Optional[SequenceNotStr[str]] | Omit = omit,
+ after: Optional[str] | Omit = omit,
+ before: Optional[str] | Omit = omit,
+ created_after: Union[str, datetime, None] | Omit = omit,
+ created_before: Union[str, datetime, None] | Omit = omit,
+ direction: Optional[Direction] | Omit = omit,
+ first: Optional[int] | Omit = omit,
+ last: Optional[int] | Omit = omit,
+ most_recent_actions: Optional[List[MemberMostRecentActions]] | Omit = omit,
+ order: Optional[Literal["id", "usd_total_spent", "created_at", "joined_at", "most_recent_action"]]
+ | Omit = omit,
+ plan_ids: Optional[SequenceNotStr[str]] | Omit = omit,
+ promo_code_ids: Optional[SequenceNotStr[str]] | Omit = omit,
+ query: Optional[str] | Omit = omit,
+ statuses: Optional[List[MemberStatuses]] | 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,
+ ) -> SyncCursorPage[MemberListResponse]:
+ """
+ List the members of a company
+
+ Required permissions:
+
+ - `member:basic:read`
+ - `member:email:read`
+ - `member:phone:read`
+
+ Args:
+ company_id: The ID of the company to list members for
+
+ access_level: The access level a given user (or company) has to an access pass or company.
+
+ access_pass_ids: The access pass IDs to filter the members by
+
+ after: Returns the elements in the list that come after the specified cursor.
+
+ before: Returns the elements in the list that come before the specified cursor.
+
+ created_after: The minimum creation date to filter by
+
+ created_before: The maximum creation date to filter by
+
+ direction: The direction of the sort.
+
+ first: Returns the first _n_ elements from the list.
+
+ last: Returns the last _n_ elements from the list.
+
+ most_recent_actions: The most recent actions to filter the members by
+
+ order: Which columns can be used to sort.
+
+ plan_ids: The plan IDs to filter the members by
+
+ promo_code_ids: The promo code IDs to filter the members by
+
+ query: The name, username, or email to filter the members by. The email filter will
+ only apply if the current actor has the `member:email:read` permission.
+
+ statuses: The statuses to filter the members by
+
+ 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_api_list(
+ "/members",
+ page=SyncCursorPage[MemberListResponse],
+ options=make_request_options(
+ extra_headers=extra_headers,
+ extra_query=extra_query,
+ extra_body=extra_body,
+ timeout=timeout,
+ query=maybe_transform(
+ {
+ "company_id": company_id,
+ "access_level": access_level,
+ "access_pass_ids": access_pass_ids,
+ "after": after,
+ "before": before,
+ "created_after": created_after,
+ "created_before": created_before,
+ "direction": direction,
+ "first": first,
+ "last": last,
+ "most_recent_actions": most_recent_actions,
+ "order": order,
+ "plan_ids": plan_ids,
+ "promo_code_ids": promo_code_ids,
+ "query": query,
+ "statuses": statuses,
+ },
+ member_list_params.MemberListParams,
+ ),
+ ),
+ model=MemberListResponse,
+ )
+
+
+class AsyncMembersResource(AsyncAPIResource):
+ @cached_property
+ def with_raw_response(self) -> AsyncMembersResourceWithRawResponse:
+ """
+ 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/whopio/whopsdk-python#accessing-raw-response-data-eg-headers
+ """
+ return AsyncMembersResourceWithRawResponse(self)
+
+ @cached_property
+ def with_streaming_response(self) -> AsyncMembersResourceWithStreamingResponse:
+ """
+ An alternative to `.with_raw_response` that doesn't eagerly read the response body.
+
+ For more information, see https://www.github.com/whopio/whopsdk-python#with_streaming_response
+ """
+ return AsyncMembersResourceWithStreamingResponse(self)
+
+ async def retrieve(
+ self,
+ 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,
+ ) -> MemberRetrieveResponse:
+ """
+ Retrieves a member of a company by ID
+
+ Required permissions:
+
+ - `member:basic:read`
+ - `member:email:read`
+ - `member:phone:read`
+
+ 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 id:
+ raise ValueError(f"Expected a non-empty value for `id` but received {id!r}")
+ return await self._get(
+ f"/members/{id}",
+ options=make_request_options(
+ extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout
+ ),
+ cast_to=MemberRetrieveResponse,
+ )
+
+ def list(
+ self,
+ *,
+ company_id: str,
+ access_level: Optional[AccessLevel] | Omit = omit,
+ access_pass_ids: Optional[SequenceNotStr[str]] | Omit = omit,
+ after: Optional[str] | Omit = omit,
+ before: Optional[str] | Omit = omit,
+ created_after: Union[str, datetime, None] | Omit = omit,
+ created_before: Union[str, datetime, None] | Omit = omit,
+ direction: Optional[Direction] | Omit = omit,
+ first: Optional[int] | Omit = omit,
+ last: Optional[int] | Omit = omit,
+ most_recent_actions: Optional[List[MemberMostRecentActions]] | Omit = omit,
+ order: Optional[Literal["id", "usd_total_spent", "created_at", "joined_at", "most_recent_action"]]
+ | Omit = omit,
+ plan_ids: Optional[SequenceNotStr[str]] | Omit = omit,
+ promo_code_ids: Optional[SequenceNotStr[str]] | Omit = omit,
+ query: Optional[str] | Omit = omit,
+ statuses: Optional[List[MemberStatuses]] | 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,
+ ) -> AsyncPaginator[MemberListResponse, AsyncCursorPage[MemberListResponse]]:
+ """
+ List the members of a company
+
+ Required permissions:
+
+ - `member:basic:read`
+ - `member:email:read`
+ - `member:phone:read`
+
+ Args:
+ company_id: The ID of the company to list members for
+
+ access_level: The access level a given user (or company) has to an access pass or company.
+
+ access_pass_ids: The access pass IDs to filter the members by
+
+ after: Returns the elements in the list that come after the specified cursor.
+
+ before: Returns the elements in the list that come before the specified cursor.
+
+ created_after: The minimum creation date to filter by
+
+ created_before: The maximum creation date to filter by
+
+ direction: The direction of the sort.
+
+ first: Returns the first _n_ elements from the list.
+
+ last: Returns the last _n_ elements from the list.
+
+ most_recent_actions: The most recent actions to filter the members by
+
+ order: Which columns can be used to sort.
+
+ plan_ids: The plan IDs to filter the members by
+
+ promo_code_ids: The promo code IDs to filter the members by
+
+ query: The name, username, or email to filter the members by. The email filter will
+ only apply if the current actor has the `member:email:read` permission.
+
+ statuses: The statuses to filter the members by
+
+ 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_api_list(
+ "/members",
+ page=AsyncCursorPage[MemberListResponse],
+ options=make_request_options(
+ extra_headers=extra_headers,
+ extra_query=extra_query,
+ extra_body=extra_body,
+ timeout=timeout,
+ query=maybe_transform(
+ {
+ "company_id": company_id,
+ "access_level": access_level,
+ "access_pass_ids": access_pass_ids,
+ "after": after,
+ "before": before,
+ "created_after": created_after,
+ "created_before": created_before,
+ "direction": direction,
+ "first": first,
+ "last": last,
+ "most_recent_actions": most_recent_actions,
+ "order": order,
+ "plan_ids": plan_ids,
+ "promo_code_ids": promo_code_ids,
+ "query": query,
+ "statuses": statuses,
+ },
+ member_list_params.MemberListParams,
+ ),
+ ),
+ model=MemberListResponse,
+ )
+
+
+class MembersResourceWithRawResponse:
+ def __init__(self, members: MembersResource) -> None:
+ self._members = members
+
+ self.retrieve = to_raw_response_wrapper(
+ members.retrieve,
+ )
+ self.list = to_raw_response_wrapper(
+ members.list,
+ )
+
+
+class AsyncMembersResourceWithRawResponse:
+ def __init__(self, members: AsyncMembersResource) -> None:
+ self._members = members
+
+ self.retrieve = async_to_raw_response_wrapper(
+ members.retrieve,
+ )
+ self.list = async_to_raw_response_wrapper(
+ members.list,
+ )
+
+
+class MembersResourceWithStreamingResponse:
+ def __init__(self, members: MembersResource) -> None:
+ self._members = members
+
+ self.retrieve = to_streamed_response_wrapper(
+ members.retrieve,
+ )
+ self.list = to_streamed_response_wrapper(
+ members.list,
+ )
+
+
+class AsyncMembersResourceWithStreamingResponse:
+ def __init__(self, members: AsyncMembersResource) -> None:
+ self._members = members
+
+ self.retrieve = async_to_streamed_response_wrapper(
+ members.retrieve,
+ )
+ self.list = async_to_streamed_response_wrapper(
+ members.list,
+ )
diff --git a/src/whop_sdk/types/__init__.py b/src/whop_sdk/types/__init__.py
index f1d170f3..a10186aa 100644
--- a/src/whop_sdk/types/__init__.py
+++ b/src/whop_sdk/types/__init__.py
@@ -6,6 +6,7 @@
App as App,
Plan as Plan,
Entry as Entry,
+ Forum as Forum,
Company as Company,
Invoice as Invoice,
Message as Message,
@@ -27,6 +28,7 @@
Membership as Membership,
Visibility as Visibility,
WhoCanPost as WhoCanPost,
+ AccessLevel as AccessLevel,
AppStatuses as AppStatuses,
AppViewType as AppViewType,
ChatChannel as ChatChannel,
@@ -39,22 +41,27 @@
ReceiptStatus as ReceiptStatus,
ReleaseMethod as ReleaseMethod,
AccessPassType as AccessPassType,
+ MemberStatuses as MemberStatuses,
ShipmentStatus as ShipmentStatus,
SupportChannel as SupportChannel,
InvoiceListItem as InvoiceListItem,
ProductListItem as ProductListItem,
ShipmentCarrier as ShipmentCarrier,
+ WhoCanPostTypes as WhoCanPostTypes,
AppBuildStatuses as AppBuildStatuses,
CollectionMethod as CollectionMethod,
MembershipStatus as MembershipStatus,
VisibilityFilter as VisibilityFilter,
AppBuildPlatforms as AppBuildPlatforms,
ShipmentSubstatus as ShipmentSubstatus,
+ WhoCanCommentTypes as WhoCanCommentTypes,
AuthorizedUserRoles as AuthorizedUserRoles,
CheckoutConfiguration as CheckoutConfiguration,
FriendlyReceiptStatus as FriendlyReceiptStatus,
GlobalAffiliateStatus as GlobalAffiliateStatus,
CourseLessonInteraction as CourseLessonInteraction,
+ MemberMostRecentActions as MemberMostRecentActions,
+ EmailNotificationPreferences as EmailNotificationPreferences,
CourseLessonInteractionListItem as CourseLessonInteractionListItem,
)
from .app_list_params import AppListParams as AppListParams
@@ -63,14 +70,19 @@
from .app_list_response import AppListResponse as AppListResponse
from .app_update_params import AppUpdateParams as AppUpdateParams
from .entry_list_params import EntryListParams as EntryListParams
+from .forum_list_params import ForumListParams as ForumListParams
+from .member_list_params import MemberListParams as MemberListParams
from .plan_create_params import PlanCreateParams as PlanCreateParams
from .plan_list_response import PlanListResponse as PlanListResponse
from .plan_update_params import PlanUpdateParams as PlanUpdateParams
from .entry_list_response import EntryListResponse as EntryListResponse
+from .forum_list_response import ForumListResponse as ForumListResponse
+from .forum_update_params import ForumUpdateParams as ForumUpdateParams
from .invoice_list_params import InvoiceListParams as InvoiceListParams
from .message_list_params import MessageListParams as MessageListParams
from .payment_list_params import PaymentListParams as PaymentListParams
from .product_list_params import ProductListParams as ProductListParams
+from .member_list_response import MemberListResponse as MemberListResponse
from .plan_delete_response import PlanDeleteResponse as PlanDeleteResponse
from .reaction_list_params import ReactionListParams as ReactionListParams
from .shipment_list_params import ShipmentListParams as ShipmentListParams
@@ -109,6 +121,7 @@
from .experience_update_params import ExperienceUpdateParams as ExperienceUpdateParams
from .forum_post_create_params import ForumPostCreateParams as ForumPostCreateParams
from .forum_post_list_response import ForumPostListResponse as ForumPostListResponse
+from .member_retrieve_response import MemberRetrieveResponse as MemberRetrieveResponse
from .membership_cancel_params import MembershipCancelParams as MembershipCancelParams
from .membership_list_response import MembershipListResponse as MembershipListResponse
from .membership_update_params import MembershipUpdateParams as MembershipUpdateParams
diff --git a/src/whop_sdk/types/forum_list_params.py b/src/whop_sdk/types/forum_list_params.py
new file mode 100644
index 00000000..1e8e6d53
--- /dev/null
+++ b/src/whop_sdk/types/forum_list_params.py
@@ -0,0 +1,28 @@
+# File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.
+
+from __future__ import annotations
+
+from typing import Optional
+from typing_extensions import Required, TypedDict
+
+__all__ = ["ForumListParams"]
+
+
+class ForumListParams(TypedDict, total=False):
+ company_id: Required[str]
+ """The ID of the company to list forums for"""
+
+ after: Optional[str]
+ """Returns the elements in the list that come after the specified cursor."""
+
+ before: Optional[str]
+ """Returns the elements in the list that come before the specified cursor."""
+
+ first: Optional[int]
+ """Returns the first _n_ elements from the list."""
+
+ last: Optional[int]
+ """Returns the last _n_ elements from the list."""
+
+ product_id: Optional[str]
+ """If provided, only forums connected to this product are returned"""
diff --git a/src/whop_sdk/types/forum_list_response.py b/src/whop_sdk/types/forum_list_response.py
new file mode 100644
index 00000000..c2baf84a
--- /dev/null
+++ b/src/whop_sdk/types/forum_list_response.py
@@ -0,0 +1,33 @@
+# File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.
+
+from .._models import BaseModel
+from .shared.who_can_post_types import WhoCanPostTypes
+from .shared.who_can_comment_types import WhoCanCommentTypes
+from .shared.email_notification_preferences import EmailNotificationPreferences
+
+__all__ = ["ForumListResponse", "Experience"]
+
+
+class Experience(BaseModel):
+ id: str
+ """The unique ID representing this experience"""
+
+ name: str
+ """The written name of the description."""
+
+
+class ForumListResponse(BaseModel):
+ id: str
+ """The unique identifier for the entity"""
+
+ email_notification_preference: EmailNotificationPreferences
+ """The email notification preference for this forum"""
+
+ experience: Experience
+ """The experience for this forum"""
+
+ who_can_comment: WhoCanCommentTypes
+ """Who can comment on this forum"""
+
+ who_can_post: WhoCanPostTypes
+ """Who can post on this forum"""
diff --git a/src/whop_sdk/types/forum_update_params.py b/src/whop_sdk/types/forum_update_params.py
new file mode 100644
index 00000000..2e2a97bc
--- /dev/null
+++ b/src/whop_sdk/types/forum_update_params.py
@@ -0,0 +1,23 @@
+# File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.
+
+from __future__ import annotations
+
+from typing import Optional
+from typing_extensions import TypedDict
+
+from .shared.who_can_post_types import WhoCanPostTypes
+from .shared.who_can_comment_types import WhoCanCommentTypes
+from .shared.email_notification_preferences import EmailNotificationPreferences
+
+__all__ = ["ForumUpdateParams"]
+
+
+class ForumUpdateParams(TypedDict, total=False):
+ email_notification_preference: Optional[EmailNotificationPreferences]
+ """Email notification preference option for a forum feed"""
+
+ who_can_comment: Optional[WhoCanCommentTypes]
+ """Who can comment on a forum feed"""
+
+ who_can_post: Optional[WhoCanPostTypes]
+ """Who can post on a forum feed"""
diff --git a/src/whop_sdk/types/member_list_params.py b/src/whop_sdk/types/member_list_params.py
new file mode 100644
index 00000000..f139719e
--- /dev/null
+++ b/src/whop_sdk/types/member_list_params.py
@@ -0,0 +1,70 @@
+# File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.
+
+from __future__ import annotations
+
+from typing import List, Union, Optional
+from datetime import datetime
+from typing_extensions import Literal, Required, Annotated, TypedDict
+
+from .._types import SequenceNotStr
+from .._utils import PropertyInfo
+from .shared.direction import Direction
+from .shared.access_level import AccessLevel
+from .shared.member_statuses import MemberStatuses
+from .shared.member_most_recent_actions import MemberMostRecentActions
+
+__all__ = ["MemberListParams"]
+
+
+class MemberListParams(TypedDict, total=False):
+ company_id: Required[str]
+ """The ID of the company to list members for"""
+
+ access_level: Optional[AccessLevel]
+ """The access level a given user (or company) has to an access pass or company."""
+
+ access_pass_ids: Optional[SequenceNotStr[str]]
+ """The access pass IDs to filter the members by"""
+
+ after: Optional[str]
+ """Returns the elements in the list that come after the specified cursor."""
+
+ before: Optional[str]
+ """Returns the elements in the list that come before the specified cursor."""
+
+ created_after: Annotated[Union[str, datetime, None], PropertyInfo(format="iso8601")]
+ """The minimum creation date to filter by"""
+
+ created_before: Annotated[Union[str, datetime, None], PropertyInfo(format="iso8601")]
+ """The maximum creation date to filter by"""
+
+ direction: Optional[Direction]
+ """The direction of the sort."""
+
+ first: Optional[int]
+ """Returns the first _n_ elements from the list."""
+
+ last: Optional[int]
+ """Returns the last _n_ elements from the list."""
+
+ most_recent_actions: Optional[List[MemberMostRecentActions]]
+ """The most recent actions to filter the members by"""
+
+ order: Optional[Literal["id", "usd_total_spent", "created_at", "joined_at", "most_recent_action"]]
+ """Which columns can be used to sort."""
+
+ plan_ids: Optional[SequenceNotStr[str]]
+ """The plan IDs to filter the members by"""
+
+ promo_code_ids: Optional[SequenceNotStr[str]]
+ """The promo code IDs to filter the members by"""
+
+ query: Optional[str]
+ """The name, username, or email to filter the members by.
+
+ The email filter will only apply if the current actor has the
+ `member:email:read` permission.
+ """
+
+ statuses: Optional[List[MemberStatuses]]
+ """The statuses to filter the members by"""
diff --git a/src/whop_sdk/types/member_list_response.py b/src/whop_sdk/types/member_list_response.py
new file mode 100644
index 00000000..f1fb1708
--- /dev/null
+++ b/src/whop_sdk/types/member_list_response.py
@@ -0,0 +1,65 @@
+# 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 .shared.access_level import AccessLevel
+from .shared.member_statuses import MemberStatuses
+from .shared.member_most_recent_actions import MemberMostRecentActions
+
+__all__ = ["MemberListResponse", "User"]
+
+
+class User(BaseModel):
+ id: str
+ """The internal ID of the user account."""
+
+ email: Optional[str] = None
+ """The digital mailing address of the user."""
+
+ name: Optional[str] = None
+ """The user's full name."""
+
+ username: str
+ """The whop username."""
+
+
+class MemberListResponse(BaseModel):
+ id: str
+ """The ID of the member"""
+
+ access_level: AccessLevel
+ """The access level of the product member.
+
+ If its admin, the member is an authorized user of the access pass. If its
+ customer, the member has a valid membership to the access pass. If its
+ no_access, the member does not have access to the access pass.
+ """
+
+ created_at: datetime
+ """When the member was created"""
+
+ joined_at: datetime
+ """When the member joined the company"""
+
+ most_recent_action: Optional[MemberMostRecentActions] = None
+ """The different most recent actions a member can have."""
+
+ most_recent_action_at: Optional[datetime] = None
+ """The time for the most recent action, if applicable."""
+
+ phone: Optional[str] = None
+ """The phone number for the member, if available."""
+
+ status: MemberStatuses
+ """The status of the member"""
+
+ updated_at: datetime
+ """The timestamp of when this member was last updated"""
+
+ usd_total_spent: float
+ """How much money this customer has spent on the company's products and plans"""
+
+ user: Optional[User] = None
+ """The user for this member, if any."""
diff --git a/src/whop_sdk/types/member_retrieve_response.py b/src/whop_sdk/types/member_retrieve_response.py
new file mode 100644
index 00000000..c45b1b62
--- /dev/null
+++ b/src/whop_sdk/types/member_retrieve_response.py
@@ -0,0 +1,79 @@
+# 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 .shared.access_level import AccessLevel
+from .shared.member_statuses import MemberStatuses
+from .shared.member_most_recent_actions import MemberMostRecentActions
+
+__all__ = ["MemberRetrieveResponse", "Company", "User"]
+
+
+class Company(BaseModel):
+ id: str
+ """The ID of the company"""
+
+ route: str
+ """The slug/route of the company on the Whop site."""
+
+ title: str
+ """The written name of the company."""
+
+
+class User(BaseModel):
+ id: str
+ """The internal ID of the user account."""
+
+ email: Optional[str] = None
+ """The digital mailing address of the user."""
+
+ name: Optional[str] = None
+ """The user's full name."""
+
+ username: str
+ """The whop username."""
+
+
+class MemberRetrieveResponse(BaseModel):
+ id: str
+ """The ID of the member"""
+
+ access_level: AccessLevel
+ """The access level of the product member.
+
+ If its admin, the member is an authorized user of the access pass. If its
+ customer, the member has a valid membership to the access pass. If its
+ no_access, the member does not have access to the access pass.
+ """
+
+ company: Company
+ """The company for the member."""
+
+ created_at: datetime
+ """When the member was created"""
+
+ joined_at: datetime
+ """When the member joined the company"""
+
+ most_recent_action: Optional[MemberMostRecentActions] = None
+ """The different most recent actions a member can have."""
+
+ most_recent_action_at: Optional[datetime] = None
+ """The time for the most recent action, if applicable."""
+
+ phone: Optional[str] = None
+ """The phone number for the member, if available."""
+
+ status: MemberStatuses
+ """The status of the member"""
+
+ updated_at: datetime
+ """The timestamp of when this member was last updated"""
+
+ usd_total_spent: float
+ """How much money this customer has spent on the company's products and plans"""
+
+ user: Optional[User] = None
+ """The user for this member, if any."""
diff --git a/src/whop_sdk/types/shared/__init__.py b/src/whop_sdk/types/shared/__init__.py
index 8738118d..e35962fe 100644
--- a/src/whop_sdk/types/shared/__init__.py
+++ b/src/whop_sdk/types/shared/__init__.py
@@ -3,6 +3,7 @@
from .app import App as App
from .plan import Plan as Plan
from .entry import Entry as Entry
+from .forum import Forum as Forum
from .company import Company as Company
from .invoice import Invoice as Invoice
from .message import Message as Message
@@ -23,6 +24,7 @@
from .membership import Membership as Membership
from .promo_type import PromoType as PromoType
from .visibility import Visibility as Visibility
+from .access_level import AccessLevel as AccessLevel
from .app_statuses import AppStatuses as AppStatuses
from .chat_channel import ChatChannel as ChatChannel
from .entry_status import EntryStatus as EntryStatus
@@ -35,6 +37,7 @@
from .invoice_status import InvoiceStatus as InvoiceStatus
from .receipt_status import ReceiptStatus as ReceiptStatus
from .release_method import ReleaseMethod as ReleaseMethod
+from .member_statuses import MemberStatuses as MemberStatuses
from .shipment_status import ShipmentStatus as ShipmentStatus
from .support_channel import SupportChannel as SupportChannel
from .access_pass_type import AccessPassType as AccessPassType
@@ -46,10 +49,14 @@
from .visibility_filter import VisibilityFilter as VisibilityFilter
from .app_build_statuses import AppBuildStatuses as AppBuildStatuses
from .shipment_substatus import ShipmentSubstatus as ShipmentSubstatus
+from .who_can_post_types import WhoCanPostTypes as WhoCanPostTypes
from .app_build_platforms import AppBuildPlatforms as AppBuildPlatforms
from .authorized_user_roles import AuthorizedUserRoles as AuthorizedUserRoles
+from .who_can_comment_types import WhoCanCommentTypes as WhoCanCommentTypes
from .checkout_configuration import CheckoutConfiguration as CheckoutConfiguration
from .friendly_receipt_status import FriendlyReceiptStatus as FriendlyReceiptStatus
from .global_affiliate_status import GlobalAffiliateStatus as GlobalAffiliateStatus
from .course_lesson_interaction import CourseLessonInteraction as CourseLessonInteraction
+from .member_most_recent_actions import MemberMostRecentActions as MemberMostRecentActions
+from .email_notification_preferences import EmailNotificationPreferences as EmailNotificationPreferences
from .course_lesson_interaction_list_item import CourseLessonInteractionListItem as CourseLessonInteractionListItem
diff --git a/src/whop_sdk/types/shared/access_level.py b/src/whop_sdk/types/shared/access_level.py
new file mode 100644
index 00000000..f5dd8ca1
--- /dev/null
+++ b/src/whop_sdk/types/shared/access_level.py
@@ -0,0 +1,7 @@
+# File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.
+
+from typing_extensions import Literal, TypeAlias
+
+__all__ = ["AccessLevel"]
+
+AccessLevel: TypeAlias = Literal["no_access", "admin", "customer"]
diff --git a/src/whop_sdk/types/shared/email_notification_preferences.py b/src/whop_sdk/types/shared/email_notification_preferences.py
new file mode 100644
index 00000000..2ab81c77
--- /dev/null
+++ b/src/whop_sdk/types/shared/email_notification_preferences.py
@@ -0,0 +1,7 @@
+# File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.
+
+from typing_extensions import Literal, TypeAlias
+
+__all__ = ["EmailNotificationPreferences"]
+
+EmailNotificationPreferences: TypeAlias = Literal["all_admin_posts", "only_weekly_summary", "none"]
diff --git a/src/whop_sdk/types/shared/forum.py b/src/whop_sdk/types/shared/forum.py
new file mode 100644
index 00000000..0f9202f4
--- /dev/null
+++ b/src/whop_sdk/types/shared/forum.py
@@ -0,0 +1,33 @@
+# File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.
+
+from ..._models import BaseModel
+from .who_can_post_types import WhoCanPostTypes
+from .who_can_comment_types import WhoCanCommentTypes
+from .email_notification_preferences import EmailNotificationPreferences
+
+__all__ = ["Forum", "Experience"]
+
+
+class Experience(BaseModel):
+ id: str
+ """The unique ID representing this experience"""
+
+ name: str
+ """The written name of the description."""
+
+
+class Forum(BaseModel):
+ id: str
+ """The unique identifier for the entity"""
+
+ email_notification_preference: EmailNotificationPreferences
+ """The email notification preference for this forum"""
+
+ experience: Experience
+ """The experience for this forum"""
+
+ who_can_comment: WhoCanCommentTypes
+ """Who can comment on this forum"""
+
+ who_can_post: WhoCanPostTypes
+ """Who can post on this forum"""
diff --git a/src/whop_sdk/types/shared/member_most_recent_actions.py b/src/whop_sdk/types/shared/member_most_recent_actions.py
new file mode 100644
index 00000000..4c102e4f
--- /dev/null
+++ b/src/whop_sdk/types/shared/member_most_recent_actions.py
@@ -0,0 +1,22 @@
+# File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.
+
+from typing_extensions import Literal, TypeAlias
+
+__all__ = ["MemberMostRecentActions"]
+
+MemberMostRecentActions: TypeAlias = Literal[
+ "canceling",
+ "churned",
+ "finished_split_pay",
+ "paused",
+ "paid_subscriber",
+ "paid_once",
+ "expiring",
+ "joined",
+ "drafted",
+ "left",
+ "trialing",
+ "pending_entry",
+ "renewing",
+ "past_due",
+]
diff --git a/src/whop_sdk/types/shared/member_statuses.py b/src/whop_sdk/types/shared/member_statuses.py
new file mode 100644
index 00000000..a3616845
--- /dev/null
+++ b/src/whop_sdk/types/shared/member_statuses.py
@@ -0,0 +1,7 @@
+# File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.
+
+from typing_extensions import Literal, TypeAlias
+
+__all__ = ["MemberStatuses"]
+
+MemberStatuses: TypeAlias = Literal["drafted", "joined", "left"]
diff --git a/src/whop_sdk/types/shared/who_can_comment_types.py b/src/whop_sdk/types/shared/who_can_comment_types.py
new file mode 100644
index 00000000..6512c5f5
--- /dev/null
+++ b/src/whop_sdk/types/shared/who_can_comment_types.py
@@ -0,0 +1,7 @@
+# File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.
+
+from typing_extensions import Literal, TypeAlias
+
+__all__ = ["WhoCanCommentTypes"]
+
+WhoCanCommentTypes: TypeAlias = Literal["everyone", "admins"]
diff --git a/src/whop_sdk/types/shared/who_can_post_types.py b/src/whop_sdk/types/shared/who_can_post_types.py
new file mode 100644
index 00000000..ac315cb6
--- /dev/null
+++ b/src/whop_sdk/types/shared/who_can_post_types.py
@@ -0,0 +1,7 @@
+# File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.
+
+from typing_extensions import Literal, TypeAlias
+
+__all__ = ["WhoCanPostTypes"]
+
+WhoCanPostTypes: TypeAlias = Literal["everyone", "admins"]
diff --git a/src/whop_sdk/types/shared_params/__init__.py b/src/whop_sdk/types/shared_params/__init__.py
index aeba1edc..c6e79558 100644
--- a/src/whop_sdk/types/shared_params/__init__.py
+++ b/src/whop_sdk/types/shared_params/__init__.py
@@ -6,6 +6,7 @@
from .plan_type import PlanType as PlanType
from .custom_cta import CustomCta as CustomCta
from .visibility import Visibility as Visibility
+from .access_level import AccessLevel as AccessLevel
from .app_statuses import AppStatuses as AppStatuses
from .entry_status import EntryStatus as EntryStatus
from .who_can_post import WhoCanPost as WhoCanPost
@@ -16,12 +17,17 @@
from .invoice_status import InvoiceStatus as InvoiceStatus
from .receipt_status import ReceiptStatus as ReceiptStatus
from .release_method import ReleaseMethod as ReleaseMethod
+from .member_statuses import MemberStatuses as MemberStatuses
from .access_pass_type import AccessPassType as AccessPassType
from .collection_method import CollectionMethod as CollectionMethod
from .membership_status import MembershipStatus as MembershipStatus
from .visibility_filter import VisibilityFilter as VisibilityFilter
from .app_build_statuses import AppBuildStatuses as AppBuildStatuses
+from .who_can_post_types import WhoCanPostTypes as WhoCanPostTypes
from .app_build_platforms import AppBuildPlatforms as AppBuildPlatforms
from .authorized_user_roles import AuthorizedUserRoles as AuthorizedUserRoles
+from .who_can_comment_types import WhoCanCommentTypes as WhoCanCommentTypes
from .friendly_receipt_status import FriendlyReceiptStatus as FriendlyReceiptStatus
from .global_affiliate_status import GlobalAffiliateStatus as GlobalAffiliateStatus
+from .member_most_recent_actions import MemberMostRecentActions as MemberMostRecentActions
+from .email_notification_preferences import EmailNotificationPreferences as EmailNotificationPreferences
diff --git a/src/whop_sdk/types/shared_params/access_level.py b/src/whop_sdk/types/shared_params/access_level.py
new file mode 100644
index 00000000..79610b07
--- /dev/null
+++ b/src/whop_sdk/types/shared_params/access_level.py
@@ -0,0 +1,9 @@
+# File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.
+
+from __future__ import annotations
+
+from typing_extensions import Literal, TypeAlias
+
+__all__ = ["AccessLevel"]
+
+AccessLevel: TypeAlias = Literal["no_access", "admin", "customer"]
diff --git a/src/whop_sdk/types/shared_params/email_notification_preferences.py b/src/whop_sdk/types/shared_params/email_notification_preferences.py
new file mode 100644
index 00000000..a745925b
--- /dev/null
+++ b/src/whop_sdk/types/shared_params/email_notification_preferences.py
@@ -0,0 +1,9 @@
+# File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.
+
+from __future__ import annotations
+
+from typing_extensions import Literal, TypeAlias
+
+__all__ = ["EmailNotificationPreferences"]
+
+EmailNotificationPreferences: TypeAlias = Literal["all_admin_posts", "only_weekly_summary", "none"]
diff --git a/src/whop_sdk/types/shared_params/member_most_recent_actions.py b/src/whop_sdk/types/shared_params/member_most_recent_actions.py
new file mode 100644
index 00000000..5f666c8c
--- /dev/null
+++ b/src/whop_sdk/types/shared_params/member_most_recent_actions.py
@@ -0,0 +1,24 @@
+# File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.
+
+from __future__ import annotations
+
+from typing_extensions import Literal, TypeAlias
+
+__all__ = ["MemberMostRecentActions"]
+
+MemberMostRecentActions: TypeAlias = Literal[
+ "canceling",
+ "churned",
+ "finished_split_pay",
+ "paused",
+ "paid_subscriber",
+ "paid_once",
+ "expiring",
+ "joined",
+ "drafted",
+ "left",
+ "trialing",
+ "pending_entry",
+ "renewing",
+ "past_due",
+]
diff --git a/src/whop_sdk/types/shared_params/member_statuses.py b/src/whop_sdk/types/shared_params/member_statuses.py
new file mode 100644
index 00000000..cb6d01f9
--- /dev/null
+++ b/src/whop_sdk/types/shared_params/member_statuses.py
@@ -0,0 +1,9 @@
+# File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.
+
+from __future__ import annotations
+
+from typing_extensions import Literal, TypeAlias
+
+__all__ = ["MemberStatuses"]
+
+MemberStatuses: TypeAlias = Literal["drafted", "joined", "left"]
diff --git a/src/whop_sdk/types/shared_params/who_can_comment_types.py b/src/whop_sdk/types/shared_params/who_can_comment_types.py
new file mode 100644
index 00000000..c9cd36fe
--- /dev/null
+++ b/src/whop_sdk/types/shared_params/who_can_comment_types.py
@@ -0,0 +1,9 @@
+# File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.
+
+from __future__ import annotations
+
+from typing_extensions import Literal, TypeAlias
+
+__all__ = ["WhoCanCommentTypes"]
+
+WhoCanCommentTypes: TypeAlias = Literal["everyone", "admins"]
diff --git a/src/whop_sdk/types/shared_params/who_can_post_types.py b/src/whop_sdk/types/shared_params/who_can_post_types.py
new file mode 100644
index 00000000..bba45e1a
--- /dev/null
+++ b/src/whop_sdk/types/shared_params/who_can_post_types.py
@@ -0,0 +1,9 @@
+# File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.
+
+from __future__ import annotations
+
+from typing_extensions import Literal, TypeAlias
+
+__all__ = ["WhoCanPostTypes"]
+
+WhoCanPostTypes: TypeAlias = Literal["everyone", "admins"]
diff --git a/src/whop_sdk/types/user_check_access_response.py b/src/whop_sdk/types/user_check_access_response.py
index bf382cc0..2f56acf0 100644
--- a/src/whop_sdk/types/user_check_access_response.py
+++ b/src/whop_sdk/types/user_check_access_response.py
@@ -1,14 +1,13 @@
# File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.
-from typing_extensions import Literal
-
from .._models import BaseModel
+from .shared.access_level import AccessLevel
__all__ = ["UserCheckAccessResponse"]
class UserCheckAccessResponse(BaseModel):
- access_level: Literal["no_access", "admin", "customer"]
+ access_level: AccessLevel
"""The permission level of the user"""
has_access: bool
diff --git a/tests/api_resources/test_forums.py b/tests/api_resources/test_forums.py
new file mode 100644
index 00000000..83f4a8c5
--- /dev/null
+++ b/tests/api_resources/test_forums.py
@@ -0,0 +1,310 @@
+# 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 whop_sdk import Whop, AsyncWhop
+from tests.utils import assert_matches_type
+from whop_sdk.types import ForumListResponse
+from whop_sdk.pagination import SyncCursorPage, AsyncCursorPage
+from whop_sdk.types.shared import Forum
+
+base_url = os.environ.get("TEST_API_BASE_URL", "http://127.0.0.1:4010")
+
+
+class TestForums:
+ 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: Whop) -> None:
+ forum = client.forums.retrieve(
+ "id",
+ )
+ assert_matches_type(Forum, forum, path=["response"])
+
+ @pytest.mark.skip(reason="Prism tests are disabled")
+ @parametrize
+ def test_raw_response_retrieve(self, client: Whop) -> None:
+ response = client.forums.with_raw_response.retrieve(
+ "id",
+ )
+
+ assert response.is_closed is True
+ assert response.http_request.headers.get("X-Stainless-Lang") == "python"
+ forum = response.parse()
+ assert_matches_type(Forum, forum, path=["response"])
+
+ @pytest.mark.skip(reason="Prism tests are disabled")
+ @parametrize
+ def test_streaming_response_retrieve(self, client: Whop) -> None:
+ with client.forums.with_streaming_response.retrieve(
+ "id",
+ ) as response:
+ assert not response.is_closed
+ assert response.http_request.headers.get("X-Stainless-Lang") == "python"
+
+ forum = response.parse()
+ assert_matches_type(Forum, forum, 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: Whop) -> None:
+ with pytest.raises(ValueError, match=r"Expected a non-empty value for `id` but received ''"):
+ client.forums.with_raw_response.retrieve(
+ "",
+ )
+
+ @pytest.mark.skip(reason="Prism tests are disabled")
+ @parametrize
+ def test_method_update(self, client: Whop) -> None:
+ forum = client.forums.update(
+ id="id",
+ )
+ assert_matches_type(Forum, forum, path=["response"])
+
+ @pytest.mark.skip(reason="Prism tests are disabled")
+ @parametrize
+ def test_method_update_with_all_params(self, client: Whop) -> None:
+ forum = client.forums.update(
+ id="id",
+ email_notification_preference="all_admin_posts",
+ who_can_comment="everyone",
+ who_can_post="everyone",
+ )
+ assert_matches_type(Forum, forum, path=["response"])
+
+ @pytest.mark.skip(reason="Prism tests are disabled")
+ @parametrize
+ def test_raw_response_update(self, client: Whop) -> None:
+ response = client.forums.with_raw_response.update(
+ id="id",
+ )
+
+ assert response.is_closed is True
+ assert response.http_request.headers.get("X-Stainless-Lang") == "python"
+ forum = response.parse()
+ assert_matches_type(Forum, forum, path=["response"])
+
+ @pytest.mark.skip(reason="Prism tests are disabled")
+ @parametrize
+ def test_streaming_response_update(self, client: Whop) -> None:
+ with client.forums.with_streaming_response.update(
+ id="id",
+ ) as response:
+ assert not response.is_closed
+ assert response.http_request.headers.get("X-Stainless-Lang") == "python"
+
+ forum = response.parse()
+ assert_matches_type(Forum, forum, path=["response"])
+
+ assert cast(Any, response.is_closed) is True
+
+ @pytest.mark.skip(reason="Prism tests are disabled")
+ @parametrize
+ def test_path_params_update(self, client: Whop) -> None:
+ with pytest.raises(ValueError, match=r"Expected a non-empty value for `id` but received ''"):
+ client.forums.with_raw_response.update(
+ id="",
+ )
+
+ @pytest.mark.skip(reason="Prism tests are disabled")
+ @parametrize
+ def test_method_list(self, client: Whop) -> None:
+ forum = client.forums.list(
+ company_id="biz_xxxxxxxxxxxxxx",
+ )
+ assert_matches_type(SyncCursorPage[ForumListResponse], forum, path=["response"])
+
+ @pytest.mark.skip(reason="Prism tests are disabled")
+ @parametrize
+ def test_method_list_with_all_params(self, client: Whop) -> None:
+ forum = client.forums.list(
+ company_id="biz_xxxxxxxxxxxxxx",
+ after="after",
+ before="before",
+ first=42,
+ last=42,
+ product_id="prod_xxxxxxxxxxxxx",
+ )
+ assert_matches_type(SyncCursorPage[ForumListResponse], forum, path=["response"])
+
+ @pytest.mark.skip(reason="Prism tests are disabled")
+ @parametrize
+ def test_raw_response_list(self, client: Whop) -> None:
+ response = client.forums.with_raw_response.list(
+ company_id="biz_xxxxxxxxxxxxxx",
+ )
+
+ assert response.is_closed is True
+ assert response.http_request.headers.get("X-Stainless-Lang") == "python"
+ forum = response.parse()
+ assert_matches_type(SyncCursorPage[ForumListResponse], forum, path=["response"])
+
+ @pytest.mark.skip(reason="Prism tests are disabled")
+ @parametrize
+ def test_streaming_response_list(self, client: Whop) -> None:
+ with client.forums.with_streaming_response.list(
+ company_id="biz_xxxxxxxxxxxxxx",
+ ) as response:
+ assert not response.is_closed
+ assert response.http_request.headers.get("X-Stainless-Lang") == "python"
+
+ forum = response.parse()
+ assert_matches_type(SyncCursorPage[ForumListResponse], forum, path=["response"])
+
+ assert cast(Any, response.is_closed) is True
+
+
+class TestAsyncForums:
+ 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: AsyncWhop) -> None:
+ forum = await async_client.forums.retrieve(
+ "id",
+ )
+ assert_matches_type(Forum, forum, path=["response"])
+
+ @pytest.mark.skip(reason="Prism tests are disabled")
+ @parametrize
+ async def test_raw_response_retrieve(self, async_client: AsyncWhop) -> None:
+ response = await async_client.forums.with_raw_response.retrieve(
+ "id",
+ )
+
+ assert response.is_closed is True
+ assert response.http_request.headers.get("X-Stainless-Lang") == "python"
+ forum = await response.parse()
+ assert_matches_type(Forum, forum, path=["response"])
+
+ @pytest.mark.skip(reason="Prism tests are disabled")
+ @parametrize
+ async def test_streaming_response_retrieve(self, async_client: AsyncWhop) -> None:
+ async with async_client.forums.with_streaming_response.retrieve(
+ "id",
+ ) as response:
+ assert not response.is_closed
+ assert response.http_request.headers.get("X-Stainless-Lang") == "python"
+
+ forum = await response.parse()
+ assert_matches_type(Forum, forum, 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: AsyncWhop) -> None:
+ with pytest.raises(ValueError, match=r"Expected a non-empty value for `id` but received ''"):
+ await async_client.forums.with_raw_response.retrieve(
+ "",
+ )
+
+ @pytest.mark.skip(reason="Prism tests are disabled")
+ @parametrize
+ async def test_method_update(self, async_client: AsyncWhop) -> None:
+ forum = await async_client.forums.update(
+ id="id",
+ )
+ assert_matches_type(Forum, forum, path=["response"])
+
+ @pytest.mark.skip(reason="Prism tests are disabled")
+ @parametrize
+ async def test_method_update_with_all_params(self, async_client: AsyncWhop) -> None:
+ forum = await async_client.forums.update(
+ id="id",
+ email_notification_preference="all_admin_posts",
+ who_can_comment="everyone",
+ who_can_post="everyone",
+ )
+ assert_matches_type(Forum, forum, path=["response"])
+
+ @pytest.mark.skip(reason="Prism tests are disabled")
+ @parametrize
+ async def test_raw_response_update(self, async_client: AsyncWhop) -> None:
+ response = await async_client.forums.with_raw_response.update(
+ id="id",
+ )
+
+ assert response.is_closed is True
+ assert response.http_request.headers.get("X-Stainless-Lang") == "python"
+ forum = await response.parse()
+ assert_matches_type(Forum, forum, path=["response"])
+
+ @pytest.mark.skip(reason="Prism tests are disabled")
+ @parametrize
+ async def test_streaming_response_update(self, async_client: AsyncWhop) -> None:
+ async with async_client.forums.with_streaming_response.update(
+ id="id",
+ ) as response:
+ assert not response.is_closed
+ assert response.http_request.headers.get("X-Stainless-Lang") == "python"
+
+ forum = await response.parse()
+ assert_matches_type(Forum, forum, path=["response"])
+
+ 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: AsyncWhop) -> None:
+ with pytest.raises(ValueError, match=r"Expected a non-empty value for `id` but received ''"):
+ await async_client.forums.with_raw_response.update(
+ id="",
+ )
+
+ @pytest.mark.skip(reason="Prism tests are disabled")
+ @parametrize
+ async def test_method_list(self, async_client: AsyncWhop) -> None:
+ forum = await async_client.forums.list(
+ company_id="biz_xxxxxxxxxxxxxx",
+ )
+ assert_matches_type(AsyncCursorPage[ForumListResponse], forum, path=["response"])
+
+ @pytest.mark.skip(reason="Prism tests are disabled")
+ @parametrize
+ async def test_method_list_with_all_params(self, async_client: AsyncWhop) -> None:
+ forum = await async_client.forums.list(
+ company_id="biz_xxxxxxxxxxxxxx",
+ after="after",
+ before="before",
+ first=42,
+ last=42,
+ product_id="prod_xxxxxxxxxxxxx",
+ )
+ assert_matches_type(AsyncCursorPage[ForumListResponse], forum, path=["response"])
+
+ @pytest.mark.skip(reason="Prism tests are disabled")
+ @parametrize
+ async def test_raw_response_list(self, async_client: AsyncWhop) -> None:
+ response = await async_client.forums.with_raw_response.list(
+ company_id="biz_xxxxxxxxxxxxxx",
+ )
+
+ assert response.is_closed is True
+ assert response.http_request.headers.get("X-Stainless-Lang") == "python"
+ forum = await response.parse()
+ assert_matches_type(AsyncCursorPage[ForumListResponse], forum, path=["response"])
+
+ @pytest.mark.skip(reason="Prism tests are disabled")
+ @parametrize
+ async def test_streaming_response_list(self, async_client: AsyncWhop) -> None:
+ async with async_client.forums.with_streaming_response.list(
+ company_id="biz_xxxxxxxxxxxxxx",
+ ) as response:
+ assert not response.is_closed
+ assert response.http_request.headers.get("X-Stainless-Lang") == "python"
+
+ forum = await response.parse()
+ assert_matches_type(AsyncCursorPage[ForumListResponse], forum, path=["response"])
+
+ assert cast(Any, response.is_closed) is True
diff --git a/tests/api_resources/test_members.py b/tests/api_resources/test_members.py
new file mode 100644
index 00000000..fc600750
--- /dev/null
+++ b/tests/api_resources/test_members.py
@@ -0,0 +1,224 @@
+# 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 whop_sdk import Whop, AsyncWhop
+from tests.utils import assert_matches_type
+from whop_sdk.types import MemberListResponse, MemberRetrieveResponse
+from whop_sdk._utils import parse_datetime
+from whop_sdk.pagination import SyncCursorPage, AsyncCursorPage
+
+base_url = os.environ.get("TEST_API_BASE_URL", "http://127.0.0.1:4010")
+
+
+class TestMembers:
+ 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: Whop) -> None:
+ member = client.members.retrieve(
+ "id",
+ )
+ assert_matches_type(MemberRetrieveResponse, member, path=["response"])
+
+ @pytest.mark.skip(reason="Prism tests are disabled")
+ @parametrize
+ def test_raw_response_retrieve(self, client: Whop) -> None:
+ response = client.members.with_raw_response.retrieve(
+ "id",
+ )
+
+ assert response.is_closed is True
+ assert response.http_request.headers.get("X-Stainless-Lang") == "python"
+ member = response.parse()
+ assert_matches_type(MemberRetrieveResponse, member, path=["response"])
+
+ @pytest.mark.skip(reason="Prism tests are disabled")
+ @parametrize
+ def test_streaming_response_retrieve(self, client: Whop) -> None:
+ with client.members.with_streaming_response.retrieve(
+ "id",
+ ) as response:
+ assert not response.is_closed
+ assert response.http_request.headers.get("X-Stainless-Lang") == "python"
+
+ member = response.parse()
+ assert_matches_type(MemberRetrieveResponse, 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: Whop) -> None:
+ with pytest.raises(ValueError, match=r"Expected a non-empty value for `id` but received ''"):
+ client.members.with_raw_response.retrieve(
+ "",
+ )
+
+ @pytest.mark.skip(reason="Prism tests are disabled")
+ @parametrize
+ def test_method_list(self, client: Whop) -> None:
+ member = client.members.list(
+ company_id="biz_xxxxxxxxxxxxxx",
+ )
+ assert_matches_type(SyncCursorPage[MemberListResponse], member, path=["response"])
+
+ @pytest.mark.skip(reason="Prism tests are disabled")
+ @parametrize
+ def test_method_list_with_all_params(self, client: Whop) -> None:
+ member = client.members.list(
+ company_id="biz_xxxxxxxxxxxxxx",
+ access_level="no_access",
+ access_pass_ids=["string"],
+ after="after",
+ before="before",
+ created_after=parse_datetime("2023-12-01T05:00:00.401Z"),
+ created_before=parse_datetime("2023-12-01T05:00:00.401Z"),
+ direction="asc",
+ first=42,
+ last=42,
+ most_recent_actions=["canceling"],
+ order="id",
+ plan_ids=["string"],
+ promo_code_ids=["string"],
+ query="query",
+ statuses=["drafted"],
+ )
+ assert_matches_type(SyncCursorPage[MemberListResponse], member, path=["response"])
+
+ @pytest.mark.skip(reason="Prism tests are disabled")
+ @parametrize
+ def test_raw_response_list(self, client: Whop) -> None:
+ response = client.members.with_raw_response.list(
+ company_id="biz_xxxxxxxxxxxxxx",
+ )
+
+ assert response.is_closed is True
+ assert response.http_request.headers.get("X-Stainless-Lang") == "python"
+ member = response.parse()
+ assert_matches_type(SyncCursorPage[MemberListResponse], member, path=["response"])
+
+ @pytest.mark.skip(reason="Prism tests are disabled")
+ @parametrize
+ def test_streaming_response_list(self, client: Whop) -> None:
+ with client.members.with_streaming_response.list(
+ company_id="biz_xxxxxxxxxxxxxx",
+ ) as response:
+ assert not response.is_closed
+ assert response.http_request.headers.get("X-Stainless-Lang") == "python"
+
+ member = response.parse()
+ assert_matches_type(SyncCursorPage[MemberListResponse], member, path=["response"])
+
+ assert cast(Any, response.is_closed) is True
+
+
+class TestAsyncMembers:
+ 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: AsyncWhop) -> None:
+ member = await async_client.members.retrieve(
+ "id",
+ )
+ assert_matches_type(MemberRetrieveResponse, member, path=["response"])
+
+ @pytest.mark.skip(reason="Prism tests are disabled")
+ @parametrize
+ async def test_raw_response_retrieve(self, async_client: AsyncWhop) -> None:
+ response = await async_client.members.with_raw_response.retrieve(
+ "id",
+ )
+
+ assert response.is_closed is True
+ assert response.http_request.headers.get("X-Stainless-Lang") == "python"
+ member = await response.parse()
+ assert_matches_type(MemberRetrieveResponse, member, path=["response"])
+
+ @pytest.mark.skip(reason="Prism tests are disabled")
+ @parametrize
+ async def test_streaming_response_retrieve(self, async_client: AsyncWhop) -> None:
+ async with async_client.members.with_streaming_response.retrieve(
+ "id",
+ ) as response:
+ assert not response.is_closed
+ assert response.http_request.headers.get("X-Stainless-Lang") == "python"
+
+ member = await response.parse()
+ assert_matches_type(MemberRetrieveResponse, 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: AsyncWhop) -> None:
+ with pytest.raises(ValueError, match=r"Expected a non-empty value for `id` but received ''"):
+ await async_client.members.with_raw_response.retrieve(
+ "",
+ )
+
+ @pytest.mark.skip(reason="Prism tests are disabled")
+ @parametrize
+ async def test_method_list(self, async_client: AsyncWhop) -> None:
+ member = await async_client.members.list(
+ company_id="biz_xxxxxxxxxxxxxx",
+ )
+ assert_matches_type(AsyncCursorPage[MemberListResponse], member, path=["response"])
+
+ @pytest.mark.skip(reason="Prism tests are disabled")
+ @parametrize
+ async def test_method_list_with_all_params(self, async_client: AsyncWhop) -> None:
+ member = await async_client.members.list(
+ company_id="biz_xxxxxxxxxxxxxx",
+ access_level="no_access",
+ access_pass_ids=["string"],
+ after="after",
+ before="before",
+ created_after=parse_datetime("2023-12-01T05:00:00.401Z"),
+ created_before=parse_datetime("2023-12-01T05:00:00.401Z"),
+ direction="asc",
+ first=42,
+ last=42,
+ most_recent_actions=["canceling"],
+ order="id",
+ plan_ids=["string"],
+ promo_code_ids=["string"],
+ query="query",
+ statuses=["drafted"],
+ )
+ assert_matches_type(AsyncCursorPage[MemberListResponse], member, path=["response"])
+
+ @pytest.mark.skip(reason="Prism tests are disabled")
+ @parametrize
+ async def test_raw_response_list(self, async_client: AsyncWhop) -> None:
+ response = await async_client.members.with_raw_response.list(
+ company_id="biz_xxxxxxxxxxxxxx",
+ )
+
+ assert response.is_closed is True
+ assert response.http_request.headers.get("X-Stainless-Lang") == "python"
+ member = await response.parse()
+ assert_matches_type(AsyncCursorPage[MemberListResponse], member, path=["response"])
+
+ @pytest.mark.skip(reason="Prism tests are disabled")
+ @parametrize
+ async def test_streaming_response_list(self, async_client: AsyncWhop) -> None:
+ async with async_client.members.with_streaming_response.list(
+ company_id="biz_xxxxxxxxxxxxxx",
+ ) as response:
+ assert not response.is_closed
+ assert response.http_request.headers.get("X-Stainless-Lang") == "python"
+
+ member = await response.parse()
+ assert_matches_type(AsyncCursorPage[MemberListResponse], member, path=["response"])
+
+ assert cast(Any, response.is_closed) is True
From cb2935feaef3aa0fe324bf2bb2bb193c96b12275 Mon Sep 17 00:00:00 2001
From: "stainless-app[bot]"
<142633134+stainless-app[bot]@users.noreply.github.com>
Date: Fri, 17 Oct 2025 13:24:44 +0000
Subject: [PATCH 10/17] feat(api): api update
---
.stats.yml | 4 ++--
src/whop_sdk/resources/plans.py | 14 ++++++++++----
src/whop_sdk/types/invoice_create_params.py | 12 ++++++++++--
src/whop_sdk/types/plan_create_params.py | 12 ++++++++++--
4 files changed, 32 insertions(+), 10 deletions(-)
diff --git a/.stats.yml b/.stats.yml
index 225b5482..a9cb37ff 100644
--- a/.stats.yml
+++ b/.stats.yml
@@ -1,4 +1,4 @@
configured_endpoints: 81
-openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/frostedinc%2Fwhopsdk-5aff848f75cde8300a1b01c1ebebded1c34bcd85fafc8d26f4204734ddcd7033.yml
-openapi_spec_hash: 50a91399b8d58d89ca97d3007571a5fa
+openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/frostedinc%2Fwhopsdk-5b3a4ecdbb658015a67b0abd3dce61a538a2b83ba09d682e1397fdd2635f0582.yml
+openapi_spec_hash: b46f39bc2a57e1596c7dbafd6b8f2068
config_hash: 335abeb0dd84526555f7d83ddb84af97
diff --git a/src/whop_sdk/resources/plans.py b/src/whop_sdk/resources/plans.py
index d536a330..873be659 100644
--- a/src/whop_sdk/resources/plans.py
+++ b/src/whop_sdk/resources/plans.py
@@ -107,7 +107,9 @@ def create(
image: An image for the plan. This will be visible on the product page to customers.
- initial_price: An additional amount charged upon first purchase.
+ initial_price: An additional amount charged upon first purchase. Use only if a one time payment
+ OR you want to charge an additional amount on top of the renewal price. Provided
+ as a number in dollars. Eg: 10.43 for $10.43
internal_notes: A personal description or notes section for the business.
@@ -118,7 +120,8 @@ def create(
release_method: The methods of how a plan can be released.
- renewal_price: The amount the customer is charged every billing period.
+ renewal_price: The amount the customer is charged every billing period. Use only if a recurring
+ payment. Provided as a number in dollars. Eg: 10.43 for $10.43
title: The title of the plan. This will be visible on the product page to customers.
@@ -501,7 +504,9 @@ async def create(
image: An image for the plan. This will be visible on the product page to customers.
- initial_price: An additional amount charged upon first purchase.
+ initial_price: An additional amount charged upon first purchase. Use only if a one time payment
+ OR you want to charge an additional amount on top of the renewal price. Provided
+ as a number in dollars. Eg: 10.43 for $10.43
internal_notes: A personal description or notes section for the business.
@@ -512,7 +517,8 @@ async def create(
release_method: The methods of how a plan can be released.
- renewal_price: The amount the customer is charged every billing period.
+ renewal_price: The amount the customer is charged every billing period. Use only if a recurring
+ payment. Provided as a number in dollars. Eg: 10.43 for $10.43
title: The title of the plan. This will be visible on the product page to customers.
diff --git a/src/whop_sdk/types/invoice_create_params.py b/src/whop_sdk/types/invoice_create_params.py
index a5cef691..803f0ccb 100644
--- a/src/whop_sdk/types/invoice_create_params.py
+++ b/src/whop_sdk/types/invoice_create_params.py
@@ -108,7 +108,11 @@ class Plan(TypedDict, total=False):
"""The interval at which the plan charges (expiration plans)."""
initial_price: Optional[float]
- """An additional amount charged upon first purchase."""
+ """An additional amount charged upon first purchase.
+
+ Use only if a one time payment OR you want to charge an additional amount on top
+ of the renewal price. Provided as a number in dollars. Eg: 10.43 for $10.43
+ """
internal_notes: Optional[str]
"""A personal description or notes section for the business."""
@@ -120,7 +124,11 @@ class Plan(TypedDict, total=False):
"""The methods of how a plan can be released."""
renewal_price: Optional[float]
- """The amount the customer is charged every billing period."""
+ """The amount the customer is charged every billing period.
+
+ Use only if a recurring payment. Provided as a number in dollars. Eg: 10.43 for
+ $10.43
+ """
trial_period_days: Optional[int]
"""The number of free trial days added before a renewal plan."""
diff --git a/src/whop_sdk/types/plan_create_params.py b/src/whop_sdk/types/plan_create_params.py
index 3de2cab1..04aee462 100644
--- a/src/whop_sdk/types/plan_create_params.py
+++ b/src/whop_sdk/types/plan_create_params.py
@@ -40,7 +40,11 @@ class PlanCreateParams(TypedDict, total=False):
"""An image for the plan. This will be visible on the product page to customers."""
initial_price: Optional[float]
- """An additional amount charged upon first purchase."""
+ """An additional amount charged upon first purchase.
+
+ Use only if a one time payment OR you want to charge an additional amount on top
+ of the renewal price. Provided as a number in dollars. Eg: 10.43 for $10.43
+ """
internal_notes: Optional[str]
"""A personal description or notes section for the business."""
@@ -58,7 +62,11 @@ class PlanCreateParams(TypedDict, total=False):
"""The methods of how a plan can be released."""
renewal_price: Optional[float]
- """The amount the customer is charged every billing period."""
+ """The amount the customer is charged every billing period.
+
+ Use only if a recurring payment. Provided as a number in dollars. Eg: 10.43 for
+ $10.43
+ """
title: Optional[str]
"""The title of the plan. This will be visible on the product page to customers."""
From a946c15a8d418258f8d259714e725922e44c9389 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:20:11 +0000
Subject: [PATCH 11/17] 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 bc987eb1..c3788c26 100644
--- a/pyproject.toml
+++ b/pyproject.toml
@@ -39,7 +39,7 @@ Homepage = "https://github.com/whopio/whopsdk-python"
Repository = "https://github.com/whopio/whopsdk-python"
[project.optional-dependencies]
-aiohttp = ["aiohttp", "httpx_aiohttp>=0.1.8"]
+aiohttp = ["aiohttp", "httpx_aiohttp>=0.1.9"]
webhooks = ["standardwebhooks"]
[tool.rye]
diff --git a/requirements-dev.lock b/requirements-dev.lock
index a64267f8..ffac584f 100644
--- a/requirements-dev.lock
+++ b/requirements-dev.lock
@@ -60,7 +60,7 @@ httpx==0.28.1
# via respx
# via standardwebhooks
# via whop-sdk
-httpx-aiohttp==0.1.8
+httpx-aiohttp==0.1.9
# via whop-sdk
idna==3.4
# via anyio
diff --git a/requirements.lock b/requirements.lock
index 62e1973c..2f47ddb5 100644
--- a/requirements.lock
+++ b/requirements.lock
@@ -47,7 +47,7 @@ httpx==0.28.1
# via httpx-aiohttp
# via standardwebhooks
# via whop-sdk
-httpx-aiohttp==0.1.8
+httpx-aiohttp==0.1.9
# via whop-sdk
idna==3.4
# via anyio
From f05be6fd65bbd8fca4400d2e38e727153a72de43 Mon Sep 17 00:00:00 2001
From: "stainless-app[bot]"
<142633134+stainless-app[bot]@users.noreply.github.com>
Date: Tue, 21 Oct 2025 17:24:29 +0000
Subject: [PATCH 12/17] feat(api): api update
---
.stats.yml | 4 +--
src/whop_sdk/types/app_list_response.py | 17 ++++++++++-
.../types/experience_list_response.py | 28 ++++++++++++++++++-
src/whop_sdk/types/shared/app.py | 26 ++++++++++++++++-
src/whop_sdk/types/shared/company.py | 16 ++++++++++-
src/whop_sdk/types/shared/experience.py | 28 ++++++++++++++++++-
src/whop_sdk/types/user_retrieve_response.py | 13 ++++++++-
7 files changed, 124 insertions(+), 8 deletions(-)
diff --git a/.stats.yml b/.stats.yml
index a9cb37ff..c7768168 100644
--- a/.stats.yml
+++ b/.stats.yml
@@ -1,4 +1,4 @@
configured_endpoints: 81
-openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/frostedinc%2Fwhopsdk-5b3a4ecdbb658015a67b0abd3dce61a538a2b83ba09d682e1397fdd2635f0582.yml
-openapi_spec_hash: b46f39bc2a57e1596c7dbafd6b8f2068
+openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/frostedinc%2Fwhopsdk-cbc6845e3fd18db375851706ba67949f7066112df50300bf2de8b7c84a07c104.yml
+openapi_spec_hash: 0e91e81087a5de73d54e50147cc6cfd7
config_hash: 335abeb0dd84526555f7d83ddb84af97
diff --git a/src/whop_sdk/types/app_list_response.py b/src/whop_sdk/types/app_list_response.py
index 09b1f1ff..cd049343 100644
--- a/src/whop_sdk/types/app_list_response.py
+++ b/src/whop_sdk/types/app_list_response.py
@@ -5,7 +5,7 @@
from .._models import BaseModel
from .shared.app_statuses import AppStatuses
-__all__ = ["AppListResponse", "Company", "Creator"]
+__all__ = ["AppListResponse", "Company", "Creator", "Icon"]
class Company(BaseModel):
@@ -27,6 +27,14 @@ class Creator(BaseModel):
"""The username of the user from their Whop account."""
+class Icon(BaseModel):
+ url: Optional[str] = None
+ """This is the URL you use to render optimized attachments on the client.
+
+ This should be used for apps.
+ """
+
+
class AppListResponse(BaseModel):
id: str
"""The ID of the app"""
@@ -71,6 +79,13 @@ class AppListResponse(BaseModel):
/experiences/[experienceId]
"""
+ icon: Optional[Icon] = None
+ """The icon for the app.
+
+ This icon is shown on discovery, on the product page, on checkout, and as a
+ default icon for the experiences.
+ """
+
name: str
"""The name of the app"""
diff --git a/src/whop_sdk/types/experience_list_response.py b/src/whop_sdk/types/experience_list_response.py
index 13c5444e..1322df0d 100644
--- a/src/whop_sdk/types/experience_list_response.py
+++ b/src/whop_sdk/types/experience_list_response.py
@@ -5,13 +5,28 @@
from .._models import BaseModel
-__all__ = ["ExperienceListResponse", "App", "Company"]
+__all__ = ["ExperienceListResponse", "App", "AppIcon", "Company", "Image"]
+
+
+class AppIcon(BaseModel):
+ url: Optional[str] = None
+ """This is the URL you use to render optimized attachments on the client.
+
+ This should be used for apps.
+ """
class App(BaseModel):
id: str
"""The ID of the app"""
+ icon: Optional[AppIcon] = None
+ """The icon for the app.
+
+ This icon is shown on discovery, on the product page, on checkout, and as a
+ default icon for the experiences.
+ """
+
name: str
"""The name of the app"""
@@ -27,6 +42,14 @@ class Company(BaseModel):
"""The title of the company."""
+class Image(BaseModel):
+ url: Optional[str] = None
+ """This is the URL you use to render optimized attachments on the client.
+
+ This should be used for apps.
+ """
+
+
class ExperienceListResponse(BaseModel):
id: str
"""The unique ID representing this experience"""
@@ -40,6 +63,9 @@ class ExperienceListResponse(BaseModel):
created_at: datetime
"""The timestamp of when this experience was created."""
+ image: Optional[Image] = None
+ """The logo for the experience."""
+
name: str
"""The written name of the description."""
diff --git a/src/whop_sdk/types/shared/app.py b/src/whop_sdk/types/shared/app.py
index 04fad1f0..c4725e98 100644
--- a/src/whop_sdk/types/shared/app.py
+++ b/src/whop_sdk/types/shared/app.py
@@ -6,7 +6,16 @@
from ..._models import BaseModel
from .app_statuses import AppStatuses
-__all__ = ["App", "APIKey", "Company", "Creator", "RequestedPermission", "RequestedPermissionPermissionAction", "Stats"]
+__all__ = [
+ "App",
+ "APIKey",
+ "Company",
+ "Creator",
+ "Icon",
+ "RequestedPermission",
+ "RequestedPermissionPermissionAction",
+ "Stats",
+]
class APIKey(BaseModel):
@@ -39,6 +48,14 @@ class Creator(BaseModel):
"""The username of the user from their Whop account."""
+class Icon(BaseModel):
+ url: Optional[str] = None
+ """This is the URL you use to render optimized attachments on the client.
+
+ This should be used for apps.
+ """
+
+
class RequestedPermissionPermissionAction(BaseModel):
action: str
"""The identifier of the action."""
@@ -130,6 +147,13 @@ class App(BaseModel):
/experiences/[experienceId]
"""
+ icon: Optional[Icon] = None
+ """The icon for the app.
+
+ This icon is shown on discovery, on the product page, on checkout, and as a
+ default icon for the experiences.
+ """
+
name: str
"""The name of the app"""
diff --git a/src/whop_sdk/types/shared/company.py b/src/whop_sdk/types/shared/company.py
index cafd1cef..620cffde 100644
--- a/src/whop_sdk/types/shared/company.py
+++ b/src/whop_sdk/types/shared/company.py
@@ -8,7 +8,15 @@
from .business_types import BusinessTypes
from .industry_types import IndustryTypes
-__all__ = ["Company", "OwnerUser", "SocialLink"]
+__all__ = ["Company", "Logo", "OwnerUser", "SocialLink"]
+
+
+class Logo(BaseModel):
+ url: Optional[str] = None
+ """This is the URL you use to render optimized attachments on the client.
+
+ This should be used for apps.
+ """
class OwnerUser(BaseModel):
@@ -43,9 +51,15 @@ class Company(BaseModel):
created_at: datetime
"""When the company was created (signed up)"""
+ description: Optional[str] = None
+ """The creator pitch for the company."""
+
industry_type: Optional[IndustryTypes] = None
"""The different industry types a company can be in."""
+ logo: Optional[Logo] = None
+ """The company's logo."""
+
member_count: int
"""The number of members in the company."""
diff --git a/src/whop_sdk/types/shared/experience.py b/src/whop_sdk/types/shared/experience.py
index 4cc54c9b..7c39c5b2 100644
--- a/src/whop_sdk/types/shared/experience.py
+++ b/src/whop_sdk/types/shared/experience.py
@@ -5,13 +5,28 @@
from ..._models import BaseModel
-__all__ = ["Experience", "App", "Company", "Product"]
+__all__ = ["Experience", "App", "AppIcon", "Company", "Image", "Product"]
+
+
+class AppIcon(BaseModel):
+ url: Optional[str] = None
+ """This is the URL you use to render optimized attachments on the client.
+
+ This should be used for apps.
+ """
class App(BaseModel):
id: str
"""The ID of the app"""
+ icon: Optional[AppIcon] = None
+ """The icon for the app.
+
+ This icon is shown on discovery, on the product page, on checkout, and as a
+ default icon for the experiences.
+ """
+
name: str
"""The name of the app"""
@@ -27,6 +42,14 @@ class Company(BaseModel):
"""The title of the company."""
+class Image(BaseModel):
+ url: Optional[str] = None
+ """This is the URL you use to render optimized attachments on the client.
+
+ This should be used for apps.
+ """
+
+
class Product(BaseModel):
id: str
"""The internal ID of the public product."""
@@ -51,6 +74,9 @@ class Experience(BaseModel):
created_at: datetime
"""The timestamp of when this experience was created."""
+ image: Optional[Image] = None
+ """The logo for the experience."""
+
name: str
"""The written name of the description."""
diff --git a/src/whop_sdk/types/user_retrieve_response.py b/src/whop_sdk/types/user_retrieve_response.py
index 26969eb7..24016e3d 100644
--- a/src/whop_sdk/types/user_retrieve_response.py
+++ b/src/whop_sdk/types/user_retrieve_response.py
@@ -5,7 +5,15 @@
from .._models import BaseModel
-__all__ = ["UserRetrieveResponse"]
+__all__ = ["UserRetrieveResponse", "ProfilePicture"]
+
+
+class ProfilePicture(BaseModel):
+ url: Optional[str] = None
+ """This is the URL you use to render optimized attachments on the client.
+
+ This should be used for apps.
+ """
class UserRetrieveResponse(BaseModel):
@@ -21,5 +29,8 @@ class UserRetrieveResponse(BaseModel):
name: Optional[str] = None
"""The name of the user from their Whop account."""
+ profile_picture: Optional[ProfilePicture] = None
+ """The user's profile picture"""
+
username: str
"""The username of the user from their Whop account."""
From 214e669e3849358762d02f3bb923f337d6b9f399 Mon Sep 17 00:00:00 2001
From: "stainless-app[bot]"
<142633134+stainless-app[bot]@users.noreply.github.com>
Date: Tue, 21 Oct 2025 17:36:56 +0000
Subject: [PATCH 13/17] codegen metadata
---
.stats.yml | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/.stats.yml b/.stats.yml
index c7768168..81c9dced 100644
--- a/.stats.yml
+++ b/.stats.yml
@@ -1,4 +1,4 @@
configured_endpoints: 81
openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/frostedinc%2Fwhopsdk-cbc6845e3fd18db375851706ba67949f7066112df50300bf2de8b7c84a07c104.yml
openapi_spec_hash: 0e91e81087a5de73d54e50147cc6cfd7
-config_hash: 335abeb0dd84526555f7d83ddb84af97
+config_hash: 131e5271eed10cf11ebc421d5a0c5f8a
From d3d6d2364fbac6ec7e828471093c27e5bdba8527 Mon Sep 17 00:00:00 2001
From: "stainless-app[bot]"
<142633134+stainless-app[bot]@users.noreply.github.com>
Date: Tue, 21 Oct 2025 21:24:34 +0000
Subject: [PATCH 14/17] feat(api): api update
---
.stats.yml | 4 ++--
src/whop_sdk/types/checkout_configuration_list_response.py | 4 ++--
src/whop_sdk/types/shared/checkout_configuration.py | 4 ++--
3 files changed, 6 insertions(+), 6 deletions(-)
diff --git a/.stats.yml b/.stats.yml
index 81c9dced..268d6ab8 100644
--- a/.stats.yml
+++ b/.stats.yml
@@ -1,4 +1,4 @@
configured_endpoints: 81
-openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/frostedinc%2Fwhopsdk-cbc6845e3fd18db375851706ba67949f7066112df50300bf2de8b7c84a07c104.yml
-openapi_spec_hash: 0e91e81087a5de73d54e50147cc6cfd7
+openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/frostedinc%2Fwhopsdk-d14c5c92d8834391e163f3f86d111f78d44475ce6a0f9e272c0910d94470a508.yml
+openapi_spec_hash: 2c1075fb38205b66f7492b902fc322cb
config_hash: 131e5271eed10cf11ebc421d5a0c5f8a
diff --git a/src/whop_sdk/types/checkout_configuration_list_response.py b/src/whop_sdk/types/checkout_configuration_list_response.py
index 6f3d261b..07c1f4b2 100644
--- a/src/whop_sdk/types/checkout_configuration_list_response.py
+++ b/src/whop_sdk/types/checkout_configuration_list_response.py
@@ -47,7 +47,7 @@ class CheckoutConfigurationListResponse(BaseModel):
id: str
"""The ID of the checkout configuration"""
- affiliate_code: str
+ affiliate_code: Optional[str] = None
"""The affiliate code to use for the checkout configuration"""
company_id: str
@@ -62,5 +62,5 @@ class CheckoutConfigurationListResponse(BaseModel):
purchase_url: str
"""The URL to redirect the user to after the checkout configuration is created"""
- redirect_url: str
+ redirect_url: Optional[str] = None
"""The URL to redirect the user to after the checkout configuration is created"""
diff --git a/src/whop_sdk/types/shared/checkout_configuration.py b/src/whop_sdk/types/shared/checkout_configuration.py
index 31f8eab2..0812fa47 100644
--- a/src/whop_sdk/types/shared/checkout_configuration.py
+++ b/src/whop_sdk/types/shared/checkout_configuration.py
@@ -47,7 +47,7 @@ class CheckoutConfiguration(BaseModel):
id: str
"""The ID of the checkout configuration"""
- affiliate_code: str
+ affiliate_code: Optional[str] = None
"""The affiliate code to use for the checkout configuration"""
company_id: str
@@ -62,5 +62,5 @@ class CheckoutConfiguration(BaseModel):
purchase_url: str
"""The URL to redirect the user to after the checkout configuration is created"""
- redirect_url: str
+ redirect_url: Optional[str] = None
"""The URL to redirect the user to after the checkout configuration is created"""
From 5663cf45944bf6f9d236b7a77aac23ce7f17fb61 Mon Sep 17 00:00:00 2001
From: "stainless-app[bot]"
<142633134+stainless-app[bot]@users.noreply.github.com>
Date: Wed, 22 Oct 2025 15:24:29 +0000
Subject: [PATCH 15/17] feat(api): api update
---
.stats.yml | 4 +--
api.md | 5 ++++
src/whop_sdk/types/__init__.py | 5 ++++
.../membership_activated_webhook_event.py | 29 +++++++++++++++++++
.../membership_deactivated_webhook_event.py | 29 +++++++++++++++++++
.../types/payment_failed_webhook_event.py | 26 +++++++++++++++++
.../types/payment_pending_webhook_event.py | 26 +++++++++++++++++
.../types/payment_succeeded_webhook_event.py | 26 +++++++++++++++++
src/whop_sdk/types/unwrap_webhook_event.py | 15 +++++++++-
9 files changed, 162 insertions(+), 3 deletions(-)
create mode 100644 src/whop_sdk/types/membership_activated_webhook_event.py
create mode 100644 src/whop_sdk/types/membership_deactivated_webhook_event.py
create mode 100644 src/whop_sdk/types/payment_failed_webhook_event.py
create mode 100644 src/whop_sdk/types/payment_pending_webhook_event.py
create mode 100644 src/whop_sdk/types/payment_succeeded_webhook_event.py
diff --git a/.stats.yml b/.stats.yml
index 268d6ab8..ab14c302 100644
--- a/.stats.yml
+++ b/.stats.yml
@@ -1,4 +1,4 @@
configured_endpoints: 81
-openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/frostedinc%2Fwhopsdk-d14c5c92d8834391e163f3f86d111f78d44475ce6a0f9e272c0910d94470a508.yml
-openapi_spec_hash: 2c1075fb38205b66f7492b902fc322cb
+openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/frostedinc%2Fwhopsdk-d91d60417bc5284c347c5b5d7987372c67162442e3254a8dc25fe2724c2de1ef.yml
+openapi_spec_hash: dba4f56c933e32fddf08056f5b927a49
config_hash: 131e5271eed10cf11ebc421d5a0c5f8a
diff --git a/api.md b/api.md
index 7f71baa3..9695d201 100644
--- a/api.md
+++ b/api.md
@@ -134,6 +134,11 @@ from whop_sdk.types import (
InvoicePaidWebhookEvent,
InvoicePastDueWebhookEvent,
InvoiceVoidedWebhookEvent,
+ MembershipActivatedWebhookEvent,
+ MembershipDeactivatedWebhookEvent,
+ PaymentSucceededWebhookEvent,
+ PaymentFailedWebhookEvent,
+ PaymentPendingWebhookEvent,
UnwrapWebhookEvent,
)
```
diff --git a/src/whop_sdk/types/__init__.py b/src/whop_sdk/types/__init__.py
index a10186aa..1939a286 100644
--- a/src/whop_sdk/types/__init__.py
+++ b/src/whop_sdk/types/__init__.py
@@ -133,16 +133,21 @@
from .authorized_user_list_params import AuthorizedUserListParams as AuthorizedUserListParams
from .support_channel_list_params import SupportChannelListParams as SupportChannelListParams
from .invoice_voided_webhook_event import InvoiceVoidedWebhookEvent as InvoiceVoidedWebhookEvent
+from .payment_failed_webhook_event import PaymentFailedWebhookEvent as PaymentFailedWebhookEvent
from .authorized_user_list_response import AuthorizedUserListResponse as AuthorizedUserListResponse
from .invoice_created_webhook_event import InvoiceCreatedWebhookEvent as InvoiceCreatedWebhookEvent
+from .payment_pending_webhook_event import PaymentPendingWebhookEvent as PaymentPendingWebhookEvent
from .support_channel_create_params import SupportChannelCreateParams as SupportChannelCreateParams
from .support_channel_list_response import SupportChannelListResponse as SupportChannelListResponse
from .invoice_past_due_webhook_event import InvoicePastDueWebhookEvent as InvoicePastDueWebhookEvent
+from .payment_succeeded_webhook_event import PaymentSucceededWebhookEvent as PaymentSucceededWebhookEvent
from .ledger_account_retrieve_response import LedgerAccountRetrieveResponse as LedgerAccountRetrieveResponse
from .authorized_user_retrieve_response import AuthorizedUserRetrieveResponse as AuthorizedUserRetrieveResponse
from .checkout_configuration_list_params import CheckoutConfigurationListParams as CheckoutConfigurationListParams
+from .membership_activated_webhook_event import MembershipActivatedWebhookEvent as MembershipActivatedWebhookEvent
from .checkout_configuration_create_params import CheckoutConfigurationCreateParams as CheckoutConfigurationCreateParams
from .checkout_configuration_list_response import CheckoutConfigurationListResponse as CheckoutConfigurationListResponse
+from .membership_deactivated_webhook_event import MembershipDeactivatedWebhookEvent as MembershipDeactivatedWebhookEvent
from .course_lesson_interaction_list_params import (
CourseLessonInteractionListParams as CourseLessonInteractionListParams,
)
diff --git a/src/whop_sdk/types/membership_activated_webhook_event.py b/src/whop_sdk/types/membership_activated_webhook_event.py
new file mode 100644
index 00000000..0c636159
--- /dev/null
+++ b/src/whop_sdk/types/membership_activated_webhook_event.py
@@ -0,0 +1,29 @@
+# File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.
+
+from datetime import datetime
+from typing_extensions import Literal
+
+from .._models import BaseModel
+from .shared.membership import Membership
+
+__all__ = ["MembershipActivatedWebhookEvent"]
+
+
+class MembershipActivatedWebhookEvent(BaseModel):
+ id: str
+ """A unique ID for every single webhook request"""
+
+ api_version: Literal["v1"]
+ """The API version for this webhook"""
+
+ data: Membership
+ """
+ A membership represents a purchase between a User and a Company for a specific
+ Product.
+ """
+
+ timestamp: datetime
+ """The timestamp in ISO 8601 format that the webhook was sent at on the server"""
+
+ type: Literal["membership.activated"]
+ """The webhook event type"""
diff --git a/src/whop_sdk/types/membership_deactivated_webhook_event.py b/src/whop_sdk/types/membership_deactivated_webhook_event.py
new file mode 100644
index 00000000..34e28d7c
--- /dev/null
+++ b/src/whop_sdk/types/membership_deactivated_webhook_event.py
@@ -0,0 +1,29 @@
+# File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.
+
+from datetime import datetime
+from typing_extensions import Literal
+
+from .._models import BaseModel
+from .shared.membership import Membership
+
+__all__ = ["MembershipDeactivatedWebhookEvent"]
+
+
+class MembershipDeactivatedWebhookEvent(BaseModel):
+ id: str
+ """A unique ID for every single webhook request"""
+
+ api_version: Literal["v1"]
+ """The API version for this webhook"""
+
+ data: Membership
+ """
+ A membership represents a purchase between a User and a Company for a specific
+ Product.
+ """
+
+ timestamp: datetime
+ """The timestamp in ISO 8601 format that the webhook was sent at on the server"""
+
+ type: Literal["membership.deactivated"]
+ """The webhook event type"""
diff --git a/src/whop_sdk/types/payment_failed_webhook_event.py b/src/whop_sdk/types/payment_failed_webhook_event.py
new file mode 100644
index 00000000..98a848c1
--- /dev/null
+++ b/src/whop_sdk/types/payment_failed_webhook_event.py
@@ -0,0 +1,26 @@
+# File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.
+
+from datetime import datetime
+from typing_extensions import Literal
+
+from .._models import BaseModel
+from .shared.payment import Payment
+
+__all__ = ["PaymentFailedWebhookEvent"]
+
+
+class PaymentFailedWebhookEvent(BaseModel):
+ id: str
+ """A unique ID for every single webhook request"""
+
+ api_version: Literal["v1"]
+ """The API version for this webhook"""
+
+ data: Payment
+ """An object representing a receipt for a membership."""
+
+ timestamp: datetime
+ """The timestamp in ISO 8601 format that the webhook was sent at on the server"""
+
+ type: Literal["payment.failed"]
+ """The webhook event type"""
diff --git a/src/whop_sdk/types/payment_pending_webhook_event.py b/src/whop_sdk/types/payment_pending_webhook_event.py
new file mode 100644
index 00000000..e5919ff2
--- /dev/null
+++ b/src/whop_sdk/types/payment_pending_webhook_event.py
@@ -0,0 +1,26 @@
+# File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.
+
+from datetime import datetime
+from typing_extensions import Literal
+
+from .._models import BaseModel
+from .shared.payment import Payment
+
+__all__ = ["PaymentPendingWebhookEvent"]
+
+
+class PaymentPendingWebhookEvent(BaseModel):
+ id: str
+ """A unique ID for every single webhook request"""
+
+ api_version: Literal["v1"]
+ """The API version for this webhook"""
+
+ data: Payment
+ """An object representing a receipt for a membership."""
+
+ timestamp: datetime
+ """The timestamp in ISO 8601 format that the webhook was sent at on the server"""
+
+ type: Literal["payment.pending"]
+ """The webhook event type"""
diff --git a/src/whop_sdk/types/payment_succeeded_webhook_event.py b/src/whop_sdk/types/payment_succeeded_webhook_event.py
new file mode 100644
index 00000000..f4427c17
--- /dev/null
+++ b/src/whop_sdk/types/payment_succeeded_webhook_event.py
@@ -0,0 +1,26 @@
+# File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.
+
+from datetime import datetime
+from typing_extensions import Literal
+
+from .._models import BaseModel
+from .shared.payment import Payment
+
+__all__ = ["PaymentSucceededWebhookEvent"]
+
+
+class PaymentSucceededWebhookEvent(BaseModel):
+ id: str
+ """A unique ID for every single webhook request"""
+
+ api_version: Literal["v1"]
+ """The API version for this webhook"""
+
+ data: Payment
+ """An object representing a receipt for a membership."""
+
+ timestamp: datetime
+ """The timestamp in ISO 8601 format that the webhook was sent at on the server"""
+
+ type: Literal["payment.succeeded"]
+ """The webhook event type"""
diff --git a/src/whop_sdk/types/unwrap_webhook_event.py b/src/whop_sdk/types/unwrap_webhook_event.py
index 19638b00..a86f390b 100644
--- a/src/whop_sdk/types/unwrap_webhook_event.py
+++ b/src/whop_sdk/types/unwrap_webhook_event.py
@@ -5,11 +5,24 @@
from .invoice_paid_webhook_event import InvoicePaidWebhookEvent
from .invoice_voided_webhook_event import InvoiceVoidedWebhookEvent
+from .payment_failed_webhook_event import PaymentFailedWebhookEvent
from .invoice_created_webhook_event import InvoiceCreatedWebhookEvent
+from .payment_pending_webhook_event import PaymentPendingWebhookEvent
from .invoice_past_due_webhook_event import InvoicePastDueWebhookEvent
+from .payment_succeeded_webhook_event import PaymentSucceededWebhookEvent
+from .membership_activated_webhook_event import MembershipActivatedWebhookEvent
+from .membership_deactivated_webhook_event import MembershipDeactivatedWebhookEvent
__all__ = ["UnwrapWebhookEvent"]
UnwrapWebhookEvent: TypeAlias = Union[
- InvoiceCreatedWebhookEvent, InvoicePaidWebhookEvent, InvoicePastDueWebhookEvent, InvoiceVoidedWebhookEvent
+ InvoiceCreatedWebhookEvent,
+ InvoicePaidWebhookEvent,
+ InvoicePastDueWebhookEvent,
+ InvoiceVoidedWebhookEvent,
+ MembershipActivatedWebhookEvent,
+ MembershipDeactivatedWebhookEvent,
+ PaymentSucceededWebhookEvent,
+ PaymentFailedWebhookEvent,
+ PaymentPendingWebhookEvent,
]
From 2d9ebeebfa02aed3ec8b515d0e5b11de07062a38 Mon Sep 17 00:00:00 2001
From: "stainless-app[bot]"
<142633134+stainless-app[bot]@users.noreply.github.com>
Date: Wed, 22 Oct 2025 17:08:19 +0000
Subject: [PATCH 16/17] feat(api): api update
---
.stats.yml | 4 +--
api.md | 5 ++++
src/whop_sdk/types/__init__.py | 7 +++++
...son_interaction_completed_webhook_event.py | 26 +++++++++++++++++++
.../types/entry_approved_webhook_event.py | 26 +++++++++++++++++++
.../types/entry_created_webhook_event.py | 26 +++++++++++++++++++
.../types/entry_deleted_webhook_event.py | 26 +++++++++++++++++++
.../types/entry_denied_webhook_event.py | 26 +++++++++++++++++++
.../types/shared/course_lesson_interaction.py | 21 ++++++++++++++-
src/whop_sdk/types/unwrap_webhook_event.py | 10 +++++++
10 files changed, 174 insertions(+), 3 deletions(-)
create mode 100644 src/whop_sdk/types/course_lesson_interaction_completed_webhook_event.py
create mode 100644 src/whop_sdk/types/entry_approved_webhook_event.py
create mode 100644 src/whop_sdk/types/entry_created_webhook_event.py
create mode 100644 src/whop_sdk/types/entry_deleted_webhook_event.py
create mode 100644 src/whop_sdk/types/entry_denied_webhook_event.py
diff --git a/.stats.yml b/.stats.yml
index ab14c302..ff4a3e82 100644
--- a/.stats.yml
+++ b/.stats.yml
@@ -1,4 +1,4 @@
configured_endpoints: 81
-openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/frostedinc%2Fwhopsdk-d91d60417bc5284c347c5b5d7987372c67162442e3254a8dc25fe2724c2de1ef.yml
-openapi_spec_hash: dba4f56c933e32fddf08056f5b927a49
+openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/frostedinc%2Fwhopsdk-e8bcfd8a19f54624e644a1bc061df234a2e12af010a6c595d5a698cdd0e20682.yml
+openapi_spec_hash: b47bb36fbc4c9ebdf3cf6b06f33356ef
config_hash: 131e5271eed10cf11ebc421d5a0c5f8a
diff --git a/api.md b/api.md
index 9695d201..4195aa21 100644
--- a/api.md
+++ b/api.md
@@ -136,6 +136,11 @@ from whop_sdk.types import (
InvoiceVoidedWebhookEvent,
MembershipActivatedWebhookEvent,
MembershipDeactivatedWebhookEvent,
+ EntryCreatedWebhookEvent,
+ EntryApprovedWebhookEvent,
+ EntryDeniedWebhookEvent,
+ EntryDeletedWebhookEvent,
+ CourseLessonInteractionCompletedWebhookEvent,
PaymentSucceededWebhookEvent,
PaymentFailedWebhookEvent,
PaymentPendingWebhookEvent,
diff --git a/src/whop_sdk/types/__init__.py b/src/whop_sdk/types/__init__.py
index 1939a286..37c1e57a 100644
--- a/src/whop_sdk/types/__init__.py
+++ b/src/whop_sdk/types/__init__.py
@@ -127,11 +127,15 @@
from .membership_update_params import MembershipUpdateParams as MembershipUpdateParams
from .chat_channel_list_response import ChatChannelListResponse as ChatChannelListResponse
from .chat_channel_update_params import ChatChannelUpdateParams as ChatChannelUpdateParams
+from .entry_denied_webhook_event import EntryDeniedWebhookEvent as EntryDeniedWebhookEvent
from .experience_delete_response import ExperienceDeleteResponse as ExperienceDeleteResponse
from .invoice_paid_webhook_event import InvoicePaidWebhookEvent as InvoicePaidWebhookEvent
from .user_check_access_response import UserCheckAccessResponse as UserCheckAccessResponse
from .authorized_user_list_params import AuthorizedUserListParams as AuthorizedUserListParams
+from .entry_created_webhook_event import EntryCreatedWebhookEvent as EntryCreatedWebhookEvent
+from .entry_deleted_webhook_event import EntryDeletedWebhookEvent as EntryDeletedWebhookEvent
from .support_channel_list_params import SupportChannelListParams as SupportChannelListParams
+from .entry_approved_webhook_event import EntryApprovedWebhookEvent as EntryApprovedWebhookEvent
from .invoice_voided_webhook_event import InvoiceVoidedWebhookEvent as InvoiceVoidedWebhookEvent
from .payment_failed_webhook_event import PaymentFailedWebhookEvent as PaymentFailedWebhookEvent
from .authorized_user_list_response import AuthorizedUserListResponse as AuthorizedUserListResponse
@@ -151,3 +155,6 @@
from .course_lesson_interaction_list_params import (
CourseLessonInteractionListParams as CourseLessonInteractionListParams,
)
+from .course_lesson_interaction_completed_webhook_event import (
+ CourseLessonInteractionCompletedWebhookEvent as CourseLessonInteractionCompletedWebhookEvent,
+)
diff --git a/src/whop_sdk/types/course_lesson_interaction_completed_webhook_event.py b/src/whop_sdk/types/course_lesson_interaction_completed_webhook_event.py
new file mode 100644
index 00000000..afe55710
--- /dev/null
+++ b/src/whop_sdk/types/course_lesson_interaction_completed_webhook_event.py
@@ -0,0 +1,26 @@
+# File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.
+
+from datetime import datetime
+from typing_extensions import Literal
+
+from .._models import BaseModel
+from .shared.course_lesson_interaction import CourseLessonInteraction
+
+__all__ = ["CourseLessonInteractionCompletedWebhookEvent"]
+
+
+class CourseLessonInteractionCompletedWebhookEvent(BaseModel):
+ id: str
+ """A unique ID for every single webhook request"""
+
+ api_version: Literal["v1"]
+ """The API version for this webhook"""
+
+ data: CourseLessonInteraction
+ """A lesson interaction tracking user progress in courses"""
+
+ timestamp: datetime
+ """The timestamp in ISO 8601 format that the webhook was sent at on the server"""
+
+ type: Literal["course_lesson_interaction.completed"]
+ """The webhook event type"""
diff --git a/src/whop_sdk/types/entry_approved_webhook_event.py b/src/whop_sdk/types/entry_approved_webhook_event.py
new file mode 100644
index 00000000..29f31d4f
--- /dev/null
+++ b/src/whop_sdk/types/entry_approved_webhook_event.py
@@ -0,0 +1,26 @@
+# File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.
+
+from datetime import datetime
+from typing_extensions import Literal
+
+from .._models import BaseModel
+from .shared.entry import Entry
+
+__all__ = ["EntryApprovedWebhookEvent"]
+
+
+class EntryApprovedWebhookEvent(BaseModel):
+ id: str
+ """A unique ID for every single webhook request"""
+
+ api_version: Literal["v1"]
+ """The API version for this webhook"""
+
+ data: Entry
+ """An object representing an entry in a waitlist."""
+
+ timestamp: datetime
+ """The timestamp in ISO 8601 format that the webhook was sent at on the server"""
+
+ type: Literal["entry.approved"]
+ """The webhook event type"""
diff --git a/src/whop_sdk/types/entry_created_webhook_event.py b/src/whop_sdk/types/entry_created_webhook_event.py
new file mode 100644
index 00000000..e8c80656
--- /dev/null
+++ b/src/whop_sdk/types/entry_created_webhook_event.py
@@ -0,0 +1,26 @@
+# File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.
+
+from datetime import datetime
+from typing_extensions import Literal
+
+from .._models import BaseModel
+from .shared.entry import Entry
+
+__all__ = ["EntryCreatedWebhookEvent"]
+
+
+class EntryCreatedWebhookEvent(BaseModel):
+ id: str
+ """A unique ID for every single webhook request"""
+
+ api_version: Literal["v1"]
+ """The API version for this webhook"""
+
+ data: Entry
+ """An object representing an entry in a waitlist."""
+
+ timestamp: datetime
+ """The timestamp in ISO 8601 format that the webhook was sent at on the server"""
+
+ type: Literal["entry.created"]
+ """The webhook event type"""
diff --git a/src/whop_sdk/types/entry_deleted_webhook_event.py b/src/whop_sdk/types/entry_deleted_webhook_event.py
new file mode 100644
index 00000000..abe3e7e1
--- /dev/null
+++ b/src/whop_sdk/types/entry_deleted_webhook_event.py
@@ -0,0 +1,26 @@
+# File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.
+
+from datetime import datetime
+from typing_extensions import Literal
+
+from .._models import BaseModel
+from .shared.entry import Entry
+
+__all__ = ["EntryDeletedWebhookEvent"]
+
+
+class EntryDeletedWebhookEvent(BaseModel):
+ id: str
+ """A unique ID for every single webhook request"""
+
+ api_version: Literal["v1"]
+ """The API version for this webhook"""
+
+ data: Entry
+ """An object representing an entry in a waitlist."""
+
+ timestamp: datetime
+ """The timestamp in ISO 8601 format that the webhook was sent at on the server"""
+
+ type: Literal["entry.deleted"]
+ """The webhook event type"""
diff --git a/src/whop_sdk/types/entry_denied_webhook_event.py b/src/whop_sdk/types/entry_denied_webhook_event.py
new file mode 100644
index 00000000..94df91e7
--- /dev/null
+++ b/src/whop_sdk/types/entry_denied_webhook_event.py
@@ -0,0 +1,26 @@
+# File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.
+
+from datetime import datetime
+from typing_extensions import Literal
+
+from .._models import BaseModel
+from .shared.entry import Entry
+
+__all__ = ["EntryDeniedWebhookEvent"]
+
+
+class EntryDeniedWebhookEvent(BaseModel):
+ id: str
+ """A unique ID for every single webhook request"""
+
+ api_version: Literal["v1"]
+ """The API version for this webhook"""
+
+ data: Entry
+ """An object representing an entry in a waitlist."""
+
+ timestamp: datetime
+ """The timestamp in ISO 8601 format that the webhook was sent at on the server"""
+
+ type: Literal["entry.denied"]
+ """The webhook event type"""
diff --git a/src/whop_sdk/types/shared/course_lesson_interaction.py b/src/whop_sdk/types/shared/course_lesson_interaction.py
index 223acc52..f8c617b7 100644
--- a/src/whop_sdk/types/shared/course_lesson_interaction.py
+++ b/src/whop_sdk/types/shared/course_lesson_interaction.py
@@ -5,7 +5,23 @@
from ..._models import BaseModel
-__all__ = ["CourseLessonInteraction", "Lesson", "User"]
+__all__ = ["CourseLessonInteraction", "Course", "CourseExperience", "Lesson", "User"]
+
+
+class CourseExperience(BaseModel):
+ id: str
+ """The unique ID representing this experience"""
+
+
+class Course(BaseModel):
+ id: str
+ """The ID of the course. Looks like cors_XXX"""
+
+ experience: CourseExperience
+ """The experience that the course belongs to"""
+
+ title: Optional[str] = None
+ """The title of the course"""
class Lesson(BaseModel):
@@ -34,6 +50,9 @@ class CourseLessonInteraction(BaseModel):
completed: bool
"""Whether the lesson has been completed by the user"""
+ course: Course
+ """The course for this lesson interaction"""
+
created_at: datetime
"""When the interaction was created"""
diff --git a/src/whop_sdk/types/unwrap_webhook_event.py b/src/whop_sdk/types/unwrap_webhook_event.py
index a86f390b..aa869c77 100644
--- a/src/whop_sdk/types/unwrap_webhook_event.py
+++ b/src/whop_sdk/types/unwrap_webhook_event.py
@@ -3,7 +3,11 @@
from typing import Union
from typing_extensions import TypeAlias
+from .entry_denied_webhook_event import EntryDeniedWebhookEvent
from .invoice_paid_webhook_event import InvoicePaidWebhookEvent
+from .entry_created_webhook_event import EntryCreatedWebhookEvent
+from .entry_deleted_webhook_event import EntryDeletedWebhookEvent
+from .entry_approved_webhook_event import EntryApprovedWebhookEvent
from .invoice_voided_webhook_event import InvoiceVoidedWebhookEvent
from .payment_failed_webhook_event import PaymentFailedWebhookEvent
from .invoice_created_webhook_event import InvoiceCreatedWebhookEvent
@@ -12,6 +16,7 @@
from .payment_succeeded_webhook_event import PaymentSucceededWebhookEvent
from .membership_activated_webhook_event import MembershipActivatedWebhookEvent
from .membership_deactivated_webhook_event import MembershipDeactivatedWebhookEvent
+from .course_lesson_interaction_completed_webhook_event import CourseLessonInteractionCompletedWebhookEvent
__all__ = ["UnwrapWebhookEvent"]
@@ -22,6 +27,11 @@
InvoiceVoidedWebhookEvent,
MembershipActivatedWebhookEvent,
MembershipDeactivatedWebhookEvent,
+ EntryCreatedWebhookEvent,
+ EntryApprovedWebhookEvent,
+ EntryDeniedWebhookEvent,
+ EntryDeletedWebhookEvent,
+ CourseLessonInteractionCompletedWebhookEvent,
PaymentSucceededWebhookEvent,
PaymentFailedWebhookEvent,
PaymentPendingWebhookEvent,
From 2105ec789ad95b265fedbd643b5dbfe099a9353b Mon Sep 17 00:00:00 2001
From: "stainless-app[bot]"
<142633134+stainless-app[bot]@users.noreply.github.com>
Date: Wed, 22 Oct 2025 18:22:47 +0000
Subject: [PATCH 17/17] release: 0.0.2
---
.release-please-manifest.json | 2 +-
CHANGELOG.md | 19 +++++++++++++++++++
pyproject.toml | 2 +-
src/whop_sdk/_version.py | 2 +-
4 files changed, 22 insertions(+), 3 deletions(-)
diff --git a/.release-please-manifest.json b/.release-please-manifest.json
index 1332969b..c7159c1a 100644
--- a/.release-please-manifest.json
+++ b/.release-please-manifest.json
@@ -1,3 +1,3 @@
{
- ".": "0.0.1"
+ ".": "0.0.2"
}
\ No newline at end of file
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 56ea1ae3..c5c855ac 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,5 +1,24 @@
# Changelog
+## 0.0.2 (2025-10-22)
+
+Full Changelog: [v0.0.1...v0.0.2](https://github.com/whopio/whopsdk-python/compare/v0.0.1...v0.0.2)
+
+### Features
+
+* **api:** api update ([2d9ebee](https://github.com/whopio/whopsdk-python/commit/2d9ebeebfa02aed3ec8b515d0e5b11de07062a38))
+* **api:** api update ([5663cf4](https://github.com/whopio/whopsdk-python/commit/5663cf45944bf6f9d236b7a77aac23ce7f17fb61))
+* **api:** api update ([d3d6d23](https://github.com/whopio/whopsdk-python/commit/d3d6d2364fbac6ec7e828471093c27e5bdba8527))
+* **api:** api update ([f05be6f](https://github.com/whopio/whopsdk-python/commit/f05be6fd65bbd8fca4400d2e38e727153a72de43))
+* **api:** api update ([cb2935f](https://github.com/whopio/whopsdk-python/commit/cb2935feaef3aa0fe324bf2bb2bb193c96b12275))
+* **api:** api update ([d66c088](https://github.com/whopio/whopsdk-python/commit/d66c08873a123a5b65a5fa6f17e66ec6668e37a3))
+* **api:** manual updates ([e0bea9f](https://github.com/whopio/whopsdk-python/commit/e0bea9ff169b03e85ba7111ccd7cbe1f4a1eb4cf))
+
+
+### Chores
+
+* bump `httpx-aiohttp` version to 0.1.9 ([a946c15](https://github.com/whopio/whopsdk-python/commit/a946c15a8d418258f8d259714e725922e44c9389))
+
## 0.0.1 (2025-10-16)
Full Changelog: [v0.0.1...v0.0.1](https://github.com/whopio/whopsdk-python/compare/v0.0.1...v0.0.1)
diff --git a/pyproject.toml b/pyproject.toml
index c3788c26..1af33a1c 100644
--- a/pyproject.toml
+++ b/pyproject.toml
@@ -1,6 +1,6 @@
[project]
name = "whop-sdk"
-version = "0.0.1"
+version = "0.0.2"
description = "The official Python library for the Whop API"
dynamic = ["readme"]
license = "Apache-2.0"
diff --git a/src/whop_sdk/_version.py b/src/whop_sdk/_version.py
index 35444f45..d3607fd9 100644
--- a/src/whop_sdk/_version.py
+++ b/src/whop_sdk/_version.py
@@ -1,4 +1,4 @@
# File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.
__title__ = "whop_sdk"
-__version__ = "0.0.1" # x-release-please-version
+__version__ = "0.0.2" # x-release-please-version