From 020c181cf53f7811401fe01d4382fe490e6e5398 Mon Sep 17 00:00:00 2001 From: "stainless-app[bot]" <142633134+stainless-app[bot]@users.noreply.github.com> Date: Thu, 26 Feb 2026 04:27:39 +0000 Subject: [PATCH 01/17] feat(api): api update --- .stats.yml | 4 ++-- src/whop_sdk/types/payment_list_response.py | 10 ++++++++++ src/whop_sdk/types/shared/payment.py | 12 ++++++++++++ 3 files changed, 24 insertions(+), 2 deletions(-) diff --git a/.stats.yml b/.stats.yml index f91f6ee2..06af4733 100644 --- a/.stats.yml +++ b/.stats.yml @@ -1,4 +1,4 @@ configured_endpoints: 173 -openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/frostedinc%2Fwhopsdk-cc6caefebc5d0c5b09a38a2ca3de9b07a8af8017a45a3a8ae4687eea30e5df93.yml -openapi_spec_hash: 384c511adb0c53319ac3ece08843f485 +openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/frostedinc%2Fwhopsdk-83f180bc7eaf233c843687325db376fb6c329d1fb8ae1153f9e0ce9586b15f10.yml +openapi_spec_hash: ee114508489bde15a425af78ef7ca271 config_hash: 8ac153ea57fa6460b13cded3f7c9c7a6 diff --git a/src/whop_sdk/types/payment_list_response.py b/src/whop_sdk/types/payment_list_response.py index 438f5ecd..5a27366a 100644 --- a/src/whop_sdk/types/payment_list_response.py +++ b/src/whop_sdk/types/payment_list_response.py @@ -2,6 +2,7 @@ from typing import Dict, Optional from datetime import datetime +from typing_extensions import Literal from .._models import BaseModel from .card_brands import CardBrands @@ -345,6 +346,15 @@ class PaymentListResponse(BaseModel): subtotal: Optional[float] = None """The subtotal to show to the creator (excluding buyer fees).""" + tax_amount: Optional[float] = None + """The calculated amount of the sales/VAT tax (if applicable).""" + + tax_behavior: Optional[Literal["exclusive", "inclusive", "unspecified", "unable_to_collect"]] = None + """ + The type of tax inclusivity applied to the receipt, for determining whether the + tax is included in the final price, or paid on top. + """ + total: Optional[float] = None """The total to show to the creator (excluding buyer fees).""" diff --git a/src/whop_sdk/types/shared/payment.py b/src/whop_sdk/types/shared/payment.py index 07f5c8d5..e3034c7b 100644 --- a/src/whop_sdk/types/shared/payment.py +++ b/src/whop_sdk/types/shared/payment.py @@ -509,6 +509,18 @@ class Payment(BaseModel): subtotal: Optional[float] = None """The subtotal to show to the creator (excluding buyer fees).""" + tax_amount: Optional[float] = None + """The calculated amount of the sales/VAT tax (if applicable).""" + + tax_behavior: Optional[Literal["exclusive", "inclusive", "unspecified", "unable_to_collect"]] = None + """ + The type of tax inclusivity applied to the receipt, for determining whether the + tax is included in the final price, or paid on top. + """ + + tax_refunded_amount: Optional[float] = None + """The amount of tax that has been refunded (if applicable).""" + total: Optional[float] = None """The total to show to the creator (excluding buyer fees).""" From c60ab1e6568cef6910ec61773887c8b9546c52d4 Mon Sep 17 00:00:00 2001 From: "stainless-app[bot]" <142633134+stainless-app[bot]@users.noreply.github.com> Date: Thu, 26 Feb 2026 17:27:14 +0000 Subject: [PATCH 02/17] feat(api): api update --- .stats.yml | 4 ++-- src/whop_sdk/types/refund_created_webhook_event.py | 12 ++++++++++++ src/whop_sdk/types/refund_retrieve_response.py | 13 +++++++++++++ src/whop_sdk/types/refund_updated_webhook_event.py | 12 ++++++++++++ 4 files changed, 39 insertions(+), 2 deletions(-) diff --git a/.stats.yml b/.stats.yml index 06af4733..aa3bbbde 100644 --- a/.stats.yml +++ b/.stats.yml @@ -1,4 +1,4 @@ configured_endpoints: 173 -openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/frostedinc%2Fwhopsdk-83f180bc7eaf233c843687325db376fb6c329d1fb8ae1153f9e0ce9586b15f10.yml -openapi_spec_hash: ee114508489bde15a425af78ef7ca271 +openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/frostedinc%2Fwhopsdk-5980409df404e57fae7b1032a6d993ec6ab2677889601bb231d1896331110046.yml +openapi_spec_hash: 637b880cc5a2724c2aa9a1287b69674d config_hash: 8ac153ea57fa6460b13cded3f7c9c7a6 diff --git a/src/whop_sdk/types/refund_created_webhook_event.py b/src/whop_sdk/types/refund_created_webhook_event.py index cd83e28c..b0e2b0fe 100644 --- a/src/whop_sdk/types/refund_created_webhook_event.py +++ b/src/whop_sdk/types/refund_created_webhook_event.py @@ -112,6 +112,18 @@ class DataPayment(BaseModel): subtotal: Optional[float] = None """The subtotal to show to the creator (excluding buyer fees).""" + tax_amount: Optional[float] = None + """The calculated amount of the sales/VAT tax (if applicable).""" + + tax_behavior: Optional[Literal["exclusive", "inclusive", "unspecified", "unable_to_collect"]] = None + """ + The type of tax inclusivity applied to the receipt, for determining whether the + tax is included in the final price, or paid on top. + """ + + tax_refunded_amount: Optional[float] = None + """The amount of tax that has been refunded (if applicable).""" + total: Optional[float] = None """The total to show to the creator (excluding buyer fees).""" diff --git a/src/whop_sdk/types/refund_retrieve_response.py b/src/whop_sdk/types/refund_retrieve_response.py index 973ec6c3..2ddf3196 100644 --- a/src/whop_sdk/types/refund_retrieve_response.py +++ b/src/whop_sdk/types/refund_retrieve_response.py @@ -2,6 +2,7 @@ from typing import Optional from datetime import datetime +from typing_extensions import Literal from .._models import BaseModel from .card_brands import CardBrands @@ -104,6 +105,18 @@ class Payment(BaseModel): subtotal: Optional[float] = None """The subtotal to show to the creator (excluding buyer fees).""" + tax_amount: Optional[float] = None + """The calculated amount of the sales/VAT tax (if applicable).""" + + tax_behavior: Optional[Literal["exclusive", "inclusive", "unspecified", "unable_to_collect"]] = None + """ + The type of tax inclusivity applied to the receipt, for determining whether the + tax is included in the final price, or paid on top. + """ + + tax_refunded_amount: Optional[float] = None + """The amount of tax that has been refunded (if applicable).""" + total: Optional[float] = None """The total to show to the creator (excluding buyer fees).""" diff --git a/src/whop_sdk/types/refund_updated_webhook_event.py b/src/whop_sdk/types/refund_updated_webhook_event.py index c7d7c86e..7b8c8944 100644 --- a/src/whop_sdk/types/refund_updated_webhook_event.py +++ b/src/whop_sdk/types/refund_updated_webhook_event.py @@ -112,6 +112,18 @@ class DataPayment(BaseModel): subtotal: Optional[float] = None """The subtotal to show to the creator (excluding buyer fees).""" + tax_amount: Optional[float] = None + """The calculated amount of the sales/VAT tax (if applicable).""" + + tax_behavior: Optional[Literal["exclusive", "inclusive", "unspecified", "unable_to_collect"]] = None + """ + The type of tax inclusivity applied to the receipt, for determining whether the + tax is included in the final price, or paid on top. + """ + + tax_refunded_amount: Optional[float] = None + """The amount of tax that has been refunded (if applicable).""" + total: Optional[float] = None """The total to show to the creator (excluding buyer fees).""" From d62a4b7961c1264d9c4055a026238a72822b8b19 Mon Sep 17 00:00:00 2001 From: "stainless-app[bot]" <142633134+stainless-app[bot]@users.noreply.github.com> Date: Thu, 26 Feb 2026 22:38:18 +0000 Subject: [PATCH 03/17] feat(api): api update --- .stats.yml | 4 ++-- src/whop_sdk/types/message_list_response.py | 9 +++++++++ src/whop_sdk/types/shared/message.py | 9 +++++++++ 3 files changed, 20 insertions(+), 2 deletions(-) diff --git a/.stats.yml b/.stats.yml index aa3bbbde..11c0bf72 100644 --- a/.stats.yml +++ b/.stats.yml @@ -1,4 +1,4 @@ configured_endpoints: 173 -openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/frostedinc%2Fwhopsdk-5980409df404e57fae7b1032a6d993ec6ab2677889601bb231d1896331110046.yml -openapi_spec_hash: 637b880cc5a2724c2aa9a1287b69674d +openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/frostedinc%2Fwhopsdk-8998964c7e02d7bd7d096104b987949bfc34f18f928f20bf36e15794e0edd0a6.yml +openapi_spec_hash: 909836d9685b020916fd5e6ae35ac1ac config_hash: 8ac153ea57fa6460b13cded3f7c9c7a6 diff --git a/src/whop_sdk/types/message_list_response.py b/src/whop_sdk/types/message_list_response.py index 92e9660e..f6652e99 100644 --- a/src/whop_sdk/types/message_list_response.py +++ b/src/whop_sdk/types/message_list_response.py @@ -87,6 +87,15 @@ class MessageListResponse(BaseModel): is_pinned: bool """Whether this message is pinned to the top of the channel for easy access.""" + mentions: List[str] + """A list of user IDs that are explicitly mentioned in this message.""" + + mentions_everyone: bool + """ + Whether the message includes an @everyone mention that notifies all channel + members. + """ + message_type: DmsPostTypes """The classification of this message: regular, system, or automated.""" diff --git a/src/whop_sdk/types/shared/message.py b/src/whop_sdk/types/shared/message.py index 5b0ad97d..a24f502d 100644 --- a/src/whop_sdk/types/shared/message.py +++ b/src/whop_sdk/types/shared/message.py @@ -87,6 +87,15 @@ class Message(BaseModel): is_pinned: bool """Whether this message is pinned to the top of the channel for easy access.""" + mentions: List[str] + """A list of user IDs that are explicitly mentioned in this message.""" + + mentions_everyone: bool + """ + Whether the message includes an @everyone mention that notifies all channel + members. + """ + message_type: DmsPostTypes """The classification of this message: regular, system, or automated.""" From beeb9efca946b1bc2e565239ac96d3d2d8642b6f Mon Sep 17 00:00:00 2001 From: "stainless-app[bot]" <142633134+stainless-app[bot]@users.noreply.github.com> Date: Fri, 27 Feb 2026 23:02:51 +0000 Subject: [PATCH 04/17] chore(docs): add missing descriptions --- src/whop_sdk/_client.py | 300 ++++++++++++++++++ src/whop_sdk/resources/access_tokens.py | 4 + src/whop_sdk/resources/account_links.py | 4 + src/whop_sdk/resources/ai_chats.py | 4 + src/whop_sdk/resources/app_builds.py | 4 + src/whop_sdk/resources/apps.py | 4 + src/whop_sdk/resources/authorized_users.py | 4 + src/whop_sdk/resources/chat_channels.py | 4 + .../resources/checkout_configurations.py | 4 + src/whop_sdk/resources/companies.py | 4 + .../resources/company_token_transactions.py | 4 + src/whop_sdk/resources/course_chapters.py | 4 + .../resources/course_lesson_interactions.py | 4 + src/whop_sdk/resources/course_lessons.py | 4 + src/whop_sdk/resources/course_students.py | 4 + src/whop_sdk/resources/courses.py | 4 + src/whop_sdk/resources/dispute_alerts.py | 4 + src/whop_sdk/resources/disputes.py | 4 + src/whop_sdk/resources/dm_channels.py | 4 + src/whop_sdk/resources/dm_members.py | 4 + src/whop_sdk/resources/entries.py | 4 + src/whop_sdk/resources/experiences.py | 4 + src/whop_sdk/resources/fee_markups.py | 4 + src/whop_sdk/resources/files.py | 4 + src/whop_sdk/resources/forum_posts.py | 4 + src/whop_sdk/resources/forums.py | 4 + src/whop_sdk/resources/invoices.py | 4 + src/whop_sdk/resources/leads.py | 4 + src/whop_sdk/resources/ledger_accounts.py | 4 + src/whop_sdk/resources/members.py | 4 + src/whop_sdk/resources/memberships.py | 4 + src/whop_sdk/resources/messages.py | 4 + src/whop_sdk/resources/notifications.py | 4 + src/whop_sdk/resources/payment_methods.py | 4 + src/whop_sdk/resources/payments.py | 4 + src/whop_sdk/resources/payout_methods.py | 4 + src/whop_sdk/resources/plans.py | 4 + src/whop_sdk/resources/products.py | 4 + src/whop_sdk/resources/promo_codes.py | 4 + src/whop_sdk/resources/reactions.py | 4 + src/whop_sdk/resources/refunds.py | 4 + src/whop_sdk/resources/reviews.py | 4 + src/whop_sdk/resources/setup_intents.py | 4 + src/whop_sdk/resources/shipments.py | 4 + src/whop_sdk/resources/support_channels.py | 4 + src/whop_sdk/resources/topups.py | 4 + src/whop_sdk/resources/transfers.py | 4 + src/whop_sdk/resources/users.py | 4 + src/whop_sdk/resources/verifications.py | 4 + src/whop_sdk/resources/webhooks.py | 4 + src/whop_sdk/resources/withdrawals.py | 4 + 51 files changed, 500 insertions(+) diff --git a/src/whop_sdk/_client.py b/src/whop_sdk/_client.py index 65a4f492..ae5d5c9f 100644 --- a/src/whop_sdk/_client.py +++ b/src/whop_sdk/_client.py @@ -215,300 +215,350 @@ def __init__( @cached_property def apps(self) -> AppsResource: + """Apps""" from .resources.apps import AppsResource return AppsResource(self) @cached_property def invoices(self) -> InvoicesResource: + """Invoices""" from .resources.invoices import InvoicesResource return InvoicesResource(self) @cached_property def course_lesson_interactions(self) -> CourseLessonInteractionsResource: + """Course lesson interactions""" from .resources.course_lesson_interactions import CourseLessonInteractionsResource return CourseLessonInteractionsResource(self) @cached_property def products(self) -> ProductsResource: + """Products""" from .resources.products import ProductsResource return ProductsResource(self) @cached_property def companies(self) -> CompaniesResource: + """Companies""" from .resources.companies import CompaniesResource return CompaniesResource(self) @cached_property def webhooks(self) -> WebhooksResource: + """Webhooks""" from .resources.webhooks import WebhooksResource return WebhooksResource(self) @cached_property def plans(self) -> PlansResource: + """Plans""" from .resources.plans import PlansResource return PlansResource(self) @cached_property def entries(self) -> EntriesResource: + """Entries""" from .resources.entries import EntriesResource return EntriesResource(self) @cached_property def forum_posts(self) -> ForumPostsResource: + """Forum posts""" from .resources.forum_posts import ForumPostsResource return ForumPostsResource(self) @cached_property def transfers(self) -> TransfersResource: + """Transfers""" from .resources.transfers import TransfersResource return TransfersResource(self) @cached_property def ledger_accounts(self) -> LedgerAccountsResource: + """Ledger accounts""" from .resources.ledger_accounts import LedgerAccountsResource return LedgerAccountsResource(self) @cached_property def memberships(self) -> MembershipsResource: + """Memberships""" from .resources.memberships import MembershipsResource return MembershipsResource(self) @cached_property def authorized_users(self) -> AuthorizedUsersResource: + """Authorized users""" from .resources.authorized_users import AuthorizedUsersResource return AuthorizedUsersResource(self) @cached_property def app_builds(self) -> AppBuildsResource: + """App builds""" from .resources.app_builds import AppBuildsResource return AppBuildsResource(self) @cached_property def shipments(self) -> ShipmentsResource: + """Shipments""" from .resources.shipments import ShipmentsResource return ShipmentsResource(self) @cached_property def checkout_configurations(self) -> CheckoutConfigurationsResource: + """Checkout configurations""" from .resources.checkout_configurations import CheckoutConfigurationsResource return CheckoutConfigurationsResource(self) @cached_property def messages(self) -> MessagesResource: + """Messages""" from .resources.messages import MessagesResource return MessagesResource(self) @cached_property def chat_channels(self) -> ChatChannelsResource: + """Chat channels""" from .resources.chat_channels import ChatChannelsResource return ChatChannelsResource(self) @cached_property def users(self) -> UsersResource: + """Users""" from .resources.users import UsersResource return UsersResource(self) @cached_property def payments(self) -> PaymentsResource: + """Payments""" from .resources.payments import PaymentsResource return PaymentsResource(self) @cached_property def support_channels(self) -> SupportChannelsResource: + """Support channels""" from .resources.support_channels import SupportChannelsResource return SupportChannelsResource(self) @cached_property def experiences(self) -> ExperiencesResource: + """Experiences""" from .resources.experiences import ExperiencesResource return ExperiencesResource(self) @cached_property def reactions(self) -> ReactionsResource: + """Reactions""" from .resources.reactions import ReactionsResource return ReactionsResource(self) @cached_property def members(self) -> MembersResource: + """Members""" from .resources.members import MembersResource return MembersResource(self) @cached_property def forums(self) -> ForumsResource: + """Forums""" from .resources.forums import ForumsResource return ForumsResource(self) @cached_property def promo_codes(self) -> PromoCodesResource: + """Promo codes""" from .resources.promo_codes import PromoCodesResource return PromoCodesResource(self) @cached_property def courses(self) -> CoursesResource: + """Courses""" from .resources.courses import CoursesResource return CoursesResource(self) @cached_property def course_chapters(self) -> CourseChaptersResource: + """Course chapters""" from .resources.course_chapters import CourseChaptersResource return CourseChaptersResource(self) @cached_property def course_lessons(self) -> CourseLessonsResource: + """Course lessons""" from .resources.course_lessons import CourseLessonsResource return CourseLessonsResource(self) @cached_property def reviews(self) -> ReviewsResource: + """Reviews""" from .resources.reviews import ReviewsResource return ReviewsResource(self) @cached_property def course_students(self) -> CourseStudentsResource: + """Course students""" from .resources.course_students import CourseStudentsResource return CourseStudentsResource(self) @cached_property def access_tokens(self) -> AccessTokensResource: + """Access tokens""" from .resources.access_tokens import AccessTokensResource return AccessTokensResource(self) @cached_property def notifications(self) -> NotificationsResource: + """Notifications""" from .resources.notifications import NotificationsResource return NotificationsResource(self) @cached_property def disputes(self) -> DisputesResource: + """Disputes""" from .resources.disputes import DisputesResource return DisputesResource(self) @cached_property def refunds(self) -> RefundsResource: + """Refunds""" from .resources.refunds import RefundsResource return RefundsResource(self) @cached_property def withdrawals(self) -> WithdrawalsResource: + """Withdrawals""" from .resources.withdrawals import WithdrawalsResource return WithdrawalsResource(self) @cached_property def account_links(self) -> AccountLinksResource: + """Account links""" from .resources.account_links import AccountLinksResource return AccountLinksResource(self) @cached_property def setup_intents(self) -> SetupIntentsResource: + """Setup intents""" from .resources.setup_intents import SetupIntentsResource return SetupIntentsResource(self) @cached_property def payment_methods(self) -> PaymentMethodsResource: + """Payment methods""" from .resources.payment_methods import PaymentMethodsResource return PaymentMethodsResource(self) @cached_property def fee_markups(self) -> FeeMarkupsResource: + """Fee markups""" from .resources.fee_markups import FeeMarkupsResource return FeeMarkupsResource(self) @cached_property def payout_methods(self) -> PayoutMethodsResource: + """Payout methods""" from .resources.payout_methods import PayoutMethodsResource return PayoutMethodsResource(self) @cached_property def verifications(self) -> VerificationsResource: + """Verifications""" from .resources.verifications import VerificationsResource return VerificationsResource(self) @cached_property def leads(self) -> LeadsResource: + """Leads""" from .resources.leads import LeadsResource return LeadsResource(self) @cached_property def topups(self) -> TopupsResource: + """Topups""" from .resources.topups import TopupsResource return TopupsResource(self) @cached_property def files(self) -> FilesResource: + """Files""" from .resources.files import FilesResource return FilesResource(self) @cached_property def company_token_transactions(self) -> CompanyTokenTransactionsResource: + """Company token transactions""" from .resources.company_token_transactions import CompanyTokenTransactionsResource return CompanyTokenTransactionsResource(self) @cached_property def dm_members(self) -> DmMembersResource: + """Dm members""" from .resources.dm_members import DmMembersResource return DmMembersResource(self) @cached_property def ai_chats(self) -> AIChatsResource: + """Ai chats""" from .resources.ai_chats import AIChatsResource return AIChatsResource(self) @cached_property def dm_channels(self) -> DmChannelsResource: + """Dm channels""" from .resources.dm_channels import DmChannelsResource return DmChannelsResource(self) @cached_property def dispute_alerts(self) -> DisputeAlertsResource: + """Dispute alerts""" from .resources.dispute_alerts import DisputeAlertsResource return DisputeAlertsResource(self) @@ -703,300 +753,350 @@ def __init__( @cached_property def apps(self) -> AsyncAppsResource: + """Apps""" from .resources.apps import AsyncAppsResource return AsyncAppsResource(self) @cached_property def invoices(self) -> AsyncInvoicesResource: + """Invoices""" from .resources.invoices import AsyncInvoicesResource return AsyncInvoicesResource(self) @cached_property def course_lesson_interactions(self) -> AsyncCourseLessonInteractionsResource: + """Course lesson interactions""" from .resources.course_lesson_interactions import AsyncCourseLessonInteractionsResource return AsyncCourseLessonInteractionsResource(self) @cached_property def products(self) -> AsyncProductsResource: + """Products""" from .resources.products import AsyncProductsResource return AsyncProductsResource(self) @cached_property def companies(self) -> AsyncCompaniesResource: + """Companies""" from .resources.companies import AsyncCompaniesResource return AsyncCompaniesResource(self) @cached_property def webhooks(self) -> AsyncWebhooksResource: + """Webhooks""" from .resources.webhooks import AsyncWebhooksResource return AsyncWebhooksResource(self) @cached_property def plans(self) -> AsyncPlansResource: + """Plans""" from .resources.plans import AsyncPlansResource return AsyncPlansResource(self) @cached_property def entries(self) -> AsyncEntriesResource: + """Entries""" from .resources.entries import AsyncEntriesResource return AsyncEntriesResource(self) @cached_property def forum_posts(self) -> AsyncForumPostsResource: + """Forum posts""" from .resources.forum_posts import AsyncForumPostsResource return AsyncForumPostsResource(self) @cached_property def transfers(self) -> AsyncTransfersResource: + """Transfers""" from .resources.transfers import AsyncTransfersResource return AsyncTransfersResource(self) @cached_property def ledger_accounts(self) -> AsyncLedgerAccountsResource: + """Ledger accounts""" from .resources.ledger_accounts import AsyncLedgerAccountsResource return AsyncLedgerAccountsResource(self) @cached_property def memberships(self) -> AsyncMembershipsResource: + """Memberships""" from .resources.memberships import AsyncMembershipsResource return AsyncMembershipsResource(self) @cached_property def authorized_users(self) -> AsyncAuthorizedUsersResource: + """Authorized users""" from .resources.authorized_users import AsyncAuthorizedUsersResource return AsyncAuthorizedUsersResource(self) @cached_property def app_builds(self) -> AsyncAppBuildsResource: + """App builds""" from .resources.app_builds import AsyncAppBuildsResource return AsyncAppBuildsResource(self) @cached_property def shipments(self) -> AsyncShipmentsResource: + """Shipments""" from .resources.shipments import AsyncShipmentsResource return AsyncShipmentsResource(self) @cached_property def checkout_configurations(self) -> AsyncCheckoutConfigurationsResource: + """Checkout configurations""" from .resources.checkout_configurations import AsyncCheckoutConfigurationsResource return AsyncCheckoutConfigurationsResource(self) @cached_property def messages(self) -> AsyncMessagesResource: + """Messages""" from .resources.messages import AsyncMessagesResource return AsyncMessagesResource(self) @cached_property def chat_channels(self) -> AsyncChatChannelsResource: + """Chat channels""" from .resources.chat_channels import AsyncChatChannelsResource return AsyncChatChannelsResource(self) @cached_property def users(self) -> AsyncUsersResource: + """Users""" from .resources.users import AsyncUsersResource return AsyncUsersResource(self) @cached_property def payments(self) -> AsyncPaymentsResource: + """Payments""" from .resources.payments import AsyncPaymentsResource return AsyncPaymentsResource(self) @cached_property def support_channels(self) -> AsyncSupportChannelsResource: + """Support channels""" from .resources.support_channels import AsyncSupportChannelsResource return AsyncSupportChannelsResource(self) @cached_property def experiences(self) -> AsyncExperiencesResource: + """Experiences""" from .resources.experiences import AsyncExperiencesResource return AsyncExperiencesResource(self) @cached_property def reactions(self) -> AsyncReactionsResource: + """Reactions""" from .resources.reactions import AsyncReactionsResource return AsyncReactionsResource(self) @cached_property def members(self) -> AsyncMembersResource: + """Members""" from .resources.members import AsyncMembersResource return AsyncMembersResource(self) @cached_property def forums(self) -> AsyncForumsResource: + """Forums""" from .resources.forums import AsyncForumsResource return AsyncForumsResource(self) @cached_property def promo_codes(self) -> AsyncPromoCodesResource: + """Promo codes""" from .resources.promo_codes import AsyncPromoCodesResource return AsyncPromoCodesResource(self) @cached_property def courses(self) -> AsyncCoursesResource: + """Courses""" from .resources.courses import AsyncCoursesResource return AsyncCoursesResource(self) @cached_property def course_chapters(self) -> AsyncCourseChaptersResource: + """Course chapters""" from .resources.course_chapters import AsyncCourseChaptersResource return AsyncCourseChaptersResource(self) @cached_property def course_lessons(self) -> AsyncCourseLessonsResource: + """Course lessons""" from .resources.course_lessons import AsyncCourseLessonsResource return AsyncCourseLessonsResource(self) @cached_property def reviews(self) -> AsyncReviewsResource: + """Reviews""" from .resources.reviews import AsyncReviewsResource return AsyncReviewsResource(self) @cached_property def course_students(self) -> AsyncCourseStudentsResource: + """Course students""" from .resources.course_students import AsyncCourseStudentsResource return AsyncCourseStudentsResource(self) @cached_property def access_tokens(self) -> AsyncAccessTokensResource: + """Access tokens""" from .resources.access_tokens import AsyncAccessTokensResource return AsyncAccessTokensResource(self) @cached_property def notifications(self) -> AsyncNotificationsResource: + """Notifications""" from .resources.notifications import AsyncNotificationsResource return AsyncNotificationsResource(self) @cached_property def disputes(self) -> AsyncDisputesResource: + """Disputes""" from .resources.disputes import AsyncDisputesResource return AsyncDisputesResource(self) @cached_property def refunds(self) -> AsyncRefundsResource: + """Refunds""" from .resources.refunds import AsyncRefundsResource return AsyncRefundsResource(self) @cached_property def withdrawals(self) -> AsyncWithdrawalsResource: + """Withdrawals""" from .resources.withdrawals import AsyncWithdrawalsResource return AsyncWithdrawalsResource(self) @cached_property def account_links(self) -> AsyncAccountLinksResource: + """Account links""" from .resources.account_links import AsyncAccountLinksResource return AsyncAccountLinksResource(self) @cached_property def setup_intents(self) -> AsyncSetupIntentsResource: + """Setup intents""" from .resources.setup_intents import AsyncSetupIntentsResource return AsyncSetupIntentsResource(self) @cached_property def payment_methods(self) -> AsyncPaymentMethodsResource: + """Payment methods""" from .resources.payment_methods import AsyncPaymentMethodsResource return AsyncPaymentMethodsResource(self) @cached_property def fee_markups(self) -> AsyncFeeMarkupsResource: + """Fee markups""" from .resources.fee_markups import AsyncFeeMarkupsResource return AsyncFeeMarkupsResource(self) @cached_property def payout_methods(self) -> AsyncPayoutMethodsResource: + """Payout methods""" from .resources.payout_methods import AsyncPayoutMethodsResource return AsyncPayoutMethodsResource(self) @cached_property def verifications(self) -> AsyncVerificationsResource: + """Verifications""" from .resources.verifications import AsyncVerificationsResource return AsyncVerificationsResource(self) @cached_property def leads(self) -> AsyncLeadsResource: + """Leads""" from .resources.leads import AsyncLeadsResource return AsyncLeadsResource(self) @cached_property def topups(self) -> AsyncTopupsResource: + """Topups""" from .resources.topups import AsyncTopupsResource return AsyncTopupsResource(self) @cached_property def files(self) -> AsyncFilesResource: + """Files""" from .resources.files import AsyncFilesResource return AsyncFilesResource(self) @cached_property def company_token_transactions(self) -> AsyncCompanyTokenTransactionsResource: + """Company token transactions""" from .resources.company_token_transactions import AsyncCompanyTokenTransactionsResource return AsyncCompanyTokenTransactionsResource(self) @cached_property def dm_members(self) -> AsyncDmMembersResource: + """Dm members""" from .resources.dm_members import AsyncDmMembersResource return AsyncDmMembersResource(self) @cached_property def ai_chats(self) -> AsyncAIChatsResource: + """Ai chats""" from .resources.ai_chats import AsyncAIChatsResource return AsyncAIChatsResource(self) @cached_property def dm_channels(self) -> AsyncDmChannelsResource: + """Dm channels""" from .resources.dm_channels import AsyncDmChannelsResource return AsyncDmChannelsResource(self) @cached_property def dispute_alerts(self) -> AsyncDisputeAlertsResource: + """Dispute alerts""" from .resources.dispute_alerts import AsyncDisputeAlertsResource return AsyncDisputeAlertsResource(self) @@ -1127,300 +1227,350 @@ def __init__(self, client: Whop) -> None: @cached_property def apps(self) -> apps.AppsResourceWithRawResponse: + """Apps""" from .resources.apps import AppsResourceWithRawResponse return AppsResourceWithRawResponse(self._client.apps) @cached_property def invoices(self) -> invoices.InvoicesResourceWithRawResponse: + """Invoices""" from .resources.invoices import InvoicesResourceWithRawResponse return InvoicesResourceWithRawResponse(self._client.invoices) @cached_property def course_lesson_interactions(self) -> course_lesson_interactions.CourseLessonInteractionsResourceWithRawResponse: + """Course lesson interactions""" from .resources.course_lesson_interactions import CourseLessonInteractionsResourceWithRawResponse return CourseLessonInteractionsResourceWithRawResponse(self._client.course_lesson_interactions) @cached_property def products(self) -> products.ProductsResourceWithRawResponse: + """Products""" from .resources.products import ProductsResourceWithRawResponse return ProductsResourceWithRawResponse(self._client.products) @cached_property def companies(self) -> companies.CompaniesResourceWithRawResponse: + """Companies""" from .resources.companies import CompaniesResourceWithRawResponse return CompaniesResourceWithRawResponse(self._client.companies) @cached_property def webhooks(self) -> webhooks.WebhooksResourceWithRawResponse: + """Webhooks""" from .resources.webhooks import WebhooksResourceWithRawResponse return WebhooksResourceWithRawResponse(self._client.webhooks) @cached_property def plans(self) -> plans.PlansResourceWithRawResponse: + """Plans""" from .resources.plans import PlansResourceWithRawResponse return PlansResourceWithRawResponse(self._client.plans) @cached_property def entries(self) -> entries.EntriesResourceWithRawResponse: + """Entries""" from .resources.entries import EntriesResourceWithRawResponse return EntriesResourceWithRawResponse(self._client.entries) @cached_property def forum_posts(self) -> forum_posts.ForumPostsResourceWithRawResponse: + """Forum posts""" from .resources.forum_posts import ForumPostsResourceWithRawResponse return ForumPostsResourceWithRawResponse(self._client.forum_posts) @cached_property def transfers(self) -> transfers.TransfersResourceWithRawResponse: + """Transfers""" from .resources.transfers import TransfersResourceWithRawResponse return TransfersResourceWithRawResponse(self._client.transfers) @cached_property def ledger_accounts(self) -> ledger_accounts.LedgerAccountsResourceWithRawResponse: + """Ledger accounts""" from .resources.ledger_accounts import LedgerAccountsResourceWithRawResponse return LedgerAccountsResourceWithRawResponse(self._client.ledger_accounts) @cached_property def memberships(self) -> memberships.MembershipsResourceWithRawResponse: + """Memberships""" from .resources.memberships import MembershipsResourceWithRawResponse return MembershipsResourceWithRawResponse(self._client.memberships) @cached_property def authorized_users(self) -> authorized_users.AuthorizedUsersResourceWithRawResponse: + """Authorized users""" from .resources.authorized_users import AuthorizedUsersResourceWithRawResponse return AuthorizedUsersResourceWithRawResponse(self._client.authorized_users) @cached_property def app_builds(self) -> app_builds.AppBuildsResourceWithRawResponse: + """App builds""" from .resources.app_builds import AppBuildsResourceWithRawResponse return AppBuildsResourceWithRawResponse(self._client.app_builds) @cached_property def shipments(self) -> shipments.ShipmentsResourceWithRawResponse: + """Shipments""" from .resources.shipments import ShipmentsResourceWithRawResponse return ShipmentsResourceWithRawResponse(self._client.shipments) @cached_property def checkout_configurations(self) -> checkout_configurations.CheckoutConfigurationsResourceWithRawResponse: + """Checkout configurations""" from .resources.checkout_configurations import CheckoutConfigurationsResourceWithRawResponse return CheckoutConfigurationsResourceWithRawResponse(self._client.checkout_configurations) @cached_property def messages(self) -> messages.MessagesResourceWithRawResponse: + """Messages""" from .resources.messages import MessagesResourceWithRawResponse return MessagesResourceWithRawResponse(self._client.messages) @cached_property def chat_channels(self) -> chat_channels.ChatChannelsResourceWithRawResponse: + """Chat channels""" from .resources.chat_channels import ChatChannelsResourceWithRawResponse return ChatChannelsResourceWithRawResponse(self._client.chat_channels) @cached_property def users(self) -> users.UsersResourceWithRawResponse: + """Users""" from .resources.users import UsersResourceWithRawResponse return UsersResourceWithRawResponse(self._client.users) @cached_property def payments(self) -> payments.PaymentsResourceWithRawResponse: + """Payments""" from .resources.payments import PaymentsResourceWithRawResponse return PaymentsResourceWithRawResponse(self._client.payments) @cached_property def support_channels(self) -> support_channels.SupportChannelsResourceWithRawResponse: + """Support channels""" from .resources.support_channels import SupportChannelsResourceWithRawResponse return SupportChannelsResourceWithRawResponse(self._client.support_channels) @cached_property def experiences(self) -> experiences.ExperiencesResourceWithRawResponse: + """Experiences""" from .resources.experiences import ExperiencesResourceWithRawResponse return ExperiencesResourceWithRawResponse(self._client.experiences) @cached_property def reactions(self) -> reactions.ReactionsResourceWithRawResponse: + """Reactions""" from .resources.reactions import ReactionsResourceWithRawResponse return ReactionsResourceWithRawResponse(self._client.reactions) @cached_property def members(self) -> members.MembersResourceWithRawResponse: + """Members""" from .resources.members import MembersResourceWithRawResponse return MembersResourceWithRawResponse(self._client.members) @cached_property def forums(self) -> forums.ForumsResourceWithRawResponse: + """Forums""" from .resources.forums import ForumsResourceWithRawResponse return ForumsResourceWithRawResponse(self._client.forums) @cached_property def promo_codes(self) -> promo_codes.PromoCodesResourceWithRawResponse: + """Promo codes""" from .resources.promo_codes import PromoCodesResourceWithRawResponse return PromoCodesResourceWithRawResponse(self._client.promo_codes) @cached_property def courses(self) -> courses.CoursesResourceWithRawResponse: + """Courses""" from .resources.courses import CoursesResourceWithRawResponse return CoursesResourceWithRawResponse(self._client.courses) @cached_property def course_chapters(self) -> course_chapters.CourseChaptersResourceWithRawResponse: + """Course chapters""" from .resources.course_chapters import CourseChaptersResourceWithRawResponse return CourseChaptersResourceWithRawResponse(self._client.course_chapters) @cached_property def course_lessons(self) -> course_lessons.CourseLessonsResourceWithRawResponse: + """Course lessons""" from .resources.course_lessons import CourseLessonsResourceWithRawResponse return CourseLessonsResourceWithRawResponse(self._client.course_lessons) @cached_property def reviews(self) -> reviews.ReviewsResourceWithRawResponse: + """Reviews""" from .resources.reviews import ReviewsResourceWithRawResponse return ReviewsResourceWithRawResponse(self._client.reviews) @cached_property def course_students(self) -> course_students.CourseStudentsResourceWithRawResponse: + """Course students""" from .resources.course_students import CourseStudentsResourceWithRawResponse return CourseStudentsResourceWithRawResponse(self._client.course_students) @cached_property def access_tokens(self) -> access_tokens.AccessTokensResourceWithRawResponse: + """Access tokens""" from .resources.access_tokens import AccessTokensResourceWithRawResponse return AccessTokensResourceWithRawResponse(self._client.access_tokens) @cached_property def notifications(self) -> notifications.NotificationsResourceWithRawResponse: + """Notifications""" from .resources.notifications import NotificationsResourceWithRawResponse return NotificationsResourceWithRawResponse(self._client.notifications) @cached_property def disputes(self) -> disputes.DisputesResourceWithRawResponse: + """Disputes""" from .resources.disputes import DisputesResourceWithRawResponse return DisputesResourceWithRawResponse(self._client.disputes) @cached_property def refunds(self) -> refunds.RefundsResourceWithRawResponse: + """Refunds""" from .resources.refunds import RefundsResourceWithRawResponse return RefundsResourceWithRawResponse(self._client.refunds) @cached_property def withdrawals(self) -> withdrawals.WithdrawalsResourceWithRawResponse: + """Withdrawals""" from .resources.withdrawals import WithdrawalsResourceWithRawResponse return WithdrawalsResourceWithRawResponse(self._client.withdrawals) @cached_property def account_links(self) -> account_links.AccountLinksResourceWithRawResponse: + """Account links""" from .resources.account_links import AccountLinksResourceWithRawResponse return AccountLinksResourceWithRawResponse(self._client.account_links) @cached_property def setup_intents(self) -> setup_intents.SetupIntentsResourceWithRawResponse: + """Setup intents""" from .resources.setup_intents import SetupIntentsResourceWithRawResponse return SetupIntentsResourceWithRawResponse(self._client.setup_intents) @cached_property def payment_methods(self) -> payment_methods.PaymentMethodsResourceWithRawResponse: + """Payment methods""" from .resources.payment_methods import PaymentMethodsResourceWithRawResponse return PaymentMethodsResourceWithRawResponse(self._client.payment_methods) @cached_property def fee_markups(self) -> fee_markups.FeeMarkupsResourceWithRawResponse: + """Fee markups""" from .resources.fee_markups import FeeMarkupsResourceWithRawResponse return FeeMarkupsResourceWithRawResponse(self._client.fee_markups) @cached_property def payout_methods(self) -> payout_methods.PayoutMethodsResourceWithRawResponse: + """Payout methods""" from .resources.payout_methods import PayoutMethodsResourceWithRawResponse return PayoutMethodsResourceWithRawResponse(self._client.payout_methods) @cached_property def verifications(self) -> verifications.VerificationsResourceWithRawResponse: + """Verifications""" from .resources.verifications import VerificationsResourceWithRawResponse return VerificationsResourceWithRawResponse(self._client.verifications) @cached_property def leads(self) -> leads.LeadsResourceWithRawResponse: + """Leads""" from .resources.leads import LeadsResourceWithRawResponse return LeadsResourceWithRawResponse(self._client.leads) @cached_property def topups(self) -> topups.TopupsResourceWithRawResponse: + """Topups""" from .resources.topups import TopupsResourceWithRawResponse return TopupsResourceWithRawResponse(self._client.topups) @cached_property def files(self) -> files.FilesResourceWithRawResponse: + """Files""" from .resources.files import FilesResourceWithRawResponse return FilesResourceWithRawResponse(self._client.files) @cached_property def company_token_transactions(self) -> company_token_transactions.CompanyTokenTransactionsResourceWithRawResponse: + """Company token transactions""" from .resources.company_token_transactions import CompanyTokenTransactionsResourceWithRawResponse return CompanyTokenTransactionsResourceWithRawResponse(self._client.company_token_transactions) @cached_property def dm_members(self) -> dm_members.DmMembersResourceWithRawResponse: + """Dm members""" from .resources.dm_members import DmMembersResourceWithRawResponse return DmMembersResourceWithRawResponse(self._client.dm_members) @cached_property def ai_chats(self) -> ai_chats.AIChatsResourceWithRawResponse: + """Ai chats""" from .resources.ai_chats import AIChatsResourceWithRawResponse return AIChatsResourceWithRawResponse(self._client.ai_chats) @cached_property def dm_channels(self) -> dm_channels.DmChannelsResourceWithRawResponse: + """Dm channels""" from .resources.dm_channels import DmChannelsResourceWithRawResponse return DmChannelsResourceWithRawResponse(self._client.dm_channels) @cached_property def dispute_alerts(self) -> dispute_alerts.DisputeAlertsResourceWithRawResponse: + """Dispute alerts""" from .resources.dispute_alerts import DisputeAlertsResourceWithRawResponse return DisputeAlertsResourceWithRawResponse(self._client.dispute_alerts) @@ -1434,12 +1584,14 @@ def __init__(self, client: AsyncWhop) -> None: @cached_property def apps(self) -> apps.AsyncAppsResourceWithRawResponse: + """Apps""" from .resources.apps import AsyncAppsResourceWithRawResponse return AsyncAppsResourceWithRawResponse(self._client.apps) @cached_property def invoices(self) -> invoices.AsyncInvoicesResourceWithRawResponse: + """Invoices""" from .resources.invoices import AsyncInvoicesResourceWithRawResponse return AsyncInvoicesResourceWithRawResponse(self._client.invoices) @@ -1448,258 +1600,301 @@ def invoices(self) -> invoices.AsyncInvoicesResourceWithRawResponse: def course_lesson_interactions( self, ) -> course_lesson_interactions.AsyncCourseLessonInteractionsResourceWithRawResponse: + """Course lesson interactions""" from .resources.course_lesson_interactions import AsyncCourseLessonInteractionsResourceWithRawResponse return AsyncCourseLessonInteractionsResourceWithRawResponse(self._client.course_lesson_interactions) @cached_property def products(self) -> products.AsyncProductsResourceWithRawResponse: + """Products""" from .resources.products import AsyncProductsResourceWithRawResponse return AsyncProductsResourceWithRawResponse(self._client.products) @cached_property def companies(self) -> companies.AsyncCompaniesResourceWithRawResponse: + """Companies""" from .resources.companies import AsyncCompaniesResourceWithRawResponse return AsyncCompaniesResourceWithRawResponse(self._client.companies) @cached_property def webhooks(self) -> webhooks.AsyncWebhooksResourceWithRawResponse: + """Webhooks""" from .resources.webhooks import AsyncWebhooksResourceWithRawResponse return AsyncWebhooksResourceWithRawResponse(self._client.webhooks) @cached_property def plans(self) -> plans.AsyncPlansResourceWithRawResponse: + """Plans""" from .resources.plans import AsyncPlansResourceWithRawResponse return AsyncPlansResourceWithRawResponse(self._client.plans) @cached_property def entries(self) -> entries.AsyncEntriesResourceWithRawResponse: + """Entries""" from .resources.entries import AsyncEntriesResourceWithRawResponse return AsyncEntriesResourceWithRawResponse(self._client.entries) @cached_property def forum_posts(self) -> forum_posts.AsyncForumPostsResourceWithRawResponse: + """Forum posts""" from .resources.forum_posts import AsyncForumPostsResourceWithRawResponse return AsyncForumPostsResourceWithRawResponse(self._client.forum_posts) @cached_property def transfers(self) -> transfers.AsyncTransfersResourceWithRawResponse: + """Transfers""" from .resources.transfers import AsyncTransfersResourceWithRawResponse return AsyncTransfersResourceWithRawResponse(self._client.transfers) @cached_property def ledger_accounts(self) -> ledger_accounts.AsyncLedgerAccountsResourceWithRawResponse: + """Ledger accounts""" from .resources.ledger_accounts import AsyncLedgerAccountsResourceWithRawResponse return AsyncLedgerAccountsResourceWithRawResponse(self._client.ledger_accounts) @cached_property def memberships(self) -> memberships.AsyncMembershipsResourceWithRawResponse: + """Memberships""" from .resources.memberships import AsyncMembershipsResourceWithRawResponse return AsyncMembershipsResourceWithRawResponse(self._client.memberships) @cached_property def authorized_users(self) -> authorized_users.AsyncAuthorizedUsersResourceWithRawResponse: + """Authorized users""" from .resources.authorized_users import AsyncAuthorizedUsersResourceWithRawResponse return AsyncAuthorizedUsersResourceWithRawResponse(self._client.authorized_users) @cached_property def app_builds(self) -> app_builds.AsyncAppBuildsResourceWithRawResponse: + """App builds""" from .resources.app_builds import AsyncAppBuildsResourceWithRawResponse return AsyncAppBuildsResourceWithRawResponse(self._client.app_builds) @cached_property def shipments(self) -> shipments.AsyncShipmentsResourceWithRawResponse: + """Shipments""" from .resources.shipments import AsyncShipmentsResourceWithRawResponse return AsyncShipmentsResourceWithRawResponse(self._client.shipments) @cached_property def checkout_configurations(self) -> checkout_configurations.AsyncCheckoutConfigurationsResourceWithRawResponse: + """Checkout configurations""" from .resources.checkout_configurations import AsyncCheckoutConfigurationsResourceWithRawResponse return AsyncCheckoutConfigurationsResourceWithRawResponse(self._client.checkout_configurations) @cached_property def messages(self) -> messages.AsyncMessagesResourceWithRawResponse: + """Messages""" from .resources.messages import AsyncMessagesResourceWithRawResponse return AsyncMessagesResourceWithRawResponse(self._client.messages) @cached_property def chat_channels(self) -> chat_channels.AsyncChatChannelsResourceWithRawResponse: + """Chat channels""" from .resources.chat_channels import AsyncChatChannelsResourceWithRawResponse return AsyncChatChannelsResourceWithRawResponse(self._client.chat_channels) @cached_property def users(self) -> users.AsyncUsersResourceWithRawResponse: + """Users""" from .resources.users import AsyncUsersResourceWithRawResponse return AsyncUsersResourceWithRawResponse(self._client.users) @cached_property def payments(self) -> payments.AsyncPaymentsResourceWithRawResponse: + """Payments""" from .resources.payments import AsyncPaymentsResourceWithRawResponse return AsyncPaymentsResourceWithRawResponse(self._client.payments) @cached_property def support_channels(self) -> support_channels.AsyncSupportChannelsResourceWithRawResponse: + """Support channels""" from .resources.support_channels import AsyncSupportChannelsResourceWithRawResponse return AsyncSupportChannelsResourceWithRawResponse(self._client.support_channels) @cached_property def experiences(self) -> experiences.AsyncExperiencesResourceWithRawResponse: + """Experiences""" from .resources.experiences import AsyncExperiencesResourceWithRawResponse return AsyncExperiencesResourceWithRawResponse(self._client.experiences) @cached_property def reactions(self) -> reactions.AsyncReactionsResourceWithRawResponse: + """Reactions""" from .resources.reactions import AsyncReactionsResourceWithRawResponse return AsyncReactionsResourceWithRawResponse(self._client.reactions) @cached_property def members(self) -> members.AsyncMembersResourceWithRawResponse: + """Members""" from .resources.members import AsyncMembersResourceWithRawResponse return AsyncMembersResourceWithRawResponse(self._client.members) @cached_property def forums(self) -> forums.AsyncForumsResourceWithRawResponse: + """Forums""" from .resources.forums import AsyncForumsResourceWithRawResponse return AsyncForumsResourceWithRawResponse(self._client.forums) @cached_property def promo_codes(self) -> promo_codes.AsyncPromoCodesResourceWithRawResponse: + """Promo codes""" from .resources.promo_codes import AsyncPromoCodesResourceWithRawResponse return AsyncPromoCodesResourceWithRawResponse(self._client.promo_codes) @cached_property def courses(self) -> courses.AsyncCoursesResourceWithRawResponse: + """Courses""" from .resources.courses import AsyncCoursesResourceWithRawResponse return AsyncCoursesResourceWithRawResponse(self._client.courses) @cached_property def course_chapters(self) -> course_chapters.AsyncCourseChaptersResourceWithRawResponse: + """Course chapters""" from .resources.course_chapters import AsyncCourseChaptersResourceWithRawResponse return AsyncCourseChaptersResourceWithRawResponse(self._client.course_chapters) @cached_property def course_lessons(self) -> course_lessons.AsyncCourseLessonsResourceWithRawResponse: + """Course lessons""" from .resources.course_lessons import AsyncCourseLessonsResourceWithRawResponse return AsyncCourseLessonsResourceWithRawResponse(self._client.course_lessons) @cached_property def reviews(self) -> reviews.AsyncReviewsResourceWithRawResponse: + """Reviews""" from .resources.reviews import AsyncReviewsResourceWithRawResponse return AsyncReviewsResourceWithRawResponse(self._client.reviews) @cached_property def course_students(self) -> course_students.AsyncCourseStudentsResourceWithRawResponse: + """Course students""" from .resources.course_students import AsyncCourseStudentsResourceWithRawResponse return AsyncCourseStudentsResourceWithRawResponse(self._client.course_students) @cached_property def access_tokens(self) -> access_tokens.AsyncAccessTokensResourceWithRawResponse: + """Access tokens""" from .resources.access_tokens import AsyncAccessTokensResourceWithRawResponse return AsyncAccessTokensResourceWithRawResponse(self._client.access_tokens) @cached_property def notifications(self) -> notifications.AsyncNotificationsResourceWithRawResponse: + """Notifications""" from .resources.notifications import AsyncNotificationsResourceWithRawResponse return AsyncNotificationsResourceWithRawResponse(self._client.notifications) @cached_property def disputes(self) -> disputes.AsyncDisputesResourceWithRawResponse: + """Disputes""" from .resources.disputes import AsyncDisputesResourceWithRawResponse return AsyncDisputesResourceWithRawResponse(self._client.disputes) @cached_property def refunds(self) -> refunds.AsyncRefundsResourceWithRawResponse: + """Refunds""" from .resources.refunds import AsyncRefundsResourceWithRawResponse return AsyncRefundsResourceWithRawResponse(self._client.refunds) @cached_property def withdrawals(self) -> withdrawals.AsyncWithdrawalsResourceWithRawResponse: + """Withdrawals""" from .resources.withdrawals import AsyncWithdrawalsResourceWithRawResponse return AsyncWithdrawalsResourceWithRawResponse(self._client.withdrawals) @cached_property def account_links(self) -> account_links.AsyncAccountLinksResourceWithRawResponse: + """Account links""" from .resources.account_links import AsyncAccountLinksResourceWithRawResponse return AsyncAccountLinksResourceWithRawResponse(self._client.account_links) @cached_property def setup_intents(self) -> setup_intents.AsyncSetupIntentsResourceWithRawResponse: + """Setup intents""" from .resources.setup_intents import AsyncSetupIntentsResourceWithRawResponse return AsyncSetupIntentsResourceWithRawResponse(self._client.setup_intents) @cached_property def payment_methods(self) -> payment_methods.AsyncPaymentMethodsResourceWithRawResponse: + """Payment methods""" from .resources.payment_methods import AsyncPaymentMethodsResourceWithRawResponse return AsyncPaymentMethodsResourceWithRawResponse(self._client.payment_methods) @cached_property def fee_markups(self) -> fee_markups.AsyncFeeMarkupsResourceWithRawResponse: + """Fee markups""" from .resources.fee_markups import AsyncFeeMarkupsResourceWithRawResponse return AsyncFeeMarkupsResourceWithRawResponse(self._client.fee_markups) @cached_property def payout_methods(self) -> payout_methods.AsyncPayoutMethodsResourceWithRawResponse: + """Payout methods""" from .resources.payout_methods import AsyncPayoutMethodsResourceWithRawResponse return AsyncPayoutMethodsResourceWithRawResponse(self._client.payout_methods) @cached_property def verifications(self) -> verifications.AsyncVerificationsResourceWithRawResponse: + """Verifications""" from .resources.verifications import AsyncVerificationsResourceWithRawResponse return AsyncVerificationsResourceWithRawResponse(self._client.verifications) @cached_property def leads(self) -> leads.AsyncLeadsResourceWithRawResponse: + """Leads""" from .resources.leads import AsyncLeadsResourceWithRawResponse return AsyncLeadsResourceWithRawResponse(self._client.leads) @cached_property def topups(self) -> topups.AsyncTopupsResourceWithRawResponse: + """Topups""" from .resources.topups import AsyncTopupsResourceWithRawResponse return AsyncTopupsResourceWithRawResponse(self._client.topups) @cached_property def files(self) -> files.AsyncFilesResourceWithRawResponse: + """Files""" from .resources.files import AsyncFilesResourceWithRawResponse return AsyncFilesResourceWithRawResponse(self._client.files) @@ -1708,30 +1903,35 @@ def files(self) -> files.AsyncFilesResourceWithRawResponse: def company_token_transactions( self, ) -> company_token_transactions.AsyncCompanyTokenTransactionsResourceWithRawResponse: + """Company token transactions""" from .resources.company_token_transactions import AsyncCompanyTokenTransactionsResourceWithRawResponse return AsyncCompanyTokenTransactionsResourceWithRawResponse(self._client.company_token_transactions) @cached_property def dm_members(self) -> dm_members.AsyncDmMembersResourceWithRawResponse: + """Dm members""" from .resources.dm_members import AsyncDmMembersResourceWithRawResponse return AsyncDmMembersResourceWithRawResponse(self._client.dm_members) @cached_property def ai_chats(self) -> ai_chats.AsyncAIChatsResourceWithRawResponse: + """Ai chats""" from .resources.ai_chats import AsyncAIChatsResourceWithRawResponse return AsyncAIChatsResourceWithRawResponse(self._client.ai_chats) @cached_property def dm_channels(self) -> dm_channels.AsyncDmChannelsResourceWithRawResponse: + """Dm channels""" from .resources.dm_channels import AsyncDmChannelsResourceWithRawResponse return AsyncDmChannelsResourceWithRawResponse(self._client.dm_channels) @cached_property def dispute_alerts(self) -> dispute_alerts.AsyncDisputeAlertsResourceWithRawResponse: + """Dispute alerts""" from .resources.dispute_alerts import AsyncDisputeAlertsResourceWithRawResponse return AsyncDisputeAlertsResourceWithRawResponse(self._client.dispute_alerts) @@ -1745,12 +1945,14 @@ def __init__(self, client: Whop) -> None: @cached_property def apps(self) -> apps.AppsResourceWithStreamingResponse: + """Apps""" from .resources.apps import AppsResourceWithStreamingResponse return AppsResourceWithStreamingResponse(self._client.apps) @cached_property def invoices(self) -> invoices.InvoicesResourceWithStreamingResponse: + """Invoices""" from .resources.invoices import InvoicesResourceWithStreamingResponse return InvoicesResourceWithStreamingResponse(self._client.invoices) @@ -1759,258 +1961,301 @@ def invoices(self) -> invoices.InvoicesResourceWithStreamingResponse: def course_lesson_interactions( self, ) -> course_lesson_interactions.CourseLessonInteractionsResourceWithStreamingResponse: + """Course lesson interactions""" from .resources.course_lesson_interactions import CourseLessonInteractionsResourceWithStreamingResponse return CourseLessonInteractionsResourceWithStreamingResponse(self._client.course_lesson_interactions) @cached_property def products(self) -> products.ProductsResourceWithStreamingResponse: + """Products""" from .resources.products import ProductsResourceWithStreamingResponse return ProductsResourceWithStreamingResponse(self._client.products) @cached_property def companies(self) -> companies.CompaniesResourceWithStreamingResponse: + """Companies""" from .resources.companies import CompaniesResourceWithStreamingResponse return CompaniesResourceWithStreamingResponse(self._client.companies) @cached_property def webhooks(self) -> webhooks.WebhooksResourceWithStreamingResponse: + """Webhooks""" from .resources.webhooks import WebhooksResourceWithStreamingResponse return WebhooksResourceWithStreamingResponse(self._client.webhooks) @cached_property def plans(self) -> plans.PlansResourceWithStreamingResponse: + """Plans""" from .resources.plans import PlansResourceWithStreamingResponse return PlansResourceWithStreamingResponse(self._client.plans) @cached_property def entries(self) -> entries.EntriesResourceWithStreamingResponse: + """Entries""" from .resources.entries import EntriesResourceWithStreamingResponse return EntriesResourceWithStreamingResponse(self._client.entries) @cached_property def forum_posts(self) -> forum_posts.ForumPostsResourceWithStreamingResponse: + """Forum posts""" from .resources.forum_posts import ForumPostsResourceWithStreamingResponse return ForumPostsResourceWithStreamingResponse(self._client.forum_posts) @cached_property def transfers(self) -> transfers.TransfersResourceWithStreamingResponse: + """Transfers""" from .resources.transfers import TransfersResourceWithStreamingResponse return TransfersResourceWithStreamingResponse(self._client.transfers) @cached_property def ledger_accounts(self) -> ledger_accounts.LedgerAccountsResourceWithStreamingResponse: + """Ledger accounts""" from .resources.ledger_accounts import LedgerAccountsResourceWithStreamingResponse return LedgerAccountsResourceWithStreamingResponse(self._client.ledger_accounts) @cached_property def memberships(self) -> memberships.MembershipsResourceWithStreamingResponse: + """Memberships""" from .resources.memberships import MembershipsResourceWithStreamingResponse return MembershipsResourceWithStreamingResponse(self._client.memberships) @cached_property def authorized_users(self) -> authorized_users.AuthorizedUsersResourceWithStreamingResponse: + """Authorized users""" from .resources.authorized_users import AuthorizedUsersResourceWithStreamingResponse return AuthorizedUsersResourceWithStreamingResponse(self._client.authorized_users) @cached_property def app_builds(self) -> app_builds.AppBuildsResourceWithStreamingResponse: + """App builds""" from .resources.app_builds import AppBuildsResourceWithStreamingResponse return AppBuildsResourceWithStreamingResponse(self._client.app_builds) @cached_property def shipments(self) -> shipments.ShipmentsResourceWithStreamingResponse: + """Shipments""" from .resources.shipments import ShipmentsResourceWithStreamingResponse return ShipmentsResourceWithStreamingResponse(self._client.shipments) @cached_property def checkout_configurations(self) -> checkout_configurations.CheckoutConfigurationsResourceWithStreamingResponse: + """Checkout configurations""" from .resources.checkout_configurations import CheckoutConfigurationsResourceWithStreamingResponse return CheckoutConfigurationsResourceWithStreamingResponse(self._client.checkout_configurations) @cached_property def messages(self) -> messages.MessagesResourceWithStreamingResponse: + """Messages""" from .resources.messages import MessagesResourceWithStreamingResponse return MessagesResourceWithStreamingResponse(self._client.messages) @cached_property def chat_channels(self) -> chat_channels.ChatChannelsResourceWithStreamingResponse: + """Chat channels""" from .resources.chat_channels import ChatChannelsResourceWithStreamingResponse return ChatChannelsResourceWithStreamingResponse(self._client.chat_channels) @cached_property def users(self) -> users.UsersResourceWithStreamingResponse: + """Users""" from .resources.users import UsersResourceWithStreamingResponse return UsersResourceWithStreamingResponse(self._client.users) @cached_property def payments(self) -> payments.PaymentsResourceWithStreamingResponse: + """Payments""" from .resources.payments import PaymentsResourceWithStreamingResponse return PaymentsResourceWithStreamingResponse(self._client.payments) @cached_property def support_channels(self) -> support_channels.SupportChannelsResourceWithStreamingResponse: + """Support channels""" from .resources.support_channels import SupportChannelsResourceWithStreamingResponse return SupportChannelsResourceWithStreamingResponse(self._client.support_channels) @cached_property def experiences(self) -> experiences.ExperiencesResourceWithStreamingResponse: + """Experiences""" from .resources.experiences import ExperiencesResourceWithStreamingResponse return ExperiencesResourceWithStreamingResponse(self._client.experiences) @cached_property def reactions(self) -> reactions.ReactionsResourceWithStreamingResponse: + """Reactions""" from .resources.reactions import ReactionsResourceWithStreamingResponse return ReactionsResourceWithStreamingResponse(self._client.reactions) @cached_property def members(self) -> members.MembersResourceWithStreamingResponse: + """Members""" from .resources.members import MembersResourceWithStreamingResponse return MembersResourceWithStreamingResponse(self._client.members) @cached_property def forums(self) -> forums.ForumsResourceWithStreamingResponse: + """Forums""" from .resources.forums import ForumsResourceWithStreamingResponse return ForumsResourceWithStreamingResponse(self._client.forums) @cached_property def promo_codes(self) -> promo_codes.PromoCodesResourceWithStreamingResponse: + """Promo codes""" from .resources.promo_codes import PromoCodesResourceWithStreamingResponse return PromoCodesResourceWithStreamingResponse(self._client.promo_codes) @cached_property def courses(self) -> courses.CoursesResourceWithStreamingResponse: + """Courses""" from .resources.courses import CoursesResourceWithStreamingResponse return CoursesResourceWithStreamingResponse(self._client.courses) @cached_property def course_chapters(self) -> course_chapters.CourseChaptersResourceWithStreamingResponse: + """Course chapters""" from .resources.course_chapters import CourseChaptersResourceWithStreamingResponse return CourseChaptersResourceWithStreamingResponse(self._client.course_chapters) @cached_property def course_lessons(self) -> course_lessons.CourseLessonsResourceWithStreamingResponse: + """Course lessons""" from .resources.course_lessons import CourseLessonsResourceWithStreamingResponse return CourseLessonsResourceWithStreamingResponse(self._client.course_lessons) @cached_property def reviews(self) -> reviews.ReviewsResourceWithStreamingResponse: + """Reviews""" from .resources.reviews import ReviewsResourceWithStreamingResponse return ReviewsResourceWithStreamingResponse(self._client.reviews) @cached_property def course_students(self) -> course_students.CourseStudentsResourceWithStreamingResponse: + """Course students""" from .resources.course_students import CourseStudentsResourceWithStreamingResponse return CourseStudentsResourceWithStreamingResponse(self._client.course_students) @cached_property def access_tokens(self) -> access_tokens.AccessTokensResourceWithStreamingResponse: + """Access tokens""" from .resources.access_tokens import AccessTokensResourceWithStreamingResponse return AccessTokensResourceWithStreamingResponse(self._client.access_tokens) @cached_property def notifications(self) -> notifications.NotificationsResourceWithStreamingResponse: + """Notifications""" from .resources.notifications import NotificationsResourceWithStreamingResponse return NotificationsResourceWithStreamingResponse(self._client.notifications) @cached_property def disputes(self) -> disputes.DisputesResourceWithStreamingResponse: + """Disputes""" from .resources.disputes import DisputesResourceWithStreamingResponse return DisputesResourceWithStreamingResponse(self._client.disputes) @cached_property def refunds(self) -> refunds.RefundsResourceWithStreamingResponse: + """Refunds""" from .resources.refunds import RefundsResourceWithStreamingResponse return RefundsResourceWithStreamingResponse(self._client.refunds) @cached_property def withdrawals(self) -> withdrawals.WithdrawalsResourceWithStreamingResponse: + """Withdrawals""" from .resources.withdrawals import WithdrawalsResourceWithStreamingResponse return WithdrawalsResourceWithStreamingResponse(self._client.withdrawals) @cached_property def account_links(self) -> account_links.AccountLinksResourceWithStreamingResponse: + """Account links""" from .resources.account_links import AccountLinksResourceWithStreamingResponse return AccountLinksResourceWithStreamingResponse(self._client.account_links) @cached_property def setup_intents(self) -> setup_intents.SetupIntentsResourceWithStreamingResponse: + """Setup intents""" from .resources.setup_intents import SetupIntentsResourceWithStreamingResponse return SetupIntentsResourceWithStreamingResponse(self._client.setup_intents) @cached_property def payment_methods(self) -> payment_methods.PaymentMethodsResourceWithStreamingResponse: + """Payment methods""" from .resources.payment_methods import PaymentMethodsResourceWithStreamingResponse return PaymentMethodsResourceWithStreamingResponse(self._client.payment_methods) @cached_property def fee_markups(self) -> fee_markups.FeeMarkupsResourceWithStreamingResponse: + """Fee markups""" from .resources.fee_markups import FeeMarkupsResourceWithStreamingResponse return FeeMarkupsResourceWithStreamingResponse(self._client.fee_markups) @cached_property def payout_methods(self) -> payout_methods.PayoutMethodsResourceWithStreamingResponse: + """Payout methods""" from .resources.payout_methods import PayoutMethodsResourceWithStreamingResponse return PayoutMethodsResourceWithStreamingResponse(self._client.payout_methods) @cached_property def verifications(self) -> verifications.VerificationsResourceWithStreamingResponse: + """Verifications""" from .resources.verifications import VerificationsResourceWithStreamingResponse return VerificationsResourceWithStreamingResponse(self._client.verifications) @cached_property def leads(self) -> leads.LeadsResourceWithStreamingResponse: + """Leads""" from .resources.leads import LeadsResourceWithStreamingResponse return LeadsResourceWithStreamingResponse(self._client.leads) @cached_property def topups(self) -> topups.TopupsResourceWithStreamingResponse: + """Topups""" from .resources.topups import TopupsResourceWithStreamingResponse return TopupsResourceWithStreamingResponse(self._client.topups) @cached_property def files(self) -> files.FilesResourceWithStreamingResponse: + """Files""" from .resources.files import FilesResourceWithStreamingResponse return FilesResourceWithStreamingResponse(self._client.files) @@ -2019,30 +2264,35 @@ def files(self) -> files.FilesResourceWithStreamingResponse: def company_token_transactions( self, ) -> company_token_transactions.CompanyTokenTransactionsResourceWithStreamingResponse: + """Company token transactions""" from .resources.company_token_transactions import CompanyTokenTransactionsResourceWithStreamingResponse return CompanyTokenTransactionsResourceWithStreamingResponse(self._client.company_token_transactions) @cached_property def dm_members(self) -> dm_members.DmMembersResourceWithStreamingResponse: + """Dm members""" from .resources.dm_members import DmMembersResourceWithStreamingResponse return DmMembersResourceWithStreamingResponse(self._client.dm_members) @cached_property def ai_chats(self) -> ai_chats.AIChatsResourceWithStreamingResponse: + """Ai chats""" from .resources.ai_chats import AIChatsResourceWithStreamingResponse return AIChatsResourceWithStreamingResponse(self._client.ai_chats) @cached_property def dm_channels(self) -> dm_channels.DmChannelsResourceWithStreamingResponse: + """Dm channels""" from .resources.dm_channels import DmChannelsResourceWithStreamingResponse return DmChannelsResourceWithStreamingResponse(self._client.dm_channels) @cached_property def dispute_alerts(self) -> dispute_alerts.DisputeAlertsResourceWithStreamingResponse: + """Dispute alerts""" from .resources.dispute_alerts import DisputeAlertsResourceWithStreamingResponse return DisputeAlertsResourceWithStreamingResponse(self._client.dispute_alerts) @@ -2056,12 +2306,14 @@ def __init__(self, client: AsyncWhop) -> None: @cached_property def apps(self) -> apps.AsyncAppsResourceWithStreamingResponse: + """Apps""" from .resources.apps import AsyncAppsResourceWithStreamingResponse return AsyncAppsResourceWithStreamingResponse(self._client.apps) @cached_property def invoices(self) -> invoices.AsyncInvoicesResourceWithStreamingResponse: + """Invoices""" from .resources.invoices import AsyncInvoicesResourceWithStreamingResponse return AsyncInvoicesResourceWithStreamingResponse(self._client.invoices) @@ -2070,78 +2322,91 @@ def invoices(self) -> invoices.AsyncInvoicesResourceWithStreamingResponse: def course_lesson_interactions( self, ) -> course_lesson_interactions.AsyncCourseLessonInteractionsResourceWithStreamingResponse: + """Course lesson interactions""" from .resources.course_lesson_interactions import AsyncCourseLessonInteractionsResourceWithStreamingResponse return AsyncCourseLessonInteractionsResourceWithStreamingResponse(self._client.course_lesson_interactions) @cached_property def products(self) -> products.AsyncProductsResourceWithStreamingResponse: + """Products""" from .resources.products import AsyncProductsResourceWithStreamingResponse return AsyncProductsResourceWithStreamingResponse(self._client.products) @cached_property def companies(self) -> companies.AsyncCompaniesResourceWithStreamingResponse: + """Companies""" from .resources.companies import AsyncCompaniesResourceWithStreamingResponse return AsyncCompaniesResourceWithStreamingResponse(self._client.companies) @cached_property def webhooks(self) -> webhooks.AsyncWebhooksResourceWithStreamingResponse: + """Webhooks""" from .resources.webhooks import AsyncWebhooksResourceWithStreamingResponse return AsyncWebhooksResourceWithStreamingResponse(self._client.webhooks) @cached_property def plans(self) -> plans.AsyncPlansResourceWithStreamingResponse: + """Plans""" from .resources.plans import AsyncPlansResourceWithStreamingResponse return AsyncPlansResourceWithStreamingResponse(self._client.plans) @cached_property def entries(self) -> entries.AsyncEntriesResourceWithStreamingResponse: + """Entries""" from .resources.entries import AsyncEntriesResourceWithStreamingResponse return AsyncEntriesResourceWithStreamingResponse(self._client.entries) @cached_property def forum_posts(self) -> forum_posts.AsyncForumPostsResourceWithStreamingResponse: + """Forum posts""" from .resources.forum_posts import AsyncForumPostsResourceWithStreamingResponse return AsyncForumPostsResourceWithStreamingResponse(self._client.forum_posts) @cached_property def transfers(self) -> transfers.AsyncTransfersResourceWithStreamingResponse: + """Transfers""" from .resources.transfers import AsyncTransfersResourceWithStreamingResponse return AsyncTransfersResourceWithStreamingResponse(self._client.transfers) @cached_property def ledger_accounts(self) -> ledger_accounts.AsyncLedgerAccountsResourceWithStreamingResponse: + """Ledger accounts""" from .resources.ledger_accounts import AsyncLedgerAccountsResourceWithStreamingResponse return AsyncLedgerAccountsResourceWithStreamingResponse(self._client.ledger_accounts) @cached_property def memberships(self) -> memberships.AsyncMembershipsResourceWithStreamingResponse: + """Memberships""" from .resources.memberships import AsyncMembershipsResourceWithStreamingResponse return AsyncMembershipsResourceWithStreamingResponse(self._client.memberships) @cached_property def authorized_users(self) -> authorized_users.AsyncAuthorizedUsersResourceWithStreamingResponse: + """Authorized users""" from .resources.authorized_users import AsyncAuthorizedUsersResourceWithStreamingResponse return AsyncAuthorizedUsersResourceWithStreamingResponse(self._client.authorized_users) @cached_property def app_builds(self) -> app_builds.AsyncAppBuildsResourceWithStreamingResponse: + """App builds""" from .resources.app_builds import AsyncAppBuildsResourceWithStreamingResponse return AsyncAppBuildsResourceWithStreamingResponse(self._client.app_builds) @cached_property def shipments(self) -> shipments.AsyncShipmentsResourceWithStreamingResponse: + """Shipments""" from .resources.shipments import AsyncShipmentsResourceWithStreamingResponse return AsyncShipmentsResourceWithStreamingResponse(self._client.shipments) @@ -2150,180 +2415,210 @@ def shipments(self) -> shipments.AsyncShipmentsResourceWithStreamingResponse: def checkout_configurations( self, ) -> checkout_configurations.AsyncCheckoutConfigurationsResourceWithStreamingResponse: + """Checkout configurations""" from .resources.checkout_configurations import AsyncCheckoutConfigurationsResourceWithStreamingResponse return AsyncCheckoutConfigurationsResourceWithStreamingResponse(self._client.checkout_configurations) @cached_property def messages(self) -> messages.AsyncMessagesResourceWithStreamingResponse: + """Messages""" from .resources.messages import AsyncMessagesResourceWithStreamingResponse return AsyncMessagesResourceWithStreamingResponse(self._client.messages) @cached_property def chat_channels(self) -> chat_channels.AsyncChatChannelsResourceWithStreamingResponse: + """Chat channels""" from .resources.chat_channels import AsyncChatChannelsResourceWithStreamingResponse return AsyncChatChannelsResourceWithStreamingResponse(self._client.chat_channels) @cached_property def users(self) -> users.AsyncUsersResourceWithStreamingResponse: + """Users""" from .resources.users import AsyncUsersResourceWithStreamingResponse return AsyncUsersResourceWithStreamingResponse(self._client.users) @cached_property def payments(self) -> payments.AsyncPaymentsResourceWithStreamingResponse: + """Payments""" from .resources.payments import AsyncPaymentsResourceWithStreamingResponse return AsyncPaymentsResourceWithStreamingResponse(self._client.payments) @cached_property def support_channels(self) -> support_channels.AsyncSupportChannelsResourceWithStreamingResponse: + """Support channels""" from .resources.support_channels import AsyncSupportChannelsResourceWithStreamingResponse return AsyncSupportChannelsResourceWithStreamingResponse(self._client.support_channels) @cached_property def experiences(self) -> experiences.AsyncExperiencesResourceWithStreamingResponse: + """Experiences""" from .resources.experiences import AsyncExperiencesResourceWithStreamingResponse return AsyncExperiencesResourceWithStreamingResponse(self._client.experiences) @cached_property def reactions(self) -> reactions.AsyncReactionsResourceWithStreamingResponse: + """Reactions""" from .resources.reactions import AsyncReactionsResourceWithStreamingResponse return AsyncReactionsResourceWithStreamingResponse(self._client.reactions) @cached_property def members(self) -> members.AsyncMembersResourceWithStreamingResponse: + """Members""" from .resources.members import AsyncMembersResourceWithStreamingResponse return AsyncMembersResourceWithStreamingResponse(self._client.members) @cached_property def forums(self) -> forums.AsyncForumsResourceWithStreamingResponse: + """Forums""" from .resources.forums import AsyncForumsResourceWithStreamingResponse return AsyncForumsResourceWithStreamingResponse(self._client.forums) @cached_property def promo_codes(self) -> promo_codes.AsyncPromoCodesResourceWithStreamingResponse: + """Promo codes""" from .resources.promo_codes import AsyncPromoCodesResourceWithStreamingResponse return AsyncPromoCodesResourceWithStreamingResponse(self._client.promo_codes) @cached_property def courses(self) -> courses.AsyncCoursesResourceWithStreamingResponse: + """Courses""" from .resources.courses import AsyncCoursesResourceWithStreamingResponse return AsyncCoursesResourceWithStreamingResponse(self._client.courses) @cached_property def course_chapters(self) -> course_chapters.AsyncCourseChaptersResourceWithStreamingResponse: + """Course chapters""" from .resources.course_chapters import AsyncCourseChaptersResourceWithStreamingResponse return AsyncCourseChaptersResourceWithStreamingResponse(self._client.course_chapters) @cached_property def course_lessons(self) -> course_lessons.AsyncCourseLessonsResourceWithStreamingResponse: + """Course lessons""" from .resources.course_lessons import AsyncCourseLessonsResourceWithStreamingResponse return AsyncCourseLessonsResourceWithStreamingResponse(self._client.course_lessons) @cached_property def reviews(self) -> reviews.AsyncReviewsResourceWithStreamingResponse: + """Reviews""" from .resources.reviews import AsyncReviewsResourceWithStreamingResponse return AsyncReviewsResourceWithStreamingResponse(self._client.reviews) @cached_property def course_students(self) -> course_students.AsyncCourseStudentsResourceWithStreamingResponse: + """Course students""" from .resources.course_students import AsyncCourseStudentsResourceWithStreamingResponse return AsyncCourseStudentsResourceWithStreamingResponse(self._client.course_students) @cached_property def access_tokens(self) -> access_tokens.AsyncAccessTokensResourceWithStreamingResponse: + """Access tokens""" from .resources.access_tokens import AsyncAccessTokensResourceWithStreamingResponse return AsyncAccessTokensResourceWithStreamingResponse(self._client.access_tokens) @cached_property def notifications(self) -> notifications.AsyncNotificationsResourceWithStreamingResponse: + """Notifications""" from .resources.notifications import AsyncNotificationsResourceWithStreamingResponse return AsyncNotificationsResourceWithStreamingResponse(self._client.notifications) @cached_property def disputes(self) -> disputes.AsyncDisputesResourceWithStreamingResponse: + """Disputes""" from .resources.disputes import AsyncDisputesResourceWithStreamingResponse return AsyncDisputesResourceWithStreamingResponse(self._client.disputes) @cached_property def refunds(self) -> refunds.AsyncRefundsResourceWithStreamingResponse: + """Refunds""" from .resources.refunds import AsyncRefundsResourceWithStreamingResponse return AsyncRefundsResourceWithStreamingResponse(self._client.refunds) @cached_property def withdrawals(self) -> withdrawals.AsyncWithdrawalsResourceWithStreamingResponse: + """Withdrawals""" from .resources.withdrawals import AsyncWithdrawalsResourceWithStreamingResponse return AsyncWithdrawalsResourceWithStreamingResponse(self._client.withdrawals) @cached_property def account_links(self) -> account_links.AsyncAccountLinksResourceWithStreamingResponse: + """Account links""" from .resources.account_links import AsyncAccountLinksResourceWithStreamingResponse return AsyncAccountLinksResourceWithStreamingResponse(self._client.account_links) @cached_property def setup_intents(self) -> setup_intents.AsyncSetupIntentsResourceWithStreamingResponse: + """Setup intents""" from .resources.setup_intents import AsyncSetupIntentsResourceWithStreamingResponse return AsyncSetupIntentsResourceWithStreamingResponse(self._client.setup_intents) @cached_property def payment_methods(self) -> payment_methods.AsyncPaymentMethodsResourceWithStreamingResponse: + """Payment methods""" from .resources.payment_methods import AsyncPaymentMethodsResourceWithStreamingResponse return AsyncPaymentMethodsResourceWithStreamingResponse(self._client.payment_methods) @cached_property def fee_markups(self) -> fee_markups.AsyncFeeMarkupsResourceWithStreamingResponse: + """Fee markups""" from .resources.fee_markups import AsyncFeeMarkupsResourceWithStreamingResponse return AsyncFeeMarkupsResourceWithStreamingResponse(self._client.fee_markups) @cached_property def payout_methods(self) -> payout_methods.AsyncPayoutMethodsResourceWithStreamingResponse: + """Payout methods""" from .resources.payout_methods import AsyncPayoutMethodsResourceWithStreamingResponse return AsyncPayoutMethodsResourceWithStreamingResponse(self._client.payout_methods) @cached_property def verifications(self) -> verifications.AsyncVerificationsResourceWithStreamingResponse: + """Verifications""" from .resources.verifications import AsyncVerificationsResourceWithStreamingResponse return AsyncVerificationsResourceWithStreamingResponse(self._client.verifications) @cached_property def leads(self) -> leads.AsyncLeadsResourceWithStreamingResponse: + """Leads""" from .resources.leads import AsyncLeadsResourceWithStreamingResponse return AsyncLeadsResourceWithStreamingResponse(self._client.leads) @cached_property def topups(self) -> topups.AsyncTopupsResourceWithStreamingResponse: + """Topups""" from .resources.topups import AsyncTopupsResourceWithStreamingResponse return AsyncTopupsResourceWithStreamingResponse(self._client.topups) @cached_property def files(self) -> files.AsyncFilesResourceWithStreamingResponse: + """Files""" from .resources.files import AsyncFilesResourceWithStreamingResponse return AsyncFilesResourceWithStreamingResponse(self._client.files) @@ -2332,30 +2627,35 @@ def files(self) -> files.AsyncFilesResourceWithStreamingResponse: def company_token_transactions( self, ) -> company_token_transactions.AsyncCompanyTokenTransactionsResourceWithStreamingResponse: + """Company token transactions""" from .resources.company_token_transactions import AsyncCompanyTokenTransactionsResourceWithStreamingResponse return AsyncCompanyTokenTransactionsResourceWithStreamingResponse(self._client.company_token_transactions) @cached_property def dm_members(self) -> dm_members.AsyncDmMembersResourceWithStreamingResponse: + """Dm members""" from .resources.dm_members import AsyncDmMembersResourceWithStreamingResponse return AsyncDmMembersResourceWithStreamingResponse(self._client.dm_members) @cached_property def ai_chats(self) -> ai_chats.AsyncAIChatsResourceWithStreamingResponse: + """Ai chats""" from .resources.ai_chats import AsyncAIChatsResourceWithStreamingResponse return AsyncAIChatsResourceWithStreamingResponse(self._client.ai_chats) @cached_property def dm_channels(self) -> dm_channels.AsyncDmChannelsResourceWithStreamingResponse: + """Dm channels""" from .resources.dm_channels import AsyncDmChannelsResourceWithStreamingResponse return AsyncDmChannelsResourceWithStreamingResponse(self._client.dm_channels) @cached_property def dispute_alerts(self) -> dispute_alerts.AsyncDisputeAlertsResourceWithStreamingResponse: + """Dispute alerts""" from .resources.dispute_alerts import AsyncDisputeAlertsResourceWithStreamingResponse return AsyncDisputeAlertsResourceWithStreamingResponse(self._client.dispute_alerts) diff --git a/src/whop_sdk/resources/access_tokens.py b/src/whop_sdk/resources/access_tokens.py index ec9b7832..1ebde168 100644 --- a/src/whop_sdk/resources/access_tokens.py +++ b/src/whop_sdk/resources/access_tokens.py @@ -25,6 +25,8 @@ class AccessTokensResource(SyncAPIResource): + """Access tokens""" + @cached_property def with_raw_response(self) -> AccessTokensResourceWithRawResponse: """ @@ -106,6 +108,8 @@ def create( class AsyncAccessTokensResource(AsyncAPIResource): + """Access tokens""" + @cached_property def with_raw_response(self) -> AsyncAccessTokensResourceWithRawResponse: """ diff --git a/src/whop_sdk/resources/account_links.py b/src/whop_sdk/resources/account_links.py index e362e3fb..ccfe5cd7 100644 --- a/src/whop_sdk/resources/account_links.py +++ b/src/whop_sdk/resources/account_links.py @@ -24,6 +24,8 @@ class AccountLinksResource(SyncAPIResource): + """Account links""" + @cached_property def with_raw_response(self) -> AccountLinksResourceWithRawResponse: """ @@ -101,6 +103,8 @@ def create( class AsyncAccountLinksResource(AsyncAPIResource): + """Account links""" + @cached_property def with_raw_response(self) -> AsyncAccountLinksResourceWithRawResponse: """ diff --git a/src/whop_sdk/resources/ai_chats.py b/src/whop_sdk/resources/ai_chats.py index cd24246c..7d93aefe 100644 --- a/src/whop_sdk/resources/ai_chats.py +++ b/src/whop_sdk/resources/ai_chats.py @@ -28,6 +28,8 @@ class AIChatsResource(SyncAPIResource): + """Ai chats""" + @cached_property def with_raw_response(self) -> AIChatsResourceWithRawResponse: """ @@ -286,6 +288,8 @@ def delete( class AsyncAIChatsResource(AsyncAPIResource): + """Ai chats""" + @cached_property def with_raw_response(self) -> AsyncAIChatsResourceWithRawResponse: """ diff --git a/src/whop_sdk/resources/app_builds.py b/src/whop_sdk/resources/app_builds.py index e4e0f855..967b89fd 100644 --- a/src/whop_sdk/resources/app_builds.py +++ b/src/whop_sdk/resources/app_builds.py @@ -30,6 +30,8 @@ class AppBuildsResource(SyncAPIResource): + """App builds""" + @cached_property def with_raw_response(self) -> AppBuildsResourceWithRawResponse: """ @@ -276,6 +278,8 @@ def promote( class AsyncAppBuildsResource(AsyncAPIResource): + """App builds""" + @cached_property def with_raw_response(self) -> AsyncAppBuildsResourceWithRawResponse: """ diff --git a/src/whop_sdk/resources/apps.py b/src/whop_sdk/resources/apps.py index 46fd9b78..dd29aa84 100644 --- a/src/whop_sdk/resources/apps.py +++ b/src/whop_sdk/resources/apps.py @@ -31,6 +31,8 @@ class AppsResource(SyncAPIResource): + """Apps""" + @cached_property def with_raw_response(self) -> AppsResourceWithRawResponse: """ @@ -354,6 +356,8 @@ def list( class AsyncAppsResource(AsyncAPIResource): + """Apps""" + @cached_property def with_raw_response(self) -> AsyncAppsResourceWithRawResponse: """ diff --git a/src/whop_sdk/resources/authorized_users.py b/src/whop_sdk/resources/authorized_users.py index 91158b83..274fb769 100644 --- a/src/whop_sdk/resources/authorized_users.py +++ b/src/whop_sdk/resources/authorized_users.py @@ -28,6 +28,8 @@ class AuthorizedUsersResource(SyncAPIResource): + """Authorized users""" + @cached_property def with_raw_response(self) -> AuthorizedUsersResourceWithRawResponse: """ @@ -169,6 +171,8 @@ def list( class AsyncAuthorizedUsersResource(AsyncAPIResource): + """Authorized users""" + @cached_property def with_raw_response(self) -> AsyncAuthorizedUsersResourceWithRawResponse: """ diff --git a/src/whop_sdk/resources/chat_channels.py b/src/whop_sdk/resources/chat_channels.py index 0ed7bd7f..04382738 100644 --- a/src/whop_sdk/resources/chat_channels.py +++ b/src/whop_sdk/resources/chat_channels.py @@ -28,6 +28,8 @@ class ChatChannelsResource(SyncAPIResource): + """Chat channels""" + @cached_property def with_raw_response(self) -> ChatChannelsResourceWithRawResponse: """ @@ -224,6 +226,8 @@ def list( class AsyncChatChannelsResource(AsyncAPIResource): + """Chat channels""" + @cached_property def with_raw_response(self) -> AsyncChatChannelsResourceWithRawResponse: """ diff --git a/src/whop_sdk/resources/checkout_configurations.py b/src/whop_sdk/resources/checkout_configurations.py index 01606287..8df82b2c 100644 --- a/src/whop_sdk/resources/checkout_configurations.py +++ b/src/whop_sdk/resources/checkout_configurations.py @@ -30,6 +30,8 @@ class CheckoutConfigurationsResource(SyncAPIResource): + """Checkout configurations""" + @cached_property def with_raw_response(self) -> CheckoutConfigurationsResourceWithRawResponse: """ @@ -396,6 +398,8 @@ def list( class AsyncCheckoutConfigurationsResource(AsyncAPIResource): + """Checkout configurations""" + @cached_property def with_raw_response(self) -> AsyncCheckoutConfigurationsResourceWithRawResponse: """ diff --git a/src/whop_sdk/resources/companies.py b/src/whop_sdk/resources/companies.py index 37cb0775..6c629739 100644 --- a/src/whop_sdk/resources/companies.py +++ b/src/whop_sdk/resources/companies.py @@ -28,6 +28,8 @@ class CompaniesResource(SyncAPIResource): + """Companies""" + @cached_property def with_raw_response(self) -> CompaniesResourceWithRawResponse: """ @@ -317,6 +319,8 @@ def list( class AsyncCompaniesResource(AsyncAPIResource): + """Companies""" + @cached_property def with_raw_response(self) -> AsyncCompaniesResourceWithRawResponse: """ diff --git a/src/whop_sdk/resources/company_token_transactions.py b/src/whop_sdk/resources/company_token_transactions.py index aa7bf6ce..ff382499 100644 --- a/src/whop_sdk/resources/company_token_transactions.py +++ b/src/whop_sdk/resources/company_token_transactions.py @@ -32,6 +32,8 @@ class CompanyTokenTransactionsResource(SyncAPIResource): + """Company token transactions""" + @cached_property def with_raw_response(self) -> CompanyTokenTransactionsResourceWithRawResponse: """ @@ -365,6 +367,8 @@ def list( class AsyncCompanyTokenTransactionsResource(AsyncAPIResource): + """Company token transactions""" + @cached_property def with_raw_response(self) -> AsyncCompanyTokenTransactionsResourceWithRawResponse: """ diff --git a/src/whop_sdk/resources/course_chapters.py b/src/whop_sdk/resources/course_chapters.py index 9d8345bf..13d1ba92 100644 --- a/src/whop_sdk/resources/course_chapters.py +++ b/src/whop_sdk/resources/course_chapters.py @@ -27,6 +27,8 @@ class CourseChaptersResource(SyncAPIResource): + """Course chapters""" + @cached_property def with_raw_response(self) -> CourseChaptersResourceWithRawResponse: """ @@ -274,6 +276,8 @@ def delete( class AsyncCourseChaptersResource(AsyncAPIResource): + """Course chapters""" + @cached_property def with_raw_response(self) -> AsyncCourseChaptersResourceWithRawResponse: """ diff --git a/src/whop_sdk/resources/course_lesson_interactions.py b/src/whop_sdk/resources/course_lesson_interactions.py index 19d49434..c162930e 100644 --- a/src/whop_sdk/resources/course_lesson_interactions.py +++ b/src/whop_sdk/resources/course_lesson_interactions.py @@ -26,6 +26,8 @@ class CourseLessonInteractionsResource(SyncAPIResource): + """Course lesson interactions""" + @cached_property def with_raw_response(self) -> CourseLessonInteractionsResourceWithRawResponse: """ @@ -162,6 +164,8 @@ def list( class AsyncCourseLessonInteractionsResource(AsyncAPIResource): + """Course lesson interactions""" + @cached_property def with_raw_response(self) -> AsyncCourseLessonInteractionsResourceWithRawResponse: """ diff --git a/src/whop_sdk/resources/course_lessons.py b/src/whop_sdk/resources/course_lessons.py index ef47ad3e..710a739d 100644 --- a/src/whop_sdk/resources/course_lessons.py +++ b/src/whop_sdk/resources/course_lessons.py @@ -41,6 +41,8 @@ class CourseLessonsResource(SyncAPIResource): + """Course lessons""" + @cached_property def with_raw_response(self) -> CourseLessonsResourceWithRawResponse: """ @@ -493,6 +495,8 @@ def submit_assessment( class AsyncCourseLessonsResource(AsyncAPIResource): + """Course lessons""" + @cached_property def with_raw_response(self) -> AsyncCourseLessonsResourceWithRawResponse: """ diff --git a/src/whop_sdk/resources/course_students.py b/src/whop_sdk/resources/course_students.py index 83c1656e..f85f1f82 100644 --- a/src/whop_sdk/resources/course_students.py +++ b/src/whop_sdk/resources/course_students.py @@ -26,6 +26,8 @@ class CourseStudentsResource(SyncAPIResource): + """Course students""" + @cached_property def with_raw_response(self) -> CourseStudentsResourceWithRawResponse: """ @@ -154,6 +156,8 @@ def list( class AsyncCourseStudentsResource(AsyncAPIResource): + """Course students""" + @cached_property def with_raw_response(self) -> AsyncCourseStudentsResourceWithRawResponse: """ diff --git a/src/whop_sdk/resources/courses.py b/src/whop_sdk/resources/courses.py index a5c5b25e..9ea8d328 100644 --- a/src/whop_sdk/resources/courses.py +++ b/src/whop_sdk/resources/courses.py @@ -29,6 +29,8 @@ class CoursesResource(SyncAPIResource): + """Courses""" + @cached_property def with_raw_response(self) -> CoursesResourceWithRawResponse: """ @@ -359,6 +361,8 @@ def delete( class AsyncCoursesResource(AsyncAPIResource): + """Courses""" + @cached_property def with_raw_response(self) -> AsyncCoursesResourceWithRawResponse: """ diff --git a/src/whop_sdk/resources/dispute_alerts.py b/src/whop_sdk/resources/dispute_alerts.py index 03b47ef2..6ce07f13 100644 --- a/src/whop_sdk/resources/dispute_alerts.py +++ b/src/whop_sdk/resources/dispute_alerts.py @@ -28,6 +28,8 @@ class DisputeAlertsResource(SyncAPIResource): + """Dispute alerts""" + @cached_property def with_raw_response(self) -> DisputeAlertsResourceWithRawResponse: """ @@ -169,6 +171,8 @@ def list( class AsyncDisputeAlertsResource(AsyncAPIResource): + """Dispute alerts""" + @cached_property def with_raw_response(self) -> AsyncDisputeAlertsResourceWithRawResponse: """ diff --git a/src/whop_sdk/resources/disputes.py b/src/whop_sdk/resources/disputes.py index 0baa88dc..33d308f8 100644 --- a/src/whop_sdk/resources/disputes.py +++ b/src/whop_sdk/resources/disputes.py @@ -28,6 +28,8 @@ class DisputesResource(SyncAPIResource): + """Disputes""" + @cached_property def with_raw_response(self) -> DisputesResourceWithRawResponse: """ @@ -328,6 +330,8 @@ def update_evidence( class AsyncDisputesResource(AsyncAPIResource): + """Disputes""" + @cached_property def with_raw_response(self) -> AsyncDisputesResourceWithRawResponse: """ diff --git a/src/whop_sdk/resources/dm_channels.py b/src/whop_sdk/resources/dm_channels.py index 7e51c55e..6c979300 100644 --- a/src/whop_sdk/resources/dm_channels.py +++ b/src/whop_sdk/resources/dm_channels.py @@ -27,6 +27,8 @@ class DmChannelsResource(SyncAPIResource): + """Dm channels""" + @cached_property def with_raw_response(self) -> DmChannelsResourceWithRawResponse: """ @@ -282,6 +284,8 @@ def delete( class AsyncDmChannelsResource(AsyncAPIResource): + """Dm channels""" + @cached_property def with_raw_response(self) -> AsyncDmChannelsResourceWithRawResponse: """ diff --git a/src/whop_sdk/resources/dm_members.py b/src/whop_sdk/resources/dm_members.py index f1a8ca12..1681c01b 100644 --- a/src/whop_sdk/resources/dm_members.py +++ b/src/whop_sdk/resources/dm_members.py @@ -35,6 +35,8 @@ class DmMembersResource(SyncAPIResource): + """Dm members""" + @cached_property def with_raw_response(self) -> DmMembersResourceWithRawResponse: """ @@ -297,6 +299,8 @@ def delete( class AsyncDmMembersResource(AsyncAPIResource): + """Dm members""" + @cached_property def with_raw_response(self) -> AsyncDmMembersResourceWithRawResponse: """ diff --git a/src/whop_sdk/resources/entries.py b/src/whop_sdk/resources/entries.py index 41d5d23c..42e4218f 100644 --- a/src/whop_sdk/resources/entries.py +++ b/src/whop_sdk/resources/entries.py @@ -31,6 +31,8 @@ class EntriesResource(SyncAPIResource): + """Entries""" + @cached_property def with_raw_response(self) -> EntriesResourceWithRawResponse: """ @@ -261,6 +263,8 @@ def deny( class AsyncEntriesResource(AsyncAPIResource): + """Entries""" + @cached_property def with_raw_response(self) -> AsyncEntriesResourceWithRawResponse: """ diff --git a/src/whop_sdk/resources/experiences.py b/src/whop_sdk/resources/experiences.py index 50542d1d..531a200e 100644 --- a/src/whop_sdk/resources/experiences.py +++ b/src/whop_sdk/resources/experiences.py @@ -36,6 +36,8 @@ class ExperiencesResource(SyncAPIResource): + """Experiences""" + @cached_property def with_raw_response(self) -> ExperiencesResourceWithRawResponse: """ @@ -458,6 +460,8 @@ def duplicate( class AsyncExperiencesResource(AsyncAPIResource): + """Experiences""" + @cached_property def with_raw_response(self) -> AsyncExperiencesResourceWithRawResponse: """ diff --git a/src/whop_sdk/resources/fee_markups.py b/src/whop_sdk/resources/fee_markups.py index 9944dd2b..9a9e94ba 100644 --- a/src/whop_sdk/resources/fee_markups.py +++ b/src/whop_sdk/resources/fee_markups.py @@ -28,6 +28,8 @@ class FeeMarkupsResource(SyncAPIResource): + """Fee markups""" + @cached_property def with_raw_response(self) -> FeeMarkupsResourceWithRawResponse: """ @@ -219,6 +221,8 @@ def delete( class AsyncFeeMarkupsResource(AsyncAPIResource): + """Fee markups""" + @cached_property def with_raw_response(self) -> AsyncFeeMarkupsResourceWithRawResponse: """ diff --git a/src/whop_sdk/resources/files.py b/src/whop_sdk/resources/files.py index 5729ec7c..d481f6e8 100644 --- a/src/whop_sdk/resources/files.py +++ b/src/whop_sdk/resources/files.py @@ -23,6 +23,8 @@ class FilesResource(SyncAPIResource): + """Files""" + @cached_property def with_raw_response(self) -> FilesResourceWithRawResponse: """ @@ -113,6 +115,8 @@ def retrieve( class AsyncFilesResource(AsyncAPIResource): + """Files""" + @cached_property def with_raw_response(self) -> AsyncFilesResourceWithRawResponse: """ diff --git a/src/whop_sdk/resources/forum_posts.py b/src/whop_sdk/resources/forum_posts.py index 0acb986e..5707175a 100644 --- a/src/whop_sdk/resources/forum_posts.py +++ b/src/whop_sdk/resources/forum_posts.py @@ -33,6 +33,8 @@ class ForumPostsResource(SyncAPIResource): + """Forum posts""" + @cached_property def with_raw_response(self) -> ForumPostsResourceWithRawResponse: """ @@ -327,6 +329,8 @@ def list( class AsyncForumPostsResource(AsyncAPIResource): + """Forum posts""" + @cached_property def with_raw_response(self) -> AsyncForumPostsResourceWithRawResponse: """ diff --git a/src/whop_sdk/resources/forums.py b/src/whop_sdk/resources/forums.py index 3159079e..c23299a5 100644 --- a/src/whop_sdk/resources/forums.py +++ b/src/whop_sdk/resources/forums.py @@ -29,6 +29,8 @@ class ForumsResource(SyncAPIResource): + """Forums""" + @cached_property def with_raw_response(self) -> ForumsResourceWithRawResponse: """ @@ -211,6 +213,8 @@ def list( class AsyncForumsResource(AsyncAPIResource): + """Forums""" + @cached_property def with_raw_response(self) -> AsyncForumsResourceWithRawResponse: """ diff --git a/src/whop_sdk/resources/invoices.py b/src/whop_sdk/resources/invoices.py index aec677fc..9f7f3364 100644 --- a/src/whop_sdk/resources/invoices.py +++ b/src/whop_sdk/resources/invoices.py @@ -32,6 +32,8 @@ class InvoicesResource(SyncAPIResource): + """Invoices""" + @cached_property def with_raw_response(self) -> InvoicesResourceWithRawResponse: """ @@ -578,6 +580,8 @@ def void( class AsyncInvoicesResource(AsyncAPIResource): + """Invoices""" + @cached_property def with_raw_response(self) -> AsyncInvoicesResourceWithRawResponse: """ diff --git a/src/whop_sdk/resources/leads.py b/src/whop_sdk/resources/leads.py index df6f9929..fd31d3d3 100644 --- a/src/whop_sdk/resources/leads.py +++ b/src/whop_sdk/resources/leads.py @@ -27,6 +27,8 @@ class LeadsResource(SyncAPIResource): + """Leads""" + @cached_property def with_raw_response(self) -> LeadsResourceWithRawResponse: """ @@ -288,6 +290,8 @@ def list( class AsyncLeadsResource(AsyncAPIResource): + """Leads""" + @cached_property def with_raw_response(self) -> AsyncLeadsResourceWithRawResponse: """ diff --git a/src/whop_sdk/resources/ledger_accounts.py b/src/whop_sdk/resources/ledger_accounts.py index d213b5ca..cbbc4ee6 100644 --- a/src/whop_sdk/resources/ledger_accounts.py +++ b/src/whop_sdk/resources/ledger_accounts.py @@ -20,6 +20,8 @@ class LedgerAccountsResource(SyncAPIResource): + """Ledger accounts""" + @cached_property def with_raw_response(self) -> LedgerAccountsResourceWithRawResponse: """ @@ -79,6 +81,8 @@ def retrieve( class AsyncLedgerAccountsResource(AsyncAPIResource): + """Ledger accounts""" + @cached_property def with_raw_response(self) -> AsyncLedgerAccountsResourceWithRawResponse: """ diff --git a/src/whop_sdk/resources/members.py b/src/whop_sdk/resources/members.py index 811f248f..a9d50568 100644 --- a/src/whop_sdk/resources/members.py +++ b/src/whop_sdk/resources/members.py @@ -32,6 +32,8 @@ class MembersResource(SyncAPIResource): + """Members""" + @cached_property def with_raw_response(self) -> MembersResourceWithRawResponse: """ @@ -208,6 +210,8 @@ def list( class AsyncMembersResource(AsyncAPIResource): + """Members""" + @cached_property def with_raw_response(self) -> AsyncMembersResourceWithRawResponse: """ diff --git a/src/whop_sdk/resources/memberships.py b/src/whop_sdk/resources/memberships.py index 22af0afb..1a1d6f7f 100644 --- a/src/whop_sdk/resources/memberships.py +++ b/src/whop_sdk/resources/memberships.py @@ -36,6 +36,8 @@ class MembershipsResource(SyncAPIResource): + """Memberships""" + @cached_property def with_raw_response(self) -> MembershipsResourceWithRawResponse: """ @@ -419,6 +421,8 @@ def uncancel( class AsyncMembershipsResource(AsyncAPIResource): + """Memberships""" + @cached_property def with_raw_response(self) -> AsyncMembershipsResourceWithRawResponse: """ diff --git a/src/whop_sdk/resources/messages.py b/src/whop_sdk/resources/messages.py index 73316027..06ba3f0b 100644 --- a/src/whop_sdk/resources/messages.py +++ b/src/whop_sdk/resources/messages.py @@ -28,6 +28,8 @@ class MessagesResource(SyncAPIResource): + """Messages""" + @cached_property def with_raw_response(self) -> MessagesResourceWithRawResponse: """ @@ -313,6 +315,8 @@ def delete( class AsyncMessagesResource(AsyncAPIResource): + """Messages""" + @cached_property def with_raw_response(self) -> AsyncMessagesResourceWithRawResponse: """ diff --git a/src/whop_sdk/resources/notifications.py b/src/whop_sdk/resources/notifications.py index f1eff29a..eaf1c066 100644 --- a/src/whop_sdk/resources/notifications.py +++ b/src/whop_sdk/resources/notifications.py @@ -25,6 +25,8 @@ class NotificationsResource(SyncAPIResource): + """Notifications""" + @cached_property def with_raw_response(self) -> NotificationsResourceWithRawResponse: """ @@ -208,6 +210,8 @@ def create( class AsyncNotificationsResource(AsyncAPIResource): + """Notifications""" + @cached_property def with_raw_response(self) -> AsyncNotificationsResourceWithRawResponse: """ diff --git a/src/whop_sdk/resources/payment_methods.py b/src/whop_sdk/resources/payment_methods.py index 9e993655..9e9da3d2 100644 --- a/src/whop_sdk/resources/payment_methods.py +++ b/src/whop_sdk/resources/payment_methods.py @@ -28,6 +28,8 @@ class PaymentMethodsResource(SyncAPIResource): + """Payment methods""" + @cached_property def with_raw_response(self) -> PaymentMethodsResourceWithRawResponse: """ @@ -194,6 +196,8 @@ def list( class AsyncPaymentMethodsResource(AsyncAPIResource): + """Payment methods""" + @cached_property def with_raw_response(self) -> AsyncPaymentMethodsResourceWithRawResponse: """ diff --git a/src/whop_sdk/resources/payments.py b/src/whop_sdk/resources/payments.py index d36041da..47e0be4c 100644 --- a/src/whop_sdk/resources/payments.py +++ b/src/whop_sdk/resources/payments.py @@ -34,6 +34,8 @@ class PaymentsResource(SyncAPIResource): + """Payments""" + @cached_property def with_raw_response(self) -> PaymentsResourceWithRawResponse: """ @@ -588,6 +590,8 @@ def void( class AsyncPaymentsResource(AsyncAPIResource): + """Payments""" + @cached_property def with_raw_response(self) -> AsyncPaymentsResourceWithRawResponse: """ diff --git a/src/whop_sdk/resources/payout_methods.py b/src/whop_sdk/resources/payout_methods.py index 0333f57e..d0c5978d 100644 --- a/src/whop_sdk/resources/payout_methods.py +++ b/src/whop_sdk/resources/payout_methods.py @@ -26,6 +26,8 @@ class PayoutMethodsResource(SyncAPIResource): + """Payout methods""" + @cached_property def with_raw_response(self) -> PayoutMethodsResourceWithRawResponse: """ @@ -148,6 +150,8 @@ def list( class AsyncPayoutMethodsResource(AsyncAPIResource): + """Payout methods""" + @cached_property def with_raw_response(self) -> AsyncPayoutMethodsResourceWithRawResponse: """ diff --git a/src/whop_sdk/resources/plans.py b/src/whop_sdk/resources/plans.py index 413c3f89..fbd116c4 100644 --- a/src/whop_sdk/resources/plans.py +++ b/src/whop_sdk/resources/plans.py @@ -36,6 +36,8 @@ class PlansResource(SyncAPIResource): + """Plans""" + @cached_property def with_raw_response(self) -> PlansResourceWithRawResponse: """ @@ -504,6 +506,8 @@ def delete( class AsyncPlansResource(AsyncAPIResource): + """Plans""" + @cached_property def with_raw_response(self) -> AsyncPlansResourceWithRawResponse: """ diff --git a/src/whop_sdk/resources/products.py b/src/whop_sdk/resources/products.py index a4b6793a..0c34deb9 100644 --- a/src/whop_sdk/resources/products.py +++ b/src/whop_sdk/resources/products.py @@ -35,6 +35,8 @@ class ProductsResource(SyncAPIResource): + """Products""" + @cached_property def with_raw_response(self) -> ProductsResourceWithRawResponse: """ @@ -453,6 +455,8 @@ def delete( class AsyncProductsResource(AsyncAPIResource): + """Products""" + @cached_property def with_raw_response(self) -> AsyncProductsResourceWithRawResponse: """ diff --git a/src/whop_sdk/resources/promo_codes.py b/src/whop_sdk/resources/promo_codes.py index 4d8deb2f..5bb3b5d3 100644 --- a/src/whop_sdk/resources/promo_codes.py +++ b/src/whop_sdk/resources/promo_codes.py @@ -31,6 +31,8 @@ class PromoCodesResource(SyncAPIResource): + """Promo codes""" + @cached_property def with_raw_response(self) -> PromoCodesResourceWithRawResponse: """ @@ -325,6 +327,8 @@ def delete( class AsyncPromoCodesResource(AsyncAPIResource): + """Promo codes""" + @cached_property def with_raw_response(self) -> AsyncPromoCodesResourceWithRawResponse: """ diff --git a/src/whop_sdk/resources/reactions.py b/src/whop_sdk/resources/reactions.py index 46882546..901f51a8 100644 --- a/src/whop_sdk/resources/reactions.py +++ b/src/whop_sdk/resources/reactions.py @@ -27,6 +27,8 @@ class ReactionsResource(SyncAPIResource): + """Reactions""" + @cached_property def with_raw_response(self) -> ReactionsResourceWithRawResponse: """ @@ -252,6 +254,8 @@ def delete( class AsyncReactionsResource(AsyncAPIResource): + """Reactions""" + @cached_property def with_raw_response(self) -> AsyncReactionsResourceWithRawResponse: """ diff --git a/src/whop_sdk/resources/refunds.py b/src/whop_sdk/resources/refunds.py index ed7ba09f..e9bc15a9 100644 --- a/src/whop_sdk/resources/refunds.py +++ b/src/whop_sdk/resources/refunds.py @@ -28,6 +28,8 @@ class RefundsResource(SyncAPIResource): + """Refunds""" + @cached_property def with_raw_response(self) -> RefundsResourceWithRawResponse: """ @@ -165,6 +167,8 @@ def list( class AsyncRefundsResource(AsyncAPIResource): + """Refunds""" + @cached_property def with_raw_response(self) -> AsyncRefundsResourceWithRawResponse: """ diff --git a/src/whop_sdk/resources/reviews.py b/src/whop_sdk/resources/reviews.py index 3ce2c4d7..096ed767 100644 --- a/src/whop_sdk/resources/reviews.py +++ b/src/whop_sdk/resources/reviews.py @@ -27,6 +27,8 @@ class ReviewsResource(SyncAPIResource): + """Reviews""" + @cached_property def with_raw_response(self) -> ReviewsResourceWithRawResponse: """ @@ -157,6 +159,8 @@ def list( class AsyncReviewsResource(AsyncAPIResource): + """Reviews""" + @cached_property def with_raw_response(self) -> AsyncReviewsResourceWithRawResponse: """ diff --git a/src/whop_sdk/resources/setup_intents.py b/src/whop_sdk/resources/setup_intents.py index e85baf44..71e5989c 100644 --- a/src/whop_sdk/resources/setup_intents.py +++ b/src/whop_sdk/resources/setup_intents.py @@ -28,6 +28,8 @@ class SetupIntentsResource(SyncAPIResource): + """Setup intents""" + @cached_property def with_raw_response(self) -> SetupIntentsResourceWithRawResponse: """ @@ -167,6 +169,8 @@ def list( class AsyncSetupIntentsResource(AsyncAPIResource): + """Setup intents""" + @cached_property def with_raw_response(self) -> AsyncSetupIntentsResourceWithRawResponse: """ diff --git a/src/whop_sdk/resources/shipments.py b/src/whop_sdk/resources/shipments.py index 1b46c631..e6b88fe8 100644 --- a/src/whop_sdk/resources/shipments.py +++ b/src/whop_sdk/resources/shipments.py @@ -26,6 +26,8 @@ class ShipmentsResource(SyncAPIResource): + """Shipments""" + @cached_property def with_raw_response(self) -> ShipmentsResourceWithRawResponse: """ @@ -213,6 +215,8 @@ def list( class AsyncShipmentsResource(AsyncAPIResource): + """Shipments""" + @cached_property def with_raw_response(self) -> AsyncShipmentsResourceWithRawResponse: """ diff --git a/src/whop_sdk/resources/support_channels.py b/src/whop_sdk/resources/support_channels.py index 7b5146ae..4fba5053 100644 --- a/src/whop_sdk/resources/support_channels.py +++ b/src/whop_sdk/resources/support_channels.py @@ -28,6 +28,8 @@ class SupportChannelsResource(SyncAPIResource): + """Support channels""" + @cached_property def with_raw_response(self) -> SupportChannelsResourceWithRawResponse: """ @@ -217,6 +219,8 @@ def list( class AsyncSupportChannelsResource(AsyncAPIResource): + """Support channels""" + @cached_property def with_raw_response(self) -> AsyncSupportChannelsResourceWithRawResponse: """ diff --git a/src/whop_sdk/resources/topups.py b/src/whop_sdk/resources/topups.py index 858cd891..8dd55658 100644 --- a/src/whop_sdk/resources/topups.py +++ b/src/whop_sdk/resources/topups.py @@ -23,6 +23,8 @@ class TopupsResource(SyncAPIResource): + """Topups""" + @cached_property def with_raw_response(self) -> TopupsResourceWithRawResponse: """ @@ -101,6 +103,8 @@ def create( class AsyncTopupsResource(AsyncAPIResource): + """Topups""" + @cached_property def with_raw_response(self) -> AsyncTopupsResourceWithRawResponse: """ diff --git a/src/whop_sdk/resources/transfers.py b/src/whop_sdk/resources/transfers.py index 6252141a..9837e10c 100644 --- a/src/whop_sdk/resources/transfers.py +++ b/src/whop_sdk/resources/transfers.py @@ -30,6 +30,8 @@ class TransfersResource(SyncAPIResource): + """Transfers""" + @cached_property def with_raw_response(self) -> TransfersResourceWithRawResponse: """ @@ -247,6 +249,8 @@ def list( class AsyncTransfersResource(AsyncAPIResource): + """Transfers""" + @cached_property def with_raw_response(self) -> AsyncTransfersResourceWithRawResponse: """ diff --git a/src/whop_sdk/resources/users.py b/src/whop_sdk/resources/users.py index 914efd00..4d01d560 100644 --- a/src/whop_sdk/resources/users.py +++ b/src/whop_sdk/resources/users.py @@ -25,6 +25,8 @@ class UsersResource(SyncAPIResource): + """Users""" + @cached_property def with_raw_response(self) -> UsersResourceWithRawResponse: """ @@ -172,6 +174,8 @@ def update_profile( class AsyncUsersResource(AsyncAPIResource): + """Users""" + @cached_property def with_raw_response(self) -> AsyncUsersResourceWithRawResponse: """ diff --git a/src/whop_sdk/resources/verifications.py b/src/whop_sdk/resources/verifications.py index 02f4b65d..829e8aa5 100644 --- a/src/whop_sdk/resources/verifications.py +++ b/src/whop_sdk/resources/verifications.py @@ -20,6 +20,8 @@ class VerificationsResource(SyncAPIResource): + """Verifications""" + @cached_property def with_raw_response(self) -> VerificationsResourceWithRawResponse: """ @@ -78,6 +80,8 @@ def retrieve( class AsyncVerificationsResource(AsyncAPIResource): + """Verifications""" + @cached_property def with_raw_response(self) -> AsyncVerificationsResourceWithRawResponse: """ diff --git a/src/whop_sdk/resources/webhooks.py b/src/whop_sdk/resources/webhooks.py index 340e6a65..b396c301 100644 --- a/src/whop_sdk/resources/webhooks.py +++ b/src/whop_sdk/resources/webhooks.py @@ -34,6 +34,8 @@ class WebhooksResource(SyncAPIResource): + """Webhooks""" + @cached_property def with_raw_response(self) -> WebhooksResourceWithRawResponse: """ @@ -346,6 +348,8 @@ def unwrap(self, payload: str, *, headers: Mapping[str, str], key: str | bytes | class AsyncWebhooksResource(AsyncAPIResource): + """Webhooks""" + @cached_property def with_raw_response(self) -> AsyncWebhooksResourceWithRawResponse: """ diff --git a/src/whop_sdk/resources/withdrawals.py b/src/whop_sdk/resources/withdrawals.py index 51b74257..3e6895cb 100644 --- a/src/whop_sdk/resources/withdrawals.py +++ b/src/whop_sdk/resources/withdrawals.py @@ -29,6 +29,8 @@ class WithdrawalsResource(SyncAPIResource): + """Withdrawals""" + @cached_property def with_raw_response(self) -> WithdrawalsResourceWithRawResponse: """ @@ -229,6 +231,8 @@ def list( class AsyncWithdrawalsResource(AsyncAPIResource): + """Withdrawals""" + @cached_property def with_raw_response(self) -> AsyncWithdrawalsResourceWithRawResponse: """ From c2f142d7aebad6ec2b140d70a8b93aa3205290ec Mon Sep 17 00:00:00 2001 From: "stainless-app[bot]" <142633134+stainless-app[bot]@users.noreply.github.com> Date: Sat, 28 Feb 2026 22:27:21 +0000 Subject: [PATCH 05/17] feat(api): api update --- .stats.yml | 4 ++-- src/whop_sdk/types/shared/authorized_user_roles.py | 2 +- src/whop_sdk/types/shared_params/authorized_user_roles.py | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/.stats.yml b/.stats.yml index 11c0bf72..0b093693 100644 --- a/.stats.yml +++ b/.stats.yml @@ -1,4 +1,4 @@ configured_endpoints: 173 -openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/frostedinc%2Fwhopsdk-8998964c7e02d7bd7d096104b987949bfc34f18f928f20bf36e15794e0edd0a6.yml -openapi_spec_hash: 909836d9685b020916fd5e6ae35ac1ac +openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/frostedinc%2Fwhopsdk-2b7900e7e91f4f7b7685096a5a3130824a091697e2acdd86ea824641f578c8bf.yml +openapi_spec_hash: aa234abda031a41549b33698bdbb6020 config_hash: 8ac153ea57fa6460b13cded3f7c9c7a6 diff --git a/src/whop_sdk/types/shared/authorized_user_roles.py b/src/whop_sdk/types/shared/authorized_user_roles.py index 877db6d2..10d0fe2c 100644 --- a/src/whop_sdk/types/shared/authorized_user_roles.py +++ b/src/whop_sdk/types/shared/authorized_user_roles.py @@ -5,5 +5,5 @@ __all__ = ["AuthorizedUserRoles"] AuthorizedUserRoles: TypeAlias = Literal[ - "owner", "admin", "sales_manager", "moderator", "app_manager", "support", "manager" + "owner", "admin", "sales_manager", "moderator", "app_manager", "support", "manager", "custom" ] diff --git a/src/whop_sdk/types/shared_params/authorized_user_roles.py b/src/whop_sdk/types/shared_params/authorized_user_roles.py index 2235fde7..c61f3cc6 100644 --- a/src/whop_sdk/types/shared_params/authorized_user_roles.py +++ b/src/whop_sdk/types/shared_params/authorized_user_roles.py @@ -7,5 +7,5 @@ __all__ = ["AuthorizedUserRoles"] AuthorizedUserRoles: TypeAlias = Literal[ - "owner", "admin", "sales_manager", "moderator", "app_manager", "support", "manager" + "owner", "admin", "sales_manager", "moderator", "app_manager", "support", "manager", "custom" ] From ad1d5b78546c5efd4214e22c42aa7a64227bc34c Mon Sep 17 00:00:00 2001 From: "stainless-app[bot]" <142633134+stainless-app[bot]@users.noreply.github.com> Date: Sun, 1 Mar 2026 23:27:25 +0000 Subject: [PATCH 06/17] feat(api): api update --- .stats.yml | 4 +- src/whop_sdk/types/invoice_create_params.py | 155 +++++++++++++++++++- tests/api_resources/test_invoices.py | 48 ++++++ 3 files changed, 204 insertions(+), 3 deletions(-) diff --git a/.stats.yml b/.stats.yml index 0b093693..907015de 100644 --- a/.stats.yml +++ b/.stats.yml @@ -1,4 +1,4 @@ configured_endpoints: 173 -openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/frostedinc%2Fwhopsdk-2b7900e7e91f4f7b7685096a5a3130824a091697e2acdd86ea824641f578c8bf.yml -openapi_spec_hash: aa234abda031a41549b33698bdbb6020 +openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/frostedinc%2Fwhopsdk-d7b5330faddf3c2e92a228859ad9c16ac5f049148adc29d9e4275634991a9de4.yml +openapi_spec_hash: 6563ca1a2f777e750d67beb58a1bf7a8 config_hash: 8ac153ea57fa6460b13cded3f7c9c7a6 diff --git a/src/whop_sdk/types/invoice_create_params.py b/src/whop_sdk/types/invoice_create_params.py index a3c6104b..65c36fae 100644 --- a/src/whop_sdk/types/invoice_create_params.py +++ b/src/whop_sdk/types/invoice_create_params.py @@ -2,13 +2,14 @@ from __future__ import annotations -from typing import Union, Iterable, Optional +from typing import List, Union, Iterable, Optional from datetime import datetime from typing_extensions import Literal, Required, Annotated, TypeAlias, TypedDict from .._utils import PropertyInfo from .shared.plan_type import PlanType from .shared.visibility import Visibility +from .payment_method_types import PaymentMethodTypes from .shared.release_method import ReleaseMethod from .shared.collection_method import CollectionMethod @@ -17,17 +18,21 @@ "CreateInvoiceInputWithProductAndMemberID", "CreateInvoiceInputWithProductAndMemberIDPlan", "CreateInvoiceInputWithProductAndMemberIDPlanCustomField", + "CreateInvoiceInputWithProductAndMemberIDPlanPaymentMethodConfiguration", "CreateInvoiceInputWithProductAndMemberIDProduct", "CreateInvoiceInputWithProductAndEmailAddress", "CreateInvoiceInputWithProductAndEmailAddressPlan", "CreateInvoiceInputWithProductAndEmailAddressPlanCustomField", + "CreateInvoiceInputWithProductAndEmailAddressPlanPaymentMethodConfiguration", "CreateInvoiceInputWithProductAndEmailAddressProduct", "CreateInvoiceInputWithProductIDAndMemberID", "CreateInvoiceInputWithProductIDAndMemberIDPlan", "CreateInvoiceInputWithProductIDAndMemberIDPlanCustomField", + "CreateInvoiceInputWithProductIDAndMemberIDPlanPaymentMethodConfiguration", "CreateInvoiceInputWithProductIDAndEmailAddress", "CreateInvoiceInputWithProductIDAndEmailAddressPlan", "CreateInvoiceInputWithProductIDAndEmailAddressPlanCustomField", + "CreateInvoiceInputWithProductIDAndEmailAddressPlanPaymentMethodConfiguration", ] @@ -113,6 +118,34 @@ class CreateInvoiceInputWithProductAndMemberIDPlanCustomField(TypedDict, total=F """Whether or not the field is required.""" +class CreateInvoiceInputWithProductAndMemberIDPlanPaymentMethodConfiguration(TypedDict, total=False): + """The explicit payment method configuration for the plan. + + If not provided, the platform or company's defaults will apply. + """ + + disabled: Required[List[PaymentMethodTypes]] + """An array of payment method identifiers that are explicitly disabled. + + Only applies if the include_platform_defaults is true. + """ + + enabled: Required[List[PaymentMethodTypes]] + """An array of payment method identifiers that are explicitly enabled. + + This means these payment methods will be shown on checkout. Example use case is + to only enable a specific payment method like cashapp, or extending the platform + defaults with additional methods. + """ + + include_platform_defaults: Required[bool] + """ + Whether Whop's platform default payment method enablement settings are included + in this configuration. The full list of default payment methods can be found in + the documentation at docs.whop.com/payments. + """ + + class CreateInvoiceInputWithProductAndMemberIDPlan(TypedDict, total=False): """ The plan attributes defining the price, currency, and billing interval for this invoice. @@ -144,6 +177,15 @@ class CreateInvoiceInputWithProductAndMemberIDPlan(TypedDict, total=False): internal_notes: Optional[str] """A personal description or notes section for the business.""" + legacy_payment_method_controls: Optional[bool] + """Whether this plan uses legacy payment method controls""" + + payment_method_configuration: Optional[CreateInvoiceInputWithProductAndMemberIDPlanPaymentMethodConfiguration] + """The explicit payment method configuration for the plan. + + If not provided, the platform or company's defaults will apply. + """ + plan_type: Optional[PlanType] """The type of plan that can be attached to a product""" @@ -269,6 +311,34 @@ class CreateInvoiceInputWithProductAndEmailAddressPlanCustomField(TypedDict, tot """Whether or not the field is required.""" +class CreateInvoiceInputWithProductAndEmailAddressPlanPaymentMethodConfiguration(TypedDict, total=False): + """The explicit payment method configuration for the plan. + + If not provided, the platform or company's defaults will apply. + """ + + disabled: Required[List[PaymentMethodTypes]] + """An array of payment method identifiers that are explicitly disabled. + + Only applies if the include_platform_defaults is true. + """ + + enabled: Required[List[PaymentMethodTypes]] + """An array of payment method identifiers that are explicitly enabled. + + This means these payment methods will be shown on checkout. Example use case is + to only enable a specific payment method like cashapp, or extending the platform + defaults with additional methods. + """ + + include_platform_defaults: Required[bool] + """ + Whether Whop's platform default payment method enablement settings are included + in this configuration. The full list of default payment methods can be found in + the documentation at docs.whop.com/payments. + """ + + class CreateInvoiceInputWithProductAndEmailAddressPlan(TypedDict, total=False): """ The plan attributes defining the price, currency, and billing interval for this invoice. @@ -300,6 +370,15 @@ class CreateInvoiceInputWithProductAndEmailAddressPlan(TypedDict, total=False): internal_notes: Optional[str] """A personal description or notes section for the business.""" + legacy_payment_method_controls: Optional[bool] + """Whether this plan uses legacy payment method controls""" + + payment_method_configuration: Optional[CreateInvoiceInputWithProductAndEmailAddressPlanPaymentMethodConfiguration] + """The explicit payment method configuration for the plan. + + If not provided, the platform or company's defaults will apply. + """ + plan_type: Optional[PlanType] """The type of plan that can be attached to a product""" @@ -421,6 +500,34 @@ class CreateInvoiceInputWithProductIDAndMemberIDPlanCustomField(TypedDict, total """Whether or not the field is required.""" +class CreateInvoiceInputWithProductIDAndMemberIDPlanPaymentMethodConfiguration(TypedDict, total=False): + """The explicit payment method configuration for the plan. + + If not provided, the platform or company's defaults will apply. + """ + + disabled: Required[List[PaymentMethodTypes]] + """An array of payment method identifiers that are explicitly disabled. + + Only applies if the include_platform_defaults is true. + """ + + enabled: Required[List[PaymentMethodTypes]] + """An array of payment method identifiers that are explicitly enabled. + + This means these payment methods will be shown on checkout. Example use case is + to only enable a specific payment method like cashapp, or extending the platform + defaults with additional methods. + """ + + include_platform_defaults: Required[bool] + """ + Whether Whop's platform default payment method enablement settings are included + in this configuration. The full list of default payment methods can be found in + the documentation at docs.whop.com/payments. + """ + + class CreateInvoiceInputWithProductIDAndMemberIDPlan(TypedDict, total=False): """ The plan attributes defining the price, currency, and billing interval for this invoice. @@ -452,6 +559,15 @@ class CreateInvoiceInputWithProductIDAndMemberIDPlan(TypedDict, total=False): internal_notes: Optional[str] """A personal description or notes section for the business.""" + legacy_payment_method_controls: Optional[bool] + """Whether this plan uses legacy payment method controls""" + + payment_method_configuration: Optional[CreateInvoiceInputWithProductIDAndMemberIDPlanPaymentMethodConfiguration] + """The explicit payment method configuration for the plan. + + If not provided, the platform or company's defaults will apply. + """ + plan_type: Optional[PlanType] """The type of plan that can be attached to a product""" @@ -561,6 +677,34 @@ class CreateInvoiceInputWithProductIDAndEmailAddressPlanCustomField(TypedDict, t """Whether or not the field is required.""" +class CreateInvoiceInputWithProductIDAndEmailAddressPlanPaymentMethodConfiguration(TypedDict, total=False): + """The explicit payment method configuration for the plan. + + If not provided, the platform or company's defaults will apply. + """ + + disabled: Required[List[PaymentMethodTypes]] + """An array of payment method identifiers that are explicitly disabled. + + Only applies if the include_platform_defaults is true. + """ + + enabled: Required[List[PaymentMethodTypes]] + """An array of payment method identifiers that are explicitly enabled. + + This means these payment methods will be shown on checkout. Example use case is + to only enable a specific payment method like cashapp, or extending the platform + defaults with additional methods. + """ + + include_platform_defaults: Required[bool] + """ + Whether Whop's platform default payment method enablement settings are included + in this configuration. The full list of default payment methods can be found in + the documentation at docs.whop.com/payments. + """ + + class CreateInvoiceInputWithProductIDAndEmailAddressPlan(TypedDict, total=False): """ The plan attributes defining the price, currency, and billing interval for this invoice. @@ -592,6 +736,15 @@ class CreateInvoiceInputWithProductIDAndEmailAddressPlan(TypedDict, total=False) internal_notes: Optional[str] """A personal description or notes section for the business.""" + legacy_payment_method_controls: Optional[bool] + """Whether this plan uses legacy payment method controls""" + + payment_method_configuration: Optional[CreateInvoiceInputWithProductIDAndEmailAddressPlanPaymentMethodConfiguration] + """The explicit payment method configuration for the plan. + + If not provided, the platform or company's defaults will apply. + """ + plan_type: Optional[PlanType] """The type of plan that can be attached to a product""" diff --git a/tests/api_resources/test_invoices.py b/tests/api_resources/test_invoices.py index 7db7c125..bf41884b 100644 --- a/tests/api_resources/test_invoices.py +++ b/tests/api_resources/test_invoices.py @@ -57,6 +57,12 @@ def test_method_create_with_all_params_overload_1(self, client: Whop) -> None: "expiration_days": 42, "initial_price": 6.9, "internal_notes": "internal_notes", + "legacy_payment_method_controls": True, + "payment_method_configuration": { + "disabled": ["acss_debit"], + "enabled": ["acss_debit"], + "include_platform_defaults": True, + }, "plan_type": "renewal", "release_method": "buy_now", "renewal_price": 6.9, @@ -150,6 +156,12 @@ def test_method_create_with_all_params_overload_2(self, client: Whop) -> None: "expiration_days": 42, "initial_price": 6.9, "internal_notes": "internal_notes", + "legacy_payment_method_controls": True, + "payment_method_configuration": { + "disabled": ["acss_debit"], + "enabled": ["acss_debit"], + "include_platform_defaults": True, + }, "plan_type": "renewal", "release_method": "buy_now", "renewal_price": 6.9, @@ -243,6 +255,12 @@ def test_method_create_with_all_params_overload_3(self, client: Whop) -> None: "expiration_days": 42, "initial_price": 6.9, "internal_notes": "internal_notes", + "legacy_payment_method_controls": True, + "payment_method_configuration": { + "disabled": ["acss_debit"], + "enabled": ["acss_debit"], + "include_platform_defaults": True, + }, "plan_type": "renewal", "release_method": "buy_now", "renewal_price": 6.9, @@ -333,6 +351,12 @@ def test_method_create_with_all_params_overload_4(self, client: Whop) -> None: "expiration_days": 42, "initial_price": 6.9, "internal_notes": "internal_notes", + "legacy_payment_method_controls": True, + "payment_method_configuration": { + "disabled": ["acss_debit"], + "enabled": ["acss_debit"], + "include_platform_defaults": True, + }, "plan_type": "renewal", "release_method": "buy_now", "renewal_price": 6.9, @@ -566,6 +590,12 @@ async def test_method_create_with_all_params_overload_1(self, async_client: Asyn "expiration_days": 42, "initial_price": 6.9, "internal_notes": "internal_notes", + "legacy_payment_method_controls": True, + "payment_method_configuration": { + "disabled": ["acss_debit"], + "enabled": ["acss_debit"], + "include_platform_defaults": True, + }, "plan_type": "renewal", "release_method": "buy_now", "renewal_price": 6.9, @@ -659,6 +689,12 @@ async def test_method_create_with_all_params_overload_2(self, async_client: Asyn "expiration_days": 42, "initial_price": 6.9, "internal_notes": "internal_notes", + "legacy_payment_method_controls": True, + "payment_method_configuration": { + "disabled": ["acss_debit"], + "enabled": ["acss_debit"], + "include_platform_defaults": True, + }, "plan_type": "renewal", "release_method": "buy_now", "renewal_price": 6.9, @@ -752,6 +788,12 @@ async def test_method_create_with_all_params_overload_3(self, async_client: Asyn "expiration_days": 42, "initial_price": 6.9, "internal_notes": "internal_notes", + "legacy_payment_method_controls": True, + "payment_method_configuration": { + "disabled": ["acss_debit"], + "enabled": ["acss_debit"], + "include_platform_defaults": True, + }, "plan_type": "renewal", "release_method": "buy_now", "renewal_price": 6.9, @@ -842,6 +884,12 @@ async def test_method_create_with_all_params_overload_4(self, async_client: Asyn "expiration_days": 42, "initial_price": 6.9, "internal_notes": "internal_notes", + "legacy_payment_method_controls": True, + "payment_method_configuration": { + "disabled": ["acss_debit"], + "enabled": ["acss_debit"], + "include_platform_defaults": True, + }, "plan_type": "renewal", "release_method": "buy_now", "renewal_price": 6.9, From 2f4cd94cdca591d743dd905f9b325d25fe45acb8 Mon Sep 17 00:00:00 2001 From: "stainless-app[bot]" <142633134+stainless-app[bot]@users.noreply.github.com> Date: Mon, 2 Mar 2026 21:02:41 +0000 Subject: [PATCH 07/17] feat(api): api update --- .stats.yml | 4 +-- src/whop_sdk/resources/ai_chats.py | 10 ++++++ src/whop_sdk/types/ai_chat_create_params.py | 6 ++++ .../types/forum_post_list_response.py | 33 +++++++++++++++++-- src/whop_sdk/types/shared/forum_post.py | 33 +++++++++++++++++-- tests/api_resources/test_ai_chats.py | 2 ++ 6 files changed, 82 insertions(+), 6 deletions(-) diff --git a/.stats.yml b/.stats.yml index 907015de..44836797 100644 --- a/.stats.yml +++ b/.stats.yml @@ -1,4 +1,4 @@ configured_endpoints: 173 -openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/frostedinc%2Fwhopsdk-d7b5330faddf3c2e92a228859ad9c16ac5f049148adc29d9e4275634991a9de4.yml -openapi_spec_hash: 6563ca1a2f777e750d67beb58a1bf7a8 +openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/frostedinc%2Fwhopsdk-ea3a755c0f0252a08fd7eb08ce1ab295d0bc06af71529898c905285a7940c5f6.yml +openapi_spec_hash: 5937b46b3f24255e86ecf804a9ed968a config_hash: 8ac153ea57fa6460b13cded3f7c9c7a6 diff --git a/src/whop_sdk/resources/ai_chats.py b/src/whop_sdk/resources/ai_chats.py index 7d93aefe..cd1fe56a 100644 --- a/src/whop_sdk/resources/ai_chats.py +++ b/src/whop_sdk/resources/ai_chats.py @@ -56,6 +56,7 @@ def create( current_company_id: Optional[str] | Omit = omit, message_attachments: Optional[Iterable[ai_chat_create_params.MessageAttachment]] | Omit = omit, message_source: Optional[Literal["manual", "suggestion", "link"]] | Omit = omit, + suggestion_type: Optional[str] | Omit = omit, title: 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. @@ -82,6 +83,9 @@ def create( message_source: The source of an AI chat message + suggestion_type: The type of suggestion prompt that was clicked, when message_source is + 'suggestion'. + title: An optional display title for the AI chat thread (e.g., "Help with billing"). extra_headers: Send extra headers @@ -100,6 +104,7 @@ def create( "current_company_id": current_company_id, "message_attachments": message_attachments, "message_source": message_source, + "suggestion_type": suggestion_type, "title": title, }, ai_chat_create_params.AIChatCreateParams, @@ -316,6 +321,7 @@ async def create( current_company_id: Optional[str] | Omit = omit, message_attachments: Optional[Iterable[ai_chat_create_params.MessageAttachment]] | Omit = omit, message_source: Optional[Literal["manual", "suggestion", "link"]] | Omit = omit, + suggestion_type: Optional[str] | Omit = omit, title: 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. @@ -342,6 +348,9 @@ async def create( message_source: The source of an AI chat message + suggestion_type: The type of suggestion prompt that was clicked, when message_source is + 'suggestion'. + title: An optional display title for the AI chat thread (e.g., "Help with billing"). extra_headers: Send extra headers @@ -360,6 +369,7 @@ async def create( "current_company_id": current_company_id, "message_attachments": message_attachments, "message_source": message_source, + "suggestion_type": suggestion_type, "title": title, }, ai_chat_create_params.AIChatCreateParams, diff --git a/src/whop_sdk/types/ai_chat_create_params.py b/src/whop_sdk/types/ai_chat_create_params.py index 9b147c0e..4eee3a32 100644 --- a/src/whop_sdk/types/ai_chat_create_params.py +++ b/src/whop_sdk/types/ai_chat_create_params.py @@ -27,6 +27,12 @@ class AIChatCreateParams(TypedDict, total=False): message_source: Optional[Literal["manual", "suggestion", "link"]] """The source of an AI chat message""" + suggestion_type: Optional[str] + """ + The type of suggestion prompt that was clicked, when message_source is + 'suggestion'. + """ + title: Optional[str] """An optional display title for the AI chat thread (e.g., "Help with billing").""" diff --git a/src/whop_sdk/types/forum_post_list_response.py b/src/whop_sdk/types/forum_post_list_response.py index 4bb4f301..4cbd7083 100644 --- a/src/whop_sdk/types/forum_post_list_response.py +++ b/src/whop_sdk/types/forum_post_list_response.py @@ -1,11 +1,37 @@ # File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details. -from typing import Optional +from typing import List, Optional from datetime import datetime from .._models import BaseModel -__all__ = ["ForumPostListResponse", "User"] +__all__ = ["ForumPostListResponse", "Attachment", "User"] + + +class Attachment(BaseModel): + """Represents an image attachment""" + + id: str + """Represents a unique identifier that is Base64 obfuscated. + + It is often used to refetch an object or as key for a cache. The ID type appears + in a JSON response as a String; however, it is not intended to be + human-readable. When expected as an input type, any string (such as + `"VXNlci0xMA=="`) or integer (such as `4`) input value will be accepted as an + ID. + """ + + content_type: Optional[str] = None + """The MIME type of the uploaded file (e.g., image/jpeg, video/mp4, audio/mpeg).""" + + filename: Optional[str] = None + """The original filename of the uploaded attachment, including its file extension.""" + + url: Optional[str] = None + """A pre-optimized URL for rendering this attachment on the client. + + This should be used for displaying attachments in apps. + """ class User(BaseModel): @@ -36,6 +62,9 @@ class ForumPostListResponse(BaseModel): ID. """ + attachments: List[Attachment] + """All file attachments on this post, such as images, documents, and videos.""" + comment_count: int """The total number of direct comments on this post.""" diff --git a/src/whop_sdk/types/shared/forum_post.py b/src/whop_sdk/types/shared/forum_post.py index d3af3981..7a6136d7 100644 --- a/src/whop_sdk/types/shared/forum_post.py +++ b/src/whop_sdk/types/shared/forum_post.py @@ -1,11 +1,37 @@ # File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details. -from typing import Optional +from typing import List, Optional from datetime import datetime from ..._models import BaseModel -__all__ = ["ForumPost", "User"] +__all__ = ["ForumPost", "Attachment", "User"] + + +class Attachment(BaseModel): + """Represents an image attachment""" + + id: str + """Represents a unique identifier that is Base64 obfuscated. + + It is often used to refetch an object or as key for a cache. The ID type appears + in a JSON response as a String; however, it is not intended to be + human-readable. When expected as an input type, any string (such as + `"VXNlci0xMA=="`) or integer (such as `4`) input value will be accepted as an + ID. + """ + + content_type: Optional[str] = None + """The MIME type of the uploaded file (e.g., image/jpeg, video/mp4, audio/mpeg).""" + + filename: Optional[str] = None + """The original filename of the uploaded attachment, including its file extension.""" + + url: Optional[str] = None + """A pre-optimized URL for rendering this attachment on the client. + + This should be used for displaying attachments in apps. + """ class User(BaseModel): @@ -36,6 +62,9 @@ class ForumPost(BaseModel): ID. """ + attachments: List[Attachment] + """All file attachments on this post, such as images, documents, and videos.""" + comment_count: int """The total number of direct comments on this post.""" diff --git a/tests/api_resources/test_ai_chats.py b/tests/api_resources/test_ai_chats.py index 8681f573..3f155d29 100644 --- a/tests/api_resources/test_ai_chats.py +++ b/tests/api_resources/test_ai_chats.py @@ -38,6 +38,7 @@ def test_method_create_with_all_params(self, client: Whop) -> None: current_company_id="current_company_id", message_attachments=[{"id": "id"}], message_source="manual", + suggestion_type="suggestion_type", title="title", ) assert_matches_type(AIChat, ai_chat, path=["response"]) @@ -265,6 +266,7 @@ async def test_method_create_with_all_params(self, async_client: AsyncWhop) -> N current_company_id="current_company_id", message_attachments=[{"id": "id"}], message_source="manual", + suggestion_type="suggestion_type", title="title", ) assert_matches_type(AIChat, ai_chat, path=["response"]) From abc268f2c7a2d59ed01e6fd595aaf3559b831302 Mon Sep 17 00:00:00 2001 From: "stainless-app[bot]" <142633134+stainless-app[bot]@users.noreply.github.com> Date: Tue, 3 Mar 2026 00:03:36 +0000 Subject: [PATCH 08/17] feat(api): api update --- .stats.yml | 4 ++-- src/whop_sdk/resources/forums.py | 10 ++++++++++ src/whop_sdk/types/forum_update_params.py | 20 ++++++++++++++++++-- tests/api_resources/test_forums.py | 2 ++ 4 files changed, 32 insertions(+), 4 deletions(-) diff --git a/.stats.yml b/.stats.yml index 44836797..1bf68496 100644 --- a/.stats.yml +++ b/.stats.yml @@ -1,4 +1,4 @@ configured_endpoints: 173 -openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/frostedinc%2Fwhopsdk-ea3a755c0f0252a08fd7eb08ce1ab295d0bc06af71529898c905285a7940c5f6.yml -openapi_spec_hash: 5937b46b3f24255e86ecf804a9ed968a +openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/frostedinc%2Fwhopsdk-1d48c8db2db67a4190bd5565bb462f01054adce733e24b842709b0fb0887d2b2.yml +openapi_spec_hash: e8718f573e3798c9df5d3226e18599a5 config_hash: 8ac153ea57fa6460b13cded3f7c9c7a6 diff --git a/src/whop_sdk/resources/forums.py b/src/whop_sdk/resources/forums.py index c23299a5..b4f9e476 100644 --- a/src/whop_sdk/resources/forums.py +++ b/src/whop_sdk/resources/forums.py @@ -91,6 +91,7 @@ def update( self, id: str, *, + banner_image: Optional[forum_update_params.BannerImage] | Omit = omit, email_notification_preference: Optional[EmailNotificationPreferences] | Omit = omit, who_can_comment: Optional[WhoCanCommentTypes] | Omit = omit, who_can_post: Optional[WhoCanPostTypes] | Omit = omit, @@ -110,6 +111,9 @@ def update( - `forum:moderate` Args: + banner_image: The banner image displayed at the top of the forum page. Pass null to remove the + existing banner. + email_notification_preference: Email notification preference option for a forum feed who_can_comment: Who can comment on a forum feed @@ -130,6 +134,7 @@ def update( f"/forums/{id}", body=maybe_transform( { + "banner_image": banner_image, "email_notification_preference": email_notification_preference, "who_can_comment": who_can_comment, "who_can_post": who_can_post, @@ -275,6 +280,7 @@ async def update( self, id: str, *, + banner_image: Optional[forum_update_params.BannerImage] | Omit = omit, email_notification_preference: Optional[EmailNotificationPreferences] | Omit = omit, who_can_comment: Optional[WhoCanCommentTypes] | Omit = omit, who_can_post: Optional[WhoCanPostTypes] | Omit = omit, @@ -294,6 +300,9 @@ async def update( - `forum:moderate` Args: + banner_image: The banner image displayed at the top of the forum page. Pass null to remove the + existing banner. + email_notification_preference: Email notification preference option for a forum feed who_can_comment: Who can comment on a forum feed @@ -314,6 +323,7 @@ async def update( f"/forums/{id}", body=await async_maybe_transform( { + "banner_image": banner_image, "email_notification_preference": email_notification_preference, "who_can_comment": who_can_comment, "who_can_post": who_can_post, diff --git a/src/whop_sdk/types/forum_update_params.py b/src/whop_sdk/types/forum_update_params.py index 2e2a97bc..259496ec 100644 --- a/src/whop_sdk/types/forum_update_params.py +++ b/src/whop_sdk/types/forum_update_params.py @@ -3,16 +3,22 @@ from __future__ import annotations from typing import Optional -from typing_extensions import TypedDict +from typing_extensions import Required, 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"] +__all__ = ["ForumUpdateParams", "BannerImage"] class ForumUpdateParams(TypedDict, total=False): + banner_image: Optional[BannerImage] + """The banner image displayed at the top of the forum page. + + Pass null to remove the existing banner. + """ + email_notification_preference: Optional[EmailNotificationPreferences] """Email notification preference option for a forum feed""" @@ -21,3 +27,13 @@ class ForumUpdateParams(TypedDict, total=False): who_can_post: Optional[WhoCanPostTypes] """Who can post on a forum feed""" + + +class BannerImage(TypedDict, total=False): + """The banner image displayed at the top of the forum page. + + Pass null to remove the existing banner. + """ + + id: Required[str] + """The ID of an existing file object.""" diff --git a/tests/api_resources/test_forums.py b/tests/api_resources/test_forums.py index eef1173c..1b1fdfea 100644 --- a/tests/api_resources/test_forums.py +++ b/tests/api_resources/test_forums.py @@ -74,6 +74,7 @@ def test_method_update(self, client: Whop) -> None: def test_method_update_with_all_params(self, client: Whop) -> None: forum = client.forums.update( id="id", + banner_image={"id": "id"}, email_notification_preference="all_admin_posts", who_can_comment="everyone", who_can_post="everyone", @@ -222,6 +223,7 @@ async def test_method_update(self, async_client: AsyncWhop) -> None: async def test_method_update_with_all_params(self, async_client: AsyncWhop) -> None: forum = await async_client.forums.update( id="id", + banner_image={"id": "id"}, email_notification_preference="all_admin_posts", who_can_comment="everyone", who_can_post="everyone", From f740d3c6d32e332ecea2ec902e9903c36055443e Mon Sep 17 00:00:00 2001 From: "stainless-app[bot]" <142633134+stainless-app[bot]@users.noreply.github.com> Date: Tue, 3 Mar 2026 00:33:49 +0000 Subject: [PATCH 09/17] chore(tests): update webhook tests --- tests/api_resources/test_webhooks.py | 42 +++++++++++++++++++++------- 1 file changed, 32 insertions(+), 10 deletions(-) diff --git a/tests/api_resources/test_webhooks.py b/tests/api_resources/test_webhooks.py index be74c103..fb41f430 100644 --- a/tests/api_resources/test_webhooks.py +++ b/tests/api_resources/test_webhooks.py @@ -257,9 +257,20 @@ def test_path_params_delete(self, client: Whop) -> None: "", ) - def test_method_unwrap(self, client: Whop) -> None: - key = b"secret" - hook = standardwebhooks.Webhook(key) + @pytest.mark.parametrize( + "client_opt,method_opt", + [ + ("whsec_c2VjcmV0Cg==", None), + ("wrong", b"secret\n"), + ("wrong", "whsec_c2VjcmV0Cg=="), + (None, b"secret\n"), + (None, "whsec_c2VjcmV0Cg=="), + ], + ) + def test_method_unwrap(self, client: Whop, client_opt: str | None, method_opt: str | bytes | None) -> None: + hook = standardwebhooks.Webhook(b"secret\n") + + client = client.with_options(webhook_key=client_opt) data = """{"id":"msg_xxxxxxxxxxxxxxxxxxxxxxxx","api_version":"v1","data":{"id":"inv_xxxxxxxxxxxxxx","created_at":"2023-12-01T05:00:00.401Z","current_plan":{"id":"plan_xxxxxxxxxxxxx","currency":"usd","formatted_price":"$10.00"},"due_date":"2023-12-01T05:00:00.401Z","email_address":"customer@example.com","fetch_invoice_token":"eyJhbGciOiJIUzI1NiJ9...","number":"#0001","status":"draft","user":{"id":"user_xxxxxxxxxxxxx","name":"John Doe","username":"johndoe42"}},"timestamp":"2025-01-01T00:00:00.000Z","type":"invoice.created","company_id":"biz_xxxxxxxxxxxxxx"}""" msg_id = "1" @@ -272,7 +283,7 @@ def test_method_unwrap(self, client: Whop) -> None: } try: - _ = client.webhooks.unwrap(data, headers=headers, key=key) + _ = client.webhooks.unwrap(data, headers=headers, key=method_opt) except standardwebhooks.WebhookVerificationError as e: raise AssertionError("Failed to unwrap valid webhook") from e @@ -283,7 +294,7 @@ def test_method_unwrap(self, client: Whop) -> None: ] for bad_header in bad_headers: with pytest.raises(standardwebhooks.WebhookVerificationError): - _ = client.webhooks.unwrap(data, headers=bad_header, key=key) + _ = client.webhooks.unwrap(data, headers=bad_header, key=method_opt) class TestAsyncWebhooks: @@ -523,9 +534,20 @@ async def test_path_params_delete(self, async_client: AsyncWhop) -> None: "", ) - def test_method_unwrap(self, client: Whop) -> None: - key = b"secret" - hook = standardwebhooks.Webhook(key) + @pytest.mark.parametrize( + "client_opt,method_opt", + [ + ("whsec_c2VjcmV0Cg==", None), + ("wrong", b"secret\n"), + ("wrong", "whsec_c2VjcmV0Cg=="), + (None, b"secret\n"), + (None, "whsec_c2VjcmV0Cg=="), + ], + ) + def test_method_unwrap(self, async_client: Whop, client_opt: str | None, method_opt: str | bytes | None) -> None: + hook = standardwebhooks.Webhook(b"secret\n") + + async_client = async_client.with_options(webhook_key=client_opt) data = """{"id":"msg_xxxxxxxxxxxxxxxxxxxxxxxx","api_version":"v1","data":{"id":"inv_xxxxxxxxxxxxxx","created_at":"2023-12-01T05:00:00.401Z","current_plan":{"id":"plan_xxxxxxxxxxxxx","currency":"usd","formatted_price":"$10.00"},"due_date":"2023-12-01T05:00:00.401Z","email_address":"customer@example.com","fetch_invoice_token":"eyJhbGciOiJIUzI1NiJ9...","number":"#0001","status":"draft","user":{"id":"user_xxxxxxxxxxxxx","name":"John Doe","username":"johndoe42"}},"timestamp":"2025-01-01T00:00:00.000Z","type":"invoice.created","company_id":"biz_xxxxxxxxxxxxxx"}""" msg_id = "1" @@ -538,7 +560,7 @@ def test_method_unwrap(self, client: Whop) -> None: } try: - _ = client.webhooks.unwrap(data, headers=headers, key=key) + _ = async_client.webhooks.unwrap(data, headers=headers, key=method_opt) except standardwebhooks.WebhookVerificationError as e: raise AssertionError("Failed to unwrap valid webhook") from e @@ -549,4 +571,4 @@ def test_method_unwrap(self, client: Whop) -> None: ] for bad_header in bad_headers: with pytest.raises(standardwebhooks.WebhookVerificationError): - _ = client.webhooks.unwrap(data, headers=bad_header, key=key) + _ = async_client.webhooks.unwrap(data, headers=bad_header, key=method_opt) From dcef4059c4ce8e9fdffa7d2aba850f325c53fb57 Mon Sep 17 00:00:00 2001 From: "stainless-app[bot]" <142633134+stainless-app[bot]@users.noreply.github.com> Date: Tue, 3 Mar 2026 20:40:00 +0000 Subject: [PATCH 10/17] feat(api): api update --- .stats.yml | 4 ++-- src/whop_sdk/resources/forum_posts.py | 10 ++++++++++ src/whop_sdk/types/forum_post_create_params.py | 6 ++++++ tests/api_resources/test_forum_posts.py | 2 ++ 4 files changed, 20 insertions(+), 2 deletions(-) diff --git a/.stats.yml b/.stats.yml index 1bf68496..d0d899de 100644 --- a/.stats.yml +++ b/.stats.yml @@ -1,4 +1,4 @@ configured_endpoints: 173 -openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/frostedinc%2Fwhopsdk-1d48c8db2db67a4190bd5565bb462f01054adce733e24b842709b0fb0887d2b2.yml -openapi_spec_hash: e8718f573e3798c9df5d3226e18599a5 +openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/frostedinc%2Fwhopsdk-53552202b2b2e53ae1a5f5f5a5d2d99a4360ee4057b596ee16fe4426cc979826.yml +openapi_spec_hash: 5a5cbdb546ef11c941a5bb2daf86dd5d config_hash: 8ac153ea57fa6460b13cded3f7c9c7a6 diff --git a/src/whop_sdk/resources/forum_posts.py b/src/whop_sdk/resources/forum_posts.py index 5707175a..589c172d 100644 --- a/src/whop_sdk/resources/forum_posts.py +++ b/src/whop_sdk/resources/forum_posts.py @@ -67,6 +67,7 @@ def create( paywall_currency: Optional[Currency] | Omit = omit, pinned: Optional[bool] | Omit = omit, poll: Optional[forum_post_create_params.Poll] | Omit = omit, + rich_content: Optional[str] | Omit = omit, title: Optional[str] | Omit = omit, visibility: Optional[ForumPostVisibilityType] | Omit = omit, # Use the following arguments if you need to pass additional parameters to the API that aren't available via kwargs. @@ -115,6 +116,9 @@ def create( poll: A poll to attach to this post, allowing members to vote on options. + rich_content: The rich content of the post in Tiptap JSON format. When provided, takes + priority over the markdown content field for rendering. + title: The title of the post, displayed prominently at the top. Required for paywalled posts as it remains visible to non-purchasers. @@ -142,6 +146,7 @@ def create( "paywall_currency": paywall_currency, "pinned": pinned, "poll": poll, + "rich_content": rich_content, "title": title, "visibility": visibility, }, @@ -363,6 +368,7 @@ async def create( paywall_currency: Optional[Currency] | Omit = omit, pinned: Optional[bool] | Omit = omit, poll: Optional[forum_post_create_params.Poll] | Omit = omit, + rich_content: Optional[str] | Omit = omit, title: Optional[str] | Omit = omit, visibility: Optional[ForumPostVisibilityType] | Omit = omit, # Use the following arguments if you need to pass additional parameters to the API that aren't available via kwargs. @@ -411,6 +417,9 @@ async def create( poll: A poll to attach to this post, allowing members to vote on options. + rich_content: The rich content of the post in Tiptap JSON format. When provided, takes + priority over the markdown content field for rendering. + title: The title of the post, displayed prominently at the top. Required for paywalled posts as it remains visible to non-purchasers. @@ -438,6 +447,7 @@ async def create( "paywall_currency": paywall_currency, "pinned": pinned, "poll": poll, + "rich_content": rich_content, "title": title, "visibility": visibility, }, diff --git a/src/whop_sdk/types/forum_post_create_params.py b/src/whop_sdk/types/forum_post_create_params.py index 217521fc..6b8281a8 100644 --- a/src/whop_sdk/types/forum_post_create_params.py +++ b/src/whop_sdk/types/forum_post_create_params.py @@ -63,6 +63,12 @@ class ForumPostCreateParams(TypedDict, total=False): poll: Optional[Poll] """A poll to attach to this post, allowing members to vote on options.""" + rich_content: Optional[str] + """The rich content of the post in Tiptap JSON format. + + When provided, takes priority over the markdown content field for rendering. + """ + title: Optional[str] """The title of the post, displayed prominently at the top. diff --git a/tests/api_resources/test_forum_posts.py b/tests/api_resources/test_forum_posts.py index ead26f5a..c02f5b99 100644 --- a/tests/api_resources/test_forum_posts.py +++ b/tests/api_resources/test_forum_posts.py @@ -50,6 +50,7 @@ def test_method_create_with_all_params(self, client: Whop) -> None: } ] }, + rich_content="rich_content", title="title", visibility="members_only", ) @@ -261,6 +262,7 @@ async def test_method_create_with_all_params(self, async_client: AsyncWhop) -> N } ] }, + rich_content="rich_content", title="title", visibility="members_only", ) From 260853e5ec3e85481b25da49ec4252b8b773e81a Mon Sep 17 00:00:00 2001 From: "stainless-app[bot]" <142633134+stainless-app[bot]@users.noreply.github.com> Date: Thu, 5 Mar 2026 20:46:18 +0000 Subject: [PATCH 11/17] feat(api): api update --- .stats.yml | 4 +- src/whop_sdk/resources/companies.py | 12 +++++- src/whop_sdk/types/company_update_params.py | 44 +++++++++++++++++++-- tests/api_resources/test_companies.py | 20 ++++++++++ 4 files changed, 74 insertions(+), 6 deletions(-) diff --git a/.stats.yml b/.stats.yml index d0d899de..e3d55aa4 100644 --- a/.stats.yml +++ b/.stats.yml @@ -1,4 +1,4 @@ configured_endpoints: 173 -openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/frostedinc%2Fwhopsdk-53552202b2b2e53ae1a5f5f5a5d2d99a4360ee4057b596ee16fe4426cc979826.yml -openapi_spec_hash: 5a5cbdb546ef11c941a5bb2daf86dd5d +openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/frostedinc%2Fwhopsdk-0974acbb7ff2efa749b4ea7e64c852307899e2c113f946d5fbae3b772cbc06f9.yml +openapi_spec_hash: cd9931517f1da016e46fa44179146477 config_hash: 8ac153ea57fa6460b13cded3f7c9c7a6 diff --git a/src/whop_sdk/resources/companies.py b/src/whop_sdk/resources/companies.py index 6c629739..ae00db09 100644 --- a/src/whop_sdk/resources/companies.py +++ b/src/whop_sdk/resources/companies.py @@ -2,7 +2,7 @@ from __future__ import annotations -from typing import Dict, Union, Optional +from typing import Dict, Union, Iterable, Optional from datetime import datetime import httpx @@ -170,6 +170,7 @@ def update( logo: Optional[company_update_params.Logo] | Omit = omit, route: Optional[str] | Omit = omit, send_customer_emails: Optional[bool] | Omit = omit, + social_links: Optional[Iterable[company_update_params.SocialLink]] | Omit = omit, target_audience: Optional[str] | Omit = omit, title: Optional[str] | Omit = omit, # Use the following arguments if you need to pass additional parameters to the API that aren't available via kwargs. @@ -202,6 +203,9 @@ def update( send_customer_emails: Whether Whop sends transactional emails (receipts, renewals, cancelations) to customers on behalf of this company. + social_links: The social media links to display on the company's store page. Pass the full + list of desired social links — any existing links not included will be removed. + target_audience: The target audience for this company (e.g., 'beginner day traders aged 18-25 looking to learn options'). @@ -226,6 +230,7 @@ def update( "logo": logo, "route": route, "send_customer_emails": send_customer_emails, + "social_links": social_links, "target_audience": target_audience, "title": title, }, @@ -461,6 +466,7 @@ async def update( logo: Optional[company_update_params.Logo] | Omit = omit, route: Optional[str] | Omit = omit, send_customer_emails: Optional[bool] | Omit = omit, + social_links: Optional[Iterable[company_update_params.SocialLink]] | Omit = omit, target_audience: Optional[str] | Omit = omit, title: Optional[str] | Omit = omit, # Use the following arguments if you need to pass additional parameters to the API that aren't available via kwargs. @@ -493,6 +499,9 @@ async def update( send_customer_emails: Whether Whop sends transactional emails (receipts, renewals, cancelations) to customers on behalf of this company. + social_links: The social media links to display on the company's store page. Pass the full + list of desired social links — any existing links not included will be removed. + target_audience: The target audience for this company (e.g., 'beginner day traders aged 18-25 looking to learn options'). @@ -517,6 +526,7 @@ async def update( "logo": logo, "route": route, "send_customer_emails": send_customer_emails, + "social_links": social_links, "target_audience": target_audience, "title": title, }, diff --git a/src/whop_sdk/types/company_update_params.py b/src/whop_sdk/types/company_update_params.py index c475d5fb..2bbe44ca 100644 --- a/src/whop_sdk/types/company_update_params.py +++ b/src/whop_sdk/types/company_update_params.py @@ -2,10 +2,10 @@ from __future__ import annotations -from typing import Optional -from typing_extensions import Required, TypedDict +from typing import Iterable, Optional +from typing_extensions import Literal, Required, TypedDict -__all__ = ["CompanyUpdateParams", "BannerImage", "Logo"] +__all__ = ["CompanyUpdateParams", "BannerImage", "Logo", "SocialLink", "SocialLinkImage"] class CompanyUpdateParams(TypedDict, total=False): @@ -34,6 +34,13 @@ class CompanyUpdateParams(TypedDict, total=False): customers on behalf of this company. """ + social_links: Optional[Iterable[SocialLink]] + """The social media links to display on the company's store page. + + Pass the full list of desired social links — any existing links not included + will be removed. + """ + target_audience: Optional[str] """ The target audience for this company (e.g., 'beginner day traders aged 18-25 @@ -56,3 +63,34 @@ class Logo(TypedDict, total=False): id: Required[str] """The ID of an existing file object.""" + + +class SocialLinkImage(TypedDict, total=False): + """The custom image for the social link""" + + id: Required[str] + """The ID of an existing file object.""" + + +class SocialLink(TypedDict, total=False): + """Input for creating a social link for a company""" + + url: Required[str] + """The URL of the social link""" + + website: Required[ + Literal["x", "instagram", "facebook", "tiktok", "youtube", "linkedin", "twitch", "website", "custom"] + ] + """The website this link is for""" + + image: Optional[SocialLinkImage] + """The custom image for the social link""" + + order: Optional[str] + """The order of the social link""" + + title: Optional[str] + """The title of the social link""" + + website_order: Optional[str] + """The order of the website social link""" diff --git a/tests/api_resources/test_companies.py b/tests/api_resources/test_companies.py index 30eb5ebd..707ad468 100644 --- a/tests/api_resources/test_companies.py +++ b/tests/api_resources/test_companies.py @@ -130,6 +130,16 @@ def test_method_update_with_all_params(self, client: Whop) -> None: logo={"id": "id"}, route="route", send_customer_emails=True, + social_links=[ + { + "url": "https://example.com/path", + "website": "x", + "image": {"id": "id"}, + "order": "123.45", + "title": "title", + "website_order": "123.45", + } + ], target_audience="target_audience", title="title", ) @@ -326,6 +336,16 @@ async def test_method_update_with_all_params(self, async_client: AsyncWhop) -> N logo={"id": "id"}, route="route", send_customer_emails=True, + social_links=[ + { + "url": "https://example.com/path", + "website": "x", + "image": {"id": "id"}, + "order": "123.45", + "title": "title", + "website_order": "123.45", + } + ], target_audience="target_audience", title="title", ) From 04a3a6d8263e34b42b476380846af4d4f31deedd Mon Sep 17 00:00:00 2001 From: "stainless-app[bot]" <142633134+stainless-app[bot]@users.noreply.github.com> Date: Sat, 7 Mar 2026 12:59:21 +0000 Subject: [PATCH 12/17] chore(ci): skip uploading artifacts on stainless-internal branches --- .github/workflows/ci.yml | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index eefc48ef..f93be0ea 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -61,14 +61,18 @@ jobs: run: rye build - name: Get GitHub OIDC Token - if: github.repository == 'stainless-sdks/whopsdk-python' + if: |- + github.repository == 'stainless-sdks/whopsdk-python' && + !startsWith(github.ref, 'refs/heads/stl/') id: github-oidc uses: actions/github-script@v8 with: script: core.setOutput('github_token', await core.getIDToken()); - name: Upload tarball - if: github.repository == 'stainless-sdks/whopsdk-python' + if: |- + github.repository == 'stainless-sdks/whopsdk-python' && + !startsWith(github.ref, 'refs/heads/stl/') env: URL: https://pkg.stainless.com/s AUTH: ${{ steps.github-oidc.outputs.github_token }} From 2ee7fe71e837e7f91ed021b58217abaf89782879 Mon Sep 17 00:00:00 2001 From: "stainless-app[bot]" <142633134+stainless-app[bot]@users.noreply.github.com> Date: Tue, 10 Mar 2026 15:33:25 +0000 Subject: [PATCH 13/17] feat(api): api update --- .stats.yml | 4 ++-- src/whop_sdk/types/payment_method_types.py | 1 + src/whop_sdk/types/payment_provider.py | 1 + 3 files changed, 4 insertions(+), 2 deletions(-) diff --git a/.stats.yml b/.stats.yml index e3d55aa4..02fd4128 100644 --- a/.stats.yml +++ b/.stats.yml @@ -1,4 +1,4 @@ configured_endpoints: 173 -openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/frostedinc%2Fwhopsdk-0974acbb7ff2efa749b4ea7e64c852307899e2c113f946d5fbae3b772cbc06f9.yml -openapi_spec_hash: cd9931517f1da016e46fa44179146477 +openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/frostedinc%2Fwhopsdk-b52309e25bc599bb5ac08a3e04557d30ae57795456b3608e5af90a1b786d0c19.yml +openapi_spec_hash: 076cd8987ef92442164e3f54780ae829 config_hash: 8ac153ea57fa6460b13cded3f7c9c7a6 diff --git a/src/whop_sdk/types/payment_method_types.py b/src/whop_sdk/types/payment_method_types.py index c61cc63f..1a74b27a 100644 --- a/src/whop_sdk/types/payment_method_types.py +++ b/src/whop_sdk/types/payment_method_types.py @@ -25,6 +25,7 @@ "cashapp", "claritypay", "coinbase", + "coinflow", "crypto", "custom", "customer_balance", diff --git a/src/whop_sdk/types/payment_provider.py b/src/whop_sdk/types/payment_provider.py index c2ba590b..748a6e2f 100644 --- a/src/whop_sdk/types/payment_provider.py +++ b/src/whop_sdk/types/payment_provider.py @@ -17,4 +17,5 @@ "claritypay", "checkout_dot_com", "airwallex", + "coinflow", ] From fe17d66f82035b4e58f474bfd136bf78114aaeab Mon Sep 17 00:00:00 2001 From: "stainless-app[bot]" <142633134+stainless-app[bot]@users.noreply.github.com> Date: Tue, 10 Mar 2026 19:38:49 +0000 Subject: [PATCH 14/17] feat(api): api update --- .stats.yml | 4 ++-- src/whop_sdk/resources/memberships.py | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/.stats.yml b/.stats.yml index 02fd4128..fa4bffe8 100644 --- a/.stats.yml +++ b/.stats.yml @@ -1,4 +1,4 @@ configured_endpoints: 173 -openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/frostedinc%2Fwhopsdk-b52309e25bc599bb5ac08a3e04557d30ae57795456b3608e5af90a1b786d0c19.yml -openapi_spec_hash: 076cd8987ef92442164e3f54780ae829 +openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/frostedinc%2Fwhopsdk-6b618bafa519cb5c352365698a6cf18809de82daa0c73a29975df7fb5ca53c9f.yml +openapi_spec_hash: 5fbcd10874d96d408004cbf2f4834a95 config_hash: 8ac153ea57fa6460b13cded3f7c9c7a6 diff --git a/src/whop_sdk/resources/memberships.py b/src/whop_sdk/resources/memberships.py index 1a1d6f7f..25b82f00 100644 --- a/src/whop_sdk/resources/memberships.py +++ b/src/whop_sdk/resources/memberships.py @@ -264,7 +264,7 @@ def cancel( Required permissions: - - `member:manage` + - `membership:cancel` - `member:email:read` - `member:basic:read` @@ -649,7 +649,7 @@ async def cancel( Required permissions: - - `member:manage` + - `membership:cancel` - `member:email:read` - `member:basic:read` From 99175a149a05f6c54b225447a163b958af8ae61c Mon Sep 17 00:00:00 2001 From: "stainless-app[bot]" <142633134+stainless-app[bot]@users.noreply.github.com> Date: Tue, 10 Mar 2026 21:13:03 +0000 Subject: [PATCH 15/17] feat(api): api update --- .stats.yml | 4 ++-- src/whop_sdk/resources/invoices.py | 28 +++++++---------------- src/whop_sdk/types/invoice_list_params.py | 8 +++---- tests/api_resources/test_invoices.py | 28 +++++++---------------- 4 files changed, 22 insertions(+), 46 deletions(-) diff --git a/.stats.yml b/.stats.yml index fa4bffe8..06f3b7ff 100644 --- a/.stats.yml +++ b/.stats.yml @@ -1,4 +1,4 @@ configured_endpoints: 173 -openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/frostedinc%2Fwhopsdk-6b618bafa519cb5c352365698a6cf18809de82daa0c73a29975df7fb5ca53c9f.yml -openapi_spec_hash: 5fbcd10874d96d408004cbf2f4834a95 +openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/frostedinc%2Fwhopsdk-f49331e3fb23d1041f941c72c6ee9924dfa47634889ed5209244207c8ea0586e.yml +openapi_spec_hash: 93d6cef1312ed0cbe6b2b6616c535ebf config_hash: 8ac153ea57fa6460b13cded3f7c9c7a6 diff --git a/src/whop_sdk/resources/invoices.py b/src/whop_sdk/resources/invoices.py index 9f7f3364..017fa401 100644 --- a/src/whop_sdk/resources/invoices.py +++ b/src/whop_sdk/resources/invoices.py @@ -83,7 +83,6 @@ def create( Required permissions: - `invoice:create` - - `plan:basic:read` Args: collection_method: How the invoice should be collected. Use charge_automatically to charge a stored @@ -157,7 +156,6 @@ def create( Required permissions: - `invoice:create` - - `plan:basic:read` Args: collection_method: How the invoice should be collected. Use charge_automatically to charge a stored @@ -231,7 +229,6 @@ def create( Required permissions: - `invoice:create` - - `plan:basic:read` Args: collection_method: How the invoice should be collected. Use charge_automatically to charge a stored @@ -304,7 +301,6 @@ def create( Required permissions: - `invoice:create` - - `plan:basic:read` Args: collection_method: How the invoice should be collected. Use charge_automatically to charge a stored @@ -424,7 +420,6 @@ def retrieve( Required permissions: - `invoice:basic:read` - - `plan:basic:read` Args: extra_headers: Send extra headers @@ -448,10 +443,10 @@ def retrieve( def list( self, *, - company_id: str, after: Optional[str] | Omit = omit, before: Optional[str] | Omit = omit, collection_methods: Optional[List[CollectionMethod]] | Omit = omit, + company_id: 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, @@ -474,17 +469,16 @@ def list( Required permissions: - `invoice:basic:read` - - `plan:basic:read` Args: - company_id: The unique identifier of the company to list invoices 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. collection_methods: Filter invoices by their collection method. + company_id: The unique identifier of the company to list invoices for. + created_after: Only return invoices created after this timestamp. created_before: Only return invoices created before this timestamp. @@ -520,10 +514,10 @@ def list( timeout=timeout, query=maybe_transform( { - "company_id": company_id, "after": after, "before": before, "collection_methods": collection_methods, + "company_id": company_id, "created_after": created_after, "created_before": created_before, "direction": direction, @@ -631,7 +625,6 @@ async def create( Required permissions: - `invoice:create` - - `plan:basic:read` Args: collection_method: How the invoice should be collected. Use charge_automatically to charge a stored @@ -705,7 +698,6 @@ async def create( Required permissions: - `invoice:create` - - `plan:basic:read` Args: collection_method: How the invoice should be collected. Use charge_automatically to charge a stored @@ -779,7 +771,6 @@ async def create( Required permissions: - `invoice:create` - - `plan:basic:read` Args: collection_method: How the invoice should be collected. Use charge_automatically to charge a stored @@ -852,7 +843,6 @@ async def create( Required permissions: - `invoice:create` - - `plan:basic:read` Args: collection_method: How the invoice should be collected. Use charge_automatically to charge a stored @@ -972,7 +962,6 @@ async def retrieve( Required permissions: - `invoice:basic:read` - - `plan:basic:read` Args: extra_headers: Send extra headers @@ -996,10 +985,10 @@ async def retrieve( def list( self, *, - company_id: str, after: Optional[str] | Omit = omit, before: Optional[str] | Omit = omit, collection_methods: Optional[List[CollectionMethod]] | Omit = omit, + company_id: 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, @@ -1022,17 +1011,16 @@ def list( Required permissions: - `invoice:basic:read` - - `plan:basic:read` Args: - company_id: The unique identifier of the company to list invoices 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. collection_methods: Filter invoices by their collection method. + company_id: The unique identifier of the company to list invoices for. + created_after: Only return invoices created after this timestamp. created_before: Only return invoices created before this timestamp. @@ -1068,10 +1056,10 @@ def list( timeout=timeout, query=maybe_transform( { - "company_id": company_id, "after": after, "before": before, "collection_methods": collection_methods, + "company_id": company_id, "created_after": created_after, "created_before": created_before, "direction": direction, diff --git a/src/whop_sdk/types/invoice_list_params.py b/src/whop_sdk/types/invoice_list_params.py index d1a4da26..2adb1912 100644 --- a/src/whop_sdk/types/invoice_list_params.py +++ b/src/whop_sdk/types/invoice_list_params.py @@ -4,7 +4,7 @@ from typing import List, Union, Optional from datetime import datetime -from typing_extensions import Literal, Required, Annotated, TypedDict +from typing_extensions import Literal, Annotated, TypedDict from .._types import SequenceNotStr from .._utils import PropertyInfo @@ -16,9 +16,6 @@ class InvoiceListParams(TypedDict, total=False): - company_id: Required[str] - """The unique identifier of the company to list invoices for.""" - after: Optional[str] """Returns the elements in the list that come after the specified cursor.""" @@ -28,6 +25,9 @@ class InvoiceListParams(TypedDict, total=False): collection_methods: Optional[List[CollectionMethod]] """Filter invoices by their collection method.""" + company_id: Optional[str] + """The unique identifier of the company to list invoices for.""" + created_after: Annotated[Union[str, datetime, None], PropertyInfo(format="iso8601")] """Only return invoices created after this timestamp.""" diff --git a/tests/api_resources/test_invoices.py b/tests/api_resources/test_invoices.py index bf41884b..8ff6287c 100644 --- a/tests/api_resources/test_invoices.py +++ b/tests/api_resources/test_invoices.py @@ -455,19 +455,17 @@ def test_path_params_retrieve(self, client: Whop) -> None: @pytest.mark.skip(reason="Mock server tests are disabled") @parametrize def test_method_list(self, client: Whop) -> None: - invoice = client.invoices.list( - company_id="biz_xxxxxxxxxxxxxx", - ) + invoice = client.invoices.list() assert_matches_type(SyncCursorPage[InvoiceListItem], invoice, path=["response"]) @pytest.mark.skip(reason="Mock server tests are disabled") @parametrize def test_method_list_with_all_params(self, client: Whop) -> None: invoice = client.invoices.list( - company_id="biz_xxxxxxxxxxxxxx", after="after", before="before", collection_methods=["send_invoice"], + company_id="biz_xxxxxxxxxxxxxx", created_after=parse_datetime("2023-12-01T05:00:00.401Z"), created_before=parse_datetime("2023-12-01T05:00:00.401Z"), direction="asc", @@ -482,9 +480,7 @@ def test_method_list_with_all_params(self, client: Whop) -> None: @pytest.mark.skip(reason="Mock server tests are disabled") @parametrize def test_raw_response_list(self, client: Whop) -> None: - response = client.invoices.with_raw_response.list( - company_id="biz_xxxxxxxxxxxxxx", - ) + response = client.invoices.with_raw_response.list() assert response.is_closed is True assert response.http_request.headers.get("X-Stainless-Lang") == "python" @@ -494,9 +490,7 @@ def test_raw_response_list(self, client: Whop) -> None: @pytest.mark.skip(reason="Mock server tests are disabled") @parametrize def test_streaming_response_list(self, client: Whop) -> None: - with client.invoices.with_streaming_response.list( - company_id="biz_xxxxxxxxxxxxxx", - ) as response: + with client.invoices.with_streaming_response.list() as response: assert not response.is_closed assert response.http_request.headers.get("X-Stainless-Lang") == "python" @@ -988,19 +982,17 @@ async def test_path_params_retrieve(self, async_client: AsyncWhop) -> None: @pytest.mark.skip(reason="Mock server tests are disabled") @parametrize async def test_method_list(self, async_client: AsyncWhop) -> None: - invoice = await async_client.invoices.list( - company_id="biz_xxxxxxxxxxxxxx", - ) + invoice = await async_client.invoices.list() assert_matches_type(AsyncCursorPage[InvoiceListItem], invoice, path=["response"]) @pytest.mark.skip(reason="Mock server tests are disabled") @parametrize async def test_method_list_with_all_params(self, async_client: AsyncWhop) -> None: invoice = await async_client.invoices.list( - company_id="biz_xxxxxxxxxxxxxx", after="after", before="before", collection_methods=["send_invoice"], + company_id="biz_xxxxxxxxxxxxxx", created_after=parse_datetime("2023-12-01T05:00:00.401Z"), created_before=parse_datetime("2023-12-01T05:00:00.401Z"), direction="asc", @@ -1015,9 +1007,7 @@ async def test_method_list_with_all_params(self, async_client: AsyncWhop) -> Non @pytest.mark.skip(reason="Mock server tests are disabled") @parametrize async def test_raw_response_list(self, async_client: AsyncWhop) -> None: - response = await async_client.invoices.with_raw_response.list( - company_id="biz_xxxxxxxxxxxxxx", - ) + response = await async_client.invoices.with_raw_response.list() assert response.is_closed is True assert response.http_request.headers.get("X-Stainless-Lang") == "python" @@ -1027,9 +1017,7 @@ async def test_raw_response_list(self, async_client: AsyncWhop) -> None: @pytest.mark.skip(reason="Mock server tests are disabled") @parametrize async def test_streaming_response_list(self, async_client: AsyncWhop) -> None: - async with async_client.invoices.with_streaming_response.list( - company_id="biz_xxxxxxxxxxxxxx", - ) as response: + async with async_client.invoices.with_streaming_response.list() as response: assert not response.is_closed assert response.http_request.headers.get("X-Stainless-Lang") == "python" From b1628865df13ae4d703571e46e738405652ad150 Mon Sep 17 00:00:00 2001 From: "stainless-app[bot]" <142633134+stainless-app[bot]@users.noreply.github.com> Date: Tue, 10 Mar 2026 21:21:17 +0000 Subject: [PATCH 16/17] feat(api): manual updates --- .stats.yml | 4 +- api.md | 13 +- src/whop_sdk/resources/authorized_users.py | 240 +++++++++++++++++- src/whop_sdk/resources/memberships.py | 105 ++++++++ src/whop_sdk/types/__init__.py | 7 + .../types/authorized_user_create_params.py | 27 ++ .../types/authorized_user_create_response.py | 55 ++++ .../types/authorized_user_delete_params.py | 16 ++ .../types/authorized_user_delete_response.py | 7 + src/whop_sdk/types/company_update_params.py | 8 +- .../types/membership_add_free_days_params.py | 16 ++ src/whop_sdk/types/payment_list_response.py | 4 +- src/whop_sdk/types/receipt_tax_behavior.py | 7 + .../types/refund_created_webhook_event.py | 3 +- .../types/refund_retrieve_response.py | 4 +- .../types/refund_updated_webhook_event.py | 3 +- src/whop_sdk/types/shared/company.py | 4 +- src/whop_sdk/types/shared/payment.py | 3 +- src/whop_sdk/types/social_link_websites.py | 9 + tests/api_resources/test_authorized_users.py | 206 +++++++++++++++ tests/api_resources/test_memberships.py | 92 +++++++ 21 files changed, 814 insertions(+), 19 deletions(-) create mode 100644 src/whop_sdk/types/authorized_user_create_params.py create mode 100644 src/whop_sdk/types/authorized_user_create_response.py create mode 100644 src/whop_sdk/types/authorized_user_delete_params.py create mode 100644 src/whop_sdk/types/authorized_user_delete_response.py create mode 100644 src/whop_sdk/types/membership_add_free_days_params.py create mode 100644 src/whop_sdk/types/receipt_tax_behavior.py create mode 100644 src/whop_sdk/types/social_link_websites.py diff --git a/.stats.yml b/.stats.yml index 06f3b7ff..cbc67135 100644 --- a/.stats.yml +++ b/.stats.yml @@ -1,4 +1,4 @@ -configured_endpoints: 173 +configured_endpoints: 176 openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/frostedinc%2Fwhopsdk-f49331e3fb23d1041f941c72c6ee9924dfa47634889ed5209244207c8ea0586e.yml openapi_spec_hash: 93d6cef1312ed0cbe6b2b6616c535ebf -config_hash: 8ac153ea57fa6460b13cded3f7c9c7a6 +config_hash: 71004ac2f2a6283ca55db1065c47e5f6 diff --git a/api.md b/api.md index 679a9af1..cb3e0091 100644 --- a/api.md +++ b/api.md @@ -121,7 +121,7 @@ Methods: Types: ```python -from whop_sdk.types import CompanyListResponse +from whop_sdk.types import SocialLinkWebsites, CompanyListResponse ``` Methods: @@ -268,6 +268,7 @@ Methods: - client.memberships.retrieve(id) -> Membership - client.memberships.update(id, \*\*params) -> Membership - client.memberships.list(\*\*params) -> SyncCursorPage[MembershipListResponse] +- client.memberships.add_free_days(id, \*\*params) -> Membership - client.memberships.cancel(id, \*\*params) -> Membership - client.memberships.pause(id, \*\*params) -> Membership - client.memberships.resume(id) -> Membership @@ -278,13 +279,20 @@ Methods: Types: ```python -from whop_sdk.types import AuthorizedUserRetrieveResponse, AuthorizedUserListResponse +from whop_sdk.types import ( + AuthorizedUserCreateResponse, + AuthorizedUserRetrieveResponse, + AuthorizedUserListResponse, + AuthorizedUserDeleteResponse, +) ``` Methods: +- client.authorized_users.create(\*\*params) -> AuthorizedUserCreateResponse - client.authorized_users.retrieve(id) -> AuthorizedUserRetrieveResponse - client.authorized_users.list(\*\*params) -> SyncCursorPage[AuthorizedUserListResponse] +- client.authorized_users.delete(id, \*\*params) -> AuthorizedUserDeleteResponse # AppBuilds @@ -382,6 +390,7 @@ from whop_sdk.types import ( BillingReasons, CardBrands, PaymentMethodTypes, + ReceiptTaxBehavior, PaymentListResponse, PaymentListFeesResponse, ) diff --git a/src/whop_sdk/resources/authorized_users.py b/src/whop_sdk/resources/authorized_users.py index 274fb769..b1f3fd19 100644 --- a/src/whop_sdk/resources/authorized_users.py +++ b/src/whop_sdk/resources/authorized_users.py @@ -7,9 +7,9 @@ import httpx -from ..types import authorized_user_list_params +from ..types import authorized_user_list_params, authorized_user_create_params, authorized_user_delete_params from .._types import Body, Omit, Query, Headers, NotGiven, omit, not_given -from .._utils import maybe_transform +from .._utils import maybe_transform, async_maybe_transform from .._compat import cached_property from .._resource import SyncAPIResource, AsyncAPIResource from .._response import ( @@ -22,6 +22,8 @@ from .._base_client import AsyncPaginator, make_request_options from ..types.shared.authorized_user_roles import AuthorizedUserRoles from ..types.authorized_user_list_response import AuthorizedUserListResponse +from ..types.authorized_user_create_response import AuthorizedUserCreateResponse +from ..types.authorized_user_delete_response import AuthorizedUserDeleteResponse from ..types.authorized_user_retrieve_response import AuthorizedUserRetrieveResponse __all__ = ["AuthorizedUsersResource", "AsyncAuthorizedUsersResource"] @@ -49,6 +51,64 @@ def with_streaming_response(self) -> AuthorizedUsersResourceWithStreamingRespons """ return AuthorizedUsersResourceWithStreamingResponse(self) + def create( + self, + *, + company_id: str, + role: AuthorizedUserRoles, + user_id: str, + send_emails: Optional[bool] | Omit = omit, + # Use the following arguments if you need to pass additional parameters to the API that aren't available via kwargs. + # The extra values given here take precedence over values defined on the client or passed to this method. + extra_headers: Headers | None = None, + extra_query: Query | None = None, + extra_body: Body | None = None, + timeout: float | httpx.Timeout | None | NotGiven = not_given, + ) -> AuthorizedUserCreateResponse: + """ + Add a new authorized user to a company. + + Required permissions: + + - `authorized_user:create` + - `member:email:read` + + Args: + company_id: The ID of the company to add the authorized user to. + + role: + The role to assign to the authorized user within the company. Supported roles: + 'moderator', 'sales_manager'. + + user_id: The ID of the user to add as an authorized user. + + send_emails: Whether to send notification emails to the user on creation. + + 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._post( + "/authorized_users", + body=maybe_transform( + { + "company_id": company_id, + "role": role, + "user_id": user_id, + "send_emails": send_emails, + }, + authorized_user_create_params.AuthorizedUserCreateParams, + ), + options=make_request_options( + extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout + ), + cast_to=AuthorizedUserCreateResponse, + ) + def retrieve( self, id: str, @@ -169,6 +229,53 @@ def list( model=AuthorizedUserListResponse, ) + def delete( + self, + id: str, + *, + company_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, + ) -> AuthorizedUserDeleteResponse: + """ + Remove an authorized user from a company. + + Required permissions: + + - `authorized_user:delete` + + Args: + company_id: The ID of the company the authorized user belongs to. Optional if the authorized + user ID is provided. + + 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._delete( + f"/authorized_users/{id}", + 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}, authorized_user_delete_params.AuthorizedUserDeleteParams + ), + ), + cast_to=AuthorizedUserDeleteResponse, + ) + class AsyncAuthorizedUsersResource(AsyncAPIResource): """Authorized users""" @@ -192,6 +299,64 @@ def with_streaming_response(self) -> AsyncAuthorizedUsersResourceWithStreamingRe """ return AsyncAuthorizedUsersResourceWithStreamingResponse(self) + async def create( + self, + *, + company_id: str, + role: AuthorizedUserRoles, + user_id: str, + send_emails: Optional[bool] | Omit = omit, + # Use the following arguments if you need to pass additional parameters to the API that aren't available via kwargs. + # The extra values given here take precedence over values defined on the client or passed to this method. + extra_headers: Headers | None = None, + extra_query: Query | None = None, + extra_body: Body | None = None, + timeout: float | httpx.Timeout | None | NotGiven = not_given, + ) -> AuthorizedUserCreateResponse: + """ + Add a new authorized user to a company. + + Required permissions: + + - `authorized_user:create` + - `member:email:read` + + Args: + company_id: The ID of the company to add the authorized user to. + + role: + The role to assign to the authorized user within the company. Supported roles: + 'moderator', 'sales_manager'. + + user_id: The ID of the user to add as an authorized user. + + send_emails: Whether to send notification emails to the user on creation. + + extra_headers: Send extra headers + + extra_query: Add additional query parameters to the request + + extra_body: Add additional JSON properties to the request + + timeout: Override the client-level default timeout for this request, in seconds + """ + return await self._post( + "/authorized_users", + body=await async_maybe_transform( + { + "company_id": company_id, + "role": role, + "user_id": user_id, + "send_emails": send_emails, + }, + authorized_user_create_params.AuthorizedUserCreateParams, + ), + options=make_request_options( + extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout + ), + cast_to=AuthorizedUserCreateResponse, + ) + async def retrieve( self, id: str, @@ -312,50 +477,121 @@ def list( model=AuthorizedUserListResponse, ) + async def delete( + self, + id: str, + *, + company_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, + ) -> AuthorizedUserDeleteResponse: + """ + Remove an authorized user from a company. + + Required permissions: + + - `authorized_user:delete` + + Args: + company_id: The ID of the company the authorized user belongs to. Optional if the authorized + user ID is provided. + + 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._delete( + f"/authorized_users/{id}", + options=make_request_options( + extra_headers=extra_headers, + extra_query=extra_query, + extra_body=extra_body, + timeout=timeout, + query=await async_maybe_transform( + {"company_id": company_id}, authorized_user_delete_params.AuthorizedUserDeleteParams + ), + ), + cast_to=AuthorizedUserDeleteResponse, + ) + class AuthorizedUsersResourceWithRawResponse: def __init__(self, authorized_users: AuthorizedUsersResource) -> None: self._authorized_users = authorized_users + self.create = to_raw_response_wrapper( + authorized_users.create, + ) self.retrieve = to_raw_response_wrapper( authorized_users.retrieve, ) self.list = to_raw_response_wrapper( authorized_users.list, ) + self.delete = to_raw_response_wrapper( + authorized_users.delete, + ) class AsyncAuthorizedUsersResourceWithRawResponse: def __init__(self, authorized_users: AsyncAuthorizedUsersResource) -> None: self._authorized_users = authorized_users + self.create = async_to_raw_response_wrapper( + authorized_users.create, + ) self.retrieve = async_to_raw_response_wrapper( authorized_users.retrieve, ) self.list = async_to_raw_response_wrapper( authorized_users.list, ) + self.delete = async_to_raw_response_wrapper( + authorized_users.delete, + ) class AuthorizedUsersResourceWithStreamingResponse: def __init__(self, authorized_users: AuthorizedUsersResource) -> None: self._authorized_users = authorized_users + self.create = to_streamed_response_wrapper( + authorized_users.create, + ) self.retrieve = to_streamed_response_wrapper( authorized_users.retrieve, ) self.list = to_streamed_response_wrapper( authorized_users.list, ) + self.delete = to_streamed_response_wrapper( + authorized_users.delete, + ) class AsyncAuthorizedUsersResourceWithStreamingResponse: def __init__(self, authorized_users: AsyncAuthorizedUsersResource) -> None: self._authorized_users = authorized_users + self.create = async_to_streamed_response_wrapper( + authorized_users.create, + ) self.retrieve = async_to_streamed_response_wrapper( authorized_users.retrieve, ) self.list = async_to_streamed_response_wrapper( authorized_users.list, ) + self.delete = async_to_streamed_response_wrapper( + authorized_users.delete, + ) diff --git a/src/whop_sdk/resources/memberships.py b/src/whop_sdk/resources/memberships.py index 25b82f00..bf123a17 100644 --- a/src/whop_sdk/resources/memberships.py +++ b/src/whop_sdk/resources/memberships.py @@ -13,6 +13,7 @@ membership_pause_params, membership_cancel_params, membership_update_params, + membership_add_free_days_params, ) from .._types import Body, Omit, Query, Headers, NotGiven, SequenceNotStr, omit, not_given from .._utils import maybe_transform, async_maybe_transform @@ -246,6 +247,51 @@ def list( model=MembershipListResponse, ) + def add_free_days( + self, + id: str, + *, + free_days: int, + # 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, + ) -> Membership: + """ + Add free days to extend a membership's current billing period, expiration date, + or Stripe trial. + + Required permissions: + + - `member:manage` + - `member:email:read` + - `member:basic:read` + + Args: + free_days: The number of free days to add (1-1095). Extends the billing period, expiration + date, or Stripe trial depending on plan type. + + 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._post( + f"/memberships/{id}/add_free_days", + body=maybe_transform({"free_days": free_days}, membership_add_free_days_params.MembershipAddFreeDaysParams), + options=make_request_options( + extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout + ), + cast_to=Membership, + ) + def cancel( self, id: str, @@ -631,6 +677,53 @@ def list( model=MembershipListResponse, ) + async def add_free_days( + self, + id: str, + *, + free_days: int, + # 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, + ) -> Membership: + """ + Add free days to extend a membership's current billing period, expiration date, + or Stripe trial. + + Required permissions: + + - `member:manage` + - `member:email:read` + - `member:basic:read` + + Args: + free_days: The number of free days to add (1-1095). Extends the billing period, expiration + date, or Stripe trial depending on plan type. + + 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._post( + f"/memberships/{id}/add_free_days", + body=await async_maybe_transform( + {"free_days": free_days}, membership_add_free_days_params.MembershipAddFreeDaysParams + ), + options=make_request_options( + extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout + ), + cast_to=Membership, + ) + async def cancel( self, id: str, @@ -820,6 +913,9 @@ def __init__(self, memberships: MembershipsResource) -> None: self.list = to_raw_response_wrapper( memberships.list, ) + self.add_free_days = to_raw_response_wrapper( + memberships.add_free_days, + ) self.cancel = to_raw_response_wrapper( memberships.cancel, ) @@ -847,6 +943,9 @@ def __init__(self, memberships: AsyncMembershipsResource) -> None: self.list = async_to_raw_response_wrapper( memberships.list, ) + self.add_free_days = async_to_raw_response_wrapper( + memberships.add_free_days, + ) self.cancel = async_to_raw_response_wrapper( memberships.cancel, ) @@ -874,6 +973,9 @@ def __init__(self, memberships: MembershipsResource) -> None: self.list = to_streamed_response_wrapper( memberships.list, ) + self.add_free_days = to_streamed_response_wrapper( + memberships.add_free_days, + ) self.cancel = to_streamed_response_wrapper( memberships.cancel, ) @@ -901,6 +1003,9 @@ def __init__(self, memberships: AsyncMembershipsResource) -> None: self.list = async_to_streamed_response_wrapper( memberships.list, ) + self.add_free_days = async_to_streamed_response_wrapper( + memberships.add_free_days, + ) self.cancel = async_to_streamed_response_wrapper( memberships.cancel, ) diff --git a/src/whop_sdk/types/__init__.py b/src/whop_sdk/types/__init__.py index 6d305f1a..c2af8893 100644 --- a/src/whop_sdk/types/__init__.py +++ b/src/whop_sdk/types/__init__.py @@ -139,9 +139,11 @@ from .payment_method_types import PaymentMethodTypes as PaymentMethodTypes from .plan_delete_response import PlanDeleteResponse as PlanDeleteResponse from .reaction_list_params import ReactionListParams as ReactionListParams +from .receipt_tax_behavior import ReceiptTaxBehavior as ReceiptTaxBehavior from .refund_list_response import RefundListResponse as RefundListResponse from .review_list_response import ReviewListResponse as ReviewListResponse from .shipment_list_params import ShipmentListParams as ShipmentListParams +from .social_link_websites import SocialLinkWebsites as SocialLinkWebsites from .transfer_list_params import TransferListParams as TransferListParams from .unwrap_webhook_event import UnwrapWebhookEvent as UnwrapWebhookEvent from .withdrawal_fee_types import WithdrawalFeeTypes as WithdrawalFeeTypes @@ -278,6 +280,8 @@ from .payment_method_list_response import PaymentMethodListResponse as PaymentMethodListResponse from .refund_created_webhook_event import RefundCreatedWebhookEvent as RefundCreatedWebhookEvent from .refund_updated_webhook_event import RefundUpdatedWebhookEvent as RefundUpdatedWebhookEvent +from .authorized_user_create_params import AuthorizedUserCreateParams as AuthorizedUserCreateParams +from .authorized_user_delete_params import AuthorizedUserDeleteParams as AuthorizedUserDeleteParams from .authorized_user_list_response import AuthorizedUserListResponse as AuthorizedUserListResponse from .course_lesson_delete_response import CourseLessonDeleteResponse as CourseLessonDeleteResponse from .dispute_created_webhook_event import DisputeCreatedWebhookEvent as DisputeCreatedWebhookEvent @@ -293,7 +297,10 @@ from .invoice_past_due_webhook_event import InvoicePastDueWebhookEvent as InvoicePastDueWebhookEvent from .payment_method_retrieve_params import PaymentMethodRetrieveParams as PaymentMethodRetrieveParams from .verification_retrieve_response import VerificationRetrieveResponse as VerificationRetrieveResponse +from .authorized_user_create_response import AuthorizedUserCreateResponse as AuthorizedUserCreateResponse +from .authorized_user_delete_response import AuthorizedUserDeleteResponse as AuthorizedUserDeleteResponse from .dispute_alert_retrieve_response import DisputeAlertRetrieveResponse as DisputeAlertRetrieveResponse +from .membership_add_free_days_params import MembershipAddFreeDaysParams as MembershipAddFreeDaysParams from .payment_succeeded_webhook_event import PaymentSucceededWebhookEvent as PaymentSucceededWebhookEvent from .payout_method_retrieve_response import PayoutMethodRetrieveResponse as PayoutMethodRetrieveResponse from .course_student_retrieve_response import CourseStudentRetrieveResponse as CourseStudentRetrieveResponse diff --git a/src/whop_sdk/types/authorized_user_create_params.py b/src/whop_sdk/types/authorized_user_create_params.py new file mode 100644 index 00000000..b2b538a5 --- /dev/null +++ b/src/whop_sdk/types/authorized_user_create_params.py @@ -0,0 +1,27 @@ +# 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 + +from .shared.authorized_user_roles import AuthorizedUserRoles + +__all__ = ["AuthorizedUserCreateParams"] + + +class AuthorizedUserCreateParams(TypedDict, total=False): + company_id: Required[str] + """The ID of the company to add the authorized user to.""" + + role: Required[AuthorizedUserRoles] + """The role to assign to the authorized user within the company. + + Supported roles: 'moderator', 'sales_manager'. + """ + + user_id: Required[str] + """The ID of the user to add as an authorized user.""" + + send_emails: Optional[bool] + """Whether to send notification emails to the user on creation.""" diff --git a/src/whop_sdk/types/authorized_user_create_response.py b/src/whop_sdk/types/authorized_user_create_response.py new file mode 100644 index 00000000..1bf69abd --- /dev/null +++ b/src/whop_sdk/types/authorized_user_create_response.py @@ -0,0 +1,55 @@ +# File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details. + +from typing import Optional + +from .._models import BaseModel +from .shared.authorized_user_roles import AuthorizedUserRoles + +__all__ = ["AuthorizedUserCreateResponse", "Company", "User"] + + +class Company(BaseModel): + """The company this authorized user has access to.""" + + id: str + """The unique identifier for the company.""" + + title: str + """The display name of the company shown to customers.""" + + +class User(BaseModel): + """The user account linked to this authorized user record.""" + + id: str + """The unique identifier for the user.""" + + email: Optional[str] = None + """The user's email address. + + Requires the member:email:read permission to access. Null if not authorized. + """ + + name: Optional[str] = None + """The user's display name shown on their public profile.""" + + username: str + """The user's unique username shown on their public profile.""" + + +class AuthorizedUserCreateResponse(BaseModel): + """ + A user who has been granted administrative access to manage a company's dashboard and settings. + """ + + id: str + """The unique identifier for the authorized user.""" + + company: Company + """The company this authorized user has access to.""" + + role: AuthorizedUserRoles + """The permission role assigned to this authorized user within the company.""" + + user: User + """The user account linked to this authorized user record.""" diff --git a/src/whop_sdk/types/authorized_user_delete_params.py b/src/whop_sdk/types/authorized_user_delete_params.py new file mode 100644 index 00000000..ead84a1b --- /dev/null +++ b/src/whop_sdk/types/authorized_user_delete_params.py @@ -0,0 +1,16 @@ +# 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 + +__all__ = ["AuthorizedUserDeleteParams"] + + +class AuthorizedUserDeleteParams(TypedDict, total=False): + company_id: Optional[str] + """The ID of the company the authorized user belongs to. + + Optional if the authorized user ID is provided. + """ diff --git a/src/whop_sdk/types/authorized_user_delete_response.py b/src/whop_sdk/types/authorized_user_delete_response.py new file mode 100644 index 00000000..b71b66f0 --- /dev/null +++ b/src/whop_sdk/types/authorized_user_delete_response.py @@ -0,0 +1,7 @@ +# File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details. + +from typing_extensions import TypeAlias + +__all__ = ["AuthorizedUserDeleteResponse"] + +AuthorizedUserDeleteResponse: TypeAlias = bool diff --git a/src/whop_sdk/types/company_update_params.py b/src/whop_sdk/types/company_update_params.py index 2bbe44ca..089fdafe 100644 --- a/src/whop_sdk/types/company_update_params.py +++ b/src/whop_sdk/types/company_update_params.py @@ -3,7 +3,9 @@ from __future__ import annotations from typing import Iterable, Optional -from typing_extensions import Literal, Required, TypedDict +from typing_extensions import Required, TypedDict + +from .social_link_websites import SocialLinkWebsites __all__ = ["CompanyUpdateParams", "BannerImage", "Logo", "SocialLink", "SocialLinkImage"] @@ -78,9 +80,7 @@ class SocialLink(TypedDict, total=False): url: Required[str] """The URL of the social link""" - website: Required[ - Literal["x", "instagram", "facebook", "tiktok", "youtube", "linkedin", "twitch", "website", "custom"] - ] + website: Required[SocialLinkWebsites] """The website this link is for""" image: Optional[SocialLinkImage] diff --git a/src/whop_sdk/types/membership_add_free_days_params.py b/src/whop_sdk/types/membership_add_free_days_params.py new file mode 100644 index 00000000..568b654b --- /dev/null +++ b/src/whop_sdk/types/membership_add_free_days_params.py @@ -0,0 +1,16 @@ +# File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details. + +from __future__ import annotations + +from typing_extensions import Required, TypedDict + +__all__ = ["MembershipAddFreeDaysParams"] + + +class MembershipAddFreeDaysParams(TypedDict, total=False): + free_days: Required[int] + """The number of free days to add (1-1095). + + Extends the billing period, expiration date, or Stripe trial depending on plan + type. + """ diff --git a/src/whop_sdk/types/payment_list_response.py b/src/whop_sdk/types/payment_list_response.py index 5a27366a..6ba171dd 100644 --- a/src/whop_sdk/types/payment_list_response.py +++ b/src/whop_sdk/types/payment_list_response.py @@ -2,7 +2,6 @@ from typing import Dict, Optional from datetime import datetime -from typing_extensions import Literal from .._models import BaseModel from .card_brands import CardBrands @@ -10,6 +9,7 @@ from .shared.currency import Currency from .shared.promo_type import PromoType from .payment_method_types import PaymentMethodTypes +from .receipt_tax_behavior import ReceiptTaxBehavior from .shared.receipt_status import ReceiptStatus from .shared.membership_status import MembershipStatus from .shared.friendly_receipt_status import FriendlyReceiptStatus @@ -349,7 +349,7 @@ class PaymentListResponse(BaseModel): tax_amount: Optional[float] = None """The calculated amount of the sales/VAT tax (if applicable).""" - tax_behavior: Optional[Literal["exclusive", "inclusive", "unspecified", "unable_to_collect"]] = None + tax_behavior: Optional[ReceiptTaxBehavior] = None """ The type of tax inclusivity applied to the receipt, for determining whether the tax is included in the final price, or paid on top. diff --git a/src/whop_sdk/types/receipt_tax_behavior.py b/src/whop_sdk/types/receipt_tax_behavior.py new file mode 100644 index 00000000..3d0ea68a --- /dev/null +++ b/src/whop_sdk/types/receipt_tax_behavior.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__ = ["ReceiptTaxBehavior"] + +ReceiptTaxBehavior: TypeAlias = Literal["exclusive", "inclusive", "unspecified", "unable_to_collect"] diff --git a/src/whop_sdk/types/refund_created_webhook_event.py b/src/whop_sdk/types/refund_created_webhook_event.py index b0e2b0fe..3d2d9655 100644 --- a/src/whop_sdk/types/refund_created_webhook_event.py +++ b/src/whop_sdk/types/refund_created_webhook_event.py @@ -11,6 +11,7 @@ from .shared.currency import Currency from .payment_provider import PaymentProvider from .payment_method_types import PaymentMethodTypes +from .receipt_tax_behavior import ReceiptTaxBehavior from .refund_reference_type import RefundReferenceType from .refund_reference_status import RefundReferenceStatus from .shared.membership_status import MembershipStatus @@ -115,7 +116,7 @@ class DataPayment(BaseModel): tax_amount: Optional[float] = None """The calculated amount of the sales/VAT tax (if applicable).""" - tax_behavior: Optional[Literal["exclusive", "inclusive", "unspecified", "unable_to_collect"]] = None + tax_behavior: Optional[ReceiptTaxBehavior] = None """ The type of tax inclusivity applied to the receipt, for determining whether the tax is included in the final price, or paid on top. diff --git a/src/whop_sdk/types/refund_retrieve_response.py b/src/whop_sdk/types/refund_retrieve_response.py index 2ddf3196..57fc6384 100644 --- a/src/whop_sdk/types/refund_retrieve_response.py +++ b/src/whop_sdk/types/refund_retrieve_response.py @@ -2,7 +2,6 @@ from typing import Optional from datetime import datetime -from typing_extensions import Literal from .._models import BaseModel from .card_brands import CardBrands @@ -11,6 +10,7 @@ from .shared.currency import Currency from .payment_provider import PaymentProvider from .payment_method_types import PaymentMethodTypes +from .receipt_tax_behavior import ReceiptTaxBehavior from .refund_reference_type import RefundReferenceType from .refund_reference_status import RefundReferenceStatus from .shared.membership_status import MembershipStatus @@ -108,7 +108,7 @@ class Payment(BaseModel): tax_amount: Optional[float] = None """The calculated amount of the sales/VAT tax (if applicable).""" - tax_behavior: Optional[Literal["exclusive", "inclusive", "unspecified", "unable_to_collect"]] = None + tax_behavior: Optional[ReceiptTaxBehavior] = None """ The type of tax inclusivity applied to the receipt, for determining whether the tax is included in the final price, or paid on top. diff --git a/src/whop_sdk/types/refund_updated_webhook_event.py b/src/whop_sdk/types/refund_updated_webhook_event.py index 7b8c8944..c5000b31 100644 --- a/src/whop_sdk/types/refund_updated_webhook_event.py +++ b/src/whop_sdk/types/refund_updated_webhook_event.py @@ -11,6 +11,7 @@ from .shared.currency import Currency from .payment_provider import PaymentProvider from .payment_method_types import PaymentMethodTypes +from .receipt_tax_behavior import ReceiptTaxBehavior from .refund_reference_type import RefundReferenceType from .refund_reference_status import RefundReferenceStatus from .shared.membership_status import MembershipStatus @@ -115,7 +116,7 @@ class DataPayment(BaseModel): tax_amount: Optional[float] = None """The calculated amount of the sales/VAT tax (if applicable).""" - tax_behavior: Optional[Literal["exclusive", "inclusive", "unspecified", "unable_to_collect"]] = None + tax_behavior: Optional[ReceiptTaxBehavior] = None """ The type of tax inclusivity applied to the receipt, for determining whether the tax is included in the final price, or paid on top. diff --git a/src/whop_sdk/types/shared/company.py b/src/whop_sdk/types/shared/company.py index e30b8c1d..6f4bf53e 100644 --- a/src/whop_sdk/types/shared/company.py +++ b/src/whop_sdk/types/shared/company.py @@ -2,9 +2,9 @@ from typing import Dict, List, Optional from datetime import datetime -from typing_extensions import Literal from ..._models import BaseModel +from ..social_link_websites import SocialLinkWebsites __all__ = ["Company", "Logo", "OwnerUser", "SocialLink"] @@ -41,7 +41,7 @@ class SocialLink(BaseModel): url: str """The URL of the social media profile or external link.""" - website: Literal["x", "instagram", "facebook", "tiktok", "youtube", "linkedin", "twitch", "website", "custom"] + website: SocialLinkWebsites """The website""" diff --git a/src/whop_sdk/types/shared/payment.py b/src/whop_sdk/types/shared/payment.py index e3034c7b..6993b54d 100644 --- a/src/whop_sdk/types/shared/payment.py +++ b/src/whop_sdk/types/shared/payment.py @@ -13,6 +13,7 @@ from ..dispute_statuses import DisputeStatuses from .membership_status import MembershipStatus from ..payment_method_types import PaymentMethodTypes +from ..receipt_tax_behavior import ReceiptTaxBehavior from .friendly_receipt_status import FriendlyReceiptStatus __all__ = [ @@ -512,7 +513,7 @@ class Payment(BaseModel): tax_amount: Optional[float] = None """The calculated amount of the sales/VAT tax (if applicable).""" - tax_behavior: Optional[Literal["exclusive", "inclusive", "unspecified", "unable_to_collect"]] = None + tax_behavior: Optional[ReceiptTaxBehavior] = None """ The type of tax inclusivity applied to the receipt, for determining whether the tax is included in the final price, or paid on top. diff --git a/src/whop_sdk/types/social_link_websites.py b/src/whop_sdk/types/social_link_websites.py new file mode 100644 index 00000000..7e96a15d --- /dev/null +++ b/src/whop_sdk/types/social_link_websites.py @@ -0,0 +1,9 @@ +# File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details. + +from typing_extensions import Literal, TypeAlias + +__all__ = ["SocialLinkWebsites"] + +SocialLinkWebsites: TypeAlias = Literal[ + "x", "instagram", "facebook", "tiktok", "youtube", "linkedin", "twitch", "website", "custom" +] diff --git a/tests/api_resources/test_authorized_users.py b/tests/api_resources/test_authorized_users.py index a0e6a63f..945730cd 100644 --- a/tests/api_resources/test_authorized_users.py +++ b/tests/api_resources/test_authorized_users.py @@ -11,6 +11,8 @@ from tests.utils import assert_matches_type from whop_sdk.types import ( AuthorizedUserListResponse, + AuthorizedUserCreateResponse, + AuthorizedUserDeleteResponse, AuthorizedUserRetrieveResponse, ) from whop_sdk._utils import parse_datetime @@ -22,6 +24,57 @@ class TestAuthorizedUsers: parametrize = pytest.mark.parametrize("client", [False, True], indirect=True, ids=["loose", "strict"]) + @pytest.mark.skip(reason="Mock server tests are disabled") + @parametrize + def test_method_create(self, client: Whop) -> None: + authorized_user = client.authorized_users.create( + company_id="biz_xxxxxxxxxxxxxx", + role="owner", + user_id="user_xxxxxxxxxxxxx", + ) + assert_matches_type(AuthorizedUserCreateResponse, authorized_user, path=["response"]) + + @pytest.mark.skip(reason="Mock server tests are disabled") + @parametrize + def test_method_create_with_all_params(self, client: Whop) -> None: + authorized_user = client.authorized_users.create( + company_id="biz_xxxxxxxxxxxxxx", + role="owner", + user_id="user_xxxxxxxxxxxxx", + send_emails=True, + ) + assert_matches_type(AuthorizedUserCreateResponse, authorized_user, path=["response"]) + + @pytest.mark.skip(reason="Mock server tests are disabled") + @parametrize + def test_raw_response_create(self, client: Whop) -> None: + response = client.authorized_users.with_raw_response.create( + company_id="biz_xxxxxxxxxxxxxx", + role="owner", + user_id="user_xxxxxxxxxxxxx", + ) + + assert response.is_closed is True + assert response.http_request.headers.get("X-Stainless-Lang") == "python" + authorized_user = response.parse() + assert_matches_type(AuthorizedUserCreateResponse, authorized_user, path=["response"]) + + @pytest.mark.skip(reason="Mock server tests are disabled") + @parametrize + def test_streaming_response_create(self, client: Whop) -> None: + with client.authorized_users.with_streaming_response.create( + company_id="biz_xxxxxxxxxxxxxx", + role="owner", + user_id="user_xxxxxxxxxxxxx", + ) as response: + assert not response.is_closed + assert response.http_request.headers.get("X-Stainless-Lang") == "python" + + authorized_user = response.parse() + assert_matches_type(AuthorizedUserCreateResponse, authorized_user, path=["response"]) + + assert cast(Any, response.is_closed) is True + @pytest.mark.skip(reason="Mock server tests are disabled") @parametrize def test_method_retrieve(self, client: Whop) -> None: @@ -108,12 +161,114 @@ def test_streaming_response_list(self, client: Whop) -> None: assert cast(Any, response.is_closed) is True + @pytest.mark.skip(reason="Mock server tests are disabled") + @parametrize + def test_method_delete(self, client: Whop) -> None: + authorized_user = client.authorized_users.delete( + id="ausr_xxxxxxxxxxxxx", + ) + assert_matches_type(AuthorizedUserDeleteResponse, authorized_user, path=["response"]) + + @pytest.mark.skip(reason="Mock server tests are disabled") + @parametrize + def test_method_delete_with_all_params(self, client: Whop) -> None: + authorized_user = client.authorized_users.delete( + id="ausr_xxxxxxxxxxxxx", + company_id="biz_xxxxxxxxxxxxxx", + ) + assert_matches_type(AuthorizedUserDeleteResponse, authorized_user, path=["response"]) + + @pytest.mark.skip(reason="Mock server tests are disabled") + @parametrize + def test_raw_response_delete(self, client: Whop) -> None: + response = client.authorized_users.with_raw_response.delete( + id="ausr_xxxxxxxxxxxxx", + ) + + assert response.is_closed is True + assert response.http_request.headers.get("X-Stainless-Lang") == "python" + authorized_user = response.parse() + assert_matches_type(AuthorizedUserDeleteResponse, authorized_user, path=["response"]) + + @pytest.mark.skip(reason="Mock server tests are disabled") + @parametrize + def test_streaming_response_delete(self, client: Whop) -> None: + with client.authorized_users.with_streaming_response.delete( + id="ausr_xxxxxxxxxxxxx", + ) as response: + assert not response.is_closed + assert response.http_request.headers.get("X-Stainless-Lang") == "python" + + authorized_user = response.parse() + assert_matches_type(AuthorizedUserDeleteResponse, authorized_user, path=["response"]) + + assert cast(Any, response.is_closed) is True + + @pytest.mark.skip(reason="Mock server tests are disabled") + @parametrize + def test_path_params_delete(self, client: Whop) -> None: + with pytest.raises(ValueError, match=r"Expected a non-empty value for `id` but received ''"): + client.authorized_users.with_raw_response.delete( + id="", + ) + class TestAsyncAuthorizedUsers: parametrize = pytest.mark.parametrize( "async_client", [False, True, {"http_client": "aiohttp"}], indirect=True, ids=["loose", "strict", "aiohttp"] ) + @pytest.mark.skip(reason="Mock server tests are disabled") + @parametrize + async def test_method_create(self, async_client: AsyncWhop) -> None: + authorized_user = await async_client.authorized_users.create( + company_id="biz_xxxxxxxxxxxxxx", + role="owner", + user_id="user_xxxxxxxxxxxxx", + ) + assert_matches_type(AuthorizedUserCreateResponse, authorized_user, path=["response"]) + + @pytest.mark.skip(reason="Mock server tests are disabled") + @parametrize + async def test_method_create_with_all_params(self, async_client: AsyncWhop) -> None: + authorized_user = await async_client.authorized_users.create( + company_id="biz_xxxxxxxxxxxxxx", + role="owner", + user_id="user_xxxxxxxxxxxxx", + send_emails=True, + ) + assert_matches_type(AuthorizedUserCreateResponse, authorized_user, path=["response"]) + + @pytest.mark.skip(reason="Mock server tests are disabled") + @parametrize + async def test_raw_response_create(self, async_client: AsyncWhop) -> None: + response = await async_client.authorized_users.with_raw_response.create( + company_id="biz_xxxxxxxxxxxxxx", + role="owner", + user_id="user_xxxxxxxxxxxxx", + ) + + assert response.is_closed is True + assert response.http_request.headers.get("X-Stainless-Lang") == "python" + authorized_user = await response.parse() + assert_matches_type(AuthorizedUserCreateResponse, authorized_user, path=["response"]) + + @pytest.mark.skip(reason="Mock server tests are disabled") + @parametrize + async def test_streaming_response_create(self, async_client: AsyncWhop) -> None: + async with async_client.authorized_users.with_streaming_response.create( + company_id="biz_xxxxxxxxxxxxxx", + role="owner", + user_id="user_xxxxxxxxxxxxx", + ) as response: + assert not response.is_closed + assert response.http_request.headers.get("X-Stainless-Lang") == "python" + + authorized_user = await response.parse() + assert_matches_type(AuthorizedUserCreateResponse, authorized_user, path=["response"]) + + assert cast(Any, response.is_closed) is True + @pytest.mark.skip(reason="Mock server tests are disabled") @parametrize async def test_method_retrieve(self, async_client: AsyncWhop) -> None: @@ -199,3 +354,54 @@ async def test_streaming_response_list(self, async_client: AsyncWhop) -> None: assert_matches_type(AsyncCursorPage[AuthorizedUserListResponse], authorized_user, path=["response"]) assert cast(Any, response.is_closed) is True + + @pytest.mark.skip(reason="Mock server tests are disabled") + @parametrize + async def test_method_delete(self, async_client: AsyncWhop) -> None: + authorized_user = await async_client.authorized_users.delete( + id="ausr_xxxxxxxxxxxxx", + ) + assert_matches_type(AuthorizedUserDeleteResponse, authorized_user, path=["response"]) + + @pytest.mark.skip(reason="Mock server tests are disabled") + @parametrize + async def test_method_delete_with_all_params(self, async_client: AsyncWhop) -> None: + authorized_user = await async_client.authorized_users.delete( + id="ausr_xxxxxxxxxxxxx", + company_id="biz_xxxxxxxxxxxxxx", + ) + assert_matches_type(AuthorizedUserDeleteResponse, authorized_user, path=["response"]) + + @pytest.mark.skip(reason="Mock server tests are disabled") + @parametrize + async def test_raw_response_delete(self, async_client: AsyncWhop) -> None: + response = await async_client.authorized_users.with_raw_response.delete( + id="ausr_xxxxxxxxxxxxx", + ) + + assert response.is_closed is True + assert response.http_request.headers.get("X-Stainless-Lang") == "python" + authorized_user = await response.parse() + assert_matches_type(AuthorizedUserDeleteResponse, authorized_user, path=["response"]) + + @pytest.mark.skip(reason="Mock server tests are disabled") + @parametrize + async def test_streaming_response_delete(self, async_client: AsyncWhop) -> None: + async with async_client.authorized_users.with_streaming_response.delete( + id="ausr_xxxxxxxxxxxxx", + ) as response: + assert not response.is_closed + assert response.http_request.headers.get("X-Stainless-Lang") == "python" + + authorized_user = await response.parse() + assert_matches_type(AuthorizedUserDeleteResponse, authorized_user, path=["response"]) + + assert cast(Any, response.is_closed) is True + + @pytest.mark.skip(reason="Mock server tests are disabled") + @parametrize + async def test_path_params_delete(self, async_client: AsyncWhop) -> None: + with pytest.raises(ValueError, match=r"Expected a non-empty value for `id` but received ''"): + await async_client.authorized_users.with_raw_response.delete( + id="", + ) diff --git a/tests/api_resources/test_memberships.py b/tests/api_resources/test_memberships.py index 2972632c..69df8fcd 100644 --- a/tests/api_resources/test_memberships.py +++ b/tests/api_resources/test_memberships.py @@ -165,6 +165,52 @@ def test_streaming_response_list(self, client: Whop) -> None: assert cast(Any, response.is_closed) is True + @pytest.mark.skip(reason="Mock server tests are disabled") + @parametrize + def test_method_add_free_days(self, client: Whop) -> None: + membership = client.memberships.add_free_days( + id="mem_xxxxxxxxxxxxxx", + free_days=42, + ) + assert_matches_type(Membership, membership, path=["response"]) + + @pytest.mark.skip(reason="Mock server tests are disabled") + @parametrize + def test_raw_response_add_free_days(self, client: Whop) -> None: + response = client.memberships.with_raw_response.add_free_days( + id="mem_xxxxxxxxxxxxxx", + free_days=42, + ) + + assert response.is_closed is True + assert response.http_request.headers.get("X-Stainless-Lang") == "python" + membership = response.parse() + assert_matches_type(Membership, membership, path=["response"]) + + @pytest.mark.skip(reason="Mock server tests are disabled") + @parametrize + def test_streaming_response_add_free_days(self, client: Whop) -> None: + with client.memberships.with_streaming_response.add_free_days( + id="mem_xxxxxxxxxxxxxx", + free_days=42, + ) as response: + assert not response.is_closed + assert response.http_request.headers.get("X-Stainless-Lang") == "python" + + membership = response.parse() + assert_matches_type(Membership, membership, path=["response"]) + + assert cast(Any, response.is_closed) is True + + @pytest.mark.skip(reason="Mock server tests are disabled") + @parametrize + def test_path_params_add_free_days(self, client: Whop) -> None: + with pytest.raises(ValueError, match=r"Expected a non-empty value for `id` but received ''"): + client.memberships.with_raw_response.add_free_days( + id="", + free_days=42, + ) + @pytest.mark.skip(reason="Mock server tests are disabled") @parametrize def test_method_cancel(self, client: Whop) -> None: @@ -500,6 +546,52 @@ async def test_streaming_response_list(self, async_client: AsyncWhop) -> None: assert cast(Any, response.is_closed) is True + @pytest.mark.skip(reason="Mock server tests are disabled") + @parametrize + async def test_method_add_free_days(self, async_client: AsyncWhop) -> None: + membership = await async_client.memberships.add_free_days( + id="mem_xxxxxxxxxxxxxx", + free_days=42, + ) + assert_matches_type(Membership, membership, path=["response"]) + + @pytest.mark.skip(reason="Mock server tests are disabled") + @parametrize + async def test_raw_response_add_free_days(self, async_client: AsyncWhop) -> None: + response = await async_client.memberships.with_raw_response.add_free_days( + id="mem_xxxxxxxxxxxxxx", + free_days=42, + ) + + assert response.is_closed is True + assert response.http_request.headers.get("X-Stainless-Lang") == "python" + membership = await response.parse() + assert_matches_type(Membership, membership, path=["response"]) + + @pytest.mark.skip(reason="Mock server tests are disabled") + @parametrize + async def test_streaming_response_add_free_days(self, async_client: AsyncWhop) -> None: + async with async_client.memberships.with_streaming_response.add_free_days( + id="mem_xxxxxxxxxxxxxx", + free_days=42, + ) as response: + assert not response.is_closed + assert response.http_request.headers.get("X-Stainless-Lang") == "python" + + membership = await response.parse() + assert_matches_type(Membership, membership, path=["response"]) + + assert cast(Any, response.is_closed) is True + + @pytest.mark.skip(reason="Mock server tests are disabled") + @parametrize + async def test_path_params_add_free_days(self, async_client: AsyncWhop) -> None: + with pytest.raises(ValueError, match=r"Expected a non-empty value for `id` but received ''"): + await async_client.memberships.with_raw_response.add_free_days( + id="", + free_days=42, + ) + @pytest.mark.skip(reason="Mock server tests are disabled") @parametrize async def test_method_cancel(self, async_client: AsyncWhop) -> None: From 1f5a2e713926da18f451473aeaba7779daeb9211 Mon Sep 17 00:00:00 2001 From: "stainless-app[bot]" <142633134+stainless-app[bot]@users.noreply.github.com> Date: Tue, 10 Mar 2026 21:22:07 +0000 Subject: [PATCH 17/17] release: 0.1.0 --- .release-please-manifest.json | 2 +- CHANGELOG.md | 27 +++++++++++++++++++++++++++ pyproject.toml | 2 +- src/whop_sdk/_version.py | 2 +- 4 files changed, 30 insertions(+), 3 deletions(-) diff --git a/.release-please-manifest.json b/.release-please-manifest.json index 34ac707c..3d2ac0bd 100644 --- a/.release-please-manifest.json +++ b/.release-please-manifest.json @@ -1,3 +1,3 @@ { - ".": "0.0.30" + ".": "0.1.0" } \ No newline at end of file diff --git a/CHANGELOG.md b/CHANGELOG.md index dd2e1246..eb73b72b 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,32 @@ # Changelog +## 0.1.0 (2026-03-10) + +Full Changelog: [v0.0.30...v0.1.0](https://github.com/whopio/whopsdk-python/compare/v0.0.30...v0.1.0) + +### Features + +* **api:** api update ([99175a1](https://github.com/whopio/whopsdk-python/commit/99175a149a05f6c54b225447a163b958af8ae61c)) +* **api:** api update ([fe17d66](https://github.com/whopio/whopsdk-python/commit/fe17d66f82035b4e58f474bfd136bf78114aaeab)) +* **api:** api update ([2ee7fe7](https://github.com/whopio/whopsdk-python/commit/2ee7fe71e837e7f91ed021b58217abaf89782879)) +* **api:** api update ([260853e](https://github.com/whopio/whopsdk-python/commit/260853e5ec3e85481b25da49ec4252b8b773e81a)) +* **api:** api update ([dcef405](https://github.com/whopio/whopsdk-python/commit/dcef4059c4ce8e9fdffa7d2aba850f325c53fb57)) +* **api:** api update ([abc268f](https://github.com/whopio/whopsdk-python/commit/abc268f2c7a2d59ed01e6fd595aaf3559b831302)) +* **api:** api update ([2f4cd94](https://github.com/whopio/whopsdk-python/commit/2f4cd94cdca591d743dd905f9b325d25fe45acb8)) +* **api:** api update ([ad1d5b7](https://github.com/whopio/whopsdk-python/commit/ad1d5b78546c5efd4214e22c42aa7a64227bc34c)) +* **api:** api update ([c2f142d](https://github.com/whopio/whopsdk-python/commit/c2f142d7aebad6ec2b140d70a8b93aa3205290ec)) +* **api:** api update ([d62a4b7](https://github.com/whopio/whopsdk-python/commit/d62a4b7961c1264d9c4055a026238a72822b8b19)) +* **api:** api update ([c60ab1e](https://github.com/whopio/whopsdk-python/commit/c60ab1e6568cef6910ec61773887c8b9546c52d4)) +* **api:** api update ([020c181](https://github.com/whopio/whopsdk-python/commit/020c181cf53f7811401fe01d4382fe490e6e5398)) +* **api:** manual updates ([b162886](https://github.com/whopio/whopsdk-python/commit/b1628865df13ae4d703571e46e738405652ad150)) + + +### Chores + +* **ci:** skip uploading artifacts on stainless-internal branches ([04a3a6d](https://github.com/whopio/whopsdk-python/commit/04a3a6d8263e34b42b476380846af4d4f31deedd)) +* **docs:** add missing descriptions ([beeb9ef](https://github.com/whopio/whopsdk-python/commit/beeb9efca946b1bc2e565239ac96d3d2d8642b6f)) +* **tests:** update webhook tests ([f740d3c](https://github.com/whopio/whopsdk-python/commit/f740d3c6d32e332ecea2ec902e9903c36055443e)) + ## 0.0.30 (2026-02-26) Full Changelog: [v0.0.29...v0.0.30](https://github.com/whopio/whopsdk-python/compare/v0.0.29...v0.0.30) diff --git a/pyproject.toml b/pyproject.toml index 80fe5263..9279b720 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,6 +1,6 @@ [project] name = "whop-sdk" -version = "0.0.30" +version = "0.1.0" 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 c674ff57..162053b4 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.30" # x-release-please-version +__version__ = "0.1.0" # x-release-please-version