From d72f42015e97c13f5402c3454878699fdd95f7c3 Mon Sep 17 00:00:00 2001
From: "fern-api[bot]" <115122769+fern-api[bot]@users.noreply.github.com>
Date: Tue, 8 Sep 2026 20:01:13 +0000
Subject: [PATCH 1/2] [fern-generated] Update SDK
Generated by Fern
CLI Version: unknown
Generators:
- fernapi/fern-python-sdk: 5.28.0
---
.fern/metadata.json | 2 +-
poetry.lock | 6 +-
reference.md | 1570 ++++++-----------
src/whop_sdk/__init__.py | 195 +-
src/whop_sdk/access_tokens/client.py | 4 +-
src/whop_sdk/account_links/client.py | 4 +-
src/whop_sdk/accounts/client.py | 42 +-
src/whop_sdk/accounts/preferences/client.py | 8 +-
src/whop_sdk/accounts/raw_client.py | 10 +
src/whop_sdk/accounts/reserves/client.py | 4 +-
src/whop_sdk/ad_campaigns/__init__.py | 63 +
src/whop_sdk/ad_campaigns/client.py | 40 +-
src/whop_sdk/ad_campaigns/raw_client.py | 4 +-
src/whop_sdk/ad_campaigns/types/__init__.py | 75 +
...post_ad_campaign_payment_failed_payload.py | 4 +-
...ad_campaign_payment_failed_payload_data.py | 101 ++
...gn_payment_failed_payload_data_bid_type.py | 7 +
...failed_payload_data_budget_optimization.py | 7 +
...payment_failed_payload_data_budget_type.py | 5 +
...ent_failed_payload_data_delivery_status.py | 21 +
...n_payment_failed_payload_data_objective.py | 7 +
...gn_payment_failed_payload_data_platform.py | 5 +
...payload_data_special_ad_categories_item.py | 7 +
...aign_payment_failed_payload_data_status.py | 21 +
.../types/post_ad_campaign_updated_payload.py | 57 +
...ad_campaign_updated_payload_api_version.py | 5 +
.../post_ad_campaign_updated_payload_data.py | 99 ++
..._campaign_updated_payload_data_bid_type.py | 7 +
...pdated_payload_data_budget_optimization.py | 5 +
...mpaign_updated_payload_data_budget_type.py | 5 +
...gn_updated_payload_data_delivery_status.py | 21 +
...campaign_updated_payload_data_objective.py | 7 +
..._campaign_updated_payload_data_platform.py | 5 +
...payload_data_special_ad_categories_item.py | 7 +
...ad_campaign_updated_payload_data_status.py | 21 +
.../post_ad_campaign_updated_payload_type.py | 5 +
src/whop_sdk/ad_groups/client.py | 40 +-
src/whop_sdk/ads/__init__.py | 24 +
src/whop_sdk/ads/client.py | 36 +-
src/whop_sdk/ads/raw_client.py | 4 +-
src/whop_sdk/ads/types/__init__.py | 24 +
.../ads/types/post_ad_updated_payload.py | 57 +
.../post_ad_updated_payload_api_version.py | 5 +
.../ads/types/post_ad_updated_payload_data.py | 133 ++
..._ad_updated_payload_data_call_to_action.py | 40 +
...ad_updated_payload_data_delivery_status.py | 21 +
...ost_ad_updated_payload_data_post_source.py | 5 +
.../post_ad_updated_payload_data_status.py | 5 +
.../ads/types/post_ad_updated_payload_type.py | 5 +
src/whop_sdk/affiliates/client.py | 20 +-
src/whop_sdk/affiliates/overrides/client.py | 20 +-
src/whop_sdk/ai_chats/client.py | 39 +-
src/whop_sdk/ai_chats/raw_client.py | 21 +
src/whop_sdk/api_keys/client.py | 28 +-
...reate_api_keys_request_api_version_date.py | 2 +
...pdate_api_keys_request_api_version_date.py | 2 +
src/whop_sdk/api_logs/client.py | 4 +-
src/whop_sdk/app_builds/client.py | 16 +-
src/whop_sdk/apps/__init__.py | 3 -
src/whop_sdk/apps/client.py | 153 +-
src/whop_sdk/apps/raw_client.py | 288 ---
src/whop_sdk/apps/types/__init__.py | 5 -
..._app_request_requested_permissions_item.py | 36 -
src/whop_sdk/audiences/__init__.py | 9 +
src/whop_sdk/audiences/client.py | 112 +-
src/whop_sdk/audiences/raw_client.py | 89 +-
src/whop_sdk/audiences/types/__init__.py | 9 +
...create_audiences_request_column_mapping.py | 2 +-
.../create_audiences_request_engagement.py | 38 +
...e_audiences_request_engagement_platform.py | 5 +
.../create_audiences_request_source_type.py | 5 +
.../list_audiences_request_source_type.py | 2 +-
src/whop_sdk/authorized_users/client.py | 16 +-
src/whop_sdk/bounties/client.py | 20 +-
src/whop_sdk/bounties/submissions/client.py | 8 +-
src/whop_sdk/bounty_submissions/client.py | 20 +-
src/whop_sdk/card_transactions/client.py | 8 +-
src/whop_sdk/cards/__init__.py | 3 +
src/whop_sdk/cards/client.py | 31 +-
src/whop_sdk/cards/raw_client.py | 19 +-
src/whop_sdk/cards/types/__init__.py | 3 +
.../types/update_cards_request_billing.py | 6 +-
.../types/update_cards_request_cardholder.py | 41 +
src/whop_sdk/chat_channels/client.py | 12 +-
.../checkout_configurations/client.py | 16 +-
src/whop_sdk/client.py | 8 +-
.../company_token_transactions/client.py | 12 +-
src/whop_sdk/confirmation_tokens/__init__.py | 3 +
src/whop_sdk/confirmation_tokens/client.py | 8 +-
.../confirmation_tokens/types/__init__.py | 5 +
...irmation_tokens_request_billing_details.py | 1 +
...firmation_tokens_request_payment_method.py | 8 +
...tokens_request_payment_method_redirect.py} | 9 +-
src/whop_sdk/course_chapters/client.py | 20 +-
.../course_lesson_interactions/client.py | 8 +-
src/whop_sdk/course_lessons/client.py | 32 +-
src/whop_sdk/course_students/client.py | 8 +-
src/whop_sdk/courses/client.py | 20 +-
src/whop_sdk/deposits/client.py | 12 +-
src/whop_sdk/deposits/raw_client.py | 8 +-
.../types/create_deposits_response_methods.py | 2 +-
src/whop_sdk/dispute_alerts/client.py | 8 +-
src/whop_sdk/disputes/__init__.py | 12 -
src/whop_sdk/disputes/client.py | 393 +----
src/whop_sdk/disputes/raw_client.py | 734 --------
src/whop_sdk/disputes/types/__init__.py | 20 -
..._request_cancellation_policy_attachment.py | 26 -
...quest_customer_communication_attachment.py | 26 -
src/whop_sdk/dm_channels/client.py | 20 +-
src/whop_sdk/dm_members/client.py | 20 +-
src/whop_sdk/entries/client.py | 16 +-
src/whop_sdk/events/client.py | 16 +-
..._data_item_related_audience_source_type.py | 2 +-
src/whop_sdk/experiences/client.py | 32 +-
src/whop_sdk/exports/client.py | 12 +-
src/whop_sdk/fee_markups/client.py | 12 +-
src/whop_sdk/files/client.py | 16 +-
src/whop_sdk/financial_activity/client.py | 4 +-
.../financial_reports/breakdown/client.py | 4 +-
src/whop_sdk/financial_reports/client.py | 4 +-
...ial_reports_response_rows_item_grouping.py | 1 +
...eports_response_rows_item_line_category.py | 1 +
src/whop_sdk/forum_posts/client.py | 16 +-
src/whop_sdk/forums/client.py | 12 +-
src/whop_sdk/identity_profiles/client.py | 16 +-
src/whop_sdk/invoices/client.py | 36 +-
src/whop_sdk/leads/client.py | 16 +-
src/whop_sdk/ledger_accounts/client.py | 4 +-
src/whop_sdk/media/client.py | 8 +-
src/whop_sdk/members/client.py | 8 +-
src/whop_sdk/members/logs/client.py | 4 +-
src/whop_sdk/memberships/client.py | 273 +--
src/whop_sdk/memberships/raw_client.py | 736 +-------
src/whop_sdk/messages/client.py | 20 +-
src/whop_sdk/notifications/client.py | 20 +-
src/whop_sdk/notifications/topics/client.py | 4 +-
src/whop_sdk/partners/businesses/client.py | 8 +-
.../partners/businesses/earnings/client.py | 4 +-
.../types/list_businesses_request_order.py | 8 +-
...usinesses_response_data_item_volume_usd.py | 14 +
...retrieve_businesses_response_volume_usd.py | 14 +
src/whop_sdk/partners/client.py | 103 +-
src/whop_sdk/partners/raw_client.py | 124 ++
src/whop_sdk/payment_method_domains/client.py | 24 +-
.../payment_method_domains/raw_client.py | 4 +-
src/whop_sdk/payment_methods/client.py | 12 +-
src/whop_sdk/payments/client.py | 116 +-
src/whop_sdk/payments/raw_client.py | 196 ++
.../types/post_payment_authorized_payload.py | 4 +-
.../types/post_payment_canceled_payload.py | 4 +-
.../types/post_payment_created_payload.py | 4 +-
.../types/post_payment_failed_payload.py | 4 +-
.../types/post_payment_pending_payload.py | 4 +-
.../types/post_payment_succeeded_payload.py | 4 +-
src/whop_sdk/payout_accounts/client.py | 4 +-
src/whop_sdk/payout_methods/client.py | 8 +-
src/whop_sdk/payouts/client.py | 20 +-
src/whop_sdk/payouts/methods/client.py | 16 +-
.../payouts/supported_methods/client.py | 4 +-
src/whop_sdk/people/client.py | 8 +-
src/whop_sdk/permissions/client.py | 4 +-
src/whop_sdk/plans/client.py | 44 +-
src/whop_sdk/plans/raw_client.py | 20 +-
src/whop_sdk/products/client.py | 32 +-
src/whop_sdk/products/raw_client.py | 4 +-
src/whop_sdk/promo_codes/client.py | 24 +-
src/whop_sdk/reactions/client.py | 16 +-
src/whop_sdk/recommended_actions/client.py | 16 +-
src/whop_sdk/refunds/client.py | 8 +-
.../resolution_center_cases/client.py | 44 +-
src/whop_sdk/reviews/client.py | 8 +-
src/whop_sdk/setup_intents/client.py | 20 +-
src/whop_sdk/shipments/client.py | 16 +-
src/whop_sdk/social_accounts/client.py | 24 +-
src/whop_sdk/stats/client.py | 20 +-
src/whop_sdk/support_channels/client.py | 12 +-
src/whop_sdk/swaps/client.py | 16 +-
src/whop_sdk/team_members/client.py | 20 +-
src/whop_sdk/topups/client.py | 4 +-
src/whop_sdk/transfers/__init__.py | 3 +
src/whop_sdk/transfers/client.py | 37 +-
src/whop_sdk/transfers/raw_client.py | 21 +
src/whop_sdk/transfers/types/__init__.py | 3 +
.../create_transfers_request_feed_type.py | 7 +
src/whop_sdk/types/__init__.py | 68 +
.../types/account_required_action_action.py | 1 +
src/whop_sdk/types/ai_chat.py | 6 +
.../types/ai_chat_agent_identifiers.py | 5 +
src/whop_sdk/types/ai_chat_list_item.py | 6 +
.../types/api_key_api_version_date.py | 2 +
src/whop_sdk/types/audience.py | 22 +-
src/whop_sdk/types/audience_engagement.py | 34 +
.../audience_engagement_facebook_page_rule.py | 33 +
...nce_engagement_facebook_page_rule_event.py | 7 +
...ience_engagement_instagram_profile_rule.py | 33 +
...engagement_instagram_profile_rule_event.py | 26 +
.../audience_engagement_lead_form_rule.py | 34 +
...udience_engagement_lead_form_rule_event.py | 5 +
.../types/audience_engagement_platform.py | 5 +
.../types/audience_engagement_rule.py | 90 +
.../types/audience_engagement_video_rule.py | 34 +
.../audience_engagement_video_rule_event.py | 16 +
src/whop_sdk/types/audience_source_type.py | 2 +-
.../types/checkout_configuration_list_item.py | 5 +
src/whop_sdk/types/fee_markup_types.py | 2 +
.../types/ledger_activity_line_type.py | 5 +
src/whop_sdk/types/onboarding_reward.py | 89 +
...ding_reward_qualification_income_source.py | 5 +
.../types/onboarding_reward_reward_type.py | 5 +
.../types/onboarding_reward_status.py | 7 +
src/whop_sdk/types/payment.py | 5 +
src/whop_sdk/types/payment_legacy.py | 5 +
src/whop_sdk/types/payment_method_types.py | 8 +
src/whop_sdk/types/permission_action.py | 1 +
.../recommended_action.py} | 10 +-
src/whop_sdk/types/resolution_center_case.py | 2 +
src/whop_sdk/types/resolution_line_item.py | 42 +
src/whop_sdk/types/social_account_post.py | 10 +
src/whop_sdk/types/support_channel.py | 5 +
.../types/support_channel_list_item.py | 5 +
src/whop_sdk/types/webhook_event.py | 2 +
src/whop_sdk/types/webhook_events_item.py | 2 +
.../types/webhook_list_item_events_item.py | 2 +
.../types/webhook_testable_events_item.py | 2 +
src/whop_sdk/users/client.py | 28 +-
src/whop_sdk/users/oauth_grants/client.py | 8 +-
src/whop_sdk/users/passkeys/client.py | 16 +-
src/whop_sdk/users/preferences/client.py | 8 +-
.../users/preferences/notifications/client.py | 8 +-
.../notifications/experiences/client.py | 4 +-
.../preferences/notifications/raw_client.py | 4 +-
.../notifications/topics/client.py | 4 +-
...ications_request_preferences_item_scope.py | 2 +-
src/whop_sdk/verifications/client.py | 16 +-
src/whop_sdk/webhooks/__init__.py | 9 -
src/whop_sdk/webhooks/client.py | 177 +-
src/whop_sdk/webhooks/raw_client.py | 332 ----
src/whop_sdk/webhooks/types/__init__.py | 9 -
.../create_webhooks_request_events_item.py | 2 +
.../types/deliveries_webhook_response.py | 33 -
.../deliveries_webhook_response_data_item.py | 52 -
.../deliveries_webhook_response_page_info.py | 31 -
.../update_webhooks_request_events_item.py | 2 +
243 files changed, 4130 insertions(+), 5079 deletions(-)
create mode 100644 src/whop_sdk/ad_campaigns/types/post_ad_campaign_payment_failed_payload_data.py
create mode 100644 src/whop_sdk/ad_campaigns/types/post_ad_campaign_payment_failed_payload_data_bid_type.py
create mode 100644 src/whop_sdk/ad_campaigns/types/post_ad_campaign_payment_failed_payload_data_budget_optimization.py
create mode 100644 src/whop_sdk/ad_campaigns/types/post_ad_campaign_payment_failed_payload_data_budget_type.py
create mode 100644 src/whop_sdk/ad_campaigns/types/post_ad_campaign_payment_failed_payload_data_delivery_status.py
create mode 100644 src/whop_sdk/ad_campaigns/types/post_ad_campaign_payment_failed_payload_data_objective.py
create mode 100644 src/whop_sdk/ad_campaigns/types/post_ad_campaign_payment_failed_payload_data_platform.py
create mode 100644 src/whop_sdk/ad_campaigns/types/post_ad_campaign_payment_failed_payload_data_special_ad_categories_item.py
create mode 100644 src/whop_sdk/ad_campaigns/types/post_ad_campaign_payment_failed_payload_data_status.py
create mode 100644 src/whop_sdk/ad_campaigns/types/post_ad_campaign_updated_payload.py
create mode 100644 src/whop_sdk/ad_campaigns/types/post_ad_campaign_updated_payload_api_version.py
create mode 100644 src/whop_sdk/ad_campaigns/types/post_ad_campaign_updated_payload_data.py
create mode 100644 src/whop_sdk/ad_campaigns/types/post_ad_campaign_updated_payload_data_bid_type.py
create mode 100644 src/whop_sdk/ad_campaigns/types/post_ad_campaign_updated_payload_data_budget_optimization.py
create mode 100644 src/whop_sdk/ad_campaigns/types/post_ad_campaign_updated_payload_data_budget_type.py
create mode 100644 src/whop_sdk/ad_campaigns/types/post_ad_campaign_updated_payload_data_delivery_status.py
create mode 100644 src/whop_sdk/ad_campaigns/types/post_ad_campaign_updated_payload_data_objective.py
create mode 100644 src/whop_sdk/ad_campaigns/types/post_ad_campaign_updated_payload_data_platform.py
create mode 100644 src/whop_sdk/ad_campaigns/types/post_ad_campaign_updated_payload_data_special_ad_categories_item.py
create mode 100644 src/whop_sdk/ad_campaigns/types/post_ad_campaign_updated_payload_data_status.py
create mode 100644 src/whop_sdk/ad_campaigns/types/post_ad_campaign_updated_payload_type.py
create mode 100644 src/whop_sdk/ads/types/post_ad_updated_payload.py
create mode 100644 src/whop_sdk/ads/types/post_ad_updated_payload_api_version.py
create mode 100644 src/whop_sdk/ads/types/post_ad_updated_payload_data.py
create mode 100644 src/whop_sdk/ads/types/post_ad_updated_payload_data_call_to_action.py
create mode 100644 src/whop_sdk/ads/types/post_ad_updated_payload_data_delivery_status.py
create mode 100644 src/whop_sdk/ads/types/post_ad_updated_payload_data_post_source.py
create mode 100644 src/whop_sdk/ads/types/post_ad_updated_payload_data_status.py
create mode 100644 src/whop_sdk/ads/types/post_ad_updated_payload_type.py
delete mode 100644 src/whop_sdk/apps/types/update_permissions_app_request_requested_permissions_item.py
create mode 100644 src/whop_sdk/audiences/types/create_audiences_request_engagement.py
create mode 100644 src/whop_sdk/audiences/types/create_audiences_request_engagement_platform.py
create mode 100644 src/whop_sdk/audiences/types/create_audiences_request_source_type.py
create mode 100644 src/whop_sdk/cards/types/update_cards_request_cardholder.py
rename src/whop_sdk/{disputes/types/update_evidence_dispute_request_refund_policy_attachment.py => confirmation_tokens/types/create_confirmation_tokens_request_payment_method_redirect.py} (67%)
delete mode 100644 src/whop_sdk/disputes/types/update_evidence_dispute_request_cancellation_policy_attachment.py
delete mode 100644 src/whop_sdk/disputes/types/update_evidence_dispute_request_customer_communication_attachment.py
create mode 100644 src/whop_sdk/transfers/types/create_transfers_request_feed_type.py
create mode 100644 src/whop_sdk/types/ai_chat_agent_identifiers.py
create mode 100644 src/whop_sdk/types/audience_engagement.py
create mode 100644 src/whop_sdk/types/audience_engagement_facebook_page_rule.py
create mode 100644 src/whop_sdk/types/audience_engagement_facebook_page_rule_event.py
create mode 100644 src/whop_sdk/types/audience_engagement_instagram_profile_rule.py
create mode 100644 src/whop_sdk/types/audience_engagement_instagram_profile_rule_event.py
create mode 100644 src/whop_sdk/types/audience_engagement_lead_form_rule.py
create mode 100644 src/whop_sdk/types/audience_engagement_lead_form_rule_event.py
create mode 100644 src/whop_sdk/types/audience_engagement_platform.py
create mode 100644 src/whop_sdk/types/audience_engagement_rule.py
create mode 100644 src/whop_sdk/types/audience_engagement_video_rule.py
create mode 100644 src/whop_sdk/types/audience_engagement_video_rule_event.py
create mode 100644 src/whop_sdk/types/onboarding_reward.py
create mode 100644 src/whop_sdk/types/onboarding_reward_qualification_income_source.py
create mode 100644 src/whop_sdk/types/onboarding_reward_reward_type.py
create mode 100644 src/whop_sdk/types/onboarding_reward_status.py
rename src/whop_sdk/{disputes/types/update_evidence_dispute_request_uncategorized_attachment.py => types/recommended_action.py} (60%)
create mode 100644 src/whop_sdk/types/resolution_line_item.py
delete mode 100644 src/whop_sdk/webhooks/types/deliveries_webhook_response.py
delete mode 100644 src/whop_sdk/webhooks/types/deliveries_webhook_response_data_item.py
delete mode 100644 src/whop_sdk/webhooks/types/deliveries_webhook_response_page_info.py
diff --git a/.fern/metadata.json b/.fern/metadata.json
index ab0ed37d..838d833a 100644
--- a/.fern/metadata.json
+++ b/.fern/metadata.json
@@ -15,7 +15,7 @@
"standardwebhooks": ">=1.0.1,<2"
}
},
- "originGitCommit": "aca262b24a27e2e67026e2661c5b9d2fe8e9a016",
+ "originGitCommit": "eeac8887765f8f6903e379851ca01e253b9af648",
"originGitCommitIsDirty": false,
"invokedBy": "ci",
"requestedVersion": "1.1.1",
diff --git a/poetry.lock b/poetry.lock
index b55c24cf..196c03a4 100644
--- a/poetry.lock
+++ b/poetry.lock
@@ -188,14 +188,14 @@ files = [
[[package]]
name = "anyio"
-version = "4.15.0"
+version = "4.15.1"
description = "High-level concurrency and networking framework on top of asyncio or Trio"
optional = false
python-versions = ">=3.10"
groups = ["main"]
files = [
- {file = "anyio-4.15.0-py3-none-any.whl", hash = "sha256:7ecd9937369ffce8bba0b5ccb9b3a9507b101b0ed50256aecfbab27e6c2acb99"},
- {file = "anyio-4.15.0.tar.gz", hash = "sha256:b5c620ed540725e2579c31b17bb995b3bf02c9281c9cace04c7d186380bab85e"},
+ {file = "anyio-4.15.1-py3-none-any.whl", hash = "sha256:6152fdbbf9a77fdec97731721bebf7c4c44f7c29b424b0065826173efc7ed101"},
+ {file = "anyio-4.15.1.tar.gz", hash = "sha256:9f28306018cbd6d329e64a36d58256edff76dd996fe423bc957326e578b82a94"},
]
[package.dependencies]
diff --git a/reference.md b/reference.md
index 04e662c8..bdb65906 100644
--- a/reference.md
+++ b/reference.md
@@ -455,6 +455,14 @@ client.accounts.create()
-
+**send_customer_emails:** `typing.Optional[bool]` — Whether Whop sends transactional emails to customers on behalf of the connected account.
+
+
+
+
+
+-
+
**title:** `typing.Optional[str]` — The display name of the account. Defaults to `metadata.external_id` or the owner's email when omitted.
@@ -2308,7 +2316,7 @@ client.ad_campaigns.retry_payment(
-
-Resumes a paused ad campaign.
+Resumes a paused ad campaign. Requires an ads payment method on the account.
@@ -3999,7 +4007,7 @@ client.ads.list(
-
-Creates an ad in an ad group.
+Creates an ad in an ad group. Any campaign status other than `draft` launches the campaign, which requires an ads payment method on the account.
@@ -5359,6 +5367,14 @@ client.ai_chats.list(
-
+**agent_identifier:** `typing.Optional[AiChatAgentIdentifiers]`
+
+
+
+
+
+-
+
**only_active_crons:** `typing.Optional[bool]` — When true, returns only chats with an active cron schedule
@@ -5443,6 +5459,14 @@ client.ai_chats.create(
-
+**agent_identifier:** `typing.Optional[AiChatAgentIdentifiers]` — The AI agent that handles the chat. Defaults to `support`.
+
+
+
+
+
+-
+
**current_account_id:** `typing.Optional[str]` — The unique identifier of the account to set as context for the AI chat (e.g., "biz_XXXXX").
@@ -7256,98 +7280,6 @@ client.apps.create(
-
-
-
-
-client.apps.update_permissions_app(...) -> bool
-
--
-
-#### 📝 Description
-
-
--
-
-
--
-
-Updates the permission requirements for an app
-
-Required permissions:
- - `developer:update_app_authorization`
-
-
-
-
-
-#### 🔌 Usage
-
-
--
-
-
--
-
-```python
-from whop_sdk import Whop
-from whop_sdk.environment import WhopEnvironment
-from whop_sdk.apps import UpdatePermissionsAppRequestRequestedPermissionsItem
-
-client = Whop(
- token="",
- environment=WhopEnvironment.DEFAULT,
-)
-
-client.apps.update_permissions_app(
- app_id="app_id",
- requested_permissions=[
- UpdatePermissionsAppRequestRequestedPermissionsItem(
- action="action",
- is_required=True,
- justification="justification",
- )
- ],
-)
-
-```
-
-
-
-
-
-#### ⚙️ Parameters
-
-
--
-
-
--
-
-**app_id:** `str` — The ID of the app the permission requirements are being updated for
-
-
-
-
-
--
-
-**requested_permissions:** `typing.List[UpdatePermissionsAppRequestRequestedPermissionsItem]` — The permissions that the app will request off of users when a user installs the app.
-
-
-
-
-
--
-
-**request_options:** `typing.Optional[RequestOptions]` — Request-specific configuration.
-
-
-
-
-
-
-
@@ -8051,7 +7983,7 @@ client.apps.update_permissions(
-
-Lists uploaded customer-list audiences for an account. Pass `audience_id` to return a specific audience.
+List custom and lookalike audiences for an account. Pass `audience_id` to return a specific audience.
@@ -8108,7 +8040,7 @@ client.audiences.list(
-
-**audience_type:** `typing.Optional[ListAudiencesRequestAudienceType]` — Filter by audience type: `custom` (uploaded lists) or `lookalike`.
+**audience_type:** `typing.Optional[ListAudiencesRequestAudienceType]` — Filter by custom or lookalike audiences.
@@ -8116,7 +8048,7 @@ client.audiences.list(
-
-**source_type:** `typing.Optional[ListAudiencesRequestSourceType]` — Filter by member source: `csv_upload` (uploaded lists) or `people_filter` (automatic audiences built from saved People filters).
+**source_type:** `typing.Optional[ListAudiencesRequestSourceType]` — Filter by uploaded customer lists, Whop People filters, or social engagement.
@@ -8164,152 +8096,181 @@ client.audiences.list(
-
-Creates an audience. Default (`audience_type` omitted or `custom`): creates one audience from an uploaded customer identity CSV file (`name`, `column_mapping`, and `file_id` required) and starts processing it; responds with the audience object. With `filters`: creates an audience from saved People filters (`name` required) — membership is built from the account's People data, and `auto_refresh` decides whether it keeps tracking the filters or keeps whoever matched at creation. With `audience_type: lookalike`: creates a ladder of Meta lookalike audiences from an existing ready custom audience (`source_audience_id`, `count`, and `percentage` required) — `count` equal similarity bands slicing the top `percentage`% (3 audiences at 6% = 0–2%, 2–4%, 4–6%), each returned as its own audience in a `{ data: [...] }` envelope.
-
-
-
-
-
-#### 🔌 Usage
-
-
--
-
-
--
-
-```python
-from whop_sdk import Whop
-from whop_sdk.environment import WhopEnvironment
-
-client = Whop(
- token="",
- environment=WhopEnvironment.DEFAULT,
-)
-
-client.audiences.create(
- account_id="biz_xxxxxxxxxxxxxx",
-)
-
-```
-
-
-
-
-
-#### ⚙️ Parameters
-
-
--
-
-
--
-
-**account_id:** `str` — Account ID, prefixed `biz_`.
-
-
-
-
-
--
-
-**audience_type:** `typing.Optional[CreateAudiencesRequestAudienceType]` — What to create. Defaults to `custom` (CSV upload).
-
-
-
-
-
--
-
-**auto_refresh:** `typing.Optional[bool]` — Filter audiences only, and set only at creation. `true` (the default) rebuilds membership from the filters twice a day. `false` keeps whoever matched at creation and never rebuilds.
-
-
-
-
-
--
-
-**column_mapping:** `typing.Optional[CreateAudiencesRequestColumnMapping]` — Custom audiences only. Maps supported identity fields to CSV column headers. Map at least one of `email` or `phone`.
-
-
-
-
-
--
-
-**count:** `typing.Optional[int]` — Lookalikes only. Number of lookalike audiences to create (1–6).
-
-
-
-
-
--
-
-**file_id:** `typing.Optional[str]` — Custom audiences only. The uploaded customer CSV — a file id (`file_...`) returned by `POST /files`.
-
-
-
-
-
--
-
-**filters:** `typing.Optional[typing.Dict[str, typing.Any]]` — Filter audiences only. The People filters that define membership, keyed exactly as `GET /people` accepts them — for example `{"os": "iOS", "country": "US"}`. Date filters must be rolling windows — `first_seen_within_days` or `last_seen_within_days` — so the audience re-anchors on every refresh; fixed dates such as `first_seen_after` are rejected. Source values are canonical source paths (`whop:::`, `ext::...`, `referrer:`, `direct`), exact or with a trailing `:*` wildcard.
-
-
-
-
-
--
-
-**name:** `typing.Optional[str]` — Audience display name. Required for custom audiences; lookalike names are generated from the source audience.
-
-
-
-
-
--
-
-**percentage:** `typing.Optional[int]` — Lookalikes only. Total similarity reach as a whole percent (1–20), sliced evenly across `count` — must be divisible by `count`.
-
-
-
-
-
--
-
-**source_audience_id:** `typing.Optional[str]` — Lookalikes only. The ready custom audience (`adaud_`) to build from; it needs at least 100 matched people.
-
-
-
-
-
--
-
-**request_options:** `typing.Optional[RequestOptions]` — Request-specific configuration.
-
-
-
-
-
-
-
-
-
-
-
-client.audiences.delete(...) -> DeleteAudiencesResponse
-
--
-
-#### 📝 Description
-
-
--
-
-
--
-
-Deletes an audience so it is no longer available for targeting.
+Create an audience from a customer list, your account's Whop People data, or engagement with videos, lead forms, Instagram profiles, or Facebook pages. Create lookalike audiences to reach people similar to an existing audience. Processing runs asynchronously. Custom creation returns one audience; lookalike creation returns the requested similarity bands in `data`.
+
+
+
+
+
+#### 🔌 Usage
+
+
+-
+
+
+-
+
+```python
+from whop_sdk import Whop, AudienceEngagementRule_FacebookPage
+from whop_sdk.environment import WhopEnvironment
+from whop_sdk.audiences import CreateAudiencesRequestEngagement
+
+client = Whop(
+ token="",
+ environment=WhopEnvironment.DEFAULT,
+)
+
+client.audiences.create(
+ account_id="biz_xxxxxxxxxxxxxx",
+ engagement=CreateAudiencesRequestEngagement(
+ include=[
+ AudienceEngagementRule_FacebookPage(
+ event="engaged",
+ retention_days=30,
+ social_account_id="sacc_xxxxxxxxxxxxxx",
+ )
+ ],
+ platform="meta",
+ ),
+ name="Page engagers",
+ source_type="engagement",
+)
+
+```
+
+
+
+
+
+#### ⚙️ Parameters
+
+
+-
+
+
+-
+
+**account_id:** `str` — Account ID, prefixed `biz_`.
+
+
+
+
+
+-
+
+**audience_type:** `typing.Optional[CreateAudiencesRequestAudienceType]` — Audience type. Defaults to `custom`.
+
+
+
+
+
+-
+
+**auto_refresh:** `typing.Optional[bool]` — Filter audiences only, and set only at creation. `true` (the default) rebuilds membership from the filters twice a day. `false` keeps whoever matched at creation and never rebuilds.
+
+
+
+
+
+-
+
+**column_mapping:** `typing.Optional[CreateAudiencesRequestColumnMapping]` — CSV audiences only. Maps supported identity fields to CSV column headers. Map at least one of `email` or `phone`.
+
+
+
+
+
+-
+
+**count:** `typing.Optional[int]` — Lookalikes only. Number of lookalike audiences to create (1–6).
+
+
+
+
+
+-
+
+**engagement:** `typing.Optional[CreateAudiencesRequestEngagement]` — Rules for membership based on social engagement. Requires a connected social account with advertising access.
+
+
+
+
+
+-
+
+**file_id:** `typing.Optional[str]` — CSV audiences only. The uploaded customer CSV — a file id (`file_...`) returned by `POST /files`.
+
+
+
+
+
+-
+
+**filters:** `typing.Optional[typing.Dict[str, typing.Any]]` — Filter audiences only. The People filters that define membership, keyed exactly as `GET /people` accepts them — for example `{"os": "iOS", "country": "US"}`. Date filters must be rolling windows — `first_seen_within_days` or `last_seen_within_days` — so the audience re-anchors on every refresh; fixed dates such as `first_seen_after` are rejected. Source values are canonical source paths (`whop:::`, `ext::...`, `referrer:`, `direct`), exact or with a trailing `:*` wildcard.
+
+
+
+
+
+-
+
+**name:** `typing.Optional[str]` — Audience display name. Required for custom audiences; lookalike names are generated from the source audience.
+
+
+
+
+
+-
+
+**percentage:** `typing.Optional[int]` — Lookalikes only. Total similarity reach as a whole percent (1–20), sliced evenly across `count` — must be divisible by `count`. For example, 3 audiences at 6% creates 0–2%, 2–4%, and 4–6% bands.
+
+
+
+
+
+-
+
+**source_audience_id:** `typing.Optional[str]` — Lookalikes only. The ready custom audience (`adaud_`) to build from; uploaded and People audiences need at least 100 matched people. Meta validates engagement audience eligibility when creating the lookalike.
+
+
+
+
+
+-
+
+**source_type:** `typing.Optional[CreateAudiencesRequestSourceType]` — Custom audience source. Inferred from `engagement`, then `filters`, otherwise defaults to `csv_upload`. Supply only the fields for the selected source.
+
+
+
+
+
+-
+
+**request_options:** `typing.Optional[RequestOptions]` — Request-specific configuration.
+
+
+
+
+
+
+
+
+
+
+
+client.audiences.delete(...) -> DeleteAudiencesResponse
+
+-
+
+#### 📝 Description
+
+
+-
+
+
+-
+
+Deletes an audience so it is no longer available for targeting.
@@ -10716,7 +10677,7 @@ client.cards.update(
-
-**billing:** `typing.Optional[UpdateCardsRequestBilling]` — New billing address. Requires line1, city, region, postal_code, and country_code. On an invited card, passing billing alone (as the invited user) completes onboarding and starts card provisioning.
+**billing:** `typing.Optional[UpdateCardsRequestBilling]` — The billing address. On an issued card this replaces the card's billing address and region is also required. On an invited card, sending it as the invited user completes onboarding and starts card provisioning.
@@ -10732,6 +10693,14 @@ client.cards.update(
-
+**cardholder:** `typing.Optional[UpdateCardsRequestCardholder]` — Details for the invited cardholder, accepted only while completing onboarding on an invited card. The legal name comes from an approved identity verification when the invited user has one, and from these fields when they do not.
+
+
+
+
+
+-
+
**frozen:** `typing.Optional[bool]` — Pass `true` to freeze the card, `false` to unfreeze it. The assigned cardholder may freeze their own card without the payout:account:update scope.
@@ -14303,7 +14272,7 @@ client.courses.update(
-
-Retrieve the deposit methods for an account, including crypto and bank transfer.
+Retrieve the deposit methods for an account, including crypto and bank transfer. Crypto deposits require a $10 minimum.
@@ -14352,7 +14321,7 @@ client.deposits.create(
-
-**amount:** `typing.Optional[float]` — Amount to prefill on hosted deposit page.
+**amount:** `typing.Optional[float]` — Amount to prefill on hosted deposit page. Crypto deposits require a $10 minimum.
@@ -15083,284 +15052,6 @@ client.disputes.submit(
-
-
-
-
-client.disputes.submit_evidence_dispute(...) -> DisputeLegacy
-
--
-
-#### 📝 Description
-
-
--
-
-
--
-
-Submit a payment dispute to the payment processor for review. Once submitted, no further edits can be made.
-
-Required permissions:
- - `payment:dispute`
- - `plan:basic:read`
- - `access_pass:basic:read`
- - `company:basic:read`
- - `payment:basic:read`
- - `member:email:read`
- - `member:basic:read`
- - `member:phone:read`
-
-
-
-
-
-#### 🔌 Usage
-
-
--
-
-
--
-
-```python
-from whop_sdk import Whop
-from whop_sdk.environment import WhopEnvironment
-
-client = Whop(
- token="",
- environment=WhopEnvironment.DEFAULT,
-)
-
-client.disputes.submit_evidence_dispute(
- id="dspt_xxxxxxxxxxxxx",
-)
-
-```
-
-
-
-
-
-#### ⚙️ Parameters
-
-
--
-
-
--
-
-**id:** `str` — The unique identifier of the dispute to submit to the payment processor for review.
-
-
-
-
-
--
-
-**request_options:** `typing.Optional[RequestOptions]` — Request-specific configuration.
-
-
-
-
-
-
-
-
-
-
-
-client.disputes.update_evidence_dispute(...) -> DisputeLegacy
-
--
-
-#### 📝 Description
-
-
--
-
-
--
-
-Update a dispute with evidence data to attempt to win the dispute.
-
-Required permissions:
- - `payment:dispute`
- - `plan:basic:read`
- - `access_pass:basic:read`
- - `company:basic:read`
- - `payment:basic:read`
- - `member:email:read`
- - `member:basic:read`
- - `member:phone:read`
-
-
-
-
-
-#### 🔌 Usage
-
-
--
-
-
--
-
-```python
-from whop_sdk import Whop
-from whop_sdk.environment import WhopEnvironment
-
-client = Whop(
- token="",
- environment=WhopEnvironment.DEFAULT,
-)
-
-client.disputes.update_evidence_dispute(
- id="dspt_xxxxxxxxxxxxx",
-)
-
-```
-
-
-
-
-
-#### ⚙️ Parameters
-
-
--
-
-
--
-
-**id:** `str` — The unique identifier of the dispute to update.
-
-
-
-
-
--
-
-**access_activity_log:** `typing.Optional[str]` — An IP access activity log showing the customer used the service.
-
-
-
-
-
--
-
-**billing_address:** `typing.Optional[str]` — The billing address associated with the customer's payment method.
-
-
-
-
-
--
-
-**cancellation_policy_attachment:** `typing.Optional[UpdateEvidenceDisputeRequestCancellationPolicyAttachment]` — A file upload containing the company's cancellation policy document.
-
-
-
-
-
--
-
-**cancellation_policy_disclosure:** `typing.Optional[str]` — The company's cancellation policy text to submit as evidence.
-
-
-
-
-
--
-
-**customer_communication_attachment:** `typing.Optional[UpdateEvidenceDisputeRequestCustomerCommunicationAttachment]` — A file upload containing evidence of customer communication. Must be a JPEG, PNG, GIF, or PDF.
-
-
-
-
-
--
-
-**customer_email_address:** `typing.Optional[str]` — The email address of the customer associated with the disputed payment.
-
-
-
-
-
--
-
-**customer_name:** `typing.Optional[str]` — The full name of the customer associated with the disputed payment.
-
-
-
-
-
--
-
-**notes:** `typing.Optional[str]` — Additional notes or context to submit as part of the dispute evidence.
-
-
-
-
-
--
-
-**product_description:** `typing.Optional[str]` — A description of the product or service that was provided to the customer.
-
-
-
-
-
--
-
-**refund_policy_attachment:** `typing.Optional[UpdateEvidenceDisputeRequestRefundPolicyAttachment]` — A file upload containing the company's refund policy document.
-
-
-
-
-
--
-
-**refund_policy_disclosure:** `typing.Optional[str]` — The company's refund policy text to submit as evidence.
-
-
-
-
-
--
-
-**refund_refusal_explanation:** `typing.Optional[str]` — An explanation of why the refund request was refused.
-
-
-
-
-
--
-
-**service_date:** `typing.Optional[str]` — The date when the product or service was delivered to the customer.
-
-
-
-
-
--
-
-**uncategorized_attachment:** `typing.Optional[UpdateEvidenceDisputeRequestUncategorizedAttachment]` — A file upload for evidence that does not fit into the other categories.
-
-
-
-
-
--
-
-**request_options:** `typing.Optional[RequestOptions]` — Request-specific configuration.
-
-
-
-
-
-
-
@@ -22979,93 +22670,6 @@ client.memberships.update(
-
-
-
-
-client.memberships.add_free_days_membership(...) -> MembershipLegacy
-
--
-
-#### 📝 Description
-
-
--
-
-
--
-
-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`
-
-
-
-
-
-#### 🔌 Usage
-
-
--
-
-
--
-
-```python
-from whop_sdk import Whop
-from whop_sdk.environment import WhopEnvironment
-
-client = Whop(
- token="",
- environment=WhopEnvironment.DEFAULT,
-)
-
-client.memberships.add_free_days_membership(
- id="mem_xxxxxxxxxxxxxx",
- free_days=42,
-)
-
-```
-
-
-
-
-
-#### ⚙️ Parameters
-
-
--
-
-
--
-
-**id:** `str` — The unique identifier of the membership.
-
-
-
-
-
--
-
-**free_days:** `int` — The number of free days to add (1-1095). Extends the billing period, expiration date, or Stripe trial depending on plan type.
-
-
-
-
-
--
-
-**request_options:** `typing.Optional[RequestOptions]` — Request-specific configuration.
-
-
-
-
-
-
-
@@ -23395,7 +22999,7 @@ client.memberships.resume(
-client.memberships.resync_access_membership(...) -> MembershipLegacy
+client.memberships.resync_access(...) -> Membership
-
@@ -23407,12 +23011,7 @@ client.memberships.resume(
-
-Re-run access fulfillment for a membership. Recomputes the member's content access on Whop, re-validates their Discord link (re-adding them to the server and re-assigning roles if needed), and re-fulfills TradingView indicator access. Telegram access is invite-based and cannot be resynced here. The outcome is written to the membership's logs.
-
-Required permissions:
- - `membership:resync_access`
- - `member:email:read`
- - `member:basic:read`
+Re-runs access fulfillment for a membership: recomputes the member's content access on Whop, re-validates their Discord link (re-adding them to the server and re-assigning roles if needed), and re-fulfills TradingView indicator access. Telegram access is invite-based and is not resynced. The work runs in the background and the outcome is written to the membership's logs.
@@ -23435,8 +23034,8 @@ client = Whop(
environment=WhopEnvironment.DEFAULT,
)
-client.memberships.resync_access_membership(
- id="mem_xxxxxxxxxxxxxx",
+client.memberships.resync_access(
+ id="id",
)
```
@@ -23453,7 +23052,7 @@ client.memberships.resync_access_membership(
-
-**id:** `str` — The unique identifier of the membership to resync access for.
+**id:** `str` — Membership ID (`mem_` tag).
@@ -23546,7 +23145,8 @@ client.memberships.transfer(
-client.memberships.uncancel_membership(...) -> MembershipLegacy
+## Messages
+client.messages.list(...) -> ListMessagesResponse
-
@@ -23558,12 +23158,12 @@ client.memberships.transfer(
-
-Reverse a pending cancellation for a membership that was scheduled to cancel at period end.
+Returns a paginated list of messages within a specific experience chat, DM, or group chat channel, sorted by creation time.
-Required permissions:
- - `member:manage`
- - `member:email:read`
- - `member:basic:read`
+Required permissions (one of):
+ - `chat:read`
+ - `dms:read`
+ - `support_chat:read`
@@ -23586,8 +23186,10 @@ client = Whop(
environment=WhopEnvironment.DEFAULT,
)
-client.memberships.uncancel_membership(
- id="mem_xxxxxxxxxxxxxx",
+client.messages.list(
+ first=42,
+ last=42,
+ channel_id="channel_id",
)
```
@@ -23604,7 +23206,47 @@ client.memberships.uncancel_membership(
-
-**id:** `str` — The unique identifier of the membership to uncancel.
+**channel_id:** `str` — The unique identifier of the channel or experience to list messages for.
+
+
+
+
+
+-
+
+**after:** `typing.Optional[str]` — Returns the elements in the list that come after the specified cursor.
+
+
+
+
+
+-
+
+**before:** `typing.Optional[str]` — Returns the elements in the list that come before the specified cursor.
+
+
+
+
+
+-
+
+**first:** `typing.Optional[int]` — Returns the first _n_ elements from the list.
+
+
+
+
+
+-
+
+**last:** `typing.Optional[int]` — Returns the last _n_ elements from the list.
+
+
+
+
+
+-
+
+**direction:** `typing.Optional[Direction]`
@@ -23624,8 +23266,7 @@ client.memberships.uncancel_membership(
-## Messages
-client.messages.list(...) -> ListMessagesResponse
+client.messages.create(...) -> Message
-
@@ -23637,12 +23278,13 @@ client.memberships.uncancel_membership(
-
-Returns a paginated list of messages within a specific experience chat, DM, or group chat channel, sorted by creation time.
+Send a new message in an experience chat, DM, or group chat channel. Supports text content, attachments, polls, and replies.
Required permissions (one of):
- - `chat:read`
- - `dms:read`
- - `support_chat:read`
+ - `chat:message:create`
+ - `dms:message:manage`
+ - `livestream:chat:write`
+ - `support_chat:message:create`
@@ -23665,10 +23307,9 @@ client = Whop(
environment=WhopEnvironment.DEFAULT,
)
-client.messages.list(
- first=42,
- last=42,
+client.messages.create(
channel_id="channel_id",
+ content="content",
)
```
@@ -23685,7 +23326,7 @@ client.messages.list(
-
-**channel_id:** `str` — The unique identifier of the channel or experience to list messages for.
+**channel_id:** `str` — The unique identifier of the channel or experience to send the message in. For example, 'exp_xxxxx' or 'feed_xxxxx'.
@@ -23693,7 +23334,7 @@ client.messages.list(
-
-**after:** `typing.Optional[str]` — Returns the elements in the list that come after the specified cursor.
+**content:** `str` — The body of the message in Markdown format. For example, 'Hello **world**'.
@@ -23701,7 +23342,7 @@ client.messages.list(
-
-**before:** `typing.Optional[str]` — Returns the elements in the list that come before the specified cursor.
+**attachments:** `typing.Optional[typing.List[CreateMessagesRequestAttachmentsItem]]` — A list of file attachments to include with the message, such as images or videos.
@@ -23709,7 +23350,7 @@ client.messages.list(
-
-**first:** `typing.Optional[int]` — Returns the first _n_ elements from the list.
+**auto_detect_links:** `typing.Optional[bool]` — Automatically detect URLs in the message and generate link previews.
@@ -23717,7 +23358,7 @@ client.messages.list(
-
-**last:** `typing.Optional[int]` — Returns the last _n_ elements from the list.
+**poll:** `typing.Optional[CreateMessagesRequestPoll]` — A poll to attach to this message, allowing recipients to vote on options.
@@ -23725,7 +23366,7 @@ client.messages.list(
-
-**direction:** `typing.Optional[Direction]`
+**replying_to_message_id:** `typing.Optional[str]` — The unique identifier of the message this is replying to, creating a threaded reply.
@@ -23745,7 +23386,7 @@ client.messages.list(
-client.messages.create(...) -> Message
+client.messages.retrieve(...) -> Message
-
@@ -23757,13 +23398,13 @@ client.messages.list(
-
-Send a new message in an experience chat, DM, or group chat channel. Supports text content, attachments, polls, and replies.
+Retrieves the details of an existing message.
Required permissions (one of):
- - `chat:message:create`
- - `dms:message:manage`
- - `livestream:chat:write`
- - `support_chat:message:create`
+ - `chat:read`
+ - `dms:read`
+ - `livestream:chat:read`
+ - `support_chat:read`
@@ -23786,9 +23427,8 @@ client = Whop(
environment=WhopEnvironment.DEFAULT,
)
-client.messages.create(
- channel_id="channel_id",
- content="content",
+client.messages.retrieve(
+ id="id",
)
```
@@ -23805,7 +23445,7 @@ client.messages.create(
-
-**channel_id:** `str` — The unique identifier of the channel or experience to send the message in. For example, 'exp_xxxxx' or 'feed_xxxxx'.
+**id:** `str` — The unique identifier of the message to retrieve.
@@ -23813,39 +23453,78 @@ client.messages.create(
-
-**content:** `str` — The body of the message in Markdown format. For example, 'Hello **world**'.
+**request_options:** `typing.Optional[RequestOptions]` — Request-specific configuration.
+
+
-
--
-**attachments:** `typing.Optional[typing.List[CreateMessagesRequestAttachmentsItem]]` — A list of file attachments to include with the message, such as images or videos.
-
+
+client.messages.delete(...) -> bool
-
-**auto_detect_links:** `typing.Optional[bool]` — Automatically detect URLs in the message and generate link previews.
-
+#### 📝 Description
+
+
+-
+
+
+-
+
+Permanently delete a message from an experience chat, DM, or group chat channel. Only the message author or a channel admin can delete a message.
+
+Required permissions (one of):
+ - `chat:message:create` and `chat:read`
+ - `dms:message:manage` and `dms:read`
+ - `livestream:chat:write` and `livestream:chat:read`
+ - `support_chat:message:create` and `support_chat:read`
+
+
+
+#### 🔌 Usage
-
-**poll:** `typing.Optional[CreateMessagesRequestPoll]` — A poll to attach to this message, allowing recipients to vote on options.
-
+
+-
+
+```python
+from whop_sdk import Whop
+from whop_sdk.environment import WhopEnvironment
+
+client = Whop(
+ token="",
+ environment=WhopEnvironment.DEFAULT,
+)
+
+client.messages.delete(
+ id="id",
+)
+
+```
+
+
+#### ⚙️ Parameters
+
-
-**replying_to_message_id:** `typing.Optional[str]` — The unique identifier of the message this is replying to, creating a threaded reply.
+
+-
+
+**id:** `str` — The unique identifier of the message to delete.
@@ -23865,7 +23544,7 @@ client.messages.create(
-client.messages.retrieve(...) -> Message
+client.messages.update(...) -> Message
-
@@ -23877,13 +23556,13 @@ client.messages.create(
-
-Retrieves the details of an existing message.
+Edit the content, attachments, or pinned status of an existing message in an experience chat, DM, or group chat channel.
Required permissions (one of):
- - `chat:read`
- - `dms:read`
- - `livestream:chat:read`
- - `support_chat:read`
+ - `chat:message:create`
+ - `dms:message:manage`
+ - `livestream:chat:write`
+ - `support_chat:message:create`
@@ -23906,7 +23585,7 @@ client = Whop(
environment=WhopEnvironment.DEFAULT,
)
-client.messages.retrieve(
+client.messages.update(
id="id",
)
@@ -23924,7 +23603,7 @@ client.messages.retrieve(
-
-**id:** `str` — The unique identifier of the message to retrieve.
+**id:** `str` — The unique identifier of the message to update.
@@ -23932,78 +23611,23 @@ client.messages.retrieve(
-
-**request_options:** `typing.Optional[RequestOptions]` — Request-specific configuration.
+**attachments:** `typing.Optional[typing.List[UpdateMessagesRequestAttachmentsItem]]` — A replacement list of file attachments for this message, such as images or videos.
-
-
-
-
-
-
-
-client.messages.delete(...) -> bool
-
-#### 📝 Description
-
-
--
-
-
--
-
-Permanently delete a message from an experience chat, DM, or group chat channel. Only the message author or a channel admin can delete a message.
-
-Required permissions (one of):
- - `chat:message:create` and `chat:read`
- - `dms:message:manage` and `dms:read`
- - `livestream:chat:write` and `livestream:chat:read`
- - `support_chat:message:create` and `support_chat:read`
-
-
-
-
-
-#### 🔌 Usage
-
-
--
-
-
--
-
-```python
-from whop_sdk import Whop
-from whop_sdk.environment import WhopEnvironment
-
-client = Whop(
- token="",
- environment=WhopEnvironment.DEFAULT,
-)
-
-client.messages.delete(
- id="id",
-)
-
-```
-
-
+**content:** `typing.Optional[str]` — The updated body of the message in Markdown format. For example, 'Hello **world**'.
+
-#### ⚙️ Parameters
-
-
--
-
-
-**id:** `str` — The unique identifier of the message to delete.
+**is_pinned:** `typing.Optional[bool]` — Whether this message should be pinned to the top of the channel.
@@ -24023,7 +23647,8 @@ client.messages.delete(
-client.messages.update(...) -> Message
+## Notifications
+client.notifications.list(...) -> ListNotificationsResponse
-
@@ -24035,13 +23660,7 @@ client.messages.delete(
-
-Edit the content, attachments, or pinned status of an existing message in an experience chat, DM, or group chat channel.
-
-Required permissions (one of):
- - `chat:message:create`
- - `dms:message:manage`
- - `livestream:chat:write`
- - `support_chat:message:create`
+Lists the authenticated user's notifications, newest first. Requires a user credential — an account API key has no notification feed. Without filters the feed spans every experience the user belongs to plus the teams they are a member of.
@@ -24064,9 +23683,7 @@ client = Whop(
environment=WhopEnvironment.DEFAULT,
)
-client.messages.update(
- id="id",
-)
+client.notifications.list()
```
@@ -24082,7 +23699,7 @@ client.messages.update(
-
-**id:** `str` — The unique identifier of the message to update.
+**unread:** `typing.Optional[bool]` — Only return notifications created since the user last viewed their source.
@@ -24090,7 +23707,7 @@ client.messages.update(
-
-**attachments:** `typing.Optional[typing.List[UpdateMessagesRequestAttachmentsItem]]` — A replacement list of file attachments for this message, such as images or videos.
+**experience_id:** `typing.Optional[str]` — Only return notifications from this experience (`exp_` tag).
@@ -24098,7 +23715,7 @@ client.messages.update(
-
-**content:** `typing.Optional[str]` — The updated body of the message in Markdown format. For example, 'Hello **world**'.
+**account_id:** `typing.Optional[str]` — Only return team notifications for this account (`biz_` tag).
@@ -24106,7 +23723,23 @@ client.messages.update(
-
-**is_pinned:** `typing.Optional[bool]` — Whether this message should be pinned to the top of the channel.
+**mentions:** `typing.Optional[bool]` — Only return notifications that mention the user directly.
+
+
+
+
+
+-
+
+**first:** `typing.Optional[int]` — The number of notifications to return (default 20, max 100).
+
+
+
+
+
+-
+
+**after:** `typing.Optional[str]` — A cursor (a notification `id` from a previous page); returns notifications older than it.
@@ -24126,8 +23759,7 @@ client.messages.update(
-## Notifications
-client.notifications.list(...) -> ListNotificationsResponse
+client.notifications.create(...) -> CreateNotificationsResponse
-
@@ -24139,7 +23771,7 @@ client.messages.update(
-
-Lists the authenticated user's notifications, newest first. Requires a user credential — an account API key has no notification feed. Without filters the feed spans every experience the user belongs to plus the teams they are a member of.
+Queues a notification to every user of an experience or to an account's team, processed asynchronously. Every send is attributed to an app: use an app API key, or a credential acting on behalf of an app. Narrow the audience with `user_ids` to send a mention.
@@ -24162,7 +23794,10 @@ client = Whop(
environment=WhopEnvironment.DEFAULT,
)
-client.notifications.list()
+client.notifications.create(
+ content="Drop off at 4180 Burnet Rd. Plan on two days for the full coating.",
+ title="Your ceramic coating is booked",
+)
```
@@ -24178,7 +23813,7 @@ client.notifications.list()
-
-**unread:** `typing.Optional[bool]` — Only return notifications created since the user last viewed their source.
+**content:** `str` — Main body text of the notification.
@@ -24186,7 +23821,7 @@ client.notifications.list()
-
-**experience_id:** `typing.Optional[str]` — Only return notifications from this experience (`exp_` tag).
+**title:** `str` — Headline text of the notification.
@@ -24194,7 +23829,7 @@ client.notifications.list()
-
-**account_id:** `typing.Optional[str]` — Only return team notifications for this account (`biz_` tag).
+**account_id:** `typing.Optional[str]` — Account whose team members receive the notification (`biz_` tag). Exactly one of `experience_id` or `account_id` is required.
@@ -24202,7 +23837,7 @@ client.notifications.list()
-
-**mentions:** `typing.Optional[bool]` — Only return notifications that mention the user directly.
+**experience_id:** `typing.Optional[str]` — Experience whose users receive the notification (`exp_` tag). Exactly one of `experience_id` or `account_id` is required.
@@ -24210,7 +23845,7 @@ client.notifications.list()
-
-**first:** `typing.Optional[int]` — The number of notifications to return (default 20, max 100).
+**icon_user_id:** `typing.Optional[str]` — User whose profile picture is used as the notification icon. Defaults to the experience or account avatar.
@@ -24218,7 +23853,23 @@ client.notifications.list()
-
-**after:** `typing.Optional[str]` — A cursor (a notification `id` from a previous page); returns notifications older than it.
+**rest_path:** `typing.Optional[str]` — Path segment appended to the generated deep link that opens your app, for example `/settings/billing`.
+
+
+
+
+
+-
+
+**subtitle:** `typing.Optional[str]` — Optional secondary line displayed below the title.
+
+
+
+
+
+-
+
+**user_ids:** `typing.Optional[typing.List[str]]` — Optional `user_` tags narrowing the audience. When provided, only these users are notified (as a mention), provided they are in the targeted experience or account.
@@ -24238,7 +23889,7 @@ client.notifications.list()
-client.notifications.create(...) -> CreateNotificationsResponse
+client.notifications.badges(...) -> BadgesNotificationsResponse
-
@@ -24250,7 +23901,7 @@ client.notifications.list()
-
-Queues a notification to every user of an experience or to an account's team, processed asynchronously. Every send is attributed to an app: use an app API key, or a credential acting on behalf of an app. Narrow the audience with `user_ids` to send a mention.
+Lists the authenticated user's per-experience unread badge state. Requires a user credential. Returns one row per experience the user belongs to (or per requested experience).
@@ -24273,9 +23924,10 @@ client = Whop(
environment=WhopEnvironment.DEFAULT,
)
-client.notifications.create(
- content="Drop off at 4180 Burnet Rd. Plan on two days for the full coating.",
- title="Your ceramic coating is booked",
+client.notifications.badges(
+ experience_ids=[
+ "exp_xxxxxxxxxxxxxx"
+ ],
)
```
@@ -24292,7 +23944,7 @@ client.notifications.create(
-
-**content:** `str` — Main body text of the notification.
+**experience_ids:** `typing.Optional[typing.Union[str, typing.Sequence[str]]]` — Only return badges for these experiences (`exp_` tags).
@@ -24300,7 +23952,7 @@ client.notifications.create(
-
-**title:** `str` — Headline text of the notification.
+**last_fetched_at:** `typing.Optional[str]` — The client's last fetched-at ISO 8601 timestamp, used to partially refresh badges after a websocket message.
@@ -24308,39 +23960,70 @@ client.notifications.create(
-
-**account_id:** `typing.Optional[str]` — Account whose team members receive the notification (`biz_` tag). Exactly one of `experience_id` or `account_id` is required.
+**request_options:** `typing.Optional[RequestOptions]` — Request-specific configuration.
+
+
-
--
-**experience_id:** `typing.Optional[str]` — Experience whose users receive the notification (`exp_` tag). Exactly one of `experience_id` or `account_id` is required.
-
+
+client.notifications.mark_read(...) -> MarkReadNotificationsResponse
-
-**icon_user_id:** `typing.Optional[str]` — User whose profile picture is used as the notification icon. Defaults to the experience or account avatar.
-
+#### 📝 Description
+
+
+-
+
+
+-
+
+Marks the authenticated user's notifications as read: one experience's (`experience_id`) or everything (`all: true`) — exactly one of the two. Requires a user credential. Responds with the refreshed badge rows for the affected scope.
+
+
+#### 🔌 Usage
+
-
-**rest_path:** `typing.Optional[str]` — Path segment appended to the generated deep link that opens your app, for example `/settings/billing`.
-
+
+-
+
+```python
+from whop_sdk import Whop
+from whop_sdk.environment import WhopEnvironment
+
+client = Whop(
+ token="",
+ environment=WhopEnvironment.DEFAULT,
+)
+
+client.notifications.mark_read()
+
+```
+
+
+#### ⚙️ Parameters
+
-
-**subtitle:** `typing.Optional[str]` — Optional secondary line displayed below the title.
+
+-
+
+**all:** `typing.Optional[bool]` — Pass `true` to mark every notification read. Exactly one of `experience_id` or `all` is required.
@@ -24348,7 +24031,7 @@ client.notifications.create(
-
-**user_ids:** `typing.Optional[typing.List[str]]` — Optional `user_` tags narrowing the audience. When provided, only these users are notified (as a mention), provided they are in the targeted experience or account.
+**experience_id:** `typing.Optional[str]` — Experience to mark read (`exp_` tag). Exactly one of `experience_id` or `all` is required.
@@ -24368,7 +24051,7 @@ client.notifications.create(
-client.notifications.badges(...) -> BadgesNotificationsResponse
+client.notifications.retrieve(...) -> Notification
-
@@ -24380,7 +24063,7 @@ client.notifications.create(
-
-Lists the authenticated user's per-experience unread badge state. Requires a user credential. Returns one row per experience the user belongs to (or per requested experience).
+Retrieves a single notification by id — either an `id` returned by List Notifications, or the ephemeral id delivered with a push/websocket event. Requires a user credential.
@@ -24403,10 +24086,8 @@ client = Whop(
environment=WhopEnvironment.DEFAULT,
)
-client.notifications.badges(
- experience_ids=[
- "exp_xxxxxxxxxxxxxx"
- ],
+client.notifications.retrieve(
+ id="id",
)
```
@@ -24423,15 +24104,7 @@ client.notifications.badges(
-
-**experience_ids:** `typing.Optional[typing.Union[str, typing.Sequence[str]]]` — Only return badges for these experiences (`exp_` tags).
-
-
-
-
-
--
-
-**last_fetched_at:** `typing.Optional[str]` — The client's last fetched-at ISO 8601 timestamp, used to partially refresh badges after a websocket message.
+**id:** `str` — A notification `id` from List Notifications, or the id delivered with a push/websocket event.
@@ -24451,7 +24124,8 @@ client.notifications.badges(
-client.notifications.mark_read(...) -> MarkReadNotificationsResponse
+## Partners
+client.partners.create() -> CreatePartnersResponse
-
@@ -24463,7 +24137,7 @@ client.notifications.badges(
-
-Marks the authenticated user's notifications as read: one experience's (`experience_id`) or everything (`all: true`) — exactly one of the two. Requires a user credential. Responds with the refreshed badge rows for the affected scope.
+Enrolls the calling user in the Whop partner program, making their partner businesses eligible for earnings. Idempotent — enrolling again keeps the original enrollment time.
@@ -24486,7 +24160,7 @@ client = Whop(
environment=WhopEnvironment.DEFAULT,
)
-client.notifications.mark_read()
+client.partners.create()
```
@@ -24502,22 +24176,6 @@ client.notifications.mark_read()
-
-**all:** `typing.Optional[bool]` — Pass `true` to mark every notification read. Exactly one of `experience_id` or `all` is required.
-
-
-
-
-
--
-
-**experience_id:** `typing.Optional[str]` — Experience to mark read (`exp_` tag). Exactly one of `experience_id` or `all` is required.
-
-
-
-
-
--
-
**request_options:** `typing.Optional[RequestOptions]` — Request-specific configuration.
@@ -24530,7 +24188,7 @@ client.notifications.mark_read()
-client.notifications.retrieve(...) -> Notification
+client.partners.leaderboard(...) -> LeaderboardPartnersResponse
-
@@ -24542,7 +24200,7 @@ client.notifications.mark_read()
-
-Retrieves a single notification by id — either an `id` returned by List Notifications, or the ephemeral id delivered with a push/websocket event. Requires a user credential.
+Ranks referrers by partner business earnings — all-time by default, or over the current day, month, year, or trailing 30 days. Authentication is optional: authenticated callers also get their own standing, anonymous callers get the rankings alone.
@@ -24565,9 +24223,7 @@ client = Whop(
environment=WhopEnvironment.DEFAULT,
)
-client.notifications.retrieve(
- id="id",
-)
+client.partners.leaderboard()
```
@@ -24583,7 +24239,7 @@ client.notifications.retrieve(
-
-**id:** `str` — A notification `id` from List Notifications, or the id delivered with a push/websocket event.
+**period:** `typing.Optional[LeaderboardPartnersRequestPeriod]` — Time window for the rankings. `day`, `month`, and `year` count earnings since the start of the current calendar day, month, or year; `last_30_days` counts earnings over the trailing 30 days; `all_time` ranks lifetime earnings.
@@ -24603,8 +24259,7 @@ client.notifications.retrieve(
-## Partners
-client.partners.create() -> CreatePartnersResponse
+client.partners.retrieve_link(...) -> OnboardingReward
-
@@ -24616,7 +24271,7 @@ client.notifications.retrieve(
-
-Enrolls the calling user in the Whop partner program, making their partner businesses eligible for earnings. Idempotent — enrolling again keeps the original enrollment time.
+Resolves the public reward terms and whether redemption capacity remains. Immediate rewards claim capacity at business creation; qualified rewards claim it when the business reaches the threshold.
@@ -24639,7 +24294,10 @@ client = Whop(
environment=WhopEnvironment.DEFAULT,
)
-client.partners.create()
+client.partners.retrieve_link(
+ partner_username="partner_username",
+ reward_slug="reward_slug",
+)
```
@@ -24655,70 +24313,15 @@ client.partners.create()
-
-**request_options:** `typing.Optional[RequestOptions]` — Request-specific configuration.
+**partner_username:** `str` — Username from the partner link's `a` query parameter.
-
-
-
-
-
-
-
-
-client.partners.leaderboard(...) -> LeaderboardPartnersResponse
-
--
-
-#### 📝 Description
-
-
--
-
-Ranks referrers by partner business earnings — all-time by default, or over the current day, month, year, or trailing 30 days. Authentication is optional: authenticated callers also get their own standing, anonymous callers get the rankings alone.
-
-
-
-
-
-#### 🔌 Usage
-
-
--
-
-
--
-
-```python
-from whop_sdk import Whop
-from whop_sdk.environment import WhopEnvironment
-
-client = Whop(
- token="",
- environment=WhopEnvironment.DEFAULT,
-)
-
-client.partners.leaderboard()
-
-```
-
-
-
-
-
-#### ⚙️ Parameters
-
-
--
-
-
--
-
-**period:** `typing.Optional[LeaderboardPartnersRequestPeriod]` — Time window for the rankings. `day`, `month`, and `year` count earnings since the start of the current calendar day, month, or year; `last_30_days` counts earnings over the trailing 30 days; `all_time` ranks lifetime earnings.
+**reward_slug:** `str` — Reward slug from the partner link's `reward` query parameter.
@@ -25070,7 +24673,7 @@ client.payment_method_domains.create(
-
-**account_id:** `typing.Optional[str]` — Account to register the domain for (`biz_` tag). Defaults to the caller's account.
+**account_id:** `typing.Optional[str]` — Account to register the domain for (`biz_` tag). Required when authenticating as a user; an account API key supplies its own account.
@@ -26496,6 +26099,79 @@ client.payments.void(
+
+
+
+
+client.payments.resume(...) -> PaymentStatus
+
+-
+
+#### 📝 Description
+
+
+-
+
+
+-
+
+Starts a fresh on-session attempt with the saved card for a subscription renewal that is waiting on the customer to authenticate; the bank's step then arrives in `next_action` on the following status reads. Only the payment's own customer may call it — with the payment's `client_secret` or their own session — and it is a no-op for any payment that is not a parked renewal.
+
+
+
+
+
+#### 🔌 Usage
+
+
+-
+
+
+-
+
+```python
+from whop_sdk import Whop
+from whop_sdk.environment import WhopEnvironment
+
+client = Whop(
+ token="",
+ environment=WhopEnvironment.DEFAULT,
+)
+
+client.payments.resume(
+ payment_id="payment_id",
+)
+
+```
+
+
+
+
+
+#### ⚙️ Parameters
+
+
+-
+
+
+-
+
+**payment_id:** `str` — The unique identifier of the payment.
+
+
+
+
+
+-
+
+**request_options:** `typing.Optional[RequestOptions]` — Request-specific configuration.
+
+
+
+
+
+
+
@@ -28223,7 +27899,7 @@ client.plans.create()
-
-**account_id:** `typing.Optional[str]` — The unique identifier of the account to create this plan for. Defaults to the caller's account.
+**account_id:** `typing.Optional[str]` — The unique identifier of the account to create this plan for. Required when authenticating as a user; an account API key supplies its own account.
@@ -28295,7 +27971,7 @@ client.plans.create()
-
-**initial_price:** `typing.Optional[float]` — Initial amount charged in the plan's currency, e.g. 10.43 for $10.43.
+**initial_price:** `typing.Optional[float]` — Initial amount charged in the plan's currency, e.g. 10.43 for $10.43. A paid fiat plan charges at least 1.00 in its currency; use 0 for free.
@@ -28359,7 +28035,7 @@ client.plans.create()
-
-**renewal_price:** `typing.Optional[float]` — The amount charged each billing period for recurring plans, in the plan's currency.
+**renewal_price:** `typing.Optional[float]` — The amount charged each billing period for recurring plans, in the plan's currency. A paid fiat plan charges at least 1.00 in its currency.
@@ -28722,7 +28398,7 @@ client.plans.update(
-
-**initial_price:** `typing.Optional[float]` — Initial amount charged in the plan's currency, e.g. 10.43 for $10.43.
+**initial_price:** `typing.Optional[float]` — Initial amount charged in the plan's currency, e.g. 10.43 for $10.43. A paid fiat plan charges at least 1.00 in its currency; use 0 for free.
@@ -28778,7 +28454,7 @@ client.plans.update(
-
-**renewal_price:** `typing.Optional[float]` — The amount charged each billing period for recurring plans, in the plan's currency.
+**renewal_price:** `typing.Optional[float]` — The amount charged each billing period for recurring plans, in the plan's currency. A paid fiat plan charges at least 1.00 in its currency.
@@ -29691,7 +29367,7 @@ client.products.update(
-
-Submits a product to the whop.com marketplace for review. The product moves to `pending_review`; a Whop reviewer approves it before it goes live.
+Submits a product to the whop.com marketplace for review. The product moves to `pending_review`; a Whop reviewer approves it before it goes live. Requires a logo, a headline, and at least one gallery image or video; the request fails naming whichever is missing.
@@ -36549,6 +36225,22 @@ client.transfers.create(
-
+**feed_id:** `typing.Optional[str]` — Ledger transfers only. The feed the transfer was initiated from. Given with `feed_type`, the payment receipt posts into that feed instead of a direct message.
+
+
+
+
+
+-
+
+**feed_type:** `typing.Optional[CreateTransfersRequestFeedType]` — Ledger transfers only. The type of the feed named by `feed_id`.
+
+
+
+
+
+-
+
**idempotence_key:** `typing.Optional[str]` — Ledger transfers and wallet sends. A unique key that makes retries safe. Retrying with the same key returns the original transfer, or attaches to the original wallet send, instead of moving money twice.
@@ -38696,116 +38388,6 @@ client.webhooks.test(
-
-
-
-
-client.webhooks.deliveries_webhook(...) -> DeliveriesWebhookResponse
-
--
-
-#### 📝 Description
-
-
--
-
-
--
-
-Returns a paginated list of delivery attempts for a webhook, ordered by most recent first. Includes the request payload, response body, response code, and timing for each attempt.
-
-Required permissions:
- - `developer:manage_webhook`
-
-
-
-
-
-#### 🔌 Usage
-
-
--
-
-
--
-
-```python
-from whop_sdk import Whop
-from whop_sdk.environment import WhopEnvironment
-
-client = Whop(
- token="",
- environment=WhopEnvironment.DEFAULT,
-)
-
-client.webhooks.deliveries_webhook(
- webhook_id="webhook_id",
- first=42,
- last=42,
-)
-
-```
-
-
-
-
-
-#### ⚙️ Parameters
-
-
--
-
-
--
-
-**webhook_id:** `str` — The unique identifier of the webhook to list deliveries for.
-
-
-
-
-
--
-
-**after:** `typing.Optional[str]` — Returns the elements in the list that come after the specified cursor.
-
-
-
-
-
--
-
-**before:** `typing.Optional[str]` — Returns the elements in the list that come before the specified cursor.
-
-
-
-
-
--
-
-**first:** `typing.Optional[int]` — Returns the first _n_ elements from the list.
-
-
-
-
-
--
-
-**last:** `typing.Optional[int]` — Returns the last _n_ elements from the list.
-
-
-
-
-
--
-
-**request_options:** `typing.Optional[RequestOptions]` — Request-specific configuration.
-
-
-
-
-
-
-
@@ -41937,7 +41519,7 @@ client.users.preferences.update()
Sets the authenticated user's notification preferences. Each preference is addressed by `scope`, not by id, so a scope read back from either list endpoint can be sent straight here.
-A scope naming an experience with no topic sets that experience's level, and accepts all three levels. Any other scope sets a topic override, which is binary — `all` or `nothing` — and requires a `channel`.
+A scope naming an experience with no topic sets that experience's level, and accepts all three levels. Any other scope sets a topic override, which is binary — `all` or `nothing`. A topic override with no `channel` applies to every delivery channel.
`level: null` clears the preference. Preferences are stored as overrides, so clearing one means the scope inherits its default again rather than being switched off.
diff --git a/src/whop_sdk/__init__.py b/src/whop_sdk/__init__.py
index 85b38d8e..dcf29673 100644
--- a/src/whop_sdk/__init__.py
+++ b/src/whop_sdk/__init__.py
@@ -181,6 +181,7 @@
AffiliateUser,
AffiliatesSortableColumns,
AiChat,
+ AiChatAgentIdentifiers,
AiChatListItem,
AiChatListItemUser,
AiChatMessageSourceTypes,
@@ -230,6 +231,21 @@
AppViewTypes,
Audience,
AudienceAudienceType,
+ AudienceEngagement,
+ AudienceEngagementFacebookPageRule,
+ AudienceEngagementFacebookPageRuleEvent,
+ AudienceEngagementInstagramProfileRule,
+ AudienceEngagementInstagramProfileRuleEvent,
+ AudienceEngagementLeadFormRule,
+ AudienceEngagementLeadFormRuleEvent,
+ AudienceEngagementPlatform,
+ AudienceEngagementRule,
+ AudienceEngagementRule_FacebookPage,
+ AudienceEngagementRule_InstagramProfile,
+ AudienceEngagementRule_LeadForm,
+ AudienceEngagementRule_Video,
+ AudienceEngagementVideoRule,
+ AudienceEngagementVideoRuleEvent,
AudienceMatchRate,
AudienceMatchRatePlatform,
AudienceMatchRateStatus,
@@ -666,6 +682,10 @@
NotificationTopicSummaryTopicType,
NotificationTopicTopicType,
OauthGrant,
+ OnboardingReward,
+ OnboardingRewardQualificationIncomeSource,
+ OnboardingRewardRewardType,
+ OnboardingRewardStatus,
PageInfo,
Pagination,
Passkey,
@@ -967,6 +987,7 @@
ReceiptStatus,
ReceiptTaxBehaviors,
ReceiptV2Order,
+ RecommendedAction,
RecommendedActionExecution,
RecommendedActionExecutionStatus,
Refund,
@@ -1016,6 +1037,7 @@
ResolutionEvent,
ResolutionEventAction,
ResolutionEventReporterType,
+ ResolutionLineItem,
ResolutionPayment,
Review,
ReviewAttachmentsItem,
@@ -1297,7 +1319,28 @@
ListAdCampaignsResponsePageInfo,
PostAdCampaignPaymentFailedPayload,
PostAdCampaignPaymentFailedPayloadApiVersion,
+ PostAdCampaignPaymentFailedPayloadData,
+ PostAdCampaignPaymentFailedPayloadDataBidType,
+ PostAdCampaignPaymentFailedPayloadDataBudgetOptimization,
+ PostAdCampaignPaymentFailedPayloadDataBudgetType,
+ PostAdCampaignPaymentFailedPayloadDataDeliveryStatus,
+ PostAdCampaignPaymentFailedPayloadDataObjective,
+ PostAdCampaignPaymentFailedPayloadDataPlatform,
+ PostAdCampaignPaymentFailedPayloadDataSpecialAdCategoriesItem,
+ PostAdCampaignPaymentFailedPayloadDataStatus,
PostAdCampaignPaymentFailedPayloadType,
+ PostAdCampaignUpdatedPayload,
+ PostAdCampaignUpdatedPayloadApiVersion,
+ PostAdCampaignUpdatedPayloadData,
+ PostAdCampaignUpdatedPayloadDataBidType,
+ PostAdCampaignUpdatedPayloadDataBudgetOptimization,
+ PostAdCampaignUpdatedPayloadDataBudgetType,
+ PostAdCampaignUpdatedPayloadDataDeliveryStatus,
+ PostAdCampaignUpdatedPayloadDataObjective,
+ PostAdCampaignUpdatedPayloadDataPlatform,
+ PostAdCampaignUpdatedPayloadDataSpecialAdCategoriesItem,
+ PostAdCampaignUpdatedPayloadDataStatus,
+ PostAdCampaignUpdatedPayloadType,
RetrieveAdCampaignsRequestAttributionModel,
UpdateAdCampaignsRequestBidType,
UpdateAdCampaignsRequestBudgetOptimization,
@@ -1374,6 +1417,14 @@
ListAdsRequestStatus,
ListAdsResponse,
ListAdsResponsePageInfo,
+ PostAdUpdatedPayload,
+ PostAdUpdatedPayloadApiVersion,
+ PostAdUpdatedPayloadData,
+ PostAdUpdatedPayloadDataCallToAction,
+ PostAdUpdatedPayloadDataDeliveryStatus,
+ PostAdUpdatedPayloadDataPostSource,
+ PostAdUpdatedPayloadDataStatus,
+ PostAdUpdatedPayloadType,
RetrieveAdsRequestAttributionModel,
UpdateAdsRequestCallToAction,
UpdateAdsRequestCreativesItem,
@@ -1457,12 +1508,14 @@
UpdateAppsRequestIcon,
UpdateAppsRequestOauthClientType,
UpdateAppsRequestStatus,
- UpdatePermissionsAppRequestRequestedPermissionsItem,
UpdatePermissionsAppsRequestRequestedPermissionsItem,
)
from .audiences import (
CreateAudiencesRequestAudienceType,
CreateAudiencesRequestColumnMapping,
+ CreateAudiencesRequestEngagement,
+ CreateAudiencesRequestEngagementPlatform,
+ CreateAudiencesRequestSourceType,
CreateAudiencesResponse,
CreateAudiencesResponseData,
DeleteAudiencesResponse,
@@ -1616,6 +1669,7 @@
RetrieveCardsResponseStatus,
RetrieveCardsResponseType,
UpdateCardsRequestBilling,
+ UpdateCardsRequestCardholder,
UpdateCardsRequestSpendLimitFrequency,
UpdateCardsResponse,
UpdateCardsResponseBilling,
@@ -1695,6 +1749,7 @@
CreateConfirmationTokensRequestPaymentMethodGooglePay,
CreateConfirmationTokensRequestPaymentMethodPayerDocument,
CreateConfirmationTokensRequestPaymentMethodPayerDocumentType,
+ CreateConfirmationTokensRequestPaymentMethodRedirect,
CreateConfirmationTokensRequestPaymentMethodSaved,
CreateConfirmationTokensRequestSetupFutureUsage,
)
@@ -1775,10 +1830,6 @@
UpdateDisputesRequestEvidenceCustomerCommunicationAttachment,
UpdateDisputesRequestEvidenceRefundPolicyAttachment,
UpdateDisputesRequestEvidenceUncategorizedAttachment,
- UpdateEvidenceDisputeRequestCancellationPolicyAttachment,
- UpdateEvidenceDisputeRequestCustomerCommunicationAttachment,
- UpdateEvidenceDisputeRequestRefundPolicyAttachment,
- UpdateEvidenceDisputeRequestUncategorizedAttachment,
UploadEvidenceDisputesRequestDocumentsItem,
UploadEvidenceDisputesRequestDocumentsItemDocumentType,
)
@@ -2461,6 +2512,7 @@
UpdateTeamMembersRequestRole,
)
from .transfers import (
+ CreateTransfersRequestFeedType,
CreateTransfersRequestType,
CreateTransfersResponse,
CreateTransfersResponseClaimLink,
@@ -2649,9 +2701,6 @@
from .webhooks import (
CreateWebhooksRequestEventsItem,
DeleteWebhooksResponse,
- DeliveriesWebhookResponse,
- DeliveriesWebhookResponseDataItem,
- DeliveriesWebhookResponsePageInfo,
ListDeliveriesWebhooksResponse,
ListDeliveriesWebhooksResponsePageInfo,
ListWebhooksResponse,
@@ -2837,6 +2886,7 @@
"AffiliateUser": ".types",
"AffiliatesSortableColumns": ".types",
"AiChat": ".types",
+ "AiChatAgentIdentifiers": ".types",
"AiChatListItem": ".types",
"AiChatListItemUser": ".types",
"AiChatMessageSourceTypes": ".types",
@@ -2889,6 +2939,21 @@
"AsyncWhop": ".client",
"Audience": ".types",
"AudienceAudienceType": ".types",
+ "AudienceEngagement": ".types",
+ "AudienceEngagementFacebookPageRule": ".types",
+ "AudienceEngagementFacebookPageRuleEvent": ".types",
+ "AudienceEngagementInstagramProfileRule": ".types",
+ "AudienceEngagementInstagramProfileRuleEvent": ".types",
+ "AudienceEngagementLeadFormRule": ".types",
+ "AudienceEngagementLeadFormRuleEvent": ".types",
+ "AudienceEngagementPlatform": ".types",
+ "AudienceEngagementRule": ".types",
+ "AudienceEngagementRule_FacebookPage": ".types",
+ "AudienceEngagementRule_InstagramProfile": ".types",
+ "AudienceEngagementRule_LeadForm": ".types",
+ "AudienceEngagementRule_Video": ".types",
+ "AudienceEngagementVideoRule": ".types",
+ "AudienceEngagementVideoRuleEvent": ".types",
"AudienceMatchRate": ".types",
"AudienceMatchRatePlatform": ".types",
"AudienceMatchRateStatus": ".types",
@@ -3092,6 +3157,9 @@
"CreateAppsRequestIcon": ".apps",
"CreateAudiencesRequestAudienceType": ".audiences",
"CreateAudiencesRequestColumnMapping": ".audiences",
+ "CreateAudiencesRequestEngagement": ".audiences",
+ "CreateAudiencesRequestEngagementPlatform": ".audiences",
+ "CreateAudiencesRequestSourceType": ".audiences",
"CreateAudiencesResponse": ".audiences",
"CreateAudiencesResponseData": ".audiences",
"CreateAuthorizedUsersRequestElevation": ".authorized_users",
@@ -3147,6 +3215,7 @@
"CreateConfirmationTokensRequestPaymentMethodGooglePay": ".confirmation_tokens",
"CreateConfirmationTokensRequestPaymentMethodPayerDocument": ".confirmation_tokens",
"CreateConfirmationTokensRequestPaymentMethodPayerDocumentType": ".confirmation_tokens",
+ "CreateConfirmationTokensRequestPaymentMethodRedirect": ".confirmation_tokens",
"CreateConfirmationTokensRequestPaymentMethodSaved": ".confirmation_tokens",
"CreateConfirmationTokensRequestSetupFutureUsage": ".confirmation_tokens",
"CreateCourseLessonsRequestThumbnail": ".course_lessons",
@@ -3242,6 +3311,7 @@
"CreateSwapsResponseStatus": ".swaps",
"CreateSwapsResponseToToken": ".swaps",
"CreateTeamMembersRequestRole": ".team_members",
+ "CreateTransfersRequestFeedType": ".transfers",
"CreateTransfersRequestType": ".transfers",
"CreateTransfersResponse": ".transfers",
"CreateTransfersResponseClaimLink": ".transfers",
@@ -3304,9 +3374,6 @@
"DeleteSocialAccountsResponse": ".social_accounts",
"DeleteTeamMembersResponse": ".team_members",
"DeleteWebhooksResponse": ".webhooks",
- "DeliveriesWebhookResponse": ".webhooks",
- "DeliveriesWebhookResponseDataItem": ".webhooks",
- "DeliveriesWebhookResponsePageInfo": ".webhooks",
"DenyResolutionCenterCasesRequestAttachmentsItem": ".resolution_center_cases",
"DescribeStatsResponse": ".stats",
"DescribeStatsResponseDescribeMetric": ".types",
@@ -3975,6 +4042,10 @@
"NotificationTopicSummaryTopicType": ".types",
"NotificationTopicTopicType": ".types",
"OauthGrant": ".types",
+ "OnboardingReward": ".types",
+ "OnboardingRewardQualificationIncomeSource": ".types",
+ "OnboardingRewardRewardType": ".types",
+ "OnboardingRewardStatus": ".types",
"PageInfo": ".types",
"Pagination": ".types",
"Passkey": ".types",
@@ -4242,7 +4313,36 @@
"PostAccountUpdatedPayloadType": ".accounts",
"PostAdCampaignPaymentFailedPayload": ".ad_campaigns",
"PostAdCampaignPaymentFailedPayloadApiVersion": ".ad_campaigns",
+ "PostAdCampaignPaymentFailedPayloadData": ".ad_campaigns",
+ "PostAdCampaignPaymentFailedPayloadDataBidType": ".ad_campaigns",
+ "PostAdCampaignPaymentFailedPayloadDataBudgetOptimization": ".ad_campaigns",
+ "PostAdCampaignPaymentFailedPayloadDataBudgetType": ".ad_campaigns",
+ "PostAdCampaignPaymentFailedPayloadDataDeliveryStatus": ".ad_campaigns",
+ "PostAdCampaignPaymentFailedPayloadDataObjective": ".ad_campaigns",
+ "PostAdCampaignPaymentFailedPayloadDataPlatform": ".ad_campaigns",
+ "PostAdCampaignPaymentFailedPayloadDataSpecialAdCategoriesItem": ".ad_campaigns",
+ "PostAdCampaignPaymentFailedPayloadDataStatus": ".ad_campaigns",
"PostAdCampaignPaymentFailedPayloadType": ".ad_campaigns",
+ "PostAdCampaignUpdatedPayload": ".ad_campaigns",
+ "PostAdCampaignUpdatedPayloadApiVersion": ".ad_campaigns",
+ "PostAdCampaignUpdatedPayloadData": ".ad_campaigns",
+ "PostAdCampaignUpdatedPayloadDataBidType": ".ad_campaigns",
+ "PostAdCampaignUpdatedPayloadDataBudgetOptimization": ".ad_campaigns",
+ "PostAdCampaignUpdatedPayloadDataBudgetType": ".ad_campaigns",
+ "PostAdCampaignUpdatedPayloadDataDeliveryStatus": ".ad_campaigns",
+ "PostAdCampaignUpdatedPayloadDataObjective": ".ad_campaigns",
+ "PostAdCampaignUpdatedPayloadDataPlatform": ".ad_campaigns",
+ "PostAdCampaignUpdatedPayloadDataSpecialAdCategoriesItem": ".ad_campaigns",
+ "PostAdCampaignUpdatedPayloadDataStatus": ".ad_campaigns",
+ "PostAdCampaignUpdatedPayloadType": ".ad_campaigns",
+ "PostAdUpdatedPayload": ".ads",
+ "PostAdUpdatedPayloadApiVersion": ".ads",
+ "PostAdUpdatedPayloadData": ".ads",
+ "PostAdUpdatedPayloadDataCallToAction": ".ads",
+ "PostAdUpdatedPayloadDataDeliveryStatus": ".ads",
+ "PostAdUpdatedPayloadDataPostSource": ".ads",
+ "PostAdUpdatedPayloadDataStatus": ".ads",
+ "PostAdUpdatedPayloadType": ".ads",
"PostCardApplicationApprovedPayload": ".cards",
"PostCardApplicationApprovedPayloadApiVersion": ".cards",
"PostCardApplicationApprovedPayloadData": ".cards",
@@ -4651,6 +4751,7 @@
"ReceiptTaxBehaviors": ".types",
"ReceiptV2Order": ".types",
"RecommendActionsUsersResponse": ".users",
+ "RecommendedAction": ".types",
"RecommendedActionExecution": ".types",
"RecommendedActionExecutionStatus": ".types",
"ReferredUsersPartnersResponse": ".partners",
@@ -4709,6 +4810,7 @@
"ResolutionEvent": ".types",
"ResolutionEventAction": ".types",
"ResolutionEventReporterType": ".types",
+ "ResolutionLineItem": ".types",
"ResolutionPayment": ".types",
"RetrieveAdCampaignsRequestAttributionModel": ".ad_campaigns",
"RetrieveAdGroupsRequestAttributionModel": ".ad_groups",
@@ -5001,6 +5103,7 @@
"UpdateBountiesRequestBusinessGoalType": ".bounties",
"UpdateBountiesRequestFrequency": ".bounties",
"UpdateCardsRequestBilling": ".cards",
+ "UpdateCardsRequestCardholder": ".cards",
"UpdateCardsRequestSpendLimitFrequency": ".cards",
"UpdateCardsResponse": ".cards",
"UpdateCardsResponseBilling": ".cards",
@@ -5025,10 +5128,6 @@
"UpdateDisputesRequestEvidenceCustomerCommunicationAttachment": ".disputes",
"UpdateDisputesRequestEvidenceRefundPolicyAttachment": ".disputes",
"UpdateDisputesRequestEvidenceUncategorizedAttachment": ".disputes",
- "UpdateEvidenceDisputeRequestCancellationPolicyAttachment": ".disputes",
- "UpdateEvidenceDisputeRequestCustomerCommunicationAttachment": ".disputes",
- "UpdateEvidenceDisputeRequestRefundPolicyAttachment": ".disputes",
- "UpdateEvidenceDisputeRequestUncategorizedAttachment": ".disputes",
"UpdateExperiencesRequestLogo": ".experiences",
"UpdateForumPostsRequestAttachmentsItem": ".forum_posts",
"UpdateForumsRequestBannerImage": ".forums",
@@ -5040,7 +5139,6 @@
"UpdateMeUsersRequestBanner": ".users",
"UpdateMeUsersRequestProfilePicture": ".users",
"UpdateMessagesRequestAttachmentsItem": ".messages",
- "UpdatePermissionsAppRequestRequestedPermissionsItem": ".apps",
"UpdatePermissionsAppsRequestRequestedPermissionsItem": ".apps",
"UpdatePlansRequestCustomFieldsItem": ".plans",
"UpdatePlansRequestCustomFieldsItemFieldType": ".plans",
@@ -5402,6 +5500,7 @@ def __dir__():
"AffiliateUser",
"AffiliatesSortableColumns",
"AiChat",
+ "AiChatAgentIdentifiers",
"AiChatListItem",
"AiChatListItemUser",
"AiChatMessageSourceTypes",
@@ -5454,6 +5553,21 @@ def __dir__():
"AsyncWhop",
"Audience",
"AudienceAudienceType",
+ "AudienceEngagement",
+ "AudienceEngagementFacebookPageRule",
+ "AudienceEngagementFacebookPageRuleEvent",
+ "AudienceEngagementInstagramProfileRule",
+ "AudienceEngagementInstagramProfileRuleEvent",
+ "AudienceEngagementLeadFormRule",
+ "AudienceEngagementLeadFormRuleEvent",
+ "AudienceEngagementPlatform",
+ "AudienceEngagementRule",
+ "AudienceEngagementRule_FacebookPage",
+ "AudienceEngagementRule_InstagramProfile",
+ "AudienceEngagementRule_LeadForm",
+ "AudienceEngagementRule_Video",
+ "AudienceEngagementVideoRule",
+ "AudienceEngagementVideoRuleEvent",
"AudienceMatchRate",
"AudienceMatchRatePlatform",
"AudienceMatchRateStatus",
@@ -5657,6 +5771,9 @@ def __dir__():
"CreateAppsRequestIcon",
"CreateAudiencesRequestAudienceType",
"CreateAudiencesRequestColumnMapping",
+ "CreateAudiencesRequestEngagement",
+ "CreateAudiencesRequestEngagementPlatform",
+ "CreateAudiencesRequestSourceType",
"CreateAudiencesResponse",
"CreateAudiencesResponseData",
"CreateAuthorizedUsersRequestElevation",
@@ -5712,6 +5829,7 @@ def __dir__():
"CreateConfirmationTokensRequestPaymentMethodGooglePay",
"CreateConfirmationTokensRequestPaymentMethodPayerDocument",
"CreateConfirmationTokensRequestPaymentMethodPayerDocumentType",
+ "CreateConfirmationTokensRequestPaymentMethodRedirect",
"CreateConfirmationTokensRequestPaymentMethodSaved",
"CreateConfirmationTokensRequestSetupFutureUsage",
"CreateCourseLessonsRequestThumbnail",
@@ -5807,6 +5925,7 @@ def __dir__():
"CreateSwapsResponseStatus",
"CreateSwapsResponseToToken",
"CreateTeamMembersRequestRole",
+ "CreateTransfersRequestFeedType",
"CreateTransfersRequestType",
"CreateTransfersResponse",
"CreateTransfersResponseClaimLink",
@@ -5869,9 +5988,6 @@ def __dir__():
"DeleteSocialAccountsResponse",
"DeleteTeamMembersResponse",
"DeleteWebhooksResponse",
- "DeliveriesWebhookResponse",
- "DeliveriesWebhookResponseDataItem",
- "DeliveriesWebhookResponsePageInfo",
"DenyResolutionCenterCasesRequestAttachmentsItem",
"DescribeStatsResponse",
"DescribeStatsResponseDescribeMetric",
@@ -6540,6 +6656,10 @@ def __dir__():
"NotificationTopicSummaryTopicType",
"NotificationTopicTopicType",
"OauthGrant",
+ "OnboardingReward",
+ "OnboardingRewardQualificationIncomeSource",
+ "OnboardingRewardRewardType",
+ "OnboardingRewardStatus",
"PageInfo",
"Pagination",
"Passkey",
@@ -6807,7 +6927,36 @@ def __dir__():
"PostAccountUpdatedPayloadType",
"PostAdCampaignPaymentFailedPayload",
"PostAdCampaignPaymentFailedPayloadApiVersion",
+ "PostAdCampaignPaymentFailedPayloadData",
+ "PostAdCampaignPaymentFailedPayloadDataBidType",
+ "PostAdCampaignPaymentFailedPayloadDataBudgetOptimization",
+ "PostAdCampaignPaymentFailedPayloadDataBudgetType",
+ "PostAdCampaignPaymentFailedPayloadDataDeliveryStatus",
+ "PostAdCampaignPaymentFailedPayloadDataObjective",
+ "PostAdCampaignPaymentFailedPayloadDataPlatform",
+ "PostAdCampaignPaymentFailedPayloadDataSpecialAdCategoriesItem",
+ "PostAdCampaignPaymentFailedPayloadDataStatus",
"PostAdCampaignPaymentFailedPayloadType",
+ "PostAdCampaignUpdatedPayload",
+ "PostAdCampaignUpdatedPayloadApiVersion",
+ "PostAdCampaignUpdatedPayloadData",
+ "PostAdCampaignUpdatedPayloadDataBidType",
+ "PostAdCampaignUpdatedPayloadDataBudgetOptimization",
+ "PostAdCampaignUpdatedPayloadDataBudgetType",
+ "PostAdCampaignUpdatedPayloadDataDeliveryStatus",
+ "PostAdCampaignUpdatedPayloadDataObjective",
+ "PostAdCampaignUpdatedPayloadDataPlatform",
+ "PostAdCampaignUpdatedPayloadDataSpecialAdCategoriesItem",
+ "PostAdCampaignUpdatedPayloadDataStatus",
+ "PostAdCampaignUpdatedPayloadType",
+ "PostAdUpdatedPayload",
+ "PostAdUpdatedPayloadApiVersion",
+ "PostAdUpdatedPayloadData",
+ "PostAdUpdatedPayloadDataCallToAction",
+ "PostAdUpdatedPayloadDataDeliveryStatus",
+ "PostAdUpdatedPayloadDataPostSource",
+ "PostAdUpdatedPayloadDataStatus",
+ "PostAdUpdatedPayloadType",
"PostCardApplicationApprovedPayload",
"PostCardApplicationApprovedPayloadApiVersion",
"PostCardApplicationApprovedPayloadData",
@@ -7216,6 +7365,7 @@ def __dir__():
"ReceiptTaxBehaviors",
"ReceiptV2Order",
"RecommendActionsUsersResponse",
+ "RecommendedAction",
"RecommendedActionExecution",
"RecommendedActionExecutionStatus",
"ReferredUsersPartnersResponse",
@@ -7274,6 +7424,7 @@ def __dir__():
"ResolutionEvent",
"ResolutionEventAction",
"ResolutionEventReporterType",
+ "ResolutionLineItem",
"ResolutionPayment",
"RetrieveAdCampaignsRequestAttributionModel",
"RetrieveAdGroupsRequestAttributionModel",
@@ -7566,6 +7717,7 @@ def __dir__():
"UpdateBountiesRequestBusinessGoalType",
"UpdateBountiesRequestFrequency",
"UpdateCardsRequestBilling",
+ "UpdateCardsRequestCardholder",
"UpdateCardsRequestSpendLimitFrequency",
"UpdateCardsResponse",
"UpdateCardsResponseBilling",
@@ -7590,10 +7742,6 @@ def __dir__():
"UpdateDisputesRequestEvidenceCustomerCommunicationAttachment",
"UpdateDisputesRequestEvidenceRefundPolicyAttachment",
"UpdateDisputesRequestEvidenceUncategorizedAttachment",
- "UpdateEvidenceDisputeRequestCancellationPolicyAttachment",
- "UpdateEvidenceDisputeRequestCustomerCommunicationAttachment",
- "UpdateEvidenceDisputeRequestRefundPolicyAttachment",
- "UpdateEvidenceDisputeRequestUncategorizedAttachment",
"UpdateExperiencesRequestLogo",
"UpdateForumPostsRequestAttachmentsItem",
"UpdateForumsRequestBannerImage",
@@ -7605,7 +7753,6 @@ def __dir__():
"UpdateMeUsersRequestBanner",
"UpdateMeUsersRequestProfilePicture",
"UpdateMessagesRequestAttachmentsItem",
- "UpdatePermissionsAppRequestRequestedPermissionsItem",
"UpdatePermissionsAppsRequestRequestedPermissionsItem",
"UpdatePlansRequestCustomFieldsItem",
"UpdatePlansRequestCustomFieldsItemFieldType",
diff --git a/src/whop_sdk/access_tokens/client.py b/src/whop_sdk/access_tokens/client.py
index 4d14660f..0dff63f7 100644
--- a/src/whop_sdk/access_tokens/client.py
+++ b/src/whop_sdk/access_tokens/client.py
@@ -66,7 +66,7 @@ def create(
from whop_sdk import Whop
client = Whop(
- "2026-09-02-2",
+ "2026-09-06",
idempotency_key="YOUR_IDEMPOTENCY_KEY",
token="YOUR_TOKEN",
)
@@ -138,7 +138,7 @@ async def create(
from whop_sdk import AsyncWhop
client = AsyncWhop(
- "2026-09-02-2",
+ "2026-09-06",
idempotency_key="YOUR_IDEMPOTENCY_KEY",
token="YOUR_TOKEN",
)
diff --git a/src/whop_sdk/account_links/client.py b/src/whop_sdk/account_links/client.py
index ab3d06b8..ea18e06a 100644
--- a/src/whop_sdk/account_links/client.py
+++ b/src/whop_sdk/account_links/client.py
@@ -66,7 +66,7 @@ def create(
from whop_sdk import Whop
client = Whop(
- "2026-09-02-2",
+ "2026-09-06",
idempotency_key="YOUR_IDEMPOTENCY_KEY",
token="YOUR_TOKEN",
)
@@ -143,7 +143,7 @@ async def create(
from whop_sdk import AsyncWhop
client = AsyncWhop(
- "2026-09-02-2",
+ "2026-09-06",
idempotency_key="YOUR_IDEMPOTENCY_KEY",
token="YOUR_TOKEN",
)
diff --git a/src/whop_sdk/accounts/client.py b/src/whop_sdk/accounts/client.py
index 397f8a91..beb3026a 100644
--- a/src/whop_sdk/accounts/client.py
+++ b/src/whop_sdk/accounts/client.py
@@ -140,7 +140,7 @@ def list(
from whop_sdk import Whop
client = Whop(
- "2026-09-02-2",
+ "2026-09-06",
idempotency_key="YOUR_IDEMPOTENCY_KEY",
token="YOUR_TOKEN",
)
@@ -176,6 +176,7 @@ def create(
country: typing.Optional[str] = OMIT,
email: typing.Optional[str] = OMIT,
metadata: typing.Optional[typing.Dict[str, typing.Any]] = OMIT,
+ send_customer_emails: typing.Optional[bool] = OMIT,
title: typing.Optional[str] = OMIT,
request_options: typing.Optional[RequestOptions] = None,
) -> Account:
@@ -199,6 +200,9 @@ def create(
metadata : typing.Optional[typing.Dict[str, typing.Any]]
Arbitrary key/value metadata to store on the account.
+ send_customer_emails : typing.Optional[bool]
+ Whether Whop sends transactional emails to customers on behalf of the connected account.
+
title : typing.Optional[str]
The display name of the account. Defaults to `metadata.external_id` or the owner's email when omitted.
@@ -215,7 +219,7 @@ def create(
from whop_sdk import Whop
client = Whop(
- "2026-09-02-2",
+ "2026-09-06",
idempotency_key="YOUR_IDEMPOTENCY_KEY",
token="YOUR_TOKEN",
)
@@ -227,6 +231,7 @@ def create(
country=country,
email=email,
metadata=metadata,
+ send_customer_emails=send_customer_emails,
title=title,
request_options=request_options,
)
@@ -251,7 +256,7 @@ def me(self, *, request_options: typing.Optional[RequestOptions] = None) -> Acco
from whop_sdk import Whop
client = Whop(
- "2026-09-02-2",
+ "2026-09-06",
idempotency_key="YOUR_IDEMPOTENCY_KEY",
token="YOUR_TOKEN",
)
@@ -282,7 +287,7 @@ def retrieve(self, id: str, *, request_options: typing.Optional[RequestOptions]
from whop_sdk import Whop
client = Whop(
- "2026-09-02-2",
+ "2026-09-06",
idempotency_key="YOUR_IDEMPOTENCY_KEY",
token="YOUR_TOKEN",
)
@@ -474,7 +479,7 @@ def update(
from whop_sdk import Whop
client = Whop(
- "2026-09-02-2",
+ "2026-09-06",
idempotency_key="YOUR_IDEMPOTENCY_KEY",
token="YOUR_TOKEN",
)
@@ -615,7 +620,7 @@ def form_company(
)
client = Whop(
- "2026-09-02-2",
+ "2026-09-06",
idempotency_key="YOUR_IDEMPOTENCY_KEY",
token="YOUR_TOKEN",
)
@@ -709,7 +714,7 @@ def suspend(self, id: str, *, request_options: typing.Optional[RequestOptions] =
from whop_sdk import Whop
client = Whop(
- "2026-09-02-2",
+ "2026-09-06",
idempotency_key="YOUR_IDEMPOTENCY_KEY",
token="YOUR_TOKEN",
)
@@ -759,7 +764,7 @@ def transfer_ownership(
from whop_sdk import Whop
client = Whop(
- "2026-09-02-2",
+ "2026-09-06",
idempotency_key="YOUR_IDEMPOTENCY_KEY",
token="YOUR_TOKEN",
)
@@ -885,7 +890,7 @@ async def list(
from whop_sdk import AsyncWhop
client = AsyncWhop(
- "2026-09-02-2",
+ "2026-09-06",
idempotency_key="YOUR_IDEMPOTENCY_KEY",
token="YOUR_TOKEN",
)
@@ -928,6 +933,7 @@ async def create(
country: typing.Optional[str] = OMIT,
email: typing.Optional[str] = OMIT,
metadata: typing.Optional[typing.Dict[str, typing.Any]] = OMIT,
+ send_customer_emails: typing.Optional[bool] = OMIT,
title: typing.Optional[str] = OMIT,
request_options: typing.Optional[RequestOptions] = None,
) -> Account:
@@ -951,6 +957,9 @@ async def create(
metadata : typing.Optional[typing.Dict[str, typing.Any]]
Arbitrary key/value metadata to store on the account.
+ send_customer_emails : typing.Optional[bool]
+ Whether Whop sends transactional emails to customers on behalf of the connected account.
+
title : typing.Optional[str]
The display name of the account. Defaults to `metadata.external_id` or the owner's email when omitted.
@@ -969,7 +978,7 @@ async def create(
from whop_sdk import AsyncWhop
client = AsyncWhop(
- "2026-09-02-2",
+ "2026-09-06",
idempotency_key="YOUR_IDEMPOTENCY_KEY",
token="YOUR_TOKEN",
)
@@ -987,6 +996,7 @@ async def main() -> None:
country=country,
email=email,
metadata=metadata,
+ send_customer_emails=send_customer_emails,
title=title,
request_options=request_options,
)
@@ -1013,7 +1023,7 @@ async def me(self, *, request_options: typing.Optional[RequestOptions] = None) -
from whop_sdk import AsyncWhop
client = AsyncWhop(
- "2026-09-02-2",
+ "2026-09-06",
idempotency_key="YOUR_IDEMPOTENCY_KEY",
token="YOUR_TOKEN",
)
@@ -1052,7 +1062,7 @@ async def retrieve(self, id: str, *, request_options: typing.Optional[RequestOpt
from whop_sdk import AsyncWhop
client = AsyncWhop(
- "2026-09-02-2",
+ "2026-09-06",
idempotency_key="YOUR_IDEMPOTENCY_KEY",
token="YOUR_TOKEN",
)
@@ -1252,7 +1262,7 @@ async def update(
from whop_sdk import AsyncWhop
client = AsyncWhop(
- "2026-09-02-2",
+ "2026-09-06",
idempotency_key="YOUR_IDEMPOTENCY_KEY",
token="YOUR_TOKEN",
)
@@ -1401,7 +1411,7 @@ async def form_company(
)
client = AsyncWhop(
- "2026-09-02-2",
+ "2026-09-06",
idempotency_key="YOUR_IDEMPOTENCY_KEY",
token="YOUR_TOKEN",
)
@@ -1503,7 +1513,7 @@ async def suspend(self, id: str, *, request_options: typing.Optional[RequestOpti
from whop_sdk import AsyncWhop
client = AsyncWhop(
- "2026-09-02-2",
+ "2026-09-06",
idempotency_key="YOUR_IDEMPOTENCY_KEY",
token="YOUR_TOKEN",
)
@@ -1561,7 +1571,7 @@ async def transfer_ownership(
from whop_sdk import AsyncWhop
client = AsyncWhop(
- "2026-09-02-2",
+ "2026-09-06",
idempotency_key="YOUR_IDEMPOTENCY_KEY",
token="YOUR_TOKEN",
)
diff --git a/src/whop_sdk/accounts/preferences/client.py b/src/whop_sdk/accounts/preferences/client.py
index ec03099d..ecd8014b 100644
--- a/src/whop_sdk/accounts/preferences/client.py
+++ b/src/whop_sdk/accounts/preferences/client.py
@@ -55,7 +55,7 @@ def retrieve(
from whop_sdk import Whop
client = Whop(
- "2026-09-02-2",
+ "2026-09-06",
idempotency_key="YOUR_IDEMPOTENCY_KEY",
token="YOUR_TOKEN",
)
@@ -117,7 +117,7 @@ def update(
from whop_sdk import Whop
client = Whop(
- "2026-09-02-2",
+ "2026-09-06",
idempotency_key="YOUR_IDEMPOTENCY_KEY",
token="YOUR_TOKEN",
)
@@ -179,7 +179,7 @@ async def retrieve(
from whop_sdk import AsyncWhop
client = AsyncWhop(
- "2026-09-02-2",
+ "2026-09-06",
idempotency_key="YOUR_IDEMPOTENCY_KEY",
token="YOUR_TOKEN",
)
@@ -249,7 +249,7 @@ async def update(
from whop_sdk import AsyncWhop
client = AsyncWhop(
- "2026-09-02-2",
+ "2026-09-06",
idempotency_key="YOUR_IDEMPOTENCY_KEY",
token="YOUR_TOKEN",
)
diff --git a/src/whop_sdk/accounts/raw_client.py b/src/whop_sdk/accounts/raw_client.py
index 029e98d5..568245f6 100644
--- a/src/whop_sdk/accounts/raw_client.py
+++ b/src/whop_sdk/accounts/raw_client.py
@@ -232,6 +232,7 @@ def create(
country: typing.Optional[str] = OMIT,
email: typing.Optional[str] = OMIT,
metadata: typing.Optional[typing.Dict[str, typing.Any]] = OMIT,
+ send_customer_emails: typing.Optional[bool] = OMIT,
title: typing.Optional[str] = OMIT,
request_options: typing.Optional[RequestOptions] = None,
) -> HttpResponse[Account]:
@@ -255,6 +256,9 @@ def create(
metadata : typing.Optional[typing.Dict[str, typing.Any]]
Arbitrary key/value metadata to store on the account.
+ send_customer_emails : typing.Optional[bool]
+ Whether Whop sends transactional emails to customers on behalf of the connected account.
+
title : typing.Optional[str]
The display name of the account. Defaults to `metadata.external_id` or the owner's email when omitted.
@@ -275,6 +279,7 @@ def create(
"country": country,
"email": email,
"metadata": metadata,
+ "send_customer_emails": send_customer_emails,
"title": title,
},
headers={
@@ -1327,6 +1332,7 @@ async def create(
country: typing.Optional[str] = OMIT,
email: typing.Optional[str] = OMIT,
metadata: typing.Optional[typing.Dict[str, typing.Any]] = OMIT,
+ send_customer_emails: typing.Optional[bool] = OMIT,
title: typing.Optional[str] = OMIT,
request_options: typing.Optional[RequestOptions] = None,
) -> AsyncHttpResponse[Account]:
@@ -1350,6 +1356,9 @@ async def create(
metadata : typing.Optional[typing.Dict[str, typing.Any]]
Arbitrary key/value metadata to store on the account.
+ send_customer_emails : typing.Optional[bool]
+ Whether Whop sends transactional emails to customers on behalf of the connected account.
+
title : typing.Optional[str]
The display name of the account. Defaults to `metadata.external_id` or the owner's email when omitted.
@@ -1370,6 +1379,7 @@ async def create(
"country": country,
"email": email,
"metadata": metadata,
+ "send_customer_emails": send_customer_emails,
"title": title,
},
headers={
diff --git a/src/whop_sdk/accounts/reserves/client.py b/src/whop_sdk/accounts/reserves/client.py
index 1250869c..ae491de2 100644
--- a/src/whop_sdk/accounts/reserves/client.py
+++ b/src/whop_sdk/accounts/reserves/client.py
@@ -45,7 +45,7 @@ def list(self, account_id: str, *, request_options: typing.Optional[RequestOptio
from whop_sdk import Whop
client = Whop(
- "2026-09-02-2",
+ "2026-09-06",
idempotency_key="YOUR_IDEMPOTENCY_KEY",
token="YOUR_TOKEN",
)
@@ -98,7 +98,7 @@ async def list(
from whop_sdk import AsyncWhop
client = AsyncWhop(
- "2026-09-02-2",
+ "2026-09-06",
idempotency_key="YOUR_IDEMPOTENCY_KEY",
token="YOUR_TOKEN",
)
diff --git a/src/whop_sdk/ad_campaigns/__init__.py b/src/whop_sdk/ad_campaigns/__init__.py
index 856c82a6..086a488c 100644
--- a/src/whop_sdk/ad_campaigns/__init__.py
+++ b/src/whop_sdk/ad_campaigns/__init__.py
@@ -23,7 +23,28 @@
ListAdCampaignsResponsePageInfo,
PostAdCampaignPaymentFailedPayload,
PostAdCampaignPaymentFailedPayloadApiVersion,
+ PostAdCampaignPaymentFailedPayloadData,
+ PostAdCampaignPaymentFailedPayloadDataBidType,
+ PostAdCampaignPaymentFailedPayloadDataBudgetOptimization,
+ PostAdCampaignPaymentFailedPayloadDataBudgetType,
+ PostAdCampaignPaymentFailedPayloadDataDeliveryStatus,
+ PostAdCampaignPaymentFailedPayloadDataObjective,
+ PostAdCampaignPaymentFailedPayloadDataPlatform,
+ PostAdCampaignPaymentFailedPayloadDataSpecialAdCategoriesItem,
+ PostAdCampaignPaymentFailedPayloadDataStatus,
PostAdCampaignPaymentFailedPayloadType,
+ PostAdCampaignUpdatedPayload,
+ PostAdCampaignUpdatedPayloadApiVersion,
+ PostAdCampaignUpdatedPayloadData,
+ PostAdCampaignUpdatedPayloadDataBidType,
+ PostAdCampaignUpdatedPayloadDataBudgetOptimization,
+ PostAdCampaignUpdatedPayloadDataBudgetType,
+ PostAdCampaignUpdatedPayloadDataDeliveryStatus,
+ PostAdCampaignUpdatedPayloadDataObjective,
+ PostAdCampaignUpdatedPayloadDataPlatform,
+ PostAdCampaignUpdatedPayloadDataSpecialAdCategoriesItem,
+ PostAdCampaignUpdatedPayloadDataStatus,
+ PostAdCampaignUpdatedPayloadType,
RetrieveAdCampaignsRequestAttributionModel,
UpdateAdCampaignsRequestBidType,
UpdateAdCampaignsRequestBudgetOptimization,
@@ -48,7 +69,28 @@
"ListAdCampaignsResponsePageInfo": ".types",
"PostAdCampaignPaymentFailedPayload": ".types",
"PostAdCampaignPaymentFailedPayloadApiVersion": ".types",
+ "PostAdCampaignPaymentFailedPayloadData": ".types",
+ "PostAdCampaignPaymentFailedPayloadDataBidType": ".types",
+ "PostAdCampaignPaymentFailedPayloadDataBudgetOptimization": ".types",
+ "PostAdCampaignPaymentFailedPayloadDataBudgetType": ".types",
+ "PostAdCampaignPaymentFailedPayloadDataDeliveryStatus": ".types",
+ "PostAdCampaignPaymentFailedPayloadDataObjective": ".types",
+ "PostAdCampaignPaymentFailedPayloadDataPlatform": ".types",
+ "PostAdCampaignPaymentFailedPayloadDataSpecialAdCategoriesItem": ".types",
+ "PostAdCampaignPaymentFailedPayloadDataStatus": ".types",
"PostAdCampaignPaymentFailedPayloadType": ".types",
+ "PostAdCampaignUpdatedPayload": ".types",
+ "PostAdCampaignUpdatedPayloadApiVersion": ".types",
+ "PostAdCampaignUpdatedPayloadData": ".types",
+ "PostAdCampaignUpdatedPayloadDataBidType": ".types",
+ "PostAdCampaignUpdatedPayloadDataBudgetOptimization": ".types",
+ "PostAdCampaignUpdatedPayloadDataBudgetType": ".types",
+ "PostAdCampaignUpdatedPayloadDataDeliveryStatus": ".types",
+ "PostAdCampaignUpdatedPayloadDataObjective": ".types",
+ "PostAdCampaignUpdatedPayloadDataPlatform": ".types",
+ "PostAdCampaignUpdatedPayloadDataSpecialAdCategoriesItem": ".types",
+ "PostAdCampaignUpdatedPayloadDataStatus": ".types",
+ "PostAdCampaignUpdatedPayloadType": ".types",
"RetrieveAdCampaignsRequestAttributionModel": ".types",
"UpdateAdCampaignsRequestBidType": ".types",
"UpdateAdCampaignsRequestBudgetOptimization": ".types",
@@ -96,7 +138,28 @@ def __dir__():
"ListAdCampaignsResponsePageInfo",
"PostAdCampaignPaymentFailedPayload",
"PostAdCampaignPaymentFailedPayloadApiVersion",
+ "PostAdCampaignPaymentFailedPayloadData",
+ "PostAdCampaignPaymentFailedPayloadDataBidType",
+ "PostAdCampaignPaymentFailedPayloadDataBudgetOptimization",
+ "PostAdCampaignPaymentFailedPayloadDataBudgetType",
+ "PostAdCampaignPaymentFailedPayloadDataDeliveryStatus",
+ "PostAdCampaignPaymentFailedPayloadDataObjective",
+ "PostAdCampaignPaymentFailedPayloadDataPlatform",
+ "PostAdCampaignPaymentFailedPayloadDataSpecialAdCategoriesItem",
+ "PostAdCampaignPaymentFailedPayloadDataStatus",
"PostAdCampaignPaymentFailedPayloadType",
+ "PostAdCampaignUpdatedPayload",
+ "PostAdCampaignUpdatedPayloadApiVersion",
+ "PostAdCampaignUpdatedPayloadData",
+ "PostAdCampaignUpdatedPayloadDataBidType",
+ "PostAdCampaignUpdatedPayloadDataBudgetOptimization",
+ "PostAdCampaignUpdatedPayloadDataBudgetType",
+ "PostAdCampaignUpdatedPayloadDataDeliveryStatus",
+ "PostAdCampaignUpdatedPayloadDataObjective",
+ "PostAdCampaignUpdatedPayloadDataPlatform",
+ "PostAdCampaignUpdatedPayloadDataSpecialAdCategoriesItem",
+ "PostAdCampaignUpdatedPayloadDataStatus",
+ "PostAdCampaignUpdatedPayloadType",
"RetrieveAdCampaignsRequestAttributionModel",
"UpdateAdCampaignsRequestBidType",
"UpdateAdCampaignsRequestBudgetOptimization",
diff --git a/src/whop_sdk/ad_campaigns/client.py b/src/whop_sdk/ad_campaigns/client.py
index da30d28f..2e12f4b8 100644
--- a/src/whop_sdk/ad_campaigns/client.py
+++ b/src/whop_sdk/ad_campaigns/client.py
@@ -133,7 +133,7 @@ def list(
from whop_sdk import Whop
client = Whop(
- "2026-09-02-2",
+ "2026-09-06",
idempotency_key="YOUR_IDEMPOTENCY_KEY",
token="YOUR_TOKEN",
)
@@ -234,7 +234,7 @@ def create(
from whop_sdk import Whop
client = Whop(
- "2026-09-02-2",
+ "2026-09-06",
idempotency_key="YOUR_IDEMPOTENCY_KEY",
token="YOUR_TOKEN",
)
@@ -304,7 +304,7 @@ def retrieve(
from whop_sdk import Whop
client = Whop(
- "2026-09-02-2",
+ "2026-09-06",
idempotency_key="YOUR_IDEMPOTENCY_KEY",
token="YOUR_TOKEN",
)
@@ -344,7 +344,7 @@ def delete(self, id: str, *, request_options: typing.Optional[RequestOptions] =
from whop_sdk import Whop
client = Whop(
- "2026-09-02-2",
+ "2026-09-06",
idempotency_key="YOUR_IDEMPOTENCY_KEY",
token="YOUR_TOKEN",
)
@@ -418,7 +418,7 @@ def update(
from whop_sdk import Whop
client = Whop(
- "2026-09-02-2",
+ "2026-09-06",
idempotency_key="YOUR_IDEMPOTENCY_KEY",
token="YOUR_TOKEN",
)
@@ -476,7 +476,7 @@ def duplicate(
from whop_sdk import Whop
client = Whop(
- "2026-09-02-2",
+ "2026-09-06",
idempotency_key="YOUR_IDEMPOTENCY_KEY",
token="YOUR_TOKEN",
)
@@ -511,7 +511,7 @@ def pause(self, id: str, *, request_options: typing.Optional[RequestOptions] = N
from whop_sdk import Whop
client = Whop(
- "2026-09-02-2",
+ "2026-09-06",
idempotency_key="YOUR_IDEMPOTENCY_KEY",
token="YOUR_TOKEN",
)
@@ -544,7 +544,7 @@ def retry_payment(self, id: str, *, request_options: typing.Optional[RequestOpti
from whop_sdk import Whop
client = Whop(
- "2026-09-02-2",
+ "2026-09-06",
idempotency_key="YOUR_IDEMPOTENCY_KEY",
token="YOUR_TOKEN",
)
@@ -557,7 +557,7 @@ def retry_payment(self, id: str, *, request_options: typing.Optional[RequestOpti
def unpause(self, id: str, *, request_options: typing.Optional[RequestOptions] = None) -> AdCampaign:
"""
- Resumes a paused ad campaign.
+ Resumes a paused ad campaign. Requires an ads payment method on the account.
Parameters
----------
@@ -577,7 +577,7 @@ def unpause(self, id: str, *, request_options: typing.Optional[RequestOptions] =
from whop_sdk import Whop
client = Whop(
- "2026-09-02-2",
+ "2026-09-06",
idempotency_key="YOUR_IDEMPOTENCY_KEY",
token="YOUR_TOKEN",
)
@@ -689,7 +689,7 @@ async def list(
from whop_sdk import AsyncWhop
client = AsyncWhop(
- "2026-09-02-2",
+ "2026-09-06",
idempotency_key="YOUR_IDEMPOTENCY_KEY",
token="YOUR_TOKEN",
)
@@ -799,7 +799,7 @@ async def create(
from whop_sdk import AsyncWhop
client = AsyncWhop(
- "2026-09-02-2",
+ "2026-09-06",
idempotency_key="YOUR_IDEMPOTENCY_KEY",
token="YOUR_TOKEN",
)
@@ -877,7 +877,7 @@ async def retrieve(
from whop_sdk import AsyncWhop
client = AsyncWhop(
- "2026-09-02-2",
+ "2026-09-06",
idempotency_key="YOUR_IDEMPOTENCY_KEY",
token="YOUR_TOKEN",
)
@@ -927,7 +927,7 @@ async def delete(
from whop_sdk import AsyncWhop
client = AsyncWhop(
- "2026-09-02-2",
+ "2026-09-06",
idempotency_key="YOUR_IDEMPOTENCY_KEY",
token="YOUR_TOKEN",
)
@@ -1009,7 +1009,7 @@ async def update(
from whop_sdk import AsyncWhop
client = AsyncWhop(
- "2026-09-02-2",
+ "2026-09-06",
idempotency_key="YOUR_IDEMPOTENCY_KEY",
token="YOUR_TOKEN",
)
@@ -1075,7 +1075,7 @@ async def duplicate(
from whop_sdk import AsyncWhop
client = AsyncWhop(
- "2026-09-02-2",
+ "2026-09-06",
idempotency_key="YOUR_IDEMPOTENCY_KEY",
token="YOUR_TOKEN",
)
@@ -1118,7 +1118,7 @@ async def pause(self, id: str, *, request_options: typing.Optional[RequestOption
from whop_sdk import AsyncWhop
client = AsyncWhop(
- "2026-09-02-2",
+ "2026-09-06",
idempotency_key="YOUR_IDEMPOTENCY_KEY",
token="YOUR_TOKEN",
)
@@ -1159,7 +1159,7 @@ async def retry_payment(self, id: str, *, request_options: typing.Optional[Reque
from whop_sdk import AsyncWhop
client = AsyncWhop(
- "2026-09-02-2",
+ "2026-09-06",
idempotency_key="YOUR_IDEMPOTENCY_KEY",
token="YOUR_TOKEN",
)
@@ -1178,7 +1178,7 @@ async def main() -> None:
async def unpause(self, id: str, *, request_options: typing.Optional[RequestOptions] = None) -> AdCampaign:
"""
- Resumes a paused ad campaign.
+ Resumes a paused ad campaign. Requires an ads payment method on the account.
Parameters
----------
@@ -1200,7 +1200,7 @@ async def unpause(self, id: str, *, request_options: typing.Optional[RequestOpti
from whop_sdk import AsyncWhop
client = AsyncWhop(
- "2026-09-02-2",
+ "2026-09-06",
idempotency_key="YOUR_IDEMPOTENCY_KEY",
token="YOUR_TOKEN",
)
diff --git a/src/whop_sdk/ad_campaigns/raw_client.py b/src/whop_sdk/ad_campaigns/raw_client.py
index ea8bd087..8e56616c 100644
--- a/src/whop_sdk/ad_campaigns/raw_client.py
+++ b/src/whop_sdk/ad_campaigns/raw_client.py
@@ -789,7 +789,7 @@ def retry_payment(
def unpause(self, id: str, *, request_options: typing.Optional[RequestOptions] = None) -> HttpResponse[AdCampaign]:
"""
- Resumes a paused ad campaign.
+ Resumes a paused ad campaign. Requires an ads payment method on the account.
Parameters
----------
@@ -1590,7 +1590,7 @@ async def unpause(
self, id: str, *, request_options: typing.Optional[RequestOptions] = None
) -> AsyncHttpResponse[AdCampaign]:
"""
- Resumes a paused ad campaign.
+ Resumes a paused ad campaign. Requires an ads payment method on the account.
Parameters
----------
diff --git a/src/whop_sdk/ad_campaigns/types/__init__.py b/src/whop_sdk/ad_campaigns/types/__init__.py
index b6899aff..77371a96 100644
--- a/src/whop_sdk/ad_campaigns/types/__init__.py
+++ b/src/whop_sdk/ad_campaigns/types/__init__.py
@@ -22,7 +22,40 @@
from .list_ad_campaigns_response_page_info import ListAdCampaignsResponsePageInfo
from .post_ad_campaign_payment_failed_payload import PostAdCampaignPaymentFailedPayload
from .post_ad_campaign_payment_failed_payload_api_version import PostAdCampaignPaymentFailedPayloadApiVersion
+ from .post_ad_campaign_payment_failed_payload_data import PostAdCampaignPaymentFailedPayloadData
+ from .post_ad_campaign_payment_failed_payload_data_bid_type import PostAdCampaignPaymentFailedPayloadDataBidType
+ from .post_ad_campaign_payment_failed_payload_data_budget_optimization import (
+ PostAdCampaignPaymentFailedPayloadDataBudgetOptimization,
+ )
+ from .post_ad_campaign_payment_failed_payload_data_budget_type import (
+ PostAdCampaignPaymentFailedPayloadDataBudgetType,
+ )
+ from .post_ad_campaign_payment_failed_payload_data_delivery_status import (
+ PostAdCampaignPaymentFailedPayloadDataDeliveryStatus,
+ )
+ from .post_ad_campaign_payment_failed_payload_data_objective import PostAdCampaignPaymentFailedPayloadDataObjective
+ from .post_ad_campaign_payment_failed_payload_data_platform import PostAdCampaignPaymentFailedPayloadDataPlatform
+ from .post_ad_campaign_payment_failed_payload_data_special_ad_categories_item import (
+ PostAdCampaignPaymentFailedPayloadDataSpecialAdCategoriesItem,
+ )
+ from .post_ad_campaign_payment_failed_payload_data_status import PostAdCampaignPaymentFailedPayloadDataStatus
from .post_ad_campaign_payment_failed_payload_type import PostAdCampaignPaymentFailedPayloadType
+ from .post_ad_campaign_updated_payload import PostAdCampaignUpdatedPayload
+ from .post_ad_campaign_updated_payload_api_version import PostAdCampaignUpdatedPayloadApiVersion
+ from .post_ad_campaign_updated_payload_data import PostAdCampaignUpdatedPayloadData
+ from .post_ad_campaign_updated_payload_data_bid_type import PostAdCampaignUpdatedPayloadDataBidType
+ from .post_ad_campaign_updated_payload_data_budget_optimization import (
+ PostAdCampaignUpdatedPayloadDataBudgetOptimization,
+ )
+ from .post_ad_campaign_updated_payload_data_budget_type import PostAdCampaignUpdatedPayloadDataBudgetType
+ from .post_ad_campaign_updated_payload_data_delivery_status import PostAdCampaignUpdatedPayloadDataDeliveryStatus
+ from .post_ad_campaign_updated_payload_data_objective import PostAdCampaignUpdatedPayloadDataObjective
+ from .post_ad_campaign_updated_payload_data_platform import PostAdCampaignUpdatedPayloadDataPlatform
+ from .post_ad_campaign_updated_payload_data_special_ad_categories_item import (
+ PostAdCampaignUpdatedPayloadDataSpecialAdCategoriesItem,
+ )
+ from .post_ad_campaign_updated_payload_data_status import PostAdCampaignUpdatedPayloadDataStatus
+ from .post_ad_campaign_updated_payload_type import PostAdCampaignUpdatedPayloadType
from .retrieve_ad_campaigns_request_attribution_model import RetrieveAdCampaignsRequestAttributionModel
from .update_ad_campaigns_request_bid_type import UpdateAdCampaignsRequestBidType
from .update_ad_campaigns_request_budget_optimization import UpdateAdCampaignsRequestBudgetOptimization
@@ -46,7 +79,28 @@
"ListAdCampaignsResponsePageInfo": ".list_ad_campaigns_response_page_info",
"PostAdCampaignPaymentFailedPayload": ".post_ad_campaign_payment_failed_payload",
"PostAdCampaignPaymentFailedPayloadApiVersion": ".post_ad_campaign_payment_failed_payload_api_version",
+ "PostAdCampaignPaymentFailedPayloadData": ".post_ad_campaign_payment_failed_payload_data",
+ "PostAdCampaignPaymentFailedPayloadDataBidType": ".post_ad_campaign_payment_failed_payload_data_bid_type",
+ "PostAdCampaignPaymentFailedPayloadDataBudgetOptimization": ".post_ad_campaign_payment_failed_payload_data_budget_optimization",
+ "PostAdCampaignPaymentFailedPayloadDataBudgetType": ".post_ad_campaign_payment_failed_payload_data_budget_type",
+ "PostAdCampaignPaymentFailedPayloadDataDeliveryStatus": ".post_ad_campaign_payment_failed_payload_data_delivery_status",
+ "PostAdCampaignPaymentFailedPayloadDataObjective": ".post_ad_campaign_payment_failed_payload_data_objective",
+ "PostAdCampaignPaymentFailedPayloadDataPlatform": ".post_ad_campaign_payment_failed_payload_data_platform",
+ "PostAdCampaignPaymentFailedPayloadDataSpecialAdCategoriesItem": ".post_ad_campaign_payment_failed_payload_data_special_ad_categories_item",
+ "PostAdCampaignPaymentFailedPayloadDataStatus": ".post_ad_campaign_payment_failed_payload_data_status",
"PostAdCampaignPaymentFailedPayloadType": ".post_ad_campaign_payment_failed_payload_type",
+ "PostAdCampaignUpdatedPayload": ".post_ad_campaign_updated_payload",
+ "PostAdCampaignUpdatedPayloadApiVersion": ".post_ad_campaign_updated_payload_api_version",
+ "PostAdCampaignUpdatedPayloadData": ".post_ad_campaign_updated_payload_data",
+ "PostAdCampaignUpdatedPayloadDataBidType": ".post_ad_campaign_updated_payload_data_bid_type",
+ "PostAdCampaignUpdatedPayloadDataBudgetOptimization": ".post_ad_campaign_updated_payload_data_budget_optimization",
+ "PostAdCampaignUpdatedPayloadDataBudgetType": ".post_ad_campaign_updated_payload_data_budget_type",
+ "PostAdCampaignUpdatedPayloadDataDeliveryStatus": ".post_ad_campaign_updated_payload_data_delivery_status",
+ "PostAdCampaignUpdatedPayloadDataObjective": ".post_ad_campaign_updated_payload_data_objective",
+ "PostAdCampaignUpdatedPayloadDataPlatform": ".post_ad_campaign_updated_payload_data_platform",
+ "PostAdCampaignUpdatedPayloadDataSpecialAdCategoriesItem": ".post_ad_campaign_updated_payload_data_special_ad_categories_item",
+ "PostAdCampaignUpdatedPayloadDataStatus": ".post_ad_campaign_updated_payload_data_status",
+ "PostAdCampaignUpdatedPayloadType": ".post_ad_campaign_updated_payload_type",
"RetrieveAdCampaignsRequestAttributionModel": ".retrieve_ad_campaigns_request_attribution_model",
"UpdateAdCampaignsRequestBidType": ".update_ad_campaigns_request_bid_type",
"UpdateAdCampaignsRequestBudgetOptimization": ".update_ad_campaigns_request_budget_optimization",
@@ -94,7 +148,28 @@ def __dir__():
"ListAdCampaignsResponsePageInfo",
"PostAdCampaignPaymentFailedPayload",
"PostAdCampaignPaymentFailedPayloadApiVersion",
+ "PostAdCampaignPaymentFailedPayloadData",
+ "PostAdCampaignPaymentFailedPayloadDataBidType",
+ "PostAdCampaignPaymentFailedPayloadDataBudgetOptimization",
+ "PostAdCampaignPaymentFailedPayloadDataBudgetType",
+ "PostAdCampaignPaymentFailedPayloadDataDeliveryStatus",
+ "PostAdCampaignPaymentFailedPayloadDataObjective",
+ "PostAdCampaignPaymentFailedPayloadDataPlatform",
+ "PostAdCampaignPaymentFailedPayloadDataSpecialAdCategoriesItem",
+ "PostAdCampaignPaymentFailedPayloadDataStatus",
"PostAdCampaignPaymentFailedPayloadType",
+ "PostAdCampaignUpdatedPayload",
+ "PostAdCampaignUpdatedPayloadApiVersion",
+ "PostAdCampaignUpdatedPayloadData",
+ "PostAdCampaignUpdatedPayloadDataBidType",
+ "PostAdCampaignUpdatedPayloadDataBudgetOptimization",
+ "PostAdCampaignUpdatedPayloadDataBudgetType",
+ "PostAdCampaignUpdatedPayloadDataDeliveryStatus",
+ "PostAdCampaignUpdatedPayloadDataObjective",
+ "PostAdCampaignUpdatedPayloadDataPlatform",
+ "PostAdCampaignUpdatedPayloadDataSpecialAdCategoriesItem",
+ "PostAdCampaignUpdatedPayloadDataStatus",
+ "PostAdCampaignUpdatedPayloadType",
"RetrieveAdCampaignsRequestAttributionModel",
"UpdateAdCampaignsRequestBidType",
"UpdateAdCampaignsRequestBudgetOptimization",
diff --git a/src/whop_sdk/ad_campaigns/types/post_ad_campaign_payment_failed_payload.py b/src/whop_sdk/ad_campaigns/types/post_ad_campaign_payment_failed_payload.py
index e343e3f6..1055645c 100644
--- a/src/whop_sdk/ad_campaigns/types/post_ad_campaign_payment_failed_payload.py
+++ b/src/whop_sdk/ad_campaigns/types/post_ad_campaign_payment_failed_payload.py
@@ -5,8 +5,8 @@
import pydantic
from ...core.pydantic_utilities import IS_PYDANTIC_V2, UniversalBaseModel
-from ...types.ad_campaign import AdCampaign
from .post_ad_campaign_payment_failed_payload_api_version import PostAdCampaignPaymentFailedPayloadApiVersion
+from .post_ad_campaign_payment_failed_payload_data import PostAdCampaignPaymentFailedPayloadData
from .post_ad_campaign_payment_failed_payload_type import PostAdCampaignPaymentFailedPayloadType
@@ -26,7 +26,7 @@ class PostAdCampaignPaymentFailedPayload(UniversalBaseModel):
The dated API version (Api-Version-Date) the payload is serialized to
"""
- data: AdCampaign
+ data: PostAdCampaignPaymentFailedPayloadData
id: str = pydantic.Field()
"""
A unique ID for every single webhook request
diff --git a/src/whop_sdk/ad_campaigns/types/post_ad_campaign_payment_failed_payload_data.py b/src/whop_sdk/ad_campaigns/types/post_ad_campaign_payment_failed_payload_data.py
new file mode 100644
index 00000000..c4df2b65
--- /dev/null
+++ b/src/whop_sdk/ad_campaigns/types/post_ad_campaign_payment_failed_payload_data.py
@@ -0,0 +1,101 @@
+# This file was auto-generated by Fern from our API Definition.
+
+import typing
+
+import pydantic
+from ...core.pydantic_utilities import IS_PYDANTIC_V2, UniversalBaseModel
+from ...types.ad_platform_issue import AdPlatformIssue
+from .post_ad_campaign_payment_failed_payload_data_bid_type import PostAdCampaignPaymentFailedPayloadDataBidType
+from .post_ad_campaign_payment_failed_payload_data_budget_optimization import (
+ PostAdCampaignPaymentFailedPayloadDataBudgetOptimization,
+)
+from .post_ad_campaign_payment_failed_payload_data_budget_type import PostAdCampaignPaymentFailedPayloadDataBudgetType
+from .post_ad_campaign_payment_failed_payload_data_delivery_status import (
+ PostAdCampaignPaymentFailedPayloadDataDeliveryStatus,
+)
+from .post_ad_campaign_payment_failed_payload_data_objective import PostAdCampaignPaymentFailedPayloadDataObjective
+from .post_ad_campaign_payment_failed_payload_data_platform import PostAdCampaignPaymentFailedPayloadDataPlatform
+from .post_ad_campaign_payment_failed_payload_data_special_ad_categories_item import (
+ PostAdCampaignPaymentFailedPayloadDataSpecialAdCategoriesItem,
+)
+from .post_ad_campaign_payment_failed_payload_data_status import PostAdCampaignPaymentFailedPayloadDataStatus
+
+
+class PostAdCampaignPaymentFailedPayloadData(UniversalBaseModel):
+ bid_type: typing.Optional[PostAdCampaignPaymentFailedPayloadDataBidType] = pydantic.Field(default=None)
+ """
+ How delivery bids in the ad auction: `minimum_cost` gets the most results for the budget, `average_target` holds an average cost per result, and `maximum_target` never bids above a cap.
+ """
+
+ budget_amount: typing.Optional[float] = pydantic.Field(default=None)
+ """
+ The campaign's budget, in the ad account's currency. `null` when each ad group sets its own budget instead.
+ """
+
+ budget_optimization: typing.Optional[PostAdCampaignPaymentFailedPayloadDataBudgetOptimization] = pydantic.Field(
+ default=None
+ )
+ """
+ Which level owns the budget: the whole campaign (`ad_campaign`) or each ad group individually (`ad_group`).
+ """
+
+ budget_type: typing.Optional[PostAdCampaignPaymentFailedPayloadDataBudgetType] = pydantic.Field(default=None)
+ """
+ Whether `budget_amount` is spent per day (`daily`) or over the campaign's full run (`lifetime`).
+ """
+
+ created_at: str = pydantic.Field()
+ """
+ When the campaign was created, as an ISO 8601 timestamp.
+ """
+
+ delivery_status: PostAdCampaignPaymentFailedPayloadDataDeliveryStatus = pydantic.Field()
+ """
+ Whether the campaign's ads are delivering right now, and if not, why. When several states apply at once, the highest-precedence one is returned.
+ """
+
+ id: str = pydantic.Field()
+ """
+ Unique identifier for the ad campaign, prefixed `adcamp_`.
+ """
+
+ issues: typing.List[AdPlatformIssue]
+ objective: typing.Optional[PostAdCampaignPaymentFailedPayloadDataObjective] = pydantic.Field(default=None)
+ """
+ The goal the campaign optimizes toward.
+ """
+
+ optimization_goal: typing.Optional[str] = pydantic.Field(default=None)
+ """
+ The event the campaign optimizes for when a single goal is set campaign-wide. `null` when each ad group sets its own optimization_goal.
+ """
+
+ platform: PostAdCampaignPaymentFailedPayloadDataPlatform = pydantic.Field()
+ """
+ The ad network the campaign runs on.
+ """
+
+ special_ad_categories: typing.List[PostAdCampaignPaymentFailedPayloadDataSpecialAdCategoriesItem]
+ status: PostAdCampaignPaymentFailedPayloadDataStatus = pydantic.Field()
+ """
+ The lifecycle status of the ad campaign.
+ """
+
+ title: str = pydantic.Field()
+ """
+ Display name of the ad campaign.
+ """
+
+ updated_at: str = pydantic.Field()
+ """
+ When the campaign was last updated, as an ISO 8601 timestamp.
+ """
+
+ if IS_PYDANTIC_V2:
+ model_config: typing.ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(extra="allow", frozen=True) # type: ignore # Pydantic v2
+ else:
+
+ class Config:
+ frozen = True
+ smart_union = True
+ extra = pydantic.Extra.allow
diff --git a/src/whop_sdk/ad_campaigns/types/post_ad_campaign_payment_failed_payload_data_bid_type.py b/src/whop_sdk/ad_campaigns/types/post_ad_campaign_payment_failed_payload_data_bid_type.py
new file mode 100644
index 00000000..17e2d52a
--- /dev/null
+++ b/src/whop_sdk/ad_campaigns/types/post_ad_campaign_payment_failed_payload_data_bid_type.py
@@ -0,0 +1,7 @@
+# This file was auto-generated by Fern from our API Definition.
+
+import typing
+
+PostAdCampaignPaymentFailedPayloadDataBidType = typing.Union[
+ typing.Literal["minimum_cost", "average_target", "maximum_target"], typing.Any
+]
diff --git a/src/whop_sdk/ad_campaigns/types/post_ad_campaign_payment_failed_payload_data_budget_optimization.py b/src/whop_sdk/ad_campaigns/types/post_ad_campaign_payment_failed_payload_data_budget_optimization.py
new file mode 100644
index 00000000..ff716f78
--- /dev/null
+++ b/src/whop_sdk/ad_campaigns/types/post_ad_campaign_payment_failed_payload_data_budget_optimization.py
@@ -0,0 +1,7 @@
+# This file was auto-generated by Fern from our API Definition.
+
+import typing
+
+PostAdCampaignPaymentFailedPayloadDataBudgetOptimization = typing.Union[
+ typing.Literal["ad_campaign", "ad_group"], typing.Any
+]
diff --git a/src/whop_sdk/ad_campaigns/types/post_ad_campaign_payment_failed_payload_data_budget_type.py b/src/whop_sdk/ad_campaigns/types/post_ad_campaign_payment_failed_payload_data_budget_type.py
new file mode 100644
index 00000000..4e61bcff
--- /dev/null
+++ b/src/whop_sdk/ad_campaigns/types/post_ad_campaign_payment_failed_payload_data_budget_type.py
@@ -0,0 +1,5 @@
+# This file was auto-generated by Fern from our API Definition.
+
+import typing
+
+PostAdCampaignPaymentFailedPayloadDataBudgetType = typing.Union[typing.Literal["daily", "lifetime"], typing.Any]
diff --git a/src/whop_sdk/ad_campaigns/types/post_ad_campaign_payment_failed_payload_data_delivery_status.py b/src/whop_sdk/ad_campaigns/types/post_ad_campaign_payment_failed_payload_data_delivery_status.py
new file mode 100644
index 00000000..39aca352
--- /dev/null
+++ b/src/whop_sdk/ad_campaigns/types/post_ad_campaign_payment_failed_payload_data_delivery_status.py
@@ -0,0 +1,21 @@
+# This file was auto-generated by Fern from our API Definition.
+
+import typing
+
+PostAdCampaignPaymentFailedPayloadDataDeliveryStatus = typing.Union[
+ typing.Literal[
+ "payment_failed",
+ "all_ads_rejected",
+ "draft",
+ "no_ad_groups",
+ "no_ads",
+ "paused",
+ "processing",
+ "issues",
+ "scheduled",
+ "completed",
+ "ad_groups_off",
+ "active",
+ ],
+ typing.Any,
+]
diff --git a/src/whop_sdk/ad_campaigns/types/post_ad_campaign_payment_failed_payload_data_objective.py b/src/whop_sdk/ad_campaigns/types/post_ad_campaign_payment_failed_payload_data_objective.py
new file mode 100644
index 00000000..a9df6e5b
--- /dev/null
+++ b/src/whop_sdk/ad_campaigns/types/post_ad_campaign_payment_failed_payload_data_objective.py
@@ -0,0 +1,7 @@
+# This file was auto-generated by Fern from our API Definition.
+
+import typing
+
+PostAdCampaignPaymentFailedPayloadDataObjective = typing.Union[
+ typing.Literal["awareness", "traffic", "engagement", "leads", "sales"], typing.Any
+]
diff --git a/src/whop_sdk/ad_campaigns/types/post_ad_campaign_payment_failed_payload_data_platform.py b/src/whop_sdk/ad_campaigns/types/post_ad_campaign_payment_failed_payload_data_platform.py
new file mode 100644
index 00000000..8aff7784
--- /dev/null
+++ b/src/whop_sdk/ad_campaigns/types/post_ad_campaign_payment_failed_payload_data_platform.py
@@ -0,0 +1,5 @@
+# This file was auto-generated by Fern from our API Definition.
+
+import typing
+
+PostAdCampaignPaymentFailedPayloadDataPlatform = typing.Union[typing.Literal["meta", "tiktok"], typing.Any]
diff --git a/src/whop_sdk/ad_campaigns/types/post_ad_campaign_payment_failed_payload_data_special_ad_categories_item.py b/src/whop_sdk/ad_campaigns/types/post_ad_campaign_payment_failed_payload_data_special_ad_categories_item.py
new file mode 100644
index 00000000..d07ce984
--- /dev/null
+++ b/src/whop_sdk/ad_campaigns/types/post_ad_campaign_payment_failed_payload_data_special_ad_categories_item.py
@@ -0,0 +1,7 @@
+# This file was auto-generated by Fern from our API Definition.
+
+import typing
+
+PostAdCampaignPaymentFailedPayloadDataSpecialAdCategoriesItem = typing.Union[
+ typing.Literal["housing", "employment", "financial_products", "politics"], typing.Any
+]
diff --git a/src/whop_sdk/ad_campaigns/types/post_ad_campaign_payment_failed_payload_data_status.py b/src/whop_sdk/ad_campaigns/types/post_ad_campaign_payment_failed_payload_data_status.py
new file mode 100644
index 00000000..c14146d6
--- /dev/null
+++ b/src/whop_sdk/ad_campaigns/types/post_ad_campaign_payment_failed_payload_data_status.py
@@ -0,0 +1,21 @@
+# This file was auto-generated by Fern from our API Definition.
+
+import typing
+
+PostAdCampaignPaymentFailedPayloadDataStatus = typing.Union[
+ typing.Literal[
+ "active",
+ "paused",
+ "inactive",
+ "stale",
+ "pending_refund",
+ "payment_failed",
+ "draft",
+ "in_review",
+ "flagged",
+ "importing",
+ "imported",
+ "duplicating",
+ ],
+ typing.Any,
+]
diff --git a/src/whop_sdk/ad_campaigns/types/post_ad_campaign_updated_payload.py b/src/whop_sdk/ad_campaigns/types/post_ad_campaign_updated_payload.py
new file mode 100644
index 00000000..7ab4b70e
--- /dev/null
+++ b/src/whop_sdk/ad_campaigns/types/post_ad_campaign_updated_payload.py
@@ -0,0 +1,57 @@
+# This file was auto-generated by Fern from our API Definition.
+
+import datetime as dt
+import typing
+
+import pydantic
+from ...core.pydantic_utilities import IS_PYDANTIC_V2, UniversalBaseModel
+from .post_ad_campaign_updated_payload_api_version import PostAdCampaignUpdatedPayloadApiVersion
+from .post_ad_campaign_updated_payload_data import PostAdCampaignUpdatedPayloadData
+from .post_ad_campaign_updated_payload_type import PostAdCampaignUpdatedPayloadType
+
+
+class PostAdCampaignUpdatedPayload(UniversalBaseModel):
+ account_id: typing.Optional[str] = pydantic.Field(default=None)
+ """
+ The account ID that this webhook event is associated with
+ """
+
+ api_version: PostAdCampaignUpdatedPayloadApiVersion = pydantic.Field()
+ """
+ The API version for this webhook
+ """
+
+ api_version_date: typing.Optional[str] = pydantic.Field(default=None)
+ """
+ The dated API version (Api-Version-Date) the payload is serialized to
+ """
+
+ data: PostAdCampaignUpdatedPayloadData
+ id: str = pydantic.Field()
+ """
+ A unique ID for every single webhook request
+ """
+
+ previous_attributes: typing.Optional[typing.Dict[str, typing.Any]] = pydantic.Field(default=None)
+ """
+ For some `.updated` events, the old values of the payload fields that changed, keyed by field name. Omitted when no capture is available for the event
+ """
+
+ timestamp: dt.datetime = pydantic.Field()
+ """
+ The timestamp in ISO 8601 format that the webhook was sent at on the server
+ """
+
+ type: PostAdCampaignUpdatedPayloadType = pydantic.Field()
+ """
+ The webhook event type
+ """
+
+ if IS_PYDANTIC_V2:
+ model_config: typing.ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(extra="allow", frozen=True) # type: ignore # Pydantic v2
+ else:
+
+ class Config:
+ frozen = True
+ smart_union = True
+ extra = pydantic.Extra.allow
diff --git a/src/whop_sdk/ad_campaigns/types/post_ad_campaign_updated_payload_api_version.py b/src/whop_sdk/ad_campaigns/types/post_ad_campaign_updated_payload_api_version.py
new file mode 100644
index 00000000..aaf4c973
--- /dev/null
+++ b/src/whop_sdk/ad_campaigns/types/post_ad_campaign_updated_payload_api_version.py
@@ -0,0 +1,5 @@
+# This file was auto-generated by Fern from our API Definition.
+
+import typing
+
+PostAdCampaignUpdatedPayloadApiVersion = typing.Union[typing.Literal["v1"], typing.Any]
diff --git a/src/whop_sdk/ad_campaigns/types/post_ad_campaign_updated_payload_data.py b/src/whop_sdk/ad_campaigns/types/post_ad_campaign_updated_payload_data.py
new file mode 100644
index 00000000..3e0418e8
--- /dev/null
+++ b/src/whop_sdk/ad_campaigns/types/post_ad_campaign_updated_payload_data.py
@@ -0,0 +1,99 @@
+# This file was auto-generated by Fern from our API Definition.
+
+import typing
+
+import pydantic
+from ...core.pydantic_utilities import IS_PYDANTIC_V2, UniversalBaseModel
+from ...types.ad_platform_issue import AdPlatformIssue
+from .post_ad_campaign_updated_payload_data_bid_type import PostAdCampaignUpdatedPayloadDataBidType
+from .post_ad_campaign_updated_payload_data_budget_optimization import (
+ PostAdCampaignUpdatedPayloadDataBudgetOptimization,
+)
+from .post_ad_campaign_updated_payload_data_budget_type import PostAdCampaignUpdatedPayloadDataBudgetType
+from .post_ad_campaign_updated_payload_data_delivery_status import PostAdCampaignUpdatedPayloadDataDeliveryStatus
+from .post_ad_campaign_updated_payload_data_objective import PostAdCampaignUpdatedPayloadDataObjective
+from .post_ad_campaign_updated_payload_data_platform import PostAdCampaignUpdatedPayloadDataPlatform
+from .post_ad_campaign_updated_payload_data_special_ad_categories_item import (
+ PostAdCampaignUpdatedPayloadDataSpecialAdCategoriesItem,
+)
+from .post_ad_campaign_updated_payload_data_status import PostAdCampaignUpdatedPayloadDataStatus
+
+
+class PostAdCampaignUpdatedPayloadData(UniversalBaseModel):
+ bid_type: typing.Optional[PostAdCampaignUpdatedPayloadDataBidType] = pydantic.Field(default=None)
+ """
+ How delivery bids in the ad auction: `minimum_cost` gets the most results for the budget, `average_target` holds an average cost per result, and `maximum_target` never bids above a cap.
+ """
+
+ budget_amount: typing.Optional[float] = pydantic.Field(default=None)
+ """
+ The campaign's budget, in the ad account's currency. `null` when each ad group sets its own budget instead.
+ """
+
+ budget_optimization: typing.Optional[PostAdCampaignUpdatedPayloadDataBudgetOptimization] = pydantic.Field(
+ default=None
+ )
+ """
+ Which level owns the budget: the whole campaign (`ad_campaign`) or each ad group individually (`ad_group`).
+ """
+
+ budget_type: typing.Optional[PostAdCampaignUpdatedPayloadDataBudgetType] = pydantic.Field(default=None)
+ """
+ Whether `budget_amount` is spent per day (`daily`) or over the campaign's full run (`lifetime`).
+ """
+
+ created_at: str = pydantic.Field()
+ """
+ When the campaign was created, as an ISO 8601 timestamp.
+ """
+
+ delivery_status: PostAdCampaignUpdatedPayloadDataDeliveryStatus = pydantic.Field()
+ """
+ Whether the campaign's ads are delivering right now, and if not, why. When several states apply at once, the highest-precedence one is returned.
+ """
+
+ id: str = pydantic.Field()
+ """
+ Unique identifier for the ad campaign, prefixed `adcamp_`.
+ """
+
+ issues: typing.List[AdPlatformIssue]
+ objective: typing.Optional[PostAdCampaignUpdatedPayloadDataObjective] = pydantic.Field(default=None)
+ """
+ The goal the campaign optimizes toward.
+ """
+
+ optimization_goal: typing.Optional[str] = pydantic.Field(default=None)
+ """
+ The event the campaign optimizes for when a single goal is set campaign-wide. `null` when each ad group sets its own optimization_goal.
+ """
+
+ platform: PostAdCampaignUpdatedPayloadDataPlatform = pydantic.Field()
+ """
+ The ad network the campaign runs on.
+ """
+
+ special_ad_categories: typing.List[PostAdCampaignUpdatedPayloadDataSpecialAdCategoriesItem]
+ status: PostAdCampaignUpdatedPayloadDataStatus = pydantic.Field()
+ """
+ The lifecycle status of the ad campaign.
+ """
+
+ title: str = pydantic.Field()
+ """
+ Display name of the ad campaign.
+ """
+
+ updated_at: str = pydantic.Field()
+ """
+ When the campaign was last updated, as an ISO 8601 timestamp.
+ """
+
+ if IS_PYDANTIC_V2:
+ model_config: typing.ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(extra="allow", frozen=True) # type: ignore # Pydantic v2
+ else:
+
+ class Config:
+ frozen = True
+ smart_union = True
+ extra = pydantic.Extra.allow
diff --git a/src/whop_sdk/ad_campaigns/types/post_ad_campaign_updated_payload_data_bid_type.py b/src/whop_sdk/ad_campaigns/types/post_ad_campaign_updated_payload_data_bid_type.py
new file mode 100644
index 00000000..d48d9783
--- /dev/null
+++ b/src/whop_sdk/ad_campaigns/types/post_ad_campaign_updated_payload_data_bid_type.py
@@ -0,0 +1,7 @@
+# This file was auto-generated by Fern from our API Definition.
+
+import typing
+
+PostAdCampaignUpdatedPayloadDataBidType = typing.Union[
+ typing.Literal["minimum_cost", "average_target", "maximum_target"], typing.Any
+]
diff --git a/src/whop_sdk/ad_campaigns/types/post_ad_campaign_updated_payload_data_budget_optimization.py b/src/whop_sdk/ad_campaigns/types/post_ad_campaign_updated_payload_data_budget_optimization.py
new file mode 100644
index 00000000..ee638497
--- /dev/null
+++ b/src/whop_sdk/ad_campaigns/types/post_ad_campaign_updated_payload_data_budget_optimization.py
@@ -0,0 +1,5 @@
+# This file was auto-generated by Fern from our API Definition.
+
+import typing
+
+PostAdCampaignUpdatedPayloadDataBudgetOptimization = typing.Union[typing.Literal["ad_campaign", "ad_group"], typing.Any]
diff --git a/src/whop_sdk/ad_campaigns/types/post_ad_campaign_updated_payload_data_budget_type.py b/src/whop_sdk/ad_campaigns/types/post_ad_campaign_updated_payload_data_budget_type.py
new file mode 100644
index 00000000..2f2e2adb
--- /dev/null
+++ b/src/whop_sdk/ad_campaigns/types/post_ad_campaign_updated_payload_data_budget_type.py
@@ -0,0 +1,5 @@
+# This file was auto-generated by Fern from our API Definition.
+
+import typing
+
+PostAdCampaignUpdatedPayloadDataBudgetType = typing.Union[typing.Literal["daily", "lifetime"], typing.Any]
diff --git a/src/whop_sdk/ad_campaigns/types/post_ad_campaign_updated_payload_data_delivery_status.py b/src/whop_sdk/ad_campaigns/types/post_ad_campaign_updated_payload_data_delivery_status.py
new file mode 100644
index 00000000..e8a49fb4
--- /dev/null
+++ b/src/whop_sdk/ad_campaigns/types/post_ad_campaign_updated_payload_data_delivery_status.py
@@ -0,0 +1,21 @@
+# This file was auto-generated by Fern from our API Definition.
+
+import typing
+
+PostAdCampaignUpdatedPayloadDataDeliveryStatus = typing.Union[
+ typing.Literal[
+ "payment_failed",
+ "all_ads_rejected",
+ "draft",
+ "no_ad_groups",
+ "no_ads",
+ "paused",
+ "processing",
+ "issues",
+ "scheduled",
+ "completed",
+ "ad_groups_off",
+ "active",
+ ],
+ typing.Any,
+]
diff --git a/src/whop_sdk/ad_campaigns/types/post_ad_campaign_updated_payload_data_objective.py b/src/whop_sdk/ad_campaigns/types/post_ad_campaign_updated_payload_data_objective.py
new file mode 100644
index 00000000..84de8f26
--- /dev/null
+++ b/src/whop_sdk/ad_campaigns/types/post_ad_campaign_updated_payload_data_objective.py
@@ -0,0 +1,7 @@
+# This file was auto-generated by Fern from our API Definition.
+
+import typing
+
+PostAdCampaignUpdatedPayloadDataObjective = typing.Union[
+ typing.Literal["awareness", "traffic", "engagement", "leads", "sales"], typing.Any
+]
diff --git a/src/whop_sdk/ad_campaigns/types/post_ad_campaign_updated_payload_data_platform.py b/src/whop_sdk/ad_campaigns/types/post_ad_campaign_updated_payload_data_platform.py
new file mode 100644
index 00000000..483c2f9d
--- /dev/null
+++ b/src/whop_sdk/ad_campaigns/types/post_ad_campaign_updated_payload_data_platform.py
@@ -0,0 +1,5 @@
+# This file was auto-generated by Fern from our API Definition.
+
+import typing
+
+PostAdCampaignUpdatedPayloadDataPlatform = typing.Union[typing.Literal["meta", "tiktok"], typing.Any]
diff --git a/src/whop_sdk/ad_campaigns/types/post_ad_campaign_updated_payload_data_special_ad_categories_item.py b/src/whop_sdk/ad_campaigns/types/post_ad_campaign_updated_payload_data_special_ad_categories_item.py
new file mode 100644
index 00000000..3e883457
--- /dev/null
+++ b/src/whop_sdk/ad_campaigns/types/post_ad_campaign_updated_payload_data_special_ad_categories_item.py
@@ -0,0 +1,7 @@
+# This file was auto-generated by Fern from our API Definition.
+
+import typing
+
+PostAdCampaignUpdatedPayloadDataSpecialAdCategoriesItem = typing.Union[
+ typing.Literal["housing", "employment", "financial_products", "politics"], typing.Any
+]
diff --git a/src/whop_sdk/ad_campaigns/types/post_ad_campaign_updated_payload_data_status.py b/src/whop_sdk/ad_campaigns/types/post_ad_campaign_updated_payload_data_status.py
new file mode 100644
index 00000000..e9c1f965
--- /dev/null
+++ b/src/whop_sdk/ad_campaigns/types/post_ad_campaign_updated_payload_data_status.py
@@ -0,0 +1,21 @@
+# This file was auto-generated by Fern from our API Definition.
+
+import typing
+
+PostAdCampaignUpdatedPayloadDataStatus = typing.Union[
+ typing.Literal[
+ "active",
+ "paused",
+ "inactive",
+ "stale",
+ "pending_refund",
+ "payment_failed",
+ "draft",
+ "in_review",
+ "flagged",
+ "importing",
+ "imported",
+ "duplicating",
+ ],
+ typing.Any,
+]
diff --git a/src/whop_sdk/ad_campaigns/types/post_ad_campaign_updated_payload_type.py b/src/whop_sdk/ad_campaigns/types/post_ad_campaign_updated_payload_type.py
new file mode 100644
index 00000000..6f1761d5
--- /dev/null
+++ b/src/whop_sdk/ad_campaigns/types/post_ad_campaign_updated_payload_type.py
@@ -0,0 +1,5 @@
+# This file was auto-generated by Fern from our API Definition.
+
+import typing
+
+PostAdCampaignUpdatedPayloadType = typing.Union[typing.Literal["ad_campaign.updated"], typing.Any]
diff --git a/src/whop_sdk/ad_groups/client.py b/src/whop_sdk/ad_groups/client.py
index 70b5c091..dbaa6228 100644
--- a/src/whop_sdk/ad_groups/client.py
+++ b/src/whop_sdk/ad_groups/client.py
@@ -159,7 +159,7 @@ def list(
from whop_sdk import Whop
client = Whop(
- "2026-09-02-2",
+ "2026-09-06",
idempotency_key="YOUR_IDEMPOTENCY_KEY",
token="YOUR_TOKEN",
)
@@ -316,7 +316,7 @@ def create(
from whop_sdk import Whop
client = Whop(
- "2026-09-02-2",
+ "2026-09-06",
idempotency_key="YOUR_IDEMPOTENCY_KEY",
token="YOUR_TOKEN",
)
@@ -407,7 +407,7 @@ def estimate_reach(
from whop_sdk import Whop
client = Whop(
- "2026-09-02-2",
+ "2026-09-06",
idempotency_key="YOUR_IDEMPOTENCY_KEY",
token="YOUR_TOKEN",
)
@@ -498,7 +498,7 @@ def search_targeting_options(
from whop_sdk import Whop
client = Whop(
- "2026-09-02-2",
+ "2026-09-06",
idempotency_key="YOUR_IDEMPOTENCY_KEY",
token="YOUR_TOKEN",
)
@@ -562,7 +562,7 @@ def retrieve(
from whop_sdk import Whop
client = Whop(
- "2026-09-02-2",
+ "2026-09-06",
idempotency_key="YOUR_IDEMPOTENCY_KEY",
token="YOUR_TOKEN",
)
@@ -602,7 +602,7 @@ def delete(self, id: str, *, request_options: typing.Optional[RequestOptions] =
from whop_sdk import Whop
client = Whop(
- "2026-09-02-2",
+ "2026-09-06",
idempotency_key="YOUR_IDEMPOTENCY_KEY",
token="YOUR_TOKEN",
)
@@ -732,7 +732,7 @@ def update(
from whop_sdk import Whop
client = Whop(
- "2026-09-02-2",
+ "2026-09-06",
idempotency_key="YOUR_IDEMPOTENCY_KEY",
token="YOUR_TOKEN",
)
@@ -806,7 +806,7 @@ def duplicate(
from whop_sdk import Whop
client = Whop(
- "2026-09-02-2",
+ "2026-09-06",
idempotency_key="YOUR_IDEMPOTENCY_KEY",
token="YOUR_TOKEN",
)
@@ -845,7 +845,7 @@ def pause(self, id: str, *, request_options: typing.Optional[RequestOptions] = N
from whop_sdk import Whop
client = Whop(
- "2026-09-02-2",
+ "2026-09-06",
idempotency_key="YOUR_IDEMPOTENCY_KEY",
token="YOUR_TOKEN",
)
@@ -878,7 +878,7 @@ def unpause(self, id: str, *, request_options: typing.Optional[RequestOptions] =
from whop_sdk import Whop
client = Whop(
- "2026-09-02-2",
+ "2026-09-06",
idempotency_key="YOUR_IDEMPOTENCY_KEY",
token="YOUR_TOKEN",
)
@@ -998,7 +998,7 @@ async def list(
from whop_sdk import AsyncWhop
client = AsyncWhop(
- "2026-09-02-2",
+ "2026-09-06",
idempotency_key="YOUR_IDEMPOTENCY_KEY",
token="YOUR_TOKEN",
)
@@ -1164,7 +1164,7 @@ async def create(
from whop_sdk import AsyncWhop
client = AsyncWhop(
- "2026-09-02-2",
+ "2026-09-06",
idempotency_key="YOUR_IDEMPOTENCY_KEY",
token="YOUR_TOKEN",
)
@@ -1263,7 +1263,7 @@ async def estimate_reach(
from whop_sdk import AsyncWhop
client = AsyncWhop(
- "2026-09-02-2",
+ "2026-09-06",
idempotency_key="YOUR_IDEMPOTENCY_KEY",
token="YOUR_TOKEN",
)
@@ -1362,7 +1362,7 @@ async def search_targeting_options(
from whop_sdk import AsyncWhop
client = AsyncWhop(
- "2026-09-02-2",
+ "2026-09-06",
idempotency_key="YOUR_IDEMPOTENCY_KEY",
token="YOUR_TOKEN",
)
@@ -1434,7 +1434,7 @@ async def retrieve(
from whop_sdk import AsyncWhop
client = AsyncWhop(
- "2026-09-02-2",
+ "2026-09-06",
idempotency_key="YOUR_IDEMPOTENCY_KEY",
token="YOUR_TOKEN",
)
@@ -1484,7 +1484,7 @@ async def delete(
from whop_sdk import AsyncWhop
client = AsyncWhop(
- "2026-09-02-2",
+ "2026-09-06",
idempotency_key="YOUR_IDEMPOTENCY_KEY",
token="YOUR_TOKEN",
)
@@ -1622,7 +1622,7 @@ async def update(
from whop_sdk import AsyncWhop
client = AsyncWhop(
- "2026-09-02-2",
+ "2026-09-06",
idempotency_key="YOUR_IDEMPOTENCY_KEY",
token="YOUR_TOKEN",
)
@@ -1704,7 +1704,7 @@ async def duplicate(
from whop_sdk import AsyncWhop
client = AsyncWhop(
- "2026-09-02-2",
+ "2026-09-06",
idempotency_key="YOUR_IDEMPOTENCY_KEY",
token="YOUR_TOKEN",
)
@@ -1751,7 +1751,7 @@ async def pause(self, id: str, *, request_options: typing.Optional[RequestOption
from whop_sdk import AsyncWhop
client = AsyncWhop(
- "2026-09-02-2",
+ "2026-09-06",
idempotency_key="YOUR_IDEMPOTENCY_KEY",
token="YOUR_TOKEN",
)
@@ -1792,7 +1792,7 @@ async def unpause(self, id: str, *, request_options: typing.Optional[RequestOpti
from whop_sdk import AsyncWhop
client = AsyncWhop(
- "2026-09-02-2",
+ "2026-09-06",
idempotency_key="YOUR_IDEMPOTENCY_KEY",
token="YOUR_TOKEN",
)
diff --git a/src/whop_sdk/ads/__init__.py b/src/whop_sdk/ads/__init__.py
index 50bc1576..167b643d 100644
--- a/src/whop_sdk/ads/__init__.py
+++ b/src/whop_sdk/ads/__init__.py
@@ -36,6 +36,14 @@
ListAdsRequestStatus,
ListAdsResponse,
ListAdsResponsePageInfo,
+ PostAdUpdatedPayload,
+ PostAdUpdatedPayloadApiVersion,
+ PostAdUpdatedPayloadData,
+ PostAdUpdatedPayloadDataCallToAction,
+ PostAdUpdatedPayloadDataDeliveryStatus,
+ PostAdUpdatedPayloadDataPostSource,
+ PostAdUpdatedPayloadDataStatus,
+ PostAdUpdatedPayloadType,
RetrieveAdsRequestAttributionModel,
UpdateAdsRequestCallToAction,
UpdateAdsRequestCreativesItem,
@@ -89,6 +97,14 @@
"ListAdsRequestStatus": ".types",
"ListAdsResponse": ".types",
"ListAdsResponsePageInfo": ".types",
+ "PostAdUpdatedPayload": ".types",
+ "PostAdUpdatedPayloadApiVersion": ".types",
+ "PostAdUpdatedPayloadData": ".types",
+ "PostAdUpdatedPayloadDataCallToAction": ".types",
+ "PostAdUpdatedPayloadDataDeliveryStatus": ".types",
+ "PostAdUpdatedPayloadDataPostSource": ".types",
+ "PostAdUpdatedPayloadDataStatus": ".types",
+ "PostAdUpdatedPayloadType": ".types",
"RetrieveAdsRequestAttributionModel": ".types",
"UpdateAdsRequestCallToAction": ".types",
"UpdateAdsRequestCreativesItem": ".types",
@@ -165,6 +181,14 @@ def __dir__():
"ListAdsRequestStatus",
"ListAdsResponse",
"ListAdsResponsePageInfo",
+ "PostAdUpdatedPayload",
+ "PostAdUpdatedPayloadApiVersion",
+ "PostAdUpdatedPayloadData",
+ "PostAdUpdatedPayloadDataCallToAction",
+ "PostAdUpdatedPayloadDataDeliveryStatus",
+ "PostAdUpdatedPayloadDataPostSource",
+ "PostAdUpdatedPayloadDataStatus",
+ "PostAdUpdatedPayloadType",
"RetrieveAdsRequestAttributionModel",
"UpdateAdsRequestCallToAction",
"UpdateAdsRequestCreativesItem",
diff --git a/src/whop_sdk/ads/client.py b/src/whop_sdk/ads/client.py
index ae22475a..202e27c5 100644
--- a/src/whop_sdk/ads/client.py
+++ b/src/whop_sdk/ads/client.py
@@ -148,7 +148,7 @@ def list(
from whop_sdk import Whop
client = Whop(
- "2026-09-02-2",
+ "2026-09-06",
idempotency_key="YOUR_IDEMPOTENCY_KEY",
token="YOUR_TOKEN",
)
@@ -209,7 +209,7 @@ def create(
request_options: typing.Optional[RequestOptions] = None,
) -> Ad:
"""
- Creates an ad in an ad group.
+ Creates an ad in an ad group. Any campaign status other than `draft` launches the campaign, which requires an ads payment method on the account.
Parameters
----------
@@ -280,7 +280,7 @@ def create(
from whop_sdk import Whop
client = Whop(
- "2026-09-02-2",
+ "2026-09-06",
idempotency_key="YOUR_IDEMPOTENCY_KEY",
token="YOUR_TOKEN",
)
@@ -352,7 +352,7 @@ def retrieve(
from whop_sdk import Whop
client = Whop(
- "2026-09-02-2",
+ "2026-09-06",
idempotency_key="YOUR_IDEMPOTENCY_KEY",
token="YOUR_TOKEN",
)
@@ -392,7 +392,7 @@ def delete(self, id: str, *, request_options: typing.Optional[RequestOptions] =
from whop_sdk import Whop
client = Whop(
- "2026-09-02-2",
+ "2026-09-06",
idempotency_key="YOUR_IDEMPOTENCY_KEY",
token="YOUR_TOKEN",
)
@@ -494,7 +494,7 @@ def update(
from whop_sdk import Whop
client = Whop(
- "2026-09-02-2",
+ "2026-09-06",
idempotency_key="YOUR_IDEMPOTENCY_KEY",
token="YOUR_TOKEN",
)
@@ -563,7 +563,7 @@ def duplicate(
from whop_sdk import Whop
client = Whop(
- "2026-09-02-2",
+ "2026-09-06",
idempotency_key="YOUR_IDEMPOTENCY_KEY",
token="YOUR_TOKEN",
)
@@ -602,7 +602,7 @@ def pause(self, id: str, *, request_options: typing.Optional[RequestOptions] = N
from whop_sdk import Whop
client = Whop(
- "2026-09-02-2",
+ "2026-09-06",
idempotency_key="YOUR_IDEMPOTENCY_KEY",
token="YOUR_TOKEN",
)
@@ -635,7 +635,7 @@ def unpause(self, id: str, *, request_options: typing.Optional[RequestOptions] =
from whop_sdk import Whop
client = Whop(
- "2026-09-02-2",
+ "2026-09-06",
idempotency_key="YOUR_IDEMPOTENCY_KEY",
token="YOUR_TOKEN",
)
@@ -763,7 +763,7 @@ async def list(
from whop_sdk import AsyncWhop
client = AsyncWhop(
- "2026-09-02-2",
+ "2026-09-06",
idempotency_key="YOUR_IDEMPOTENCY_KEY",
token="YOUR_TOKEN",
)
@@ -831,7 +831,7 @@ async def create(
request_options: typing.Optional[RequestOptions] = None,
) -> Ad:
"""
- Creates an ad in an ad group.
+ Creates an ad in an ad group. Any campaign status other than `draft` launches the campaign, which requires an ads payment method on the account.
Parameters
----------
@@ -904,7 +904,7 @@ async def create(
from whop_sdk import AsyncWhop
client = AsyncWhop(
- "2026-09-02-2",
+ "2026-09-06",
idempotency_key="YOUR_IDEMPOTENCY_KEY",
token="YOUR_TOKEN",
)
@@ -984,7 +984,7 @@ async def retrieve(
from whop_sdk import AsyncWhop
client = AsyncWhop(
- "2026-09-02-2",
+ "2026-09-06",
idempotency_key="YOUR_IDEMPOTENCY_KEY",
token="YOUR_TOKEN",
)
@@ -1032,7 +1032,7 @@ async def delete(self, id: str, *, request_options: typing.Optional[RequestOptio
from whop_sdk import AsyncWhop
client = AsyncWhop(
- "2026-09-02-2",
+ "2026-09-06",
idempotency_key="YOUR_IDEMPOTENCY_KEY",
token="YOUR_TOKEN",
)
@@ -1142,7 +1142,7 @@ async def update(
from whop_sdk import AsyncWhop
client = AsyncWhop(
- "2026-09-02-2",
+ "2026-09-06",
idempotency_key="YOUR_IDEMPOTENCY_KEY",
token="YOUR_TOKEN",
)
@@ -1219,7 +1219,7 @@ async def duplicate(
from whop_sdk import AsyncWhop
client = AsyncWhop(
- "2026-09-02-2",
+ "2026-09-06",
idempotency_key="YOUR_IDEMPOTENCY_KEY",
token="YOUR_TOKEN",
)
@@ -1266,7 +1266,7 @@ async def pause(self, id: str, *, request_options: typing.Optional[RequestOption
from whop_sdk import AsyncWhop
client = AsyncWhop(
- "2026-09-02-2",
+ "2026-09-06",
idempotency_key="YOUR_IDEMPOTENCY_KEY",
token="YOUR_TOKEN",
)
@@ -1307,7 +1307,7 @@ async def unpause(self, id: str, *, request_options: typing.Optional[RequestOpti
from whop_sdk import AsyncWhop
client = AsyncWhop(
- "2026-09-02-2",
+ "2026-09-06",
idempotency_key="YOUR_IDEMPOTENCY_KEY",
token="YOUR_TOKEN",
)
diff --git a/src/whop_sdk/ads/raw_client.py b/src/whop_sdk/ads/raw_client.py
index 88210bd6..8ebc03cd 100644
--- a/src/whop_sdk/ads/raw_client.py
+++ b/src/whop_sdk/ads/raw_client.py
@@ -263,7 +263,7 @@ def create(
request_options: typing.Optional[RequestOptions] = None,
) -> HttpResponse[Ad]:
"""
- Creates an ad in an ad group.
+ Creates an ad in an ad group. Any campaign status other than `draft` launches the campaign, which requires an ads payment method on the account.
Parameters
----------
@@ -1124,7 +1124,7 @@ async def create(
request_options: typing.Optional[RequestOptions] = None,
) -> AsyncHttpResponse[Ad]:
"""
- Creates an ad in an ad group.
+ Creates an ad in an ad group. Any campaign status other than `draft` launches the campaign, which requires an ads payment method on the account.
Parameters
----------
diff --git a/src/whop_sdk/ads/types/__init__.py b/src/whop_sdk/ads/types/__init__.py
index b59ba6ee..806dacf3 100644
--- a/src/whop_sdk/ads/types/__init__.py
+++ b/src/whop_sdk/ads/types/__init__.py
@@ -43,6 +43,14 @@
from .list_ads_request_status import ListAdsRequestStatus
from .list_ads_response import ListAdsResponse
from .list_ads_response_page_info import ListAdsResponsePageInfo
+ from .post_ad_updated_payload import PostAdUpdatedPayload
+ from .post_ad_updated_payload_api_version import PostAdUpdatedPayloadApiVersion
+ from .post_ad_updated_payload_data import PostAdUpdatedPayloadData
+ from .post_ad_updated_payload_data_call_to_action import PostAdUpdatedPayloadDataCallToAction
+ from .post_ad_updated_payload_data_delivery_status import PostAdUpdatedPayloadDataDeliveryStatus
+ from .post_ad_updated_payload_data_post_source import PostAdUpdatedPayloadDataPostSource
+ from .post_ad_updated_payload_data_status import PostAdUpdatedPayloadDataStatus
+ from .post_ad_updated_payload_type import PostAdUpdatedPayloadType
from .retrieve_ads_request_attribution_model import RetrieveAdsRequestAttributionModel
from .update_ads_request_call_to_action import UpdateAdsRequestCallToAction
from .update_ads_request_creatives_item import UpdateAdsRequestCreativesItem
@@ -103,6 +111,14 @@
"ListAdsRequestStatus": ".list_ads_request_status",
"ListAdsResponse": ".list_ads_response",
"ListAdsResponsePageInfo": ".list_ads_response_page_info",
+ "PostAdUpdatedPayload": ".post_ad_updated_payload",
+ "PostAdUpdatedPayloadApiVersion": ".post_ad_updated_payload_api_version",
+ "PostAdUpdatedPayloadData": ".post_ad_updated_payload_data",
+ "PostAdUpdatedPayloadDataCallToAction": ".post_ad_updated_payload_data_call_to_action",
+ "PostAdUpdatedPayloadDataDeliveryStatus": ".post_ad_updated_payload_data_delivery_status",
+ "PostAdUpdatedPayloadDataPostSource": ".post_ad_updated_payload_data_post_source",
+ "PostAdUpdatedPayloadDataStatus": ".post_ad_updated_payload_data_status",
+ "PostAdUpdatedPayloadType": ".post_ad_updated_payload_type",
"RetrieveAdsRequestAttributionModel": ".retrieve_ads_request_attribution_model",
"UpdateAdsRequestCallToAction": ".update_ads_request_call_to_action",
"UpdateAdsRequestCreativesItem": ".update_ads_request_creatives_item",
@@ -179,6 +195,14 @@ def __dir__():
"ListAdsRequestStatus",
"ListAdsResponse",
"ListAdsResponsePageInfo",
+ "PostAdUpdatedPayload",
+ "PostAdUpdatedPayloadApiVersion",
+ "PostAdUpdatedPayloadData",
+ "PostAdUpdatedPayloadDataCallToAction",
+ "PostAdUpdatedPayloadDataDeliveryStatus",
+ "PostAdUpdatedPayloadDataPostSource",
+ "PostAdUpdatedPayloadDataStatus",
+ "PostAdUpdatedPayloadType",
"RetrieveAdsRequestAttributionModel",
"UpdateAdsRequestCallToAction",
"UpdateAdsRequestCreativesItem",
diff --git a/src/whop_sdk/ads/types/post_ad_updated_payload.py b/src/whop_sdk/ads/types/post_ad_updated_payload.py
new file mode 100644
index 00000000..01321828
--- /dev/null
+++ b/src/whop_sdk/ads/types/post_ad_updated_payload.py
@@ -0,0 +1,57 @@
+# This file was auto-generated by Fern from our API Definition.
+
+import datetime as dt
+import typing
+
+import pydantic
+from ...core.pydantic_utilities import IS_PYDANTIC_V2, UniversalBaseModel
+from .post_ad_updated_payload_api_version import PostAdUpdatedPayloadApiVersion
+from .post_ad_updated_payload_data import PostAdUpdatedPayloadData
+from .post_ad_updated_payload_type import PostAdUpdatedPayloadType
+
+
+class PostAdUpdatedPayload(UniversalBaseModel):
+ account_id: typing.Optional[str] = pydantic.Field(default=None)
+ """
+ The account ID that this webhook event is associated with
+ """
+
+ api_version: PostAdUpdatedPayloadApiVersion = pydantic.Field()
+ """
+ The API version for this webhook
+ """
+
+ api_version_date: typing.Optional[str] = pydantic.Field(default=None)
+ """
+ The dated API version (Api-Version-Date) the payload is serialized to
+ """
+
+ data: PostAdUpdatedPayloadData
+ id: str = pydantic.Field()
+ """
+ A unique ID for every single webhook request
+ """
+
+ previous_attributes: typing.Optional[typing.Dict[str, typing.Any]] = pydantic.Field(default=None)
+ """
+ For some `.updated` events, the old values of the payload fields that changed, keyed by field name. Omitted when no capture is available for the event
+ """
+
+ timestamp: dt.datetime = pydantic.Field()
+ """
+ The timestamp in ISO 8601 format that the webhook was sent at on the server
+ """
+
+ type: PostAdUpdatedPayloadType = pydantic.Field()
+ """
+ The webhook event type
+ """
+
+ if IS_PYDANTIC_V2:
+ model_config: typing.ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(extra="allow", frozen=True) # type: ignore # Pydantic v2
+ else:
+
+ class Config:
+ frozen = True
+ smart_union = True
+ extra = pydantic.Extra.allow
diff --git a/src/whop_sdk/ads/types/post_ad_updated_payload_api_version.py b/src/whop_sdk/ads/types/post_ad_updated_payload_api_version.py
new file mode 100644
index 00000000..26ace09d
--- /dev/null
+++ b/src/whop_sdk/ads/types/post_ad_updated_payload_api_version.py
@@ -0,0 +1,5 @@
+# This file was auto-generated by Fern from our API Definition.
+
+import typing
+
+PostAdUpdatedPayloadApiVersion = typing.Union[typing.Literal["v1"], typing.Any]
diff --git a/src/whop_sdk/ads/types/post_ad_updated_payload_data.py b/src/whop_sdk/ads/types/post_ad_updated_payload_data.py
new file mode 100644
index 00000000..fc4573d8
--- /dev/null
+++ b/src/whop_sdk/ads/types/post_ad_updated_payload_data.py
@@ -0,0 +1,133 @@
+# This file was auto-generated by Fern from our API Definition.
+
+import typing
+
+import pydantic
+from ...core.pydantic_utilities import IS_PYDANTIC_V2, UniversalBaseModel
+from ...types.ad_creative import AdCreative
+from ...types.ad_entity_reference import AdEntityReference
+from ...types.ad_lead_form import AdLeadForm
+from ...types.ad_messaging_config import AdMessagingConfig
+from ...types.ad_music import AdMusic
+from ...types.ad_platform_issue import AdPlatformIssue
+from .post_ad_updated_payload_data_call_to_action import PostAdUpdatedPayloadDataCallToAction
+from .post_ad_updated_payload_data_delivery_status import PostAdUpdatedPayloadDataDeliveryStatus
+from .post_ad_updated_payload_data_post_source import PostAdUpdatedPayloadDataPostSource
+from .post_ad_updated_payload_data_status import PostAdUpdatedPayloadDataStatus
+
+
+class PostAdUpdatedPayloadData(UniversalBaseModel):
+ ad_campaign: AdEntityReference = pydantic.Field()
+ """
+ The ad campaign this ad belongs to.
+ """
+
+ ad_group: AdEntityReference = pydantic.Field()
+ """
+ The ad group this ad belongs to.
+ """
+
+ call_to_action: typing.Optional[PostAdUpdatedPayloadDataCallToAction] = pydantic.Field(default=None)
+ """
+ The call-to-action button shown on the ad.
+ """
+
+ created_at: str = pydantic.Field()
+ """
+ When the ad was created, as an ISO 8601 timestamp.
+ """
+
+ creatives: typing.List[AdCreative]
+ delivery_status: PostAdUpdatedPayloadDataDeliveryStatus = pydantic.Field()
+ """
+ Whether the ad is delivering right now, and if not, why. When several states apply at once, the highest-precedence one is returned.
+ """
+
+ descriptions: typing.List[str]
+ existing_post_id: typing.Optional[str] = pydantic.Field(default=None)
+ """
+ The post you pointed this ad at, when it promotes one you already published — a Facebook post, Instagram media, or TikTok video ID. `null` when the ad uses uploaded creatives.
+ """
+
+ headlines: typing.List[str]
+ id: str = pydantic.Field()
+ """
+ Unique identifier for the ad, prefixed `ad_`.
+ """
+
+ issues: typing.List[AdPlatformIssue]
+ lead_form: typing.Optional[AdLeadForm] = pydantic.Field(default=None)
+ """
+ The instant lead form shown when someone taps this ad. `null` when the ad group's conversion_location is not an instant-form destination.
+ """
+
+ lead_form_id: typing.Optional[str] = pydantic.Field(default=None)
+ """
+ The ad platform's ID for the instant form the ad uses. Set when the ad references an existing form via `lead_form_id`, or once a form built from `lead_form` has been created on the platform.
+ """
+
+ messaging_config: typing.Optional[AdMessagingConfig] = pydantic.Field(default=None)
+ """
+ Welcome message for click-to-message ads, shown when the conversation opens. `null` when the ad has none.
+ """
+
+ multi_advertiser_ads: typing.Optional[bool] = pydantic.Field(default=None)
+ """
+ Whether the ad can appear alongside other advertisers' ads in the same unit. Defaults to true.
+ """
+
+ music: typing.Optional[AdMusic] = pydantic.Field(default=None)
+ """
+ The advertiser-uploaded MP3 a TikTok carousel ad plays. TikTok-only; `null` elsewhere and for non-carousel ads.
+ """
+
+ post_id: typing.Optional[str] = pydantic.Field(default=None)
+ """
+ The post the ad network serves for this ad, as `pageID_postID` on Meta — the post Meta created for an uploaded creative, or the post being promoted. Use it to open the live post, or to promote the same post from another ad. `null` until the network has created the post.
+ """
+
+ post_source: typing.Optional[PostAdUpdatedPayloadDataPostSource] = pydantic.Field(default=None)
+ """
+ Identifies the network that owns `existing_post_id`; `null` when the ad uses uploaded creatives.
+ """
+
+ post_thumbnail_url: typing.Optional[str] = pydantic.Field(default=None)
+ """
+ Preview image of the post named by `existing_post_id`. `null` for ads that use uploaded creatives, or until the post's media has been fetched from the network.
+ """
+
+ primary_texts: typing.List[str]
+ social_accounts: typing.List[AdEntityReference]
+ status: PostAdUpdatedPayloadDataStatus = pydantic.Field()
+ """
+ Whether the ad is enabled. `active` and `paused` are set by you; `in_review` and `rejected` come from ad review.
+ """
+
+ title: typing.Optional[str] = pydantic.Field(default=None)
+ """
+ Display title of the ad.
+ """
+
+ updated_at: str = pydantic.Field()
+ """
+ When the ad was last updated, as an ISO 8601 timestamp.
+ """
+
+ url: typing.Optional[str] = pydantic.Field(default=None)
+ """
+ The URL the ad links to, without its query string. Parameters belong in `url_parameters`; any you send on `url` are moved there.
+ """
+
+ url_parameters: typing.Dict[str, typing.Any] = pydantic.Field()
+ """
+ Every query parameter appended to the URL, keyed by parameter name — including any you sent on `url` itself. Whop adds its own click-attribution parameters on top; those are reserved and rejected if you set them. Which keys are reserved depends on the ad's network — Meta: utm_meta_ad_id, utm_meta_adset_id, utm_meta_campaign_id, utm_source, utm_placement, utm_medium, utm_content, utm_adset, utm_whop, wacid, wasid, waid, tw_source, tw_adid; TikTok: waid, wasid, wacid, ad_id, adset_id, campaign_id, utm_source, utm_medium, utm_placement, utm_whop, tw_source, tw_adid.
+ """
+
+ if IS_PYDANTIC_V2:
+ model_config: typing.ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(extra="allow", frozen=True) # type: ignore # Pydantic v2
+ else:
+
+ class Config:
+ frozen = True
+ smart_union = True
+ extra = pydantic.Extra.allow
diff --git a/src/whop_sdk/ads/types/post_ad_updated_payload_data_call_to_action.py b/src/whop_sdk/ads/types/post_ad_updated_payload_data_call_to_action.py
new file mode 100644
index 00000000..f0e0ce35
--- /dev/null
+++ b/src/whop_sdk/ads/types/post_ad_updated_payload_data_call_to_action.py
@@ -0,0 +1,40 @@
+# This file was auto-generated by Fern from our API Definition.
+
+import typing
+
+PostAdUpdatedPayloadDataCallToAction = typing.Union[
+ typing.Literal[
+ "learn_more",
+ "shop_now",
+ "sign_up",
+ "subscribe",
+ "get_started",
+ "book_now",
+ "apply_now",
+ "contact_us",
+ "download",
+ "order_now",
+ "buy_now",
+ "get_quote",
+ "message_page",
+ "whatsapp_message",
+ "instagram_message",
+ "call_now",
+ "get_directions",
+ "send_updates",
+ "get_offer",
+ "watch_more",
+ "listen_now",
+ "play_game",
+ "open_link",
+ "no_button",
+ "get_offer_view",
+ "get_event_tickets",
+ "see_menu",
+ "request_time",
+ "event_rsvp",
+ "see_details",
+ "view_instagram_profile",
+ ],
+ typing.Any,
+]
diff --git a/src/whop_sdk/ads/types/post_ad_updated_payload_data_delivery_status.py b/src/whop_sdk/ads/types/post_ad_updated_payload_data_delivery_status.py
new file mode 100644
index 00000000..84c46347
--- /dev/null
+++ b/src/whop_sdk/ads/types/post_ad_updated_payload_data_delivery_status.py
@@ -0,0 +1,21 @@
+# This file was auto-generated by Fern from our API Definition.
+
+import typing
+
+PostAdUpdatedPayloadDataDeliveryStatus = typing.Union[
+ typing.Literal[
+ "rejected",
+ "in_review",
+ "draft",
+ "campaign_paused",
+ "ad_group_paused",
+ "paused",
+ "processing",
+ "issues",
+ "scheduled",
+ "learning_limited",
+ "learning",
+ "active",
+ ],
+ typing.Any,
+]
diff --git a/src/whop_sdk/ads/types/post_ad_updated_payload_data_post_source.py b/src/whop_sdk/ads/types/post_ad_updated_payload_data_post_source.py
new file mode 100644
index 00000000..39d25650
--- /dev/null
+++ b/src/whop_sdk/ads/types/post_ad_updated_payload_data_post_source.py
@@ -0,0 +1,5 @@
+# This file was auto-generated by Fern from our API Definition.
+
+import typing
+
+PostAdUpdatedPayloadDataPostSource = typing.Union[typing.Literal["facebook", "instagram"], typing.Any]
diff --git a/src/whop_sdk/ads/types/post_ad_updated_payload_data_status.py b/src/whop_sdk/ads/types/post_ad_updated_payload_data_status.py
new file mode 100644
index 00000000..b03d0f9d
--- /dev/null
+++ b/src/whop_sdk/ads/types/post_ad_updated_payload_data_status.py
@@ -0,0 +1,5 @@
+# This file was auto-generated by Fern from our API Definition.
+
+import typing
+
+PostAdUpdatedPayloadDataStatus = typing.Union[typing.Literal["active", "paused", "in_review", "rejected"], typing.Any]
diff --git a/src/whop_sdk/ads/types/post_ad_updated_payload_type.py b/src/whop_sdk/ads/types/post_ad_updated_payload_type.py
new file mode 100644
index 00000000..7e6df80b
--- /dev/null
+++ b/src/whop_sdk/ads/types/post_ad_updated_payload_type.py
@@ -0,0 +1,5 @@
+# This file was auto-generated by Fern from our API Definition.
+
+import typing
+
+PostAdUpdatedPayloadType = typing.Union[typing.Literal["ad.updated"], typing.Any]
diff --git a/src/whop_sdk/affiliates/client.py b/src/whop_sdk/affiliates/client.py
index a082e8f9..050a078e 100644
--- a/src/whop_sdk/affiliates/client.py
+++ b/src/whop_sdk/affiliates/client.py
@@ -97,7 +97,7 @@ def list(
from whop_sdk import Whop
client = Whop(
- "2026-09-02-2",
+ "2026-09-06",
idempotency_key="YOUR_IDEMPOTENCY_KEY",
token="YOUR_TOKEN",
)
@@ -155,7 +155,7 @@ def create(
from whop_sdk import Whop
client = Whop(
- "2026-09-02-2",
+ "2026-09-06",
idempotency_key="YOUR_IDEMPOTENCY_KEY",
token="YOUR_TOKEN",
)
@@ -194,7 +194,7 @@ def retrieve(self, id: str, *, request_options: typing.Optional[RequestOptions]
from whop_sdk import Whop
client = Whop(
- "2026-09-02-2",
+ "2026-09-06",
idempotency_key="YOUR_IDEMPOTENCY_KEY",
token="YOUR_TOKEN",
)
@@ -230,7 +230,7 @@ def archive(self, id: str, *, request_options: typing.Optional[RequestOptions] =
from whop_sdk import Whop
client = Whop(
- "2026-09-02-2",
+ "2026-09-06",
idempotency_key="YOUR_IDEMPOTENCY_KEY",
token="YOUR_TOKEN",
)
@@ -266,7 +266,7 @@ def unarchive(self, id: str, *, request_options: typing.Optional[RequestOptions]
from whop_sdk import Whop
client = Whop(
- "2026-09-02-2",
+ "2026-09-06",
idempotency_key="YOUR_IDEMPOTENCY_KEY",
token="YOUR_TOKEN",
)
@@ -364,7 +364,7 @@ async def list(
from whop_sdk import AsyncWhop
client = AsyncWhop(
- "2026-09-02-2",
+ "2026-09-06",
idempotency_key="YOUR_IDEMPOTENCY_KEY",
token="YOUR_TOKEN",
)
@@ -431,7 +431,7 @@ async def create(
from whop_sdk import AsyncWhop
client = AsyncWhop(
- "2026-09-02-2",
+ "2026-09-06",
idempotency_key="YOUR_IDEMPOTENCY_KEY",
token="YOUR_TOKEN",
)
@@ -478,7 +478,7 @@ async def retrieve(self, id: str, *, request_options: typing.Optional[RequestOpt
from whop_sdk import AsyncWhop
client = AsyncWhop(
- "2026-09-02-2",
+ "2026-09-06",
idempotency_key="YOUR_IDEMPOTENCY_KEY",
token="YOUR_TOKEN",
)
@@ -522,7 +522,7 @@ async def archive(self, id: str, *, request_options: typing.Optional[RequestOpti
from whop_sdk import AsyncWhop
client = AsyncWhop(
- "2026-09-02-2",
+ "2026-09-06",
idempotency_key="YOUR_IDEMPOTENCY_KEY",
token="YOUR_TOKEN",
)
@@ -566,7 +566,7 @@ async def unarchive(self, id: str, *, request_options: typing.Optional[RequestOp
from whop_sdk import AsyncWhop
client = AsyncWhop(
- "2026-09-02-2",
+ "2026-09-06",
idempotency_key="YOUR_IDEMPOTENCY_KEY",
token="YOUR_TOKEN",
)
diff --git a/src/whop_sdk/affiliates/overrides/client.py b/src/whop_sdk/affiliates/overrides/client.py
index dbc17539..c15d71fb 100644
--- a/src/whop_sdk/affiliates/overrides/client.py
+++ b/src/whop_sdk/affiliates/overrides/client.py
@@ -85,7 +85,7 @@ def list(
from whop_sdk import Whop
client = Whop(
- "2026-09-02-2",
+ "2026-09-06",
idempotency_key="YOUR_IDEMPOTENCY_KEY",
token="YOUR_TOKEN",
)
@@ -140,7 +140,7 @@ def create(
from whop_sdk.affiliates.overrides import CreateOverridesRequestBody_Standard
client = Whop(
- "2026-09-02-2",
+ "2026-09-06",
idempotency_key="YOUR_IDEMPOTENCY_KEY",
token="YOUR_TOKEN",
)
@@ -186,7 +186,7 @@ def retrieve(
from whop_sdk import Whop
client = Whop(
- "2026-09-02-2",
+ "2026-09-06",
idempotency_key="YOUR_IDEMPOTENCY_KEY",
token="YOUR_TOKEN",
)
@@ -226,7 +226,7 @@ def delete(self, id: str, override_id: str, *, request_options: typing.Optional[
from whop_sdk import Whop
client = Whop(
- "2026-09-02-2",
+ "2026-09-06",
idempotency_key="YOUR_IDEMPOTENCY_KEY",
token="YOUR_TOKEN",
)
@@ -288,7 +288,7 @@ def update(
from whop_sdk import Whop
client = Whop(
- "2026-09-02-2",
+ "2026-09-06",
idempotency_key="YOUR_IDEMPOTENCY_KEY",
token="YOUR_TOKEN",
)
@@ -375,7 +375,7 @@ async def list(
from whop_sdk import AsyncWhop
client = AsyncWhop(
- "2026-09-02-2",
+ "2026-09-06",
idempotency_key="YOUR_IDEMPOTENCY_KEY",
token="YOUR_TOKEN",
)
@@ -439,7 +439,7 @@ async def create(
from whop_sdk.affiliates.overrides import CreateOverridesRequestBody_Standard
client = AsyncWhop(
- "2026-09-02-2",
+ "2026-09-06",
idempotency_key="YOUR_IDEMPOTENCY_KEY",
token="YOUR_TOKEN",
)
@@ -493,7 +493,7 @@ async def retrieve(
from whop_sdk import AsyncWhop
client = AsyncWhop(
- "2026-09-02-2",
+ "2026-09-06",
idempotency_key="YOUR_IDEMPOTENCY_KEY",
token="YOUR_TOKEN",
)
@@ -543,7 +543,7 @@ async def delete(
from whop_sdk import AsyncWhop
client = AsyncWhop(
- "2026-09-02-2",
+ "2026-09-06",
idempotency_key="YOUR_IDEMPOTENCY_KEY",
token="YOUR_TOKEN",
)
@@ -613,7 +613,7 @@ async def update(
from whop_sdk import AsyncWhop
client = AsyncWhop(
- "2026-09-02-2",
+ "2026-09-06",
idempotency_key="YOUR_IDEMPOTENCY_KEY",
token="YOUR_TOKEN",
)
diff --git a/src/whop_sdk/ai_chats/client.py b/src/whop_sdk/ai_chats/client.py
index 36e85f69..e56c1f95 100644
--- a/src/whop_sdk/ai_chats/client.py
+++ b/src/whop_sdk/ai_chats/client.py
@@ -6,6 +6,7 @@
from ..core.pagination import AsyncPager, SyncPager
from ..core.request_options import RequestOptions
from ..types.ai_chat import AiChat
+from ..types.ai_chat_agent_identifiers import AiChatAgentIdentifiers
from ..types.ai_chat_list_item import AiChatListItem
from ..types.ai_chat_message_source_types import AiChatMessageSourceTypes
from ..types.ai_chat_notification_preferences import AiChatNotificationPreferences
@@ -39,6 +40,7 @@ def list(
before: typing.Optional[str] = None,
first: typing.Optional[int] = None,
last: typing.Optional[int] = None,
+ agent_identifier: typing.Optional[AiChatAgentIdentifiers] = None,
only_active_crons: typing.Optional[bool] = None,
request_options: typing.Optional[RequestOptions] = None,
) -> SyncPager[AiChatListItem, ListAiChatsResponse]:
@@ -59,6 +61,8 @@ def list(
last : typing.Optional[int]
Returns the last _n_ elements from the list.
+ agent_identifier : typing.Optional[AiChatAgentIdentifiers]
+
only_active_crons : typing.Optional[bool]
When true, returns only chats with an active cron schedule
@@ -75,7 +79,7 @@ def list(
from whop_sdk import Whop
client = Whop(
- "2026-09-02-2",
+ "2026-09-06",
idempotency_key="YOUR_IDEMPOTENCY_KEY",
token="YOUR_TOKEN",
)
@@ -94,6 +98,7 @@ def list(
before=before,
first=first,
last=last,
+ agent_identifier=agent_identifier,
only_active_crons=only_active_crons,
request_options=request_options,
)
@@ -102,6 +107,7 @@ def create(
self,
*,
message_text: str,
+ agent_identifier: typing.Optional[AiChatAgentIdentifiers] = OMIT,
current_account_id: typing.Optional[str] = OMIT,
message_attachments: typing.Optional[typing.Sequence[CreateAiChatsRequestMessageAttachmentsItem]] = OMIT,
message_source: typing.Optional[AiChatMessageSourceTypes] = OMIT,
@@ -120,6 +126,9 @@ def create(
message_text : str
The text content of the first message to send to the AI agent.
+ agent_identifier : typing.Optional[AiChatAgentIdentifiers]
+ The AI agent that handles the chat. Defaults to `support`.
+
current_account_id : typing.Optional[str]
The unique identifier of the account to set as context for the AI chat (e.g., "biz_XXXXX").
@@ -148,7 +157,7 @@ def create(
from whop_sdk import Whop
client = Whop(
- "2026-09-02-2",
+ "2026-09-06",
idempotency_key="YOUR_IDEMPOTENCY_KEY",
token="YOUR_TOKEN",
)
@@ -158,6 +167,7 @@ def create(
"""
_response = self._raw_client.create(
message_text=message_text,
+ agent_identifier=agent_identifier,
current_account_id=current_account_id,
message_attachments=message_attachments,
message_source=message_source,
@@ -189,7 +199,7 @@ def retrieve(self, id: str, *, request_options: typing.Optional[RequestOptions]
from whop_sdk import Whop
client = Whop(
- "2026-09-02-2",
+ "2026-09-06",
idempotency_key="YOUR_IDEMPOTENCY_KEY",
token="YOUR_TOKEN",
)
@@ -225,7 +235,7 @@ def delete(self, id: str, *, request_options: typing.Optional[RequestOptions] =
from whop_sdk import Whop
client = Whop(
- "2026-09-02-2",
+ "2026-09-06",
idempotency_key="YOUR_IDEMPOTENCY_KEY",
token="YOUR_TOKEN",
)
@@ -278,7 +288,7 @@ def update(
from whop_sdk import Whop
client = Whop(
- "2026-09-02-2",
+ "2026-09-06",
idempotency_key="YOUR_IDEMPOTENCY_KEY",
token="YOUR_TOKEN",
)
@@ -318,6 +328,7 @@ async def list(
before: typing.Optional[str] = None,
first: typing.Optional[int] = None,
last: typing.Optional[int] = None,
+ agent_identifier: typing.Optional[AiChatAgentIdentifiers] = None,
only_active_crons: typing.Optional[bool] = None,
request_options: typing.Optional[RequestOptions] = None,
) -> AsyncPager[AiChatListItem, ListAiChatsResponse]:
@@ -338,6 +349,8 @@ async def list(
last : typing.Optional[int]
Returns the last _n_ elements from the list.
+ agent_identifier : typing.Optional[AiChatAgentIdentifiers]
+
only_active_crons : typing.Optional[bool]
When true, returns only chats with an active cron schedule
@@ -356,7 +369,7 @@ async def list(
from whop_sdk import AsyncWhop
client = AsyncWhop(
- "2026-09-02-2",
+ "2026-09-06",
idempotency_key="YOUR_IDEMPOTENCY_KEY",
token="YOUR_TOKEN",
)
@@ -382,6 +395,7 @@ async def main() -> None:
before=before,
first=first,
last=last,
+ agent_identifier=agent_identifier,
only_active_crons=only_active_crons,
request_options=request_options,
)
@@ -390,6 +404,7 @@ async def create(
self,
*,
message_text: str,
+ agent_identifier: typing.Optional[AiChatAgentIdentifiers] = OMIT,
current_account_id: typing.Optional[str] = OMIT,
message_attachments: typing.Optional[typing.Sequence[CreateAiChatsRequestMessageAttachmentsItem]] = OMIT,
message_source: typing.Optional[AiChatMessageSourceTypes] = OMIT,
@@ -408,6 +423,9 @@ async def create(
message_text : str
The text content of the first message to send to the AI agent.
+ agent_identifier : typing.Optional[AiChatAgentIdentifiers]
+ The AI agent that handles the chat. Defaults to `support`.
+
current_account_id : typing.Optional[str]
The unique identifier of the account to set as context for the AI chat (e.g., "biz_XXXXX").
@@ -438,7 +456,7 @@ async def create(
from whop_sdk import AsyncWhop
client = AsyncWhop(
- "2026-09-02-2",
+ "2026-09-06",
idempotency_key="YOUR_IDEMPOTENCY_KEY",
token="YOUR_TOKEN",
)
@@ -454,6 +472,7 @@ async def main() -> None:
"""
_response = await self._raw_client.create(
message_text=message_text,
+ agent_identifier=agent_identifier,
current_account_id=current_account_id,
message_attachments=message_attachments,
message_source=message_source,
@@ -487,7 +506,7 @@ async def retrieve(self, id: str, *, request_options: typing.Optional[RequestOpt
from whop_sdk import AsyncWhop
client = AsyncWhop(
- "2026-09-02-2",
+ "2026-09-06",
idempotency_key="YOUR_IDEMPOTENCY_KEY",
token="YOUR_TOKEN",
)
@@ -531,7 +550,7 @@ async def delete(self, id: str, *, request_options: typing.Optional[RequestOptio
from whop_sdk import AsyncWhop
client = AsyncWhop(
- "2026-09-02-2",
+ "2026-09-06",
idempotency_key="YOUR_IDEMPOTENCY_KEY",
token="YOUR_TOKEN",
)
@@ -592,7 +611,7 @@ async def update(
from whop_sdk import AsyncWhop
client = AsyncWhop(
- "2026-09-02-2",
+ "2026-09-06",
idempotency_key="YOUR_IDEMPOTENCY_KEY",
token="YOUR_TOKEN",
)
diff --git a/src/whop_sdk/ai_chats/raw_client.py b/src/whop_sdk/ai_chats/raw_client.py
index de815fe9..be7dacd8 100644
--- a/src/whop_sdk/ai_chats/raw_client.py
+++ b/src/whop_sdk/ai_chats/raw_client.py
@@ -20,6 +20,7 @@
from ..errors.unauthorized_error import UnauthorizedError
from ..errors.unprocessable_entity_error import UnprocessableEntityError
from ..types.ai_chat import AiChat
+from ..types.ai_chat_agent_identifiers import AiChatAgentIdentifiers
from ..types.ai_chat_list_item import AiChatListItem
from ..types.ai_chat_message_source_types import AiChatMessageSourceTypes
from ..types.ai_chat_notification_preferences import AiChatNotificationPreferences
@@ -42,6 +43,7 @@ def list(
before: typing.Optional[str] = None,
first: typing.Optional[int] = None,
last: typing.Optional[int] = None,
+ agent_identifier: typing.Optional[AiChatAgentIdentifiers] = None,
only_active_crons: typing.Optional[bool] = None,
request_options: typing.Optional[RequestOptions] = None,
) -> SyncPager[AiChatListItem, ListAiChatsResponse]:
@@ -62,6 +64,8 @@ def list(
last : typing.Optional[int]
Returns the last _n_ elements from the list.
+ agent_identifier : typing.Optional[AiChatAgentIdentifiers]
+
only_active_crons : typing.Optional[bool]
When true, returns only chats with an active cron schedule
@@ -81,6 +85,7 @@ def list(
"before": before,
"first": first,
"last": last,
+ "agent_identifier": agent_identifier,
"only_active_crons": only_active_crons,
},
request_options=request_options,
@@ -105,6 +110,7 @@ def list(
before=before,
first=first,
last=last,
+ agent_identifier=agent_identifier,
only_active_crons=only_active_crons,
request_options=request_options,
)
@@ -199,6 +205,7 @@ def create(
self,
*,
message_text: str,
+ agent_identifier: typing.Optional[AiChatAgentIdentifiers] = OMIT,
current_account_id: typing.Optional[str] = OMIT,
message_attachments: typing.Optional[typing.Sequence[CreateAiChatsRequestMessageAttachmentsItem]] = OMIT,
message_source: typing.Optional[AiChatMessageSourceTypes] = OMIT,
@@ -217,6 +224,9 @@ def create(
message_text : str
The text content of the first message to send to the AI agent.
+ agent_identifier : typing.Optional[AiChatAgentIdentifiers]
+ The AI agent that handles the chat. Defaults to `support`.
+
current_account_id : typing.Optional[str]
The unique identifier of the account to set as context for the AI chat (e.g., "biz_XXXXX").
@@ -244,6 +254,7 @@ def create(
"ai_chats",
method="POST",
json={
+ "agent_identifier": agent_identifier,
"current_account_id": current_account_id,
"message_attachments": convert_and_respect_annotation_metadata(
object_=message_attachments,
@@ -755,6 +766,7 @@ async def list(
before: typing.Optional[str] = None,
first: typing.Optional[int] = None,
last: typing.Optional[int] = None,
+ agent_identifier: typing.Optional[AiChatAgentIdentifiers] = None,
only_active_crons: typing.Optional[bool] = None,
request_options: typing.Optional[RequestOptions] = None,
) -> AsyncPager[AiChatListItem, ListAiChatsResponse]:
@@ -775,6 +787,8 @@ async def list(
last : typing.Optional[int]
Returns the last _n_ elements from the list.
+ agent_identifier : typing.Optional[AiChatAgentIdentifiers]
+
only_active_crons : typing.Optional[bool]
When true, returns only chats with an active cron schedule
@@ -794,6 +808,7 @@ async def list(
"before": before,
"first": first,
"last": last,
+ "agent_identifier": agent_identifier,
"only_active_crons": only_active_crons,
},
request_options=request_options,
@@ -820,6 +835,7 @@ async def _get_next():
before=before,
first=first,
last=last,
+ agent_identifier=agent_identifier,
only_active_crons=only_active_crons,
request_options=request_options,
)
@@ -915,6 +931,7 @@ async def create(
self,
*,
message_text: str,
+ agent_identifier: typing.Optional[AiChatAgentIdentifiers] = OMIT,
current_account_id: typing.Optional[str] = OMIT,
message_attachments: typing.Optional[typing.Sequence[CreateAiChatsRequestMessageAttachmentsItem]] = OMIT,
message_source: typing.Optional[AiChatMessageSourceTypes] = OMIT,
@@ -933,6 +950,9 @@ async def create(
message_text : str
The text content of the first message to send to the AI agent.
+ agent_identifier : typing.Optional[AiChatAgentIdentifiers]
+ The AI agent that handles the chat. Defaults to `support`.
+
current_account_id : typing.Optional[str]
The unique identifier of the account to set as context for the AI chat (e.g., "biz_XXXXX").
@@ -960,6 +980,7 @@ async def create(
"ai_chats",
method="POST",
json={
+ "agent_identifier": agent_identifier,
"current_account_id": current_account_id,
"message_attachments": convert_and_respect_annotation_metadata(
object_=message_attachments,
diff --git a/src/whop_sdk/api_keys/client.py b/src/whop_sdk/api_keys/client.py
index 480b1779..22bd37e1 100644
--- a/src/whop_sdk/api_keys/client.py
+++ b/src/whop_sdk/api_keys/client.py
@@ -103,7 +103,7 @@ def list(
from whop_sdk import Whop
client = Whop(
- "2026-09-02-2",
+ "2026-09-06",
idempotency_key="YOUR_IDEMPOTENCY_KEY",
token="YOUR_TOKEN",
)
@@ -183,7 +183,7 @@ def create(
from whop_sdk.api_keys import CreateApiKeysRequestPermissions
client = Whop(
- "2026-09-02-2",
+ "2026-09-06",
idempotency_key="YOUR_IDEMPOTENCY_KEY",
token="YOUR_TOKEN",
)
@@ -227,7 +227,7 @@ def list_permissions(
from whop_sdk import Whop
client = Whop(
- "2026-09-02-2",
+ "2026-09-06",
idempotency_key="YOUR_IDEMPOTENCY_KEY",
token="YOUR_TOKEN",
)
@@ -258,7 +258,7 @@ def retrieve(self, id: str, *, request_options: typing.Optional[RequestOptions]
from whop_sdk import Whop
client = Whop(
- "2026-09-02-2",
+ "2026-09-06",
idempotency_key="YOUR_IDEMPOTENCY_KEY",
token="YOUR_TOKEN",
)
@@ -291,7 +291,7 @@ def delete(self, id: str, *, request_options: typing.Optional[RequestOptions] =
from whop_sdk import Whop
client = Whop(
- "2026-09-02-2",
+ "2026-09-06",
idempotency_key="YOUR_IDEMPOTENCY_KEY",
token="YOUR_TOKEN",
)
@@ -349,7 +349,7 @@ def update(
from whop_sdk import Whop
client = Whop(
- "2026-09-02-2",
+ "2026-09-06",
idempotency_key="YOUR_IDEMPOTENCY_KEY",
token="YOUR_TOKEN",
)
@@ -390,7 +390,7 @@ def rotate(self, id: str, *, request_options: typing.Optional[RequestOptions] =
from whop_sdk import Whop
client = Whop(
- "2026-09-02-2",
+ "2026-09-06",
idempotency_key="YOUR_IDEMPOTENCY_KEY",
token="YOUR_TOKEN",
)
@@ -482,7 +482,7 @@ async def list(
from whop_sdk import AsyncWhop
client = AsyncWhop(
- "2026-09-02-2",
+ "2026-09-06",
idempotency_key="YOUR_IDEMPOTENCY_KEY",
token="YOUR_TOKEN",
)
@@ -571,7 +571,7 @@ async def create(
from whop_sdk.api_keys import CreateApiKeysRequestPermissions
client = AsyncWhop(
- "2026-09-02-2",
+ "2026-09-06",
idempotency_key="YOUR_IDEMPOTENCY_KEY",
token="YOUR_TOKEN",
)
@@ -623,7 +623,7 @@ async def list_permissions(
from whop_sdk import AsyncWhop
client = AsyncWhop(
- "2026-09-02-2",
+ "2026-09-06",
idempotency_key="YOUR_IDEMPOTENCY_KEY",
token="YOUR_TOKEN",
)
@@ -662,7 +662,7 @@ async def retrieve(self, id: str, *, request_options: typing.Optional[RequestOpt
from whop_sdk import AsyncWhop
client = AsyncWhop(
- "2026-09-02-2",
+ "2026-09-06",
idempotency_key="YOUR_IDEMPOTENCY_KEY",
token="YOUR_TOKEN",
)
@@ -705,7 +705,7 @@ async def delete(
from whop_sdk import AsyncWhop
client = AsyncWhop(
- "2026-09-02-2",
+ "2026-09-06",
idempotency_key="YOUR_IDEMPOTENCY_KEY",
token="YOUR_TOKEN",
)
@@ -771,7 +771,7 @@ async def update(
from whop_sdk import AsyncWhop
client = AsyncWhop(
- "2026-09-02-2",
+ "2026-09-06",
idempotency_key="YOUR_IDEMPOTENCY_KEY",
token="YOUR_TOKEN",
)
@@ -820,7 +820,7 @@ async def rotate(self, id: str, *, request_options: typing.Optional[RequestOptio
from whop_sdk import AsyncWhop
client = AsyncWhop(
- "2026-09-02-2",
+ "2026-09-06",
idempotency_key="YOUR_IDEMPOTENCY_KEY",
token="YOUR_TOKEN",
)
diff --git a/src/whop_sdk/api_keys/types/create_api_keys_request_api_version_date.py b/src/whop_sdk/api_keys/types/create_api_keys_request_api_version_date.py
index d0f105c6..a76d56b4 100644
--- a/src/whop_sdk/api_keys/types/create_api_keys_request_api_version_date.py
+++ b/src/whop_sdk/api_keys/types/create_api_keys_request_api_version_date.py
@@ -37,6 +37,8 @@
"2026-09-02",
"2026-09-02-1",
"2026-09-02-2",
+ "2026-09-04",
+ "2026-09-06",
],
typing.Any,
]
diff --git a/src/whop_sdk/api_keys/types/update_api_keys_request_api_version_date.py b/src/whop_sdk/api_keys/types/update_api_keys_request_api_version_date.py
index cd1b62c9..16938b28 100644
--- a/src/whop_sdk/api_keys/types/update_api_keys_request_api_version_date.py
+++ b/src/whop_sdk/api_keys/types/update_api_keys_request_api_version_date.py
@@ -37,6 +37,8 @@
"2026-09-02",
"2026-09-02-1",
"2026-09-02-2",
+ "2026-09-04",
+ "2026-09-06",
],
typing.Any,
]
diff --git a/src/whop_sdk/api_logs/client.py b/src/whop_sdk/api_logs/client.py
index b52b0d31..4be3a7de 100644
--- a/src/whop_sdk/api_logs/client.py
+++ b/src/whop_sdk/api_logs/client.py
@@ -94,7 +94,7 @@ def list(
from whop_sdk import Whop
client = Whop(
- "2026-09-02-2",
+ "2026-09-06",
idempotency_key="YOUR_IDEMPOTENCY_KEY",
token="YOUR_TOKEN",
)
@@ -205,7 +205,7 @@ async def list(
from whop_sdk import AsyncWhop
client = AsyncWhop(
- "2026-09-02-2",
+ "2026-09-06",
idempotency_key="YOUR_IDEMPOTENCY_KEY",
token="YOUR_TOKEN",
)
diff --git a/src/whop_sdk/app_builds/client.py b/src/whop_sdk/app_builds/client.py
index e1101c39..0b74f733 100644
--- a/src/whop_sdk/app_builds/client.py
+++ b/src/whop_sdk/app_builds/client.py
@@ -97,7 +97,7 @@ def list(
from whop_sdk import Whop
client = Whop(
- "2026-09-02-2",
+ "2026-09-06",
idempotency_key="YOUR_IDEMPOTENCY_KEY",
token="YOUR_TOKEN",
)
@@ -177,7 +177,7 @@ def create(
from whop_sdk.app_builds import CreateAppBuildsRequestAttachment
client = Whop(
- "2026-09-02-2",
+ "2026-09-06",
idempotency_key="YOUR_IDEMPOTENCY_KEY",
token="YOUR_TOKEN",
)
@@ -221,7 +221,7 @@ def retrieve(self, id: str, *, request_options: typing.Optional[RequestOptions]
from whop_sdk import Whop
client = Whop(
- "2026-09-02-2",
+ "2026-09-06",
idempotency_key="YOUR_IDEMPOTENCY_KEY",
token="YOUR_TOKEN",
)
@@ -254,7 +254,7 @@ def promote(self, id: str, *, request_options: typing.Optional[RequestOptions] =
from whop_sdk import Whop
client = Whop(
- "2026-09-02-2",
+ "2026-09-06",
idempotency_key="YOUR_IDEMPOTENCY_KEY",
token="YOUR_TOKEN",
)
@@ -342,7 +342,7 @@ async def list(
from whop_sdk import AsyncWhop
client = AsyncWhop(
- "2026-09-02-2",
+ "2026-09-06",
idempotency_key="YOUR_IDEMPOTENCY_KEY",
token="YOUR_TOKEN",
)
@@ -431,7 +431,7 @@ async def create(
from whop_sdk.app_builds import CreateAppBuildsRequestAttachment
client = AsyncWhop(
- "2026-09-02-2",
+ "2026-09-06",
idempotency_key="YOUR_IDEMPOTENCY_KEY",
token="YOUR_TOKEN",
)
@@ -483,7 +483,7 @@ async def retrieve(self, id: str, *, request_options: typing.Optional[RequestOpt
from whop_sdk import AsyncWhop
client = AsyncWhop(
- "2026-09-02-2",
+ "2026-09-06",
idempotency_key="YOUR_IDEMPOTENCY_KEY",
token="YOUR_TOKEN",
)
@@ -524,7 +524,7 @@ async def promote(self, id: str, *, request_options: typing.Optional[RequestOpti
from whop_sdk import AsyncWhop
client = AsyncWhop(
- "2026-09-02-2",
+ "2026-09-06",
idempotency_key="YOUR_IDEMPOTENCY_KEY",
token="YOUR_TOKEN",
)
diff --git a/src/whop_sdk/apps/__init__.py b/src/whop_sdk/apps/__init__.py
index 87837706..f7b5a3a4 100644
--- a/src/whop_sdk/apps/__init__.py
+++ b/src/whop_sdk/apps/__init__.py
@@ -26,7 +26,6 @@
UpdateAppsRequestIcon,
UpdateAppsRequestOauthClientType,
UpdateAppsRequestStatus,
- UpdatePermissionsAppRequestRequestedPermissionsItem,
UpdatePermissionsAppsRequestRequestedPermissionsItem,
)
_dynamic_imports: typing.Dict[str, str] = {
@@ -49,7 +48,6 @@
"UpdateAppsRequestIcon": ".types",
"UpdateAppsRequestOauthClientType": ".types",
"UpdateAppsRequestStatus": ".types",
- "UpdatePermissionsAppRequestRequestedPermissionsItem": ".types",
"UpdatePermissionsAppsRequestRequestedPermissionsItem": ".types",
}
@@ -95,6 +93,5 @@ def __dir__():
"UpdateAppsRequestIcon",
"UpdateAppsRequestOauthClientType",
"UpdateAppsRequestStatus",
- "UpdatePermissionsAppRequestRequestedPermissionsItem",
"UpdatePermissionsAppsRequestRequestedPermissionsItem",
]
diff --git a/src/whop_sdk/apps/client.py b/src/whop_sdk/apps/client.py
index cbbcbf62..dd0ed438 100644
--- a/src/whop_sdk/apps/client.py
+++ b/src/whop_sdk/apps/client.py
@@ -25,9 +25,6 @@
from .types.update_apps_request_icon import UpdateAppsRequestIcon
from .types.update_apps_request_oauth_client_type import UpdateAppsRequestOauthClientType
from .types.update_apps_request_status import UpdateAppsRequestStatus
-from .types.update_permissions_app_request_requested_permissions_item import (
- UpdatePermissionsAppRequestRequestedPermissionsItem,
-)
from .types.update_permissions_apps_request_requested_permissions_item import (
UpdatePermissionsAppsRequestRequestedPermissionsItem,
)
@@ -126,7 +123,7 @@ def list(
from whop_sdk import Whop
client = Whop(
- "2026-09-02-2",
+ "2026-09-06",
idempotency_key="YOUR_IDEMPOTENCY_KEY",
token="YOUR_TOKEN",
)
@@ -205,7 +202,7 @@ def create(
from whop_sdk import Whop
client = Whop(
- "2026-09-02-2",
+ "2026-09-06",
idempotency_key="YOUR_IDEMPOTENCY_KEY",
token="YOUR_TOKEN",
)
@@ -225,61 +222,6 @@ def create(
)
return _response.data
- def update_permissions_app(
- self,
- app_id: str,
- *,
- requested_permissions: typing.Sequence[UpdatePermissionsAppRequestRequestedPermissionsItem],
- request_options: typing.Optional[RequestOptions] = None,
- ) -> bool:
- """
- Updates the permission requirements for an app
-
- Required permissions:
- - `developer:update_app_authorization`
-
- Parameters
- ----------
- app_id : str
- The ID of the app the permission requirements are being updated for
-
- requested_permissions : typing.Sequence[UpdatePermissionsAppRequestRequestedPermissionsItem]
- The permissions that the app will request off of users when a user installs the app.
-
- request_options : typing.Optional[RequestOptions]
- Request-specific configuration.
-
- Returns
- -------
- bool
- A successful response
-
- Examples
- --------
- from whop_sdk import Whop
- from whop_sdk.apps import UpdatePermissionsAppRequestRequestedPermissionsItem
-
- client = Whop(
- "2026-09-02-2",
- idempotency_key="YOUR_IDEMPOTENCY_KEY",
- token="YOUR_TOKEN",
- )
- client.apps.update_permissions_app(
- app_id="app_id",
- requested_permissions=[
- UpdatePermissionsAppRequestRequestedPermissionsItem(
- action="action",
- is_required=True,
- justification="justification",
- )
- ],
- )
- """
- _response = self._raw_client.update_permissions_app(
- app_id, requested_permissions=requested_permissions, request_options=request_options
- )
- return _response.data
-
def retrieve(self, id: str, *, request_options: typing.Optional[RequestOptions] = None) -> App:
"""
Retrieves an app by ID, claimed route, or proxy domain id. Credential fields (api_key, default_api_key, secrets) render `null` unless the caller has the corresponding developer permission on the owning account.
@@ -302,7 +244,7 @@ def retrieve(self, id: str, *, request_options: typing.Optional[RequestOptions]
from whop_sdk import Whop
client = Whop(
- "2026-09-02-2",
+ "2026-09-06",
idempotency_key="YOUR_IDEMPOTENCY_KEY",
token="YOUR_TOKEN",
)
@@ -335,7 +277,7 @@ def delete(self, id: str, *, request_options: typing.Optional[RequestOptions] =
from whop_sdk import Whop
client = Whop(
- "2026-09-02-2",
+ "2026-09-06",
idempotency_key="YOUR_IDEMPOTENCY_KEY",
token="YOUR_TOKEN",
)
@@ -453,7 +395,7 @@ def update(
from whop_sdk import Whop
client = Whop(
- "2026-09-02-2",
+ "2026-09-06",
idempotency_key="YOUR_IDEMPOTENCY_KEY",
token="YOUR_TOKEN",
)
@@ -514,7 +456,7 @@ def deploy(
from whop_sdk import Whop
client = Whop(
- "2026-09-02-2",
+ "2026-09-06",
idempotency_key="YOUR_IDEMPOTENCY_KEY",
token="YOUR_TOKEN",
)
@@ -584,7 +526,7 @@ def logs(
from whop_sdk import Whop
client = Whop(
- "2026-09-02-2",
+ "2026-09-06",
idempotency_key="YOUR_IDEMPOTENCY_KEY",
token="YOUR_TOKEN",
)
@@ -642,7 +584,7 @@ def update_permissions(
from whop_sdk.apps import UpdatePermissionsAppsRequestRequestedPermissionsItem
client = Whop(
- "2026-09-02-2",
+ "2026-09-06",
idempotency_key="YOUR_IDEMPOTENCY_KEY",
token="YOUR_TOKEN",
)
@@ -755,7 +697,7 @@ async def list(
from whop_sdk import AsyncWhop
client = AsyncWhop(
- "2026-09-02-2",
+ "2026-09-06",
idempotency_key="YOUR_IDEMPOTENCY_KEY",
token="YOUR_TOKEN",
)
@@ -843,7 +785,7 @@ async def create(
from whop_sdk import AsyncWhop
client = AsyncWhop(
- "2026-09-02-2",
+ "2026-09-06",
idempotency_key="YOUR_IDEMPOTENCY_KEY",
token="YOUR_TOKEN",
)
@@ -869,69 +811,6 @@ async def main() -> None:
)
return _response.data
- async def update_permissions_app(
- self,
- app_id: str,
- *,
- requested_permissions: typing.Sequence[UpdatePermissionsAppRequestRequestedPermissionsItem],
- request_options: typing.Optional[RequestOptions] = None,
- ) -> bool:
- """
- Updates the permission requirements for an app
-
- Required permissions:
- - `developer:update_app_authorization`
-
- Parameters
- ----------
- app_id : str
- The ID of the app the permission requirements are being updated for
-
- requested_permissions : typing.Sequence[UpdatePermissionsAppRequestRequestedPermissionsItem]
- The permissions that the app will request off of users when a user installs the app.
-
- request_options : typing.Optional[RequestOptions]
- Request-specific configuration.
-
- Returns
- -------
- bool
- A successful response
-
- Examples
- --------
- import asyncio
-
- from whop_sdk import AsyncWhop
- from whop_sdk.apps import UpdatePermissionsAppRequestRequestedPermissionsItem
-
- client = AsyncWhop(
- "2026-09-02-2",
- idempotency_key="YOUR_IDEMPOTENCY_KEY",
- token="YOUR_TOKEN",
- )
-
-
- async def main() -> None:
- await client.apps.update_permissions_app(
- app_id="app_id",
- requested_permissions=[
- UpdatePermissionsAppRequestRequestedPermissionsItem(
- action="action",
- is_required=True,
- justification="justification",
- )
- ],
- )
-
-
- asyncio.run(main())
- """
- _response = await self._raw_client.update_permissions_app(
- app_id, requested_permissions=requested_permissions, request_options=request_options
- )
- return _response.data
-
async def retrieve(self, id: str, *, request_options: typing.Optional[RequestOptions] = None) -> App:
"""
Retrieves an app by ID, claimed route, or proxy domain id. Credential fields (api_key, default_api_key, secrets) render `null` unless the caller has the corresponding developer permission on the owning account.
@@ -956,7 +835,7 @@ async def retrieve(self, id: str, *, request_options: typing.Optional[RequestOpt
from whop_sdk import AsyncWhop
client = AsyncWhop(
- "2026-09-02-2",
+ "2026-09-06",
idempotency_key="YOUR_IDEMPOTENCY_KEY",
token="YOUR_TOKEN",
)
@@ -997,7 +876,7 @@ async def delete(self, id: str, *, request_options: typing.Optional[RequestOptio
from whop_sdk import AsyncWhop
client = AsyncWhop(
- "2026-09-02-2",
+ "2026-09-06",
idempotency_key="YOUR_IDEMPOTENCY_KEY",
token="YOUR_TOKEN",
)
@@ -1123,7 +1002,7 @@ async def update(
from whop_sdk import AsyncWhop
client = AsyncWhop(
- "2026-09-02-2",
+ "2026-09-06",
idempotency_key="YOUR_IDEMPOTENCY_KEY",
token="YOUR_TOKEN",
)
@@ -1192,7 +1071,7 @@ async def deploy(
from whop_sdk import AsyncWhop
client = AsyncWhop(
- "2026-09-02-2",
+ "2026-09-06",
idempotency_key="YOUR_IDEMPOTENCY_KEY",
token="YOUR_TOKEN",
)
@@ -1270,7 +1149,7 @@ async def logs(
from whop_sdk import AsyncWhop
client = AsyncWhop(
- "2026-09-02-2",
+ "2026-09-06",
idempotency_key="YOUR_IDEMPOTENCY_KEY",
token="YOUR_TOKEN",
)
@@ -1337,7 +1216,7 @@ async def update_permissions(
from whop_sdk.apps import UpdatePermissionsAppsRequestRequestedPermissionsItem
client = AsyncWhop(
- "2026-09-02-2",
+ "2026-09-06",
idempotency_key="YOUR_IDEMPOTENCY_KEY",
token="YOUR_TOKEN",
)
diff --git a/src/whop_sdk/apps/raw_client.py b/src/whop_sdk/apps/raw_client.py
index a470c56b..0be3939d 100644
--- a/src/whop_sdk/apps/raw_client.py
+++ b/src/whop_sdk/apps/raw_client.py
@@ -17,11 +17,8 @@
from ..errors.bad_request_error import BadRequestError
from ..errors.conflict_error import ConflictError
from ..errors.forbidden_error import ForbiddenError
-from ..errors.internal_server_error import InternalServerError
from ..errors.not_found_error import NotFoundError
-from ..errors.too_many_requests_error import TooManyRequestsError
from ..errors.unauthorized_error import UnauthorizedError
-from ..errors.unprocessable_entity_error import UnprocessableEntityError
from ..types.app import App
from ..types.app_deployment import AppDeployment
from ..types.app_list_item import AppListItem
@@ -41,9 +38,6 @@
from .types.update_apps_request_icon import UpdateAppsRequestIcon
from .types.update_apps_request_oauth_client_type import UpdateAppsRequestOauthClientType
from .types.update_apps_request_status import UpdateAppsRequestStatus
-from .types.update_permissions_app_request_requested_permissions_item import (
- UpdatePermissionsAppRequestRequestedPermissionsItem,
-)
from .types.update_permissions_apps_request_requested_permissions_item import (
UpdatePermissionsAppsRequestRequestedPermissionsItem,
)
@@ -350,147 +344,6 @@ def create(
)
raise ApiError(status_code=_response.status_code, headers=dict(_response.headers), body=_response_json)
- def update_permissions_app(
- self,
- app_id: str,
- *,
- requested_permissions: typing.Sequence[UpdatePermissionsAppRequestRequestedPermissionsItem],
- request_options: typing.Optional[RequestOptions] = None,
- ) -> HttpResponse[bool]:
- """
- Updates the permission requirements for an app
-
- Required permissions:
- - `developer:update_app_authorization`
-
- Parameters
- ----------
- app_id : str
- The ID of the app the permission requirements are being updated for
-
- requested_permissions : typing.Sequence[UpdatePermissionsAppRequestRequestedPermissionsItem]
- The permissions that the app will request off of users when a user installs the app.
-
- request_options : typing.Optional[RequestOptions]
- Request-specific configuration.
-
- Returns
- -------
- HttpResponse[bool]
- A successful response
- """
- _response = self._client_wrapper.httpx_client.request(
- f"apps/{encode_path_param(app_id)}/permissions",
- method="PATCH",
- json={
- "requested_permissions": convert_and_respect_annotation_metadata(
- object_=requested_permissions,
- annotation=typing.Sequence[UpdatePermissionsAppRequestRequestedPermissionsItem],
- direction="write",
- ),
- },
- headers={
- "content-type": "application/json",
- },
- request_options=request_options,
- omit=OMIT,
- )
- try:
- if 200 <= _response.status_code < 300:
- _data = typing.cast(
- bool,
- parse_obj_as(
- type_=bool, # type: ignore
- object_=_response.json(),
- ),
- )
- return HttpResponse(response=_response, data=_data)
- if _response.status_code == 400:
- raise BadRequestError(
- headers=dict(_response.headers),
- body=typing.cast(
- typing.Any,
- parse_obj_as(
- type_=typing.Any, # type: ignore
- object_=_response.json(),
- ),
- ),
- )
- if _response.status_code == 401:
- raise UnauthorizedError(
- headers=dict(_response.headers),
- body=typing.cast(
- typing.Any,
- parse_obj_as(
- type_=typing.Any, # type: ignore
- object_=_response.json(),
- ),
- ),
- )
- if _response.status_code == 403:
- raise ForbiddenError(
- headers=dict(_response.headers),
- body=typing.cast(
- typing.Any,
- parse_obj_as(
- type_=typing.Any, # type: ignore
- object_=_response.json(),
- ),
- ),
- )
- if _response.status_code == 404:
- raise NotFoundError(
- headers=dict(_response.headers),
- body=typing.cast(
- typing.Any,
- parse_obj_as(
- type_=typing.Any, # type: ignore
- object_=_response.json(),
- ),
- ),
- )
- if _response.status_code == 422:
- raise UnprocessableEntityError(
- headers=dict(_response.headers),
- body=typing.cast(
- typing.Any,
- parse_obj_as(
- type_=typing.Any, # type: ignore
- object_=_response.json(),
- ),
- ),
- )
- if _response.status_code == 429:
- raise TooManyRequestsError(
- headers=dict(_response.headers),
- body=typing.cast(
- typing.Any,
- parse_obj_as(
- type_=typing.Any, # type: ignore
- object_=_response.json(),
- ),
- ),
- )
- if _response.status_code == 500:
- raise InternalServerError(
- headers=dict(_response.headers),
- body=typing.cast(
- typing.Any,
- parse_obj_as(
- type_=typing.Any, # type: ignore
- object_=_response.json(),
- ),
- ),
- )
- _response_json = _response.json()
- except JSONDecodeError:
- raise ApiError(status_code=_response.status_code, headers=dict(_response.headers), body=_response.text)
- except ValidationError as e:
- raise ParsingError(
- status_code=_response.status_code, headers=dict(_response.headers), body=_response.json(), cause=e
- )
- raise ApiError(status_code=_response.status_code, headers=dict(_response.headers), body=_response_json)
-
def retrieve(self, id: str, *, request_options: typing.Optional[RequestOptions] = None) -> HttpResponse[App]:
"""
Retrieves an app by ID, claimed route, or proxy domain id. Credential fields (api_key, default_api_key, secrets) render `null` unless the caller has the corresponding developer permission on the owning account.
@@ -1437,147 +1290,6 @@ async def create(
)
raise ApiError(status_code=_response.status_code, headers=dict(_response.headers), body=_response_json)
- async def update_permissions_app(
- self,
- app_id: str,
- *,
- requested_permissions: typing.Sequence[UpdatePermissionsAppRequestRequestedPermissionsItem],
- request_options: typing.Optional[RequestOptions] = None,
- ) -> AsyncHttpResponse[bool]:
- """
- Updates the permission requirements for an app
-
- Required permissions:
- - `developer:update_app_authorization`
-
- Parameters
- ----------
- app_id : str
- The ID of the app the permission requirements are being updated for
-
- requested_permissions : typing.Sequence[UpdatePermissionsAppRequestRequestedPermissionsItem]
- The permissions that the app will request off of users when a user installs the app.
-
- request_options : typing.Optional[RequestOptions]
- Request-specific configuration.
-
- Returns
- -------
- AsyncHttpResponse[bool]
- A successful response
- """
- _response = await self._client_wrapper.httpx_client.request(
- f"apps/{encode_path_param(app_id)}/permissions",
- method="PATCH",
- json={
- "requested_permissions": convert_and_respect_annotation_metadata(
- object_=requested_permissions,
- annotation=typing.Sequence[UpdatePermissionsAppRequestRequestedPermissionsItem],
- direction="write",
- ),
- },
- headers={
- "content-type": "application/json",
- },
- request_options=request_options,
- omit=OMIT,
- )
- try:
- if 200 <= _response.status_code < 300:
- _data = typing.cast(
- bool,
- parse_obj_as(
- type_=bool, # type: ignore
- object_=_response.json(),
- ),
- )
- return AsyncHttpResponse(response=_response, data=_data)
- if _response.status_code == 400:
- raise BadRequestError(
- headers=dict(_response.headers),
- body=typing.cast(
- typing.Any,
- parse_obj_as(
- type_=typing.Any, # type: ignore
- object_=_response.json(),
- ),
- ),
- )
- if _response.status_code == 401:
- raise UnauthorizedError(
- headers=dict(_response.headers),
- body=typing.cast(
- typing.Any,
- parse_obj_as(
- type_=typing.Any, # type: ignore
- object_=_response.json(),
- ),
- ),
- )
- if _response.status_code == 403:
- raise ForbiddenError(
- headers=dict(_response.headers),
- body=typing.cast(
- typing.Any,
- parse_obj_as(
- type_=typing.Any, # type: ignore
- object_=_response.json(),
- ),
- ),
- )
- if _response.status_code == 404:
- raise NotFoundError(
- headers=dict(_response.headers),
- body=typing.cast(
- typing.Any,
- parse_obj_as(
- type_=typing.Any, # type: ignore
- object_=_response.json(),
- ),
- ),
- )
- if _response.status_code == 422:
- raise UnprocessableEntityError(
- headers=dict(_response.headers),
- body=typing.cast(
- typing.Any,
- parse_obj_as(
- type_=typing.Any, # type: ignore
- object_=_response.json(),
- ),
- ),
- )
- if _response.status_code == 429:
- raise TooManyRequestsError(
- headers=dict(_response.headers),
- body=typing.cast(
- typing.Any,
- parse_obj_as(
- type_=typing.Any, # type: ignore
- object_=_response.json(),
- ),
- ),
- )
- if _response.status_code == 500:
- raise InternalServerError(
- headers=dict(_response.headers),
- body=typing.cast(
- typing.Any,
- parse_obj_as(
- type_=typing.Any, # type: ignore
- object_=_response.json(),
- ),
- ),
- )
- _response_json = _response.json()
- except JSONDecodeError:
- raise ApiError(status_code=_response.status_code, headers=dict(_response.headers), body=_response.text)
- except ValidationError as e:
- raise ParsingError(
- status_code=_response.status_code, headers=dict(_response.headers), body=_response.json(), cause=e
- )
- raise ApiError(status_code=_response.status_code, headers=dict(_response.headers), body=_response_json)
-
async def retrieve(
self, id: str, *, request_options: typing.Optional[RequestOptions] = None
) -> AsyncHttpResponse[App]:
diff --git a/src/whop_sdk/apps/types/__init__.py b/src/whop_sdk/apps/types/__init__.py
index c2b5f241..902375c7 100644
--- a/src/whop_sdk/apps/types/__init__.py
+++ b/src/whop_sdk/apps/types/__init__.py
@@ -25,9 +25,6 @@
from .update_apps_request_icon import UpdateAppsRequestIcon
from .update_apps_request_oauth_client_type import UpdateAppsRequestOauthClientType
from .update_apps_request_status import UpdateAppsRequestStatus
- from .update_permissions_app_request_requested_permissions_item import (
- UpdatePermissionsAppRequestRequestedPermissionsItem,
- )
from .update_permissions_apps_request_requested_permissions_item import (
UpdatePermissionsAppsRequestRequestedPermissionsItem,
)
@@ -51,7 +48,6 @@
"UpdateAppsRequestIcon": ".update_apps_request_icon",
"UpdateAppsRequestOauthClientType": ".update_apps_request_oauth_client_type",
"UpdateAppsRequestStatus": ".update_apps_request_status",
- "UpdatePermissionsAppRequestRequestedPermissionsItem": ".update_permissions_app_request_requested_permissions_item",
"UpdatePermissionsAppsRequestRequestedPermissionsItem": ".update_permissions_apps_request_requested_permissions_item",
}
@@ -97,6 +93,5 @@ def __dir__():
"UpdateAppsRequestIcon",
"UpdateAppsRequestOauthClientType",
"UpdateAppsRequestStatus",
- "UpdatePermissionsAppRequestRequestedPermissionsItem",
"UpdatePermissionsAppsRequestRequestedPermissionsItem",
]
diff --git a/src/whop_sdk/apps/types/update_permissions_app_request_requested_permissions_item.py b/src/whop_sdk/apps/types/update_permissions_app_request_requested_permissions_item.py
deleted file mode 100644
index 96bac6aa..00000000
--- a/src/whop_sdk/apps/types/update_permissions_app_request_requested_permissions_item.py
+++ /dev/null
@@ -1,36 +0,0 @@
-# This file was auto-generated by Fern from our API Definition.
-
-import typing
-
-import pydantic
-from ...core.pydantic_utilities import IS_PYDANTIC_V2, UniversalBaseModel
-
-
-class UpdatePermissionsAppRequestRequestedPermissionsItem(UniversalBaseModel):
- """
- Input for creating a requested permission
- """
-
- action: str = pydantic.Field()
- """
- The action that the app will request off of users when a user installs the app.
- """
-
- is_required: bool = pydantic.Field()
- """
- Whether the action is required for the app to function.
- """
-
- justification: str = pydantic.Field()
- """
- The reason for requesting the action.
- """
-
- if IS_PYDANTIC_V2:
- model_config: typing.ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(extra="allow", frozen=True) # type: ignore # Pydantic v2
- else:
-
- class Config:
- frozen = True
- smart_union = True
- extra = pydantic.Extra.allow
diff --git a/src/whop_sdk/audiences/__init__.py b/src/whop_sdk/audiences/__init__.py
index c93cebb7..e1fc22c0 100644
--- a/src/whop_sdk/audiences/__init__.py
+++ b/src/whop_sdk/audiences/__init__.py
@@ -9,6 +9,9 @@
from .types import (
CreateAudiencesRequestAudienceType,
CreateAudiencesRequestColumnMapping,
+ CreateAudiencesRequestEngagement,
+ CreateAudiencesRequestEngagementPlatform,
+ CreateAudiencesRequestSourceType,
CreateAudiencesResponse,
CreateAudiencesResponseData,
DeleteAudiencesResponse,
@@ -20,6 +23,9 @@
_dynamic_imports: typing.Dict[str, str] = {
"CreateAudiencesRequestAudienceType": ".types",
"CreateAudiencesRequestColumnMapping": ".types",
+ "CreateAudiencesRequestEngagement": ".types",
+ "CreateAudiencesRequestEngagementPlatform": ".types",
+ "CreateAudiencesRequestSourceType": ".types",
"CreateAudiencesResponse": ".types",
"CreateAudiencesResponseData": ".types",
"DeleteAudiencesResponse": ".types",
@@ -54,6 +60,9 @@ def __dir__():
__all__ = [
"CreateAudiencesRequestAudienceType",
"CreateAudiencesRequestColumnMapping",
+ "CreateAudiencesRequestEngagement",
+ "CreateAudiencesRequestEngagementPlatform",
+ "CreateAudiencesRequestSourceType",
"CreateAudiencesResponse",
"CreateAudiencesResponseData",
"DeleteAudiencesResponse",
diff --git a/src/whop_sdk/audiences/client.py b/src/whop_sdk/audiences/client.py
index d6da034d..3db131c6 100644
--- a/src/whop_sdk/audiences/client.py
+++ b/src/whop_sdk/audiences/client.py
@@ -9,6 +9,8 @@
from .raw_client import AsyncRawAudiencesClient, RawAudiencesClient
from .types.create_audiences_request_audience_type import CreateAudiencesRequestAudienceType
from .types.create_audiences_request_column_mapping import CreateAudiencesRequestColumnMapping
+from .types.create_audiences_request_engagement import CreateAudiencesRequestEngagement
+from .types.create_audiences_request_source_type import CreateAudiencesRequestSourceType
from .types.create_audiences_response import CreateAudiencesResponse
from .types.delete_audiences_response import DeleteAudiencesResponse
from .types.list_audiences_request_audience_type import ListAudiencesRequestAudienceType
@@ -46,7 +48,7 @@ def list(
request_options: typing.Optional[RequestOptions] = None,
) -> SyncPager[Audience, ListAudiencesResponse]:
"""
- Lists uploaded customer-list audiences for an account. Pass `audience_id` to return a specific audience.
+ List custom and lookalike audiences for an account. Pass `audience_id` to return a specific audience.
Parameters
----------
@@ -57,10 +59,10 @@ def list(
Audience ID, prefixed `adaud_`, used to filter the response to one audience.
audience_type : typing.Optional[ListAudiencesRequestAudienceType]
- Filter by audience type: `custom` (uploaded lists) or `lookalike`.
+ Filter by custom or lookalike audiences.
source_type : typing.Optional[ListAudiencesRequestSourceType]
- Filter by member source: `csv_upload` (uploaded lists) or `people_filter` (automatic audiences built from saved People filters).
+ Filter by uploaded customer lists, Whop People filters, or social engagement.
first : typing.Optional[int]
Number of audiences to return. Defaults to 20; maximum 100.
@@ -81,7 +83,7 @@ def list(
from whop_sdk import Whop
client = Whop(
- "2026-09-02-2",
+ "2026-09-06",
idempotency_key="YOUR_IDEMPOTENCY_KEY",
token="YOUR_TOKEN",
)
@@ -112,15 +114,17 @@ def create(
auto_refresh: typing.Optional[bool] = OMIT,
column_mapping: typing.Optional[CreateAudiencesRequestColumnMapping] = OMIT,
count: typing.Optional[int] = OMIT,
+ engagement: typing.Optional[CreateAudiencesRequestEngagement] = OMIT,
file_id: typing.Optional[str] = OMIT,
filters: typing.Optional[typing.Dict[str, typing.Any]] = OMIT,
name: typing.Optional[str] = OMIT,
percentage: typing.Optional[int] = OMIT,
source_audience_id: typing.Optional[str] = OMIT,
+ source_type: typing.Optional[CreateAudiencesRequestSourceType] = OMIT,
request_options: typing.Optional[RequestOptions] = None,
) -> CreateAudiencesResponse:
"""
- Creates an audience. Default (`audience_type` omitted or `custom`): creates one audience from an uploaded customer identity CSV file (`name`, `column_mapping`, and `file_id` required) and starts processing it; responds with the audience object. With `filters`: creates an audience from saved People filters (`name` required) — membership is built from the account's People data, and `auto_refresh` decides whether it keeps tracking the filters or keeps whoever matched at creation. With `audience_type: lookalike`: creates a ladder of Meta lookalike audiences from an existing ready custom audience (`source_audience_id`, `count`, and `percentage` required) — `count` equal similarity bands slicing the top `percentage`% (3 audiences at 6% = 0–2%, 2–4%, 4–6%), each returned as its own audience in a `{ data: [...] }` envelope.
+ Create an audience from a customer list, your account's Whop People data, or engagement with videos, lead forms, Instagram profiles, or Facebook pages. Create lookalike audiences to reach people similar to an existing audience. Processing runs asynchronously. Custom creation returns one audience; lookalike creation returns the requested similarity bands in `data`.
Parameters
----------
@@ -128,19 +132,22 @@ def create(
Account ID, prefixed `biz_`.
audience_type : typing.Optional[CreateAudiencesRequestAudienceType]
- What to create. Defaults to `custom` (CSV upload).
+ Audience type. Defaults to `custom`.
auto_refresh : typing.Optional[bool]
Filter audiences only, and set only at creation. `true` (the default) rebuilds membership from the filters twice a day. `false` keeps whoever matched at creation and never rebuilds.
column_mapping : typing.Optional[CreateAudiencesRequestColumnMapping]
- Custom audiences only. Maps supported identity fields to CSV column headers. Map at least one of `email` or `phone`.
+ CSV audiences only. Maps supported identity fields to CSV column headers. Map at least one of `email` or `phone`.
count : typing.Optional[int]
Lookalikes only. Number of lookalike audiences to create (1–6).
+ engagement : typing.Optional[CreateAudiencesRequestEngagement]
+ Rules for membership based on social engagement. Requires a connected social account with advertising access.
+
file_id : typing.Optional[str]
- Custom audiences only. The uploaded customer CSV — a file id (`file_...`) returned by `POST /files`.
+ CSV audiences only. The uploaded customer CSV — a file id (`file_...`) returned by `POST /files`.
filters : typing.Optional[typing.Dict[str, typing.Any]]
Filter audiences only. The People filters that define membership, keyed exactly as `GET /people` accepts them — for example `{"os": "iOS", "country": "US"}`. Date filters must be rolling windows — `first_seen_within_days` or `last_seen_within_days` — so the audience re-anchors on every refresh; fixed dates such as `first_seen_after` are rejected. Source values are canonical source paths (`whop:::`, `ext::...`, `referrer:`, `direct`), exact or with a trailing `:*` wildcard.
@@ -149,10 +156,13 @@ def create(
Audience display name. Required for custom audiences; lookalike names are generated from the source audience.
percentage : typing.Optional[int]
- Lookalikes only. Total similarity reach as a whole percent (1–20), sliced evenly across `count` — must be divisible by `count`.
+ Lookalikes only. Total similarity reach as a whole percent (1–20), sliced evenly across `count` — must be divisible by `count`. For example, 3 audiences at 6% creates 0–2%, 2–4%, and 4–6% bands.
source_audience_id : typing.Optional[str]
- Lookalikes only. The ready custom audience (`adaud_`) to build from; it needs at least 100 matched people.
+ Lookalikes only. The ready custom audience (`adaud_`) to build from; uploaded and People audiences need at least 100 matched people. Meta validates engagement audience eligibility when creating the lookalike.
+
+ source_type : typing.Optional[CreateAudiencesRequestSourceType]
+ Custom audience source. Inferred from `engagement`, then `filters`, otherwise defaults to `csv_upload`. Supply only the fields for the selected source.
request_options : typing.Optional[RequestOptions]
Request-specific configuration.
@@ -160,19 +170,32 @@ def create(
Returns
-------
CreateAudiencesResponse
- Audience created — the audience object for custom audiences, or `{ data: [...] }` for lookalike ladders.
+ Audience created. Custom creation returns one audience; lookalike creation returns an array in `data`.
Examples
--------
- from whop_sdk import Whop
+ from whop_sdk import AudienceEngagementRule_FacebookPage, Whop
+ from whop_sdk.audiences import CreateAudiencesRequestEngagement
client = Whop(
- "2026-09-02-2",
+ "2026-09-06",
idempotency_key="YOUR_IDEMPOTENCY_KEY",
token="YOUR_TOKEN",
)
client.audiences.create(
account_id="biz_xxxxxxxxxxxxxx",
+ engagement=CreateAudiencesRequestEngagement(
+ include=[
+ AudienceEngagementRule_FacebookPage(
+ event="engaged",
+ retention_days=30,
+ social_account_id="sacc_xxxxxxxxxxxxxx",
+ )
+ ],
+ platform="meta",
+ ),
+ name="Page engagers",
+ source_type="engagement",
)
"""
_response = self._raw_client.create(
@@ -181,11 +204,13 @@ def create(
auto_refresh=auto_refresh,
column_mapping=column_mapping,
count=count,
+ engagement=engagement,
file_id=file_id,
filters=filters,
name=name,
percentage=percentage,
source_audience_id=source_audience_id,
+ source_type=source_type,
request_options=request_options,
)
return _response.data
@@ -212,7 +237,7 @@ def delete(self, id: str, *, request_options: typing.Optional[RequestOptions] =
from whop_sdk import Whop
client = Whop(
- "2026-09-02-2",
+ "2026-09-06",
idempotency_key="YOUR_IDEMPOTENCY_KEY",
token="YOUR_TOKEN",
)
@@ -258,7 +283,7 @@ def update(
from whop_sdk import Whop
client = Whop(
- "2026-09-02-2",
+ "2026-09-06",
idempotency_key="YOUR_IDEMPOTENCY_KEY",
token="YOUR_TOKEN",
)
@@ -294,7 +319,7 @@ def add_people(self, id: str, *, file_id: str, request_options: typing.Optional[
from whop_sdk import Whop
client = Whop(
- "2026-09-02-2",
+ "2026-09-06",
idempotency_key="YOUR_IDEMPOTENCY_KEY",
token="YOUR_TOKEN",
)
@@ -334,7 +359,7 @@ async def list(
request_options: typing.Optional[RequestOptions] = None,
) -> AsyncPager[Audience, ListAudiencesResponse]:
"""
- Lists uploaded customer-list audiences for an account. Pass `audience_id` to return a specific audience.
+ List custom and lookalike audiences for an account. Pass `audience_id` to return a specific audience.
Parameters
----------
@@ -345,10 +370,10 @@ async def list(
Audience ID, prefixed `adaud_`, used to filter the response to one audience.
audience_type : typing.Optional[ListAudiencesRequestAudienceType]
- Filter by audience type: `custom` (uploaded lists) or `lookalike`.
+ Filter by custom or lookalike audiences.
source_type : typing.Optional[ListAudiencesRequestSourceType]
- Filter by member source: `csv_upload` (uploaded lists) or `people_filter` (automatic audiences built from saved People filters).
+ Filter by uploaded customer lists, Whop People filters, or social engagement.
first : typing.Optional[int]
Number of audiences to return. Defaults to 20; maximum 100.
@@ -371,7 +396,7 @@ async def list(
from whop_sdk import AsyncWhop
client = AsyncWhop(
- "2026-09-02-2",
+ "2026-09-06",
idempotency_key="YOUR_IDEMPOTENCY_KEY",
token="YOUR_TOKEN",
)
@@ -409,15 +434,17 @@ async def create(
auto_refresh: typing.Optional[bool] = OMIT,
column_mapping: typing.Optional[CreateAudiencesRequestColumnMapping] = OMIT,
count: typing.Optional[int] = OMIT,
+ engagement: typing.Optional[CreateAudiencesRequestEngagement] = OMIT,
file_id: typing.Optional[str] = OMIT,
filters: typing.Optional[typing.Dict[str, typing.Any]] = OMIT,
name: typing.Optional[str] = OMIT,
percentage: typing.Optional[int] = OMIT,
source_audience_id: typing.Optional[str] = OMIT,
+ source_type: typing.Optional[CreateAudiencesRequestSourceType] = OMIT,
request_options: typing.Optional[RequestOptions] = None,
) -> CreateAudiencesResponse:
"""
- Creates an audience. Default (`audience_type` omitted or `custom`): creates one audience from an uploaded customer identity CSV file (`name`, `column_mapping`, and `file_id` required) and starts processing it; responds with the audience object. With `filters`: creates an audience from saved People filters (`name` required) — membership is built from the account's People data, and `auto_refresh` decides whether it keeps tracking the filters or keeps whoever matched at creation. With `audience_type: lookalike`: creates a ladder of Meta lookalike audiences from an existing ready custom audience (`source_audience_id`, `count`, and `percentage` required) — `count` equal similarity bands slicing the top `percentage`% (3 audiences at 6% = 0–2%, 2–4%, 4–6%), each returned as its own audience in a `{ data: [...] }` envelope.
+ Create an audience from a customer list, your account's Whop People data, or engagement with videos, lead forms, Instagram profiles, or Facebook pages. Create lookalike audiences to reach people similar to an existing audience. Processing runs asynchronously. Custom creation returns one audience; lookalike creation returns the requested similarity bands in `data`.
Parameters
----------
@@ -425,19 +452,22 @@ async def create(
Account ID, prefixed `biz_`.
audience_type : typing.Optional[CreateAudiencesRequestAudienceType]
- What to create. Defaults to `custom` (CSV upload).
+ Audience type. Defaults to `custom`.
auto_refresh : typing.Optional[bool]
Filter audiences only, and set only at creation. `true` (the default) rebuilds membership from the filters twice a day. `false` keeps whoever matched at creation and never rebuilds.
column_mapping : typing.Optional[CreateAudiencesRequestColumnMapping]
- Custom audiences only. Maps supported identity fields to CSV column headers. Map at least one of `email` or `phone`.
+ CSV audiences only. Maps supported identity fields to CSV column headers. Map at least one of `email` or `phone`.
count : typing.Optional[int]
Lookalikes only. Number of lookalike audiences to create (1–6).
+ engagement : typing.Optional[CreateAudiencesRequestEngagement]
+ Rules for membership based on social engagement. Requires a connected social account with advertising access.
+
file_id : typing.Optional[str]
- Custom audiences only. The uploaded customer CSV — a file id (`file_...`) returned by `POST /files`.
+ CSV audiences only. The uploaded customer CSV — a file id (`file_...`) returned by `POST /files`.
filters : typing.Optional[typing.Dict[str, typing.Any]]
Filter audiences only. The People filters that define membership, keyed exactly as `GET /people` accepts them — for example `{"os": "iOS", "country": "US"}`. Date filters must be rolling windows — `first_seen_within_days` or `last_seen_within_days` — so the audience re-anchors on every refresh; fixed dates such as `first_seen_after` are rejected. Source values are canonical source paths (`whop:::`, `ext::...`, `referrer:`, `direct`), exact or with a trailing `:*` wildcard.
@@ -446,10 +476,13 @@ async def create(
Audience display name. Required for custom audiences; lookalike names are generated from the source audience.
percentage : typing.Optional[int]
- Lookalikes only. Total similarity reach as a whole percent (1–20), sliced evenly across `count` — must be divisible by `count`.
+ Lookalikes only. Total similarity reach as a whole percent (1–20), sliced evenly across `count` — must be divisible by `count`. For example, 3 audiences at 6% creates 0–2%, 2–4%, and 4–6% bands.
source_audience_id : typing.Optional[str]
- Lookalikes only. The ready custom audience (`adaud_`) to build from; it needs at least 100 matched people.
+ Lookalikes only. The ready custom audience (`adaud_`) to build from; uploaded and People audiences need at least 100 matched people. Meta validates engagement audience eligibility when creating the lookalike.
+
+ source_type : typing.Optional[CreateAudiencesRequestSourceType]
+ Custom audience source. Inferred from `engagement`, then `filters`, otherwise defaults to `csv_upload`. Supply only the fields for the selected source.
request_options : typing.Optional[RequestOptions]
Request-specific configuration.
@@ -457,16 +490,17 @@ async def create(
Returns
-------
CreateAudiencesResponse
- Audience created — the audience object for custom audiences, or `{ data: [...] }` for lookalike ladders.
+ Audience created. Custom creation returns one audience; lookalike creation returns an array in `data`.
Examples
--------
import asyncio
- from whop_sdk import AsyncWhop
+ from whop_sdk import AsyncWhop, AudienceEngagementRule_FacebookPage
+ from whop_sdk.audiences import CreateAudiencesRequestEngagement
client = AsyncWhop(
- "2026-09-02-2",
+ "2026-09-06",
idempotency_key="YOUR_IDEMPOTENCY_KEY",
token="YOUR_TOKEN",
)
@@ -475,6 +509,18 @@ async def create(
async def main() -> None:
await client.audiences.create(
account_id="biz_xxxxxxxxxxxxxx",
+ engagement=CreateAudiencesRequestEngagement(
+ include=[
+ AudienceEngagementRule_FacebookPage(
+ event="engaged",
+ retention_days=30,
+ social_account_id="sacc_xxxxxxxxxxxxxx",
+ )
+ ],
+ platform="meta",
+ ),
+ name="Page engagers",
+ source_type="engagement",
)
@@ -486,11 +532,13 @@ async def main() -> None:
auto_refresh=auto_refresh,
column_mapping=column_mapping,
count=count,
+ engagement=engagement,
file_id=file_id,
filters=filters,
name=name,
percentage=percentage,
source_audience_id=source_audience_id,
+ source_type=source_type,
request_options=request_options,
)
return _response.data
@@ -521,7 +569,7 @@ async def delete(
from whop_sdk import AsyncWhop
client = AsyncWhop(
- "2026-09-02-2",
+ "2026-09-06",
idempotency_key="YOUR_IDEMPOTENCY_KEY",
token="YOUR_TOKEN",
)
@@ -575,7 +623,7 @@ async def update(
from whop_sdk import AsyncWhop
client = AsyncWhop(
- "2026-09-02-2",
+ "2026-09-06",
idempotency_key="YOUR_IDEMPOTENCY_KEY",
token="YOUR_TOKEN",
)
@@ -621,7 +669,7 @@ async def add_people(
from whop_sdk import AsyncWhop
client = AsyncWhop(
- "2026-09-02-2",
+ "2026-09-06",
idempotency_key="YOUR_IDEMPOTENCY_KEY",
token="YOUR_TOKEN",
)
diff --git a/src/whop_sdk/audiences/raw_client.py b/src/whop_sdk/audiences/raw_client.py
index 6dc8d712..a25f2978 100644
--- a/src/whop_sdk/audiences/raw_client.py
+++ b/src/whop_sdk/audiences/raw_client.py
@@ -12,12 +12,15 @@
from ..core.pydantic_utilities import parse_obj_as
from ..core.request_options import RequestOptions
from ..core.serialization import convert_and_respect_annotation_metadata
+from ..errors.bad_request_error import BadRequestError
from ..errors.conflict_error import ConflictError
from ..errors.unauthorized_error import UnauthorizedError
from ..types.audience import Audience
from ..types.v1error_response import V1ErrorResponse
from .types.create_audiences_request_audience_type import CreateAudiencesRequestAudienceType
from .types.create_audiences_request_column_mapping import CreateAudiencesRequestColumnMapping
+from .types.create_audiences_request_engagement import CreateAudiencesRequestEngagement
+from .types.create_audiences_request_source_type import CreateAudiencesRequestSourceType
from .types.create_audiences_response import CreateAudiencesResponse
from .types.delete_audiences_response import DeleteAudiencesResponse
from .types.list_audiences_request_audience_type import ListAudiencesRequestAudienceType
@@ -45,7 +48,7 @@ def list(
request_options: typing.Optional[RequestOptions] = None,
) -> SyncPager[Audience, ListAudiencesResponse]:
"""
- Lists uploaded customer-list audiences for an account. Pass `audience_id` to return a specific audience.
+ List custom and lookalike audiences for an account. Pass `audience_id` to return a specific audience.
Parameters
----------
@@ -56,10 +59,10 @@ def list(
Audience ID, prefixed `adaud_`, used to filter the response to one audience.
audience_type : typing.Optional[ListAudiencesRequestAudienceType]
- Filter by audience type: `custom` (uploaded lists) or `lookalike`.
+ Filter by custom or lookalike audiences.
source_type : typing.Optional[ListAudiencesRequestSourceType]
- Filter by member source: `csv_upload` (uploaded lists) or `people_filter` (automatic audiences built from saved People filters).
+ Filter by uploaded customer lists, Whop People filters, or social engagement.
first : typing.Optional[int]
Number of audiences to return. Defaults to 20; maximum 100.
@@ -141,15 +144,17 @@ def create(
auto_refresh: typing.Optional[bool] = OMIT,
column_mapping: typing.Optional[CreateAudiencesRequestColumnMapping] = OMIT,
count: typing.Optional[int] = OMIT,
+ engagement: typing.Optional[CreateAudiencesRequestEngagement] = OMIT,
file_id: typing.Optional[str] = OMIT,
filters: typing.Optional[typing.Dict[str, typing.Any]] = OMIT,
name: typing.Optional[str] = OMIT,
percentage: typing.Optional[int] = OMIT,
source_audience_id: typing.Optional[str] = OMIT,
+ source_type: typing.Optional[CreateAudiencesRequestSourceType] = OMIT,
request_options: typing.Optional[RequestOptions] = None,
) -> HttpResponse[CreateAudiencesResponse]:
"""
- Creates an audience. Default (`audience_type` omitted or `custom`): creates one audience from an uploaded customer identity CSV file (`name`, `column_mapping`, and `file_id` required) and starts processing it; responds with the audience object. With `filters`: creates an audience from saved People filters (`name` required) — membership is built from the account's People data, and `auto_refresh` decides whether it keeps tracking the filters or keeps whoever matched at creation. With `audience_type: lookalike`: creates a ladder of Meta lookalike audiences from an existing ready custom audience (`source_audience_id`, `count`, and `percentage` required) — `count` equal similarity bands slicing the top `percentage`% (3 audiences at 6% = 0–2%, 2–4%, 4–6%), each returned as its own audience in a `{ data: [...] }` envelope.
+ Create an audience from a customer list, your account's Whop People data, or engagement with videos, lead forms, Instagram profiles, or Facebook pages. Create lookalike audiences to reach people similar to an existing audience. Processing runs asynchronously. Custom creation returns one audience; lookalike creation returns the requested similarity bands in `data`.
Parameters
----------
@@ -157,19 +162,22 @@ def create(
Account ID, prefixed `biz_`.
audience_type : typing.Optional[CreateAudiencesRequestAudienceType]
- What to create. Defaults to `custom` (CSV upload).
+ Audience type. Defaults to `custom`.
auto_refresh : typing.Optional[bool]
Filter audiences only, and set only at creation. `true` (the default) rebuilds membership from the filters twice a day. `false` keeps whoever matched at creation and never rebuilds.
column_mapping : typing.Optional[CreateAudiencesRequestColumnMapping]
- Custom audiences only. Maps supported identity fields to CSV column headers. Map at least one of `email` or `phone`.
+ CSV audiences only. Maps supported identity fields to CSV column headers. Map at least one of `email` or `phone`.
count : typing.Optional[int]
Lookalikes only. Number of lookalike audiences to create (1–6).
+ engagement : typing.Optional[CreateAudiencesRequestEngagement]
+ Rules for membership based on social engagement. Requires a connected social account with advertising access.
+
file_id : typing.Optional[str]
- Custom audiences only. The uploaded customer CSV — a file id (`file_...`) returned by `POST /files`.
+ CSV audiences only. The uploaded customer CSV — a file id (`file_...`) returned by `POST /files`.
filters : typing.Optional[typing.Dict[str, typing.Any]]
Filter audiences only. The People filters that define membership, keyed exactly as `GET /people` accepts them — for example `{"os": "iOS", "country": "US"}`. Date filters must be rolling windows — `first_seen_within_days` or `last_seen_within_days` — so the audience re-anchors on every refresh; fixed dates such as `first_seen_after` are rejected. Source values are canonical source paths (`whop:::`, `ext::...`, `referrer:`, `direct`), exact or with a trailing `:*` wildcard.
@@ -178,10 +186,13 @@ def create(
Audience display name. Required for custom audiences; lookalike names are generated from the source audience.
percentage : typing.Optional[int]
- Lookalikes only. Total similarity reach as a whole percent (1–20), sliced evenly across `count` — must be divisible by `count`.
+ Lookalikes only. Total similarity reach as a whole percent (1–20), sliced evenly across `count` — must be divisible by `count`. For example, 3 audiences at 6% creates 0–2%, 2–4%, and 4–6% bands.
source_audience_id : typing.Optional[str]
- Lookalikes only. The ready custom audience (`adaud_`) to build from; it needs at least 100 matched people.
+ Lookalikes only. The ready custom audience (`adaud_`) to build from; uploaded and People audiences need at least 100 matched people. Meta validates engagement audience eligibility when creating the lookalike.
+
+ source_type : typing.Optional[CreateAudiencesRequestSourceType]
+ Custom audience source. Inferred from `engagement`, then `filters`, otherwise defaults to `csv_upload`. Supply only the fields for the selected source.
request_options : typing.Optional[RequestOptions]
Request-specific configuration.
@@ -189,7 +200,7 @@ def create(
Returns
-------
HttpResponse[CreateAudiencesResponse]
- Audience created — the audience object for custom audiences, or `{ data: [...] }` for lookalike ladders.
+ Audience created. Custom creation returns one audience; lookalike creation returns an array in `data`.
"""
_response = self._client_wrapper.httpx_client.request(
"audiences",
@@ -202,11 +213,15 @@ def create(
object_=column_mapping, annotation=CreateAudiencesRequestColumnMapping, direction="write"
),
"count": count,
+ "engagement": convert_and_respect_annotation_metadata(
+ object_=engagement, annotation=CreateAudiencesRequestEngagement, direction="write"
+ ),
"file_id": file_id,
"filters": filters,
"name": name,
"percentage": percentage,
"source_audience_id": source_audience_id,
+ "source_type": source_type,
},
headers={
"content-type": "application/json",
@@ -224,6 +239,17 @@ def create(
),
)
return HttpResponse(response=_response, data=_data)
+ if _response.status_code == 400:
+ raise BadRequestError(
+ headers=dict(_response.headers),
+ body=typing.cast(
+ typing.Any,
+ parse_obj_as(
+ type_=typing.Any, # type: ignore
+ object_=_response.json(),
+ ),
+ ),
+ )
if _response.status_code == 401:
raise UnauthorizedError(
headers=dict(_response.headers),
@@ -463,7 +489,7 @@ async def list(
request_options: typing.Optional[RequestOptions] = None,
) -> AsyncPager[Audience, ListAudiencesResponse]:
"""
- Lists uploaded customer-list audiences for an account. Pass `audience_id` to return a specific audience.
+ List custom and lookalike audiences for an account. Pass `audience_id` to return a specific audience.
Parameters
----------
@@ -474,10 +500,10 @@ async def list(
Audience ID, prefixed `adaud_`, used to filter the response to one audience.
audience_type : typing.Optional[ListAudiencesRequestAudienceType]
- Filter by audience type: `custom` (uploaded lists) or `lookalike`.
+ Filter by custom or lookalike audiences.
source_type : typing.Optional[ListAudiencesRequestSourceType]
- Filter by member source: `csv_upload` (uploaded lists) or `people_filter` (automatic audiences built from saved People filters).
+ Filter by uploaded customer lists, Whop People filters, or social engagement.
first : typing.Optional[int]
Number of audiences to return. Defaults to 20; maximum 100.
@@ -562,15 +588,17 @@ async def create(
auto_refresh: typing.Optional[bool] = OMIT,
column_mapping: typing.Optional[CreateAudiencesRequestColumnMapping] = OMIT,
count: typing.Optional[int] = OMIT,
+ engagement: typing.Optional[CreateAudiencesRequestEngagement] = OMIT,
file_id: typing.Optional[str] = OMIT,
filters: typing.Optional[typing.Dict[str, typing.Any]] = OMIT,
name: typing.Optional[str] = OMIT,
percentage: typing.Optional[int] = OMIT,
source_audience_id: typing.Optional[str] = OMIT,
+ source_type: typing.Optional[CreateAudiencesRequestSourceType] = OMIT,
request_options: typing.Optional[RequestOptions] = None,
) -> AsyncHttpResponse[CreateAudiencesResponse]:
"""
- Creates an audience. Default (`audience_type` omitted or `custom`): creates one audience from an uploaded customer identity CSV file (`name`, `column_mapping`, and `file_id` required) and starts processing it; responds with the audience object. With `filters`: creates an audience from saved People filters (`name` required) — membership is built from the account's People data, and `auto_refresh` decides whether it keeps tracking the filters or keeps whoever matched at creation. With `audience_type: lookalike`: creates a ladder of Meta lookalike audiences from an existing ready custom audience (`source_audience_id`, `count`, and `percentage` required) — `count` equal similarity bands slicing the top `percentage`% (3 audiences at 6% = 0–2%, 2–4%, 4–6%), each returned as its own audience in a `{ data: [...] }` envelope.
+ Create an audience from a customer list, your account's Whop People data, or engagement with videos, lead forms, Instagram profiles, or Facebook pages. Create lookalike audiences to reach people similar to an existing audience. Processing runs asynchronously. Custom creation returns one audience; lookalike creation returns the requested similarity bands in `data`.
Parameters
----------
@@ -578,19 +606,22 @@ async def create(
Account ID, prefixed `biz_`.
audience_type : typing.Optional[CreateAudiencesRequestAudienceType]
- What to create. Defaults to `custom` (CSV upload).
+ Audience type. Defaults to `custom`.
auto_refresh : typing.Optional[bool]
Filter audiences only, and set only at creation. `true` (the default) rebuilds membership from the filters twice a day. `false` keeps whoever matched at creation and never rebuilds.
column_mapping : typing.Optional[CreateAudiencesRequestColumnMapping]
- Custom audiences only. Maps supported identity fields to CSV column headers. Map at least one of `email` or `phone`.
+ CSV audiences only. Maps supported identity fields to CSV column headers. Map at least one of `email` or `phone`.
count : typing.Optional[int]
Lookalikes only. Number of lookalike audiences to create (1–6).
+ engagement : typing.Optional[CreateAudiencesRequestEngagement]
+ Rules for membership based on social engagement. Requires a connected social account with advertising access.
+
file_id : typing.Optional[str]
- Custom audiences only. The uploaded customer CSV — a file id (`file_...`) returned by `POST /files`.
+ CSV audiences only. The uploaded customer CSV — a file id (`file_...`) returned by `POST /files`.
filters : typing.Optional[typing.Dict[str, typing.Any]]
Filter audiences only. The People filters that define membership, keyed exactly as `GET /people` accepts them — for example `{"os": "iOS", "country": "US"}`. Date filters must be rolling windows — `first_seen_within_days` or `last_seen_within_days` — so the audience re-anchors on every refresh; fixed dates such as `first_seen_after` are rejected. Source values are canonical source paths (`whop:::`, `ext::...`, `referrer:`, `direct`), exact or with a trailing `:*` wildcard.
@@ -599,10 +630,13 @@ async def create(
Audience display name. Required for custom audiences; lookalike names are generated from the source audience.
percentage : typing.Optional[int]
- Lookalikes only. Total similarity reach as a whole percent (1–20), sliced evenly across `count` — must be divisible by `count`.
+ Lookalikes only. Total similarity reach as a whole percent (1–20), sliced evenly across `count` — must be divisible by `count`. For example, 3 audiences at 6% creates 0–2%, 2–4%, and 4–6% bands.
source_audience_id : typing.Optional[str]
- Lookalikes only. The ready custom audience (`adaud_`) to build from; it needs at least 100 matched people.
+ Lookalikes only. The ready custom audience (`adaud_`) to build from; uploaded and People audiences need at least 100 matched people. Meta validates engagement audience eligibility when creating the lookalike.
+
+ source_type : typing.Optional[CreateAudiencesRequestSourceType]
+ Custom audience source. Inferred from `engagement`, then `filters`, otherwise defaults to `csv_upload`. Supply only the fields for the selected source.
request_options : typing.Optional[RequestOptions]
Request-specific configuration.
@@ -610,7 +644,7 @@ async def create(
Returns
-------
AsyncHttpResponse[CreateAudiencesResponse]
- Audience created — the audience object for custom audiences, or `{ data: [...] }` for lookalike ladders.
+ Audience created. Custom creation returns one audience; lookalike creation returns an array in `data`.
"""
_response = await self._client_wrapper.httpx_client.request(
"audiences",
@@ -623,11 +657,15 @@ async def create(
object_=column_mapping, annotation=CreateAudiencesRequestColumnMapping, direction="write"
),
"count": count,
+ "engagement": convert_and_respect_annotation_metadata(
+ object_=engagement, annotation=CreateAudiencesRequestEngagement, direction="write"
+ ),
"file_id": file_id,
"filters": filters,
"name": name,
"percentage": percentage,
"source_audience_id": source_audience_id,
+ "source_type": source_type,
},
headers={
"content-type": "application/json",
@@ -645,6 +683,17 @@ async def create(
),
)
return AsyncHttpResponse(response=_response, data=_data)
+ if _response.status_code == 400:
+ raise BadRequestError(
+ headers=dict(_response.headers),
+ body=typing.cast(
+ typing.Any,
+ parse_obj_as(
+ type_=typing.Any, # type: ignore
+ object_=_response.json(),
+ ),
+ ),
+ )
if _response.status_code == 401:
raise UnauthorizedError(
headers=dict(_response.headers),
diff --git a/src/whop_sdk/audiences/types/__init__.py b/src/whop_sdk/audiences/types/__init__.py
index c5dd4295..dd6f0873 100644
--- a/src/whop_sdk/audiences/types/__init__.py
+++ b/src/whop_sdk/audiences/types/__init__.py
@@ -8,6 +8,9 @@
if typing.TYPE_CHECKING:
from .create_audiences_request_audience_type import CreateAudiencesRequestAudienceType
from .create_audiences_request_column_mapping import CreateAudiencesRequestColumnMapping
+ from .create_audiences_request_engagement import CreateAudiencesRequestEngagement
+ from .create_audiences_request_engagement_platform import CreateAudiencesRequestEngagementPlatform
+ from .create_audiences_request_source_type import CreateAudiencesRequestSourceType
from .create_audiences_response import CreateAudiencesResponse
from .create_audiences_response_data import CreateAudiencesResponseData
from .delete_audiences_response import DeleteAudiencesResponse
@@ -18,6 +21,9 @@
_dynamic_imports: typing.Dict[str, str] = {
"CreateAudiencesRequestAudienceType": ".create_audiences_request_audience_type",
"CreateAudiencesRequestColumnMapping": ".create_audiences_request_column_mapping",
+ "CreateAudiencesRequestEngagement": ".create_audiences_request_engagement",
+ "CreateAudiencesRequestEngagementPlatform": ".create_audiences_request_engagement_platform",
+ "CreateAudiencesRequestSourceType": ".create_audiences_request_source_type",
"CreateAudiencesResponse": ".create_audiences_response",
"CreateAudiencesResponseData": ".create_audiences_response_data",
"DeleteAudiencesResponse": ".delete_audiences_response",
@@ -52,6 +58,9 @@ def __dir__():
__all__ = [
"CreateAudiencesRequestAudienceType",
"CreateAudiencesRequestColumnMapping",
+ "CreateAudiencesRequestEngagement",
+ "CreateAudiencesRequestEngagementPlatform",
+ "CreateAudiencesRequestSourceType",
"CreateAudiencesResponse",
"CreateAudiencesResponseData",
"DeleteAudiencesResponse",
diff --git a/src/whop_sdk/audiences/types/create_audiences_request_column_mapping.py b/src/whop_sdk/audiences/types/create_audiences_request_column_mapping.py
index 0faa994e..066fe9a1 100644
--- a/src/whop_sdk/audiences/types/create_audiences_request_column_mapping.py
+++ b/src/whop_sdk/audiences/types/create_audiences_request_column_mapping.py
@@ -8,7 +8,7 @@
class CreateAudiencesRequestColumnMapping(UniversalBaseModel):
"""
- Custom audiences only. Maps supported identity fields to CSV column headers. Map at least one of `email` or `phone`.
+ CSV audiences only. Maps supported identity fields to CSV column headers. Map at least one of `email` or `phone`.
"""
country: typing.Optional[str] = pydantic.Field(default=None)
diff --git a/src/whop_sdk/audiences/types/create_audiences_request_engagement.py b/src/whop_sdk/audiences/types/create_audiences_request_engagement.py
new file mode 100644
index 00000000..13e8bfed
--- /dev/null
+++ b/src/whop_sdk/audiences/types/create_audiences_request_engagement.py
@@ -0,0 +1,38 @@
+# This file was auto-generated by Fern from our API Definition.
+
+import typing
+
+import pydantic
+from ...core.pydantic_utilities import IS_PYDANTIC_V2, UniversalBaseModel
+from ...types.audience_engagement_rule import AudienceEngagementRule
+from .create_audiences_request_engagement_platform import CreateAudiencesRequestEngagementPlatform
+
+
+class CreateAudiencesRequestEngagement(UniversalBaseModel):
+ """
+ Rules for membership based on social engagement. Requires a connected social account with advertising access.
+ """
+
+ exclude: typing.Optional[typing.List[AudienceEngagementRule]] = pydantic.Field(default=None)
+ """
+ Exclude anyone matching any exclusion rule. Defaults to an empty array. Video audiences do not support exclusions; use a separate audience in ad-group exclusions.
+ """
+
+ include: typing.List[AudienceEngagementRule] = pydantic.Field()
+ """
+ Match any inclusion rule. Video rules must share a retention window and cannot be combined with other sources.
+ """
+
+ platform: CreateAudiencesRequestEngagementPlatform = pydantic.Field()
+ """
+ Ad platform that maintains membership.
+ """
+
+ if IS_PYDANTIC_V2:
+ model_config: typing.ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(extra="allow", frozen=True) # type: ignore # Pydantic v2
+ else:
+
+ class Config:
+ frozen = True
+ smart_union = True
+ extra = pydantic.Extra.allow
diff --git a/src/whop_sdk/audiences/types/create_audiences_request_engagement_platform.py b/src/whop_sdk/audiences/types/create_audiences_request_engagement_platform.py
new file mode 100644
index 00000000..2fb0d1c8
--- /dev/null
+++ b/src/whop_sdk/audiences/types/create_audiences_request_engagement_platform.py
@@ -0,0 +1,5 @@
+# This file was auto-generated by Fern from our API Definition.
+
+import typing
+
+CreateAudiencesRequestEngagementPlatform = typing.Union[typing.Literal["meta"], typing.Any]
diff --git a/src/whop_sdk/audiences/types/create_audiences_request_source_type.py b/src/whop_sdk/audiences/types/create_audiences_request_source_type.py
new file mode 100644
index 00000000..8178269d
--- /dev/null
+++ b/src/whop_sdk/audiences/types/create_audiences_request_source_type.py
@@ -0,0 +1,5 @@
+# This file was auto-generated by Fern from our API Definition.
+
+import typing
+
+CreateAudiencesRequestSourceType = typing.Union[typing.Literal["csv_upload", "people_filter", "engagement"], typing.Any]
diff --git a/src/whop_sdk/audiences/types/list_audiences_request_source_type.py b/src/whop_sdk/audiences/types/list_audiences_request_source_type.py
index 88ea366c..1e31e898 100644
--- a/src/whop_sdk/audiences/types/list_audiences_request_source_type.py
+++ b/src/whop_sdk/audiences/types/list_audiences_request_source_type.py
@@ -2,4 +2,4 @@
import typing
-ListAudiencesRequestSourceType = typing.Union[typing.Literal["csv_upload", "people_filter"], typing.Any]
+ListAudiencesRequestSourceType = typing.Union[typing.Literal["csv_upload", "people_filter", "engagement"], typing.Any]
diff --git a/src/whop_sdk/authorized_users/client.py b/src/whop_sdk/authorized_users/client.py
index 656ff0e1..25c9021a 100644
--- a/src/whop_sdk/authorized_users/client.py
+++ b/src/whop_sdk/authorized_users/client.py
@@ -97,7 +97,7 @@ def list(
from whop_sdk import Whop
client = Whop(
- "2026-09-02-2",
+ "2026-09-06",
idempotency_key="YOUR_IDEMPOTENCY_KEY",
token="YOUR_TOKEN",
)
@@ -179,7 +179,7 @@ def create(
from whop_sdk import Whop
client = Whop(
- "2026-09-02-2",
+ "2026-09-06",
idempotency_key="YOUR_IDEMPOTENCY_KEY",
token="YOUR_TOKEN",
)
@@ -225,7 +225,7 @@ def retrieve(self, id: str, *, request_options: typing.Optional[RequestOptions]
from whop_sdk import Whop
client = Whop(
- "2026-09-02-2",
+ "2026-09-06",
idempotency_key="YOUR_IDEMPOTENCY_KEY",
token="YOUR_TOKEN",
)
@@ -270,7 +270,7 @@ def delete(
from whop_sdk import Whop
client = Whop(
- "2026-09-02-2",
+ "2026-09-06",
idempotency_key="YOUR_IDEMPOTENCY_KEY",
token="YOUR_TOKEN",
)
@@ -363,7 +363,7 @@ async def list(
from whop_sdk import AsyncWhop
client = AsyncWhop(
- "2026-09-02-2",
+ "2026-09-06",
idempotency_key="YOUR_IDEMPOTENCY_KEY",
token="YOUR_TOKEN",
)
@@ -454,7 +454,7 @@ async def create(
from whop_sdk import AsyncWhop
client = AsyncWhop(
- "2026-09-02-2",
+ "2026-09-06",
idempotency_key="YOUR_IDEMPOTENCY_KEY",
token="YOUR_TOKEN",
)
@@ -508,7 +508,7 @@ async def retrieve(self, id: str, *, request_options: typing.Optional[RequestOpt
from whop_sdk import AsyncWhop
client = AsyncWhop(
- "2026-09-02-2",
+ "2026-09-06",
idempotency_key="YOUR_IDEMPOTENCY_KEY",
token="YOUR_TOKEN",
)
@@ -561,7 +561,7 @@ async def delete(
from whop_sdk import AsyncWhop
client = AsyncWhop(
- "2026-09-02-2",
+ "2026-09-06",
idempotency_key="YOUR_IDEMPOTENCY_KEY",
token="YOUR_TOKEN",
)
diff --git a/src/whop_sdk/bounties/client.py b/src/whop_sdk/bounties/client.py
index cea8d6a3..c6813c14 100644
--- a/src/whop_sdk/bounties/client.py
+++ b/src/whop_sdk/bounties/client.py
@@ -127,7 +127,7 @@ def list(
from whop_sdk import Whop
client = Whop(
- "2026-09-02-2",
+ "2026-09-06",
idempotency_key="YOUR_IDEMPOTENCY_KEY",
token="YOUR_TOKEN",
)
@@ -232,7 +232,7 @@ def create(
from whop_sdk import Whop
client = Whop(
- "2026-09-02-2",
+ "2026-09-06",
idempotency_key="YOUR_IDEMPOTENCY_KEY",
token="YOUR_TOKEN",
)
@@ -282,7 +282,7 @@ def retrieve(self, id: str, *, request_options: typing.Optional[RequestOptions]
from whop_sdk import Whop
client = Whop(
- "2026-09-02-2",
+ "2026-09-06",
idempotency_key="YOUR_IDEMPOTENCY_KEY",
token="YOUR_TOKEN",
)
@@ -360,7 +360,7 @@ def update(
from whop_sdk import Whop
client = Whop(
- "2026-09-02-2",
+ "2026-09-06",
idempotency_key="YOUR_IDEMPOTENCY_KEY",
token="YOUR_TOKEN",
)
@@ -406,7 +406,7 @@ def cancel(self, id: str, *, request_options: typing.Optional[RequestOptions] =
from whop_sdk import Whop
client = Whop(
- "2026-09-02-2",
+ "2026-09-06",
idempotency_key="YOUR_IDEMPOTENCY_KEY",
token="YOUR_TOKEN",
)
@@ -528,7 +528,7 @@ async def list(
from whop_sdk import AsyncWhop
client = AsyncWhop(
- "2026-09-02-2",
+ "2026-09-06",
idempotency_key="YOUR_IDEMPOTENCY_KEY",
token="YOUR_TOKEN",
)
@@ -642,7 +642,7 @@ async def create(
from whop_sdk import AsyncWhop
client = AsyncWhop(
- "2026-09-02-2",
+ "2026-09-06",
idempotency_key="YOUR_IDEMPOTENCY_KEY",
token="YOUR_TOKEN",
)
@@ -700,7 +700,7 @@ async def retrieve(self, id: str, *, request_options: typing.Optional[RequestOpt
from whop_sdk import AsyncWhop
client = AsyncWhop(
- "2026-09-02-2",
+ "2026-09-06",
idempotency_key="YOUR_IDEMPOTENCY_KEY",
token="YOUR_TOKEN",
)
@@ -786,7 +786,7 @@ async def update(
from whop_sdk import AsyncWhop
client = AsyncWhop(
- "2026-09-02-2",
+ "2026-09-06",
idempotency_key="YOUR_IDEMPOTENCY_KEY",
token="YOUR_TOKEN",
)
@@ -840,7 +840,7 @@ async def cancel(self, id: str, *, request_options: typing.Optional[RequestOptio
from whop_sdk import AsyncWhop
client = AsyncWhop(
- "2026-09-02-2",
+ "2026-09-06",
idempotency_key="YOUR_IDEMPOTENCY_KEY",
token="YOUR_TOKEN",
)
diff --git a/src/whop_sdk/bounties/submissions/client.py b/src/whop_sdk/bounties/submissions/client.py
index 38554b3a..ab9bb24a 100644
--- a/src/whop_sdk/bounties/submissions/client.py
+++ b/src/whop_sdk/bounties/submissions/client.py
@@ -91,7 +91,7 @@ def list(
from whop_sdk import Whop
client = Whop(
- "2026-09-02-2",
+ "2026-09-06",
idempotency_key="YOUR_IDEMPOTENCY_KEY",
token="YOUR_TOKEN",
)
@@ -145,7 +145,7 @@ def retrieve(
from whop_sdk import Whop
client = Whop(
- "2026-09-02-2",
+ "2026-09-06",
idempotency_key="YOUR_IDEMPOTENCY_KEY",
token="YOUR_TOKEN",
)
@@ -238,7 +238,7 @@ async def list(
from whop_sdk import AsyncWhop
client = AsyncWhop(
- "2026-09-02-2",
+ "2026-09-06",
idempotency_key="YOUR_IDEMPOTENCY_KEY",
token="YOUR_TOKEN",
)
@@ -301,7 +301,7 @@ async def retrieve(
from whop_sdk import AsyncWhop
client = AsyncWhop(
- "2026-09-02-2",
+ "2026-09-06",
idempotency_key="YOUR_IDEMPOTENCY_KEY",
token="YOUR_TOKEN",
)
diff --git a/src/whop_sdk/bounty_submissions/client.py b/src/whop_sdk/bounty_submissions/client.py
index 13254c49..391378d1 100644
--- a/src/whop_sdk/bounty_submissions/client.py
+++ b/src/whop_sdk/bounty_submissions/client.py
@@ -102,7 +102,7 @@ def list(
from whop_sdk import Whop
client = Whop(
- "2026-09-02-2",
+ "2026-09-06",
idempotency_key="YOUR_IDEMPOTENCY_KEY",
token="YOUR_TOKEN",
)
@@ -167,7 +167,7 @@ def create(
from whop_sdk import Whop
client = Whop(
- "2026-09-02-2",
+ "2026-09-06",
idempotency_key="YOUR_IDEMPOTENCY_KEY",
token="YOUR_TOKEN",
)
@@ -215,7 +215,7 @@ def retrieve(
from whop_sdk import Whop
client = Whop(
- "2026-09-02-2",
+ "2026-09-06",
idempotency_key="YOUR_IDEMPOTENCY_KEY",
token="YOUR_TOKEN",
)
@@ -250,7 +250,7 @@ def delete(
from whop_sdk import Whop
client = Whop(
- "2026-09-02-2",
+ "2026-09-06",
idempotency_key="YOUR_IDEMPOTENCY_KEY",
token="YOUR_TOKEN",
)
@@ -292,7 +292,7 @@ def submit(
from whop_sdk import Whop
client = Whop(
- "2026-09-02-2",
+ "2026-09-06",
idempotency_key="YOUR_IDEMPOTENCY_KEY",
token="YOUR_TOKEN",
)
@@ -388,7 +388,7 @@ async def list(
from whop_sdk import AsyncWhop
client = AsyncWhop(
- "2026-09-02-2",
+ "2026-09-06",
idempotency_key="YOUR_IDEMPOTENCY_KEY",
token="YOUR_TOKEN",
)
@@ -462,7 +462,7 @@ async def create(
from whop_sdk import AsyncWhop
client = AsyncWhop(
- "2026-09-02-2",
+ "2026-09-06",
idempotency_key="YOUR_IDEMPOTENCY_KEY",
token="YOUR_TOKEN",
)
@@ -518,7 +518,7 @@ async def retrieve(
from whop_sdk import AsyncWhop
client = AsyncWhop(
- "2026-09-02-2",
+ "2026-09-06",
idempotency_key="YOUR_IDEMPOTENCY_KEY",
token="YOUR_TOKEN",
)
@@ -561,7 +561,7 @@ async def delete(
from whop_sdk import AsyncWhop
client = AsyncWhop(
- "2026-09-02-2",
+ "2026-09-06",
idempotency_key="YOUR_IDEMPOTENCY_KEY",
token="YOUR_TOKEN",
)
@@ -611,7 +611,7 @@ async def submit(
from whop_sdk import AsyncWhop
client = AsyncWhop(
- "2026-09-02-2",
+ "2026-09-06",
idempotency_key="YOUR_IDEMPOTENCY_KEY",
token="YOUR_TOKEN",
)
diff --git a/src/whop_sdk/card_transactions/client.py b/src/whop_sdk/card_transactions/client.py
index e37d1321..0d5def70 100644
--- a/src/whop_sdk/card_transactions/client.py
+++ b/src/whop_sdk/card_transactions/client.py
@@ -103,7 +103,7 @@ def list(
from whop_sdk import Whop
client = Whop(
- "2026-09-02-2",
+ "2026-09-06",
idempotency_key="YOUR_IDEMPOTENCY_KEY",
token="YOUR_TOKEN",
)
@@ -166,7 +166,7 @@ def retrieve(
from whop_sdk import Whop
client = Whop(
- "2026-09-02-2",
+ "2026-09-06",
idempotency_key="YOUR_IDEMPOTENCY_KEY",
token="YOUR_TOKEN",
)
@@ -270,7 +270,7 @@ async def list(
from whop_sdk import AsyncWhop
client = AsyncWhop(
- "2026-09-02-2",
+ "2026-09-06",
idempotency_key="YOUR_IDEMPOTENCY_KEY",
token="YOUR_TOKEN",
)
@@ -342,7 +342,7 @@ async def retrieve(
from whop_sdk import AsyncWhop
client = AsyncWhop(
- "2026-09-02-2",
+ "2026-09-06",
idempotency_key="YOUR_IDEMPOTENCY_KEY",
token="YOUR_TOKEN",
)
diff --git a/src/whop_sdk/cards/__init__.py b/src/whop_sdk/cards/__init__.py
index b772bea1..cd336013 100644
--- a/src/whop_sdk/cards/__init__.py
+++ b/src/whop_sdk/cards/__init__.py
@@ -117,6 +117,7 @@
RetrieveCardsResponseStatus,
RetrieveCardsResponseType,
UpdateCardsRequestBilling,
+ UpdateCardsRequestCardholder,
UpdateCardsRequestSpendLimitFrequency,
UpdateCardsResponse,
UpdateCardsResponseBilling,
@@ -238,6 +239,7 @@
"RetrieveCardsResponseStatus": ".types",
"RetrieveCardsResponseType": ".types",
"UpdateCardsRequestBilling": ".types",
+ "UpdateCardsRequestCardholder": ".types",
"UpdateCardsRequestSpendLimitFrequency": ".types",
"UpdateCardsResponse": ".types",
"UpdateCardsResponseBilling": ".types",
@@ -382,6 +384,7 @@ def __dir__():
"RetrieveCardsResponseStatus",
"RetrieveCardsResponseType",
"UpdateCardsRequestBilling",
+ "UpdateCardsRequestCardholder",
"UpdateCardsRequestSpendLimitFrequency",
"UpdateCardsResponse",
"UpdateCardsResponseBilling",
diff --git a/src/whop_sdk/cards/client.py b/src/whop_sdk/cards/client.py
index bb1c92f9..6ad1c3c0 100644
--- a/src/whop_sdk/cards/client.py
+++ b/src/whop_sdk/cards/client.py
@@ -10,6 +10,7 @@
from .types.list_cards_response import ListCardsResponse
from .types.retrieve_cards_response import RetrieveCardsResponse
from .types.update_cards_request_billing import UpdateCardsRequestBilling
+from .types.update_cards_request_cardholder import UpdateCardsRequestCardholder
from .types.update_cards_request_spend_limit_frequency import UpdateCardsRequestSpendLimitFrequency
from .types.update_cards_response import UpdateCardsResponse
@@ -63,7 +64,7 @@ def list(
from whop_sdk import Whop
client = Whop(
- "2026-09-02-2",
+ "2026-09-06",
idempotency_key="YOUR_IDEMPOTENCY_KEY",
token="YOUR_TOKEN",
)
@@ -123,7 +124,7 @@ def create(
from whop_sdk import Whop
client = Whop(
- "2026-09-02-2",
+ "2026-09-06",
idempotency_key="YOUR_IDEMPOTENCY_KEY",
token="YOUR_TOKEN",
)
@@ -176,7 +177,7 @@ def retrieve(
from whop_sdk import Whop
client = Whop(
- "2026-09-02-2",
+ "2026-09-06",
idempotency_key="YOUR_IDEMPOTENCY_KEY",
token="YOUR_TOKEN",
)
@@ -196,6 +197,7 @@ def update(
account_id: typing.Optional[str] = OMIT,
billing: typing.Optional[UpdateCardsRequestBilling] = OMIT,
canceled: typing.Optional[bool] = OMIT,
+ cardholder: typing.Optional[UpdateCardsRequestCardholder] = OMIT,
frozen: typing.Optional[bool] = OMIT,
name: typing.Optional[str] = OMIT,
pin: typing.Optional[str] = OMIT,
@@ -218,11 +220,14 @@ def update(
The owning account ID (a biz_ identifier). Provide this or user_id.
billing : typing.Optional[UpdateCardsRequestBilling]
- New billing address. Requires line1, city, region, postal_code, and country_code. On an invited card, passing billing alone (as the invited user) completes onboarding and starts card provisioning.
+ The billing address. On an issued card this replaces the card's billing address and region is also required. On an invited card, sending it as the invited user completes onboarding and starts card provisioning.
canceled : typing.Optional[bool]
Pass `true` to permanently cancel the card. A canceled card cannot be uncanceled. Cannot be combined with other fields.
+ cardholder : typing.Optional[UpdateCardsRequestCardholder]
+ Details for the invited cardholder, accepted only while completing onboarding on an invited card. The legal name comes from an approved identity verification when the invited user has one, and from these fields when they do not.
+
frozen : typing.Optional[bool]
Pass `true` to freeze the card, `false` to unfreeze it. The assigned cardholder may freeze their own card without the payout:account:update scope.
@@ -260,7 +265,7 @@ def update(
from whop_sdk import Whop
client = Whop(
- "2026-09-02-2",
+ "2026-09-06",
idempotency_key="YOUR_IDEMPOTENCY_KEY",
token="YOUR_TOKEN",
)
@@ -273,6 +278,7 @@ def update(
account_id=account_id,
billing=billing,
canceled=canceled,
+ cardholder=cardholder,
frozen=frozen,
name=name,
pin=pin,
@@ -334,7 +340,7 @@ async def list(
from whop_sdk import AsyncWhop
client = AsyncWhop(
- "2026-09-02-2",
+ "2026-09-06",
idempotency_key="YOUR_IDEMPOTENCY_KEY",
token="YOUR_TOKEN",
)
@@ -402,7 +408,7 @@ async def create(
from whop_sdk import AsyncWhop
client = AsyncWhop(
- "2026-09-02-2",
+ "2026-09-06",
idempotency_key="YOUR_IDEMPOTENCY_KEY",
token="YOUR_TOKEN",
)
@@ -463,7 +469,7 @@ async def retrieve(
from whop_sdk import AsyncWhop
client = AsyncWhop(
- "2026-09-02-2",
+ "2026-09-06",
idempotency_key="YOUR_IDEMPOTENCY_KEY",
token="YOUR_TOKEN",
)
@@ -489,6 +495,7 @@ async def update(
account_id: typing.Optional[str] = OMIT,
billing: typing.Optional[UpdateCardsRequestBilling] = OMIT,
canceled: typing.Optional[bool] = OMIT,
+ cardholder: typing.Optional[UpdateCardsRequestCardholder] = OMIT,
frozen: typing.Optional[bool] = OMIT,
name: typing.Optional[str] = OMIT,
pin: typing.Optional[str] = OMIT,
@@ -511,11 +518,14 @@ async def update(
The owning account ID (a biz_ identifier). Provide this or user_id.
billing : typing.Optional[UpdateCardsRequestBilling]
- New billing address. Requires line1, city, region, postal_code, and country_code. On an invited card, passing billing alone (as the invited user) completes onboarding and starts card provisioning.
+ The billing address. On an issued card this replaces the card's billing address and region is also required. On an invited card, sending it as the invited user completes onboarding and starts card provisioning.
canceled : typing.Optional[bool]
Pass `true` to permanently cancel the card. A canceled card cannot be uncanceled. Cannot be combined with other fields.
+ cardholder : typing.Optional[UpdateCardsRequestCardholder]
+ Details for the invited cardholder, accepted only while completing onboarding on an invited card. The legal name comes from an approved identity verification when the invited user has one, and from these fields when they do not.
+
frozen : typing.Optional[bool]
Pass `true` to freeze the card, `false` to unfreeze it. The assigned cardholder may freeze their own card without the payout:account:update scope.
@@ -555,7 +565,7 @@ async def update(
from whop_sdk import AsyncWhop
client = AsyncWhop(
- "2026-09-02-2",
+ "2026-09-06",
idempotency_key="YOUR_IDEMPOTENCY_KEY",
token="YOUR_TOKEN",
)
@@ -574,6 +584,7 @@ async def main() -> None:
account_id=account_id,
billing=billing,
canceled=canceled,
+ cardholder=cardholder,
frozen=frozen,
name=name,
pin=pin,
diff --git a/src/whop_sdk/cards/raw_client.py b/src/whop_sdk/cards/raw_client.py
index 4f146d76..19ffd964 100644
--- a/src/whop_sdk/cards/raw_client.py
+++ b/src/whop_sdk/cards/raw_client.py
@@ -22,6 +22,7 @@
from .types.list_cards_response import ListCardsResponse
from .types.retrieve_cards_response import RetrieveCardsResponse
from .types.update_cards_request_billing import UpdateCardsRequestBilling
+from .types.update_cards_request_cardholder import UpdateCardsRequestCardholder
from .types.update_cards_request_spend_limit_frequency import UpdateCardsRequestSpendLimitFrequency
from .types.update_cards_response import UpdateCardsResponse
from pydantic import ValidationError
@@ -346,6 +347,7 @@ def update(
account_id: typing.Optional[str] = OMIT,
billing: typing.Optional[UpdateCardsRequestBilling] = OMIT,
canceled: typing.Optional[bool] = OMIT,
+ cardholder: typing.Optional[UpdateCardsRequestCardholder] = OMIT,
frozen: typing.Optional[bool] = OMIT,
name: typing.Optional[str] = OMIT,
pin: typing.Optional[str] = OMIT,
@@ -368,11 +370,14 @@ def update(
The owning account ID (a biz_ identifier). Provide this or user_id.
billing : typing.Optional[UpdateCardsRequestBilling]
- New billing address. Requires line1, city, region, postal_code, and country_code. On an invited card, passing billing alone (as the invited user) completes onboarding and starts card provisioning.
+ The billing address. On an issued card this replaces the card's billing address and region is also required. On an invited card, sending it as the invited user completes onboarding and starts card provisioning.
canceled : typing.Optional[bool]
Pass `true` to permanently cancel the card. A canceled card cannot be uncanceled. Cannot be combined with other fields.
+ cardholder : typing.Optional[UpdateCardsRequestCardholder]
+ Details for the invited cardholder, accepted only while completing onboarding on an invited card. The legal name comes from an approved identity verification when the invited user has one, and from these fields when they do not.
+
frozen : typing.Optional[bool]
Pass `true` to freeze the card, `false` to unfreeze it. The assigned cardholder may freeze their own card without the payout:account:update scope.
@@ -414,6 +419,9 @@ def update(
object_=billing, annotation=UpdateCardsRequestBilling, direction="write"
),
"canceled": canceled,
+ "cardholder": convert_and_respect_annotation_metadata(
+ object_=cardholder, annotation=UpdateCardsRequestCardholder, direction="write"
+ ),
"frozen": frozen,
"name": name,
"pin": pin,
@@ -809,6 +817,7 @@ async def update(
account_id: typing.Optional[str] = OMIT,
billing: typing.Optional[UpdateCardsRequestBilling] = OMIT,
canceled: typing.Optional[bool] = OMIT,
+ cardholder: typing.Optional[UpdateCardsRequestCardholder] = OMIT,
frozen: typing.Optional[bool] = OMIT,
name: typing.Optional[str] = OMIT,
pin: typing.Optional[str] = OMIT,
@@ -831,11 +840,14 @@ async def update(
The owning account ID (a biz_ identifier). Provide this or user_id.
billing : typing.Optional[UpdateCardsRequestBilling]
- New billing address. Requires line1, city, region, postal_code, and country_code. On an invited card, passing billing alone (as the invited user) completes onboarding and starts card provisioning.
+ The billing address. On an issued card this replaces the card's billing address and region is also required. On an invited card, sending it as the invited user completes onboarding and starts card provisioning.
canceled : typing.Optional[bool]
Pass `true` to permanently cancel the card. A canceled card cannot be uncanceled. Cannot be combined with other fields.
+ cardholder : typing.Optional[UpdateCardsRequestCardholder]
+ Details for the invited cardholder, accepted only while completing onboarding on an invited card. The legal name comes from an approved identity verification when the invited user has one, and from these fields when they do not.
+
frozen : typing.Optional[bool]
Pass `true` to freeze the card, `false` to unfreeze it. The assigned cardholder may freeze their own card without the payout:account:update scope.
@@ -877,6 +889,9 @@ async def update(
object_=billing, annotation=UpdateCardsRequestBilling, direction="write"
),
"canceled": canceled,
+ "cardholder": convert_and_respect_annotation_metadata(
+ object_=cardholder, annotation=UpdateCardsRequestCardholder, direction="write"
+ ),
"frozen": frozen,
"name": name,
"pin": pin,
diff --git a/src/whop_sdk/cards/types/__init__.py b/src/whop_sdk/cards/types/__init__.py
index fc6f06d8..7899cdeb 100644
--- a/src/whop_sdk/cards/types/__init__.py
+++ b/src/whop_sdk/cards/types/__init__.py
@@ -116,6 +116,7 @@
from .retrieve_cards_response_status import RetrieveCardsResponseStatus
from .retrieve_cards_response_type import RetrieveCardsResponseType
from .update_cards_request_billing import UpdateCardsRequestBilling
+ from .update_cards_request_cardholder import UpdateCardsRequestCardholder
from .update_cards_request_spend_limit_frequency import UpdateCardsRequestSpendLimitFrequency
from .update_cards_response import UpdateCardsResponse
from .update_cards_response_billing import UpdateCardsResponseBilling
@@ -236,6 +237,7 @@
"RetrieveCardsResponseStatus": ".retrieve_cards_response_status",
"RetrieveCardsResponseType": ".retrieve_cards_response_type",
"UpdateCardsRequestBilling": ".update_cards_request_billing",
+ "UpdateCardsRequestCardholder": ".update_cards_request_cardholder",
"UpdateCardsRequestSpendLimitFrequency": ".update_cards_request_spend_limit_frequency",
"UpdateCardsResponse": ".update_cards_response",
"UpdateCardsResponseBilling": ".update_cards_response_billing",
@@ -380,6 +382,7 @@ def __dir__():
"RetrieveCardsResponseStatus",
"RetrieveCardsResponseType",
"UpdateCardsRequestBilling",
+ "UpdateCardsRequestCardholder",
"UpdateCardsRequestSpendLimitFrequency",
"UpdateCardsResponse",
"UpdateCardsResponseBilling",
diff --git a/src/whop_sdk/cards/types/update_cards_request_billing.py b/src/whop_sdk/cards/types/update_cards_request_billing.py
index 5b6ed6b9..fe4c9203 100644
--- a/src/whop_sdk/cards/types/update_cards_request_billing.py
+++ b/src/whop_sdk/cards/types/update_cards_request_billing.py
@@ -8,7 +8,7 @@
class UpdateCardsRequestBilling(UniversalBaseModel):
"""
- New billing address. Requires line1, city, region, postal_code, and country_code. On an invited card, passing billing alone (as the invited user) completes onboarding and starts card provisioning.
+ The billing address. On an issued card this replaces the card's billing address and region is also required. On an invited card, sending it as the invited user completes onboarding and starts card provisioning.
"""
city: str = pydantic.Field()
@@ -36,9 +36,9 @@ class UpdateCardsRequestBilling(UniversalBaseModel):
Billing postal code.
"""
- region: str = pydantic.Field()
+ region: typing.Optional[str] = pydantic.Field(default=None)
"""
- Billing region or state.
+ Billing region or state. Required when updating an issued card's billing address.
"""
if IS_PYDANTIC_V2:
diff --git a/src/whop_sdk/cards/types/update_cards_request_cardholder.py b/src/whop_sdk/cards/types/update_cards_request_cardholder.py
new file mode 100644
index 00000000..90f3fa05
--- /dev/null
+++ b/src/whop_sdk/cards/types/update_cards_request_cardholder.py
@@ -0,0 +1,41 @@
+# This file was auto-generated by Fern from our API Definition.
+
+import typing
+
+import pydantic
+from ...core.pydantic_utilities import IS_PYDANTIC_V2, UniversalBaseModel
+
+
+class UpdateCardsRequestCardholder(UniversalBaseModel):
+ """
+ Details for the invited cardholder, accepted only while completing onboarding on an invited card. The legal name comes from an approved identity verification when the invited user has one, and from these fields when they do not.
+ """
+
+ email: typing.Optional[str] = pydantic.Field(default=None)
+ """
+ Email address for the invited cardholder.
+ """
+
+ first_name: typing.Optional[str] = pydantic.Field(default=None)
+ """
+ Legal first name of the invited cardholder.
+ """
+
+ last_name: typing.Optional[str] = pydantic.Field(default=None)
+ """
+ Legal last name of the invited cardholder.
+ """
+
+ phone: typing.Optional[str] = pydantic.Field(default=None)
+ """
+ Phone number for the invited cardholder.
+ """
+
+ if IS_PYDANTIC_V2:
+ model_config: typing.ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(extra="allow", frozen=True) # type: ignore # Pydantic v2
+ else:
+
+ class Config:
+ frozen = True
+ smart_union = True
+ extra = pydantic.Extra.allow
diff --git a/src/whop_sdk/chat_channels/client.py b/src/whop_sdk/chat_channels/client.py
index a44b6282..24053e52 100644
--- a/src/whop_sdk/chat_channels/client.py
+++ b/src/whop_sdk/chat_channels/client.py
@@ -81,7 +81,7 @@ def list(
from whop_sdk import Whop
client = Whop(
- "2026-09-02-2",
+ "2026-09-06",
idempotency_key="YOUR_IDEMPOTENCY_KEY",
token="YOUR_TOKEN",
)
@@ -132,7 +132,7 @@ def retrieve(self, id: str, *, request_options: typing.Optional[RequestOptions]
from whop_sdk import Whop
client = Whop(
- "2026-09-02-2",
+ "2026-09-06",
idempotency_key="YOUR_IDEMPOTENCY_KEY",
token="YOUR_TOKEN",
)
@@ -197,7 +197,7 @@ def update(
from whop_sdk import Whop
client = Whop(
- "2026-09-02-2",
+ "2026-09-06",
idempotency_key="YOUR_IDEMPOTENCY_KEY",
token="YOUR_TOKEN",
)
@@ -285,7 +285,7 @@ async def list(
from whop_sdk import AsyncWhop
client = AsyncWhop(
- "2026-09-02-2",
+ "2026-09-06",
idempotency_key="YOUR_IDEMPOTENCY_KEY",
token="YOUR_TOKEN",
)
@@ -345,7 +345,7 @@ async def retrieve(self, id: str, *, request_options: typing.Optional[RequestOpt
from whop_sdk import AsyncWhop
client = AsyncWhop(
- "2026-09-02-2",
+ "2026-09-06",
idempotency_key="YOUR_IDEMPOTENCY_KEY",
token="YOUR_TOKEN",
)
@@ -418,7 +418,7 @@ async def update(
from whop_sdk import AsyncWhop
client = AsyncWhop(
- "2026-09-02-2",
+ "2026-09-06",
idempotency_key="YOUR_IDEMPOTENCY_KEY",
token="YOUR_TOKEN",
)
diff --git a/src/whop_sdk/checkout_configurations/client.py b/src/whop_sdk/checkout_configurations/client.py
index ea80b97d..099fdbb3 100644
--- a/src/whop_sdk/checkout_configurations/client.py
+++ b/src/whop_sdk/checkout_configurations/client.py
@@ -94,7 +94,7 @@ def list(
from whop_sdk import Whop
client = Whop(
- "2026-09-02-2",
+ "2026-09-06",
idempotency_key="YOUR_IDEMPOTENCY_KEY",
token="YOUR_TOKEN",
)
@@ -184,7 +184,7 @@ def create(
from whop_sdk import Whop
client = Whop(
- "2026-09-02-2",
+ "2026-09-06",
idempotency_key="YOUR_IDEMPOTENCY_KEY",
token="YOUR_TOKEN",
)
@@ -232,7 +232,7 @@ def retrieve(
from whop_sdk import Whop
client = Whop(
- "2026-09-02-2",
+ "2026-09-06",
idempotency_key="YOUR_IDEMPOTENCY_KEY",
token="YOUR_TOKEN",
)
@@ -267,7 +267,7 @@ def delete(
from whop_sdk import Whop
client = Whop(
- "2026-09-02-2",
+ "2026-09-06",
idempotency_key="YOUR_IDEMPOTENCY_KEY",
token="YOUR_TOKEN",
)
@@ -351,7 +351,7 @@ async def list(
from whop_sdk import AsyncWhop
client = AsyncWhop(
- "2026-09-02-2",
+ "2026-09-06",
idempotency_key="YOUR_IDEMPOTENCY_KEY",
token="YOUR_TOKEN",
)
@@ -450,7 +450,7 @@ async def create(
from whop_sdk import AsyncWhop
client = AsyncWhop(
- "2026-09-02-2",
+ "2026-09-06",
idempotency_key="YOUR_IDEMPOTENCY_KEY",
token="YOUR_TOKEN",
)
@@ -506,7 +506,7 @@ async def retrieve(
from whop_sdk import AsyncWhop
client = AsyncWhop(
- "2026-09-02-2",
+ "2026-09-06",
idempotency_key="YOUR_IDEMPOTENCY_KEY",
token="YOUR_TOKEN",
)
@@ -549,7 +549,7 @@ async def delete(
from whop_sdk import AsyncWhop
client = AsyncWhop(
- "2026-09-02-2",
+ "2026-09-06",
idempotency_key="YOUR_IDEMPOTENCY_KEY",
token="YOUR_TOKEN",
)
diff --git a/src/whop_sdk/client.py b/src/whop_sdk/client.py
index da4984a1..de0d9f82 100644
--- a/src/whop_sdk/client.py
+++ b/src/whop_sdk/client.py
@@ -142,7 +142,7 @@ class Whop:
from whop_sdk import Whop
client = Whop(
- "2026-09-02-2",
+ "2026-09-06",
idempotency_key="YOUR_IDEMPOTENCY_KEY",
token="YOUR_TOKEN",
)
@@ -153,7 +153,7 @@ def __init__(
*,
base_url: typing.Optional[str] = None,
environment: WhopEnvironment = WhopEnvironment.DEFAULT,
- api_version_date: typing.Optional[str] = "2026-09-02-2",
+ api_version_date: typing.Optional[str] = "2026-09-06",
idempotency_key: typing.Optional[str] = None,
token: typing.Optional[typing.Union[str, typing.Callable[[], str]]] = None,
headers: typing.Optional[typing.Dict[str, str]] = None,
@@ -977,7 +977,7 @@ class AsyncWhop:
from whop_sdk import AsyncWhop
client = AsyncWhop(
- "2026-09-02-2",
+ "2026-09-06",
idempotency_key="YOUR_IDEMPOTENCY_KEY",
token="YOUR_TOKEN",
)
@@ -988,7 +988,7 @@ def __init__(
*,
base_url: typing.Optional[str] = None,
environment: WhopEnvironment = WhopEnvironment.DEFAULT,
- api_version_date: typing.Optional[str] = "2026-09-02-2",
+ api_version_date: typing.Optional[str] = "2026-09-06",
idempotency_key: typing.Optional[str] = None,
token: typing.Optional[typing.Union[str, typing.Callable[[], str]]] = None,
headers: typing.Optional[typing.Dict[str, str]] = None,
diff --git a/src/whop_sdk/company_token_transactions/client.py b/src/whop_sdk/company_token_transactions/client.py
index cabdf344..1b55854b 100644
--- a/src/whop_sdk/company_token_transactions/client.py
+++ b/src/whop_sdk/company_token_transactions/client.py
@@ -86,7 +86,7 @@ def list(
from whop_sdk import Whop
client = Whop(
- "2026-09-02-2",
+ "2026-09-06",
idempotency_key="YOUR_IDEMPOTENCY_KEY",
token="YOUR_TOKEN",
)
@@ -144,7 +144,7 @@ def create(
)
client = Whop(
- "2026-09-02-2",
+ "2026-09-06",
idempotency_key="YOUR_IDEMPOTENCY_KEY",
token="YOUR_TOKEN",
)
@@ -187,7 +187,7 @@ def retrieve(self, id: str, *, request_options: typing.Optional[RequestOptions]
from whop_sdk import Whop
client = Whop(
- "2026-09-02-2",
+ "2026-09-06",
idempotency_key="YOUR_IDEMPOTENCY_KEY",
token="YOUR_TOKEN",
)
@@ -271,7 +271,7 @@ async def list(
from whop_sdk import AsyncWhop
client = AsyncWhop(
- "2026-09-02-2",
+ "2026-09-06",
idempotency_key="YOUR_IDEMPOTENCY_KEY",
token="YOUR_TOKEN",
)
@@ -338,7 +338,7 @@ async def create(
)
client = AsyncWhop(
- "2026-09-02-2",
+ "2026-09-06",
idempotency_key="YOUR_IDEMPOTENCY_KEY",
token="YOUR_TOKEN",
)
@@ -391,7 +391,7 @@ async def retrieve(
from whop_sdk import AsyncWhop
client = AsyncWhop(
- "2026-09-02-2",
+ "2026-09-06",
idempotency_key="YOUR_IDEMPOTENCY_KEY",
token="YOUR_TOKEN",
)
diff --git a/src/whop_sdk/confirmation_tokens/__init__.py b/src/whop_sdk/confirmation_tokens/__init__.py
index 6a931269..9ff87872 100644
--- a/src/whop_sdk/confirmation_tokens/__init__.py
+++ b/src/whop_sdk/confirmation_tokens/__init__.py
@@ -17,6 +17,7 @@
CreateConfirmationTokensRequestPaymentMethodGooglePay,
CreateConfirmationTokensRequestPaymentMethodPayerDocument,
CreateConfirmationTokensRequestPaymentMethodPayerDocumentType,
+ CreateConfirmationTokensRequestPaymentMethodRedirect,
CreateConfirmationTokensRequestPaymentMethodSaved,
CreateConfirmationTokensRequestSetupFutureUsage,
)
@@ -31,6 +32,7 @@
"CreateConfirmationTokensRequestPaymentMethodGooglePay": ".types",
"CreateConfirmationTokensRequestPaymentMethodPayerDocument": ".types",
"CreateConfirmationTokensRequestPaymentMethodPayerDocumentType": ".types",
+ "CreateConfirmationTokensRequestPaymentMethodRedirect": ".types",
"CreateConfirmationTokensRequestPaymentMethodSaved": ".types",
"CreateConfirmationTokensRequestSetupFutureUsage": ".types",
}
@@ -68,6 +70,7 @@ def __dir__():
"CreateConfirmationTokensRequestPaymentMethodGooglePay",
"CreateConfirmationTokensRequestPaymentMethodPayerDocument",
"CreateConfirmationTokensRequestPaymentMethodPayerDocumentType",
+ "CreateConfirmationTokensRequestPaymentMethodRedirect",
"CreateConfirmationTokensRequestPaymentMethodSaved",
"CreateConfirmationTokensRequestSetupFutureUsage",
]
diff --git a/src/whop_sdk/confirmation_tokens/client.py b/src/whop_sdk/confirmation_tokens/client.py
index 5388e16f..0aa95910 100644
--- a/src/whop_sdk/confirmation_tokens/client.py
+++ b/src/whop_sdk/confirmation_tokens/client.py
@@ -81,7 +81,7 @@ def create(
)
client = Whop(
- "2026-09-02-2",
+ "2026-09-06",
idempotency_key="YOUR_IDEMPOTENCY_KEY",
token="YOUR_TOKEN",
)
@@ -147,7 +147,7 @@ def retrieve(
from whop_sdk import Whop
client = Whop(
- "2026-09-02-2",
+ "2026-09-06",
idempotency_key="YOUR_IDEMPOTENCY_KEY",
token="YOUR_TOKEN",
)
@@ -229,7 +229,7 @@ async def create(
)
client = AsyncWhop(
- "2026-09-02-2",
+ "2026-09-06",
idempotency_key="YOUR_IDEMPOTENCY_KEY",
token="YOUR_TOKEN",
)
@@ -303,7 +303,7 @@ async def retrieve(
from whop_sdk import AsyncWhop
client = AsyncWhop(
- "2026-09-02-2",
+ "2026-09-06",
idempotency_key="YOUR_IDEMPOTENCY_KEY",
token="YOUR_TOKEN",
)
diff --git a/src/whop_sdk/confirmation_tokens/types/__init__.py b/src/whop_sdk/confirmation_tokens/types/__init__.py
index d435487d..6328c392 100644
--- a/src/whop_sdk/confirmation_tokens/types/__init__.py
+++ b/src/whop_sdk/confirmation_tokens/types/__init__.py
@@ -30,6 +30,9 @@
from .create_confirmation_tokens_request_payment_method_payer_document_type import (
CreateConfirmationTokensRequestPaymentMethodPayerDocumentType,
)
+ from .create_confirmation_tokens_request_payment_method_redirect import (
+ CreateConfirmationTokensRequestPaymentMethodRedirect,
+ )
from .create_confirmation_tokens_request_payment_method_saved import (
CreateConfirmationTokensRequestPaymentMethodSaved,
)
@@ -45,6 +48,7 @@
"CreateConfirmationTokensRequestPaymentMethodGooglePay": ".create_confirmation_tokens_request_payment_method_google_pay",
"CreateConfirmationTokensRequestPaymentMethodPayerDocument": ".create_confirmation_tokens_request_payment_method_payer_document",
"CreateConfirmationTokensRequestPaymentMethodPayerDocumentType": ".create_confirmation_tokens_request_payment_method_payer_document_type",
+ "CreateConfirmationTokensRequestPaymentMethodRedirect": ".create_confirmation_tokens_request_payment_method_redirect",
"CreateConfirmationTokensRequestPaymentMethodSaved": ".create_confirmation_tokens_request_payment_method_saved",
"CreateConfirmationTokensRequestSetupFutureUsage": ".create_confirmation_tokens_request_setup_future_usage",
}
@@ -82,6 +86,7 @@ def __dir__():
"CreateConfirmationTokensRequestPaymentMethodGooglePay",
"CreateConfirmationTokensRequestPaymentMethodPayerDocument",
"CreateConfirmationTokensRequestPaymentMethodPayerDocumentType",
+ "CreateConfirmationTokensRequestPaymentMethodRedirect",
"CreateConfirmationTokensRequestPaymentMethodSaved",
"CreateConfirmationTokensRequestSetupFutureUsage",
]
diff --git a/src/whop_sdk/confirmation_tokens/types/create_confirmation_tokens_request_billing_details.py b/src/whop_sdk/confirmation_tokens/types/create_confirmation_tokens_request_billing_details.py
index 61823b4a..f5d92647 100644
--- a/src/whop_sdk/confirmation_tokens/types/create_confirmation_tokens_request_billing_details.py
+++ b/src/whop_sdk/confirmation_tokens/types/create_confirmation_tokens_request_billing_details.py
@@ -14,6 +14,7 @@ class CreateConfirmationTokensRequestBillingDetails(UniversalBaseModel):
address: typing.Optional[typing.Dict[str, typing.Any]] = None
email: str
name: typing.Optional[str] = None
+ phone: typing.Optional[str] = None
if IS_PYDANTIC_V2:
model_config: typing.ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(extra="allow", frozen=True) # type: ignore # Pydantic v2
diff --git a/src/whop_sdk/confirmation_tokens/types/create_confirmation_tokens_request_payment_method.py b/src/whop_sdk/confirmation_tokens/types/create_confirmation_tokens_request_payment_method.py
index 0b26dca8..9ba6f507 100644
--- a/src/whop_sdk/confirmation_tokens/types/create_confirmation_tokens_request_payment_method.py
+++ b/src/whop_sdk/confirmation_tokens/types/create_confirmation_tokens_request_payment_method.py
@@ -23,6 +23,9 @@
from .create_confirmation_tokens_request_payment_method_payer_document import (
CreateConfirmationTokensRequestPaymentMethodPayerDocument,
)
+from .create_confirmation_tokens_request_payment_method_redirect import (
+ CreateConfirmationTokensRequestPaymentMethodRedirect,
+)
from .create_confirmation_tokens_request_payment_method_saved import CreateConfirmationTokensRequestPaymentMethodSaved
@@ -68,6 +71,11 @@ class CreateConfirmationTokensRequestPaymentMethod(UniversalBaseModel):
The buyer's identity document when the charge currency has a payer_document_requirements entry for this method, such as ARS card, MODO, or Rapipago. This is independent of the method category.
"""
+ redirect: typing.Optional[CreateConfirmationTokensRequestPaymentMethodRedirect] = pydantic.Field(default=None)
+ """
+ Category `redirect` only. Empty unless the method declares redirect-specific fields.
+ """
+
saved: typing.Optional[CreateConfirmationTokensRequestPaymentMethodSaved] = pydantic.Field(default=None)
"""
Category `saved` only. Names one of the buyer's own stored payment methods. Requires a buyer credential — the wallet read is scoped to that account, so another user's id reads as not found.
diff --git a/src/whop_sdk/disputes/types/update_evidence_dispute_request_refund_policy_attachment.py b/src/whop_sdk/confirmation_tokens/types/create_confirmation_tokens_request_payment_method_redirect.py
similarity index 67%
rename from src/whop_sdk/disputes/types/update_evidence_dispute_request_refund_policy_attachment.py
rename to src/whop_sdk/confirmation_tokens/types/create_confirmation_tokens_request_payment_method_redirect.py
index 3e954820..6a441b5e 100644
--- a/src/whop_sdk/disputes/types/update_evidence_dispute_request_refund_policy_attachment.py
+++ b/src/whop_sdk/confirmation_tokens/types/create_confirmation_tokens_request_payment_method_redirect.py
@@ -6,14 +6,9 @@
from ...core.pydantic_utilities import IS_PYDANTIC_V2, UniversalBaseModel
-class UpdateEvidenceDisputeRequestRefundPolicyAttachment(UniversalBaseModel):
+class CreateConfirmationTokensRequestPaymentMethodRedirect(UniversalBaseModel):
"""
- A file upload containing the company's refund policy document.
- """
-
- id: str = pydantic.Field()
- """
- The ID of an existing file object.
+ Category `redirect` only. Empty unless the method declares redirect-specific fields.
"""
if IS_PYDANTIC_V2:
diff --git a/src/whop_sdk/course_chapters/client.py b/src/whop_sdk/course_chapters/client.py
index 9357109c..0b08aaf0 100644
--- a/src/whop_sdk/course_chapters/client.py
+++ b/src/whop_sdk/course_chapters/client.py
@@ -75,7 +75,7 @@ def list(
from whop_sdk import Whop
client = Whop(
- "2026-09-02-2",
+ "2026-09-06",
idempotency_key="YOUR_IDEMPOTENCY_KEY",
token="YOUR_TOKEN",
)
@@ -128,7 +128,7 @@ def create(
from whop_sdk import Whop
client = Whop(
- "2026-09-02-2",
+ "2026-09-06",
idempotency_key="YOUR_IDEMPOTENCY_KEY",
token="YOUR_TOKEN",
)
@@ -164,7 +164,7 @@ def retrieve(self, id: str, *, request_options: typing.Optional[RequestOptions]
from whop_sdk import Whop
client = Whop(
- "2026-09-02-2",
+ "2026-09-06",
idempotency_key="YOUR_IDEMPOTENCY_KEY",
token="YOUR_TOKEN",
)
@@ -200,7 +200,7 @@ def delete(self, id: str, *, request_options: typing.Optional[RequestOptions] =
from whop_sdk import Whop
client = Whop(
- "2026-09-02-2",
+ "2026-09-06",
idempotency_key="YOUR_IDEMPOTENCY_KEY",
token="YOUR_TOKEN",
)
@@ -239,7 +239,7 @@ def update(self, id: str, *, title: str, request_options: typing.Optional[Reques
from whop_sdk import Whop
client = Whop(
- "2026-09-02-2",
+ "2026-09-06",
idempotency_key="YOUR_IDEMPOTENCY_KEY",
token="YOUR_TOKEN",
)
@@ -315,7 +315,7 @@ async def list(
from whop_sdk import AsyncWhop
client = AsyncWhop(
- "2026-09-02-2",
+ "2026-09-06",
idempotency_key="YOUR_IDEMPOTENCY_KEY",
token="YOUR_TOKEN",
)
@@ -377,7 +377,7 @@ async def create(
from whop_sdk import AsyncWhop
client = AsyncWhop(
- "2026-09-02-2",
+ "2026-09-06",
idempotency_key="YOUR_IDEMPOTENCY_KEY",
token="YOUR_TOKEN",
)
@@ -421,7 +421,7 @@ async def retrieve(self, id: str, *, request_options: typing.Optional[RequestOpt
from whop_sdk import AsyncWhop
client = AsyncWhop(
- "2026-09-02-2",
+ "2026-09-06",
idempotency_key="YOUR_IDEMPOTENCY_KEY",
token="YOUR_TOKEN",
)
@@ -465,7 +465,7 @@ async def delete(self, id: str, *, request_options: typing.Optional[RequestOptio
from whop_sdk import AsyncWhop
client = AsyncWhop(
- "2026-09-02-2",
+ "2026-09-06",
idempotency_key="YOUR_IDEMPOTENCY_KEY",
token="YOUR_TOKEN",
)
@@ -514,7 +514,7 @@ async def update(
from whop_sdk import AsyncWhop
client = AsyncWhop(
- "2026-09-02-2",
+ "2026-09-06",
idempotency_key="YOUR_IDEMPOTENCY_KEY",
token="YOUR_TOKEN",
)
diff --git a/src/whop_sdk/course_lesson_interactions/client.py b/src/whop_sdk/course_lesson_interactions/client.py
index b9808441..8f09320d 100644
--- a/src/whop_sdk/course_lesson_interactions/client.py
+++ b/src/whop_sdk/course_lesson_interactions/client.py
@@ -85,7 +85,7 @@ def list(
from whop_sdk import Whop
client = Whop(
- "2026-09-02-2",
+ "2026-09-06",
idempotency_key="YOUR_IDEMPOTENCY_KEY",
token="YOUR_TOKEN",
)
@@ -140,7 +140,7 @@ def retrieve(self, id: str, *, request_options: typing.Optional[RequestOptions]
from whop_sdk import Whop
client = Whop(
- "2026-09-02-2",
+ "2026-09-06",
idempotency_key="YOUR_IDEMPOTENCY_KEY",
token="YOUR_TOKEN",
)
@@ -228,7 +228,7 @@ async def list(
from whop_sdk import AsyncWhop
client = AsyncWhop(
- "2026-09-02-2",
+ "2026-09-06",
idempotency_key="YOUR_IDEMPOTENCY_KEY",
token="YOUR_TOKEN",
)
@@ -294,7 +294,7 @@ async def retrieve(
from whop_sdk import AsyncWhop
client = AsyncWhop(
- "2026-09-02-2",
+ "2026-09-06",
idempotency_key="YOUR_IDEMPOTENCY_KEY",
token="YOUR_TOKEN",
)
diff --git a/src/whop_sdk/course_lessons/client.py b/src/whop_sdk/course_lessons/client.py
index 0fec73ad..f6f0b690 100644
--- a/src/whop_sdk/course_lessons/client.py
+++ b/src/whop_sdk/course_lessons/client.py
@@ -94,7 +94,7 @@ def list(
from whop_sdk import Whop
client = Whop(
- "2026-09-02-2",
+ "2026-09-06",
idempotency_key="YOUR_IDEMPOTENCY_KEY",
token="YOUR_TOKEN",
)
@@ -178,7 +178,7 @@ def create(
from whop_sdk import Whop
client = Whop(
- "2026-09-02-2",
+ "2026-09-06",
idempotency_key="YOUR_IDEMPOTENCY_KEY",
token="YOUR_TOKEN",
)
@@ -225,7 +225,7 @@ def retrieve(self, id: str, *, request_options: typing.Optional[RequestOptions]
from whop_sdk import Whop
client = Whop(
- "2026-09-02-2",
+ "2026-09-06",
idempotency_key="YOUR_IDEMPOTENCY_KEY",
token="YOUR_TOKEN",
)
@@ -261,7 +261,7 @@ def delete(self, id: str, *, request_options: typing.Optional[RequestOptions] =
from whop_sdk import Whop
client = Whop(
- "2026-09-02-2",
+ "2026-09-06",
idempotency_key="YOUR_IDEMPOTENCY_KEY",
token="YOUR_TOKEN",
)
@@ -362,7 +362,7 @@ def update(
from whop_sdk import Whop
client = Whop(
- "2026-09-02-2",
+ "2026-09-06",
idempotency_key="YOUR_IDEMPOTENCY_KEY",
token="YOUR_TOKEN",
)
@@ -412,7 +412,7 @@ def mark_as_completed(self, lesson_id: str, *, request_options: typing.Optional[
from whop_sdk import Whop
client = Whop(
- "2026-09-02-2",
+ "2026-09-06",
idempotency_key="YOUR_IDEMPOTENCY_KEY",
token="YOUR_TOKEN",
)
@@ -445,7 +445,7 @@ def start(self, lesson_id: str, *, request_options: typing.Optional[RequestOptio
from whop_sdk import Whop
client = Whop(
- "2026-09-02-2",
+ "2026-09-06",
idempotency_key="YOUR_IDEMPOTENCY_KEY",
token="YOUR_TOKEN",
)
@@ -490,7 +490,7 @@ def submit_assessment(
)
client = Whop(
- "2026-09-02-2",
+ "2026-09-06",
idempotency_key="YOUR_IDEMPOTENCY_KEY",
token="YOUR_TOKEN",
)
@@ -574,7 +574,7 @@ async def list(
from whop_sdk import AsyncWhop
client = AsyncWhop(
- "2026-09-02-2",
+ "2026-09-06",
idempotency_key="YOUR_IDEMPOTENCY_KEY",
token="YOUR_TOKEN",
)
@@ -667,7 +667,7 @@ async def create(
from whop_sdk import AsyncWhop
client = AsyncWhop(
- "2026-09-02-2",
+ "2026-09-06",
idempotency_key="YOUR_IDEMPOTENCY_KEY",
token="YOUR_TOKEN",
)
@@ -722,7 +722,7 @@ async def retrieve(self, id: str, *, request_options: typing.Optional[RequestOpt
from whop_sdk import AsyncWhop
client = AsyncWhop(
- "2026-09-02-2",
+ "2026-09-06",
idempotency_key="YOUR_IDEMPOTENCY_KEY",
token="YOUR_TOKEN",
)
@@ -766,7 +766,7 @@ async def delete(self, id: str, *, request_options: typing.Optional[RequestOptio
from whop_sdk import AsyncWhop
client = AsyncWhop(
- "2026-09-02-2",
+ "2026-09-06",
idempotency_key="YOUR_IDEMPOTENCY_KEY",
token="YOUR_TOKEN",
)
@@ -875,7 +875,7 @@ async def update(
from whop_sdk import AsyncWhop
client = AsyncWhop(
- "2026-09-02-2",
+ "2026-09-06",
idempotency_key="YOUR_IDEMPOTENCY_KEY",
token="YOUR_TOKEN",
)
@@ -935,7 +935,7 @@ async def mark_as_completed(
from whop_sdk import AsyncWhop
client = AsyncWhop(
- "2026-09-02-2",
+ "2026-09-06",
idempotency_key="YOUR_IDEMPOTENCY_KEY",
token="YOUR_TOKEN",
)
@@ -976,7 +976,7 @@ async def start(self, lesson_id: str, *, request_options: typing.Optional[Reques
from whop_sdk import AsyncWhop
client = AsyncWhop(
- "2026-09-02-2",
+ "2026-09-06",
idempotency_key="YOUR_IDEMPOTENCY_KEY",
token="YOUR_TOKEN",
)
@@ -1029,7 +1029,7 @@ async def submit_assessment(
)
client = AsyncWhop(
- "2026-09-02-2",
+ "2026-09-06",
idempotency_key="YOUR_IDEMPOTENCY_KEY",
token="YOUR_TOKEN",
)
diff --git a/src/whop_sdk/course_students/client.py b/src/whop_sdk/course_students/client.py
index cd750180..db435f94 100644
--- a/src/whop_sdk/course_students/client.py
+++ b/src/whop_sdk/course_students/client.py
@@ -77,7 +77,7 @@ def list(
from whop_sdk import Whop
client = Whop(
- "2026-09-02-2",
+ "2026-09-06",
idempotency_key="YOUR_IDEMPOTENCY_KEY",
token="YOUR_TOKEN",
)
@@ -128,7 +128,7 @@ def retrieve(self, id: str, *, request_options: typing.Optional[RequestOptions]
from whop_sdk import Whop
client = Whop(
- "2026-09-02-2",
+ "2026-09-06",
idempotency_key="YOUR_IDEMPOTENCY_KEY",
token="YOUR_TOKEN",
)
@@ -208,7 +208,7 @@ async def list(
from whop_sdk import AsyncWhop
client = AsyncWhop(
- "2026-09-02-2",
+ "2026-09-06",
idempotency_key="YOUR_IDEMPOTENCY_KEY",
token="YOUR_TOKEN",
)
@@ -268,7 +268,7 @@ async def retrieve(self, id: str, *, request_options: typing.Optional[RequestOpt
from whop_sdk import AsyncWhop
client = AsyncWhop(
- "2026-09-02-2",
+ "2026-09-06",
idempotency_key="YOUR_IDEMPOTENCY_KEY",
token="YOUR_TOKEN",
)
diff --git a/src/whop_sdk/courses/client.py b/src/whop_sdk/courses/client.py
index 879b2aa1..a6af1ed0 100644
--- a/src/whop_sdk/courses/client.py
+++ b/src/whop_sdk/courses/client.py
@@ -84,7 +84,7 @@ def list(
from whop_sdk import Whop
client = Whop(
- "2026-09-02-2",
+ "2026-09-06",
idempotency_key="YOUR_IDEMPOTENCY_KEY",
token="YOUR_TOKEN",
)
@@ -168,7 +168,7 @@ def create(
from whop_sdk import Whop
client = Whop(
- "2026-09-02-2",
+ "2026-09-06",
idempotency_key="YOUR_IDEMPOTENCY_KEY",
token="YOUR_TOKEN",
)
@@ -215,7 +215,7 @@ def retrieve(self, id: str, *, request_options: typing.Optional[RequestOptions]
from whop_sdk import Whop
client = Whop(
- "2026-09-02-2",
+ "2026-09-06",
idempotency_key="YOUR_IDEMPOTENCY_KEY",
token="YOUR_TOKEN",
)
@@ -251,7 +251,7 @@ def delete(self, id: str, *, request_options: typing.Optional[RequestOptions] =
from whop_sdk import Whop
client = Whop(
- "2026-09-02-2",
+ "2026-09-06",
idempotency_key="YOUR_IDEMPOTENCY_KEY",
token="YOUR_TOKEN",
)
@@ -332,7 +332,7 @@ def update(
from whop_sdk import Whop
client = Whop(
- "2026-09-02-2",
+ "2026-09-06",
idempotency_key="YOUR_IDEMPOTENCY_KEY",
token="YOUR_TOKEN",
)
@@ -424,7 +424,7 @@ async def list(
from whop_sdk import AsyncWhop
client = AsyncWhop(
- "2026-09-02-2",
+ "2026-09-06",
idempotency_key="YOUR_IDEMPOTENCY_KEY",
token="YOUR_TOKEN",
)
@@ -517,7 +517,7 @@ async def create(
from whop_sdk import AsyncWhop
client = AsyncWhop(
- "2026-09-02-2",
+ "2026-09-06",
idempotency_key="YOUR_IDEMPOTENCY_KEY",
token="YOUR_TOKEN",
)
@@ -572,7 +572,7 @@ async def retrieve(self, id: str, *, request_options: typing.Optional[RequestOpt
from whop_sdk import AsyncWhop
client = AsyncWhop(
- "2026-09-02-2",
+ "2026-09-06",
idempotency_key="YOUR_IDEMPOTENCY_KEY",
token="YOUR_TOKEN",
)
@@ -616,7 +616,7 @@ async def delete(self, id: str, *, request_options: typing.Optional[RequestOptio
from whop_sdk import AsyncWhop
client = AsyncWhop(
- "2026-09-02-2",
+ "2026-09-06",
idempotency_key="YOUR_IDEMPOTENCY_KEY",
token="YOUR_TOKEN",
)
@@ -705,7 +705,7 @@ async def update(
from whop_sdk import AsyncWhop
client = AsyncWhop(
- "2026-09-02-2",
+ "2026-09-06",
idempotency_key="YOUR_IDEMPOTENCY_KEY",
token="YOUR_TOKEN",
)
diff --git a/src/whop_sdk/deposits/client.py b/src/whop_sdk/deposits/client.py
index db8b76e3..265a3b5c 100644
--- a/src/whop_sdk/deposits/client.py
+++ b/src/whop_sdk/deposits/client.py
@@ -34,7 +34,7 @@ def create(
request_options: typing.Optional[RequestOptions] = None,
) -> CreateDepositsResponse:
"""
- Retrieve the deposit methods for an account, including crypto and bank transfer.
+ Retrieve the deposit methods for an account, including crypto and bank transfer. Crypto deposits require a $10 minimum.
Parameters
----------
@@ -42,7 +42,7 @@ def create(
Account ID to fund, `biz_` or `user_`. Any business resolves without authentication; a user account resolves only for that same authenticated user.
amount : typing.Optional[float]
- Amount to prefill on hosted deposit page.
+ Amount to prefill on hosted deposit page. Crypto deposits require a $10 minimum.
request_options : typing.Optional[RequestOptions]
Request-specific configuration.
@@ -57,7 +57,7 @@ def create(
from whop_sdk import Whop
client = Whop(
- "2026-09-02-2",
+ "2026-09-06",
idempotency_key="YOUR_IDEMPOTENCY_KEY",
token="YOUR_TOKEN",
)
@@ -92,7 +92,7 @@ async def create(
request_options: typing.Optional[RequestOptions] = None,
) -> CreateDepositsResponse:
"""
- Retrieve the deposit methods for an account, including crypto and bank transfer.
+ Retrieve the deposit methods for an account, including crypto and bank transfer. Crypto deposits require a $10 minimum.
Parameters
----------
@@ -100,7 +100,7 @@ async def create(
Account ID to fund, `biz_` or `user_`. Any business resolves without authentication; a user account resolves only for that same authenticated user.
amount : typing.Optional[float]
- Amount to prefill on hosted deposit page.
+ Amount to prefill on hosted deposit page. Crypto deposits require a $10 minimum.
request_options : typing.Optional[RequestOptions]
Request-specific configuration.
@@ -117,7 +117,7 @@ async def create(
from whop_sdk import AsyncWhop
client = AsyncWhop(
- "2026-09-02-2",
+ "2026-09-06",
idempotency_key="YOUR_IDEMPOTENCY_KEY",
token="YOUR_TOKEN",
)
diff --git a/src/whop_sdk/deposits/raw_client.py b/src/whop_sdk/deposits/raw_client.py
index 87448d85..003f6d2f 100644
--- a/src/whop_sdk/deposits/raw_client.py
+++ b/src/whop_sdk/deposits/raw_client.py
@@ -31,7 +31,7 @@ def create(
request_options: typing.Optional[RequestOptions] = None,
) -> HttpResponse[CreateDepositsResponse]:
"""
- Retrieve the deposit methods for an account, including crypto and bank transfer.
+ Retrieve the deposit methods for an account, including crypto and bank transfer. Crypto deposits require a $10 minimum.
Parameters
----------
@@ -39,7 +39,7 @@ def create(
Account ID to fund, `biz_` or `user_`. Any business resolves without authentication; a user account resolves only for that same authenticated user.
amount : typing.Optional[float]
- Amount to prefill on hosted deposit page.
+ Amount to prefill on hosted deposit page. Crypto deposits require a $10 minimum.
request_options : typing.Optional[RequestOptions]
Request-specific configuration.
@@ -116,7 +116,7 @@ async def create(
request_options: typing.Optional[RequestOptions] = None,
) -> AsyncHttpResponse[CreateDepositsResponse]:
"""
- Retrieve the deposit methods for an account, including crypto and bank transfer.
+ Retrieve the deposit methods for an account, including crypto and bank transfer. Crypto deposits require a $10 minimum.
Parameters
----------
@@ -124,7 +124,7 @@ async def create(
Account ID to fund, `biz_` or `user_`. Any business resolves without authentication; a user account resolves only for that same authenticated user.
amount : typing.Optional[float]
- Amount to prefill on hosted deposit page.
+ Amount to prefill on hosted deposit page. Crypto deposits require a $10 minimum.
request_options : typing.Optional[RequestOptions]
Request-specific configuration.
diff --git a/src/whop_sdk/deposits/types/create_deposits_response_methods.py b/src/whop_sdk/deposits/types/create_deposits_response_methods.py
index b4a1e1a1..97a4cd8e 100644
--- a/src/whop_sdk/deposits/types/create_deposits_response_methods.py
+++ b/src/whop_sdk/deposits/types/create_deposits_response_methods.py
@@ -20,7 +20,7 @@ class CreateDepositsResponseMethods(UniversalBaseModel):
crypto: typing.List[CreateDepositsResponseMethodsCryptoItem] = pydantic.Field()
"""
- Crypto networks available for this deposit, each with its on-chain deposit address and the tokens accepted on that network.
+ Crypto networks available for this deposit, each with its on-chain deposit address and the tokens accepted on that network. Crypto deposits require a $10 minimum.
"""
if IS_PYDANTIC_V2:
diff --git a/src/whop_sdk/dispute_alerts/client.py b/src/whop_sdk/dispute_alerts/client.py
index d153a840..51e8b8f0 100644
--- a/src/whop_sdk/dispute_alerts/client.py
+++ b/src/whop_sdk/dispute_alerts/client.py
@@ -95,7 +95,7 @@ def list(
from whop_sdk import Whop
client = Whop(
- "2026-09-02-2",
+ "2026-09-06",
idempotency_key="YOUR_IDEMPOTENCY_KEY",
token="YOUR_TOKEN",
)
@@ -143,7 +143,7 @@ def retrieve(self, id: str, *, request_options: typing.Optional[RequestOptions]
from whop_sdk import Whop
client = Whop(
- "2026-09-02-2",
+ "2026-09-06",
idempotency_key="YOUR_IDEMPOTENCY_KEY",
token="YOUR_TOKEN",
)
@@ -239,7 +239,7 @@ async def list(
from whop_sdk import AsyncWhop
client = AsyncWhop(
- "2026-09-02-2",
+ "2026-09-06",
idempotency_key="YOUR_IDEMPOTENCY_KEY",
token="YOUR_TOKEN",
)
@@ -296,7 +296,7 @@ async def retrieve(self, id: str, *, request_options: typing.Optional[RequestOpt
from whop_sdk import AsyncWhop
client = AsyncWhop(
- "2026-09-02-2",
+ "2026-09-06",
idempotency_key="YOUR_IDEMPOTENCY_KEY",
token="YOUR_TOKEN",
)
diff --git a/src/whop_sdk/disputes/__init__.py b/src/whop_sdk/disputes/__init__.py
index f6a1b078..21c3a7bd 100644
--- a/src/whop_sdk/disputes/__init__.py
+++ b/src/whop_sdk/disputes/__init__.py
@@ -28,10 +28,6 @@
UpdateDisputesRequestEvidenceCustomerCommunicationAttachment,
UpdateDisputesRequestEvidenceRefundPolicyAttachment,
UpdateDisputesRequestEvidenceUncategorizedAttachment,
- UpdateEvidenceDisputeRequestCancellationPolicyAttachment,
- UpdateEvidenceDisputeRequestCustomerCommunicationAttachment,
- UpdateEvidenceDisputeRequestRefundPolicyAttachment,
- UpdateEvidenceDisputeRequestUncategorizedAttachment,
UploadEvidenceDisputesRequestDocumentsItem,
UploadEvidenceDisputesRequestDocumentsItemDocumentType,
)
@@ -57,10 +53,6 @@
"UpdateDisputesRequestEvidenceCustomerCommunicationAttachment": ".types",
"UpdateDisputesRequestEvidenceRefundPolicyAttachment": ".types",
"UpdateDisputesRequestEvidenceUncategorizedAttachment": ".types",
- "UpdateEvidenceDisputeRequestCancellationPolicyAttachment": ".types",
- "UpdateEvidenceDisputeRequestCustomerCommunicationAttachment": ".types",
- "UpdateEvidenceDisputeRequestRefundPolicyAttachment": ".types",
- "UpdateEvidenceDisputeRequestUncategorizedAttachment": ".types",
"UploadEvidenceDisputesRequestDocumentsItem": ".types",
"UploadEvidenceDisputesRequestDocumentsItemDocumentType": ".types",
}
@@ -109,10 +101,6 @@ def __dir__():
"UpdateDisputesRequestEvidenceCustomerCommunicationAttachment",
"UpdateDisputesRequestEvidenceRefundPolicyAttachment",
"UpdateDisputesRequestEvidenceUncategorizedAttachment",
- "UpdateEvidenceDisputeRequestCancellationPolicyAttachment",
- "UpdateEvidenceDisputeRequestCustomerCommunicationAttachment",
- "UpdateEvidenceDisputeRequestRefundPolicyAttachment",
- "UpdateEvidenceDisputeRequestUncategorizedAttachment",
"UploadEvidenceDisputesRequestDocumentsItem",
"UploadEvidenceDisputesRequestDocumentsItemDocumentType",
]
diff --git a/src/whop_sdk/disputes/client.py b/src/whop_sdk/disputes/client.py
index 620ca036..c8c75177 100644
--- a/src/whop_sdk/disputes/client.py
+++ b/src/whop_sdk/disputes/client.py
@@ -6,7 +6,6 @@
from ..core.pagination import AsyncPager, SyncPager
from ..core.request_options import RequestOptions
from ..types.dispute import Dispute
-from ..types.dispute_legacy import DisputeLegacy
from .raw_client import AsyncRawDisputesClient, RawDisputesClient
from .types.list_disputes_request_direction import ListDisputesRequestDirection
from .types.list_disputes_request_order import ListDisputesRequestOrder
@@ -16,18 +15,6 @@
from .types.summary_disputes_request_status_item import SummaryDisputesRequestStatusItem
from .types.summary_disputes_response import SummaryDisputesResponse
from .types.update_disputes_request_evidence import UpdateDisputesRequestEvidence
-from .types.update_evidence_dispute_request_cancellation_policy_attachment import (
- UpdateEvidenceDisputeRequestCancellationPolicyAttachment,
-)
-from .types.update_evidence_dispute_request_customer_communication_attachment import (
- UpdateEvidenceDisputeRequestCustomerCommunicationAttachment,
-)
-from .types.update_evidence_dispute_request_refund_policy_attachment import (
- UpdateEvidenceDisputeRequestRefundPolicyAttachment,
-)
-from .types.update_evidence_dispute_request_uncategorized_attachment import (
- UpdateEvidenceDisputeRequestUncategorizedAttachment,
-)
from .types.upload_evidence_disputes_request_documents_item import UploadEvidenceDisputesRequestDocumentsItem
# this is used as the default value for optional parameters
@@ -118,7 +105,7 @@ def list(
from whop_sdk import Whop
client = Whop(
- "2026-09-02-2",
+ "2026-09-06",
idempotency_key="YOUR_IDEMPOTENCY_KEY",
token="YOUR_TOKEN",
)
@@ -195,7 +182,7 @@ def summary(
from whop_sdk import Whop
client = Whop(
- "2026-09-02-2",
+ "2026-09-06",
idempotency_key="YOUR_IDEMPOTENCY_KEY",
token="YOUR_TOKEN",
)
@@ -234,7 +221,7 @@ def retrieve(self, id: str, *, request_options: typing.Optional[RequestOptions]
from whop_sdk import Whop
client = Whop(
- "2026-09-02-2",
+ "2026-09-06",
idempotency_key="YOUR_IDEMPOTENCY_KEY",
token="YOUR_TOKEN",
)
@@ -276,7 +263,7 @@ def update(
from whop_sdk import Whop
client = Whop(
- "2026-09-02-2",
+ "2026-09-06",
idempotency_key="YOUR_IDEMPOTENCY_KEY",
token="YOUR_TOKEN",
)
@@ -309,7 +296,7 @@ def submit(self, id: str, *, request_options: typing.Optional[RequestOptions] =
from whop_sdk import Whop
client = Whop(
- "2026-09-02-2",
+ "2026-09-06",
idempotency_key="YOUR_IDEMPOTENCY_KEY",
token="YOUR_TOKEN",
)
@@ -320,176 +307,6 @@ def submit(self, id: str, *, request_options: typing.Optional[RequestOptions] =
_response = self._raw_client.submit(id, request_options=request_options)
return _response.data
- def submit_evidence_dispute(
- self, id: str, *, request_options: typing.Optional[RequestOptions] = None
- ) -> DisputeLegacy:
- """
- Submit a payment dispute to the payment processor for review. Once submitted, no further edits can be made.
-
- Required permissions:
- - `payment:dispute`
- - `plan:basic:read`
- - `access_pass:basic:read`
- - `company:basic:read`
- - `payment:basic:read`
- - `member:email:read`
- - `member:basic:read`
- - `member:phone:read`
-
- Parameters
- ----------
- id : str
- The unique identifier of the dispute to submit to the payment processor for review.
-
- request_options : typing.Optional[RequestOptions]
- Request-specific configuration.
-
- Returns
- -------
- DisputeLegacy
- A successful response
-
- Examples
- --------
- from whop_sdk import Whop
-
- client = Whop(
- "2026-09-02-2",
- idempotency_key="YOUR_IDEMPOTENCY_KEY",
- token="YOUR_TOKEN",
- )
- client.disputes.submit_evidence_dispute(
- id="dspt_xxxxxxxxxxxxx",
- )
- """
- _response = self._raw_client.submit_evidence_dispute(id, request_options=request_options)
- return _response.data
-
- def update_evidence_dispute(
- self,
- id: str,
- *,
- access_activity_log: typing.Optional[str] = OMIT,
- billing_address: typing.Optional[str] = OMIT,
- cancellation_policy_attachment: typing.Optional[
- UpdateEvidenceDisputeRequestCancellationPolicyAttachment
- ] = OMIT,
- cancellation_policy_disclosure: typing.Optional[str] = OMIT,
- customer_communication_attachment: typing.Optional[
- UpdateEvidenceDisputeRequestCustomerCommunicationAttachment
- ] = OMIT,
- customer_email_address: typing.Optional[str] = OMIT,
- customer_name: typing.Optional[str] = OMIT,
- notes: typing.Optional[str] = OMIT,
- product_description: typing.Optional[str] = OMIT,
- refund_policy_attachment: typing.Optional[UpdateEvidenceDisputeRequestRefundPolicyAttachment] = OMIT,
- refund_policy_disclosure: typing.Optional[str] = OMIT,
- refund_refusal_explanation: typing.Optional[str] = OMIT,
- service_date: typing.Optional[str] = OMIT,
- uncategorized_attachment: typing.Optional[UpdateEvidenceDisputeRequestUncategorizedAttachment] = OMIT,
- request_options: typing.Optional[RequestOptions] = None,
- ) -> DisputeLegacy:
- """
- Update a dispute with evidence data to attempt to win the dispute.
-
- Required permissions:
- - `payment:dispute`
- - `plan:basic:read`
- - `access_pass:basic:read`
- - `company:basic:read`
- - `payment:basic:read`
- - `member:email:read`
- - `member:basic:read`
- - `member:phone:read`
-
- Parameters
- ----------
- id : str
- The unique identifier of the dispute to update.
-
- access_activity_log : typing.Optional[str]
- An IP access activity log showing the customer used the service.
-
- billing_address : typing.Optional[str]
- The billing address associated with the customer's payment method.
-
- cancellation_policy_attachment : typing.Optional[UpdateEvidenceDisputeRequestCancellationPolicyAttachment]
- A file upload containing the company's cancellation policy document.
-
- cancellation_policy_disclosure : typing.Optional[str]
- The company's cancellation policy text to submit as evidence.
-
- customer_communication_attachment : typing.Optional[UpdateEvidenceDisputeRequestCustomerCommunicationAttachment]
- A file upload containing evidence of customer communication. Must be a JPEG, PNG, GIF, or PDF.
-
- customer_email_address : typing.Optional[str]
- The email address of the customer associated with the disputed payment.
-
- customer_name : typing.Optional[str]
- The full name of the customer associated with the disputed payment.
-
- notes : typing.Optional[str]
- Additional notes or context to submit as part of the dispute evidence.
-
- product_description : typing.Optional[str]
- A description of the product or service that was provided to the customer.
-
- refund_policy_attachment : typing.Optional[UpdateEvidenceDisputeRequestRefundPolicyAttachment]
- A file upload containing the company's refund policy document.
-
- refund_policy_disclosure : typing.Optional[str]
- The company's refund policy text to submit as evidence.
-
- refund_refusal_explanation : typing.Optional[str]
- An explanation of why the refund request was refused.
-
- service_date : typing.Optional[str]
- The date when the product or service was delivered to the customer.
-
- uncategorized_attachment : typing.Optional[UpdateEvidenceDisputeRequestUncategorizedAttachment]
- A file upload for evidence that does not fit into the other categories.
-
- request_options : typing.Optional[RequestOptions]
- Request-specific configuration.
-
- Returns
- -------
- DisputeLegacy
- A successful response
-
- Examples
- --------
- from whop_sdk import Whop
-
- client = Whop(
- "2026-09-02-2",
- idempotency_key="YOUR_IDEMPOTENCY_KEY",
- token="YOUR_TOKEN",
- )
- client.disputes.update_evidence_dispute(
- id="dspt_xxxxxxxxxxxxx",
- )
- """
- _response = self._raw_client.update_evidence_dispute(
- id,
- access_activity_log=access_activity_log,
- billing_address=billing_address,
- cancellation_policy_attachment=cancellation_policy_attachment,
- cancellation_policy_disclosure=cancellation_policy_disclosure,
- customer_communication_attachment=customer_communication_attachment,
- customer_email_address=customer_email_address,
- customer_name=customer_name,
- notes=notes,
- product_description=product_description,
- refund_policy_attachment=refund_policy_attachment,
- refund_policy_disclosure=refund_policy_disclosure,
- refund_refusal_explanation=refund_refusal_explanation,
- service_date=service_date,
- uncategorized_attachment=uncategorized_attachment,
- request_options=request_options,
- )
- return _response.data
-
def upload_evidence(
self,
id: str,
@@ -522,7 +339,7 @@ def upload_evidence(
from whop_sdk.disputes import UploadEvidenceDisputesRequestDocumentsItem
client = Whop(
- "2026-09-02-2",
+ "2026-09-06",
idempotency_key="YOUR_IDEMPOTENCY_KEY",
token="YOUR_TOKEN",
)
@@ -625,7 +442,7 @@ async def list(
from whop_sdk import AsyncWhop
client = AsyncWhop(
- "2026-09-02-2",
+ "2026-09-06",
idempotency_key="YOUR_IDEMPOTENCY_KEY",
token="YOUR_TOKEN",
)
@@ -711,7 +528,7 @@ async def summary(
from whop_sdk import AsyncWhop
client = AsyncWhop(
- "2026-09-02-2",
+ "2026-09-06",
idempotency_key="YOUR_IDEMPOTENCY_KEY",
token="YOUR_TOKEN",
)
@@ -758,7 +575,7 @@ async def retrieve(self, id: str, *, request_options: typing.Optional[RequestOpt
from whop_sdk import AsyncWhop
client = AsyncWhop(
- "2026-09-02-2",
+ "2026-09-06",
idempotency_key="YOUR_IDEMPOTENCY_KEY",
token="YOUR_TOKEN",
)
@@ -808,7 +625,7 @@ async def update(
from whop_sdk import AsyncWhop
client = AsyncWhop(
- "2026-09-02-2",
+ "2026-09-06",
idempotency_key="YOUR_IDEMPOTENCY_KEY",
token="YOUR_TOKEN",
)
@@ -849,7 +666,7 @@ async def submit(self, id: str, *, request_options: typing.Optional[RequestOptio
from whop_sdk import AsyncWhop
client = AsyncWhop(
- "2026-09-02-2",
+ "2026-09-06",
idempotency_key="YOUR_IDEMPOTENCY_KEY",
token="YOUR_TOKEN",
)
@@ -866,192 +683,6 @@ async def main() -> None:
_response = await self._raw_client.submit(id, request_options=request_options)
return _response.data
- async def submit_evidence_dispute(
- self, id: str, *, request_options: typing.Optional[RequestOptions] = None
- ) -> DisputeLegacy:
- """
- Submit a payment dispute to the payment processor for review. Once submitted, no further edits can be made.
-
- Required permissions:
- - `payment:dispute`
- - `plan:basic:read`
- - `access_pass:basic:read`
- - `company:basic:read`
- - `payment:basic:read`
- - `member:email:read`
- - `member:basic:read`
- - `member:phone:read`
-
- Parameters
- ----------
- id : str
- The unique identifier of the dispute to submit to the payment processor for review.
-
- request_options : typing.Optional[RequestOptions]
- Request-specific configuration.
-
- Returns
- -------
- DisputeLegacy
- A successful response
-
- Examples
- --------
- import asyncio
-
- from whop_sdk import AsyncWhop
-
- client = AsyncWhop(
- "2026-09-02-2",
- idempotency_key="YOUR_IDEMPOTENCY_KEY",
- token="YOUR_TOKEN",
- )
-
-
- async def main() -> None:
- await client.disputes.submit_evidence_dispute(
- id="dspt_xxxxxxxxxxxxx",
- )
-
-
- asyncio.run(main())
- """
- _response = await self._raw_client.submit_evidence_dispute(id, request_options=request_options)
- return _response.data
-
- async def update_evidence_dispute(
- self,
- id: str,
- *,
- access_activity_log: typing.Optional[str] = OMIT,
- billing_address: typing.Optional[str] = OMIT,
- cancellation_policy_attachment: typing.Optional[
- UpdateEvidenceDisputeRequestCancellationPolicyAttachment
- ] = OMIT,
- cancellation_policy_disclosure: typing.Optional[str] = OMIT,
- customer_communication_attachment: typing.Optional[
- UpdateEvidenceDisputeRequestCustomerCommunicationAttachment
- ] = OMIT,
- customer_email_address: typing.Optional[str] = OMIT,
- customer_name: typing.Optional[str] = OMIT,
- notes: typing.Optional[str] = OMIT,
- product_description: typing.Optional[str] = OMIT,
- refund_policy_attachment: typing.Optional[UpdateEvidenceDisputeRequestRefundPolicyAttachment] = OMIT,
- refund_policy_disclosure: typing.Optional[str] = OMIT,
- refund_refusal_explanation: typing.Optional[str] = OMIT,
- service_date: typing.Optional[str] = OMIT,
- uncategorized_attachment: typing.Optional[UpdateEvidenceDisputeRequestUncategorizedAttachment] = OMIT,
- request_options: typing.Optional[RequestOptions] = None,
- ) -> DisputeLegacy:
- """
- Update a dispute with evidence data to attempt to win the dispute.
-
- Required permissions:
- - `payment:dispute`
- - `plan:basic:read`
- - `access_pass:basic:read`
- - `company:basic:read`
- - `payment:basic:read`
- - `member:email:read`
- - `member:basic:read`
- - `member:phone:read`
-
- Parameters
- ----------
- id : str
- The unique identifier of the dispute to update.
-
- access_activity_log : typing.Optional[str]
- An IP access activity log showing the customer used the service.
-
- billing_address : typing.Optional[str]
- The billing address associated with the customer's payment method.
-
- cancellation_policy_attachment : typing.Optional[UpdateEvidenceDisputeRequestCancellationPolicyAttachment]
- A file upload containing the company's cancellation policy document.
-
- cancellation_policy_disclosure : typing.Optional[str]
- The company's cancellation policy text to submit as evidence.
-
- customer_communication_attachment : typing.Optional[UpdateEvidenceDisputeRequestCustomerCommunicationAttachment]
- A file upload containing evidence of customer communication. Must be a JPEG, PNG, GIF, or PDF.
-
- customer_email_address : typing.Optional[str]
- The email address of the customer associated with the disputed payment.
-
- customer_name : typing.Optional[str]
- The full name of the customer associated with the disputed payment.
-
- notes : typing.Optional[str]
- Additional notes or context to submit as part of the dispute evidence.
-
- product_description : typing.Optional[str]
- A description of the product or service that was provided to the customer.
-
- refund_policy_attachment : typing.Optional[UpdateEvidenceDisputeRequestRefundPolicyAttachment]
- A file upload containing the company's refund policy document.
-
- refund_policy_disclosure : typing.Optional[str]
- The company's refund policy text to submit as evidence.
-
- refund_refusal_explanation : typing.Optional[str]
- An explanation of why the refund request was refused.
-
- service_date : typing.Optional[str]
- The date when the product or service was delivered to the customer.
-
- uncategorized_attachment : typing.Optional[UpdateEvidenceDisputeRequestUncategorizedAttachment]
- A file upload for evidence that does not fit into the other categories.
-
- request_options : typing.Optional[RequestOptions]
- Request-specific configuration.
-
- Returns
- -------
- DisputeLegacy
- A successful response
-
- Examples
- --------
- import asyncio
-
- from whop_sdk import AsyncWhop
-
- client = AsyncWhop(
- "2026-09-02-2",
- idempotency_key="YOUR_IDEMPOTENCY_KEY",
- token="YOUR_TOKEN",
- )
-
-
- async def main() -> None:
- await client.disputes.update_evidence_dispute(
- id="dspt_xxxxxxxxxxxxx",
- )
-
-
- asyncio.run(main())
- """
- _response = await self._raw_client.update_evidence_dispute(
- id,
- access_activity_log=access_activity_log,
- billing_address=billing_address,
- cancellation_policy_attachment=cancellation_policy_attachment,
- cancellation_policy_disclosure=cancellation_policy_disclosure,
- customer_communication_attachment=customer_communication_attachment,
- customer_email_address=customer_email_address,
- customer_name=customer_name,
- notes=notes,
- product_description=product_description,
- refund_policy_attachment=refund_policy_attachment,
- refund_policy_disclosure=refund_policy_disclosure,
- refund_refusal_explanation=refund_refusal_explanation,
- service_date=service_date,
- uncategorized_attachment=uncategorized_attachment,
- request_options=request_options,
- )
- return _response.data
-
async def upload_evidence(
self,
id: str,
@@ -1086,7 +717,7 @@ async def upload_evidence(
from whop_sdk.disputes import UploadEvidenceDisputesRequestDocumentsItem
client = AsyncWhop(
- "2026-09-02-2",
+ "2026-09-06",
idempotency_key="YOUR_IDEMPOTENCY_KEY",
token="YOUR_TOKEN",
)
diff --git a/src/whop_sdk/disputes/raw_client.py b/src/whop_sdk/disputes/raw_client.py
index ddc8fb2d..077aaec3 100644
--- a/src/whop_sdk/disputes/raw_client.py
+++ b/src/whop_sdk/disputes/raw_client.py
@@ -15,13 +15,9 @@
from ..errors.bad_request_error import BadRequestError
from ..errors.conflict_error import ConflictError
from ..errors.forbidden_error import ForbiddenError
-from ..errors.internal_server_error import InternalServerError
from ..errors.not_found_error import NotFoundError
-from ..errors.too_many_requests_error import TooManyRequestsError
from ..errors.unauthorized_error import UnauthorizedError
-from ..errors.unprocessable_entity_error import UnprocessableEntityError
from ..types.dispute import Dispute
-from ..types.dispute_legacy import DisputeLegacy
from ..types.v1error_response import V1ErrorResponse
from .types.list_disputes_request_direction import ListDisputesRequestDirection
from .types.list_disputes_request_order import ListDisputesRequestOrder
@@ -31,18 +27,6 @@
from .types.summary_disputes_request_status_item import SummaryDisputesRequestStatusItem
from .types.summary_disputes_response import SummaryDisputesResponse
from .types.update_disputes_request_evidence import UpdateDisputesRequestEvidence
-from .types.update_evidence_dispute_request_cancellation_policy_attachment import (
- UpdateEvidenceDisputeRequestCancellationPolicyAttachment,
-)
-from .types.update_evidence_dispute_request_customer_communication_attachment import (
- UpdateEvidenceDisputeRequestCustomerCommunicationAttachment,
-)
-from .types.update_evidence_dispute_request_refund_policy_attachment import (
- UpdateEvidenceDisputeRequestRefundPolicyAttachment,
-)
-from .types.update_evidence_dispute_request_uncategorized_attachment import (
- UpdateEvidenceDisputeRequestUncategorizedAttachment,
-)
from .types.upload_evidence_disputes_request_documents_item import UploadEvidenceDisputesRequestDocumentsItem
from pydantic import ValidationError
@@ -548,365 +532,6 @@ def submit(self, id: str, *, request_options: typing.Optional[RequestOptions] =
)
raise ApiError(status_code=_response.status_code, headers=dict(_response.headers), body=_response_json)
- def submit_evidence_dispute(
- self, id: str, *, request_options: typing.Optional[RequestOptions] = None
- ) -> HttpResponse[DisputeLegacy]:
- """
- Submit a payment dispute to the payment processor for review. Once submitted, no further edits can be made.
-
- Required permissions:
- - `payment:dispute`
- - `plan:basic:read`
- - `access_pass:basic:read`
- - `company:basic:read`
- - `payment:basic:read`
- - `member:email:read`
- - `member:basic:read`
- - `member:phone:read`
-
- Parameters
- ----------
- id : str
- The unique identifier of the dispute to submit to the payment processor for review.
-
- request_options : typing.Optional[RequestOptions]
- Request-specific configuration.
-
- Returns
- -------
- HttpResponse[DisputeLegacy]
- A successful response
- """
- _response = self._client_wrapper.httpx_client.request(
- f"disputes/{encode_path_param(id)}/submit_evidence",
- method="POST",
- request_options=request_options,
- )
- try:
- if 200 <= _response.status_code < 300:
- _data = typing.cast(
- DisputeLegacy,
- parse_obj_as(
- type_=DisputeLegacy, # type: ignore
- object_=_response.json(),
- ),
- )
- return HttpResponse(response=_response, data=_data)
- if _response.status_code == 400:
- raise BadRequestError(
- headers=dict(_response.headers),
- body=typing.cast(
- typing.Any,
- parse_obj_as(
- type_=typing.Any, # type: ignore
- object_=_response.json(),
- ),
- ),
- )
- if _response.status_code == 401:
- raise UnauthorizedError(
- headers=dict(_response.headers),
- body=typing.cast(
- typing.Any,
- parse_obj_as(
- type_=typing.Any, # type: ignore
- object_=_response.json(),
- ),
- ),
- )
- if _response.status_code == 403:
- raise ForbiddenError(
- headers=dict(_response.headers),
- body=typing.cast(
- typing.Any,
- parse_obj_as(
- type_=typing.Any, # type: ignore
- object_=_response.json(),
- ),
- ),
- )
- if _response.status_code == 404:
- raise NotFoundError(
- headers=dict(_response.headers),
- body=typing.cast(
- typing.Any,
- parse_obj_as(
- type_=typing.Any, # type: ignore
- object_=_response.json(),
- ),
- ),
- )
- if _response.status_code == 422:
- raise UnprocessableEntityError(
- headers=dict(_response.headers),
- body=typing.cast(
- typing.Any,
- parse_obj_as(
- type_=typing.Any, # type: ignore
- object_=_response.json(),
- ),
- ),
- )
- if _response.status_code == 429:
- raise TooManyRequestsError(
- headers=dict(_response.headers),
- body=typing.cast(
- typing.Any,
- parse_obj_as(
- type_=typing.Any, # type: ignore
- object_=_response.json(),
- ),
- ),
- )
- if _response.status_code == 500:
- raise InternalServerError(
- headers=dict(_response.headers),
- body=typing.cast(
- typing.Any,
- parse_obj_as(
- type_=typing.Any, # type: ignore
- object_=_response.json(),
- ),
- ),
- )
- _response_json = _response.json()
- except JSONDecodeError:
- raise ApiError(status_code=_response.status_code, headers=dict(_response.headers), body=_response.text)
- except ValidationError as e:
- raise ParsingError(
- status_code=_response.status_code, headers=dict(_response.headers), body=_response.json(), cause=e
- )
- raise ApiError(status_code=_response.status_code, headers=dict(_response.headers), body=_response_json)
-
- def update_evidence_dispute(
- self,
- id: str,
- *,
- access_activity_log: typing.Optional[str] = OMIT,
- billing_address: typing.Optional[str] = OMIT,
- cancellation_policy_attachment: typing.Optional[
- UpdateEvidenceDisputeRequestCancellationPolicyAttachment
- ] = OMIT,
- cancellation_policy_disclosure: typing.Optional[str] = OMIT,
- customer_communication_attachment: typing.Optional[
- UpdateEvidenceDisputeRequestCustomerCommunicationAttachment
- ] = OMIT,
- customer_email_address: typing.Optional[str] = OMIT,
- customer_name: typing.Optional[str] = OMIT,
- notes: typing.Optional[str] = OMIT,
- product_description: typing.Optional[str] = OMIT,
- refund_policy_attachment: typing.Optional[UpdateEvidenceDisputeRequestRefundPolicyAttachment] = OMIT,
- refund_policy_disclosure: typing.Optional[str] = OMIT,
- refund_refusal_explanation: typing.Optional[str] = OMIT,
- service_date: typing.Optional[str] = OMIT,
- uncategorized_attachment: typing.Optional[UpdateEvidenceDisputeRequestUncategorizedAttachment] = OMIT,
- request_options: typing.Optional[RequestOptions] = None,
- ) -> HttpResponse[DisputeLegacy]:
- """
- Update a dispute with evidence data to attempt to win the dispute.
-
- Required permissions:
- - `payment:dispute`
- - `plan:basic:read`
- - `access_pass:basic:read`
- - `company:basic:read`
- - `payment:basic:read`
- - `member:email:read`
- - `member:basic:read`
- - `member:phone:read`
-
- Parameters
- ----------
- id : str
- The unique identifier of the dispute to update.
-
- access_activity_log : typing.Optional[str]
- An IP access activity log showing the customer used the service.
-
- billing_address : typing.Optional[str]
- The billing address associated with the customer's payment method.
-
- cancellation_policy_attachment : typing.Optional[UpdateEvidenceDisputeRequestCancellationPolicyAttachment]
- A file upload containing the company's cancellation policy document.
-
- cancellation_policy_disclosure : typing.Optional[str]
- The company's cancellation policy text to submit as evidence.
-
- customer_communication_attachment : typing.Optional[UpdateEvidenceDisputeRequestCustomerCommunicationAttachment]
- A file upload containing evidence of customer communication. Must be a JPEG, PNG, GIF, or PDF.
-
- customer_email_address : typing.Optional[str]
- The email address of the customer associated with the disputed payment.
-
- customer_name : typing.Optional[str]
- The full name of the customer associated with the disputed payment.
-
- notes : typing.Optional[str]
- Additional notes or context to submit as part of the dispute evidence.
-
- product_description : typing.Optional[str]
- A description of the product or service that was provided to the customer.
-
- refund_policy_attachment : typing.Optional[UpdateEvidenceDisputeRequestRefundPolicyAttachment]
- A file upload containing the company's refund policy document.
-
- refund_policy_disclosure : typing.Optional[str]
- The company's refund policy text to submit as evidence.
-
- refund_refusal_explanation : typing.Optional[str]
- An explanation of why the refund request was refused.
-
- service_date : typing.Optional[str]
- The date when the product or service was delivered to the customer.
-
- uncategorized_attachment : typing.Optional[UpdateEvidenceDisputeRequestUncategorizedAttachment]
- A file upload for evidence that does not fit into the other categories.
-
- request_options : typing.Optional[RequestOptions]
- Request-specific configuration.
-
- Returns
- -------
- HttpResponse[DisputeLegacy]
- A successful response
- """
- _response = self._client_wrapper.httpx_client.request(
- f"disputes/{encode_path_param(id)}/update_evidence",
- method="POST",
- json={
- "access_activity_log": access_activity_log,
- "billing_address": billing_address,
- "cancellation_policy_attachment": convert_and_respect_annotation_metadata(
- object_=cancellation_policy_attachment,
- annotation=typing.Optional[UpdateEvidenceDisputeRequestCancellationPolicyAttachment],
- direction="write",
- ),
- "cancellation_policy_disclosure": cancellation_policy_disclosure,
- "customer_communication_attachment": convert_and_respect_annotation_metadata(
- object_=customer_communication_attachment,
- annotation=typing.Optional[UpdateEvidenceDisputeRequestCustomerCommunicationAttachment],
- direction="write",
- ),
- "customer_email_address": customer_email_address,
- "customer_name": customer_name,
- "notes": notes,
- "product_description": product_description,
- "refund_policy_attachment": convert_and_respect_annotation_metadata(
- object_=refund_policy_attachment,
- annotation=typing.Optional[UpdateEvidenceDisputeRequestRefundPolicyAttachment],
- direction="write",
- ),
- "refund_policy_disclosure": refund_policy_disclosure,
- "refund_refusal_explanation": refund_refusal_explanation,
- "service_date": service_date,
- "uncategorized_attachment": convert_and_respect_annotation_metadata(
- object_=uncategorized_attachment,
- annotation=typing.Optional[UpdateEvidenceDisputeRequestUncategorizedAttachment],
- direction="write",
- ),
- },
- headers={
- "content-type": "application/json",
- },
- request_options=request_options,
- omit=OMIT,
- )
- try:
- if 200 <= _response.status_code < 300:
- _data = typing.cast(
- DisputeLegacy,
- parse_obj_as(
- type_=DisputeLegacy, # type: ignore
- object_=_response.json(),
- ),
- )
- return HttpResponse(response=_response, data=_data)
- if _response.status_code == 400:
- raise BadRequestError(
- headers=dict(_response.headers),
- body=typing.cast(
- typing.Any,
- parse_obj_as(
- type_=typing.Any, # type: ignore
- object_=_response.json(),
- ),
- ),
- )
- if _response.status_code == 401:
- raise UnauthorizedError(
- headers=dict(_response.headers),
- body=typing.cast(
- typing.Any,
- parse_obj_as(
- type_=typing.Any, # type: ignore
- object_=_response.json(),
- ),
- ),
- )
- if _response.status_code == 403:
- raise ForbiddenError(
- headers=dict(_response.headers),
- body=typing.cast(
- typing.Any,
- parse_obj_as(
- type_=typing.Any, # type: ignore
- object_=_response.json(),
- ),
- ),
- )
- if _response.status_code == 404:
- raise NotFoundError(
- headers=dict(_response.headers),
- body=typing.cast(
- typing.Any,
- parse_obj_as(
- type_=typing.Any, # type: ignore
- object_=_response.json(),
- ),
- ),
- )
- if _response.status_code == 422:
- raise UnprocessableEntityError(
- headers=dict(_response.headers),
- body=typing.cast(
- typing.Any,
- parse_obj_as(
- type_=typing.Any, # type: ignore
- object_=_response.json(),
- ),
- ),
- )
- if _response.status_code == 429:
- raise TooManyRequestsError(
- headers=dict(_response.headers),
- body=typing.cast(
- typing.Any,
- parse_obj_as(
- type_=typing.Any, # type: ignore
- object_=_response.json(),
- ),
- ),
- )
- if _response.status_code == 500:
- raise InternalServerError(
- headers=dict(_response.headers),
- body=typing.cast(
- typing.Any,
- parse_obj_as(
- type_=typing.Any, # type: ignore
- object_=_response.json(),
- ),
- ),
- )
- _response_json = _response.json()
- except JSONDecodeError:
- raise ApiError(status_code=_response.status_code, headers=dict(_response.headers), body=_response.text)
- except ValidationError as e:
- raise ParsingError(
- status_code=_response.status_code, headers=dict(_response.headers), body=_response.json(), cause=e
- )
- raise ApiError(status_code=_response.status_code, headers=dict(_response.headers), body=_response_json)
-
def upload_evidence(
self,
id: str,
@@ -1518,365 +1143,6 @@ async def submit(
)
raise ApiError(status_code=_response.status_code, headers=dict(_response.headers), body=_response_json)
- async def submit_evidence_dispute(
- self, id: str, *, request_options: typing.Optional[RequestOptions] = None
- ) -> AsyncHttpResponse[DisputeLegacy]:
- """
- Submit a payment dispute to the payment processor for review. Once submitted, no further edits can be made.
-
- Required permissions:
- - `payment:dispute`
- - `plan:basic:read`
- - `access_pass:basic:read`
- - `company:basic:read`
- - `payment:basic:read`
- - `member:email:read`
- - `member:basic:read`
- - `member:phone:read`
-
- Parameters
- ----------
- id : str
- The unique identifier of the dispute to submit to the payment processor for review.
-
- request_options : typing.Optional[RequestOptions]
- Request-specific configuration.
-
- Returns
- -------
- AsyncHttpResponse[DisputeLegacy]
- A successful response
- """
- _response = await self._client_wrapper.httpx_client.request(
- f"disputes/{encode_path_param(id)}/submit_evidence",
- method="POST",
- request_options=request_options,
- )
- try:
- if 200 <= _response.status_code < 300:
- _data = typing.cast(
- DisputeLegacy,
- parse_obj_as(
- type_=DisputeLegacy, # type: ignore
- object_=_response.json(),
- ),
- )
- return AsyncHttpResponse(response=_response, data=_data)
- if _response.status_code == 400:
- raise BadRequestError(
- headers=dict(_response.headers),
- body=typing.cast(
- typing.Any,
- parse_obj_as(
- type_=typing.Any, # type: ignore
- object_=_response.json(),
- ),
- ),
- )
- if _response.status_code == 401:
- raise UnauthorizedError(
- headers=dict(_response.headers),
- body=typing.cast(
- typing.Any,
- parse_obj_as(
- type_=typing.Any, # type: ignore
- object_=_response.json(),
- ),
- ),
- )
- if _response.status_code == 403:
- raise ForbiddenError(
- headers=dict(_response.headers),
- body=typing.cast(
- typing.Any,
- parse_obj_as(
- type_=typing.Any, # type: ignore
- object_=_response.json(),
- ),
- ),
- )
- if _response.status_code == 404:
- raise NotFoundError(
- headers=dict(_response.headers),
- body=typing.cast(
- typing.Any,
- parse_obj_as(
- type_=typing.Any, # type: ignore
- object_=_response.json(),
- ),
- ),
- )
- if _response.status_code == 422:
- raise UnprocessableEntityError(
- headers=dict(_response.headers),
- body=typing.cast(
- typing.Any,
- parse_obj_as(
- type_=typing.Any, # type: ignore
- object_=_response.json(),
- ),
- ),
- )
- if _response.status_code == 429:
- raise TooManyRequestsError(
- headers=dict(_response.headers),
- body=typing.cast(
- typing.Any,
- parse_obj_as(
- type_=typing.Any, # type: ignore
- object_=_response.json(),
- ),
- ),
- )
- if _response.status_code == 500:
- raise InternalServerError(
- headers=dict(_response.headers),
- body=typing.cast(
- typing.Any,
- parse_obj_as(
- type_=typing.Any, # type: ignore
- object_=_response.json(),
- ),
- ),
- )
- _response_json = _response.json()
- except JSONDecodeError:
- raise ApiError(status_code=_response.status_code, headers=dict(_response.headers), body=_response.text)
- except ValidationError as e:
- raise ParsingError(
- status_code=_response.status_code, headers=dict(_response.headers), body=_response.json(), cause=e
- )
- raise ApiError(status_code=_response.status_code, headers=dict(_response.headers), body=_response_json)
-
- async def update_evidence_dispute(
- self,
- id: str,
- *,
- access_activity_log: typing.Optional[str] = OMIT,
- billing_address: typing.Optional[str] = OMIT,
- cancellation_policy_attachment: typing.Optional[
- UpdateEvidenceDisputeRequestCancellationPolicyAttachment
- ] = OMIT,
- cancellation_policy_disclosure: typing.Optional[str] = OMIT,
- customer_communication_attachment: typing.Optional[
- UpdateEvidenceDisputeRequestCustomerCommunicationAttachment
- ] = OMIT,
- customer_email_address: typing.Optional[str] = OMIT,
- customer_name: typing.Optional[str] = OMIT,
- notes: typing.Optional[str] = OMIT,
- product_description: typing.Optional[str] = OMIT,
- refund_policy_attachment: typing.Optional[UpdateEvidenceDisputeRequestRefundPolicyAttachment] = OMIT,
- refund_policy_disclosure: typing.Optional[str] = OMIT,
- refund_refusal_explanation: typing.Optional[str] = OMIT,
- service_date: typing.Optional[str] = OMIT,
- uncategorized_attachment: typing.Optional[UpdateEvidenceDisputeRequestUncategorizedAttachment] = OMIT,
- request_options: typing.Optional[RequestOptions] = None,
- ) -> AsyncHttpResponse[DisputeLegacy]:
- """
- Update a dispute with evidence data to attempt to win the dispute.
-
- Required permissions:
- - `payment:dispute`
- - `plan:basic:read`
- - `access_pass:basic:read`
- - `company:basic:read`
- - `payment:basic:read`
- - `member:email:read`
- - `member:basic:read`
- - `member:phone:read`
-
- Parameters
- ----------
- id : str
- The unique identifier of the dispute to update.
-
- access_activity_log : typing.Optional[str]
- An IP access activity log showing the customer used the service.
-
- billing_address : typing.Optional[str]
- The billing address associated with the customer's payment method.
-
- cancellation_policy_attachment : typing.Optional[UpdateEvidenceDisputeRequestCancellationPolicyAttachment]
- A file upload containing the company's cancellation policy document.
-
- cancellation_policy_disclosure : typing.Optional[str]
- The company's cancellation policy text to submit as evidence.
-
- customer_communication_attachment : typing.Optional[UpdateEvidenceDisputeRequestCustomerCommunicationAttachment]
- A file upload containing evidence of customer communication. Must be a JPEG, PNG, GIF, or PDF.
-
- customer_email_address : typing.Optional[str]
- The email address of the customer associated with the disputed payment.
-
- customer_name : typing.Optional[str]
- The full name of the customer associated with the disputed payment.
-
- notes : typing.Optional[str]
- Additional notes or context to submit as part of the dispute evidence.
-
- product_description : typing.Optional[str]
- A description of the product or service that was provided to the customer.
-
- refund_policy_attachment : typing.Optional[UpdateEvidenceDisputeRequestRefundPolicyAttachment]
- A file upload containing the company's refund policy document.
-
- refund_policy_disclosure : typing.Optional[str]
- The company's refund policy text to submit as evidence.
-
- refund_refusal_explanation : typing.Optional[str]
- An explanation of why the refund request was refused.
-
- service_date : typing.Optional[str]
- The date when the product or service was delivered to the customer.
-
- uncategorized_attachment : typing.Optional[UpdateEvidenceDisputeRequestUncategorizedAttachment]
- A file upload for evidence that does not fit into the other categories.
-
- request_options : typing.Optional[RequestOptions]
- Request-specific configuration.
-
- Returns
- -------
- AsyncHttpResponse[DisputeLegacy]
- A successful response
- """
- _response = await self._client_wrapper.httpx_client.request(
- f"disputes/{encode_path_param(id)}/update_evidence",
- method="POST",
- json={
- "access_activity_log": access_activity_log,
- "billing_address": billing_address,
- "cancellation_policy_attachment": convert_and_respect_annotation_metadata(
- object_=cancellation_policy_attachment,
- annotation=typing.Optional[UpdateEvidenceDisputeRequestCancellationPolicyAttachment],
- direction="write",
- ),
- "cancellation_policy_disclosure": cancellation_policy_disclosure,
- "customer_communication_attachment": convert_and_respect_annotation_metadata(
- object_=customer_communication_attachment,
- annotation=typing.Optional[UpdateEvidenceDisputeRequestCustomerCommunicationAttachment],
- direction="write",
- ),
- "customer_email_address": customer_email_address,
- "customer_name": customer_name,
- "notes": notes,
- "product_description": product_description,
- "refund_policy_attachment": convert_and_respect_annotation_metadata(
- object_=refund_policy_attachment,
- annotation=typing.Optional[UpdateEvidenceDisputeRequestRefundPolicyAttachment],
- direction="write",
- ),
- "refund_policy_disclosure": refund_policy_disclosure,
- "refund_refusal_explanation": refund_refusal_explanation,
- "service_date": service_date,
- "uncategorized_attachment": convert_and_respect_annotation_metadata(
- object_=uncategorized_attachment,
- annotation=typing.Optional[UpdateEvidenceDisputeRequestUncategorizedAttachment],
- direction="write",
- ),
- },
- headers={
- "content-type": "application/json",
- },
- request_options=request_options,
- omit=OMIT,
- )
- try:
- if 200 <= _response.status_code < 300:
- _data = typing.cast(
- DisputeLegacy,
- parse_obj_as(
- type_=DisputeLegacy, # type: ignore
- object_=_response.json(),
- ),
- )
- return AsyncHttpResponse(response=_response, data=_data)
- if _response.status_code == 400:
- raise BadRequestError(
- headers=dict(_response.headers),
- body=typing.cast(
- typing.Any,
- parse_obj_as(
- type_=typing.Any, # type: ignore
- object_=_response.json(),
- ),
- ),
- )
- if _response.status_code == 401:
- raise UnauthorizedError(
- headers=dict(_response.headers),
- body=typing.cast(
- typing.Any,
- parse_obj_as(
- type_=typing.Any, # type: ignore
- object_=_response.json(),
- ),
- ),
- )
- if _response.status_code == 403:
- raise ForbiddenError(
- headers=dict(_response.headers),
- body=typing.cast(
- typing.Any,
- parse_obj_as(
- type_=typing.Any, # type: ignore
- object_=_response.json(),
- ),
- ),
- )
- if _response.status_code == 404:
- raise NotFoundError(
- headers=dict(_response.headers),
- body=typing.cast(
- typing.Any,
- parse_obj_as(
- type_=typing.Any, # type: ignore
- object_=_response.json(),
- ),
- ),
- )
- if _response.status_code == 422:
- raise UnprocessableEntityError(
- headers=dict(_response.headers),
- body=typing.cast(
- typing.Any,
- parse_obj_as(
- type_=typing.Any, # type: ignore
- object_=_response.json(),
- ),
- ),
- )
- if _response.status_code == 429:
- raise TooManyRequestsError(
- headers=dict(_response.headers),
- body=typing.cast(
- typing.Any,
- parse_obj_as(
- type_=typing.Any, # type: ignore
- object_=_response.json(),
- ),
- ),
- )
- if _response.status_code == 500:
- raise InternalServerError(
- headers=dict(_response.headers),
- body=typing.cast(
- typing.Any,
- parse_obj_as(
- type_=typing.Any, # type: ignore
- object_=_response.json(),
- ),
- ),
- )
- _response_json = _response.json()
- except JSONDecodeError:
- raise ApiError(status_code=_response.status_code, headers=dict(_response.headers), body=_response.text)
- except ValidationError as e:
- raise ParsingError(
- status_code=_response.status_code, headers=dict(_response.headers), body=_response.json(), cause=e
- )
- raise ApiError(status_code=_response.status_code, headers=dict(_response.headers), body=_response_json)
-
async def upload_evidence(
self,
id: str,
diff --git a/src/whop_sdk/disputes/types/__init__.py b/src/whop_sdk/disputes/types/__init__.py
index d2e67030..8b03a3c3 100644
--- a/src/whop_sdk/disputes/types/__init__.py
+++ b/src/whop_sdk/disputes/types/__init__.py
@@ -35,18 +35,6 @@
from .update_disputes_request_evidence_uncategorized_attachment import (
UpdateDisputesRequestEvidenceUncategorizedAttachment,
)
- from .update_evidence_dispute_request_cancellation_policy_attachment import (
- UpdateEvidenceDisputeRequestCancellationPolicyAttachment,
- )
- from .update_evidence_dispute_request_customer_communication_attachment import (
- UpdateEvidenceDisputeRequestCustomerCommunicationAttachment,
- )
- from .update_evidence_dispute_request_refund_policy_attachment import (
- UpdateEvidenceDisputeRequestRefundPolicyAttachment,
- )
- from .update_evidence_dispute_request_uncategorized_attachment import (
- UpdateEvidenceDisputeRequestUncategorizedAttachment,
- )
from .upload_evidence_disputes_request_documents_item import UploadEvidenceDisputesRequestDocumentsItem
from .upload_evidence_disputes_request_documents_item_document_type import (
UploadEvidenceDisputesRequestDocumentsItemDocumentType,
@@ -73,10 +61,6 @@
"UpdateDisputesRequestEvidenceCustomerCommunicationAttachment": ".update_disputes_request_evidence_customer_communication_attachment",
"UpdateDisputesRequestEvidenceRefundPolicyAttachment": ".update_disputes_request_evidence_refund_policy_attachment",
"UpdateDisputesRequestEvidenceUncategorizedAttachment": ".update_disputes_request_evidence_uncategorized_attachment",
- "UpdateEvidenceDisputeRequestCancellationPolicyAttachment": ".update_evidence_dispute_request_cancellation_policy_attachment",
- "UpdateEvidenceDisputeRequestCustomerCommunicationAttachment": ".update_evidence_dispute_request_customer_communication_attachment",
- "UpdateEvidenceDisputeRequestRefundPolicyAttachment": ".update_evidence_dispute_request_refund_policy_attachment",
- "UpdateEvidenceDisputeRequestUncategorizedAttachment": ".update_evidence_dispute_request_uncategorized_attachment",
"UploadEvidenceDisputesRequestDocumentsItem": ".upload_evidence_disputes_request_documents_item",
"UploadEvidenceDisputesRequestDocumentsItemDocumentType": ".upload_evidence_disputes_request_documents_item_document_type",
}
@@ -125,10 +109,6 @@ def __dir__():
"UpdateDisputesRequestEvidenceCustomerCommunicationAttachment",
"UpdateDisputesRequestEvidenceRefundPolicyAttachment",
"UpdateDisputesRequestEvidenceUncategorizedAttachment",
- "UpdateEvidenceDisputeRequestCancellationPolicyAttachment",
- "UpdateEvidenceDisputeRequestCustomerCommunicationAttachment",
- "UpdateEvidenceDisputeRequestRefundPolicyAttachment",
- "UpdateEvidenceDisputeRequestUncategorizedAttachment",
"UploadEvidenceDisputesRequestDocumentsItem",
"UploadEvidenceDisputesRequestDocumentsItemDocumentType",
]
diff --git a/src/whop_sdk/disputes/types/update_evidence_dispute_request_cancellation_policy_attachment.py b/src/whop_sdk/disputes/types/update_evidence_dispute_request_cancellation_policy_attachment.py
deleted file mode 100644
index 430c5953..00000000
--- a/src/whop_sdk/disputes/types/update_evidence_dispute_request_cancellation_policy_attachment.py
+++ /dev/null
@@ -1,26 +0,0 @@
-# This file was auto-generated by Fern from our API Definition.
-
-import typing
-
-import pydantic
-from ...core.pydantic_utilities import IS_PYDANTIC_V2, UniversalBaseModel
-
-
-class UpdateEvidenceDisputeRequestCancellationPolicyAttachment(UniversalBaseModel):
- """
- A file upload containing the company's cancellation policy document.
- """
-
- id: str = pydantic.Field()
- """
- The ID of an existing file object.
- """
-
- if IS_PYDANTIC_V2:
- model_config: typing.ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(extra="allow", frozen=True) # type: ignore # Pydantic v2
- else:
-
- class Config:
- frozen = True
- smart_union = True
- extra = pydantic.Extra.allow
diff --git a/src/whop_sdk/disputes/types/update_evidence_dispute_request_customer_communication_attachment.py b/src/whop_sdk/disputes/types/update_evidence_dispute_request_customer_communication_attachment.py
deleted file mode 100644
index b871c4b7..00000000
--- a/src/whop_sdk/disputes/types/update_evidence_dispute_request_customer_communication_attachment.py
+++ /dev/null
@@ -1,26 +0,0 @@
-# This file was auto-generated by Fern from our API Definition.
-
-import typing
-
-import pydantic
-from ...core.pydantic_utilities import IS_PYDANTIC_V2, UniversalBaseModel
-
-
-class UpdateEvidenceDisputeRequestCustomerCommunicationAttachment(UniversalBaseModel):
- """
- A file upload containing evidence of customer communication. Must be a JPEG, PNG, GIF, or PDF.
- """
-
- id: str = pydantic.Field()
- """
- The ID of an existing file object.
- """
-
- if IS_PYDANTIC_V2:
- model_config: typing.ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(extra="allow", frozen=True) # type: ignore # Pydantic v2
- else:
-
- class Config:
- frozen = True
- smart_union = True
- extra = pydantic.Extra.allow
diff --git a/src/whop_sdk/dm_channels/client.py b/src/whop_sdk/dm_channels/client.py
index 37bf4ae4..c4cfdcbd 100644
--- a/src/whop_sdk/dm_channels/client.py
+++ b/src/whop_sdk/dm_channels/client.py
@@ -75,7 +75,7 @@ def list(
from whop_sdk import Whop
client = Whop(
- "2026-09-02-2",
+ "2026-09-06",
idempotency_key="YOUR_IDEMPOTENCY_KEY",
token="YOUR_TOKEN",
)
@@ -136,7 +136,7 @@ def create(
from whop_sdk import Whop
client = Whop(
- "2026-09-02-2",
+ "2026-09-06",
idempotency_key="YOUR_IDEMPOTENCY_KEY",
token="YOUR_TOKEN",
)
@@ -179,7 +179,7 @@ def retrieve(self, id: str, *, request_options: typing.Optional[RequestOptions]
from whop_sdk import Whop
client = Whop(
- "2026-09-02-2",
+ "2026-09-06",
idempotency_key="YOUR_IDEMPOTENCY_KEY",
token="YOUR_TOKEN",
)
@@ -216,7 +216,7 @@ def delete(self, id: str, *, request_options: typing.Optional[RequestOptions] =
from whop_sdk import Whop
client = Whop(
- "2026-09-02-2",
+ "2026-09-06",
idempotency_key="YOUR_IDEMPOTENCY_KEY",
token="YOUR_TOKEN",
)
@@ -262,7 +262,7 @@ def update(
from whop_sdk import Whop
client = Whop(
- "2026-09-02-2",
+ "2026-09-06",
idempotency_key="YOUR_IDEMPOTENCY_KEY",
token="YOUR_TOKEN",
)
@@ -337,7 +337,7 @@ async def list(
from whop_sdk import AsyncWhop
client = AsyncWhop(
- "2026-09-02-2",
+ "2026-09-06",
idempotency_key="YOUR_IDEMPOTENCY_KEY",
token="YOUR_TOKEN",
)
@@ -407,7 +407,7 @@ async def create(
from whop_sdk import AsyncWhop
client = AsyncWhop(
- "2026-09-02-2",
+ "2026-09-06",
idempotency_key="YOUR_IDEMPOTENCY_KEY",
token="YOUR_TOKEN",
)
@@ -458,7 +458,7 @@ async def retrieve(self, id: str, *, request_options: typing.Optional[RequestOpt
from whop_sdk import AsyncWhop
client = AsyncWhop(
- "2026-09-02-2",
+ "2026-09-06",
idempotency_key="YOUR_IDEMPOTENCY_KEY",
token="YOUR_TOKEN",
)
@@ -503,7 +503,7 @@ async def delete(self, id: str, *, request_options: typing.Optional[RequestOptio
from whop_sdk import AsyncWhop
client = AsyncWhop(
- "2026-09-02-2",
+ "2026-09-06",
idempotency_key="YOUR_IDEMPOTENCY_KEY",
token="YOUR_TOKEN",
)
@@ -557,7 +557,7 @@ async def update(
from whop_sdk import AsyncWhop
client = AsyncWhop(
- "2026-09-02-2",
+ "2026-09-06",
idempotency_key="YOUR_IDEMPOTENCY_KEY",
token="YOUR_TOKEN",
)
diff --git a/src/whop_sdk/dm_members/client.py b/src/whop_sdk/dm_members/client.py
index a460cd76..0580e585 100644
--- a/src/whop_sdk/dm_members/client.py
+++ b/src/whop_sdk/dm_members/client.py
@@ -78,7 +78,7 @@ def list(
from whop_sdk import Whop
client = Whop(
- "2026-09-02-2",
+ "2026-09-06",
idempotency_key="YOUR_IDEMPOTENCY_KEY",
token="YOUR_TOKEN",
)
@@ -128,7 +128,7 @@ def create(
from whop_sdk import Whop
client = Whop(
- "2026-09-02-2",
+ "2026-09-06",
idempotency_key="YOUR_IDEMPOTENCY_KEY",
token="YOUR_TOKEN",
)
@@ -166,7 +166,7 @@ def retrieve(self, id: str, *, request_options: typing.Optional[RequestOptions]
from whop_sdk import Whop
client = Whop(
- "2026-09-02-2",
+ "2026-09-06",
idempotency_key="YOUR_IDEMPOTENCY_KEY",
token="YOUR_TOKEN",
)
@@ -203,7 +203,7 @@ def delete(self, id: str, *, request_options: typing.Optional[RequestOptions] =
from whop_sdk import Whop
client = Whop(
- "2026-09-02-2",
+ "2026-09-06",
idempotency_key="YOUR_IDEMPOTENCY_KEY",
token="YOUR_TOKEN",
)
@@ -253,7 +253,7 @@ def update(
from whop_sdk import Whop
client = Whop(
- "2026-09-02-2",
+ "2026-09-06",
idempotency_key="YOUR_IDEMPOTENCY_KEY",
token="YOUR_TOKEN",
)
@@ -331,7 +331,7 @@ async def list(
from whop_sdk import AsyncWhop
client = AsyncWhop(
- "2026-09-02-2",
+ "2026-09-06",
idempotency_key="YOUR_IDEMPOTENCY_KEY",
token="YOUR_TOKEN",
)
@@ -390,7 +390,7 @@ async def create(
from whop_sdk import AsyncWhop
client = AsyncWhop(
- "2026-09-02-2",
+ "2026-09-06",
idempotency_key="YOUR_IDEMPOTENCY_KEY",
token="YOUR_TOKEN",
)
@@ -438,7 +438,7 @@ async def retrieve(self, id: str, *, request_options: typing.Optional[RequestOpt
from whop_sdk import AsyncWhop
client = AsyncWhop(
- "2026-09-02-2",
+ "2026-09-06",
idempotency_key="YOUR_IDEMPOTENCY_KEY",
token="YOUR_TOKEN",
)
@@ -483,7 +483,7 @@ async def delete(self, id: str, *, request_options: typing.Optional[RequestOptio
from whop_sdk import AsyncWhop
client = AsyncWhop(
- "2026-09-02-2",
+ "2026-09-06",
idempotency_key="YOUR_IDEMPOTENCY_KEY",
token="YOUR_TOKEN",
)
@@ -541,7 +541,7 @@ async def update(
from whop_sdk import AsyncWhop
client = AsyncWhop(
- "2026-09-02-2",
+ "2026-09-06",
idempotency_key="YOUR_IDEMPOTENCY_KEY",
token="YOUR_TOKEN",
)
diff --git a/src/whop_sdk/entries/client.py b/src/whop_sdk/entries/client.py
index 44c85b6f..dfdbfdf5 100644
--- a/src/whop_sdk/entries/client.py
+++ b/src/whop_sdk/entries/client.py
@@ -106,7 +106,7 @@ def list(
from whop_sdk import Whop
client = Whop(
- "2026-09-02-2",
+ "2026-09-06",
idempotency_key="YOUR_IDEMPOTENCY_KEY",
token="YOUR_TOKEN",
)
@@ -169,7 +169,7 @@ def retrieve(self, id: str, *, request_options: typing.Optional[RequestOptions]
from whop_sdk import Whop
client = Whop(
- "2026-09-02-2",
+ "2026-09-06",
idempotency_key="YOUR_IDEMPOTENCY_KEY",
token="YOUR_TOKEN",
)
@@ -205,7 +205,7 @@ def approve(self, id: str, *, request_options: typing.Optional[RequestOptions] =
from whop_sdk import Whop
client = Whop(
- "2026-09-02-2",
+ "2026-09-06",
idempotency_key="YOUR_IDEMPOTENCY_KEY",
token="YOUR_TOKEN",
)
@@ -243,7 +243,7 @@ def deny(self, id: str, *, request_options: typing.Optional[RequestOptions] = No
from whop_sdk import Whop
client = Whop(
- "2026-09-02-2",
+ "2026-09-06",
idempotency_key="YOUR_IDEMPOTENCY_KEY",
token="YOUR_TOKEN",
)
@@ -346,7 +346,7 @@ async def list(
from whop_sdk import AsyncWhop
client = AsyncWhop(
- "2026-09-02-2",
+ "2026-09-06",
idempotency_key="YOUR_IDEMPOTENCY_KEY",
token="YOUR_TOKEN",
)
@@ -418,7 +418,7 @@ async def retrieve(self, id: str, *, request_options: typing.Optional[RequestOpt
from whop_sdk import AsyncWhop
client = AsyncWhop(
- "2026-09-02-2",
+ "2026-09-06",
idempotency_key="YOUR_IDEMPOTENCY_KEY",
token="YOUR_TOKEN",
)
@@ -464,7 +464,7 @@ async def approve(
from whop_sdk import AsyncWhop
client = AsyncWhop(
- "2026-09-02-2",
+ "2026-09-06",
idempotency_key="YOUR_IDEMPOTENCY_KEY",
token="YOUR_TOKEN",
)
@@ -510,7 +510,7 @@ async def deny(self, id: str, *, request_options: typing.Optional[RequestOptions
from whop_sdk import AsyncWhop
client = AsyncWhop(
- "2026-09-02-2",
+ "2026-09-06",
idempotency_key="YOUR_IDEMPOTENCY_KEY",
token="YOUR_TOKEN",
)
diff --git a/src/whop_sdk/events/client.py b/src/whop_sdk/events/client.py
index 69e6ea91..0d88c5c8 100644
--- a/src/whop_sdk/events/client.py
+++ b/src/whop_sdk/events/client.py
@@ -138,7 +138,7 @@ def list(
from whop_sdk import Whop
client = Whop(
- "2026-09-02-2",
+ "2026-09-06",
idempotency_key="YOUR_IDEMPOTENCY_KEY",
token="YOUR_TOKEN",
)
@@ -277,7 +277,7 @@ def create(
from whop_sdk import Whop
client = Whop(
- "2026-09-02-2",
+ "2026-09-06",
idempotency_key="YOUR_IDEMPOTENCY_KEY",
token="YOUR_TOKEN",
)
@@ -350,7 +350,7 @@ def pulse(
from whop_sdk import Whop
client = Whop(
- "2026-09-02-2",
+ "2026-09-06",
idempotency_key="YOUR_IDEMPOTENCY_KEY",
token="YOUR_TOKEN",
)
@@ -396,7 +396,7 @@ def validate_pixel(
from whop_sdk import Whop
client = Whop(
- "2026-09-02-2",
+ "2026-09-06",
idempotency_key="YOUR_IDEMPOTENCY_KEY",
token="YOUR_TOKEN",
)
@@ -522,7 +522,7 @@ async def list(
from whop_sdk import AsyncWhop
client = AsyncWhop(
- "2026-09-02-2",
+ "2026-09-06",
idempotency_key="YOUR_IDEMPOTENCY_KEY",
token="YOUR_TOKEN",
)
@@ -670,7 +670,7 @@ async def create(
from whop_sdk import AsyncWhop
client = AsyncWhop(
- "2026-09-02-2",
+ "2026-09-06",
idempotency_key="YOUR_IDEMPOTENCY_KEY",
token="YOUR_TOKEN",
)
@@ -751,7 +751,7 @@ async def pulse(
from whop_sdk import AsyncWhop
client = AsyncWhop(
- "2026-09-02-2",
+ "2026-09-06",
idempotency_key="YOUR_IDEMPOTENCY_KEY",
token="YOUR_TOKEN",
)
@@ -806,7 +806,7 @@ async def validate_pixel(
from whop_sdk import AsyncWhop
client = AsyncWhop(
- "2026-09-02-2",
+ "2026-09-06",
idempotency_key="YOUR_IDEMPOTENCY_KEY",
token="YOUR_TOKEN",
)
diff --git a/src/whop_sdk/events/types/list_events_response_data_item_related_audience_source_type.py b/src/whop_sdk/events/types/list_events_response_data_item_related_audience_source_type.py
index 5ce7dfb4..2cdc48f4 100644
--- a/src/whop_sdk/events/types/list_events_response_data_item_related_audience_source_type.py
+++ b/src/whop_sdk/events/types/list_events_response_data_item_related_audience_source_type.py
@@ -3,5 +3,5 @@
import typing
ListEventsResponseDataItemRelatedAudienceSourceType = typing.Union[
- typing.Literal["csv_upload", "people_filter"], typing.Any
+ typing.Literal["csv_upload", "people_filter", "engagement"], typing.Any
]
diff --git a/src/whop_sdk/experiences/client.py b/src/whop_sdk/experiences/client.py
index 9104f5c9..02a04feb 100644
--- a/src/whop_sdk/experiences/client.py
+++ b/src/whop_sdk/experiences/client.py
@@ -94,7 +94,7 @@ def list(
from whop_sdk import Whop
client = Whop(
- "2026-09-02-2",
+ "2026-09-06",
idempotency_key="YOUR_IDEMPOTENCY_KEY",
token="YOUR_TOKEN",
)
@@ -182,7 +182,7 @@ def create(
from whop_sdk import Whop
client = Whop(
- "2026-09-02-2",
+ "2026-09-06",
idempotency_key="YOUR_IDEMPOTENCY_KEY",
token="YOUR_TOKEN",
)
@@ -225,7 +225,7 @@ def retrieve(self, id: str, *, request_options: typing.Optional[RequestOptions]
from whop_sdk import Whop
client = Whop(
- "2026-09-02-2",
+ "2026-09-06",
idempotency_key="YOUR_IDEMPOTENCY_KEY",
token="YOUR_TOKEN",
)
@@ -259,7 +259,7 @@ def delete(self, id: str, *, request_options: typing.Optional[RequestOptions] =
from whop_sdk import Whop
client = Whop(
- "2026-09-02-2",
+ "2026-09-06",
idempotency_key="YOUR_IDEMPOTENCY_KEY",
token="YOUR_TOKEN",
)
@@ -326,7 +326,7 @@ def update(
from whop_sdk import Whop
client = Whop(
- "2026-09-02-2",
+ "2026-09-06",
idempotency_key="YOUR_IDEMPOTENCY_KEY",
token="YOUR_TOKEN",
)
@@ -377,7 +377,7 @@ def attach(
from whop_sdk import Whop
client = Whop(
- "2026-09-02-2",
+ "2026-09-06",
idempotency_key="YOUR_IDEMPOTENCY_KEY",
token="YOUR_TOKEN",
)
@@ -419,7 +419,7 @@ def detach(
from whop_sdk import Whop
client = Whop(
- "2026-09-02-2",
+ "2026-09-06",
idempotency_key="YOUR_IDEMPOTENCY_KEY",
token="YOUR_TOKEN",
)
@@ -464,7 +464,7 @@ def duplicate(
from whop_sdk import Whop
client = Whop(
- "2026-09-02-2",
+ "2026-09-06",
idempotency_key="YOUR_IDEMPOTENCY_KEY",
token="YOUR_TOKEN",
)
@@ -553,7 +553,7 @@ async def list(
from whop_sdk import AsyncWhop
client = AsyncWhop(
- "2026-09-02-2",
+ "2026-09-06",
idempotency_key="YOUR_IDEMPOTENCY_KEY",
token="YOUR_TOKEN",
)
@@ -650,7 +650,7 @@ async def create(
from whop_sdk import AsyncWhop
client = AsyncWhop(
- "2026-09-02-2",
+ "2026-09-06",
idempotency_key="YOUR_IDEMPOTENCY_KEY",
token="YOUR_TOKEN",
)
@@ -701,7 +701,7 @@ async def retrieve(self, id: str, *, request_options: typing.Optional[RequestOpt
from whop_sdk import AsyncWhop
client = AsyncWhop(
- "2026-09-02-2",
+ "2026-09-06",
idempotency_key="YOUR_IDEMPOTENCY_KEY",
token="YOUR_TOKEN",
)
@@ -743,7 +743,7 @@ async def delete(self, id: str, *, request_options: typing.Optional[RequestOptio
from whop_sdk import AsyncWhop
client = AsyncWhop(
- "2026-09-02-2",
+ "2026-09-06",
idempotency_key="YOUR_IDEMPOTENCY_KEY",
token="YOUR_TOKEN",
)
@@ -818,7 +818,7 @@ async def update(
from whop_sdk import AsyncWhop
client = AsyncWhop(
- "2026-09-02-2",
+ "2026-09-06",
idempotency_key="YOUR_IDEMPOTENCY_KEY",
token="YOUR_TOKEN",
)
@@ -877,7 +877,7 @@ async def attach(
from whop_sdk import AsyncWhop
client = AsyncWhop(
- "2026-09-02-2",
+ "2026-09-06",
idempotency_key="YOUR_IDEMPOTENCY_KEY",
token="YOUR_TOKEN",
)
@@ -927,7 +927,7 @@ async def detach(
from whop_sdk import AsyncWhop
client = AsyncWhop(
- "2026-09-02-2",
+ "2026-09-06",
idempotency_key="YOUR_IDEMPOTENCY_KEY",
token="YOUR_TOKEN",
)
@@ -980,7 +980,7 @@ async def duplicate(
from whop_sdk import AsyncWhop
client = AsyncWhop(
- "2026-09-02-2",
+ "2026-09-06",
idempotency_key="YOUR_IDEMPOTENCY_KEY",
token="YOUR_TOKEN",
)
diff --git a/src/whop_sdk/exports/client.py b/src/whop_sdk/exports/client.py
index d8bb998f..c246970b 100644
--- a/src/whop_sdk/exports/client.py
+++ b/src/whop_sdk/exports/client.py
@@ -83,7 +83,7 @@ def list(
from whop_sdk import Whop
client = Whop(
- "2026-09-02-2",
+ "2026-09-06",
idempotency_key="YOUR_IDEMPOTENCY_KEY",
token="YOUR_TOKEN",
)
@@ -144,7 +144,7 @@ def create(
from whop_sdk import Whop
client = Whop(
- "2026-09-02-2",
+ "2026-09-06",
idempotency_key="YOUR_IDEMPOTENCY_KEY",
token="YOUR_TOKEN",
)
@@ -184,7 +184,7 @@ def retrieve(self, id: str, *, request_options: typing.Optional[RequestOptions]
from whop_sdk import Whop
client = Whop(
- "2026-09-02-2",
+ "2026-09-06",
idempotency_key="YOUR_IDEMPOTENCY_KEY",
token="YOUR_TOKEN",
)
@@ -264,7 +264,7 @@ async def list(
from whop_sdk import AsyncWhop
client = AsyncWhop(
- "2026-09-02-2",
+ "2026-09-06",
idempotency_key="YOUR_IDEMPOTENCY_KEY",
token="YOUR_TOKEN",
)
@@ -333,7 +333,7 @@ async def create(
from whop_sdk import AsyncWhop
client = AsyncWhop(
- "2026-09-02-2",
+ "2026-09-06",
idempotency_key="YOUR_IDEMPOTENCY_KEY",
token="YOUR_TOKEN",
)
@@ -381,7 +381,7 @@ async def retrieve(self, id: str, *, request_options: typing.Optional[RequestOpt
from whop_sdk import AsyncWhop
client = AsyncWhop(
- "2026-09-02-2",
+ "2026-09-06",
idempotency_key="YOUR_IDEMPOTENCY_KEY",
token="YOUR_TOKEN",
)
diff --git a/src/whop_sdk/fee_markups/client.py b/src/whop_sdk/fee_markups/client.py
index 2a324a7a..d2b8a0f6 100644
--- a/src/whop_sdk/fee_markups/client.py
+++ b/src/whop_sdk/fee_markups/client.py
@@ -76,7 +76,7 @@ def list(
from whop_sdk import Whop
client = Whop(
- "2026-09-02-2",
+ "2026-09-06",
idempotency_key="YOUR_IDEMPOTENCY_KEY",
token="YOUR_TOKEN",
)
@@ -145,7 +145,7 @@ def create(
from whop_sdk import Whop
client = Whop(
- "2026-09-02-2",
+ "2026-09-06",
idempotency_key="YOUR_IDEMPOTENCY_KEY",
token="YOUR_TOKEN",
)
@@ -190,7 +190,7 @@ def delete(self, id: str, *, request_options: typing.Optional[RequestOptions] =
from whop_sdk import Whop
client = Whop(
- "2026-09-02-2",
+ "2026-09-06",
idempotency_key="YOUR_IDEMPOTENCY_KEY",
token="YOUR_TOKEN",
)
@@ -265,7 +265,7 @@ async def list(
from whop_sdk import AsyncWhop
client = AsyncWhop(
- "2026-09-02-2",
+ "2026-09-06",
idempotency_key="YOUR_IDEMPOTENCY_KEY",
token="YOUR_TOKEN",
)
@@ -343,7 +343,7 @@ async def create(
from whop_sdk import AsyncWhop
client = AsyncWhop(
- "2026-09-02-2",
+ "2026-09-06",
idempotency_key="YOUR_IDEMPOTENCY_KEY",
token="YOUR_TOKEN",
)
@@ -396,7 +396,7 @@ async def delete(self, id: str, *, request_options: typing.Optional[RequestOptio
from whop_sdk import AsyncWhop
client = AsyncWhop(
- "2026-09-02-2",
+ "2026-09-06",
idempotency_key="YOUR_IDEMPOTENCY_KEY",
token="YOUR_TOKEN",
)
diff --git a/src/whop_sdk/files/client.py b/src/whop_sdk/files/client.py
index 8217454f..01b0469d 100644
--- a/src/whop_sdk/files/client.py
+++ b/src/whop_sdk/files/client.py
@@ -83,7 +83,7 @@ def list(
from whop_sdk import Whop
client = Whop(
- "2026-09-02-2",
+ "2026-09-06",
idempotency_key="YOUR_IDEMPOTENCY_KEY",
token="YOUR_TOKEN",
)
@@ -146,7 +146,7 @@ def create(
from whop_sdk import Whop
client = Whop(
- "2026-09-02-2",
+ "2026-09-06",
idempotency_key="YOUR_IDEMPOTENCY_KEY",
token="YOUR_TOKEN",
)
@@ -185,7 +185,7 @@ def retrieve(self, id: str, *, request_options: typing.Optional[RequestOptions]
from whop_sdk import Whop
client = Whop(
- "2026-09-02-2",
+ "2026-09-06",
idempotency_key="YOUR_IDEMPOTENCY_KEY",
token="YOUR_TOKEN",
)
@@ -232,7 +232,7 @@ def complete(
from whop_sdk.files import CompleteFilesRequestMultipartPartsItem
client = Whop(
- "2026-09-02-2",
+ "2026-09-06",
idempotency_key="YOUR_IDEMPOTENCY_KEY",
token="YOUR_TOKEN",
)
@@ -324,7 +324,7 @@ async def list(
from whop_sdk import AsyncWhop
client = AsyncWhop(
- "2026-09-02-2",
+ "2026-09-06",
idempotency_key="YOUR_IDEMPOTENCY_KEY",
token="YOUR_TOKEN",
)
@@ -396,7 +396,7 @@ async def create(
from whop_sdk import AsyncWhop
client = AsyncWhop(
- "2026-09-02-2",
+ "2026-09-06",
idempotency_key="YOUR_IDEMPOTENCY_KEY",
token="YOUR_TOKEN",
)
@@ -443,7 +443,7 @@ async def retrieve(self, id: str, *, request_options: typing.Optional[RequestOpt
from whop_sdk import AsyncWhop
client = AsyncWhop(
- "2026-09-02-2",
+ "2026-09-06",
idempotency_key="YOUR_IDEMPOTENCY_KEY",
token="YOUR_TOKEN",
)
@@ -498,7 +498,7 @@ async def complete(
from whop_sdk.files import CompleteFilesRequestMultipartPartsItem
client = AsyncWhop(
- "2026-09-02-2",
+ "2026-09-06",
idempotency_key="YOUR_IDEMPOTENCY_KEY",
token="YOUR_TOKEN",
)
diff --git a/src/whop_sdk/financial_activity/client.py b/src/whop_sdk/financial_activity/client.py
index 5619f78c..682125bc 100644
--- a/src/whop_sdk/financial_activity/client.py
+++ b/src/whop_sdk/financial_activity/client.py
@@ -117,7 +117,7 @@ def list(
from whop_sdk import Whop
client = Whop(
- "2026-09-02-2",
+ "2026-09-06",
idempotency_key="YOUR_IDEMPOTENCY_KEY",
token="YOUR_TOKEN",
)
@@ -253,7 +253,7 @@ async def list(
from whop_sdk import AsyncWhop
client = AsyncWhop(
- "2026-09-02-2",
+ "2026-09-06",
idempotency_key="YOUR_IDEMPOTENCY_KEY",
token="YOUR_TOKEN",
)
diff --git a/src/whop_sdk/financial_reports/breakdown/client.py b/src/whop_sdk/financial_reports/breakdown/client.py
index 6dd3bf46..f4dbe080 100644
--- a/src/whop_sdk/financial_reports/breakdown/client.py
+++ b/src/whop_sdk/financial_reports/breakdown/client.py
@@ -84,7 +84,7 @@ def retrieve(
from whop_sdk import Whop
client = Whop(
- "2026-09-02-2",
+ "2026-09-06",
idempotency_key="YOUR_IDEMPOTENCY_KEY",
token="YOUR_TOKEN",
)
@@ -188,7 +188,7 @@ async def retrieve(
from whop_sdk import AsyncWhop
client = AsyncWhop(
- "2026-09-02-2",
+ "2026-09-06",
idempotency_key="YOUR_IDEMPOTENCY_KEY",
token="YOUR_TOKEN",
)
diff --git a/src/whop_sdk/financial_reports/client.py b/src/whop_sdk/financial_reports/client.py
index b1010d46..9e823417 100644
--- a/src/whop_sdk/financial_reports/client.py
+++ b/src/whop_sdk/financial_reports/client.py
@@ -115,7 +115,7 @@ def retrieve(
from whop_sdk import Whop
client = Whop(
- "2026-09-02-2",
+ "2026-09-06",
idempotency_key="YOUR_IDEMPOTENCY_KEY",
token="YOUR_TOKEN",
)
@@ -250,7 +250,7 @@ async def retrieve(
from whop_sdk import AsyncWhop
client = AsyncWhop(
- "2026-09-02-2",
+ "2026-09-06",
idempotency_key="YOUR_IDEMPOTENCY_KEY",
token="YOUR_TOKEN",
)
diff --git a/src/whop_sdk/financial_reports/types/retrieve_financial_reports_response_rows_item_grouping.py b/src/whop_sdk/financial_reports/types/retrieve_financial_reports_response_rows_item_grouping.py
index e1bea07a..419d757c 100644
--- a/src/whop_sdk/financial_reports/types/retrieve_financial_reports_response_rows_item_grouping.py
+++ b/src/whop_sdk/financial_reports/types/retrieve_financial_reports_response_rows_item_grouping.py
@@ -17,6 +17,7 @@
"fx",
"legacy",
"misc",
+ "operational_costs",
"other",
"payments",
"refunds",
diff --git a/src/whop_sdk/financial_reports/types/retrieve_financial_reports_response_rows_item_line_category.py b/src/whop_sdk/financial_reports/types/retrieve_financial_reports_response_rows_item_line_category.py
index fc9411c4..03cd3ab6 100644
--- a/src/whop_sdk/financial_reports/types/retrieve_financial_reports_response_rows_item_line_category.py
+++ b/src/whop_sdk/financial_reports/types/retrieve_financial_reports_response_rows_item_line_category.py
@@ -255,6 +255,7 @@
"sales_tax_remittance_reversal",
"sales_tax_remitted",
"settlement_rounding_variance",
+ "settlement_shortfall_loss",
"software_rental_revshare",
"software_rental_transaction",
"stripe_domestic_processing_fee",
diff --git a/src/whop_sdk/forum_posts/client.py b/src/whop_sdk/forum_posts/client.py
index 4ddf3698..0eaa4a04 100644
--- a/src/whop_sdk/forum_posts/client.py
+++ b/src/whop_sdk/forum_posts/client.py
@@ -92,7 +92,7 @@ def list(
from whop_sdk import Whop
client = Whop(
- "2026-09-02-2",
+ "2026-09-06",
idempotency_key="YOUR_IDEMPOTENCY_KEY",
token="YOUR_TOKEN",
)
@@ -197,7 +197,7 @@ def create(
from whop_sdk import Whop
client = Whop(
- "2026-09-02-2",
+ "2026-09-06",
idempotency_key="YOUR_IDEMPOTENCY_KEY",
token="YOUR_TOKEN",
)
@@ -248,7 +248,7 @@ def retrieve(self, id: str, *, request_options: typing.Optional[RequestOptions]
from whop_sdk import Whop
client = Whop(
- "2026-09-02-2",
+ "2026-09-06",
idempotency_key="YOUR_IDEMPOTENCY_KEY",
token="YOUR_TOKEN",
)
@@ -306,7 +306,7 @@ def update(
from whop_sdk import Whop
client = Whop(
- "2026-09-02-2",
+ "2026-09-06",
idempotency_key="YOUR_IDEMPOTENCY_KEY",
token="YOUR_TOKEN",
)
@@ -401,7 +401,7 @@ async def list(
from whop_sdk import AsyncWhop
client = AsyncWhop(
- "2026-09-02-2",
+ "2026-09-06",
idempotency_key="YOUR_IDEMPOTENCY_KEY",
token="YOUR_TOKEN",
)
@@ -515,7 +515,7 @@ async def create(
from whop_sdk import AsyncWhop
client = AsyncWhop(
- "2026-09-02-2",
+ "2026-09-06",
idempotency_key="YOUR_IDEMPOTENCY_KEY",
token="YOUR_TOKEN",
)
@@ -574,7 +574,7 @@ async def retrieve(self, id: str, *, request_options: typing.Optional[RequestOpt
from whop_sdk import AsyncWhop
client = AsyncWhop(
- "2026-09-02-2",
+ "2026-09-06",
idempotency_key="YOUR_IDEMPOTENCY_KEY",
token="YOUR_TOKEN",
)
@@ -640,7 +640,7 @@ async def update(
from whop_sdk import AsyncWhop
client = AsyncWhop(
- "2026-09-02-2",
+ "2026-09-06",
idempotency_key="YOUR_IDEMPOTENCY_KEY",
token="YOUR_TOKEN",
)
diff --git a/src/whop_sdk/forums/client.py b/src/whop_sdk/forums/client.py
index 854e136a..c0385c0e 100644
--- a/src/whop_sdk/forums/client.py
+++ b/src/whop_sdk/forums/client.py
@@ -83,7 +83,7 @@ def list(
from whop_sdk import Whop
client = Whop(
- "2026-09-02-2",
+ "2026-09-06",
idempotency_key="YOUR_IDEMPOTENCY_KEY",
token="YOUR_TOKEN",
)
@@ -134,7 +134,7 @@ def retrieve(self, id: str, *, request_options: typing.Optional[RequestOptions]
from whop_sdk import Whop
client = Whop(
- "2026-09-02-2",
+ "2026-09-06",
idempotency_key="YOUR_IDEMPOTENCY_KEY",
token="YOUR_TOKEN",
)
@@ -195,7 +195,7 @@ def update(
from whop_sdk import Whop
client = Whop(
- "2026-09-02-2",
+ "2026-09-06",
idempotency_key="YOUR_IDEMPOTENCY_KEY",
token="YOUR_TOKEN",
)
@@ -282,7 +282,7 @@ async def list(
from whop_sdk import AsyncWhop
client = AsyncWhop(
- "2026-09-02-2",
+ "2026-09-06",
idempotency_key="YOUR_IDEMPOTENCY_KEY",
token="YOUR_TOKEN",
)
@@ -342,7 +342,7 @@ async def retrieve(self, id: str, *, request_options: typing.Optional[RequestOpt
from whop_sdk import AsyncWhop
client = AsyncWhop(
- "2026-09-02-2",
+ "2026-09-06",
idempotency_key="YOUR_IDEMPOTENCY_KEY",
token="YOUR_TOKEN",
)
@@ -411,7 +411,7 @@ async def update(
from whop_sdk import AsyncWhop
client = AsyncWhop(
- "2026-09-02-2",
+ "2026-09-06",
idempotency_key="YOUR_IDEMPOTENCY_KEY",
token="YOUR_TOKEN",
)
diff --git a/src/whop_sdk/identity_profiles/client.py b/src/whop_sdk/identity_profiles/client.py
index d7cbda1e..46a28179 100644
--- a/src/whop_sdk/identity_profiles/client.py
+++ b/src/whop_sdk/identity_profiles/client.py
@@ -84,7 +84,7 @@ def list_identity_profile(
from whop_sdk import Whop
client = Whop(
- "2026-09-02-2",
+ "2026-09-06",
idempotency_key="YOUR_IDEMPOTENCY_KEY",
token="YOUR_TOKEN",
)
@@ -137,7 +137,7 @@ def retrieve_identity_profile(
from whop_sdk import Whop
client = Whop(
- "2026-09-02-2",
+ "2026-09-06",
idempotency_key="YOUR_IDEMPOTENCY_KEY",
token="YOUR_TOKEN",
)
@@ -175,7 +175,7 @@ def unlink_identity_profile(
from whop_sdk import Whop
client = Whop(
- "2026-09-02-2",
+ "2026-09-06",
idempotency_key="YOUR_IDEMPOTENCY_KEY",
token="YOUR_TOKEN",
)
@@ -235,7 +235,7 @@ def list_verifications_identity_profile(
from whop_sdk import Whop
client = Whop(
- "2026-09-02-2",
+ "2026-09-06",
idempotency_key="YOUR_IDEMPOTENCY_KEY",
token="YOUR_TOKEN",
)
@@ -324,7 +324,7 @@ async def list_identity_profile(
from whop_sdk import AsyncWhop
client = AsyncWhop(
- "2026-09-02-2",
+ "2026-09-06",
idempotency_key="YOUR_IDEMPOTENCY_KEY",
token="YOUR_TOKEN",
)
@@ -386,7 +386,7 @@ async def retrieve_identity_profile(
from whop_sdk import AsyncWhop
client = AsyncWhop(
- "2026-09-02-2",
+ "2026-09-06",
idempotency_key="YOUR_IDEMPOTENCY_KEY",
token="YOUR_TOKEN",
)
@@ -432,7 +432,7 @@ async def unlink_identity_profile(
from whop_sdk import AsyncWhop
client = AsyncWhop(
- "2026-09-02-2",
+ "2026-09-06",
idempotency_key="YOUR_IDEMPOTENCY_KEY",
token="YOUR_TOKEN",
)
@@ -500,7 +500,7 @@ async def list_verifications_identity_profile(
from whop_sdk import AsyncWhop
client = AsyncWhop(
- "2026-09-02-2",
+ "2026-09-06",
idempotency_key="YOUR_IDEMPOTENCY_KEY",
token="YOUR_TOKEN",
)
diff --git a/src/whop_sdk/invoices/client.py b/src/whop_sdk/invoices/client.py
index 0b4e864e..7a54bbaf 100644
--- a/src/whop_sdk/invoices/client.py
+++ b/src/whop_sdk/invoices/client.py
@@ -114,7 +114,7 @@ def list(
from whop_sdk import Whop
client = Whop(
- "2026-09-02-2",
+ "2026-09-06",
idempotency_key="YOUR_IDEMPOTENCY_KEY",
token="YOUR_TOKEN",
)
@@ -185,7 +185,7 @@ def create(
)
client = Whop(
- "2026-09-02-2",
+ "2026-09-06",
idempotency_key="YOUR_IDEMPOTENCY_KEY",
token="YOUR_TOKEN",
)
@@ -231,7 +231,7 @@ def retrieve(self, id: str, *, request_options: typing.Optional[RequestOptions]
from whop_sdk import Whop
client = Whop(
- "2026-09-02-2",
+ "2026-09-06",
idempotency_key="YOUR_IDEMPOTENCY_KEY",
token="YOUR_TOKEN",
)
@@ -267,7 +267,7 @@ def delete(self, id: str, *, request_options: typing.Optional[RequestOptions] =
from whop_sdk import Whop
client = Whop(
- "2026-09-02-2",
+ "2026-09-06",
idempotency_key="YOUR_IDEMPOTENCY_KEY",
token="YOUR_TOKEN",
)
@@ -367,7 +367,7 @@ def update(
from whop_sdk import Whop
client = Whop(
- "2026-09-02-2",
+ "2026-09-06",
idempotency_key="YOUR_IDEMPOTENCY_KEY",
token="YOUR_TOKEN",
)
@@ -420,7 +420,7 @@ def mark_paid(self, id: str, *, request_options: typing.Optional[RequestOptions]
from whop_sdk import Whop
client = Whop(
- "2026-09-02-2",
+ "2026-09-06",
idempotency_key="YOUR_IDEMPOTENCY_KEY",
token="YOUR_TOKEN",
)
@@ -456,7 +456,7 @@ def mark_uncollectible(self, id: str, *, request_options: typing.Optional[Reques
from whop_sdk import Whop
client = Whop(
- "2026-09-02-2",
+ "2026-09-06",
idempotency_key="YOUR_IDEMPOTENCY_KEY",
token="YOUR_TOKEN",
)
@@ -492,7 +492,7 @@ def resend(self, id: str, *, request_options: typing.Optional[RequestOptions] =
from whop_sdk import Whop
client = Whop(
- "2026-09-02-2",
+ "2026-09-06",
idempotency_key="YOUR_IDEMPOTENCY_KEY",
token="YOUR_TOKEN",
)
@@ -528,7 +528,7 @@ def void(self, id: str, *, request_options: typing.Optional[RequestOptions] = No
from whop_sdk import Whop
client = Whop(
- "2026-09-02-2",
+ "2026-09-06",
idempotency_key="YOUR_IDEMPOTENCY_KEY",
token="YOUR_TOKEN",
)
@@ -632,7 +632,7 @@ async def list(
from whop_sdk import AsyncWhop
client = AsyncWhop(
- "2026-09-02-2",
+ "2026-09-06",
idempotency_key="YOUR_IDEMPOTENCY_KEY",
token="YOUR_TOKEN",
)
@@ -712,7 +712,7 @@ async def create(
)
client = AsyncWhop(
- "2026-09-02-2",
+ "2026-09-06",
idempotency_key="YOUR_IDEMPOTENCY_KEY",
token="YOUR_TOKEN",
)
@@ -766,7 +766,7 @@ async def retrieve(self, id: str, *, request_options: typing.Optional[RequestOpt
from whop_sdk import AsyncWhop
client = AsyncWhop(
- "2026-09-02-2",
+ "2026-09-06",
idempotency_key="YOUR_IDEMPOTENCY_KEY",
token="YOUR_TOKEN",
)
@@ -810,7 +810,7 @@ async def delete(self, id: str, *, request_options: typing.Optional[RequestOptio
from whop_sdk import AsyncWhop
client = AsyncWhop(
- "2026-09-02-2",
+ "2026-09-06",
idempotency_key="YOUR_IDEMPOTENCY_KEY",
token="YOUR_TOKEN",
)
@@ -918,7 +918,7 @@ async def update(
from whop_sdk import AsyncWhop
client = AsyncWhop(
- "2026-09-02-2",
+ "2026-09-06",
idempotency_key="YOUR_IDEMPOTENCY_KEY",
token="YOUR_TOKEN",
)
@@ -979,7 +979,7 @@ async def mark_paid(self, id: str, *, request_options: typing.Optional[RequestOp
from whop_sdk import AsyncWhop
client = AsyncWhop(
- "2026-09-02-2",
+ "2026-09-06",
idempotency_key="YOUR_IDEMPOTENCY_KEY",
token="YOUR_TOKEN",
)
@@ -1023,7 +1023,7 @@ async def mark_uncollectible(self, id: str, *, request_options: typing.Optional[
from whop_sdk import AsyncWhop
client = AsyncWhop(
- "2026-09-02-2",
+ "2026-09-06",
idempotency_key="YOUR_IDEMPOTENCY_KEY",
token="YOUR_TOKEN",
)
@@ -1067,7 +1067,7 @@ async def resend(self, id: str, *, request_options: typing.Optional[RequestOptio
from whop_sdk import AsyncWhop
client = AsyncWhop(
- "2026-09-02-2",
+ "2026-09-06",
idempotency_key="YOUR_IDEMPOTENCY_KEY",
token="YOUR_TOKEN",
)
@@ -1111,7 +1111,7 @@ async def void(self, id: str, *, request_options: typing.Optional[RequestOptions
from whop_sdk import AsyncWhop
client = AsyncWhop(
- "2026-09-02-2",
+ "2026-09-06",
idempotency_key="YOUR_IDEMPOTENCY_KEY",
token="YOUR_TOKEN",
)
diff --git a/src/whop_sdk/leads/client.py b/src/whop_sdk/leads/client.py
index 5741159f..62a68721 100644
--- a/src/whop_sdk/leads/client.py
+++ b/src/whop_sdk/leads/client.py
@@ -93,7 +93,7 @@ def list(
from whop_sdk import Whop
client = Whop(
- "2026-09-02-2",
+ "2026-09-06",
idempotency_key="YOUR_IDEMPOTENCY_KEY",
token="YOUR_TOKEN",
)
@@ -175,7 +175,7 @@ def create(
from whop_sdk import Whop
client = Whop(
- "2026-09-02-2",
+ "2026-09-06",
idempotency_key="YOUR_IDEMPOTENCY_KEY",
token="YOUR_TOKEN",
)
@@ -221,7 +221,7 @@ def retrieve(self, id: str, *, request_options: typing.Optional[RequestOptions]
from whop_sdk import Whop
client = Whop(
- "2026-09-02-2",
+ "2026-09-06",
idempotency_key="YOUR_IDEMPOTENCY_KEY",
token="YOUR_TOKEN",
)
@@ -273,7 +273,7 @@ def update(
from whop_sdk import Whop
client = Whop(
- "2026-09-02-2",
+ "2026-09-06",
idempotency_key="YOUR_IDEMPOTENCY_KEY",
token="YOUR_TOKEN",
)
@@ -364,7 +364,7 @@ async def list(
from whop_sdk import AsyncWhop
client = AsyncWhop(
- "2026-09-02-2",
+ "2026-09-06",
idempotency_key="YOUR_IDEMPOTENCY_KEY",
token="YOUR_TOKEN",
)
@@ -455,7 +455,7 @@ async def create(
from whop_sdk import AsyncWhop
client = AsyncWhop(
- "2026-09-02-2",
+ "2026-09-06",
idempotency_key="YOUR_IDEMPOTENCY_KEY",
token="YOUR_TOKEN",
)
@@ -509,7 +509,7 @@ async def retrieve(self, id: str, *, request_options: typing.Optional[RequestOpt
from whop_sdk import AsyncWhop
client = AsyncWhop(
- "2026-09-02-2",
+ "2026-09-06",
idempotency_key="YOUR_IDEMPOTENCY_KEY",
token="YOUR_TOKEN",
)
@@ -569,7 +569,7 @@ async def update(
from whop_sdk import AsyncWhop
client = AsyncWhop(
- "2026-09-02-2",
+ "2026-09-06",
idempotency_key="YOUR_IDEMPOTENCY_KEY",
token="YOUR_TOKEN",
)
diff --git a/src/whop_sdk/ledger_accounts/client.py b/src/whop_sdk/ledger_accounts/client.py
index c3a59342..57c777f5 100644
--- a/src/whop_sdk/ledger_accounts/client.py
+++ b/src/whop_sdk/ledger_accounts/client.py
@@ -49,7 +49,7 @@ def retrieve(self, id: str, *, request_options: typing.Optional[RequestOptions]
from whop_sdk import Whop
client = Whop(
- "2026-09-02-2",
+ "2026-09-06",
idempotency_key="YOUR_IDEMPOTENCY_KEY",
token="YOUR_TOKEN",
)
@@ -104,7 +104,7 @@ async def retrieve(self, id: str, *, request_options: typing.Optional[RequestOpt
from whop_sdk import AsyncWhop
client = AsyncWhop(
- "2026-09-02-2",
+ "2026-09-06",
idempotency_key="YOUR_IDEMPOTENCY_KEY",
token="YOUR_TOKEN",
)
diff --git a/src/whop_sdk/media/client.py b/src/whop_sdk/media/client.py
index 462c5f0a..c1259666 100644
--- a/src/whop_sdk/media/client.py
+++ b/src/whop_sdk/media/client.py
@@ -75,7 +75,7 @@ def generate(
from whop_sdk import Whop
client = Whop(
- "2026-09-02-2",
+ "2026-09-06",
idempotency_key="YOUR_IDEMPOTENCY_KEY",
token="YOUR_TOKEN",
)
@@ -117,7 +117,7 @@ def retrieve(self, id: str, *, request_options: typing.Optional[RequestOptions]
from whop_sdk import Whop
client = Whop(
- "2026-09-02-2",
+ "2026-09-06",
idempotency_key="YOUR_IDEMPOTENCY_KEY",
token="YOUR_TOKEN",
)
@@ -193,7 +193,7 @@ async def generate(
from whop_sdk import AsyncWhop
client = AsyncWhop(
- "2026-09-02-2",
+ "2026-09-06",
idempotency_key="YOUR_IDEMPOTENCY_KEY",
token="YOUR_TOKEN",
)
@@ -243,7 +243,7 @@ async def retrieve(self, id: str, *, request_options: typing.Optional[RequestOpt
from whop_sdk import AsyncWhop
client = AsyncWhop(
- "2026-09-02-2",
+ "2026-09-06",
idempotency_key="YOUR_IDEMPOTENCY_KEY",
token="YOUR_TOKEN",
)
diff --git a/src/whop_sdk/members/client.py b/src/whop_sdk/members/client.py
index 69a93ac3..06a71c2a 100644
--- a/src/whop_sdk/members/client.py
+++ b/src/whop_sdk/members/client.py
@@ -111,7 +111,7 @@ def list(
from whop_sdk import Whop
client = Whop(
- "2026-09-02-2",
+ "2026-09-06",
idempotency_key="YOUR_IDEMPOTENCY_KEY",
token="YOUR_TOKEN",
)
@@ -163,7 +163,7 @@ def retrieve(self, id: str, *, request_options: typing.Optional[RequestOptions]
from whop_sdk import Whop
client = Whop(
- "2026-09-02-2",
+ "2026-09-06",
idempotency_key="YOUR_IDEMPOTENCY_KEY",
token="YOUR_TOKEN",
)
@@ -277,7 +277,7 @@ async def list(
from whop_sdk import AsyncWhop
client = AsyncWhop(
- "2026-09-02-2",
+ "2026-09-06",
idempotency_key="YOUR_IDEMPOTENCY_KEY",
token="YOUR_TOKEN",
)
@@ -338,7 +338,7 @@ async def retrieve(self, id: str, *, request_options: typing.Optional[RequestOpt
from whop_sdk import AsyncWhop
client = AsyncWhop(
- "2026-09-02-2",
+ "2026-09-06",
idempotency_key="YOUR_IDEMPOTENCY_KEY",
token="YOUR_TOKEN",
)
diff --git a/src/whop_sdk/members/logs/client.py b/src/whop_sdk/members/logs/client.py
index 62d91d93..98ba7366 100644
--- a/src/whop_sdk/members/logs/client.py
+++ b/src/whop_sdk/members/logs/client.py
@@ -68,7 +68,7 @@ def list(
from whop_sdk import Whop
client = Whop(
- "2026-09-02-2",
+ "2026-09-06",
idempotency_key="YOUR_IDEMPOTENCY_KEY",
token="YOUR_TOKEN",
)
@@ -146,7 +146,7 @@ async def list(
from whop_sdk import AsyncWhop
client = AsyncWhop(
- "2026-09-02-2",
+ "2026-09-06",
idempotency_key="YOUR_IDEMPOTENCY_KEY",
token="YOUR_TOKEN",
)
diff --git a/src/whop_sdk/memberships/client.py b/src/whop_sdk/memberships/client.py
index bc28f93b..7f55587c 100644
--- a/src/whop_sdk/memberships/client.py
+++ b/src/whop_sdk/memberships/client.py
@@ -6,7 +6,6 @@
from ..core.pagination import AsyncPager, SyncPager
from ..core.request_options import RequestOptions
from ..types.membership import Membership
-from ..types.membership_legacy import MembershipLegacy
from .raw_client import AsyncRawMembershipsClient, RawMembershipsClient
from .types.invite_memberships_request_body import InviteMembershipsRequestBody
from .types.invite_memberships_response import InviteMembershipsResponse
@@ -110,7 +109,7 @@ def list(
from whop_sdk import Whop
client = Whop(
- "2026-09-02-2",
+ "2026-09-06",
idempotency_key="YOUR_IDEMPOTENCY_KEY",
token="YOUR_TOKEN",
)
@@ -162,7 +161,7 @@ def invite(
from whop_sdk.memberships import InviteMembershipsRequestBodyUserId
client = Whop(
- "2026-09-02-2",
+ "2026-09-06",
idempotency_key="YOUR_IDEMPOTENCY_KEY",
token="YOUR_TOKEN",
)
@@ -198,7 +197,7 @@ def retrieve(self, id: str, *, request_options: typing.Optional[RequestOptions]
from whop_sdk import Whop
client = Whop(
- "2026-09-02-2",
+ "2026-09-06",
idempotency_key="YOUR_IDEMPOTENCY_KEY",
token="YOUR_TOKEN",
)
@@ -244,7 +243,7 @@ def update(
from whop_sdk import Whop
client = Whop(
- "2026-09-02-2",
+ "2026-09-06",
idempotency_key="YOUR_IDEMPOTENCY_KEY",
token="YOUR_TOKEN",
)
@@ -257,50 +256,6 @@ def update(
)
return _response.data
- def add_free_days_membership(
- self, id: str, *, free_days: int, request_options: typing.Optional[RequestOptions] = None
- ) -> MembershipLegacy:
- """
- 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`
-
- Parameters
- ----------
- id : str
- The unique identifier of the membership.
-
- free_days : int
- The number of free days to add (1-1095). Extends the billing period, expiration date, or Stripe trial depending on plan type.
-
- request_options : typing.Optional[RequestOptions]
- Request-specific configuration.
-
- Returns
- -------
- MembershipLegacy
- A successful response
-
- Examples
- --------
- from whop_sdk import Whop
-
- client = Whop(
- "2026-09-02-2",
- idempotency_key="YOUR_IDEMPOTENCY_KEY",
- token="YOUR_TOKEN",
- )
- client.memberships.add_free_days_membership(
- id="mem_xxxxxxxxxxxxxx",
- free_days=42,
- )
- """
- _response = self._raw_client.add_free_days_membership(id, free_days=free_days, request_options=request_options)
- return _response.data
-
def cancel(
self,
id: str,
@@ -336,7 +291,7 @@ def cancel(
from whop_sdk import Whop
client = Whop(
- "2026-09-02-2",
+ "2026-09-06",
idempotency_key="YOUR_IDEMPOTENCY_KEY",
token="YOUR_TOKEN",
)
@@ -374,7 +329,7 @@ def extend(self, id: str, *, days: int, request_options: typing.Optional[Request
from whop_sdk import Whop
client = Whop(
- "2026-09-02-2",
+ "2026-09-06",
idempotency_key="YOUR_IDEMPOTENCY_KEY",
token="YOUR_TOKEN",
)
@@ -413,7 +368,7 @@ def pause(
from whop_sdk import Whop
client = Whop(
- "2026-09-02-2",
+ "2026-09-06",
idempotency_key="YOUR_IDEMPOTENCY_KEY",
token="YOUR_TOKEN",
)
@@ -446,7 +401,7 @@ def resume(self, id: str, *, request_options: typing.Optional[RequestOptions] =
from whop_sdk import Whop
client = Whop(
- "2026-09-02-2",
+ "2026-09-06",
idempotency_key="YOUR_IDEMPOTENCY_KEY",
token="YOUR_TOKEN",
)
@@ -457,44 +412,37 @@ def resume(self, id: str, *, request_options: typing.Optional[RequestOptions] =
_response = self._raw_client.resume(id, request_options=request_options)
return _response.data
- def resync_access_membership(
- self, id: str, *, request_options: typing.Optional[RequestOptions] = None
- ) -> MembershipLegacy:
+ def resync_access(self, id: str, *, request_options: typing.Optional[RequestOptions] = None) -> Membership:
"""
- Re-run access fulfillment for a membership. Recomputes the member's content access on Whop, re-validates their Discord link (re-adding them to the server and re-assigning roles if needed), and re-fulfills TradingView indicator access. Telegram access is invite-based and cannot be resynced here. The outcome is written to the membership's logs.
-
- Required permissions:
- - `membership:resync_access`
- - `member:email:read`
- - `member:basic:read`
+ Re-runs access fulfillment for a membership: recomputes the member's content access on Whop, re-validates their Discord link (re-adding them to the server and re-assigning roles if needed), and re-fulfills TradingView indicator access. Telegram access is invite-based and is not resynced. The work runs in the background and the outcome is written to the membership's logs.
Parameters
----------
id : str
- The unique identifier of the membership to resync access for.
+ Membership ID (`mem_` tag).
request_options : typing.Optional[RequestOptions]
Request-specific configuration.
Returns
-------
- MembershipLegacy
- A successful response
+ Membership
+ access resync queued
Examples
--------
from whop_sdk import Whop
client = Whop(
- "2026-09-02-2",
+ "2026-09-06",
idempotency_key="YOUR_IDEMPOTENCY_KEY",
token="YOUR_TOKEN",
)
- client.memberships.resync_access_membership(
- id="mem_xxxxxxxxxxxxxx",
+ client.memberships.resync_access(
+ id="id",
)
"""
- _response = self._raw_client.resync_access_membership(id, request_options=request_options)
+ _response = self._raw_client.resync_access(id, request_options=request_options)
return _response.data
def transfer(
@@ -521,7 +469,7 @@ def transfer(
from whop_sdk import Whop
client = Whop(
- "2026-09-02-2",
+ "2026-09-06",
idempotency_key="YOUR_IDEMPOTENCY_KEY",
token="YOUR_TOKEN",
)
@@ -532,46 +480,6 @@ def transfer(
_response = self._raw_client.transfer(id, request_options=request_options)
return _response.data
- def uncancel_membership(
- self, id: str, *, request_options: typing.Optional[RequestOptions] = None
- ) -> MembershipLegacy:
- """
- Reverse a pending cancellation for a membership that was scheduled to cancel at period end.
-
- Required permissions:
- - `member:manage`
- - `member:email:read`
- - `member:basic:read`
-
- Parameters
- ----------
- id : str
- The unique identifier of the membership to uncancel.
-
- request_options : typing.Optional[RequestOptions]
- Request-specific configuration.
-
- Returns
- -------
- MembershipLegacy
- A successful response
-
- Examples
- --------
- from whop_sdk import Whop
-
- client = Whop(
- "2026-09-02-2",
- idempotency_key="YOUR_IDEMPOTENCY_KEY",
- token="YOUR_TOKEN",
- )
- client.memberships.uncancel_membership(
- id="mem_xxxxxxxxxxxxxx",
- )
- """
- _response = self._raw_client.uncancel_membership(id, request_options=request_options)
- return _response.data
-
class AsyncMembershipsClient:
def __init__(self, *, client_wrapper: AsyncClientWrapper):
@@ -665,7 +573,7 @@ async def list(
from whop_sdk import AsyncWhop
client = AsyncWhop(
- "2026-09-02-2",
+ "2026-09-06",
idempotency_key="YOUR_IDEMPOTENCY_KEY",
token="YOUR_TOKEN",
)
@@ -726,7 +634,7 @@ async def invite(
from whop_sdk.memberships import InviteMembershipsRequestBodyUserId
client = AsyncWhop(
- "2026-09-02-2",
+ "2026-09-06",
idempotency_key="YOUR_IDEMPOTENCY_KEY",
token="YOUR_TOKEN",
)
@@ -770,7 +678,7 @@ async def retrieve(self, id: str, *, request_options: typing.Optional[RequestOpt
from whop_sdk import AsyncWhop
client = AsyncWhop(
- "2026-09-02-2",
+ "2026-09-06",
idempotency_key="YOUR_IDEMPOTENCY_KEY",
token="YOUR_TOKEN",
)
@@ -824,7 +732,7 @@ async def update(
from whop_sdk import AsyncWhop
client = AsyncWhop(
- "2026-09-02-2",
+ "2026-09-06",
idempotency_key="YOUR_IDEMPOTENCY_KEY",
token="YOUR_TOKEN",
)
@@ -843,60 +751,6 @@ async def main() -> None:
)
return _response.data
- async def add_free_days_membership(
- self, id: str, *, free_days: int, request_options: typing.Optional[RequestOptions] = None
- ) -> MembershipLegacy:
- """
- 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`
-
- Parameters
- ----------
- id : str
- The unique identifier of the membership.
-
- free_days : int
- The number of free days to add (1-1095). Extends the billing period, expiration date, or Stripe trial depending on plan type.
-
- request_options : typing.Optional[RequestOptions]
- Request-specific configuration.
-
- Returns
- -------
- MembershipLegacy
- A successful response
-
- Examples
- --------
- import asyncio
-
- from whop_sdk import AsyncWhop
-
- client = AsyncWhop(
- "2026-09-02-2",
- idempotency_key="YOUR_IDEMPOTENCY_KEY",
- token="YOUR_TOKEN",
- )
-
-
- async def main() -> None:
- await client.memberships.add_free_days_membership(
- id="mem_xxxxxxxxxxxxxx",
- free_days=42,
- )
-
-
- asyncio.run(main())
- """
- _response = await self._raw_client.add_free_days_membership(
- id, free_days=free_days, request_options=request_options
- )
- return _response.data
-
async def cancel(
self,
id: str,
@@ -934,7 +788,7 @@ async def cancel(
from whop_sdk import AsyncWhop
client = AsyncWhop(
- "2026-09-02-2",
+ "2026-09-06",
idempotency_key="YOUR_IDEMPOTENCY_KEY",
token="YOUR_TOKEN",
)
@@ -982,7 +836,7 @@ async def extend(
from whop_sdk import AsyncWhop
client = AsyncWhop(
- "2026-09-02-2",
+ "2026-09-06",
idempotency_key="YOUR_IDEMPOTENCY_KEY",
token="YOUR_TOKEN",
)
@@ -1029,7 +883,7 @@ async def pause(
from whop_sdk import AsyncWhop
client = AsyncWhop(
- "2026-09-02-2",
+ "2026-09-06",
idempotency_key="YOUR_IDEMPOTENCY_KEY",
token="YOUR_TOKEN",
)
@@ -1070,7 +924,7 @@ async def resume(self, id: str, *, request_options: typing.Optional[RequestOptio
from whop_sdk import AsyncWhop
client = AsyncWhop(
- "2026-09-02-2",
+ "2026-09-06",
idempotency_key="YOUR_IDEMPOTENCY_KEY",
token="YOUR_TOKEN",
)
@@ -1087,29 +941,22 @@ async def main() -> None:
_response = await self._raw_client.resume(id, request_options=request_options)
return _response.data
- async def resync_access_membership(
- self, id: str, *, request_options: typing.Optional[RequestOptions] = None
- ) -> MembershipLegacy:
+ async def resync_access(self, id: str, *, request_options: typing.Optional[RequestOptions] = None) -> Membership:
"""
- Re-run access fulfillment for a membership. Recomputes the member's content access on Whop, re-validates their Discord link (re-adding them to the server and re-assigning roles if needed), and re-fulfills TradingView indicator access. Telegram access is invite-based and cannot be resynced here. The outcome is written to the membership's logs.
-
- Required permissions:
- - `membership:resync_access`
- - `member:email:read`
- - `member:basic:read`
+ Re-runs access fulfillment for a membership: recomputes the member's content access on Whop, re-validates their Discord link (re-adding them to the server and re-assigning roles if needed), and re-fulfills TradingView indicator access. Telegram access is invite-based and is not resynced. The work runs in the background and the outcome is written to the membership's logs.
Parameters
----------
id : str
- The unique identifier of the membership to resync access for.
+ Membership ID (`mem_` tag).
request_options : typing.Optional[RequestOptions]
Request-specific configuration.
Returns
-------
- MembershipLegacy
- A successful response
+ Membership
+ access resync queued
Examples
--------
@@ -1118,21 +965,21 @@ async def resync_access_membership(
from whop_sdk import AsyncWhop
client = AsyncWhop(
- "2026-09-02-2",
+ "2026-09-06",
idempotency_key="YOUR_IDEMPOTENCY_KEY",
token="YOUR_TOKEN",
)
async def main() -> None:
- await client.memberships.resync_access_membership(
- id="mem_xxxxxxxxxxxxxx",
+ await client.memberships.resync_access(
+ id="id",
)
asyncio.run(main())
"""
- _response = await self._raw_client.resync_access_membership(id, request_options=request_options)
+ _response = await self._raw_client.resync_access(id, request_options=request_options)
return _response.data
async def transfer(
@@ -1161,7 +1008,7 @@ async def transfer(
from whop_sdk import AsyncWhop
client = AsyncWhop(
- "2026-09-02-2",
+ "2026-09-06",
idempotency_key="YOUR_IDEMPOTENCY_KEY",
token="YOUR_TOKEN",
)
@@ -1177,51 +1024,3 @@ async def main() -> None:
"""
_response = await self._raw_client.transfer(id, request_options=request_options)
return _response.data
-
- async def uncancel_membership(
- self, id: str, *, request_options: typing.Optional[RequestOptions] = None
- ) -> MembershipLegacy:
- """
- Reverse a pending cancellation for a membership that was scheduled to cancel at period end.
-
- Required permissions:
- - `member:manage`
- - `member:email:read`
- - `member:basic:read`
-
- Parameters
- ----------
- id : str
- The unique identifier of the membership to uncancel.
-
- request_options : typing.Optional[RequestOptions]
- Request-specific configuration.
-
- Returns
- -------
- MembershipLegacy
- A successful response
-
- Examples
- --------
- import asyncio
-
- from whop_sdk import AsyncWhop
-
- client = AsyncWhop(
- "2026-09-02-2",
- idempotency_key="YOUR_IDEMPOTENCY_KEY",
- token="YOUR_TOKEN",
- )
-
-
- async def main() -> None:
- await client.memberships.uncancel_membership(
- id="mem_xxxxxxxxxxxxxx",
- )
-
-
- asyncio.run(main())
- """
- _response = await self._raw_client.uncancel_membership(id, request_options=request_options)
- return _response.data
diff --git a/src/whop_sdk/memberships/raw_client.py b/src/whop_sdk/memberships/raw_client.py
index 81efe77b..39d3f8e0 100644
--- a/src/whop_sdk/memberships/raw_client.py
+++ b/src/whop_sdk/memberships/raw_client.py
@@ -15,13 +15,9 @@
from ..errors.bad_request_error import BadRequestError
from ..errors.conflict_error import ConflictError
from ..errors.forbidden_error import ForbiddenError
-from ..errors.internal_server_error import InternalServerError
from ..errors.not_found_error import NotFoundError
-from ..errors.too_many_requests_error import TooManyRequestsError
from ..errors.unauthorized_error import UnauthorizedError
-from ..errors.unprocessable_entity_error import UnprocessableEntityError
from ..types.membership import Membership
-from ..types.membership_legacy import MembershipLegacy
from ..types.v1error_response import V1ErrorResponse
from .types.invite_memberships_request_body import InviteMembershipsRequestBody
from .types.invite_memberships_response import InviteMembershipsResponse
@@ -463,141 +459,6 @@ def update(
)
raise ApiError(status_code=_response.status_code, headers=dict(_response.headers), body=_response_json)
- def add_free_days_membership(
- self, id: str, *, free_days: int, request_options: typing.Optional[RequestOptions] = None
- ) -> HttpResponse[MembershipLegacy]:
- """
- 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`
-
- Parameters
- ----------
- id : str
- The unique identifier of the membership.
-
- free_days : int
- The number of free days to add (1-1095). Extends the billing period, expiration date, or Stripe trial depending on plan type.
-
- request_options : typing.Optional[RequestOptions]
- Request-specific configuration.
-
- Returns
- -------
- HttpResponse[MembershipLegacy]
- A successful response
- """
- _response = self._client_wrapper.httpx_client.request(
- f"memberships/{encode_path_param(id)}/add_free_days",
- method="POST",
- json={
- "free_days": free_days,
- },
- headers={
- "content-type": "application/json",
- },
- request_options=request_options,
- omit=OMIT,
- )
- try:
- if 200 <= _response.status_code < 300:
- _data = typing.cast(
- MembershipLegacy,
- parse_obj_as(
- type_=MembershipLegacy, # type: ignore
- object_=_response.json(),
- ),
- )
- return HttpResponse(response=_response, data=_data)
- if _response.status_code == 400:
- raise BadRequestError(
- headers=dict(_response.headers),
- body=typing.cast(
- typing.Any,
- parse_obj_as(
- type_=typing.Any, # type: ignore
- object_=_response.json(),
- ),
- ),
- )
- if _response.status_code == 401:
- raise UnauthorizedError(
- headers=dict(_response.headers),
- body=typing.cast(
- typing.Any,
- parse_obj_as(
- type_=typing.Any, # type: ignore
- object_=_response.json(),
- ),
- ),
- )
- if _response.status_code == 403:
- raise ForbiddenError(
- headers=dict(_response.headers),
- body=typing.cast(
- typing.Any,
- parse_obj_as(
- type_=typing.Any, # type: ignore
- object_=_response.json(),
- ),
- ),
- )
- if _response.status_code == 404:
- raise NotFoundError(
- headers=dict(_response.headers),
- body=typing.cast(
- typing.Any,
- parse_obj_as(
- type_=typing.Any, # type: ignore
- object_=_response.json(),
- ),
- ),
- )
- if _response.status_code == 422:
- raise UnprocessableEntityError(
- headers=dict(_response.headers),
- body=typing.cast(
- typing.Any,
- parse_obj_as(
- type_=typing.Any, # type: ignore
- object_=_response.json(),
- ),
- ),
- )
- if _response.status_code == 429:
- raise TooManyRequestsError(
- headers=dict(_response.headers),
- body=typing.cast(
- typing.Any,
- parse_obj_as(
- type_=typing.Any, # type: ignore
- object_=_response.json(),
- ),
- ),
- )
- if _response.status_code == 500:
- raise InternalServerError(
- headers=dict(_response.headers),
- body=typing.cast(
- typing.Any,
- parse_obj_as(
- type_=typing.Any, # type: ignore
- object_=_response.json(),
- ),
- ),
- )
- _response_json = _response.json()
- except JSONDecodeError:
- raise ApiError(status_code=_response.status_code, headers=dict(_response.headers), body=_response.text)
- except ValidationError as e:
- raise ParsingError(
- status_code=_response.status_code, headers=dict(_response.headers), body=_response.json(), cause=e
- )
- raise ApiError(status_code=_response.status_code, headers=dict(_response.headers), body=_response_json)
-
def cancel(
self,
id: str,
@@ -939,29 +800,24 @@ def resume(self, id: str, *, request_options: typing.Optional[RequestOptions] =
)
raise ApiError(status_code=_response.status_code, headers=dict(_response.headers), body=_response_json)
- def resync_access_membership(
+ def resync_access(
self, id: str, *, request_options: typing.Optional[RequestOptions] = None
- ) -> HttpResponse[MembershipLegacy]:
+ ) -> HttpResponse[Membership]:
"""
- Re-run access fulfillment for a membership. Recomputes the member's content access on Whop, re-validates their Discord link (re-adding them to the server and re-assigning roles if needed), and re-fulfills TradingView indicator access. Telegram access is invite-based and cannot be resynced here. The outcome is written to the membership's logs.
-
- Required permissions:
- - `membership:resync_access`
- - `member:email:read`
- - `member:basic:read`
+ Re-runs access fulfillment for a membership: recomputes the member's content access on Whop, re-validates their Discord link (re-adding them to the server and re-assigning roles if needed), and re-fulfills TradingView indicator access. Telegram access is invite-based and is not resynced. The work runs in the background and the outcome is written to the membership's logs.
Parameters
----------
id : str
- The unique identifier of the membership to resync access for.
+ Membership ID (`mem_` tag).
request_options : typing.Optional[RequestOptions]
Request-specific configuration.
Returns
-------
- HttpResponse[MembershipLegacy]
- A successful response
+ HttpResponse[Membership]
+ access resync queued
"""
_response = self._client_wrapper.httpx_client.request(
f"memberships/{encode_path_param(id)}/resync_access",
@@ -971,9 +827,9 @@ def resync_access_membership(
try:
if 200 <= _response.status_code < 300:
_data = typing.cast(
- MembershipLegacy,
+ Membership,
parse_obj_as(
- type_=MembershipLegacy, # type: ignore
+ type_=Membership, # type: ignore
object_=_response.json(),
),
)
@@ -989,17 +845,6 @@ def resync_access_membership(
),
),
)
- if _response.status_code == 401:
- raise UnauthorizedError(
- headers=dict(_response.headers),
- body=typing.cast(
- typing.Any,
- parse_obj_as(
- type_=typing.Any, # type: ignore
- object_=_response.json(),
- ),
- ),
- )
if _response.status_code == 403:
raise ForbiddenError(
headers=dict(_response.headers),
@@ -1011,46 +856,13 @@ def resync_access_membership(
),
),
)
- if _response.status_code == 404:
- raise NotFoundError(
- headers=dict(_response.headers),
- body=typing.cast(
- typing.Any,
- parse_obj_as(
- type_=typing.Any, # type: ignore
- object_=_response.json(),
- ),
- ),
- )
- if _response.status_code == 422:
- raise UnprocessableEntityError(
- headers=dict(_response.headers),
- body=typing.cast(
- typing.Any,
- parse_obj_as(
- type_=typing.Any, # type: ignore
- object_=_response.json(),
- ),
- ),
- )
- if _response.status_code == 429:
- raise TooManyRequestsError(
- headers=dict(_response.headers),
- body=typing.cast(
- typing.Any,
- parse_obj_as(
- type_=typing.Any, # type: ignore
- object_=_response.json(),
- ),
- ),
- )
- if _response.status_code == 500:
- raise InternalServerError(
+ if _response.status_code == 409:
+ raise ConflictError(
headers=dict(_response.headers),
body=typing.cast(
- typing.Any,
+ V1ErrorResponse,
parse_obj_as(
- type_=typing.Any, # type: ignore
+ type_=V1ErrorResponse, # type: ignore
object_=_response.json(),
),
),
@@ -1151,131 +963,6 @@ def transfer(
)
raise ApiError(status_code=_response.status_code, headers=dict(_response.headers), body=_response_json)
- def uncancel_membership(
- self, id: str, *, request_options: typing.Optional[RequestOptions] = None
- ) -> HttpResponse[MembershipLegacy]:
- """
- Reverse a pending cancellation for a membership that was scheduled to cancel at period end.
-
- Required permissions:
- - `member:manage`
- - `member:email:read`
- - `member:basic:read`
-
- Parameters
- ----------
- id : str
- The unique identifier of the membership to uncancel.
-
- request_options : typing.Optional[RequestOptions]
- Request-specific configuration.
-
- Returns
- -------
- HttpResponse[MembershipLegacy]
- A successful response
- """
- _response = self._client_wrapper.httpx_client.request(
- f"memberships/{encode_path_param(id)}/uncancel",
- method="POST",
- request_options=request_options,
- )
- try:
- if 200 <= _response.status_code < 300:
- _data = typing.cast(
- MembershipLegacy,
- parse_obj_as(
- type_=MembershipLegacy, # type: ignore
- object_=_response.json(),
- ),
- )
- return HttpResponse(response=_response, data=_data)
- if _response.status_code == 400:
- raise BadRequestError(
- headers=dict(_response.headers),
- body=typing.cast(
- typing.Any,
- parse_obj_as(
- type_=typing.Any, # type: ignore
- object_=_response.json(),
- ),
- ),
- )
- if _response.status_code == 401:
- raise UnauthorizedError(
- headers=dict(_response.headers),
- body=typing.cast(
- typing.Any,
- parse_obj_as(
- type_=typing.Any, # type: ignore
- object_=_response.json(),
- ),
- ),
- )
- if _response.status_code == 403:
- raise ForbiddenError(
- headers=dict(_response.headers),
- body=typing.cast(
- typing.Any,
- parse_obj_as(
- type_=typing.Any, # type: ignore
- object_=_response.json(),
- ),
- ),
- )
- if _response.status_code == 404:
- raise NotFoundError(
- headers=dict(_response.headers),
- body=typing.cast(
- typing.Any,
- parse_obj_as(
- type_=typing.Any, # type: ignore
- object_=_response.json(),
- ),
- ),
- )
- if _response.status_code == 422:
- raise UnprocessableEntityError(
- headers=dict(_response.headers),
- body=typing.cast(
- typing.Any,
- parse_obj_as(
- type_=typing.Any, # type: ignore
- object_=_response.json(),
- ),
- ),
- )
- if _response.status_code == 429:
- raise TooManyRequestsError(
- headers=dict(_response.headers),
- body=typing.cast(
- typing.Any,
- parse_obj_as(
- type_=typing.Any, # type: ignore
- object_=_response.json(),
- ),
- ),
- )
- if _response.status_code == 500:
- raise InternalServerError(
- headers=dict(_response.headers),
- body=typing.cast(
- typing.Any,
- parse_obj_as(
- type_=typing.Any, # type: ignore
- object_=_response.json(),
- ),
- ),
- )
- _response_json = _response.json()
- except JSONDecodeError:
- raise ApiError(status_code=_response.status_code, headers=dict(_response.headers), body=_response.text)
- except ValidationError as e:
- raise ParsingError(
- status_code=_response.status_code, headers=dict(_response.headers), body=_response.json(), cause=e
- )
- raise ApiError(status_code=_response.status_code, headers=dict(_response.headers), body=_response_json)
-
class AsyncRawMembershipsClient:
def __init__(self, *, client_wrapper: AsyncClientWrapper):
@@ -1566,86 +1253,10 @@ async def retrieve(
"""
Retrieves a membership by ID or license key. Accessible to the account and to the membership's own user.
- Parameters
- ----------
- id : str
- Membership ID (`mem_` tag), or a software license key.
-
- request_options : typing.Optional[RequestOptions]
- Request-specific configuration.
-
- Returns
- -------
- AsyncHttpResponse[Membership]
- membership retrieved with its recorded phone number
- """
- _response = await self._client_wrapper.httpx_client.request(
- f"memberships/{encode_path_param(id)}",
- method="GET",
- request_options=request_options,
- )
- try:
- if 200 <= _response.status_code < 300:
- _data = typing.cast(
- Membership,
- parse_obj_as(
- type_=Membership, # type: ignore
- object_=_response.json(),
- ),
- )
- return AsyncHttpResponse(response=_response, data=_data)
- if _response.status_code == 403:
- raise ForbiddenError(
- headers=dict(_response.headers),
- body=typing.cast(
- typing.Any,
- parse_obj_as(
- type_=typing.Any, # type: ignore
- object_=_response.json(),
- ),
- ),
- )
- if _response.status_code == 404:
- raise NotFoundError(
- headers=dict(_response.headers),
- body=typing.cast(
- typing.Any,
- parse_obj_as(
- type_=typing.Any, # type: ignore
- object_=_response.json(),
- ),
- ),
- )
- _response_json = _response.json()
- except JSONDecodeError:
- raise ApiError(status_code=_response.status_code, headers=dict(_response.headers), body=_response.text)
- except ValidationError as e:
- raise ParsingError(
- status_code=_response.status_code, headers=dict(_response.headers), body=_response.json(), cause=e
- )
- raise ApiError(status_code=_response.status_code, headers=dict(_response.headers), body=_response_json)
-
- async def update(
- self,
- id: str,
- *,
- cancel_at_period_end: typing.Optional[bool] = OMIT,
- metadata: typing.Optional[typing.Dict[str, typing.Any]] = OMIT,
- request_options: typing.Optional[RequestOptions] = None,
- ) -> AsyncHttpResponse[Membership]:
- """
- Updates a membership: merge metadata key-value pairs, or toggle `cancel_at_period_end` — `true` schedules the cancellation for the end of the current billing period, `false` reverses a pending one.
-
- Parameters
- ----------
- id : str
- Membership ID (`mem_` tag), or a software license key.
-
- cancel_at_period_end : typing.Optional[bool]
- `true` cancels at the end of the current billing period (the customer keeps access until then); `false` reverses a pending cancellation.
-
- metadata : typing.Optional[typing.Dict[str, typing.Any]]
- Key-value pairs to merge into the membership's metadata. Pass an empty object to clear it.
+ Parameters
+ ----------
+ id : str
+ Membership ID (`mem_` tag), or a software license key.
request_options : typing.Optional[RequestOptions]
Request-specific configuration.
@@ -1653,20 +1264,12 @@ async def update(
Returns
-------
AsyncHttpResponse[Membership]
- membership updated
+ membership retrieved with its recorded phone number
"""
_response = await self._client_wrapper.httpx_client.request(
f"memberships/{encode_path_param(id)}",
- method="PATCH",
- json={
- "cancel_at_period_end": cancel_at_period_end,
- "metadata": metadata,
- },
- headers={
- "content-type": "application/json",
- },
+ method="GET",
request_options=request_options,
- omit=OMIT,
)
try:
if 200 <= _response.status_code < 300:
@@ -1678,8 +1281,8 @@ async def update(
),
)
return AsyncHttpResponse(response=_response, data=_data)
- if _response.status_code == 400:
- raise BadRequestError(
+ if _response.status_code == 403:
+ raise ForbiddenError(
headers=dict(_response.headers),
body=typing.cast(
typing.Any,
@@ -1689,8 +1292,8 @@ async def update(
),
),
)
- if _response.status_code == 403:
- raise ForbiddenError(
+ if _response.status_code == 404:
+ raise NotFoundError(
headers=dict(_response.headers),
body=typing.cast(
typing.Any,
@@ -1709,38 +1312,42 @@ async def update(
)
raise ApiError(status_code=_response.status_code, headers=dict(_response.headers), body=_response_json)
- async def add_free_days_membership(
- self, id: str, *, free_days: int, request_options: typing.Optional[RequestOptions] = None
- ) -> AsyncHttpResponse[MembershipLegacy]:
+ async def update(
+ self,
+ id: str,
+ *,
+ cancel_at_period_end: typing.Optional[bool] = OMIT,
+ metadata: typing.Optional[typing.Dict[str, typing.Any]] = OMIT,
+ request_options: typing.Optional[RequestOptions] = None,
+ ) -> AsyncHttpResponse[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`
+ Updates a membership: merge metadata key-value pairs, or toggle `cancel_at_period_end` — `true` schedules the cancellation for the end of the current billing period, `false` reverses a pending one.
Parameters
----------
id : str
- The unique identifier of the membership.
+ Membership ID (`mem_` tag), or a software license key.
+
+ cancel_at_period_end : typing.Optional[bool]
+ `true` cancels at the end of the current billing period (the customer keeps access until then); `false` reverses a pending cancellation.
- free_days : int
- The number of free days to add (1-1095). Extends the billing period, expiration date, or Stripe trial depending on plan type.
+ metadata : typing.Optional[typing.Dict[str, typing.Any]]
+ Key-value pairs to merge into the membership's metadata. Pass an empty object to clear it.
request_options : typing.Optional[RequestOptions]
Request-specific configuration.
Returns
-------
- AsyncHttpResponse[MembershipLegacy]
- A successful response
+ AsyncHttpResponse[Membership]
+ membership updated
"""
_response = await self._client_wrapper.httpx_client.request(
- f"memberships/{encode_path_param(id)}/add_free_days",
- method="POST",
+ f"memberships/{encode_path_param(id)}",
+ method="PATCH",
json={
- "free_days": free_days,
+ "cancel_at_period_end": cancel_at_period_end,
+ "metadata": metadata,
},
headers={
"content-type": "application/json",
@@ -1751,9 +1358,9 @@ async def add_free_days_membership(
try:
if 200 <= _response.status_code < 300:
_data = typing.cast(
- MembershipLegacy,
+ Membership,
parse_obj_as(
- type_=MembershipLegacy, # type: ignore
+ type_=Membership, # type: ignore
object_=_response.json(),
),
)
@@ -1769,17 +1376,6 @@ async def add_free_days_membership(
),
),
)
- if _response.status_code == 401:
- raise UnauthorizedError(
- headers=dict(_response.headers),
- body=typing.cast(
- typing.Any,
- parse_obj_as(
- type_=typing.Any, # type: ignore
- object_=_response.json(),
- ),
- ),
- )
if _response.status_code == 403:
raise ForbiddenError(
headers=dict(_response.headers),
@@ -1791,50 +1387,6 @@ async def add_free_days_membership(
),
),
)
- if _response.status_code == 404:
- raise NotFoundError(
- headers=dict(_response.headers),
- body=typing.cast(
- typing.Any,
- parse_obj_as(
- type_=typing.Any, # type: ignore
- object_=_response.json(),
- ),
- ),
- )
- if _response.status_code == 422:
- raise UnprocessableEntityError(
- headers=dict(_response.headers),
- body=typing.cast(
- typing.Any,
- parse_obj_as(
- type_=typing.Any, # type: ignore
- object_=_response.json(),
- ),
- ),
- )
- if _response.status_code == 429:
- raise TooManyRequestsError(
- headers=dict(_response.headers),
- body=typing.cast(
- typing.Any,
- parse_obj_as(
- type_=typing.Any, # type: ignore
- object_=_response.json(),
- ),
- ),
- )
- if _response.status_code == 500:
- raise InternalServerError(
- headers=dict(_response.headers),
- body=typing.cast(
- typing.Any,
- parse_obj_as(
- type_=typing.Any, # type: ignore
- object_=_response.json(),
- ),
- ),
- )
_response_json = _response.json()
except JSONDecodeError:
raise ApiError(status_code=_response.status_code, headers=dict(_response.headers), body=_response.text)
@@ -2187,29 +1739,24 @@ async def resume(
)
raise ApiError(status_code=_response.status_code, headers=dict(_response.headers), body=_response_json)
- async def resync_access_membership(
+ async def resync_access(
self, id: str, *, request_options: typing.Optional[RequestOptions] = None
- ) -> AsyncHttpResponse[MembershipLegacy]:
+ ) -> AsyncHttpResponse[Membership]:
"""
- Re-run access fulfillment for a membership. Recomputes the member's content access on Whop, re-validates their Discord link (re-adding them to the server and re-assigning roles if needed), and re-fulfills TradingView indicator access. Telegram access is invite-based and cannot be resynced here. The outcome is written to the membership's logs.
-
- Required permissions:
- - `membership:resync_access`
- - `member:email:read`
- - `member:basic:read`
+ Re-runs access fulfillment for a membership: recomputes the member's content access on Whop, re-validates their Discord link (re-adding them to the server and re-assigning roles if needed), and re-fulfills TradingView indicator access. Telegram access is invite-based and is not resynced. The work runs in the background and the outcome is written to the membership's logs.
Parameters
----------
id : str
- The unique identifier of the membership to resync access for.
+ Membership ID (`mem_` tag).
request_options : typing.Optional[RequestOptions]
Request-specific configuration.
Returns
-------
- AsyncHttpResponse[MembershipLegacy]
- A successful response
+ AsyncHttpResponse[Membership]
+ access resync queued
"""
_response = await self._client_wrapper.httpx_client.request(
f"memberships/{encode_path_param(id)}/resync_access",
@@ -2219,9 +1766,9 @@ async def resync_access_membership(
try:
if 200 <= _response.status_code < 300:
_data = typing.cast(
- MembershipLegacy,
+ Membership,
parse_obj_as(
- type_=MembershipLegacy, # type: ignore
+ type_=Membership, # type: ignore
object_=_response.json(),
),
)
@@ -2237,17 +1784,6 @@ async def resync_access_membership(
),
),
)
- if _response.status_code == 401:
- raise UnauthorizedError(
- headers=dict(_response.headers),
- body=typing.cast(
- typing.Any,
- parse_obj_as(
- type_=typing.Any, # type: ignore
- object_=_response.json(),
- ),
- ),
- )
if _response.status_code == 403:
raise ForbiddenError(
headers=dict(_response.headers),
@@ -2259,46 +1795,13 @@ async def resync_access_membership(
),
),
)
- if _response.status_code == 404:
- raise NotFoundError(
- headers=dict(_response.headers),
- body=typing.cast(
- typing.Any,
- parse_obj_as(
- type_=typing.Any, # type: ignore
- object_=_response.json(),
- ),
- ),
- )
- if _response.status_code == 422:
- raise UnprocessableEntityError(
- headers=dict(_response.headers),
- body=typing.cast(
- typing.Any,
- parse_obj_as(
- type_=typing.Any, # type: ignore
- object_=_response.json(),
- ),
- ),
- )
- if _response.status_code == 429:
- raise TooManyRequestsError(
- headers=dict(_response.headers),
- body=typing.cast(
- typing.Any,
- parse_obj_as(
- type_=typing.Any, # type: ignore
- object_=_response.json(),
- ),
- ),
- )
- if _response.status_code == 500:
- raise InternalServerError(
+ if _response.status_code == 409:
+ raise ConflictError(
headers=dict(_response.headers),
body=typing.cast(
- typing.Any,
+ V1ErrorResponse,
parse_obj_as(
- type_=typing.Any, # type: ignore
+ type_=V1ErrorResponse, # type: ignore
object_=_response.json(),
),
),
@@ -2398,128 +1901,3 @@ async def transfer(
status_code=_response.status_code, headers=dict(_response.headers), body=_response.json(), cause=e
)
raise ApiError(status_code=_response.status_code, headers=dict(_response.headers), body=_response_json)
-
- async def uncancel_membership(
- self, id: str, *, request_options: typing.Optional[RequestOptions] = None
- ) -> AsyncHttpResponse[MembershipLegacy]:
- """
- Reverse a pending cancellation for a membership that was scheduled to cancel at period end.
-
- Required permissions:
- - `member:manage`
- - `member:email:read`
- - `member:basic:read`
-
- Parameters
- ----------
- id : str
- The unique identifier of the membership to uncancel.
-
- request_options : typing.Optional[RequestOptions]
- Request-specific configuration.
-
- Returns
- -------
- AsyncHttpResponse[MembershipLegacy]
- A successful response
- """
- _response = await self._client_wrapper.httpx_client.request(
- f"memberships/{encode_path_param(id)}/uncancel",
- method="POST",
- request_options=request_options,
- )
- try:
- if 200 <= _response.status_code < 300:
- _data = typing.cast(
- MembershipLegacy,
- parse_obj_as(
- type_=MembershipLegacy, # type: ignore
- object_=_response.json(),
- ),
- )
- return AsyncHttpResponse(response=_response, data=_data)
- if _response.status_code == 400:
- raise BadRequestError(
- headers=dict(_response.headers),
- body=typing.cast(
- typing.Any,
- parse_obj_as(
- type_=typing.Any, # type: ignore
- object_=_response.json(),
- ),
- ),
- )
- if _response.status_code == 401:
- raise UnauthorizedError(
- headers=dict(_response.headers),
- body=typing.cast(
- typing.Any,
- parse_obj_as(
- type_=typing.Any, # type: ignore
- object_=_response.json(),
- ),
- ),
- )
- if _response.status_code == 403:
- raise ForbiddenError(
- headers=dict(_response.headers),
- body=typing.cast(
- typing.Any,
- parse_obj_as(
- type_=typing.Any, # type: ignore
- object_=_response.json(),
- ),
- ),
- )
- if _response.status_code == 404:
- raise NotFoundError(
- headers=dict(_response.headers),
- body=typing.cast(
- typing.Any,
- parse_obj_as(
- type_=typing.Any, # type: ignore
- object_=_response.json(),
- ),
- ),
- )
- if _response.status_code == 422:
- raise UnprocessableEntityError(
- headers=dict(_response.headers),
- body=typing.cast(
- typing.Any,
- parse_obj_as(
- type_=typing.Any, # type: ignore
- object_=_response.json(),
- ),
- ),
- )
- if _response.status_code == 429:
- raise TooManyRequestsError(
- headers=dict(_response.headers),
- body=typing.cast(
- typing.Any,
- parse_obj_as(
- type_=typing.Any, # type: ignore
- object_=_response.json(),
- ),
- ),
- )
- if _response.status_code == 500:
- raise InternalServerError(
- headers=dict(_response.headers),
- body=typing.cast(
- typing.Any,
- parse_obj_as(
- type_=typing.Any, # type: ignore
- object_=_response.json(),
- ),
- ),
- )
- _response_json = _response.json()
- except JSONDecodeError:
- raise ApiError(status_code=_response.status_code, headers=dict(_response.headers), body=_response.text)
- except ValidationError as e:
- raise ParsingError(
- status_code=_response.status_code, headers=dict(_response.headers), body=_response.json(), cause=e
- )
- raise ApiError(status_code=_response.status_code, headers=dict(_response.headers), body=_response_json)
diff --git a/src/whop_sdk/messages/client.py b/src/whop_sdk/messages/client.py
index 0bf9159f..f1399a41 100644
--- a/src/whop_sdk/messages/client.py
+++ b/src/whop_sdk/messages/client.py
@@ -84,7 +84,7 @@ def list(
from whop_sdk import Whop
client = Whop(
- "2026-09-02-2",
+ "2026-09-06",
idempotency_key="YOUR_IDEMPOTENCY_KEY",
token="YOUR_TOKEN",
)
@@ -162,7 +162,7 @@ def create(
from whop_sdk import Whop
client = Whop(
- "2026-09-02-2",
+ "2026-09-06",
idempotency_key="YOUR_IDEMPOTENCY_KEY",
token="YOUR_TOKEN",
)
@@ -210,7 +210,7 @@ def retrieve(self, id: str, *, request_options: typing.Optional[RequestOptions]
from whop_sdk import Whop
client = Whop(
- "2026-09-02-2",
+ "2026-09-06",
idempotency_key="YOUR_IDEMPOTENCY_KEY",
token="YOUR_TOKEN",
)
@@ -249,7 +249,7 @@ def delete(self, id: str, *, request_options: typing.Optional[RequestOptions] =
from whop_sdk import Whop
client = Whop(
- "2026-09-02-2",
+ "2026-09-06",
idempotency_key="YOUR_IDEMPOTENCY_KEY",
token="YOUR_TOKEN",
)
@@ -305,7 +305,7 @@ def update(
from whop_sdk import Whop
client = Whop(
- "2026-09-02-2",
+ "2026-09-06",
idempotency_key="YOUR_IDEMPOTENCY_KEY",
token="YOUR_TOKEN",
)
@@ -387,7 +387,7 @@ async def list(
from whop_sdk import AsyncWhop
client = AsyncWhop(
- "2026-09-02-2",
+ "2026-09-06",
idempotency_key="YOUR_IDEMPOTENCY_KEY",
token="YOUR_TOKEN",
)
@@ -474,7 +474,7 @@ async def create(
from whop_sdk import AsyncWhop
client = AsyncWhop(
- "2026-09-02-2",
+ "2026-09-06",
idempotency_key="YOUR_IDEMPOTENCY_KEY",
token="YOUR_TOKEN",
)
@@ -530,7 +530,7 @@ async def retrieve(self, id: str, *, request_options: typing.Optional[RequestOpt
from whop_sdk import AsyncWhop
client = AsyncWhop(
- "2026-09-02-2",
+ "2026-09-06",
idempotency_key="YOUR_IDEMPOTENCY_KEY",
token="YOUR_TOKEN",
)
@@ -577,7 +577,7 @@ async def delete(self, id: str, *, request_options: typing.Optional[RequestOptio
from whop_sdk import AsyncWhop
client = AsyncWhop(
- "2026-09-02-2",
+ "2026-09-06",
idempotency_key="YOUR_IDEMPOTENCY_KEY",
token="YOUR_TOKEN",
)
@@ -641,7 +641,7 @@ async def update(
from whop_sdk import AsyncWhop
client = AsyncWhop(
- "2026-09-02-2",
+ "2026-09-06",
idempotency_key="YOUR_IDEMPOTENCY_KEY",
token="YOUR_TOKEN",
)
diff --git a/src/whop_sdk/notifications/client.py b/src/whop_sdk/notifications/client.py
index 77ea881c..049951c5 100644
--- a/src/whop_sdk/notifications/client.py
+++ b/src/whop_sdk/notifications/client.py
@@ -84,7 +84,7 @@ def list(
from whop_sdk import Whop
client = Whop(
- "2026-09-02-2",
+ "2026-09-06",
idempotency_key="YOUR_IDEMPOTENCY_KEY",
token="YOUR_TOKEN",
)
@@ -160,7 +160,7 @@ def create(
from whop_sdk import Whop
client = Whop(
- "2026-09-02-2",
+ "2026-09-06",
idempotency_key="YOUR_IDEMPOTENCY_KEY",
token="YOUR_TOKEN",
)
@@ -213,7 +213,7 @@ def badges(
from whop_sdk import Whop
client = Whop(
- "2026-09-02-2",
+ "2026-09-06",
idempotency_key="YOUR_IDEMPOTENCY_KEY",
token="YOUR_TOKEN",
)
@@ -257,7 +257,7 @@ def mark_read(
from whop_sdk import Whop
client = Whop(
- "2026-09-02-2",
+ "2026-09-06",
idempotency_key="YOUR_IDEMPOTENCY_KEY",
token="YOUR_TOKEN",
)
@@ -288,7 +288,7 @@ def retrieve(self, id: str, *, request_options: typing.Optional[RequestOptions]
from whop_sdk import Whop
client = Whop(
- "2026-09-02-2",
+ "2026-09-06",
idempotency_key="YOUR_IDEMPOTENCY_KEY",
token="YOUR_TOKEN",
)
@@ -374,7 +374,7 @@ async def list(
from whop_sdk import AsyncWhop
client = AsyncWhop(
- "2026-09-02-2",
+ "2026-09-06",
idempotency_key="YOUR_IDEMPOTENCY_KEY",
token="YOUR_TOKEN",
)
@@ -459,7 +459,7 @@ async def create(
from whop_sdk import AsyncWhop
client = AsyncWhop(
- "2026-09-02-2",
+ "2026-09-06",
idempotency_key="YOUR_IDEMPOTENCY_KEY",
token="YOUR_TOKEN",
)
@@ -520,7 +520,7 @@ async def badges(
from whop_sdk import AsyncWhop
client = AsyncWhop(
- "2026-09-02-2",
+ "2026-09-06",
idempotency_key="YOUR_IDEMPOTENCY_KEY",
token="YOUR_TOKEN",
)
@@ -572,7 +572,7 @@ async def mark_read(
from whop_sdk import AsyncWhop
client = AsyncWhop(
- "2026-09-02-2",
+ "2026-09-06",
idempotency_key="YOUR_IDEMPOTENCY_KEY",
token="YOUR_TOKEN",
)
@@ -613,7 +613,7 @@ async def retrieve(self, id: str, *, request_options: typing.Optional[RequestOpt
from whop_sdk import AsyncWhop
client = AsyncWhop(
- "2026-09-02-2",
+ "2026-09-06",
idempotency_key="YOUR_IDEMPOTENCY_KEY",
token="YOUR_TOKEN",
)
diff --git a/src/whop_sdk/notifications/topics/client.py b/src/whop_sdk/notifications/topics/client.py
index 8d5bb7a0..6a996f57 100644
--- a/src/whop_sdk/notifications/topics/client.py
+++ b/src/whop_sdk/notifications/topics/client.py
@@ -61,7 +61,7 @@ def list(
from whop_sdk import Whop
client = Whop(
- "2026-09-02-2",
+ "2026-09-06",
idempotency_key="YOUR_IDEMPOTENCY_KEY",
token="YOUR_TOKEN",
)
@@ -127,7 +127,7 @@ async def list(
from whop_sdk import AsyncWhop
client = AsyncWhop(
- "2026-09-02-2",
+ "2026-09-06",
idempotency_key="YOUR_IDEMPOTENCY_KEY",
token="YOUR_TOKEN",
)
diff --git a/src/whop_sdk/partners/businesses/client.py b/src/whop_sdk/partners/businesses/client.py
index a754ad63..6bd17144 100644
--- a/src/whop_sdk/partners/businesses/client.py
+++ b/src/whop_sdk/partners/businesses/client.py
@@ -112,7 +112,7 @@ def list(
from whop_sdk import Whop
client = Whop(
- "2026-09-02-2",
+ "2026-09-06",
idempotency_key="YOUR_IDEMPOTENCY_KEY",
token="YOUR_TOKEN",
)
@@ -164,7 +164,7 @@ def retrieve(
from whop_sdk import Whop
client = Whop(
- "2026-09-02-2",
+ "2026-09-06",
idempotency_key="YOUR_IDEMPOTENCY_KEY",
token="YOUR_TOKEN",
)
@@ -278,7 +278,7 @@ async def list(
from whop_sdk import AsyncWhop
client = AsyncWhop(
- "2026-09-02-2",
+ "2026-09-06",
idempotency_key="YOUR_IDEMPOTENCY_KEY",
token="YOUR_TOKEN",
)
@@ -339,7 +339,7 @@ async def retrieve(
from whop_sdk import AsyncWhop
client = AsyncWhop(
- "2026-09-02-2",
+ "2026-09-06",
idempotency_key="YOUR_IDEMPOTENCY_KEY",
token="YOUR_TOKEN",
)
diff --git a/src/whop_sdk/partners/businesses/earnings/client.py b/src/whop_sdk/partners/businesses/earnings/client.py
index a07e9cb0..808b1349 100644
--- a/src/whop_sdk/partners/businesses/earnings/client.py
+++ b/src/whop_sdk/partners/businesses/earnings/client.py
@@ -94,7 +94,7 @@ def list(
from whop_sdk import Whop
client = Whop(
- "2026-09-02-2",
+ "2026-09-06",
idempotency_key="YOUR_IDEMPOTENCY_KEY",
token="YOUR_TOKEN",
)
@@ -205,7 +205,7 @@ async def list(
from whop_sdk import AsyncWhop
client = AsyncWhop(
- "2026-09-02-2",
+ "2026-09-06",
idempotency_key="YOUR_IDEMPOTENCY_KEY",
token="YOUR_TOKEN",
)
diff --git a/src/whop_sdk/partners/businesses/types/list_businesses_request_order.py b/src/whop_sdk/partners/businesses/types/list_businesses_request_order.py
index 52f120db..fcef61d7 100644
--- a/src/whop_sdk/partners/businesses/types/list_businesses_request_order.py
+++ b/src/whop_sdk/partners/businesses/types/list_businesses_request_order.py
@@ -4,7 +4,13 @@
ListBusinessesRequestOrder = typing.Union[
typing.Literal[
- "created_at", "referral_started_at", "referral_expires_at", "payout_percentage", "volume_usd", "earnings_usd"
+ "created_at",
+ "referral_started_at",
+ "referral_expires_at",
+ "payout_percentage",
+ "volume_usd",
+ "volume_30d_usd",
+ "earnings_usd",
],
typing.Any,
]
diff --git a/src/whop_sdk/partners/businesses/types/list_businesses_response_data_item_volume_usd.py b/src/whop_sdk/partners/businesses/types/list_businesses_response_data_item_volume_usd.py
index bf0fcda5..3a480ca8 100644
--- a/src/whop_sdk/partners/businesses/types/list_businesses_response_data_item_volume_usd.py
+++ b/src/whop_sdk/partners/businesses/types/list_businesses_response_data_item_volume_usd.py
@@ -3,7 +3,9 @@
import typing
import pydantic
+import typing_extensions
from ....core.pydantic_utilities import IS_PYDANTIC_V2, UniversalBaseModel
+from ....core.serialization import FieldMetadata
class ListBusinessesResponseDataItemVolumeUsd(UniversalBaseModel):
@@ -17,6 +19,18 @@ class ListBusinessesResponseDataItemVolumeUsd(UniversalBaseModel):
GMV awaiting settlement (commission not yet computed), in USD.
"""
+ last30d: typing_extensions.Annotated[
+ str,
+ FieldMetadata(alias="last_30d"),
+ pydantic.Field(
+ alias="last_30d",
+ description="Credited GMV from the trailing 30 days (awaiting_settlement + settled), in USD.",
+ ),
+ ]
+ """
+ Credited GMV from the trailing 30 days (awaiting_settlement + settled), in USD.
+ """
+
settled: str = pydantic.Field()
"""
GMV of pending + completed payments, in USD.
diff --git a/src/whop_sdk/partners/businesses/types/retrieve_businesses_response_volume_usd.py b/src/whop_sdk/partners/businesses/types/retrieve_businesses_response_volume_usd.py
index 009eada6..9eef7e15 100644
--- a/src/whop_sdk/partners/businesses/types/retrieve_businesses_response_volume_usd.py
+++ b/src/whop_sdk/partners/businesses/types/retrieve_businesses_response_volume_usd.py
@@ -3,7 +3,9 @@
import typing
import pydantic
+import typing_extensions
from ....core.pydantic_utilities import IS_PYDANTIC_V2, UniversalBaseModel
+from ....core.serialization import FieldMetadata
class RetrieveBusinessesResponseVolumeUsd(UniversalBaseModel):
@@ -17,6 +19,18 @@ class RetrieveBusinessesResponseVolumeUsd(UniversalBaseModel):
GMV awaiting settlement (commission not yet computed), in USD.
"""
+ last30d: typing_extensions.Annotated[
+ str,
+ FieldMetadata(alias="last_30d"),
+ pydantic.Field(
+ alias="last_30d",
+ description="Credited GMV from the trailing 30 days (awaiting_settlement + settled), in USD.",
+ ),
+ ]
+ """
+ Credited GMV from the trailing 30 days (awaiting_settlement + settled), in USD.
+ """
+
settled: str = pydantic.Field()
"""
GMV of pending + completed payments, in USD.
diff --git a/src/whop_sdk/partners/client.py b/src/whop_sdk/partners/client.py
index 50d4fbe2..dfd44820 100644
--- a/src/whop_sdk/partners/client.py
+++ b/src/whop_sdk/partners/client.py
@@ -7,6 +7,7 @@
from ..core.client_wrapper import AsyncClientWrapper, SyncClientWrapper
from ..core.pagination import AsyncPager, SyncPager
from ..core.request_options import RequestOptions
+from ..types.onboarding_reward import OnboardingReward
from .raw_client import AsyncRawPartnersClient, RawPartnersClient
from .types.create_partners_response import CreatePartnersResponse
from .types.leaderboard_partners_request_period import LeaderboardPartnersRequestPeriod
@@ -54,7 +55,7 @@ def create(self, *, request_options: typing.Optional[RequestOptions] = None) ->
from whop_sdk import Whop
client = Whop(
- "2026-09-02-2",
+ "2026-09-06",
idempotency_key="YOUR_IDEMPOTENCY_KEY",
token="YOUR_TOKEN",
)
@@ -90,7 +91,7 @@ def leaderboard(
from whop_sdk import Whop
client = Whop(
- "2026-09-02-2",
+ "2026-09-06",
idempotency_key="YOUR_IDEMPOTENCY_KEY",
token="YOUR_TOKEN",
)
@@ -99,6 +100,47 @@ def leaderboard(
_response = self._raw_client.leaderboard(period=period, request_options=request_options)
return _response.data
+ def retrieve_link(
+ self, *, partner_username: str, reward_slug: str, request_options: typing.Optional[RequestOptions] = None
+ ) -> OnboardingReward:
+ """
+ Resolves the public reward terms and whether redemption capacity remains. Immediate rewards claim capacity at business creation; qualified rewards claim it when the business reaches the threshold.
+
+ Parameters
+ ----------
+ partner_username : str
+ Username from the partner link's `a` query parameter.
+
+ reward_slug : str
+ Reward slug from the partner link's `reward` query parameter.
+
+ request_options : typing.Optional[RequestOptions]
+ Request-specific configuration.
+
+ Returns
+ -------
+ OnboardingReward
+ reward link verified
+
+ Examples
+ --------
+ from whop_sdk import Whop
+
+ client = Whop(
+ "2026-09-06",
+ idempotency_key="YOUR_IDEMPOTENCY_KEY",
+ token="YOUR_TOKEN",
+ )
+ client.partners.retrieve_link(
+ partner_username="partner_username",
+ reward_slug="reward_slug",
+ )
+ """
+ _response = self._raw_client.retrieve_link(
+ partner_username=partner_username, reward_slug=reward_slug, request_options=request_options
+ )
+ return _response.data
+
def referred_users(
self,
*,
@@ -146,7 +188,7 @@ def referred_users(
from whop_sdk import Whop
client = Whop(
- "2026-09-02-2",
+ "2026-09-06",
idempotency_key="YOUR_IDEMPOTENCY_KEY",
token="YOUR_TOKEN",
)
@@ -214,7 +256,7 @@ async def create(self, *, request_options: typing.Optional[RequestOptions] = Non
from whop_sdk import AsyncWhop
client = AsyncWhop(
- "2026-09-02-2",
+ "2026-09-06",
idempotency_key="YOUR_IDEMPOTENCY_KEY",
token="YOUR_TOKEN",
)
@@ -258,7 +300,7 @@ async def leaderboard(
from whop_sdk import AsyncWhop
client = AsyncWhop(
- "2026-09-02-2",
+ "2026-09-06",
idempotency_key="YOUR_IDEMPOTENCY_KEY",
token="YOUR_TOKEN",
)
@@ -273,6 +315,55 @@ async def main() -> None:
_response = await self._raw_client.leaderboard(period=period, request_options=request_options)
return _response.data
+ async def retrieve_link(
+ self, *, partner_username: str, reward_slug: str, request_options: typing.Optional[RequestOptions] = None
+ ) -> OnboardingReward:
+ """
+ Resolves the public reward terms and whether redemption capacity remains. Immediate rewards claim capacity at business creation; qualified rewards claim it when the business reaches the threshold.
+
+ Parameters
+ ----------
+ partner_username : str
+ Username from the partner link's `a` query parameter.
+
+ reward_slug : str
+ Reward slug from the partner link's `reward` query parameter.
+
+ request_options : typing.Optional[RequestOptions]
+ Request-specific configuration.
+
+ Returns
+ -------
+ OnboardingReward
+ reward link verified
+
+ Examples
+ --------
+ import asyncio
+
+ from whop_sdk import AsyncWhop
+
+ client = AsyncWhop(
+ "2026-09-06",
+ idempotency_key="YOUR_IDEMPOTENCY_KEY",
+ token="YOUR_TOKEN",
+ )
+
+
+ async def main() -> None:
+ await client.partners.retrieve_link(
+ partner_username="partner_username",
+ reward_slug="reward_slug",
+ )
+
+
+ asyncio.run(main())
+ """
+ _response = await self._raw_client.retrieve_link(
+ partner_username=partner_username, reward_slug=reward_slug, request_options=request_options
+ )
+ return _response.data
+
async def referred_users(
self,
*,
@@ -322,7 +413,7 @@ async def referred_users(
from whop_sdk import AsyncWhop
client = AsyncWhop(
- "2026-09-02-2",
+ "2026-09-06",
idempotency_key="YOUR_IDEMPOTENCY_KEY",
token="YOUR_TOKEN",
)
diff --git a/src/whop_sdk/partners/raw_client.py b/src/whop_sdk/partners/raw_client.py
index 653c0d6c..da24fa28 100644
--- a/src/whop_sdk/partners/raw_client.py
+++ b/src/whop_sdk/partners/raw_client.py
@@ -13,7 +13,9 @@
from ..errors.bad_request_error import BadRequestError
from ..errors.conflict_error import ConflictError
from ..errors.forbidden_error import ForbiddenError
+from ..errors.not_found_error import NotFoundError
from ..errors.unauthorized_error import UnauthorizedError
+from ..types.onboarding_reward import OnboardingReward
from ..types.v1error_response import V1ErrorResponse
from .types.create_partners_response import CreatePartnersResponse
from .types.leaderboard_partners_request_period import LeaderboardPartnersRequestPeriod
@@ -160,6 +162,67 @@ def leaderboard(
)
raise ApiError(status_code=_response.status_code, headers=dict(_response.headers), body=_response_json)
+ def retrieve_link(
+ self, *, partner_username: str, reward_slug: str, request_options: typing.Optional[RequestOptions] = None
+ ) -> HttpResponse[OnboardingReward]:
+ """
+ Resolves the public reward terms and whether redemption capacity remains. Immediate rewards claim capacity at business creation; qualified rewards claim it when the business reaches the threshold.
+
+ Parameters
+ ----------
+ partner_username : str
+ Username from the partner link's `a` query parameter.
+
+ reward_slug : str
+ Reward slug from the partner link's `reward` query parameter.
+
+ request_options : typing.Optional[RequestOptions]
+ Request-specific configuration.
+
+ Returns
+ -------
+ HttpResponse[OnboardingReward]
+ reward link verified
+ """
+ _response = self._client_wrapper.httpx_client.request(
+ "partners/links",
+ method="GET",
+ params={
+ "partner_username": partner_username,
+ "reward_slug": reward_slug,
+ },
+ request_options=request_options,
+ )
+ try:
+ if 200 <= _response.status_code < 300:
+ _data = typing.cast(
+ OnboardingReward,
+ parse_obj_as(
+ type_=OnboardingReward, # type: ignore
+ object_=_response.json(),
+ ),
+ )
+ return HttpResponse(response=_response, data=_data)
+ if _response.status_code == 404:
+ raise NotFoundError(
+ headers=dict(_response.headers),
+ body=typing.cast(
+ typing.Any,
+ parse_obj_as(
+ type_=typing.Any, # type: ignore
+ object_=_response.json(),
+ ),
+ ),
+ )
+ _response_json = _response.json()
+ except JSONDecodeError:
+ raise ApiError(status_code=_response.status_code, headers=dict(_response.headers), body=_response.text)
+ except ValidationError as e:
+ raise ParsingError(
+ status_code=_response.status_code, headers=dict(_response.headers), body=_response.json(), cause=e
+ )
+ raise ApiError(status_code=_response.status_code, headers=dict(_response.headers), body=_response_json)
+
def referred_users(
self,
*,
@@ -398,6 +461,67 @@ async def leaderboard(
)
raise ApiError(status_code=_response.status_code, headers=dict(_response.headers), body=_response_json)
+ async def retrieve_link(
+ self, *, partner_username: str, reward_slug: str, request_options: typing.Optional[RequestOptions] = None
+ ) -> AsyncHttpResponse[OnboardingReward]:
+ """
+ Resolves the public reward terms and whether redemption capacity remains. Immediate rewards claim capacity at business creation; qualified rewards claim it when the business reaches the threshold.
+
+ Parameters
+ ----------
+ partner_username : str
+ Username from the partner link's `a` query parameter.
+
+ reward_slug : str
+ Reward slug from the partner link's `reward` query parameter.
+
+ request_options : typing.Optional[RequestOptions]
+ Request-specific configuration.
+
+ Returns
+ -------
+ AsyncHttpResponse[OnboardingReward]
+ reward link verified
+ """
+ _response = await self._client_wrapper.httpx_client.request(
+ "partners/links",
+ method="GET",
+ params={
+ "partner_username": partner_username,
+ "reward_slug": reward_slug,
+ },
+ request_options=request_options,
+ )
+ try:
+ if 200 <= _response.status_code < 300:
+ _data = typing.cast(
+ OnboardingReward,
+ parse_obj_as(
+ type_=OnboardingReward, # type: ignore
+ object_=_response.json(),
+ ),
+ )
+ return AsyncHttpResponse(response=_response, data=_data)
+ if _response.status_code == 404:
+ raise NotFoundError(
+ headers=dict(_response.headers),
+ body=typing.cast(
+ typing.Any,
+ parse_obj_as(
+ type_=typing.Any, # type: ignore
+ object_=_response.json(),
+ ),
+ ),
+ )
+ _response_json = _response.json()
+ except JSONDecodeError:
+ raise ApiError(status_code=_response.status_code, headers=dict(_response.headers), body=_response.text)
+ except ValidationError as e:
+ raise ParsingError(
+ status_code=_response.status_code, headers=dict(_response.headers), body=_response.json(), cause=e
+ )
+ raise ApiError(status_code=_response.status_code, headers=dict(_response.headers), body=_response_json)
+
async def referred_users(
self,
*,
diff --git a/src/whop_sdk/payment_method_domains/client.py b/src/whop_sdk/payment_method_domains/client.py
index 5511140d..36b66b5d 100644
--- a/src/whop_sdk/payment_method_domains/client.py
+++ b/src/whop_sdk/payment_method_domains/client.py
@@ -105,7 +105,7 @@ def list(
from whop_sdk import Whop
client = Whop(
- "2026-09-02-2",
+ "2026-09-06",
idempotency_key="YOUR_IDEMPOTENCY_KEY",
token="YOUR_TOKEN",
)
@@ -148,7 +148,7 @@ def create(
Hostname to register (e.g. `checkout.shinetime.example`).
account_id : typing.Optional[str]
- Account to register the domain for (`biz_` tag). Defaults to the caller's account.
+ Account to register the domain for (`biz_` tag). Required when authenticating as a user; an account API key supplies its own account.
request_options : typing.Optional[RequestOptions]
Request-specific configuration.
@@ -163,7 +163,7 @@ def create(
from whop_sdk import Whop
client = Whop(
- "2026-09-02-2",
+ "2026-09-06",
idempotency_key="YOUR_IDEMPOTENCY_KEY",
token="YOUR_TOKEN",
)
@@ -196,7 +196,7 @@ def retrieve(self, id: str, *, request_options: typing.Optional[RequestOptions]
from whop_sdk import Whop
client = Whop(
- "2026-09-02-2",
+ "2026-09-06",
idempotency_key="YOUR_IDEMPOTENCY_KEY",
token="YOUR_TOKEN",
)
@@ -231,7 +231,7 @@ def delete(
from whop_sdk import Whop
client = Whop(
- "2026-09-02-2",
+ "2026-09-06",
idempotency_key="YOUR_IDEMPOTENCY_KEY",
token="YOUR_TOKEN",
)
@@ -264,7 +264,7 @@ def verify(self, id: str, *, request_options: typing.Optional[RequestOptions] =
from whop_sdk import Whop
client = Whop(
- "2026-09-02-2",
+ "2026-09-06",
idempotency_key="YOUR_IDEMPOTENCY_KEY",
token="YOUR_TOKEN",
)
@@ -364,7 +364,7 @@ async def list(
from whop_sdk import AsyncWhop
client = AsyncWhop(
- "2026-09-02-2",
+ "2026-09-06",
idempotency_key="YOUR_IDEMPOTENCY_KEY",
token="YOUR_TOKEN",
)
@@ -414,7 +414,7 @@ async def create(
Hostname to register (e.g. `checkout.shinetime.example`).
account_id : typing.Optional[str]
- Account to register the domain for (`biz_` tag). Defaults to the caller's account.
+ Account to register the domain for (`biz_` tag). Required when authenticating as a user; an account API key supplies its own account.
request_options : typing.Optional[RequestOptions]
Request-specific configuration.
@@ -431,7 +431,7 @@ async def create(
from whop_sdk import AsyncWhop
client = AsyncWhop(
- "2026-09-02-2",
+ "2026-09-06",
idempotency_key="YOUR_IDEMPOTENCY_KEY",
token="YOUR_TOKEN",
)
@@ -476,7 +476,7 @@ async def retrieve(
from whop_sdk import AsyncWhop
client = AsyncWhop(
- "2026-09-02-2",
+ "2026-09-06",
idempotency_key="YOUR_IDEMPOTENCY_KEY",
token="YOUR_TOKEN",
)
@@ -519,7 +519,7 @@ async def delete(
from whop_sdk import AsyncWhop
client = AsyncWhop(
- "2026-09-02-2",
+ "2026-09-06",
idempotency_key="YOUR_IDEMPOTENCY_KEY",
token="YOUR_TOKEN",
)
@@ -560,7 +560,7 @@ async def verify(self, id: str, *, request_options: typing.Optional[RequestOptio
from whop_sdk import AsyncWhop
client = AsyncWhop(
- "2026-09-02-2",
+ "2026-09-06",
idempotency_key="YOUR_IDEMPOTENCY_KEY",
token="YOUR_TOKEN",
)
diff --git a/src/whop_sdk/payment_method_domains/raw_client.py b/src/whop_sdk/payment_method_domains/raw_client.py
index 71ca18b1..fce10c09 100644
--- a/src/whop_sdk/payment_method_domains/raw_client.py
+++ b/src/whop_sdk/payment_method_domains/raw_client.py
@@ -221,7 +221,7 @@ def create(
Hostname to register (e.g. `checkout.shinetime.example`).
account_id : typing.Optional[str]
- Account to register the domain for (`biz_` tag). Defaults to the caller's account.
+ Account to register the domain for (`biz_` tag). Required when authenticating as a user; an account API key supplies its own account.
request_options : typing.Optional[RequestOptions]
Request-specific configuration.
@@ -761,7 +761,7 @@ async def create(
Hostname to register (e.g. `checkout.shinetime.example`).
account_id : typing.Optional[str]
- Account to register the domain for (`biz_` tag). Defaults to the caller's account.
+ Account to register the domain for (`biz_` tag). Required when authenticating as a user; an account API key supplies its own account.
request_options : typing.Optional[RequestOptions]
Request-specific configuration.
diff --git a/src/whop_sdk/payment_methods/client.py b/src/whop_sdk/payment_methods/client.py
index df0656f8..5faae7df 100644
--- a/src/whop_sdk/payment_methods/client.py
+++ b/src/whop_sdk/payment_methods/client.py
@@ -124,7 +124,7 @@ def list(
from whop_sdk import Whop
client = Whop(
- "2026-09-02-2",
+ "2026-09-06",
idempotency_key="YOUR_IDEMPOTENCY_KEY",
token="YOUR_TOKEN",
)
@@ -204,7 +204,7 @@ def retrieve(
from whop_sdk import Whop
client = Whop(
- "2026-09-02-2",
+ "2026-09-06",
idempotency_key="YOUR_IDEMPOTENCY_KEY",
token="YOUR_TOKEN",
)
@@ -257,7 +257,7 @@ def delete_payment_method(
from whop_sdk import Whop
client = Whop(
- "2026-09-02-2",
+ "2026-09-06",
idempotency_key="YOUR_IDEMPOTENCY_KEY",
token="YOUR_TOKEN",
)
@@ -381,7 +381,7 @@ async def list(
from whop_sdk import AsyncWhop
client = AsyncWhop(
- "2026-09-02-2",
+ "2026-09-06",
idempotency_key="YOUR_IDEMPOTENCY_KEY",
token="YOUR_TOKEN",
)
@@ -470,7 +470,7 @@ async def retrieve(
from whop_sdk import AsyncWhop
client = AsyncWhop(
- "2026-09-02-2",
+ "2026-09-06",
idempotency_key="YOUR_IDEMPOTENCY_KEY",
token="YOUR_TOKEN",
)
@@ -531,7 +531,7 @@ async def delete_payment_method(
from whop_sdk import AsyncWhop
client = AsyncWhop(
- "2026-09-02-2",
+ "2026-09-06",
idempotency_key="YOUR_IDEMPOTENCY_KEY",
token="YOUR_TOKEN",
)
diff --git a/src/whop_sdk/payments/client.py b/src/whop_sdk/payments/client.py
index 25570359..97034aa0 100644
--- a/src/whop_sdk/payments/client.py
+++ b/src/whop_sdk/payments/client.py
@@ -130,7 +130,7 @@ def list(
from whop_sdk import Whop
client = Whop(
- "2026-09-02-2",
+ "2026-09-06",
idempotency_key="YOUR_IDEMPOTENCY_KEY",
token="YOUR_TOKEN",
)
@@ -226,7 +226,7 @@ def create(
from whop_sdk import Whop
client = Whop(
- "2026-09-02-2",
+ "2026-09-06",
idempotency_key="YOUR_IDEMPOTENCY_KEY",
token="YOUR_TOKEN",
)
@@ -272,7 +272,7 @@ def retrieve(self, id: str, *, request_options: typing.Optional[RequestOptions]
from whop_sdk import Whop
client = Whop(
- "2026-09-02-2",
+ "2026-09-06",
idempotency_key="YOUR_IDEMPOTENCY_KEY",
token="YOUR_TOKEN",
)
@@ -305,7 +305,7 @@ def capture(self, id: str, *, request_options: typing.Optional[RequestOptions] =
from whop_sdk import Whop
client = Whop(
- "2026-09-02-2",
+ "2026-09-06",
idempotency_key="YOUR_IDEMPOTENCY_KEY",
token="YOUR_TOKEN",
)
@@ -340,7 +340,7 @@ def list_fees(
from whop_sdk import Whop
client = Whop(
- "2026-09-02-2",
+ "2026-09-06",
idempotency_key="YOUR_IDEMPOTENCY_KEY",
token="YOUR_TOKEN",
)
@@ -382,7 +382,7 @@ def refund(
from whop_sdk import Whop
client = Whop(
- "2026-09-02-2",
+ "2026-09-06",
idempotency_key="YOUR_IDEMPOTENCY_KEY",
token="YOUR_TOKEN",
)
@@ -415,7 +415,7 @@ def retry(self, id: str, *, request_options: typing.Optional[RequestOptions] = N
from whop_sdk import Whop
client = Whop(
- "2026-09-02-2",
+ "2026-09-06",
idempotency_key="YOUR_IDEMPOTENCY_KEY",
token="YOUR_TOKEN",
)
@@ -448,7 +448,7 @@ def void(self, id: str, *, request_options: typing.Optional[RequestOptions] = No
from whop_sdk import Whop
client = Whop(
- "2026-09-02-2",
+ "2026-09-06",
idempotency_key="YOUR_IDEMPOTENCY_KEY",
token="YOUR_TOKEN",
)
@@ -459,6 +459,39 @@ def void(self, id: str, *, request_options: typing.Optional[RequestOptions] = No
_response = self._raw_client.void(id, request_options=request_options)
return _response.data
+ def resume(self, payment_id: str, *, request_options: typing.Optional[RequestOptions] = None) -> PaymentStatus:
+ """
+ Starts a fresh on-session attempt with the saved card for a subscription renewal that is waiting on the customer to authenticate; the bank's step then arrives in `next_action` on the following status reads. Only the payment's own customer may call it — with the payment's `client_secret` or their own session — and it is a no-op for any payment that is not a parked renewal.
+
+ Parameters
+ ----------
+ payment_id : str
+ The unique identifier of the payment.
+
+ request_options : typing.Optional[RequestOptions]
+ Request-specific configuration.
+
+ Returns
+ -------
+ PaymentStatus
+ Resume requested
+
+ Examples
+ --------
+ from whop_sdk import Whop
+
+ client = Whop(
+ "2026-09-06",
+ idempotency_key="YOUR_IDEMPOTENCY_KEY",
+ token="YOUR_TOKEN",
+ )
+ client.payments.resume(
+ payment_id="payment_id",
+ )
+ """
+ _response = self._raw_client.resume(payment_id, request_options=request_options)
+ return _response.data
+
def update_return_url(
self, payment_id: str, *, return_url: str, request_options: typing.Optional[RequestOptions] = None
) -> PaymentStatus:
@@ -486,7 +519,7 @@ def update_return_url(
from whop_sdk import Whop
client = Whop(
- "2026-09-02-2",
+ "2026-09-06",
idempotency_key="YOUR_IDEMPOTENCY_KEY",
token="YOUR_TOKEN",
)
@@ -524,7 +557,7 @@ def retrieve_status(
from whop_sdk import Whop
client = Whop(
- "2026-09-02-2",
+ "2026-09-06",
idempotency_key="YOUR_IDEMPOTENCY_KEY",
token="YOUR_TOKEN",
)
@@ -648,7 +681,7 @@ async def list(
from whop_sdk import AsyncWhop
client = AsyncWhop(
- "2026-09-02-2",
+ "2026-09-06",
idempotency_key="YOUR_IDEMPOTENCY_KEY",
token="YOUR_TOKEN",
)
@@ -753,7 +786,7 @@ async def create(
from whop_sdk import AsyncWhop
client = AsyncWhop(
- "2026-09-02-2",
+ "2026-09-06",
idempotency_key="YOUR_IDEMPOTENCY_KEY",
token="YOUR_TOKEN",
)
@@ -807,7 +840,7 @@ async def retrieve(self, id: str, *, request_options: typing.Optional[RequestOpt
from whop_sdk import AsyncWhop
client = AsyncWhop(
- "2026-09-02-2",
+ "2026-09-06",
idempotency_key="YOUR_IDEMPOTENCY_KEY",
token="YOUR_TOKEN",
)
@@ -848,7 +881,7 @@ async def capture(self, id: str, *, request_options: typing.Optional[RequestOpti
from whop_sdk import AsyncWhop
client = AsyncWhop(
- "2026-09-02-2",
+ "2026-09-06",
idempotency_key="YOUR_IDEMPOTENCY_KEY",
token="YOUR_TOKEN",
)
@@ -891,7 +924,7 @@ async def list_fees(
from whop_sdk import AsyncWhop
client = AsyncWhop(
- "2026-09-02-2",
+ "2026-09-06",
idempotency_key="YOUR_IDEMPOTENCY_KEY",
token="YOUR_TOKEN",
)
@@ -941,7 +974,7 @@ async def refund(
from whop_sdk import AsyncWhop
client = AsyncWhop(
- "2026-09-02-2",
+ "2026-09-06",
idempotency_key="YOUR_IDEMPOTENCY_KEY",
token="YOUR_TOKEN",
)
@@ -982,7 +1015,7 @@ async def retry(self, id: str, *, request_options: typing.Optional[RequestOption
from whop_sdk import AsyncWhop
client = AsyncWhop(
- "2026-09-02-2",
+ "2026-09-06",
idempotency_key="YOUR_IDEMPOTENCY_KEY",
token="YOUR_TOKEN",
)
@@ -1023,7 +1056,7 @@ async def void(self, id: str, *, request_options: typing.Optional[RequestOptions
from whop_sdk import AsyncWhop
client = AsyncWhop(
- "2026-09-02-2",
+ "2026-09-06",
idempotency_key="YOUR_IDEMPOTENCY_KEY",
token="YOUR_TOKEN",
)
@@ -1040,6 +1073,49 @@ async def main() -> None:
_response = await self._raw_client.void(id, request_options=request_options)
return _response.data
+ async def resume(
+ self, payment_id: str, *, request_options: typing.Optional[RequestOptions] = None
+ ) -> PaymentStatus:
+ """
+ Starts a fresh on-session attempt with the saved card for a subscription renewal that is waiting on the customer to authenticate; the bank's step then arrives in `next_action` on the following status reads. Only the payment's own customer may call it — with the payment's `client_secret` or their own session — and it is a no-op for any payment that is not a parked renewal.
+
+ Parameters
+ ----------
+ payment_id : str
+ The unique identifier of the payment.
+
+ request_options : typing.Optional[RequestOptions]
+ Request-specific configuration.
+
+ Returns
+ -------
+ PaymentStatus
+ Resume requested
+
+ Examples
+ --------
+ import asyncio
+
+ from whop_sdk import AsyncWhop
+
+ client = AsyncWhop(
+ "2026-09-06",
+ idempotency_key="YOUR_IDEMPOTENCY_KEY",
+ token="YOUR_TOKEN",
+ )
+
+
+ async def main() -> None:
+ await client.payments.resume(
+ payment_id="payment_id",
+ )
+
+
+ asyncio.run(main())
+ """
+ _response = await self._raw_client.resume(payment_id, request_options=request_options)
+ return _response.data
+
async def update_return_url(
self, payment_id: str, *, return_url: str, request_options: typing.Optional[RequestOptions] = None
) -> PaymentStatus:
@@ -1069,7 +1145,7 @@ async def update_return_url(
from whop_sdk import AsyncWhop
client = AsyncWhop(
- "2026-09-02-2",
+ "2026-09-06",
idempotency_key="YOUR_IDEMPOTENCY_KEY",
token="YOUR_TOKEN",
)
@@ -1115,7 +1191,7 @@ async def retrieve_status(
from whop_sdk import AsyncWhop
client = AsyncWhop(
- "2026-09-02-2",
+ "2026-09-06",
idempotency_key="YOUR_IDEMPOTENCY_KEY",
token="YOUR_TOKEN",
)
diff --git a/src/whop_sdk/payments/raw_client.py b/src/whop_sdk/payments/raw_client.py
index f247f19d..850eb0fb 100644
--- a/src/whop_sdk/payments/raw_client.py
+++ b/src/whop_sdk/payments/raw_client.py
@@ -859,6 +859,104 @@ def void(self, id: str, *, request_options: typing.Optional[RequestOptions] = No
)
raise ApiError(status_code=_response.status_code, headers=dict(_response.headers), body=_response_json)
+ def resume(
+ self, payment_id: str, *, request_options: typing.Optional[RequestOptions] = None
+ ) -> HttpResponse[PaymentStatus]:
+ """
+ Starts a fresh on-session attempt with the saved card for a subscription renewal that is waiting on the customer to authenticate; the bank's step then arrives in `next_action` on the following status reads. Only the payment's own customer may call it — with the payment's `client_secret` or their own session — and it is a no-op for any payment that is not a parked renewal.
+
+ Parameters
+ ----------
+ payment_id : str
+ The unique identifier of the payment.
+
+ request_options : typing.Optional[RequestOptions]
+ Request-specific configuration.
+
+ Returns
+ -------
+ HttpResponse[PaymentStatus]
+ Resume requested
+ """
+ _response = self._client_wrapper.httpx_client.request(
+ f"payments/{encode_path_param(payment_id)}/resume",
+ method="POST",
+ request_options=request_options,
+ )
+ try:
+ if 200 <= _response.status_code < 300:
+ _data = typing.cast(
+ PaymentStatus,
+ parse_obj_as(
+ type_=PaymentStatus, # type: ignore
+ object_=_response.json(),
+ ),
+ )
+ return HttpResponse(response=_response, data=_data)
+ if _response.status_code == 400:
+ raise BadRequestError(
+ headers=dict(_response.headers),
+ body=typing.cast(
+ typing.Any,
+ parse_obj_as(
+ type_=typing.Any, # type: ignore
+ object_=_response.json(),
+ ),
+ ),
+ )
+ if _response.status_code == 401:
+ raise UnauthorizedError(
+ headers=dict(_response.headers),
+ body=typing.cast(
+ typing.Any,
+ parse_obj_as(
+ type_=typing.Any, # type: ignore
+ object_=_response.json(),
+ ),
+ ),
+ )
+ if _response.status_code == 403:
+ raise ForbiddenError(
+ headers=dict(_response.headers),
+ body=typing.cast(
+ typing.Any,
+ parse_obj_as(
+ type_=typing.Any, # type: ignore
+ object_=_response.json(),
+ ),
+ ),
+ )
+ if _response.status_code == 404:
+ raise NotFoundError(
+ headers=dict(_response.headers),
+ body=typing.cast(
+ typing.Any,
+ parse_obj_as(
+ type_=typing.Any, # type: ignore
+ object_=_response.json(),
+ ),
+ ),
+ )
+ if _response.status_code == 409:
+ raise ConflictError(
+ headers=dict(_response.headers),
+ body=typing.cast(
+ V1ErrorResponse,
+ parse_obj_as(
+ type_=V1ErrorResponse, # type: ignore
+ object_=_response.json(),
+ ),
+ ),
+ )
+ _response_json = _response.json()
+ except JSONDecodeError:
+ raise ApiError(status_code=_response.status_code, headers=dict(_response.headers), body=_response.text)
+ except ValidationError as e:
+ raise ParsingError(
+ status_code=_response.status_code, headers=dict(_response.headers), body=_response.json(), cause=e
+ )
+ raise ApiError(status_code=_response.status_code, headers=dict(_response.headers), body=_response_json)
+
def update_return_url(
self, payment_id: str, *, return_url: str, request_options: typing.Optional[RequestOptions] = None
) -> HttpResponse[PaymentStatus]:
@@ -1846,6 +1944,104 @@ async def void(
)
raise ApiError(status_code=_response.status_code, headers=dict(_response.headers), body=_response_json)
+ async def resume(
+ self, payment_id: str, *, request_options: typing.Optional[RequestOptions] = None
+ ) -> AsyncHttpResponse[PaymentStatus]:
+ """
+ Starts a fresh on-session attempt with the saved card for a subscription renewal that is waiting on the customer to authenticate; the bank's step then arrives in `next_action` on the following status reads. Only the payment's own customer may call it — with the payment's `client_secret` or their own session — and it is a no-op for any payment that is not a parked renewal.
+
+ Parameters
+ ----------
+ payment_id : str
+ The unique identifier of the payment.
+
+ request_options : typing.Optional[RequestOptions]
+ Request-specific configuration.
+
+ Returns
+ -------
+ AsyncHttpResponse[PaymentStatus]
+ Resume requested
+ """
+ _response = await self._client_wrapper.httpx_client.request(
+ f"payments/{encode_path_param(payment_id)}/resume",
+ method="POST",
+ request_options=request_options,
+ )
+ try:
+ if 200 <= _response.status_code < 300:
+ _data = typing.cast(
+ PaymentStatus,
+ parse_obj_as(
+ type_=PaymentStatus, # type: ignore
+ object_=_response.json(),
+ ),
+ )
+ return AsyncHttpResponse(response=_response, data=_data)
+ if _response.status_code == 400:
+ raise BadRequestError(
+ headers=dict(_response.headers),
+ body=typing.cast(
+ typing.Any,
+ parse_obj_as(
+ type_=typing.Any, # type: ignore
+ object_=_response.json(),
+ ),
+ ),
+ )
+ if _response.status_code == 401:
+ raise UnauthorizedError(
+ headers=dict(_response.headers),
+ body=typing.cast(
+ typing.Any,
+ parse_obj_as(
+ type_=typing.Any, # type: ignore
+ object_=_response.json(),
+ ),
+ ),
+ )
+ if _response.status_code == 403:
+ raise ForbiddenError(
+ headers=dict(_response.headers),
+ body=typing.cast(
+ typing.Any,
+ parse_obj_as(
+ type_=typing.Any, # type: ignore
+ object_=_response.json(),
+ ),
+ ),
+ )
+ if _response.status_code == 404:
+ raise NotFoundError(
+ headers=dict(_response.headers),
+ body=typing.cast(
+ typing.Any,
+ parse_obj_as(
+ type_=typing.Any, # type: ignore
+ object_=_response.json(),
+ ),
+ ),
+ )
+ if _response.status_code == 409:
+ raise ConflictError(
+ headers=dict(_response.headers),
+ body=typing.cast(
+ V1ErrorResponse,
+ parse_obj_as(
+ type_=V1ErrorResponse, # type: ignore
+ object_=_response.json(),
+ ),
+ ),
+ )
+ _response_json = _response.json()
+ except JSONDecodeError:
+ raise ApiError(status_code=_response.status_code, headers=dict(_response.headers), body=_response.text)
+ except ValidationError as e:
+ raise ParsingError(
+ status_code=_response.status_code, headers=dict(_response.headers), body=_response.json(), cause=e
+ )
+ raise ApiError(status_code=_response.status_code, headers=dict(_response.headers), body=_response_json)
+
async def update_return_url(
self, payment_id: str, *, return_url: str, request_options: typing.Optional[RequestOptions] = None
) -> AsyncHttpResponse[PaymentStatus]:
diff --git a/src/whop_sdk/payments/types/post_payment_authorized_payload.py b/src/whop_sdk/payments/types/post_payment_authorized_payload.py
index bcd37506..2fb0046e 100644
--- a/src/whop_sdk/payments/types/post_payment_authorized_payload.py
+++ b/src/whop_sdk/payments/types/post_payment_authorized_payload.py
@@ -5,7 +5,7 @@
import pydantic
from ...core.pydantic_utilities import IS_PYDANTIC_V2, UniversalBaseModel
-from ...types.payment_legacy import PaymentLegacy
+from ...types.payment import Payment
from .post_payment_authorized_payload_api_version import PostPaymentAuthorizedPayloadApiVersion
from .post_payment_authorized_payload_type import PostPaymentAuthorizedPayloadType
@@ -26,7 +26,7 @@ class PostPaymentAuthorizedPayload(UniversalBaseModel):
The dated API version (Api-Version-Date) the payload is serialized to
"""
- data: PaymentLegacy
+ data: Payment
id: str = pydantic.Field()
"""
A unique ID for every single webhook request
diff --git a/src/whop_sdk/payments/types/post_payment_canceled_payload.py b/src/whop_sdk/payments/types/post_payment_canceled_payload.py
index 522b65f5..6292d14c 100644
--- a/src/whop_sdk/payments/types/post_payment_canceled_payload.py
+++ b/src/whop_sdk/payments/types/post_payment_canceled_payload.py
@@ -5,7 +5,7 @@
import pydantic
from ...core.pydantic_utilities import IS_PYDANTIC_V2, UniversalBaseModel
-from ...types.payment_legacy import PaymentLegacy
+from ...types.payment import Payment
from .post_payment_canceled_payload_api_version import PostPaymentCanceledPayloadApiVersion
from .post_payment_canceled_payload_type import PostPaymentCanceledPayloadType
@@ -26,7 +26,7 @@ class PostPaymentCanceledPayload(UniversalBaseModel):
The dated API version (Api-Version-Date) the payload is serialized to
"""
- data: PaymentLegacy
+ data: Payment
id: str = pydantic.Field()
"""
A unique ID for every single webhook request
diff --git a/src/whop_sdk/payments/types/post_payment_created_payload.py b/src/whop_sdk/payments/types/post_payment_created_payload.py
index 8d3cbdd1..5ce2987c 100644
--- a/src/whop_sdk/payments/types/post_payment_created_payload.py
+++ b/src/whop_sdk/payments/types/post_payment_created_payload.py
@@ -5,7 +5,7 @@
import pydantic
from ...core.pydantic_utilities import IS_PYDANTIC_V2, UniversalBaseModel
-from ...types.payment_legacy import PaymentLegacy
+from ...types.payment import Payment
from .post_payment_created_payload_api_version import PostPaymentCreatedPayloadApiVersion
from .post_payment_created_payload_type import PostPaymentCreatedPayloadType
@@ -26,7 +26,7 @@ class PostPaymentCreatedPayload(UniversalBaseModel):
The dated API version (Api-Version-Date) the payload is serialized to
"""
- data: PaymentLegacy
+ data: Payment
id: str = pydantic.Field()
"""
A unique ID for every single webhook request
diff --git a/src/whop_sdk/payments/types/post_payment_failed_payload.py b/src/whop_sdk/payments/types/post_payment_failed_payload.py
index e00aa020..ce937aa8 100644
--- a/src/whop_sdk/payments/types/post_payment_failed_payload.py
+++ b/src/whop_sdk/payments/types/post_payment_failed_payload.py
@@ -5,7 +5,7 @@
import pydantic
from ...core.pydantic_utilities import IS_PYDANTIC_V2, UniversalBaseModel
-from ...types.payment_legacy import PaymentLegacy
+from ...types.payment import Payment
from .post_payment_failed_payload_api_version import PostPaymentFailedPayloadApiVersion
from .post_payment_failed_payload_type import PostPaymentFailedPayloadType
@@ -26,7 +26,7 @@ class PostPaymentFailedPayload(UniversalBaseModel):
The dated API version (Api-Version-Date) the payload is serialized to
"""
- data: PaymentLegacy
+ data: Payment
id: str = pydantic.Field()
"""
A unique ID for every single webhook request
diff --git a/src/whop_sdk/payments/types/post_payment_pending_payload.py b/src/whop_sdk/payments/types/post_payment_pending_payload.py
index d53b73d6..323f3146 100644
--- a/src/whop_sdk/payments/types/post_payment_pending_payload.py
+++ b/src/whop_sdk/payments/types/post_payment_pending_payload.py
@@ -5,7 +5,7 @@
import pydantic
from ...core.pydantic_utilities import IS_PYDANTIC_V2, UniversalBaseModel
-from ...types.payment_legacy import PaymentLegacy
+from ...types.payment import Payment
from .post_payment_pending_payload_api_version import PostPaymentPendingPayloadApiVersion
from .post_payment_pending_payload_type import PostPaymentPendingPayloadType
@@ -26,7 +26,7 @@ class PostPaymentPendingPayload(UniversalBaseModel):
The dated API version (Api-Version-Date) the payload is serialized to
"""
- data: PaymentLegacy
+ data: Payment
id: str = pydantic.Field()
"""
A unique ID for every single webhook request
diff --git a/src/whop_sdk/payments/types/post_payment_succeeded_payload.py b/src/whop_sdk/payments/types/post_payment_succeeded_payload.py
index dc9fe87c..b8cd02ca 100644
--- a/src/whop_sdk/payments/types/post_payment_succeeded_payload.py
+++ b/src/whop_sdk/payments/types/post_payment_succeeded_payload.py
@@ -5,7 +5,7 @@
import pydantic
from ...core.pydantic_utilities import IS_PYDANTIC_V2, UniversalBaseModel
-from ...types.payment_legacy import PaymentLegacy
+from ...types.payment import Payment
from .post_payment_succeeded_payload_api_version import PostPaymentSucceededPayloadApiVersion
from .post_payment_succeeded_payload_type import PostPaymentSucceededPayloadType
@@ -26,7 +26,7 @@ class PostPaymentSucceededPayload(UniversalBaseModel):
The dated API version (Api-Version-Date) the payload is serialized to
"""
- data: PaymentLegacy
+ data: Payment
id: str = pydantic.Field()
"""
A unique ID for every single webhook request
diff --git a/src/whop_sdk/payout_accounts/client.py b/src/whop_sdk/payout_accounts/client.py
index 72acf5f1..c6b1305b 100644
--- a/src/whop_sdk/payout_accounts/client.py
+++ b/src/whop_sdk/payout_accounts/client.py
@@ -48,7 +48,7 @@ def retrieve(self, id: str, *, request_options: typing.Optional[RequestOptions]
from whop_sdk import Whop
client = Whop(
- "2026-09-02-2",
+ "2026-09-06",
idempotency_key="YOUR_IDEMPOTENCY_KEY",
token="YOUR_TOKEN",
)
@@ -102,7 +102,7 @@ async def retrieve(self, id: str, *, request_options: typing.Optional[RequestOpt
from whop_sdk import AsyncWhop
client = AsyncWhop(
- "2026-09-02-2",
+ "2026-09-06",
idempotency_key="YOUR_IDEMPOTENCY_KEY",
token="YOUR_TOKEN",
)
diff --git a/src/whop_sdk/payout_methods/client.py b/src/whop_sdk/payout_methods/client.py
index 432a9f3e..ed5c8495 100644
--- a/src/whop_sdk/payout_methods/client.py
+++ b/src/whop_sdk/payout_methods/client.py
@@ -72,7 +72,7 @@ def list_payout_method(
from whop_sdk import Whop
client = Whop(
- "2026-09-02-2",
+ "2026-09-06",
idempotency_key="YOUR_IDEMPOTENCY_KEY",
token="YOUR_TOKEN",
)
@@ -118,7 +118,7 @@ def retrieve_payout_method(
from whop_sdk import Whop
client = Whop(
- "2026-09-02-2",
+ "2026-09-06",
idempotency_key="YOUR_IDEMPOTENCY_KEY",
token="YOUR_TOKEN",
)
@@ -193,7 +193,7 @@ async def list_payout_method(
from whop_sdk import AsyncWhop
client = AsyncWhop(
- "2026-09-02-2",
+ "2026-09-06",
idempotency_key="YOUR_IDEMPOTENCY_KEY",
token="YOUR_TOKEN",
)
@@ -248,7 +248,7 @@ async def retrieve_payout_method(
from whop_sdk import AsyncWhop
client = AsyncWhop(
- "2026-09-02-2",
+ "2026-09-06",
idempotency_key="YOUR_IDEMPOTENCY_KEY",
token="YOUR_TOKEN",
)
diff --git a/src/whop_sdk/payouts/client.py b/src/whop_sdk/payouts/client.py
index ee0cb607..2eabf0cd 100644
--- a/src/whop_sdk/payouts/client.py
+++ b/src/whop_sdk/payouts/client.py
@@ -116,7 +116,7 @@ def list(
from whop_sdk import Whop
client = Whop(
- "2026-09-02-2",
+ "2026-09-06",
idempotency_key="YOUR_IDEMPOTENCY_KEY",
token="YOUR_TOKEN",
)
@@ -214,7 +214,7 @@ def create(
from whop_sdk import Whop
client = Whop(
- "2026-09-02-2",
+ "2026-09-06",
idempotency_key="YOUR_IDEMPOTENCY_KEY",
token="YOUR_TOKEN",
)
@@ -295,7 +295,7 @@ def create_quote(
from whop_sdk import Whop
client = Whop(
- "2026-09-02-2",
+ "2026-09-06",
idempotency_key="YOUR_IDEMPOTENCY_KEY",
token="YOUR_TOKEN",
)
@@ -352,7 +352,7 @@ def retrieve(
from whop_sdk import Whop
client = Whop(
- "2026-09-02-2",
+ "2026-09-06",
idempotency_key="YOUR_IDEMPOTENCY_KEY",
token="YOUR_TOKEN",
)
@@ -400,7 +400,7 @@ def cancel(
from whop_sdk import Whop
client = Whop(
- "2026-09-02-2",
+ "2026-09-06",
idempotency_key="YOUR_IDEMPOTENCY_KEY",
token="YOUR_TOKEN",
)
@@ -519,7 +519,7 @@ async def list(
from whop_sdk import AsyncWhop
client = AsyncWhop(
- "2026-09-02-2",
+ "2026-09-06",
idempotency_key="YOUR_IDEMPOTENCY_KEY",
token="YOUR_TOKEN",
)
@@ -626,7 +626,7 @@ async def create(
from whop_sdk import AsyncWhop
client = AsyncWhop(
- "2026-09-02-2",
+ "2026-09-06",
idempotency_key="YOUR_IDEMPOTENCY_KEY",
token="YOUR_TOKEN",
)
@@ -715,7 +715,7 @@ async def create_quote(
from whop_sdk import AsyncWhop
client = AsyncWhop(
- "2026-09-02-2",
+ "2026-09-06",
idempotency_key="YOUR_IDEMPOTENCY_KEY",
token="YOUR_TOKEN",
)
@@ -780,7 +780,7 @@ async def retrieve(
from whop_sdk import AsyncWhop
client = AsyncWhop(
- "2026-09-02-2",
+ "2026-09-06",
idempotency_key="YOUR_IDEMPOTENCY_KEY",
token="YOUR_TOKEN",
)
@@ -836,7 +836,7 @@ async def cancel(
from whop_sdk import AsyncWhop
client = AsyncWhop(
- "2026-09-02-2",
+ "2026-09-06",
idempotency_key="YOUR_IDEMPOTENCY_KEY",
token="YOUR_TOKEN",
)
diff --git a/src/whop_sdk/payouts/methods/client.py b/src/whop_sdk/payouts/methods/client.py
index c2e20131..02900b79 100644
--- a/src/whop_sdk/payouts/methods/client.py
+++ b/src/whop_sdk/payouts/methods/client.py
@@ -95,7 +95,7 @@ def list(
from whop_sdk import Whop
client = Whop(
- "2026-09-02-2",
+ "2026-09-06",
idempotency_key="YOUR_IDEMPOTENCY_KEY",
token="YOUR_TOKEN",
)
@@ -171,7 +171,7 @@ def create(
from whop_sdk import Whop
client = Whop(
- "2026-09-02-2",
+ "2026-09-06",
idempotency_key="YOUR_IDEMPOTENCY_KEY",
token="YOUR_TOKEN",
)
@@ -213,7 +213,7 @@ def delete(self, id: str, *, request_options: typing.Optional[RequestOptions] =
from whop_sdk import Whop
client = Whop(
- "2026-09-02-2",
+ "2026-09-06",
idempotency_key="YOUR_IDEMPOTENCY_KEY",
token="YOUR_TOKEN",
)
@@ -259,7 +259,7 @@ def update(
from whop_sdk import Whop
client = Whop(
- "2026-09-02-2",
+ "2026-09-06",
idempotency_key="YOUR_IDEMPOTENCY_KEY",
token="YOUR_TOKEN",
)
@@ -353,7 +353,7 @@ async def list(
from whop_sdk import AsyncWhop
client = AsyncWhop(
- "2026-09-02-2",
+ "2026-09-06",
idempotency_key="YOUR_IDEMPOTENCY_KEY",
token="YOUR_TOKEN",
)
@@ -438,7 +438,7 @@ async def create(
from whop_sdk import AsyncWhop
client = AsyncWhop(
- "2026-09-02-2",
+ "2026-09-06",
idempotency_key="YOUR_IDEMPOTENCY_KEY",
token="YOUR_TOKEN",
)
@@ -490,7 +490,7 @@ async def delete(
from whop_sdk import AsyncWhop
client = AsyncWhop(
- "2026-09-02-2",
+ "2026-09-06",
idempotency_key="YOUR_IDEMPOTENCY_KEY",
token="YOUR_TOKEN",
)
@@ -544,7 +544,7 @@ async def update(
from whop_sdk import AsyncWhop
client = AsyncWhop(
- "2026-09-02-2",
+ "2026-09-06",
idempotency_key="YOUR_IDEMPOTENCY_KEY",
token="YOUR_TOKEN",
)
diff --git a/src/whop_sdk/payouts/supported_methods/client.py b/src/whop_sdk/payouts/supported_methods/client.py
index b8cf5096..dd53e206 100644
--- a/src/whop_sdk/payouts/supported_methods/client.py
+++ b/src/whop_sdk/payouts/supported_methods/client.py
@@ -92,7 +92,7 @@ def list(
from whop_sdk import Whop
client = Whop(
- "2026-09-02-2",
+ "2026-09-06",
idempotency_key="YOUR_IDEMPOTENCY_KEY",
token="YOUR_TOKEN",
)
@@ -203,7 +203,7 @@ async def list(
from whop_sdk import AsyncWhop
client = AsyncWhop(
- "2026-09-02-2",
+ "2026-09-06",
idempotency_key="YOUR_IDEMPOTENCY_KEY",
token="YOUR_TOKEN",
)
diff --git a/src/whop_sdk/people/client.py b/src/whop_sdk/people/client.py
index 3ad11395..4419a710 100644
--- a/src/whop_sdk/people/client.py
+++ b/src/whop_sdk/people/client.py
@@ -157,7 +157,7 @@ def list(
from whop_sdk import Whop
client = Whop(
- "2026-09-02-2",
+ "2026-09-06",
idempotency_key="YOUR_IDEMPOTENCY_KEY",
token="YOUR_TOKEN",
)
@@ -232,7 +232,7 @@ def retrieve(
from whop_sdk import Whop
client = Whop(
- "2026-09-02-2",
+ "2026-09-06",
idempotency_key="YOUR_IDEMPOTENCY_KEY",
token="YOUR_TOKEN",
)
@@ -388,7 +388,7 @@ async def list(
from whop_sdk import AsyncWhop
client = AsyncWhop(
- "2026-09-02-2",
+ "2026-09-06",
idempotency_key="YOUR_IDEMPOTENCY_KEY",
token="YOUR_TOKEN",
)
@@ -472,7 +472,7 @@ async def retrieve(
from whop_sdk import AsyncWhop
client = AsyncWhop(
- "2026-09-02-2",
+ "2026-09-06",
idempotency_key="YOUR_IDEMPOTENCY_KEY",
token="YOUR_TOKEN",
)
diff --git a/src/whop_sdk/permissions/client.py b/src/whop_sdk/permissions/client.py
index 3d418efd..7a6cdafb 100644
--- a/src/whop_sdk/permissions/client.py
+++ b/src/whop_sdk/permissions/client.py
@@ -54,7 +54,7 @@ def list(
from whop_sdk import Whop
client = Whop(
- "2026-09-02-2",
+ "2026-09-06",
idempotency_key="YOUR_IDEMPOTENCY_KEY",
token="YOUR_TOKEN",
)
@@ -114,7 +114,7 @@ async def list(
from whop_sdk import AsyncWhop
client = AsyncWhop(
- "2026-09-02-2",
+ "2026-09-06",
idempotency_key="YOUR_IDEMPOTENCY_KEY",
token="YOUR_TOKEN",
)
diff --git a/src/whop_sdk/plans/client.py b/src/whop_sdk/plans/client.py
index a7e993a0..07c15c9f 100644
--- a/src/whop_sdk/plans/client.py
+++ b/src/whop_sdk/plans/client.py
@@ -118,7 +118,7 @@ def list(
from whop_sdk import Whop
client = Whop(
- "2026-09-02-2",
+ "2026-09-06",
idempotency_key="YOUR_IDEMPOTENCY_KEY",
token="YOUR_TOKEN",
)
@@ -187,7 +187,7 @@ def create(
Parameters
----------
account_id : typing.Optional[str]
- The unique identifier of the account to create this plan for. Defaults to the caller's account.
+ The unique identifier of the account to create this plan for. Required when authenticating as a user; an account API key supplies its own account.
adaptive_pricing_enabled : typing.Optional[bool]
Whether this plan accepts local currency payments via adaptive pricing.
@@ -214,7 +214,7 @@ def create(
An image displayed on the product page to represent this plan.
initial_price : typing.Optional[float]
- Initial amount charged in the plan's currency, e.g. 10.43 for $10.43.
+ Initial amount charged in the plan's currency, e.g. 10.43 for $10.43. A paid fiat plan charges at least 1.00 in its currency; use 0 for free.
internal_notes : typing.Optional[str]
Private notes visible only to the account owner. Not shown to customers.
@@ -238,7 +238,7 @@ def create(
Sales method for this plan.
renewal_price : typing.Optional[float]
- The amount charged each billing period for recurring plans, in the plan's currency.
+ The amount charged each billing period for recurring plans, in the plan's currency. A paid fiat plan charges at least 1.00 in its currency.
split_pay_required_payments : typing.Optional[int]
Installment payments required before the subscription pauses.
@@ -274,7 +274,7 @@ def create(
from whop_sdk import Whop
client = Whop(
- "2026-09-02-2",
+ "2026-09-06",
idempotency_key="YOUR_IDEMPOTENCY_KEY",
token="YOUR_TOKEN",
)
@@ -332,7 +332,7 @@ def retrieve(self, id: str, *, request_options: typing.Optional[RequestOptions]
from whop_sdk import Whop
client = Whop(
- "2026-09-02-2",
+ "2026-09-06",
idempotency_key="YOUR_IDEMPOTENCY_KEY",
token="YOUR_TOKEN",
)
@@ -365,7 +365,7 @@ def delete(self, id: str, *, request_options: typing.Optional[RequestOptions] =
from whop_sdk import Whop
client = Whop(
- "2026-09-02-2",
+ "2026-09-06",
idempotency_key="YOUR_IDEMPOTENCY_KEY",
token="YOUR_TOKEN",
)
@@ -447,7 +447,7 @@ def update(
An image displayed on the product page to represent this plan.
initial_price : typing.Optional[float]
- Initial amount charged in the plan's currency, e.g. 10.43 for $10.43.
+ Initial amount charged in the plan's currency, e.g. 10.43 for $10.43. A paid fiat plan charges at least 1.00 in its currency; use 0 for free.
internal_notes : typing.Optional[str]
Private notes visible only to the account owner. Not shown to customers.
@@ -468,7 +468,7 @@ def update(
Sales method for this plan.
renewal_price : typing.Optional[float]
- The amount charged each billing period for recurring plans, in the plan's currency.
+ The amount charged each billing period for recurring plans, in the plan's currency. A paid fiat plan charges at least 1.00 in its currency.
stock : typing.Optional[int]
The maximum number of units available for purchase. Ignored when unlimited_stock is true.
@@ -507,7 +507,7 @@ def update(
from whop_sdk import Whop
client = Whop(
- "2026-09-02-2",
+ "2026-09-06",
idempotency_key="YOUR_IDEMPOTENCY_KEY",
token="YOUR_TOKEN",
)
@@ -587,7 +587,7 @@ def calculate_tax(
from whop_sdk.plans import CalculateTaxPlansRequestAddress
client = Whop(
- "2026-09-02-2",
+ "2026-09-06",
idempotency_key="YOUR_IDEMPOTENCY_KEY",
token="YOUR_TOKEN",
)
@@ -697,7 +697,7 @@ async def list(
from whop_sdk import AsyncWhop
client = AsyncWhop(
- "2026-09-02-2",
+ "2026-09-06",
idempotency_key="YOUR_IDEMPOTENCY_KEY",
token="YOUR_TOKEN",
)
@@ -773,7 +773,7 @@ async def create(
Parameters
----------
account_id : typing.Optional[str]
- The unique identifier of the account to create this plan for. Defaults to the caller's account.
+ The unique identifier of the account to create this plan for. Required when authenticating as a user; an account API key supplies its own account.
adaptive_pricing_enabled : typing.Optional[bool]
Whether this plan accepts local currency payments via adaptive pricing.
@@ -800,7 +800,7 @@ async def create(
An image displayed on the product page to represent this plan.
initial_price : typing.Optional[float]
- Initial amount charged in the plan's currency, e.g. 10.43 for $10.43.
+ Initial amount charged in the plan's currency, e.g. 10.43 for $10.43. A paid fiat plan charges at least 1.00 in its currency; use 0 for free.
internal_notes : typing.Optional[str]
Private notes visible only to the account owner. Not shown to customers.
@@ -824,7 +824,7 @@ async def create(
Sales method for this plan.
renewal_price : typing.Optional[float]
- The amount charged each billing period for recurring plans, in the plan's currency.
+ The amount charged each billing period for recurring plans, in the plan's currency. A paid fiat plan charges at least 1.00 in its currency.
split_pay_required_payments : typing.Optional[int]
Installment payments required before the subscription pauses.
@@ -862,7 +862,7 @@ async def create(
from whop_sdk import AsyncWhop
client = AsyncWhop(
- "2026-09-02-2",
+ "2026-09-06",
idempotency_key="YOUR_IDEMPOTENCY_KEY",
token="YOUR_TOKEN",
)
@@ -928,7 +928,7 @@ async def retrieve(self, id: str, *, request_options: typing.Optional[RequestOpt
from whop_sdk import AsyncWhop
client = AsyncWhop(
- "2026-09-02-2",
+ "2026-09-06",
idempotency_key="YOUR_IDEMPOTENCY_KEY",
token="YOUR_TOKEN",
)
@@ -969,7 +969,7 @@ async def delete(self, id: str, *, request_options: typing.Optional[RequestOptio
from whop_sdk import AsyncWhop
client = AsyncWhop(
- "2026-09-02-2",
+ "2026-09-06",
idempotency_key="YOUR_IDEMPOTENCY_KEY",
token="YOUR_TOKEN",
)
@@ -1057,7 +1057,7 @@ async def update(
An image displayed on the product page to represent this plan.
initial_price : typing.Optional[float]
- Initial amount charged in the plan's currency, e.g. 10.43 for $10.43.
+ Initial amount charged in the plan's currency, e.g. 10.43 for $10.43. A paid fiat plan charges at least 1.00 in its currency; use 0 for free.
internal_notes : typing.Optional[str]
Private notes visible only to the account owner. Not shown to customers.
@@ -1078,7 +1078,7 @@ async def update(
Sales method for this plan.
renewal_price : typing.Optional[float]
- The amount charged each billing period for recurring plans, in the plan's currency.
+ The amount charged each billing period for recurring plans, in the plan's currency. A paid fiat plan charges at least 1.00 in its currency.
stock : typing.Optional[int]
The maximum number of units available for purchase. Ignored when unlimited_stock is true.
@@ -1119,7 +1119,7 @@ async def update(
from whop_sdk import AsyncWhop
client = AsyncWhop(
- "2026-09-02-2",
+ "2026-09-06",
idempotency_key="YOUR_IDEMPOTENCY_KEY",
token="YOUR_TOKEN",
)
@@ -1207,7 +1207,7 @@ async def calculate_tax(
from whop_sdk.plans import CalculateTaxPlansRequestAddress
client = AsyncWhop(
- "2026-09-02-2",
+ "2026-09-06",
idempotency_key="YOUR_IDEMPOTENCY_KEY",
token="YOUR_TOKEN",
)
diff --git a/src/whop_sdk/plans/raw_client.py b/src/whop_sdk/plans/raw_client.py
index 871575e6..3b788613 100644
--- a/src/whop_sdk/plans/raw_client.py
+++ b/src/whop_sdk/plans/raw_client.py
@@ -234,7 +234,7 @@ def create(
Parameters
----------
account_id : typing.Optional[str]
- The unique identifier of the account to create this plan for. Defaults to the caller's account.
+ The unique identifier of the account to create this plan for. Required when authenticating as a user; an account API key supplies its own account.
adaptive_pricing_enabled : typing.Optional[bool]
Whether this plan accepts local currency payments via adaptive pricing.
@@ -261,7 +261,7 @@ def create(
An image displayed on the product page to represent this plan.
initial_price : typing.Optional[float]
- Initial amount charged in the plan's currency, e.g. 10.43 for $10.43.
+ Initial amount charged in the plan's currency, e.g. 10.43 for $10.43. A paid fiat plan charges at least 1.00 in its currency; use 0 for free.
internal_notes : typing.Optional[str]
Private notes visible only to the account owner. Not shown to customers.
@@ -285,7 +285,7 @@ def create(
Sales method for this plan.
renewal_price : typing.Optional[float]
- The amount charged each billing period for recurring plans, in the plan's currency.
+ The amount charged each billing period for recurring plans, in the plan's currency. A paid fiat plan charges at least 1.00 in its currency.
split_pay_required_payments : typing.Optional[int]
Installment payments required before the subscription pauses.
@@ -591,7 +591,7 @@ def update(
An image displayed on the product page to represent this plan.
initial_price : typing.Optional[float]
- Initial amount charged in the plan's currency, e.g. 10.43 for $10.43.
+ Initial amount charged in the plan's currency, e.g. 10.43 for $10.43. A paid fiat plan charges at least 1.00 in its currency; use 0 for free.
internal_notes : typing.Optional[str]
Private notes visible only to the account owner. Not shown to customers.
@@ -612,7 +612,7 @@ def update(
Sales method for this plan.
renewal_price : typing.Optional[float]
- The amount charged each billing period for recurring plans, in the plan's currency.
+ The amount charged each billing period for recurring plans, in the plan's currency. A paid fiat plan charges at least 1.00 in its currency.
stock : typing.Optional[int]
The maximum number of units available for purchase. Ignored when unlimited_stock is true.
@@ -1048,7 +1048,7 @@ async def create(
Parameters
----------
account_id : typing.Optional[str]
- The unique identifier of the account to create this plan for. Defaults to the caller's account.
+ The unique identifier of the account to create this plan for. Required when authenticating as a user; an account API key supplies its own account.
adaptive_pricing_enabled : typing.Optional[bool]
Whether this plan accepts local currency payments via adaptive pricing.
@@ -1075,7 +1075,7 @@ async def create(
An image displayed on the product page to represent this plan.
initial_price : typing.Optional[float]
- Initial amount charged in the plan's currency, e.g. 10.43 for $10.43.
+ Initial amount charged in the plan's currency, e.g. 10.43 for $10.43. A paid fiat plan charges at least 1.00 in its currency; use 0 for free.
internal_notes : typing.Optional[str]
Private notes visible only to the account owner. Not shown to customers.
@@ -1099,7 +1099,7 @@ async def create(
Sales method for this plan.
renewal_price : typing.Optional[float]
- The amount charged each billing period for recurring plans, in the plan's currency.
+ The amount charged each billing period for recurring plans, in the plan's currency. A paid fiat plan charges at least 1.00 in its currency.
split_pay_required_payments : typing.Optional[int]
Installment payments required before the subscription pauses.
@@ -1407,7 +1407,7 @@ async def update(
An image displayed on the product page to represent this plan.
initial_price : typing.Optional[float]
- Initial amount charged in the plan's currency, e.g. 10.43 for $10.43.
+ Initial amount charged in the plan's currency, e.g. 10.43 for $10.43. A paid fiat plan charges at least 1.00 in its currency; use 0 for free.
internal_notes : typing.Optional[str]
Private notes visible only to the account owner. Not shown to customers.
@@ -1428,7 +1428,7 @@ async def update(
Sales method for this plan.
renewal_price : typing.Optional[float]
- The amount charged each billing period for recurring plans, in the plan's currency.
+ The amount charged each billing period for recurring plans, in the plan's currency. A paid fiat plan charges at least 1.00 in its currency.
stock : typing.Optional[int]
The maximum number of units available for purchase. Ignored when unlimited_stock is true.
diff --git a/src/whop_sdk/products/client.py b/src/whop_sdk/products/client.py
index c34d40d1..ae0c528c 100644
--- a/src/whop_sdk/products/client.py
+++ b/src/whop_sdk/products/client.py
@@ -129,7 +129,7 @@ def list(
from whop_sdk import Whop
client = Whop(
- "2026-09-02-2",
+ "2026-09-06",
idempotency_key="YOUR_IDEMPOTENCY_KEY",
token="YOUR_TOKEN",
)
@@ -263,7 +263,7 @@ def create(
from whop_sdk import Whop
client = Whop(
- "2026-09-02-2",
+ "2026-09-06",
idempotency_key="YOUR_IDEMPOTENCY_KEY",
token="YOUR_TOKEN",
)
@@ -317,7 +317,7 @@ def retrieve(self, id: str, *, request_options: typing.Optional[RequestOptions]
from whop_sdk import Whop
client = Whop(
- "2026-09-02-2",
+ "2026-09-06",
idempotency_key="YOUR_IDEMPOTENCY_KEY",
token="YOUR_TOKEN",
)
@@ -350,7 +350,7 @@ def delete(self, id: str, *, request_options: typing.Optional[RequestOptions] =
from whop_sdk import Whop
client = Whop(
- "2026-09-02-2",
+ "2026-09-06",
idempotency_key="YOUR_IDEMPOTENCY_KEY",
token="YOUR_TOKEN",
)
@@ -424,7 +424,7 @@ def update(
from whop_sdk import Whop
client = Whop(
- "2026-09-02-2",
+ "2026-09-06",
idempotency_key="YOUR_IDEMPOTENCY_KEY",
token="YOUR_TOKEN",
)
@@ -449,7 +449,7 @@ def update(
def publish(self, id: str, *, request_options: typing.Optional[RequestOptions] = None) -> Product:
"""
- Submits a product to the whop.com marketplace for review. The product moves to `pending_review`; a Whop reviewer approves it before it goes live.
+ Submits a product to the whop.com marketplace for review. The product moves to `pending_review`; a Whop reviewer approves it before it goes live. Requires a logo, a headline, and at least one gallery image or video; the request fails naming whichever is missing.
Parameters
----------
@@ -469,7 +469,7 @@ def publish(self, id: str, *, request_options: typing.Optional[RequestOptions] =
from whop_sdk import Whop
client = Whop(
- "2026-09-02-2",
+ "2026-09-06",
idempotency_key="YOUR_IDEMPOTENCY_KEY",
token="YOUR_TOKEN",
)
@@ -502,7 +502,7 @@ def unpublish(self, id: str, *, request_options: typing.Optional[RequestOptions]
from whop_sdk import Whop
client = Whop(
- "2026-09-02-2",
+ "2026-09-06",
idempotency_key="YOUR_IDEMPOTENCY_KEY",
token="YOUR_TOKEN",
)
@@ -624,7 +624,7 @@ async def list(
from whop_sdk import AsyncWhop
client = AsyncWhop(
- "2026-09-02-2",
+ "2026-09-06",
idempotency_key="YOUR_IDEMPOTENCY_KEY",
token="YOUR_TOKEN",
)
@@ -767,7 +767,7 @@ async def create(
from whop_sdk import AsyncWhop
client = AsyncWhop(
- "2026-09-02-2",
+ "2026-09-06",
idempotency_key="YOUR_IDEMPOTENCY_KEY",
token="YOUR_TOKEN",
)
@@ -829,7 +829,7 @@ async def retrieve(self, id: str, *, request_options: typing.Optional[RequestOpt
from whop_sdk import AsyncWhop
client = AsyncWhop(
- "2026-09-02-2",
+ "2026-09-06",
idempotency_key="YOUR_IDEMPOTENCY_KEY",
token="YOUR_TOKEN",
)
@@ -872,7 +872,7 @@ async def delete(
from whop_sdk import AsyncWhop
client = AsyncWhop(
- "2026-09-02-2",
+ "2026-09-06",
idempotency_key="YOUR_IDEMPOTENCY_KEY",
token="YOUR_TOKEN",
)
@@ -954,7 +954,7 @@ async def update(
from whop_sdk import AsyncWhop
client = AsyncWhop(
- "2026-09-02-2",
+ "2026-09-06",
idempotency_key="YOUR_IDEMPOTENCY_KEY",
token="YOUR_TOKEN",
)
@@ -985,7 +985,7 @@ async def main() -> None:
async def publish(self, id: str, *, request_options: typing.Optional[RequestOptions] = None) -> Product:
"""
- Submits a product to the whop.com marketplace for review. The product moves to `pending_review`; a Whop reviewer approves it before it goes live.
+ Submits a product to the whop.com marketplace for review. The product moves to `pending_review`; a Whop reviewer approves it before it goes live. Requires a logo, a headline, and at least one gallery image or video; the request fails naming whichever is missing.
Parameters
----------
@@ -1007,7 +1007,7 @@ async def publish(self, id: str, *, request_options: typing.Optional[RequestOpti
from whop_sdk import AsyncWhop
client = AsyncWhop(
- "2026-09-02-2",
+ "2026-09-06",
idempotency_key="YOUR_IDEMPOTENCY_KEY",
token="YOUR_TOKEN",
)
@@ -1048,7 +1048,7 @@ async def unpublish(self, id: str, *, request_options: typing.Optional[RequestOp
from whop_sdk import AsyncWhop
client = AsyncWhop(
- "2026-09-02-2",
+ "2026-09-06",
idempotency_key="YOUR_IDEMPOTENCY_KEY",
token="YOUR_TOKEN",
)
diff --git a/src/whop_sdk/products/raw_client.py b/src/whop_sdk/products/raw_client.py
index b66d97a0..9e3f838d 100644
--- a/src/whop_sdk/products/raw_client.py
+++ b/src/whop_sdk/products/raw_client.py
@@ -623,7 +623,7 @@ def update(
def publish(self, id: str, *, request_options: typing.Optional[RequestOptions] = None) -> HttpResponse[Product]:
"""
- Submits a product to the whop.com marketplace for review. The product moves to `pending_review`; a Whop reviewer approves it before it goes live.
+ Submits a product to the whop.com marketplace for review. The product moves to `pending_review`; a Whop reviewer approves it before it goes live. Requires a logo, a headline, and at least one gallery image or video; the request fails naming whichever is missing.
Parameters
----------
@@ -1367,7 +1367,7 @@ async def publish(
self, id: str, *, request_options: typing.Optional[RequestOptions] = None
) -> AsyncHttpResponse[Product]:
"""
- Submits a product to the whop.com marketplace for review. The product moves to `pending_review`; a Whop reviewer approves it before it goes live.
+ Submits a product to the whop.com marketplace for review. The product moves to `pending_review`; a Whop reviewer approves it before it goes live. Requires a logo, a headline, and at least one gallery image or video; the request fails naming whichever is missing.
Parameters
----------
diff --git a/src/whop_sdk/promo_codes/client.py b/src/whop_sdk/promo_codes/client.py
index 798a357f..f476d806 100644
--- a/src/whop_sdk/promo_codes/client.py
+++ b/src/whop_sdk/promo_codes/client.py
@@ -107,7 +107,7 @@ def list(
from whop_sdk import Whop
client = Whop(
- "2026-09-02-2",
+ "2026-09-06",
idempotency_key="YOUR_IDEMPOTENCY_KEY",
token="YOUR_TOKEN",
)
@@ -206,7 +206,7 @@ def create(
from whop_sdk import Whop
client = Whop(
- "2026-09-02-2",
+ "2026-09-06",
idempotency_key="YOUR_IDEMPOTENCY_KEY",
token="YOUR_TOKEN",
)
@@ -262,7 +262,7 @@ def retrieve(self, id: str, *, request_options: typing.Optional[RequestOptions]
from whop_sdk import Whop
client = Whop(
- "2026-09-02-2",
+ "2026-09-06",
idempotency_key="YOUR_IDEMPOTENCY_KEY",
token="YOUR_TOKEN",
)
@@ -295,7 +295,7 @@ def delete(self, id: str, *, request_options: typing.Optional[RequestOptions] =
from whop_sdk import Whop
client = Whop(
- "2026-09-02-2",
+ "2026-09-06",
idempotency_key="YOUR_IDEMPOTENCY_KEY",
token="YOUR_TOKEN",
)
@@ -328,7 +328,7 @@ def activate(self, id: str, *, request_options: typing.Optional[RequestOptions]
from whop_sdk import Whop
client = Whop(
- "2026-09-02-2",
+ "2026-09-06",
idempotency_key="YOUR_IDEMPOTENCY_KEY",
token="YOUR_TOKEN",
)
@@ -361,7 +361,7 @@ def deactivate(self, id: str, *, request_options: typing.Optional[RequestOptions
from whop_sdk import Whop
client = Whop(
- "2026-09-02-2",
+ "2026-09-06",
idempotency_key="YOUR_IDEMPOTENCY_KEY",
token="YOUR_TOKEN",
)
@@ -461,7 +461,7 @@ async def list(
from whop_sdk import AsyncWhop
client = AsyncWhop(
- "2026-09-02-2",
+ "2026-09-06",
idempotency_key="YOUR_IDEMPOTENCY_KEY",
token="YOUR_TOKEN",
)
@@ -569,7 +569,7 @@ async def create(
from whop_sdk import AsyncWhop
client = AsyncWhop(
- "2026-09-02-2",
+ "2026-09-06",
idempotency_key="YOUR_IDEMPOTENCY_KEY",
token="YOUR_TOKEN",
)
@@ -633,7 +633,7 @@ async def retrieve(self, id: str, *, request_options: typing.Optional[RequestOpt
from whop_sdk import AsyncWhop
client = AsyncWhop(
- "2026-09-02-2",
+ "2026-09-06",
idempotency_key="YOUR_IDEMPOTENCY_KEY",
token="YOUR_TOKEN",
)
@@ -676,7 +676,7 @@ async def delete(
from whop_sdk import AsyncWhop
client = AsyncWhop(
- "2026-09-02-2",
+ "2026-09-06",
idempotency_key="YOUR_IDEMPOTENCY_KEY",
token="YOUR_TOKEN",
)
@@ -717,7 +717,7 @@ async def activate(self, id: str, *, request_options: typing.Optional[RequestOpt
from whop_sdk import AsyncWhop
client = AsyncWhop(
- "2026-09-02-2",
+ "2026-09-06",
idempotency_key="YOUR_IDEMPOTENCY_KEY",
token="YOUR_TOKEN",
)
@@ -758,7 +758,7 @@ async def deactivate(self, id: str, *, request_options: typing.Optional[RequestO
from whop_sdk import AsyncWhop
client = AsyncWhop(
- "2026-09-02-2",
+ "2026-09-06",
idempotency_key="YOUR_IDEMPOTENCY_KEY",
token="YOUR_TOKEN",
)
diff --git a/src/whop_sdk/reactions/client.py b/src/whop_sdk/reactions/client.py
index a3057ff4..62b024d6 100644
--- a/src/whop_sdk/reactions/client.py
+++ b/src/whop_sdk/reactions/client.py
@@ -79,7 +79,7 @@ def list(
from whop_sdk import Whop
client = Whop(
- "2026-09-02-2",
+ "2026-09-06",
idempotency_key="YOUR_IDEMPOTENCY_KEY",
token="YOUR_TOKEN",
)
@@ -140,7 +140,7 @@ def create(
from whop_sdk import Whop
client = Whop(
- "2026-09-02-2",
+ "2026-09-06",
idempotency_key="YOUR_IDEMPOTENCY_KEY",
token="YOUR_TOKEN",
)
@@ -182,7 +182,7 @@ def retrieve(self, id: str, *, request_options: typing.Optional[RequestOptions]
from whop_sdk import Whop
client = Whop(
- "2026-09-02-2",
+ "2026-09-06",
idempotency_key="YOUR_IDEMPOTENCY_KEY",
token="YOUR_TOKEN",
)
@@ -227,7 +227,7 @@ def delete(
from whop_sdk import Whop
client = Whop(
- "2026-09-02-2",
+ "2026-09-06",
idempotency_key="YOUR_IDEMPOTENCY_KEY",
token="YOUR_TOKEN",
)
@@ -306,7 +306,7 @@ async def list(
from whop_sdk import AsyncWhop
client = AsyncWhop(
- "2026-09-02-2",
+ "2026-09-06",
idempotency_key="YOUR_IDEMPOTENCY_KEY",
token="YOUR_TOKEN",
)
@@ -376,7 +376,7 @@ async def create(
from whop_sdk import AsyncWhop
client = AsyncWhop(
- "2026-09-02-2",
+ "2026-09-06",
idempotency_key="YOUR_IDEMPOTENCY_KEY",
token="YOUR_TOKEN",
)
@@ -426,7 +426,7 @@ async def retrieve(self, id: str, *, request_options: typing.Optional[RequestOpt
from whop_sdk import AsyncWhop
client = AsyncWhop(
- "2026-09-02-2",
+ "2026-09-06",
idempotency_key="YOUR_IDEMPOTENCY_KEY",
token="YOUR_TOKEN",
)
@@ -479,7 +479,7 @@ async def delete(
from whop_sdk import AsyncWhop
client = AsyncWhop(
- "2026-09-02-2",
+ "2026-09-06",
idempotency_key="YOUR_IDEMPOTENCY_KEY",
token="YOUR_TOKEN",
)
diff --git a/src/whop_sdk/recommended_actions/client.py b/src/whop_sdk/recommended_actions/client.py
index 50512e34..97fa7553 100644
--- a/src/whop_sdk/recommended_actions/client.py
+++ b/src/whop_sdk/recommended_actions/client.py
@@ -50,7 +50,7 @@ def list(
from whop_sdk import Whop
client = Whop(
- "2026-09-02-2",
+ "2026-09-06",
idempotency_key="YOUR_IDEMPOTENCY_KEY",
token="YOUR_TOKEN",
)
@@ -90,7 +90,7 @@ def retrieve(
from whop_sdk import Whop
client = Whop(
- "2026-09-02-2",
+ "2026-09-06",
idempotency_key="YOUR_IDEMPOTENCY_KEY",
token="YOUR_TOKEN",
)
@@ -132,7 +132,7 @@ def run(
from whop_sdk import Whop
client = Whop(
- "2026-09-02-2",
+ "2026-09-06",
idempotency_key="YOUR_IDEMPOTENCY_KEY",
token="YOUR_TOKEN",
)
@@ -174,7 +174,7 @@ def list_executions(
from whop_sdk import Whop
client = Whop(
- "2026-09-02-2",
+ "2026-09-06",
idempotency_key="YOUR_IDEMPOTENCY_KEY",
token="YOUR_TOKEN",
)
@@ -227,7 +227,7 @@ async def list(
from whop_sdk import AsyncWhop
client = AsyncWhop(
- "2026-09-02-2",
+ "2026-09-06",
idempotency_key="YOUR_IDEMPOTENCY_KEY",
token="YOUR_TOKEN",
)
@@ -275,7 +275,7 @@ async def retrieve(
from whop_sdk import AsyncWhop
client = AsyncWhop(
- "2026-09-02-2",
+ "2026-09-06",
idempotency_key="YOUR_IDEMPOTENCY_KEY",
token="YOUR_TOKEN",
)
@@ -325,7 +325,7 @@ async def run(
from whop_sdk import AsyncWhop
client = AsyncWhop(
- "2026-09-02-2",
+ "2026-09-06",
idempotency_key="YOUR_IDEMPOTENCY_KEY",
token="YOUR_TOKEN",
)
@@ -375,7 +375,7 @@ async def list_executions(
from whop_sdk import AsyncWhop
client = AsyncWhop(
- "2026-09-02-2",
+ "2026-09-06",
idempotency_key="YOUR_IDEMPOTENCY_KEY",
token="YOUR_TOKEN",
)
diff --git a/src/whop_sdk/refunds/client.py b/src/whop_sdk/refunds/client.py
index f3d71f2b..af0998db 100644
--- a/src/whop_sdk/refunds/client.py
+++ b/src/whop_sdk/refunds/client.py
@@ -95,7 +95,7 @@ def list(
from whop_sdk import Whop
client = Whop(
- "2026-09-02-2",
+ "2026-09-06",
idempotency_key="YOUR_IDEMPOTENCY_KEY",
token="YOUR_TOKEN",
)
@@ -143,7 +143,7 @@ def retrieve(self, id: str, *, request_options: typing.Optional[RequestOptions]
from whop_sdk import Whop
client = Whop(
- "2026-09-02-2",
+ "2026-09-06",
idempotency_key="YOUR_IDEMPOTENCY_KEY",
token="YOUR_TOKEN",
)
@@ -239,7 +239,7 @@ async def list(
from whop_sdk import AsyncWhop
client = AsyncWhop(
- "2026-09-02-2",
+ "2026-09-06",
idempotency_key="YOUR_IDEMPOTENCY_KEY",
token="YOUR_TOKEN",
)
@@ -296,7 +296,7 @@ async def retrieve(self, id: str, *, request_options: typing.Optional[RequestOpt
from whop_sdk import AsyncWhop
client = AsyncWhop(
- "2026-09-02-2",
+ "2026-09-06",
idempotency_key="YOUR_IDEMPOTENCY_KEY",
token="YOUR_TOKEN",
)
diff --git a/src/whop_sdk/resolution_center_cases/client.py b/src/whop_sdk/resolution_center_cases/client.py
index 23317bad..9f6f4e88 100644
--- a/src/whop_sdk/resolution_center_cases/client.py
+++ b/src/whop_sdk/resolution_center_cases/client.py
@@ -145,7 +145,7 @@ def list(
from whop_sdk import Whop
client = Whop(
- "2026-09-02-2",
+ "2026-09-06",
idempotency_key="YOUR_IDEMPOTENCY_KEY",
token="YOUR_TOKEN",
)
@@ -211,7 +211,7 @@ def create(
from whop_sdk import Whop
client = Whop(
- "2026-09-02-2",
+ "2026-09-06",
idempotency_key="YOUR_IDEMPOTENCY_KEY",
token="YOUR_TOKEN",
)
@@ -305,7 +305,7 @@ def summary(
from whop_sdk import Whop
client = Whop(
- "2026-09-02-2",
+ "2026-09-06",
idempotency_key="YOUR_IDEMPOTENCY_KEY",
token="YOUR_TOKEN",
)
@@ -346,7 +346,7 @@ def retrieve(self, id: str, *, request_options: typing.Optional[RequestOptions]
from whop_sdk import Whop
client = Whop(
- "2026-09-02-2",
+ "2026-09-06",
idempotency_key="YOUR_IDEMPOTENCY_KEY",
token="YOUR_TOKEN",
)
@@ -396,7 +396,7 @@ def accept(
from whop_sdk import Whop
client = Whop(
- "2026-09-02-2",
+ "2026-09-06",
idempotency_key="YOUR_IDEMPOTENCY_KEY",
token="YOUR_TOKEN",
)
@@ -448,7 +448,7 @@ def appeal(
from whop_sdk import Whop
client = Whop(
- "2026-09-02-2",
+ "2026-09-06",
idempotency_key="YOUR_IDEMPOTENCY_KEY",
token="YOUR_TOKEN",
)
@@ -497,7 +497,7 @@ def deny(
from whop_sdk import Whop
client = Whop(
- "2026-09-02-2",
+ "2026-09-06",
idempotency_key="YOUR_IDEMPOTENCY_KEY",
token="YOUR_TOKEN",
)
@@ -552,7 +552,7 @@ def events(
from whop_sdk import Whop
client = Whop(
- "2026-09-02-2",
+ "2026-09-06",
idempotency_key="YOUR_IDEMPOTENCY_KEY",
token="YOUR_TOKEN",
)
@@ -604,7 +604,7 @@ def reply(
from whop_sdk import Whop
client = Whop(
- "2026-09-02-2",
+ "2026-09-06",
idempotency_key="YOUR_IDEMPOTENCY_KEY",
token="YOUR_TOKEN",
)
@@ -653,7 +653,7 @@ def request_info(
from whop_sdk import Whop
client = Whop(
- "2026-09-02-2",
+ "2026-09-06",
idempotency_key="YOUR_IDEMPOTENCY_KEY",
token="YOUR_TOKEN",
)
@@ -688,7 +688,7 @@ def withdraw(self, id: str, *, request_options: typing.Optional[RequestOptions]
from whop_sdk import Whop
client = Whop(
- "2026-09-02-2",
+ "2026-09-06",
idempotency_key="YOUR_IDEMPOTENCY_KEY",
token="YOUR_TOKEN",
)
@@ -805,7 +805,7 @@ async def list(
from whop_sdk import AsyncWhop
client = AsyncWhop(
- "2026-09-02-2",
+ "2026-09-06",
idempotency_key="YOUR_IDEMPOTENCY_KEY",
token="YOUR_TOKEN",
)
@@ -880,7 +880,7 @@ async def create(
from whop_sdk import AsyncWhop
client = AsyncWhop(
- "2026-09-02-2",
+ "2026-09-06",
idempotency_key="YOUR_IDEMPOTENCY_KEY",
token="YOUR_TOKEN",
)
@@ -982,7 +982,7 @@ async def summary(
from whop_sdk import AsyncWhop
client = AsyncWhop(
- "2026-09-02-2",
+ "2026-09-06",
idempotency_key="YOUR_IDEMPOTENCY_KEY",
token="YOUR_TOKEN",
)
@@ -1033,7 +1033,7 @@ async def retrieve(
from whop_sdk import AsyncWhop
client = AsyncWhop(
- "2026-09-02-2",
+ "2026-09-06",
idempotency_key="YOUR_IDEMPOTENCY_KEY",
token="YOUR_TOKEN",
)
@@ -1091,7 +1091,7 @@ async def accept(
from whop_sdk import AsyncWhop
client = AsyncWhop(
- "2026-09-02-2",
+ "2026-09-06",
idempotency_key="YOUR_IDEMPOTENCY_KEY",
token="YOUR_TOKEN",
)
@@ -1151,7 +1151,7 @@ async def appeal(
from whop_sdk import AsyncWhop
client = AsyncWhop(
- "2026-09-02-2",
+ "2026-09-06",
idempotency_key="YOUR_IDEMPOTENCY_KEY",
token="YOUR_TOKEN",
)
@@ -1208,7 +1208,7 @@ async def deny(
from whop_sdk import AsyncWhop
client = AsyncWhop(
- "2026-09-02-2",
+ "2026-09-06",
idempotency_key="YOUR_IDEMPOTENCY_KEY",
token="YOUR_TOKEN",
)
@@ -1273,7 +1273,7 @@ async def events(
from whop_sdk import AsyncWhop
client = AsyncWhop(
- "2026-09-02-2",
+ "2026-09-06",
idempotency_key="YOUR_IDEMPOTENCY_KEY",
token="YOUR_TOKEN",
)
@@ -1334,7 +1334,7 @@ async def reply(
from whop_sdk import AsyncWhop
client = AsyncWhop(
- "2026-09-02-2",
+ "2026-09-06",
idempotency_key="YOUR_IDEMPOTENCY_KEY",
token="YOUR_TOKEN",
)
@@ -1391,7 +1391,7 @@ async def request_info(
from whop_sdk import AsyncWhop
client = AsyncWhop(
- "2026-09-02-2",
+ "2026-09-06",
idempotency_key="YOUR_IDEMPOTENCY_KEY",
token="YOUR_TOKEN",
)
@@ -1436,7 +1436,7 @@ async def withdraw(
from whop_sdk import AsyncWhop
client = AsyncWhop(
- "2026-09-02-2",
+ "2026-09-06",
idempotency_key="YOUR_IDEMPOTENCY_KEY",
token="YOUR_TOKEN",
)
diff --git a/src/whop_sdk/reviews/client.py b/src/whop_sdk/reviews/client.py
index 68706b92..486076db 100644
--- a/src/whop_sdk/reviews/client.py
+++ b/src/whop_sdk/reviews/client.py
@@ -88,7 +88,7 @@ def list(
from whop_sdk import Whop
client = Whop(
- "2026-09-02-2",
+ "2026-09-06",
idempotency_key="YOUR_IDEMPOTENCY_KEY",
token="YOUR_TOKEN",
)
@@ -146,7 +146,7 @@ def retrieve(self, id: str, *, request_options: typing.Optional[RequestOptions]
from whop_sdk import Whop
client = Whop(
- "2026-09-02-2",
+ "2026-09-06",
idempotency_key="YOUR_IDEMPOTENCY_KEY",
token="YOUR_TOKEN",
)
@@ -235,7 +235,7 @@ async def list(
from whop_sdk import AsyncWhop
client = AsyncWhop(
- "2026-09-02-2",
+ "2026-09-06",
idempotency_key="YOUR_IDEMPOTENCY_KEY",
token="YOUR_TOKEN",
)
@@ -302,7 +302,7 @@ async def retrieve(self, id: str, *, request_options: typing.Optional[RequestOpt
from whop_sdk import AsyncWhop
client = AsyncWhop(
- "2026-09-02-2",
+ "2026-09-06",
idempotency_key="YOUR_IDEMPOTENCY_KEY",
token="YOUR_TOKEN",
)
diff --git a/src/whop_sdk/setup_intents/client.py b/src/whop_sdk/setup_intents/client.py
index d09ea04d..648c98dd 100644
--- a/src/whop_sdk/setup_intents/client.py
+++ b/src/whop_sdk/setup_intents/client.py
@@ -95,7 +95,7 @@ def list(
from whop_sdk import Whop
client = Whop(
- "2026-09-02-2",
+ "2026-09-06",
idempotency_key="YOUR_IDEMPOTENCY_KEY",
token="YOUR_TOKEN",
)
@@ -157,7 +157,7 @@ def create(
from whop_sdk.setup_intents import CreateSetupIntentsRequestConfirmationToken
client = Whop(
- "2026-09-02-2",
+ "2026-09-06",
idempotency_key="YOUR_IDEMPOTENCY_KEY",
token="YOUR_TOKEN",
)
@@ -198,7 +198,7 @@ def retrieve(self, id: str, *, request_options: typing.Optional[RequestOptions]
from whop_sdk import Whop
client = Whop(
- "2026-09-02-2",
+ "2026-09-06",
idempotency_key="YOUR_IDEMPOTENCY_KEY",
token="YOUR_TOKEN",
)
@@ -236,7 +236,7 @@ def update_return_url(
from whop_sdk import Whop
client = Whop(
- "2026-09-02-2",
+ "2026-09-06",
idempotency_key="YOUR_IDEMPOTENCY_KEY",
token="YOUR_TOKEN",
)
@@ -274,7 +274,7 @@ def retrieve_status(
from whop_sdk import Whop
client = Whop(
- "2026-09-02-2",
+ "2026-09-06",
idempotency_key="YOUR_IDEMPOTENCY_KEY",
token="YOUR_TOKEN",
)
@@ -363,7 +363,7 @@ async def list(
from whop_sdk import AsyncWhop
client = AsyncWhop(
- "2026-09-02-2",
+ "2026-09-06",
idempotency_key="YOUR_IDEMPOTENCY_KEY",
token="YOUR_TOKEN",
)
@@ -434,7 +434,7 @@ async def create(
from whop_sdk.setup_intents import CreateSetupIntentsRequestConfirmationToken
client = AsyncWhop(
- "2026-09-02-2",
+ "2026-09-06",
idempotency_key="YOUR_IDEMPOTENCY_KEY",
token="YOUR_TOKEN",
)
@@ -483,7 +483,7 @@ async def retrieve(self, id: str, *, request_options: typing.Optional[RequestOpt
from whop_sdk import AsyncWhop
client = AsyncWhop(
- "2026-09-02-2",
+ "2026-09-06",
idempotency_key="YOUR_IDEMPOTENCY_KEY",
token="YOUR_TOKEN",
)
@@ -529,7 +529,7 @@ async def update_return_url(
from whop_sdk import AsyncWhop
client = AsyncWhop(
- "2026-09-02-2",
+ "2026-09-06",
idempotency_key="YOUR_IDEMPOTENCY_KEY",
token="YOUR_TOKEN",
)
@@ -575,7 +575,7 @@ async def retrieve_status(
from whop_sdk import AsyncWhop
client = AsyncWhop(
- "2026-09-02-2",
+ "2026-09-06",
idempotency_key="YOUR_IDEMPOTENCY_KEY",
token="YOUR_TOKEN",
)
diff --git a/src/whop_sdk/shipments/client.py b/src/whop_sdk/shipments/client.py
index 3235e808..d6c17d75 100644
--- a/src/whop_sdk/shipments/client.py
+++ b/src/whop_sdk/shipments/client.py
@@ -98,7 +98,7 @@ def list(
from whop_sdk import Whop
client = Whop(
- "2026-09-02-2",
+ "2026-09-06",
idempotency_key="YOUR_IDEMPOTENCY_KEY",
token="YOUR_TOKEN",
)
@@ -161,7 +161,7 @@ def create(
from whop_sdk import Whop
client = Whop(
- "2026-09-02-2",
+ "2026-09-06",
idempotency_key="YOUR_IDEMPOTENCY_KEY",
token="YOUR_TOKEN",
)
@@ -200,7 +200,7 @@ def retrieve(self, id: str, *, request_options: typing.Optional[RequestOptions]
from whop_sdk import Whop
client = Whop(
- "2026-09-02-2",
+ "2026-09-06",
idempotency_key="YOUR_IDEMPOTENCY_KEY",
token="YOUR_TOKEN",
)
@@ -238,7 +238,7 @@ def update(
from whop_sdk import Whop
client = Whop(
- "2026-09-02-2",
+ "2026-09-06",
idempotency_key="YOUR_IDEMPOTENCY_KEY",
token="YOUR_TOKEN",
)
@@ -335,7 +335,7 @@ async def list(
from whop_sdk import AsyncWhop
client = AsyncWhop(
- "2026-09-02-2",
+ "2026-09-06",
idempotency_key="YOUR_IDEMPOTENCY_KEY",
token="YOUR_TOKEN",
)
@@ -407,7 +407,7 @@ async def create(
from whop_sdk import AsyncWhop
client = AsyncWhop(
- "2026-09-02-2",
+ "2026-09-06",
idempotency_key="YOUR_IDEMPOTENCY_KEY",
token="YOUR_TOKEN",
)
@@ -454,7 +454,7 @@ async def retrieve(self, id: str, *, request_options: typing.Optional[RequestOpt
from whop_sdk import AsyncWhop
client = AsyncWhop(
- "2026-09-02-2",
+ "2026-09-06",
idempotency_key="YOUR_IDEMPOTENCY_KEY",
token="YOUR_TOKEN",
)
@@ -500,7 +500,7 @@ async def update(
from whop_sdk import AsyncWhop
client = AsyncWhop(
- "2026-09-02-2",
+ "2026-09-06",
idempotency_key="YOUR_IDEMPOTENCY_KEY",
token="YOUR_TOKEN",
)
diff --git a/src/whop_sdk/social_accounts/client.py b/src/whop_sdk/social_accounts/client.py
index e068493a..4ed7b2f2 100644
--- a/src/whop_sdk/social_accounts/client.py
+++ b/src/whop_sdk/social_accounts/client.py
@@ -109,7 +109,7 @@ def list(
from whop_sdk import Whop
client = Whop(
- "2026-09-02-2",
+ "2026-09-06",
idempotency_key="YOUR_IDEMPOTENCY_KEY",
token="YOUR_TOKEN",
)
@@ -166,7 +166,7 @@ def create(
from whop_sdk import Whop
client = Whop(
- "2026-09-02-2",
+ "2026-09-06",
idempotency_key="YOUR_IDEMPOTENCY_KEY",
token="YOUR_TOKEN",
)
@@ -216,7 +216,7 @@ def connect(
from whop_sdk import Whop
client = Whop(
- "2026-09-02-2",
+ "2026-09-06",
idempotency_key="YOUR_IDEMPOTENCY_KEY",
token="YOUR_TOKEN",
)
@@ -269,7 +269,7 @@ def delete(
from whop_sdk import Whop
client = Whop(
- "2026-09-02-2",
+ "2026-09-06",
idempotency_key="YOUR_IDEMPOTENCY_KEY",
token="YOUR_TOKEN",
)
@@ -307,7 +307,7 @@ def lead_forms(
from whop_sdk import Whop
client = Whop(
- "2026-09-02-2",
+ "2026-09-06",
idempotency_key="YOUR_IDEMPOTENCY_KEY",
token="YOUR_TOKEN",
)
@@ -362,7 +362,7 @@ def posts(
from whop_sdk import Whop
client = Whop(
- "2026-09-02-2",
+ "2026-09-06",
idempotency_key="YOUR_IDEMPOTENCY_KEY",
token="YOUR_TOKEN",
)
@@ -467,7 +467,7 @@ async def list(
from whop_sdk import AsyncWhop
client = AsyncWhop(
- "2026-09-02-2",
+ "2026-09-06",
idempotency_key="YOUR_IDEMPOTENCY_KEY",
token="YOUR_TOKEN",
)
@@ -533,7 +533,7 @@ async def create(
from whop_sdk import AsyncWhop
client = AsyncWhop(
- "2026-09-02-2",
+ "2026-09-06",
idempotency_key="YOUR_IDEMPOTENCY_KEY",
token="YOUR_TOKEN",
)
@@ -593,7 +593,7 @@ async def connect(
from whop_sdk import AsyncWhop
client = AsyncWhop(
- "2026-09-02-2",
+ "2026-09-06",
idempotency_key="YOUR_IDEMPOTENCY_KEY",
token="YOUR_TOKEN",
)
@@ -654,7 +654,7 @@ async def delete(
from whop_sdk import AsyncWhop
client = AsyncWhop(
- "2026-09-02-2",
+ "2026-09-06",
idempotency_key="YOUR_IDEMPOTENCY_KEY",
token="YOUR_TOKEN",
)
@@ -702,7 +702,7 @@ async def lead_forms(
from whop_sdk import AsyncWhop
client = AsyncWhop(
- "2026-09-02-2",
+ "2026-09-06",
idempotency_key="YOUR_IDEMPOTENCY_KEY",
token="YOUR_TOKEN",
)
@@ -765,7 +765,7 @@ async def posts(
from whop_sdk import AsyncWhop
client = AsyncWhop(
- "2026-09-02-2",
+ "2026-09-06",
idempotency_key="YOUR_IDEMPOTENCY_KEY",
token="YOUR_TOKEN",
)
diff --git a/src/whop_sdk/stats/client.py b/src/whop_sdk/stats/client.py
index f5ccdec7..6b86bd37 100644
--- a/src/whop_sdk/stats/client.py
+++ b/src/whop_sdk/stats/client.py
@@ -51,7 +51,7 @@ def list(self, *, request_options: typing.Optional[RequestOptions] = None) -> Li
from whop_sdk import Whop
client = Whop(
- "2026-09-02-2",
+ "2026-09-06",
idempotency_key="YOUR_IDEMPOTENCY_KEY",
token="YOUR_TOKEN",
)
@@ -98,7 +98,7 @@ def describe_stats(
from whop_sdk import Whop
client = Whop(
- "2026-09-02-2",
+ "2026-09-06",
idempotency_key="YOUR_IDEMPOTENCY_KEY",
token="YOUR_TOKEN",
)
@@ -176,7 +176,7 @@ def metric_stats(
from whop_sdk import Whop
client = Whop(
- "2026-09-02-2",
+ "2026-09-06",
idempotency_key="YOUR_IDEMPOTENCY_KEY",
token="YOUR_TOKEN",
)
@@ -269,7 +269,7 @@ def raw_stats(
from whop_sdk import Whop
client = Whop(
- "2026-09-02-2",
+ "2026-09-06",
idempotency_key="YOUR_IDEMPOTENCY_KEY",
token="YOUR_TOKEN",
)
@@ -463,7 +463,7 @@ def retrieve(
from whop_sdk import Whop
client = Whop(
- "2026-09-02-2",
+ "2026-09-06",
idempotency_key="YOUR_IDEMPOTENCY_KEY",
token="YOUR_TOKEN",
)
@@ -553,7 +553,7 @@ async def list(self, *, request_options: typing.Optional[RequestOptions] = None)
from whop_sdk import AsyncWhop
client = AsyncWhop(
- "2026-09-02-2",
+ "2026-09-06",
idempotency_key="YOUR_IDEMPOTENCY_KEY",
token="YOUR_TOKEN",
)
@@ -608,7 +608,7 @@ async def describe_stats(
from whop_sdk import AsyncWhop
client = AsyncWhop(
- "2026-09-02-2",
+ "2026-09-06",
idempotency_key="YOUR_IDEMPOTENCY_KEY",
token="YOUR_TOKEN",
)
@@ -693,7 +693,7 @@ async def metric_stats(
from whop_sdk import AsyncWhop
client = AsyncWhop(
- "2026-09-02-2",
+ "2026-09-06",
idempotency_key="YOUR_IDEMPOTENCY_KEY",
token="YOUR_TOKEN",
)
@@ -793,7 +793,7 @@ async def raw_stats(
from whop_sdk import AsyncWhop
client = AsyncWhop(
- "2026-09-02-2",
+ "2026-09-06",
idempotency_key="YOUR_IDEMPOTENCY_KEY",
token="YOUR_TOKEN",
)
@@ -995,7 +995,7 @@ async def retrieve(
from whop_sdk import AsyncWhop
client = AsyncWhop(
- "2026-09-02-2",
+ "2026-09-06",
idempotency_key="YOUR_IDEMPOTENCY_KEY",
token="YOUR_TOKEN",
)
diff --git a/src/whop_sdk/support_channels/client.py b/src/whop_sdk/support_channels/client.py
index 193ced17..4b187d3a 100644
--- a/src/whop_sdk/support_channels/client.py
+++ b/src/whop_sdk/support_channels/client.py
@@ -91,7 +91,7 @@ def list(
from whop_sdk import Whop
client = Whop(
- "2026-09-02-2",
+ "2026-09-06",
idempotency_key="YOUR_IDEMPOTENCY_KEY",
token="YOUR_TOKEN",
)
@@ -161,7 +161,7 @@ def create(
from whop_sdk import Whop
client = Whop(
- "2026-09-02-2",
+ "2026-09-06",
idempotency_key="YOUR_IDEMPOTENCY_KEY",
token="YOUR_TOKEN",
)
@@ -204,7 +204,7 @@ def retrieve(self, id: str, *, request_options: typing.Optional[RequestOptions]
from whop_sdk import Whop
client = Whop(
- "2026-09-02-2",
+ "2026-09-06",
idempotency_key="YOUR_IDEMPOTENCY_KEY",
token="YOUR_TOKEN",
)
@@ -292,7 +292,7 @@ async def list(
from whop_sdk import AsyncWhop
client = AsyncWhop(
- "2026-09-02-2",
+ "2026-09-06",
idempotency_key="YOUR_IDEMPOTENCY_KEY",
token="YOUR_TOKEN",
)
@@ -371,7 +371,7 @@ async def create(
from whop_sdk import AsyncWhop
client = AsyncWhop(
- "2026-09-02-2",
+ "2026-09-06",
idempotency_key="YOUR_IDEMPOTENCY_KEY",
token="YOUR_TOKEN",
)
@@ -422,7 +422,7 @@ async def retrieve(self, id: str, *, request_options: typing.Optional[RequestOpt
from whop_sdk import AsyncWhop
client = AsyncWhop(
- "2026-09-02-2",
+ "2026-09-06",
idempotency_key="YOUR_IDEMPOTENCY_KEY",
token="YOUR_TOKEN",
)
diff --git a/src/whop_sdk/swaps/client.py b/src/whop_sdk/swaps/client.py
index 220ef1f2..1556e781 100644
--- a/src/whop_sdk/swaps/client.py
+++ b/src/whop_sdk/swaps/client.py
@@ -55,7 +55,7 @@ def list(self, *, account_id: str, request_options: typing.Optional[RequestOptio
from whop_sdk import Whop
client = Whop(
- "2026-09-02-2",
+ "2026-09-06",
idempotency_key="YOUR_IDEMPOTENCY_KEY",
token="YOUR_TOKEN",
)
@@ -121,7 +121,7 @@ def create(
from whop_sdk import Whop
client = Whop(
- "2026-09-02-2",
+ "2026-09-06",
idempotency_key="YOUR_IDEMPOTENCY_KEY",
token="YOUR_TOKEN",
)
@@ -203,7 +203,7 @@ def create_quote(
from whop_sdk import Whop
client = Whop(
- "2026-09-02-2",
+ "2026-09-06",
idempotency_key="YOUR_IDEMPOTENCY_KEY",
token="YOUR_TOKEN",
)
@@ -249,7 +249,7 @@ def retrieve(self, id: str, *, request_options: typing.Optional[RequestOptions]
from whop_sdk import Whop
client = Whop(
- "2026-09-02-2",
+ "2026-09-06",
idempotency_key="YOUR_IDEMPOTENCY_KEY",
token="YOUR_TOKEN",
)
@@ -302,7 +302,7 @@ async def list(
from whop_sdk import AsyncWhop
client = AsyncWhop(
- "2026-09-02-2",
+ "2026-09-06",
idempotency_key="YOUR_IDEMPOTENCY_KEY",
token="YOUR_TOKEN",
)
@@ -376,7 +376,7 @@ async def create(
from whop_sdk import AsyncWhop
client = AsyncWhop(
- "2026-09-02-2",
+ "2026-09-06",
idempotency_key="YOUR_IDEMPOTENCY_KEY",
token="YOUR_TOKEN",
)
@@ -466,7 +466,7 @@ async def create_quote(
from whop_sdk import AsyncWhop
client = AsyncWhop(
- "2026-09-02-2",
+ "2026-09-06",
idempotency_key="YOUR_IDEMPOTENCY_KEY",
token="YOUR_TOKEN",
)
@@ -522,7 +522,7 @@ async def retrieve(
from whop_sdk import AsyncWhop
client = AsyncWhop(
- "2026-09-02-2",
+ "2026-09-06",
idempotency_key="YOUR_IDEMPOTENCY_KEY",
token="YOUR_TOKEN",
)
diff --git a/src/whop_sdk/team_members/client.py b/src/whop_sdk/team_members/client.py
index 81227a2b..38b9248a 100644
--- a/src/whop_sdk/team_members/client.py
+++ b/src/whop_sdk/team_members/client.py
@@ -106,7 +106,7 @@ def list(
from whop_sdk import Whop
client = Whop(
- "2026-09-02-2",
+ "2026-09-06",
idempotency_key="YOUR_IDEMPOTENCY_KEY",
token="YOUR_TOKEN",
)
@@ -174,7 +174,7 @@ def create(
from whop_sdk import Whop
client = Whop(
- "2026-09-02-2",
+ "2026-09-06",
idempotency_key="YOUR_IDEMPOTENCY_KEY",
token="YOUR_TOKEN",
)
@@ -210,7 +210,7 @@ def retrieve(self, id: str, *, request_options: typing.Optional[RequestOptions]
from whop_sdk import Whop
client = Whop(
- "2026-09-02-2",
+ "2026-09-06",
idempotency_key="YOUR_IDEMPOTENCY_KEY",
token="YOUR_TOKEN",
)
@@ -243,7 +243,7 @@ def delete(self, id: str, *, request_options: typing.Optional[RequestOptions] =
from whop_sdk import Whop
client = Whop(
- "2026-09-02-2",
+ "2026-09-06",
idempotency_key="YOUR_IDEMPOTENCY_KEY",
token="YOUR_TOKEN",
)
@@ -281,7 +281,7 @@ def update(
from whop_sdk import Whop
client = Whop(
- "2026-09-02-2",
+ "2026-09-06",
idempotency_key="YOUR_IDEMPOTENCY_KEY",
token="YOUR_TOKEN",
)
@@ -382,7 +382,7 @@ async def list(
from whop_sdk import AsyncWhop
client = AsyncWhop(
- "2026-09-02-2",
+ "2026-09-06",
idempotency_key="YOUR_IDEMPOTENCY_KEY",
token="YOUR_TOKEN",
)
@@ -459,7 +459,7 @@ async def create(
from whop_sdk import AsyncWhop
client = AsyncWhop(
- "2026-09-02-2",
+ "2026-09-06",
idempotency_key="YOUR_IDEMPOTENCY_KEY",
token="YOUR_TOKEN",
)
@@ -503,7 +503,7 @@ async def retrieve(self, id: str, *, request_options: typing.Optional[RequestOpt
from whop_sdk import AsyncWhop
client = AsyncWhop(
- "2026-09-02-2",
+ "2026-09-06",
idempotency_key="YOUR_IDEMPOTENCY_KEY",
token="YOUR_TOKEN",
)
@@ -546,7 +546,7 @@ async def delete(
from whop_sdk import AsyncWhop
client = AsyncWhop(
- "2026-09-02-2",
+ "2026-09-06",
idempotency_key="YOUR_IDEMPOTENCY_KEY",
token="YOUR_TOKEN",
)
@@ -592,7 +592,7 @@ async def update(
from whop_sdk import AsyncWhop
client = AsyncWhop(
- "2026-09-02-2",
+ "2026-09-06",
idempotency_key="YOUR_IDEMPOTENCY_KEY",
token="YOUR_TOKEN",
)
diff --git a/src/whop_sdk/topups/client.py b/src/whop_sdk/topups/client.py
index 7b803338..04a411ef 100644
--- a/src/whop_sdk/topups/client.py
+++ b/src/whop_sdk/topups/client.py
@@ -69,7 +69,7 @@ def create(
from whop_sdk import Whop
client = Whop(
- "2026-09-02-2",
+ "2026-09-06",
idempotency_key="YOUR_IDEMPOTENCY_KEY",
token="YOUR_TOKEN",
)
@@ -149,7 +149,7 @@ async def create(
from whop_sdk import AsyncWhop
client = AsyncWhop(
- "2026-09-02-2",
+ "2026-09-06",
idempotency_key="YOUR_IDEMPOTENCY_KEY",
token="YOUR_TOKEN",
)
diff --git a/src/whop_sdk/transfers/__init__.py b/src/whop_sdk/transfers/__init__.py
index 6d6fb99d..4d7966b9 100644
--- a/src/whop_sdk/transfers/__init__.py
+++ b/src/whop_sdk/transfers/__init__.py
@@ -7,6 +7,7 @@
if typing.TYPE_CHECKING:
from .types import (
+ CreateTransfersRequestFeedType,
CreateTransfersRequestType,
CreateTransfersResponse,
CreateTransfersResponseClaimLink,
@@ -113,6 +114,7 @@
RetrieveTransfersResponseStatus,
)
_dynamic_imports: typing.Dict[str, str] = {
+ "CreateTransfersRequestFeedType": ".types",
"CreateTransfersRequestType": ".types",
"CreateTransfersResponse": ".types",
"CreateTransfersResponseClaimLink": ".types",
@@ -242,6 +244,7 @@ def __dir__():
__all__ = [
+ "CreateTransfersRequestFeedType",
"CreateTransfersRequestType",
"CreateTransfersResponse",
"CreateTransfersResponseClaimLink",
diff --git a/src/whop_sdk/transfers/client.py b/src/whop_sdk/transfers/client.py
index c37dc292..6968fea5 100644
--- a/src/whop_sdk/transfers/client.py
+++ b/src/whop_sdk/transfers/client.py
@@ -7,6 +7,7 @@
from ..core.pagination import AsyncPager, SyncPager
from ..core.request_options import RequestOptions
from .raw_client import AsyncRawTransfersClient, RawTransfersClient
+from .types.create_transfers_request_feed_type import CreateTransfersRequestFeedType
from .types.create_transfers_request_type import CreateTransfersRequestType
from .types.create_transfers_response import CreateTransfersResponse
from .types.list_recipients_transfers_response import ListRecipientsTransfersResponse
@@ -99,7 +100,7 @@ def list(
from whop_sdk import Whop
client = Whop(
- "2026-09-02-2",
+ "2026-09-06",
idempotency_key="YOUR_IDEMPOTENCY_KEY",
token="YOUR_TOKEN",
)
@@ -132,6 +133,8 @@ def create(
currency: typing.Optional[str] = OMIT,
destination_id: typing.Optional[str] = OMIT,
expires_at: typing.Optional[dt.datetime] = OMIT,
+ feed_id: typing.Optional[str] = OMIT,
+ feed_type: typing.Optional[CreateTransfersRequestFeedType] = OMIT,
idempotence_key: typing.Optional[str] = OMIT,
metadata: typing.Optional[typing.Dict[str, typing.Any]] = OMIT,
notes: typing.Optional[str] = OMIT,
@@ -159,6 +162,12 @@ def create(
expires_at : typing.Optional[dt.datetime]
claim_link only. Link expiry as an ISO 8601 timestamp. Defaults to 24 hours from creation.
+ feed_id : typing.Optional[str]
+ Ledger transfers only. The feed the transfer was initiated from. Given with `feed_type`, the payment receipt posts into that feed instead of a direct message.
+
+ feed_type : typing.Optional[CreateTransfersRequestFeedType]
+ Ledger transfers only. The type of the feed named by `feed_id`.
+
idempotence_key : typing.Optional[str]
Ledger transfers and wallet sends. A unique key that makes retries safe. Retrying with the same key returns the original transfer, or attaches to the original wallet send, instead of moving money twice.
@@ -187,7 +196,7 @@ def create(
from whop_sdk import Whop
client = Whop(
- "2026-09-02-2",
+ "2026-09-06",
idempotency_key="YOUR_IDEMPOTENCY_KEY",
token="YOUR_TOKEN",
)
@@ -202,6 +211,8 @@ def create(
currency=currency,
destination_id=destination_id,
expires_at=expires_at,
+ feed_id=feed_id,
+ feed_type=feed_type,
idempotence_key=idempotence_key,
metadata=metadata,
notes=notes,
@@ -250,7 +261,7 @@ def list_recipients(
from whop_sdk import Whop
client = Whop(
- "2026-09-02-2",
+ "2026-09-06",
idempotency_key="YOUR_IDEMPOTENCY_KEY",
token="YOUR_TOKEN",
)
@@ -291,7 +302,7 @@ def retrieve(
from whop_sdk import Whop
client = Whop(
- "2026-09-02-2",
+ "2026-09-06",
idempotency_key="YOUR_IDEMPOTENCY_KEY",
token="YOUR_TOKEN",
)
@@ -383,7 +394,7 @@ async def list(
from whop_sdk import AsyncWhop
client = AsyncWhop(
- "2026-09-02-2",
+ "2026-09-06",
idempotency_key="YOUR_IDEMPOTENCY_KEY",
token="YOUR_TOKEN",
)
@@ -423,6 +434,8 @@ async def create(
currency: typing.Optional[str] = OMIT,
destination_id: typing.Optional[str] = OMIT,
expires_at: typing.Optional[dt.datetime] = OMIT,
+ feed_id: typing.Optional[str] = OMIT,
+ feed_type: typing.Optional[CreateTransfersRequestFeedType] = OMIT,
idempotence_key: typing.Optional[str] = OMIT,
metadata: typing.Optional[typing.Dict[str, typing.Any]] = OMIT,
notes: typing.Optional[str] = OMIT,
@@ -450,6 +463,12 @@ async def create(
expires_at : typing.Optional[dt.datetime]
claim_link only. Link expiry as an ISO 8601 timestamp. Defaults to 24 hours from creation.
+ feed_id : typing.Optional[str]
+ Ledger transfers only. The feed the transfer was initiated from. Given with `feed_type`, the payment receipt posts into that feed instead of a direct message.
+
+ feed_type : typing.Optional[CreateTransfersRequestFeedType]
+ Ledger transfers only. The type of the feed named by `feed_id`.
+
idempotence_key : typing.Optional[str]
Ledger transfers and wallet sends. A unique key that makes retries safe. Retrying with the same key returns the original transfer, or attaches to the original wallet send, instead of moving money twice.
@@ -480,7 +499,7 @@ async def create(
from whop_sdk import AsyncWhop
client = AsyncWhop(
- "2026-09-02-2",
+ "2026-09-06",
idempotency_key="YOUR_IDEMPOTENCY_KEY",
token="YOUR_TOKEN",
)
@@ -501,6 +520,8 @@ async def main() -> None:
currency=currency,
destination_id=destination_id,
expires_at=expires_at,
+ feed_id=feed_id,
+ feed_type=feed_type,
idempotence_key=idempotence_key,
metadata=metadata,
notes=notes,
@@ -551,7 +572,7 @@ async def list_recipients(
from whop_sdk import AsyncWhop
client = AsyncWhop(
- "2026-09-02-2",
+ "2026-09-06",
idempotency_key="YOUR_IDEMPOTENCY_KEY",
token="YOUR_TOKEN",
)
@@ -601,7 +622,7 @@ async def retrieve(
from whop_sdk import AsyncWhop
client = AsyncWhop(
- "2026-09-02-2",
+ "2026-09-06",
idempotency_key="YOUR_IDEMPOTENCY_KEY",
token="YOUR_TOKEN",
)
diff --git a/src/whop_sdk/transfers/raw_client.py b/src/whop_sdk/transfers/raw_client.py
index a8f087e1..ead69ea5 100644
--- a/src/whop_sdk/transfers/raw_client.py
+++ b/src/whop_sdk/transfers/raw_client.py
@@ -18,6 +18,7 @@
from ..errors.not_found_error import NotFoundError
from ..errors.unauthorized_error import UnauthorizedError
from ..types.v1error_response import V1ErrorResponse
+from .types.create_transfers_request_feed_type import CreateTransfersRequestFeedType
from .types.create_transfers_request_type import CreateTransfersRequestType
from .types.create_transfers_response import CreateTransfersResponse
from .types.list_recipients_transfers_response import ListRecipientsTransfersResponse
@@ -169,6 +170,8 @@ def create(
currency: typing.Optional[str] = OMIT,
destination_id: typing.Optional[str] = OMIT,
expires_at: typing.Optional[dt.datetime] = OMIT,
+ feed_id: typing.Optional[str] = OMIT,
+ feed_type: typing.Optional[CreateTransfersRequestFeedType] = OMIT,
idempotence_key: typing.Optional[str] = OMIT,
metadata: typing.Optional[typing.Dict[str, typing.Any]] = OMIT,
notes: typing.Optional[str] = OMIT,
@@ -196,6 +199,12 @@ def create(
expires_at : typing.Optional[dt.datetime]
claim_link only. Link expiry as an ISO 8601 timestamp. Defaults to 24 hours from creation.
+ feed_id : typing.Optional[str]
+ Ledger transfers only. The feed the transfer was initiated from. Given with `feed_type`, the payment receipt posts into that feed instead of a direct message.
+
+ feed_type : typing.Optional[CreateTransfersRequestFeedType]
+ Ledger transfers only. The type of the feed named by `feed_id`.
+
idempotence_key : typing.Optional[str]
Ledger transfers and wallet sends. A unique key that makes retries safe. Retrying with the same key returns the original transfer, or attaches to the original wallet send, instead of moving money twice.
@@ -227,6 +236,8 @@ def create(
"currency": currency,
"destination_id": destination_id,
"expires_at": expires_at,
+ "feed_id": feed_id,
+ "feed_type": feed_type,
"idempotence_key": idempotence_key,
"metadata": metadata,
"notes": notes,
@@ -618,6 +629,8 @@ async def create(
currency: typing.Optional[str] = OMIT,
destination_id: typing.Optional[str] = OMIT,
expires_at: typing.Optional[dt.datetime] = OMIT,
+ feed_id: typing.Optional[str] = OMIT,
+ feed_type: typing.Optional[CreateTransfersRequestFeedType] = OMIT,
idempotence_key: typing.Optional[str] = OMIT,
metadata: typing.Optional[typing.Dict[str, typing.Any]] = OMIT,
notes: typing.Optional[str] = OMIT,
@@ -645,6 +658,12 @@ async def create(
expires_at : typing.Optional[dt.datetime]
claim_link only. Link expiry as an ISO 8601 timestamp. Defaults to 24 hours from creation.
+ feed_id : typing.Optional[str]
+ Ledger transfers only. The feed the transfer was initiated from. Given with `feed_type`, the payment receipt posts into that feed instead of a direct message.
+
+ feed_type : typing.Optional[CreateTransfersRequestFeedType]
+ Ledger transfers only. The type of the feed named by `feed_id`.
+
idempotence_key : typing.Optional[str]
Ledger transfers and wallet sends. A unique key that makes retries safe. Retrying with the same key returns the original transfer, or attaches to the original wallet send, instead of moving money twice.
@@ -676,6 +695,8 @@ async def create(
"currency": currency,
"destination_id": destination_id,
"expires_at": expires_at,
+ "feed_id": feed_id,
+ "feed_type": feed_type,
"idempotence_key": idempotence_key,
"metadata": metadata,
"notes": notes,
diff --git a/src/whop_sdk/transfers/types/__init__.py b/src/whop_sdk/transfers/types/__init__.py
index a2f0eaa3..0df02834 100644
--- a/src/whop_sdk/transfers/types/__init__.py
+++ b/src/whop_sdk/transfers/types/__init__.py
@@ -6,6 +6,7 @@
from importlib import import_module
if typing.TYPE_CHECKING:
+ from .create_transfers_request_feed_type import CreateTransfersRequestFeedType
from .create_transfers_request_type import CreateTransfersRequestType
from .create_transfers_response import (
CreateTransfersResponse,
@@ -139,6 +140,7 @@
from .retrieve_transfers_response_origin_user import RetrieveTransfersResponseOriginUser
from .retrieve_transfers_response_status import RetrieveTransfersResponseStatus
_dynamic_imports: typing.Dict[str, str] = {
+ "CreateTransfersRequestFeedType": ".create_transfers_request_feed_type",
"CreateTransfersRequestType": ".create_transfers_request_type",
"CreateTransfersResponse": ".create_transfers_response",
"CreateTransfersResponseClaimLink": ".create_transfers_response_claim_link",
@@ -268,6 +270,7 @@ def __dir__():
__all__ = [
+ "CreateTransfersRequestFeedType",
"CreateTransfersRequestType",
"CreateTransfersResponse",
"CreateTransfersResponseClaimLink",
diff --git a/src/whop_sdk/transfers/types/create_transfers_request_feed_type.py b/src/whop_sdk/transfers/types/create_transfers_request_feed_type.py
new file mode 100644
index 00000000..ceb5afe2
--- /dev/null
+++ b/src/whop_sdk/transfers/types/create_transfers_request_feed_type.py
@@ -0,0 +1,7 @@
+# This file was auto-generated by Fern from our API Definition.
+
+import typing
+
+CreateTransfersRequestFeedType = typing.Union[
+ typing.Literal["dms_feed", "chat_feed", "forum_feed", "livestream_feed", "universal_post", "user"], typing.Any
+]
diff --git a/src/whop_sdk/types/__init__.py b/src/whop_sdk/types/__init__.py
index d8ed08b7..51846fd8 100644
--- a/src/whop_sdk/types/__init__.py
+++ b/src/whop_sdk/types/__init__.py
@@ -188,6 +188,7 @@
from .affiliate_user import AffiliateUser
from .affiliates_sortable_columns import AffiliatesSortableColumns
from .ai_chat import AiChat
+ from .ai_chat_agent_identifiers import AiChatAgentIdentifiers
from .ai_chat_list_item import AiChatListItem
from .ai_chat_list_item_user import AiChatListItemUser
from .ai_chat_message_source_types import AiChatMessageSourceTypes
@@ -237,6 +238,23 @@
from .app_view_types import AppViewTypes
from .audience import Audience
from .audience_audience_type import AudienceAudienceType
+ from .audience_engagement import AudienceEngagement
+ from .audience_engagement_facebook_page_rule import AudienceEngagementFacebookPageRule
+ from .audience_engagement_facebook_page_rule_event import AudienceEngagementFacebookPageRuleEvent
+ from .audience_engagement_instagram_profile_rule import AudienceEngagementInstagramProfileRule
+ from .audience_engagement_instagram_profile_rule_event import AudienceEngagementInstagramProfileRuleEvent
+ from .audience_engagement_lead_form_rule import AudienceEngagementLeadFormRule
+ from .audience_engagement_lead_form_rule_event import AudienceEngagementLeadFormRuleEvent
+ from .audience_engagement_platform import AudienceEngagementPlatform
+ from .audience_engagement_rule import (
+ AudienceEngagementRule,
+ AudienceEngagementRule_FacebookPage,
+ AudienceEngagementRule_InstagramProfile,
+ AudienceEngagementRule_LeadForm,
+ AudienceEngagementRule_Video,
+ )
+ from .audience_engagement_video_rule import AudienceEngagementVideoRule
+ from .audience_engagement_video_rule_event import AudienceEngagementVideoRuleEvent
from .audience_match_rate import AudienceMatchRate
from .audience_match_rate_platform import AudienceMatchRatePlatform
from .audience_match_rate_status import AudienceMatchRateStatus
@@ -693,6 +711,10 @@
from .notification_topic_summary_topic_type import NotificationTopicSummaryTopicType
from .notification_topic_topic_type import NotificationTopicTopicType
from .oauth_grant import OauthGrant
+ from .onboarding_reward import OnboardingReward
+ from .onboarding_reward_qualification_income_source import OnboardingRewardQualificationIncomeSource
+ from .onboarding_reward_reward_type import OnboardingRewardRewardType
+ from .onboarding_reward_status import OnboardingRewardStatus
from .page_info import PageInfo
from .pagination import Pagination
from .passkey import Passkey
@@ -1108,6 +1130,7 @@
from .receipt_status import ReceiptStatus
from .receipt_tax_behaviors import ReceiptTaxBehaviors
from .receipt_v2order import ReceiptV2Order
+ from .recommended_action import RecommendedAction
from .recommended_action_execution import RecommendedActionExecution
from .recommended_action_execution_status import RecommendedActionExecutionStatus
from .refund import Refund
@@ -1157,6 +1180,7 @@
from .resolution_event import ResolutionEvent
from .resolution_event_action import ResolutionEventAction
from .resolution_event_reporter_type import ResolutionEventReporterType
+ from .resolution_line_item import ResolutionLineItem
from .resolution_payment import ResolutionPayment
from .review import Review
from .review_attachments_item import ReviewAttachmentsItem
@@ -1463,6 +1487,7 @@
"AffiliateUser": ".affiliate_user",
"AffiliatesSortableColumns": ".affiliates_sortable_columns",
"AiChat": ".ai_chat",
+ "AiChatAgentIdentifiers": ".ai_chat_agent_identifiers",
"AiChatListItem": ".ai_chat_list_item",
"AiChatListItemUser": ".ai_chat_list_item_user",
"AiChatMessageSourceTypes": ".ai_chat_message_source_types",
@@ -1512,6 +1537,21 @@
"AppViewTypes": ".app_view_types",
"Audience": ".audience",
"AudienceAudienceType": ".audience_audience_type",
+ "AudienceEngagement": ".audience_engagement",
+ "AudienceEngagementFacebookPageRule": ".audience_engagement_facebook_page_rule",
+ "AudienceEngagementFacebookPageRuleEvent": ".audience_engagement_facebook_page_rule_event",
+ "AudienceEngagementInstagramProfileRule": ".audience_engagement_instagram_profile_rule",
+ "AudienceEngagementInstagramProfileRuleEvent": ".audience_engagement_instagram_profile_rule_event",
+ "AudienceEngagementLeadFormRule": ".audience_engagement_lead_form_rule",
+ "AudienceEngagementLeadFormRuleEvent": ".audience_engagement_lead_form_rule_event",
+ "AudienceEngagementPlatform": ".audience_engagement_platform",
+ "AudienceEngagementRule": ".audience_engagement_rule",
+ "AudienceEngagementRule_FacebookPage": ".audience_engagement_rule",
+ "AudienceEngagementRule_InstagramProfile": ".audience_engagement_rule",
+ "AudienceEngagementRule_LeadForm": ".audience_engagement_rule",
+ "AudienceEngagementRule_Video": ".audience_engagement_rule",
+ "AudienceEngagementVideoRule": ".audience_engagement_video_rule",
+ "AudienceEngagementVideoRuleEvent": ".audience_engagement_video_rule_event",
"AudienceMatchRate": ".audience_match_rate",
"AudienceMatchRatePlatform": ".audience_match_rate_platform",
"AudienceMatchRateStatus": ".audience_match_rate_status",
@@ -1948,6 +1988,10 @@
"NotificationTopicSummaryTopicType": ".notification_topic_summary_topic_type",
"NotificationTopicTopicType": ".notification_topic_topic_type",
"OauthGrant": ".oauth_grant",
+ "OnboardingReward": ".onboarding_reward",
+ "OnboardingRewardQualificationIncomeSource": ".onboarding_reward_qualification_income_source",
+ "OnboardingRewardRewardType": ".onboarding_reward_reward_type",
+ "OnboardingRewardStatus": ".onboarding_reward_status",
"PageInfo": ".page_info",
"Pagination": ".pagination",
"Passkey": ".passkey",
@@ -2249,6 +2293,7 @@
"ReceiptStatus": ".receipt_status",
"ReceiptTaxBehaviors": ".receipt_tax_behaviors",
"ReceiptV2Order": ".receipt_v2order",
+ "RecommendedAction": ".recommended_action",
"RecommendedActionExecution": ".recommended_action_execution",
"RecommendedActionExecutionStatus": ".recommended_action_execution_status",
"Refund": ".refund",
@@ -2298,6 +2343,7 @@
"ResolutionEvent": ".resolution_event",
"ResolutionEventAction": ".resolution_event_action",
"ResolutionEventReporterType": ".resolution_event_reporter_type",
+ "ResolutionLineItem": ".resolution_line_item",
"ResolutionPayment": ".resolution_payment",
"Review": ".review",
"ReviewAttachmentsItem": ".review_attachments_item",
@@ -2626,6 +2672,7 @@ def __dir__():
"AffiliateUser",
"AffiliatesSortableColumns",
"AiChat",
+ "AiChatAgentIdentifiers",
"AiChatListItem",
"AiChatListItemUser",
"AiChatMessageSourceTypes",
@@ -2675,6 +2722,21 @@ def __dir__():
"AppViewTypes",
"Audience",
"AudienceAudienceType",
+ "AudienceEngagement",
+ "AudienceEngagementFacebookPageRule",
+ "AudienceEngagementFacebookPageRuleEvent",
+ "AudienceEngagementInstagramProfileRule",
+ "AudienceEngagementInstagramProfileRuleEvent",
+ "AudienceEngagementLeadFormRule",
+ "AudienceEngagementLeadFormRuleEvent",
+ "AudienceEngagementPlatform",
+ "AudienceEngagementRule",
+ "AudienceEngagementRule_FacebookPage",
+ "AudienceEngagementRule_InstagramProfile",
+ "AudienceEngagementRule_LeadForm",
+ "AudienceEngagementRule_Video",
+ "AudienceEngagementVideoRule",
+ "AudienceEngagementVideoRuleEvent",
"AudienceMatchRate",
"AudienceMatchRatePlatform",
"AudienceMatchRateStatus",
@@ -3111,6 +3173,10 @@ def __dir__():
"NotificationTopicSummaryTopicType",
"NotificationTopicTopicType",
"OauthGrant",
+ "OnboardingReward",
+ "OnboardingRewardQualificationIncomeSource",
+ "OnboardingRewardRewardType",
+ "OnboardingRewardStatus",
"PageInfo",
"Pagination",
"Passkey",
@@ -3412,6 +3478,7 @@ def __dir__():
"ReceiptStatus",
"ReceiptTaxBehaviors",
"ReceiptV2Order",
+ "RecommendedAction",
"RecommendedActionExecution",
"RecommendedActionExecutionStatus",
"Refund",
@@ -3461,6 +3528,7 @@ def __dir__():
"ResolutionEvent",
"ResolutionEventAction",
"ResolutionEventReporterType",
+ "ResolutionLineItem",
"ResolutionPayment",
"Review",
"ReviewAttachmentsItem",
diff --git a/src/whop_sdk/types/account_required_action_action.py b/src/whop_sdk/types/account_required_action_action.py
index fe63d99f..0dfeeb0d 100644
--- a/src/whop_sdk/types/account_required_action_action.py
+++ b/src/whop_sdk/types/account_required_action_action.py
@@ -6,6 +6,7 @@
typing.Literal[
"deposit_funds",
"submit_information_request",
+ "update_automatic_withdrawal_method",
"reauthorize_payout_methods",
"update_payout_profile",
"card_usage_review",
diff --git a/src/whop_sdk/types/ai_chat.py b/src/whop_sdk/types/ai_chat.py
index 1640aaac..a2f2bc19 100644
--- a/src/whop_sdk/types/ai_chat.py
+++ b/src/whop_sdk/types/ai_chat.py
@@ -5,6 +5,7 @@
import pydantic
from ..core.pydantic_utilities import IS_PYDANTIC_V2, UniversalBaseModel
+from .ai_chat_agent_identifiers import AiChatAgentIdentifiers
from .ai_chat_notification_preferences import AiChatNotificationPreferences
from .ai_chat_user import AiChatUser
@@ -14,6 +15,11 @@ class AiChat(UniversalBaseModel):
An AI-powered chat conversation belonging to a user, with optional scheduled automation.
"""
+ agent_identifier: AiChatAgentIdentifiers = pydantic.Field()
+ """
+ The AI agent that handles this chat. Set when the chat is created and fixed for its lifetime.
+ """
+
blended_token_usage: str = pydantic.Field()
"""
The total number of tokens consumed across all messages in this conversation.
diff --git a/src/whop_sdk/types/ai_chat_agent_identifiers.py b/src/whop_sdk/types/ai_chat_agent_identifiers.py
new file mode 100644
index 00000000..d69b6503
--- /dev/null
+++ b/src/whop_sdk/types/ai_chat_agent_identifiers.py
@@ -0,0 +1,5 @@
+# This file was auto-generated by Fern from our API Definition.
+
+import typing
+
+AiChatAgentIdentifiers = typing.Union[typing.Literal["general", "support"], typing.Any]
diff --git a/src/whop_sdk/types/ai_chat_list_item.py b/src/whop_sdk/types/ai_chat_list_item.py
index 00f37d3b..7e7d3402 100644
--- a/src/whop_sdk/types/ai_chat_list_item.py
+++ b/src/whop_sdk/types/ai_chat_list_item.py
@@ -5,6 +5,7 @@
import pydantic
from ..core.pydantic_utilities import IS_PYDANTIC_V2, UniversalBaseModel
+from .ai_chat_agent_identifiers import AiChatAgentIdentifiers
from .ai_chat_list_item_user import AiChatListItemUser
from .ai_chat_notification_preferences import AiChatNotificationPreferences
@@ -14,6 +15,11 @@ class AiChatListItem(UniversalBaseModel):
An AI-powered chat conversation belonging to a user, with optional scheduled automation.
"""
+ agent_identifier: AiChatAgentIdentifiers = pydantic.Field()
+ """
+ The AI agent that handles this chat. Set when the chat is created and fixed for its lifetime.
+ """
+
blended_token_usage: str = pydantic.Field()
"""
The total number of tokens consumed across all messages in this conversation.
diff --git a/src/whop_sdk/types/api_key_api_version_date.py b/src/whop_sdk/types/api_key_api_version_date.py
index e983b007..92d628b1 100644
--- a/src/whop_sdk/types/api_key_api_version_date.py
+++ b/src/whop_sdk/types/api_key_api_version_date.py
@@ -37,6 +37,8 @@
"2026-09-02",
"2026-09-02-1",
"2026-09-02-2",
+ "2026-09-04",
+ "2026-09-06",
],
typing.Any,
]
diff --git a/src/whop_sdk/types/audience.py b/src/whop_sdk/types/audience.py
index 45c58b05..75c51de3 100644
--- a/src/whop_sdk/types/audience.py
+++ b/src/whop_sdk/types/audience.py
@@ -5,6 +5,7 @@
import pydantic
from ..core.pydantic_utilities import IS_PYDANTIC_V2, UniversalBaseModel
from .audience_audience_type import AudienceAudienceType
+from .audience_engagement import AudienceEngagement
from .audience_match_rate import AudienceMatchRate
from .audience_source_type import AudienceSourceType
from .audience_status import AudienceStatus
@@ -13,12 +14,12 @@
class Audience(UniversalBaseModel):
audience_type: AudienceAudienceType = pydantic.Field()
"""
- `custom` = a customer list (uploaded, or built from saved People filters); `lookalike` = Meta lookalike built from a custom audience.
+ Whether the audience targets a defined group of people or people similar to an existing audience.
"""
auto_refresh: bool = pydantic.Field()
"""
- Whether membership keeps updating. `true` rebuilds it from the saved filters twice a day, so people join and leave as they start and stop matching. `false` keeps whoever matched when it was built and never rebuilds. Always `false` for uploaded lists and lookalikes.
+ Whether Whop rebuilds membership from saved People filters twice a day. When `false`, People audiences keep the members matched at creation. Always `false` for uploaded lists, lookalikes, and engagement audiences. Engagement membership is maintained by Meta.
"""
created_at: str = pydantic.Field()
@@ -26,6 +27,11 @@ class Audience(UniversalBaseModel):
When the audience was created, as an ISO 8601 timestamp.
"""
+ engagement: typing.Optional[AudienceEngagement] = pydantic.Field(default=None)
+ """
+ Social engagement rules maintained by the ad platform. `null` for other audience sources.
+ """
+
error_message: typing.Optional[str] = pydantic.Field(default=None)
"""
Processing error message. `null` unless processing is partial or failed.
@@ -33,7 +39,7 @@ class Audience(UniversalBaseModel):
filters: typing.Optional[typing.Dict[str, typing.Any]] = pydantic.Field(default=None)
"""
- For audiences built from People filters: the filters that define membership, keyed exactly as `GET /people` accepts them — for example `{"os": "iOS", "country": "US"}`. `null` for uploaded lists and lookalikes.
+ Saved Whop People filters that define membership, using the same keys as `GET /people`. `null` for uploaded lists, engagement audiences, and lookalikes.
"""
id: str = pydantic.Field()
@@ -59,7 +65,7 @@ class Audience(UniversalBaseModel):
match_rates: typing.List[AudienceMatchRate]
matched_rows: float = pydantic.Field()
"""
- Members successfully uploaded to connected ad accounts. Always 0 for lookalikes.
+ Members successfully uploaded to connected ad accounts. Always 0 for lookalikes and engagement audiences.
"""
name: str = pydantic.Field()
@@ -70,7 +76,7 @@ class Audience(UniversalBaseModel):
platform_audience_ids: typing.List[str]
processed_rows: float = pydantic.Field()
"""
- Members processed from the source so far. Always 0 for lookalikes.
+ Members processed from the source so far. Always 0 for lookalikes and engagement audiences.
"""
progress_percent: float = pydantic.Field()
@@ -85,17 +91,17 @@ class Audience(UniversalBaseModel):
source_type: AudienceSourceType = pydantic.Field()
"""
- Where members come from. `csv_upload` = an uploaded customer list; `people_filter` = built from saved People filters. See `auto_refresh` for whether a `people_filter` audience keeps updating.
+ Membership source: an uploaded CSV, Whop People filters, or social engagement.
"""
status: AudienceStatus = pydantic.Field()
"""
- Current state of the audience import. `syncing` means Whop is sending matched rows to connected ad accounts. When status is `partial` or `failed`, `error_message` explains what went wrong.
+ Current state of audience creation. For engagement audiences, `ready` means the rules were created on Meta; membership may still be populating. `syncing` means Whop is sending matched rows to connected ad accounts. When status is `partial` or `failed`, `error_message` explains what went wrong.
"""
total_rows: float = pydantic.Field()
"""
- Total members detected in the source — CSV rows for uploaded lists, matching people for automatic audiences. Always 0 for lookalikes.
+ Total members detected in the source — CSV rows for uploaded lists, matching people for automatic audiences. Always 0 for lookalikes and engagement audiences.
"""
updated_at: str = pydantic.Field()
diff --git a/src/whop_sdk/types/audience_engagement.py b/src/whop_sdk/types/audience_engagement.py
new file mode 100644
index 00000000..abe208fd
--- /dev/null
+++ b/src/whop_sdk/types/audience_engagement.py
@@ -0,0 +1,34 @@
+# This file was auto-generated by Fern from our API Definition.
+
+import typing
+
+import pydantic
+from ..core.pydantic_utilities import IS_PYDANTIC_V2, UniversalBaseModel
+from .audience_engagement_platform import AudienceEngagementPlatform
+from .audience_engagement_rule import AudienceEngagementRule
+
+
+class AudienceEngagement(UniversalBaseModel):
+ exclude: typing.List[AudienceEngagementRule] = pydantic.Field()
+ """
+ Exclude anyone matching any exclusion rule. Supply 0–10 rules. Video audiences do not support exclusions; use a separate audience in ad-group exclusions.
+ """
+
+ include: typing.List[AudienceEngagementRule] = pydantic.Field()
+ """
+ Match any inclusion rule. Supply 1–10 rules. Video rules must share a retention window and cannot be combined with other sources.
+ """
+
+ platform: AudienceEngagementPlatform = pydantic.Field()
+ """
+ Ad platform that maintains membership.
+ """
+
+ if IS_PYDANTIC_V2:
+ model_config: typing.ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(extra="allow", frozen=True) # type: ignore # Pydantic v2
+ else:
+
+ class Config:
+ frozen = True
+ smart_union = True
+ extra = pydantic.Extra.allow
diff --git a/src/whop_sdk/types/audience_engagement_facebook_page_rule.py b/src/whop_sdk/types/audience_engagement_facebook_page_rule.py
new file mode 100644
index 00000000..6a71f399
--- /dev/null
+++ b/src/whop_sdk/types/audience_engagement_facebook_page_rule.py
@@ -0,0 +1,33 @@
+# This file was auto-generated by Fern from our API Definition.
+
+import typing
+
+import pydantic
+from ..core.pydantic_utilities import IS_PYDANTIC_V2, UniversalBaseModel
+from .audience_engagement_facebook_page_rule_event import AudienceEngagementFacebookPageRuleEvent
+
+
+class AudienceEngagementFacebookPageRule(UniversalBaseModel):
+ event: AudienceEngagementFacebookPageRuleEvent = pydantic.Field()
+ """
+ Interaction that qualifies a person for this rule.
+ """
+
+ retention_days: int = pydantic.Field()
+ """
+ Rolling membership window in days, from 1 to 730. Use 0 for `liked`, which tracks current likes and cannot be combined with other events.
+ """
+
+ social_account_id: str = pydantic.Field()
+ """
+ Connected social account ID, prefixed `sacc_`, with advertising access.
+ """
+
+ if IS_PYDANTIC_V2:
+ model_config: typing.ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(extra="allow", frozen=True) # type: ignore # Pydantic v2
+ else:
+
+ class Config:
+ frozen = True
+ smart_union = True
+ extra = pydantic.Extra.allow
diff --git a/src/whop_sdk/types/audience_engagement_facebook_page_rule_event.py b/src/whop_sdk/types/audience_engagement_facebook_page_rule_event.py
new file mode 100644
index 00000000..3bc71c95
--- /dev/null
+++ b/src/whop_sdk/types/audience_engagement_facebook_page_rule_event.py
@@ -0,0 +1,7 @@
+# This file was auto-generated by Fern from our API Definition.
+
+import typing
+
+AudienceEngagementFacebookPageRuleEvent = typing.Union[
+ typing.Literal["engaged", "visited", "liked", "messaged", "cta_clicked", "saved", "post_interaction"], typing.Any
+]
diff --git a/src/whop_sdk/types/audience_engagement_instagram_profile_rule.py b/src/whop_sdk/types/audience_engagement_instagram_profile_rule.py
new file mode 100644
index 00000000..20fc1dcd
--- /dev/null
+++ b/src/whop_sdk/types/audience_engagement_instagram_profile_rule.py
@@ -0,0 +1,33 @@
+# This file was auto-generated by Fern from our API Definition.
+
+import typing
+
+import pydantic
+from ..core.pydantic_utilities import IS_PYDANTIC_V2, UniversalBaseModel
+from .audience_engagement_instagram_profile_rule_event import AudienceEngagementInstagramProfileRuleEvent
+
+
+class AudienceEngagementInstagramProfileRule(UniversalBaseModel):
+ event: AudienceEngagementInstagramProfileRuleEvent = pydantic.Field()
+ """
+ Interaction that qualifies a person for this rule.
+ """
+
+ retention_days: int = pydantic.Field()
+ """
+ Rolling membership window in days, from 1 to 730.
+ """
+
+ social_account_id: str = pydantic.Field()
+ """
+ Connected social account ID, prefixed `sacc_`, with advertising access.
+ """
+
+ if IS_PYDANTIC_V2:
+ model_config: typing.ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(extra="allow", frozen=True) # type: ignore # Pydantic v2
+ else:
+
+ class Config:
+ frozen = True
+ smart_union = True
+ extra = pydantic.Extra.allow
diff --git a/src/whop_sdk/types/audience_engagement_instagram_profile_rule_event.py b/src/whop_sdk/types/audience_engagement_instagram_profile_rule_event.py
new file mode 100644
index 00000000..2ac69803
--- /dev/null
+++ b/src/whop_sdk/types/audience_engagement_instagram_profile_rule_event.py
@@ -0,0 +1,26 @@
+# This file was auto-generated by Fern from our API Definition.
+
+import typing
+
+AudienceEngagementInstagramProfileRuleEvent = typing.Union[
+ typing.Literal[
+ "all",
+ "engaged",
+ "visited",
+ "messaged",
+ "saved",
+ "ad_liked",
+ "ad_commented",
+ "ad_shared",
+ "ad_saved",
+ "ad_cta_clicked",
+ "ad_carousel_swiped",
+ "organic_liked",
+ "organic_commented",
+ "organic_shared",
+ "organic_saved",
+ "organic_swiped",
+ "organic_carousel_swiped",
+ ],
+ typing.Any,
+]
diff --git a/src/whop_sdk/types/audience_engagement_lead_form_rule.py b/src/whop_sdk/types/audience_engagement_lead_form_rule.py
new file mode 100644
index 00000000..b0dc396f
--- /dev/null
+++ b/src/whop_sdk/types/audience_engagement_lead_form_rule.py
@@ -0,0 +1,34 @@
+# This file was auto-generated by Fern from our API Definition.
+
+import typing
+
+import pydantic
+from ..core.pydantic_utilities import IS_PYDANTIC_V2, UniversalBaseModel
+from .audience_engagement_lead_form_rule_event import AudienceEngagementLeadFormRuleEvent
+
+
+class AudienceEngagementLeadFormRule(UniversalBaseModel):
+ event: AudienceEngagementLeadFormRuleEvent = pydantic.Field()
+ """
+ Interaction that qualifies a person for this rule.
+ """
+
+ platform_form_ids: typing.List[str]
+ retention_days: int = pydantic.Field()
+ """
+ Rolling membership window in days, from 1 to 90.
+ """
+
+ social_account_id: str = pydantic.Field()
+ """
+ Connected social account ID, prefixed `sacc_`, with advertising access.
+ """
+
+ if IS_PYDANTIC_V2:
+ model_config: typing.ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(extra="allow", frozen=True) # type: ignore # Pydantic v2
+ else:
+
+ class Config:
+ frozen = True
+ smart_union = True
+ extra = pydantic.Extra.allow
diff --git a/src/whop_sdk/types/audience_engagement_lead_form_rule_event.py b/src/whop_sdk/types/audience_engagement_lead_form_rule_event.py
new file mode 100644
index 00000000..95c9072a
--- /dev/null
+++ b/src/whop_sdk/types/audience_engagement_lead_form_rule_event.py
@@ -0,0 +1,5 @@
+# This file was auto-generated by Fern from our API Definition.
+
+import typing
+
+AudienceEngagementLeadFormRuleEvent = typing.Union[typing.Literal["opened", "submitted", "not_submitted"], typing.Any]
diff --git a/src/whop_sdk/types/audience_engagement_platform.py b/src/whop_sdk/types/audience_engagement_platform.py
new file mode 100644
index 00000000..18de9c01
--- /dev/null
+++ b/src/whop_sdk/types/audience_engagement_platform.py
@@ -0,0 +1,5 @@
+# This file was auto-generated by Fern from our API Definition.
+
+import typing
+
+AudienceEngagementPlatform = typing.Union[typing.Literal["meta"], typing.Any]
diff --git a/src/whop_sdk/types/audience_engagement_rule.py b/src/whop_sdk/types/audience_engagement_rule.py
new file mode 100644
index 00000000..add46e03
--- /dev/null
+++ b/src/whop_sdk/types/audience_engagement_rule.py
@@ -0,0 +1,90 @@
+# This file was auto-generated by Fern from our API Definition.
+
+from __future__ import annotations
+
+import typing
+
+import pydantic
+import typing_extensions
+from ..core.pydantic_utilities import IS_PYDANTIC_V2, UniversalBaseModel
+from .audience_engagement_facebook_page_rule_event import AudienceEngagementFacebookPageRuleEvent
+from .audience_engagement_instagram_profile_rule_event import AudienceEngagementInstagramProfileRuleEvent
+from .audience_engagement_lead_form_rule_event import AudienceEngagementLeadFormRuleEvent
+from .audience_engagement_video_rule_event import AudienceEngagementVideoRuleEvent
+
+
+class AudienceEngagementRule_FacebookPage(UniversalBaseModel):
+ object: typing.Literal["facebook_page"] = "facebook_page"
+ event: AudienceEngagementFacebookPageRuleEvent
+ retention_days: int
+ social_account_id: str
+
+ if IS_PYDANTIC_V2:
+ model_config: typing.ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(extra="allow", frozen=True) # type: ignore # Pydantic v2
+ else:
+
+ class Config:
+ frozen = True
+ smart_union = True
+ extra = pydantic.Extra.allow
+
+
+class AudienceEngagementRule_InstagramProfile(UniversalBaseModel):
+ object: typing.Literal["instagram_profile"] = "instagram_profile"
+ event: AudienceEngagementInstagramProfileRuleEvent
+ retention_days: int
+ social_account_id: str
+
+ if IS_PYDANTIC_V2:
+ model_config: typing.ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(extra="allow", frozen=True) # type: ignore # Pydantic v2
+ else:
+
+ class Config:
+ frozen = True
+ smart_union = True
+ extra = pydantic.Extra.allow
+
+
+class AudienceEngagementRule_LeadForm(UniversalBaseModel):
+ object: typing.Literal["lead_form"] = "lead_form"
+ event: AudienceEngagementLeadFormRuleEvent
+ platform_form_ids: typing.List[str]
+ retention_days: int
+ social_account_id: str
+
+ if IS_PYDANTIC_V2:
+ model_config: typing.ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(extra="allow", frozen=True) # type: ignore # Pydantic v2
+ else:
+
+ class Config:
+ frozen = True
+ smart_union = True
+ extra = pydantic.Extra.allow
+
+
+class AudienceEngagementRule_Video(UniversalBaseModel):
+ object: typing.Literal["video"] = "video"
+ event: AudienceEngagementVideoRuleEvent
+ platform_video_ids: typing.List[str]
+ retention_days: int
+ social_account_id: str
+
+ if IS_PYDANTIC_V2:
+ model_config: typing.ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(extra="allow", frozen=True) # type: ignore # Pydantic v2
+ else:
+
+ class Config:
+ frozen = True
+ smart_union = True
+ extra = pydantic.Extra.allow
+
+
+AudienceEngagementRule = typing_extensions.Annotated[
+ typing.Union[
+ AudienceEngagementRule_FacebookPage,
+ AudienceEngagementRule_InstagramProfile,
+ AudienceEngagementRule_LeadForm,
+ AudienceEngagementRule_Video,
+ ],
+ pydantic.Field(discriminator="object"),
+]
diff --git a/src/whop_sdk/types/audience_engagement_video_rule.py b/src/whop_sdk/types/audience_engagement_video_rule.py
new file mode 100644
index 00000000..9ff0a1ea
--- /dev/null
+++ b/src/whop_sdk/types/audience_engagement_video_rule.py
@@ -0,0 +1,34 @@
+# This file was auto-generated by Fern from our API Definition.
+
+import typing
+
+import pydantic
+from ..core.pydantic_utilities import IS_PYDANTIC_V2, UniversalBaseModel
+from .audience_engagement_video_rule_event import AudienceEngagementVideoRuleEvent
+
+
+class AudienceEngagementVideoRule(UniversalBaseModel):
+ event: AudienceEngagementVideoRuleEvent = pydantic.Field()
+ """
+ Interaction that qualifies a person for this rule.
+ """
+
+ platform_video_ids: typing.List[str]
+ retention_days: int = pydantic.Field()
+ """
+ Rolling membership window in days, from 1 to 365.
+ """
+
+ social_account_id: str = pydantic.Field()
+ """
+ Connected social account ID, prefixed `sacc_`, with advertising access.
+ """
+
+ if IS_PYDANTIC_V2:
+ model_config: typing.ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(extra="allow", frozen=True) # type: ignore # Pydantic v2
+ else:
+
+ class Config:
+ frozen = True
+ smart_union = True
+ extra = pydantic.Extra.allow
diff --git a/src/whop_sdk/types/audience_engagement_video_rule_event.py b/src/whop_sdk/types/audience_engagement_video_rule_event.py
new file mode 100644
index 00000000..1c74ff17
--- /dev/null
+++ b/src/whop_sdk/types/audience_engagement_video_rule_event.py
@@ -0,0 +1,16 @@
+# This file was auto-generated by Fern from our API Definition.
+
+import typing
+
+AudienceEngagementVideoRuleEvent = typing.Union[
+ typing.Literal[
+ "watched_3_seconds",
+ "watched_10_seconds",
+ "watched_15_seconds",
+ "watched_25_percent",
+ "watched_50_percent",
+ "watched_75_percent",
+ "watched_95_percent",
+ ],
+ typing.Any,
+]
diff --git a/src/whop_sdk/types/audience_source_type.py b/src/whop_sdk/types/audience_source_type.py
index 97d2c18b..86144f61 100644
--- a/src/whop_sdk/types/audience_source_type.py
+++ b/src/whop_sdk/types/audience_source_type.py
@@ -2,4 +2,4 @@
import typing
-AudienceSourceType = typing.Union[typing.Literal["csv_upload", "people_filter"], typing.Any]
+AudienceSourceType = typing.Union[typing.Literal["csv_upload", "people_filter", "engagement"], typing.Any]
diff --git a/src/whop_sdk/types/checkout_configuration_list_item.py b/src/whop_sdk/types/checkout_configuration_list_item.py
index 06dada34..1f3dffe0 100644
--- a/src/whop_sdk/types/checkout_configuration_list_item.py
+++ b/src/whop_sdk/types/checkout_configuration_list_item.py
@@ -27,6 +27,11 @@ class CheckoutConfigurationListItem(UniversalBaseModel):
The affiliate code to use for the checkout configuration
"""
+ company_id: str = pydantic.Field()
+ """
+ The ID of the account to use for the checkout configuration
+ """
+
currency: typing.Optional[Currencies] = pydantic.Field(default=None)
"""
The currency to use for the configuration when in 'setup' mode. This is used to target which currency specific payment methods are available. If not provided, it will default to 'usd' when in setup mode.
diff --git a/src/whop_sdk/types/fee_markup_types.py b/src/whop_sdk/types/fee_markup_types.py
index 8a683f66..f6a2c1f5 100644
--- a/src/whop_sdk/types/fee_markup_types.py
+++ b/src/whop_sdk/types/fee_markup_types.py
@@ -9,6 +9,8 @@
"next_day_bank_withdrawal_markup",
"bank_wire_withdrawal_markup",
"digital_wallet_withdrawal_markup",
+ "crypto_deposit_markup",
+ "bank_deposit_markup",
],
typing.Any,
]
diff --git a/src/whop_sdk/types/ledger_activity_line_type.py b/src/whop_sdk/types/ledger_activity_line_type.py
index 48fb216b..f4444864 100644
--- a/src/whop_sdk/types/ledger_activity_line_type.py
+++ b/src/whop_sdk/types/ledger_activity_line_type.py
@@ -132,6 +132,11 @@
"withdrawal_reclassification",
"withdrawal_reversal",
"withdrawal_topup_adjustment",
+ "deposit",
+ "wallet_transfer_incoming",
+ "wallet_transfer_outgoing",
+ "swap_source",
+ "swap_target",
],
typing.Any,
]
diff --git a/src/whop_sdk/types/onboarding_reward.py b/src/whop_sdk/types/onboarding_reward.py
new file mode 100644
index 00000000..37d42d45
--- /dev/null
+++ b/src/whop_sdk/types/onboarding_reward.py
@@ -0,0 +1,89 @@
+# This file was auto-generated by Fern from our API Definition.
+
+import typing
+
+import pydantic
+from ..core.pydantic_utilities import IS_PYDANTIC_V2, UniversalBaseModel
+from .money import Money
+from .onboarding_reward_qualification_income_source import OnboardingRewardQualificationIncomeSource
+from .onboarding_reward_reward_type import OnboardingRewardRewardType
+from .onboarding_reward_status import OnboardingRewardStatus
+from .user_summary import UserSummary
+
+
+class OnboardingReward(UniversalBaseModel):
+ expires_at: typing.Optional[str] = pydantic.Field(default=None)
+ """
+ When the reward stops accepting new claims and qualifying volume, as an ISO 8601 timestamp. Null when it does not expire.
+ """
+
+ id: str = pydantic.Field()
+ """
+ Onboarding reward ID, prefixed `onbr_`.
+ """
+
+ max_redemptions: typing.Optional[int] = pydantic.Field(default=None)
+ """
+ How many businesses can earn this reward in total. Null when unlimited.
+ """
+
+ partner: UserSummary = pydantic.Field()
+ """
+ Partner whose link attributed this reward.
+ """
+
+ qualification_amount: typing.Optional[Money] = pydantic.Field(default=None)
+ """
+ Required qualifying volume. Null for an immediate reward.
+ """
+
+ qualification_income_source: typing.Optional[OnboardingRewardQualificationIncomeSource] = pydantic.Field(
+ default=None
+ )
+ """
+ Income source whose volume qualifies the business. Null for an immediate reward.
+ """
+
+ qualification_met: typing.Optional[bool] = pydantic.Field(default=None)
+ """
+ Whether the attributed business met the requirement. Null before a business claims the link.
+ """
+
+ qualification_progress: typing.Optional[Money] = pydantic.Field(default=None)
+ """
+ Qualifying volume accumulated by the attributed business. Null before a business claims the link and for immediate rewards.
+ """
+
+ remaining_redemptions: typing.Optional[int] = pydantic.Field(default=None)
+ """
+ How many rewards are still unclaimed. For rewards with a qualification, a business claims one only when it meets the requirement, so this can reach zero while other businesses are still working toward it. Null when unlimited.
+ """
+
+ reward_amount: Money = pydantic.Field()
+ """
+ Reward value delivered after qualification.
+ """
+
+ reward_type: OnboardingRewardRewardType = pydantic.Field()
+ """
+ How the reward is delivered.
+ """
+
+ rewarded: typing.Optional[bool] = pydantic.Field(default=None)
+ """
+ Whether the reward was credited to the attributed business. Null before a business claims the link.
+ """
+
+ status: OnboardingRewardStatus = pydantic.Field()
+ """
+ Whether the reward can still be claimed: `available`, `fully_claimed`, `expired`, or `unavailable`.
+ """
+
+ if IS_PYDANTIC_V2:
+ model_config: typing.ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(extra="allow", frozen=True) # type: ignore # Pydantic v2
+ else:
+
+ class Config:
+ frozen = True
+ smart_union = True
+ extra = pydantic.Extra.allow
diff --git a/src/whop_sdk/types/onboarding_reward_qualification_income_source.py b/src/whop_sdk/types/onboarding_reward_qualification_income_source.py
new file mode 100644
index 00000000..86b1bc5b
--- /dev/null
+++ b/src/whop_sdk/types/onboarding_reward_qualification_income_source.py
@@ -0,0 +1,5 @@
+# This file was auto-generated by Fern from our API Definition.
+
+import typing
+
+OnboardingRewardQualificationIncomeSource = typing.Union[typing.Literal["sales", "ad_spend"], typing.Any]
diff --git a/src/whop_sdk/types/onboarding_reward_reward_type.py b/src/whop_sdk/types/onboarding_reward_reward_type.py
new file mode 100644
index 00000000..c95fe415
--- /dev/null
+++ b/src/whop_sdk/types/onboarding_reward_reward_type.py
@@ -0,0 +1,5 @@
+# This file was auto-generated by Fern from our API Definition.
+
+import typing
+
+OnboardingRewardRewardType = typing.Union[typing.Literal["ad_credit", "balance_credit"], typing.Any]
diff --git a/src/whop_sdk/types/onboarding_reward_status.py b/src/whop_sdk/types/onboarding_reward_status.py
new file mode 100644
index 00000000..16d0c805
--- /dev/null
+++ b/src/whop_sdk/types/onboarding_reward_status.py
@@ -0,0 +1,7 @@
+# This file was auto-generated by Fern from our API Definition.
+
+import typing
+
+OnboardingRewardStatus = typing.Union[
+ typing.Literal["available", "fully_claimed", "expired", "unavailable"], typing.Any
+]
diff --git a/src/whop_sdk/types/payment.py b/src/whop_sdk/types/payment.py
index f83e4356..0d38769a 100644
--- a/src/whop_sdk/types/payment.py
+++ b/src/whop_sdk/types/payment.py
@@ -164,6 +164,11 @@ class Payment(UniversalBaseModel):
The promo code applied at checkout, prefixed `promo_`, or null.
"""
+ recovery_url: typing.Optional[str] = pydantic.Field(default=None)
+ """
+ Whop-hosted URL where the buyer can sign in and complete 3D Secure for a failed subscription renewal. Null when recovery is unavailable, you lack `member:basic:read`, or in list responses. Retrieve the payment for it.
+ """
+
refundable: bool = pydantic.Field()
"""
True when the payment is `paid`, not yet fully refunded, and its processor supports refunds.
diff --git a/src/whop_sdk/types/payment_legacy.py b/src/whop_sdk/types/payment_legacy.py
index 68f839c8..86a685c0 100644
--- a/src/whop_sdk/types/payment_legacy.py
+++ b/src/whop_sdk/types/payment_legacy.py
@@ -219,6 +219,11 @@ class PaymentLegacy(UniversalBaseModel):
The promo code used for this payment.
"""
+ recovery_url: typing.Optional[str] = pydantic.Field(default=None)
+ """
+ Whop-hosted URL where the buyer can sign in and complete 3D Secure for a failed subscription renewal. `null` when recovery is unavailable or you lack `member:basic:read`.
+ """
+
refundable: bool = pydantic.Field()
"""
True only for payments that are `paid`, have not been fully refunded, and were processed by a payment processor that allows refunds.
diff --git a/src/whop_sdk/types/payment_method_types.py b/src/whop_sdk/types/payment_method_types.py
index c221741b..3f6b3271 100644
--- a/src/whop_sdk/types/payment_method_types.py
+++ b/src/whop_sdk/types/payment_method_types.py
@@ -63,6 +63,8 @@
"mb_way",
"m_pesa",
"mercado_pago",
+ "mercado_pago_ar",
+ "mercado_pago_mx",
"mobilepay",
"modo",
"mondu",
@@ -76,7 +78,12 @@
"ng_market",
"ng_ussd",
"ng_wallet",
+ "nupay",
"nz_bank_account",
+ "oney",
+ "oney_3x",
+ "oney_4x",
+ "opay",
"oxxo",
"p24",
"pago_efectivo",
@@ -116,6 +123,7 @@
"us_bank_account",
"us_bank_transfer",
"venmo",
+ "verve",
"vipps",
"webpay",
"wechat_pay",
diff --git a/src/whop_sdk/types/permission_action.py b/src/whop_sdk/types/permission_action.py
index 0d77c25c..fd8b19d6 100644
--- a/src/whop_sdk/types/permission_action.py
+++ b/src/whop_sdk/types/permission_action.py
@@ -221,6 +221,7 @@
"webhook_receive:chat",
"webhook_receive:entries",
"webhook_receive:ad_campaigns",
+ "webhook_receive:ads",
"webhook_receive:products",
"webhook_receive:plans",
"webhook_receive:shipments",
diff --git a/src/whop_sdk/disputes/types/update_evidence_dispute_request_uncategorized_attachment.py b/src/whop_sdk/types/recommended_action.py
similarity index 60%
rename from src/whop_sdk/disputes/types/update_evidence_dispute_request_uncategorized_attachment.py
rename to src/whop_sdk/types/recommended_action.py
index 1e57d9d9..a891b9a8 100644
--- a/src/whop_sdk/disputes/types/update_evidence_dispute_request_uncategorized_attachment.py
+++ b/src/whop_sdk/types/recommended_action.py
@@ -3,17 +3,13 @@
import typing
import pydantic
-from ...core.pydantic_utilities import IS_PYDANTIC_V2, UniversalBaseModel
+from ..core.pydantic_utilities import IS_PYDANTIC_V2, UniversalBaseModel
-class UpdateEvidenceDisputeRequestUncategorizedAttachment(UniversalBaseModel):
- """
- A file upload for evidence that does not fit into the other categories.
- """
-
+class RecommendedAction(UniversalBaseModel):
id: str = pydantic.Field()
"""
- The ID of an existing file object.
+ Recommended action ID, prefixed `reca_`
"""
if IS_PYDANTIC_V2:
diff --git a/src/whop_sdk/types/resolution_center_case.py b/src/whop_sdk/types/resolution_center_case.py
index 1efc3ec0..099da338 100644
--- a/src/whop_sdk/types/resolution_center_case.py
+++ b/src/whop_sdk/types/resolution_center_case.py
@@ -11,6 +11,7 @@
from .resolution_center_case_reason import ResolutionCenterCaseReason
from .resolution_center_case_refund import ResolutionCenterCaseRefund
from .resolution_center_case_status import ResolutionCenterCaseStatus
+from .resolution_line_item import ResolutionLineItem
from .resolution_payment import ResolutionPayment
@@ -56,6 +57,7 @@ class ResolutionCenterCase(UniversalBaseModel):
Resolution center case ID, prefixed `reso_`.
"""
+ line_items: typing.List[ResolutionLineItem]
outcome: typing.Optional[ResolutionCenterCaseOutcome] = pydantic.Field(default=None)
"""
Who prevailed on the claim. `null` until the case closes. Read `refund` for whether any money actually moved.
diff --git a/src/whop_sdk/types/resolution_line_item.py b/src/whop_sdk/types/resolution_line_item.py
new file mode 100644
index 00000000..fc42d557
--- /dev/null
+++ b/src/whop_sdk/types/resolution_line_item.py
@@ -0,0 +1,42 @@
+# This file was auto-generated by Fern from our API Definition.
+
+import typing
+
+import pydantic
+from ..core.pydantic_utilities import IS_PYDANTIC_V2, UniversalBaseModel
+
+
+class ResolutionLineItem(UniversalBaseModel):
+ id: typing.Optional[str] = pydantic.Field(default=None)
+ """
+ Line item ID, prefixed `li_`. Null when the payment predates item snapshots and the item is read from the payment's plan.
+ """
+
+ label: typing.Optional[str] = pydantic.Field(default=None)
+ """
+ The item's name as shown at checkout — the product title, else the plan title.
+ """
+
+ plan_id: typing.Optional[str] = pydantic.Field(default=None)
+ """
+ The plan bought, prefixed `plan_`. Null when the plan has since been deleted.
+ """
+
+ product_id: typing.Optional[str] = pydantic.Field(default=None)
+ """
+ The product the plan belongs to, prefixed `prod_`. On a payment that predates item snapshots this falls back to the plan's product, so it can be set where the case's own `product_id` is null. Null for a plan with no product.
+ """
+
+ quantity: float = pydantic.Field()
+ """
+ How many units were bought.
+ """
+
+ if IS_PYDANTIC_V2:
+ model_config: typing.ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(extra="allow", frozen=True) # type: ignore # Pydantic v2
+ else:
+
+ class Config:
+ frozen = True
+ smart_union = True
+ extra = pydantic.Extra.allow
diff --git a/src/whop_sdk/types/social_account_post.py b/src/whop_sdk/types/social_account_post.py
index 4393d4c1..9894e16a 100644
--- a/src/whop_sdk/types/social_account_post.py
+++ b/src/whop_sdk/types/social_account_post.py
@@ -14,6 +14,11 @@ class SocialAccountPost(UniversalBaseModel):
The post's call-to-action button, for example shop_now (Facebook only; null for Instagram and TikTok).
"""
+ caption: typing.Optional[str] = pydantic.Field(default=None)
+ """
+ The text accompanying the post, when available.
+ """
+
destination_url: typing.Optional[str] = pydantic.Field(default=None)
"""
The URL the post's call-to-action drives to (Facebook only; null for Instagram and TikTok).
@@ -40,6 +45,11 @@ class SocialAccountPost(UniversalBaseModel):
Poster image for video posts (always set for TikTok, which is video-only); null for image posts, where media_url is already the image.
"""
+ video_id: typing.Optional[str] = pydantic.Field(default=None)
+ """
+ The platform video identifier for engagement audience rules. Null for non-video posts or when unavailable. Facebook video identifiers differ from post identifiers.
+ """
+
if IS_PYDANTIC_V2:
model_config: typing.ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(extra="allow", frozen=True) # type: ignore # Pydantic v2
else:
diff --git a/src/whop_sdk/types/support_channel.py b/src/whop_sdk/types/support_channel.py
index 04e4b6f2..70c8c010 100644
--- a/src/whop_sdk/types/support_channel.py
+++ b/src/whop_sdk/types/support_channel.py
@@ -18,6 +18,11 @@ class SupportChannel(UniversalBaseModel):
The unique identifier of the account associated with this channel. Null if this is not a support or account-scoped conversation.
"""
+ company_id: typing.Optional[str] = pydantic.Field(default=None)
+ """
+ The unique identifier of the account associated with this channel. Null if this is not a support or account-scoped conversation.
+ """
+
custom_name: typing.Optional[str] = pydantic.Field(default=None)
"""
A custom display name assigned to this channel by the user. Null if no custom name has been set.
diff --git a/src/whop_sdk/types/support_channel_list_item.py b/src/whop_sdk/types/support_channel_list_item.py
index 6312cfe4..eef328e9 100644
--- a/src/whop_sdk/types/support_channel_list_item.py
+++ b/src/whop_sdk/types/support_channel_list_item.py
@@ -18,6 +18,11 @@ class SupportChannelListItem(UniversalBaseModel):
The unique identifier of the account associated with this channel. Null if this is not a support or account-scoped conversation.
"""
+ company_id: typing.Optional[str] = pydantic.Field(default=None)
+ """
+ The unique identifier of the account associated with this channel. Null if this is not a support or account-scoped conversation.
+ """
+
custom_name: typing.Optional[str] = pydantic.Field(default=None)
"""
A custom display name assigned to this channel by the user. Null if no custom name has been set.
diff --git a/src/whop_sdk/types/webhook_event.py b/src/whop_sdk/types/webhook_event.py
index 8f24ff5c..ed51d317 100644
--- a/src/whop_sdk/types/webhook_event.py
+++ b/src/whop_sdk/types/webhook_event.py
@@ -72,6 +72,8 @@
"shipment.updated",
"member.created",
"ad_campaign.payment_failed",
+ "ad_campaign.updated",
+ "ad.updated",
"chat.message.created",
"chat.reaction.created",
"payment.created",
diff --git a/src/whop_sdk/types/webhook_events_item.py b/src/whop_sdk/types/webhook_events_item.py
index d6389573..c241fd6c 100644
--- a/src/whop_sdk/types/webhook_events_item.py
+++ b/src/whop_sdk/types/webhook_events_item.py
@@ -72,6 +72,8 @@
"shipment.updated",
"member.created",
"ad_campaign.payment_failed",
+ "ad_campaign.updated",
+ "ad.updated",
"chat.message.created",
"chat.reaction.created",
"payment.created",
diff --git a/src/whop_sdk/types/webhook_list_item_events_item.py b/src/whop_sdk/types/webhook_list_item_events_item.py
index 92c3a147..77a9823c 100644
--- a/src/whop_sdk/types/webhook_list_item_events_item.py
+++ b/src/whop_sdk/types/webhook_list_item_events_item.py
@@ -72,6 +72,8 @@
"shipment.updated",
"member.created",
"ad_campaign.payment_failed",
+ "ad_campaign.updated",
+ "ad.updated",
"chat.message.created",
"chat.reaction.created",
"payment.created",
diff --git a/src/whop_sdk/types/webhook_testable_events_item.py b/src/whop_sdk/types/webhook_testable_events_item.py
index 51627a81..321513f2 100644
--- a/src/whop_sdk/types/webhook_testable_events_item.py
+++ b/src/whop_sdk/types/webhook_testable_events_item.py
@@ -72,6 +72,8 @@
"shipment.updated",
"member.created",
"ad_campaign.payment_failed",
+ "ad_campaign.updated",
+ "ad.updated",
"chat.message.created",
"chat.reaction.created",
"payment.created",
diff --git a/src/whop_sdk/users/client.py b/src/whop_sdk/users/client.py
index 99d3d0e6..dea94f09 100644
--- a/src/whop_sdk/users/client.py
+++ b/src/whop_sdk/users/client.py
@@ -89,7 +89,7 @@ def list(
from whop_sdk import Whop
client = Whop(
- "2026-09-02-2",
+ "2026-09-06",
idempotency_key="YOUR_IDEMPOTENCY_KEY",
token="YOUR_TOKEN",
)
@@ -151,7 +151,7 @@ def me(
from whop_sdk import Whop
client = Whop(
- "2026-09-02-2",
+ "2026-09-06",
idempotency_key="YOUR_IDEMPOTENCY_KEY",
token="YOUR_TOKEN",
)
@@ -210,7 +210,7 @@ def update_me(
from whop_sdk import Whop
client = Whop(
- "2026-09-02-2",
+ "2026-09-06",
idempotency_key="YOUR_IDEMPOTENCY_KEY",
token="YOUR_TOKEN",
)
@@ -278,7 +278,7 @@ def retrieve(
from whop_sdk import Whop
client = Whop(
- "2026-09-02-2",
+ "2026-09-06",
idempotency_key="YOUR_IDEMPOTENCY_KEY",
token="YOUR_TOKEN",
)
@@ -344,7 +344,7 @@ def update(
from whop_sdk import Whop
client = Whop(
- "2026-09-02-2",
+ "2026-09-06",
idempotency_key="YOUR_IDEMPOTENCY_KEY",
token="YOUR_TOKEN",
)
@@ -391,7 +391,7 @@ def check_access(
from whop_sdk import Whop
client = Whop(
- "2026-09-02-2",
+ "2026-09-06",
idempotency_key="YOUR_IDEMPOTENCY_KEY",
token="YOUR_TOKEN",
)
@@ -427,7 +427,7 @@ def recommend_actions(
from whop_sdk import Whop
client = Whop(
- "2026-09-02-2",
+ "2026-09-06",
idempotency_key="YOUR_IDEMPOTENCY_KEY",
token="YOUR_TOKEN",
)
@@ -527,7 +527,7 @@ async def list(
from whop_sdk import AsyncWhop
client = AsyncWhop(
- "2026-09-02-2",
+ "2026-09-06",
idempotency_key="YOUR_IDEMPOTENCY_KEY",
token="YOUR_TOKEN",
)
@@ -598,7 +598,7 @@ async def me(
from whop_sdk import AsyncWhop
client = AsyncWhop(
- "2026-09-02-2",
+ "2026-09-06",
idempotency_key="YOUR_IDEMPOTENCY_KEY",
token="YOUR_TOKEN",
)
@@ -665,7 +665,7 @@ async def update_me(
from whop_sdk import AsyncWhop
client = AsyncWhop(
- "2026-09-02-2",
+ "2026-09-06",
idempotency_key="YOUR_IDEMPOTENCY_KEY",
token="YOUR_TOKEN",
)
@@ -741,7 +741,7 @@ async def retrieve(
from whop_sdk import AsyncWhop
client = AsyncWhop(
- "2026-09-02-2",
+ "2026-09-06",
idempotency_key="YOUR_IDEMPOTENCY_KEY",
token="YOUR_TOKEN",
)
@@ -815,7 +815,7 @@ async def update(
from whop_sdk import AsyncWhop
client = AsyncWhop(
- "2026-09-02-2",
+ "2026-09-06",
idempotency_key="YOUR_IDEMPOTENCY_KEY",
token="YOUR_TOKEN",
)
@@ -870,7 +870,7 @@ async def check_access(
from whop_sdk import AsyncWhop
client = AsyncWhop(
- "2026-09-02-2",
+ "2026-09-06",
idempotency_key="YOUR_IDEMPOTENCY_KEY",
token="YOUR_TOKEN",
)
@@ -914,7 +914,7 @@ async def recommend_actions(
from whop_sdk import AsyncWhop
client = AsyncWhop(
- "2026-09-02-2",
+ "2026-09-06",
idempotency_key="YOUR_IDEMPOTENCY_KEY",
token="YOUR_TOKEN",
)
diff --git a/src/whop_sdk/users/oauth_grants/client.py b/src/whop_sdk/users/oauth_grants/client.py
index 44db62e9..e470c505 100644
--- a/src/whop_sdk/users/oauth_grants/client.py
+++ b/src/whop_sdk/users/oauth_grants/client.py
@@ -83,7 +83,7 @@ def list(
from whop_sdk import Whop
client = Whop(
- "2026-09-02-2",
+ "2026-09-06",
idempotency_key="YOUR_IDEMPOTENCY_KEY",
token="YOUR_TOKEN",
)
@@ -168,7 +168,7 @@ def create(
from whop_sdk import Whop
client = Whop(
- "2026-09-02-2",
+ "2026-09-06",
idempotency_key="YOUR_IDEMPOTENCY_KEY",
token="YOUR_TOKEN",
)
@@ -264,7 +264,7 @@ async def list(
from whop_sdk import AsyncWhop
client = AsyncWhop(
- "2026-09-02-2",
+ "2026-09-06",
idempotency_key="YOUR_IDEMPOTENCY_KEY",
token="YOUR_TOKEN",
)
@@ -358,7 +358,7 @@ async def create(
from whop_sdk import AsyncWhop
client = AsyncWhop(
- "2026-09-02-2",
+ "2026-09-06",
idempotency_key="YOUR_IDEMPOTENCY_KEY",
token="YOUR_TOKEN",
)
diff --git a/src/whop_sdk/users/passkeys/client.py b/src/whop_sdk/users/passkeys/client.py
index 8e0e1e48..374cf13c 100644
--- a/src/whop_sdk/users/passkeys/client.py
+++ b/src/whop_sdk/users/passkeys/client.py
@@ -80,7 +80,7 @@ def list(
from whop_sdk import Whop
client = Whop(
- "2026-09-02-2",
+ "2026-09-06",
idempotency_key="YOUR_IDEMPOTENCY_KEY",
token="YOUR_TOKEN",
)
@@ -140,7 +140,7 @@ def create(
from whop_sdk import Whop
client = Whop(
- "2026-09-02-2",
+ "2026-09-06",
idempotency_key="YOUR_IDEMPOTENCY_KEY",
token="YOUR_TOKEN",
)
@@ -191,7 +191,7 @@ def challenge(
from whop_sdk import Whop
client = Whop(
- "2026-09-02-2",
+ "2026-09-06",
idempotency_key="YOUR_IDEMPOTENCY_KEY",
token="YOUR_TOKEN",
)
@@ -243,7 +243,7 @@ def delete(
from whop_sdk import Whop
client = Whop(
- "2026-09-02-2",
+ "2026-09-06",
idempotency_key="YOUR_IDEMPOTENCY_KEY",
token="YOUR_TOKEN",
)
@@ -328,7 +328,7 @@ async def list(
from whop_sdk import AsyncWhop
client = AsyncWhop(
- "2026-09-02-2",
+ "2026-09-06",
idempotency_key="YOUR_IDEMPOTENCY_KEY",
token="YOUR_TOKEN",
)
@@ -397,7 +397,7 @@ async def create(
from whop_sdk import AsyncWhop
client = AsyncWhop(
- "2026-09-02-2",
+ "2026-09-06",
idempotency_key="YOUR_IDEMPOTENCY_KEY",
token="YOUR_TOKEN",
)
@@ -456,7 +456,7 @@ async def challenge(
from whop_sdk import AsyncWhop
client = AsyncWhop(
- "2026-09-02-2",
+ "2026-09-06",
idempotency_key="YOUR_IDEMPOTENCY_KEY",
token="YOUR_TOKEN",
)
@@ -516,7 +516,7 @@ async def delete(
from whop_sdk import AsyncWhop
client = AsyncWhop(
- "2026-09-02-2",
+ "2026-09-06",
idempotency_key="YOUR_IDEMPOTENCY_KEY",
token="YOUR_TOKEN",
)
diff --git a/src/whop_sdk/users/preferences/client.py b/src/whop_sdk/users/preferences/client.py
index eeb5f167..03f792ee 100644
--- a/src/whop_sdk/users/preferences/client.py
+++ b/src/whop_sdk/users/preferences/client.py
@@ -51,7 +51,7 @@ def retrieve(self, *, request_options: typing.Optional[RequestOptions] = None) -
from whop_sdk import Whop
client = Whop(
- "2026-09-02-2",
+ "2026-09-06",
idempotency_key="YOUR_IDEMPOTENCY_KEY",
token="YOUR_TOKEN",
)
@@ -95,7 +95,7 @@ def update(
from whop_sdk import Whop
client = Whop(
- "2026-09-02-2",
+ "2026-09-06",
idempotency_key="YOUR_IDEMPOTENCY_KEY",
token="YOUR_TOKEN",
)
@@ -156,7 +156,7 @@ async def retrieve(self, *, request_options: typing.Optional[RequestOptions] = N
from whop_sdk import AsyncWhop
client = AsyncWhop(
- "2026-09-02-2",
+ "2026-09-06",
idempotency_key="YOUR_IDEMPOTENCY_KEY",
token="YOUR_TOKEN",
)
@@ -208,7 +208,7 @@ async def update(
from whop_sdk import AsyncWhop
client = AsyncWhop(
- "2026-09-02-2",
+ "2026-09-06",
idempotency_key="YOUR_IDEMPOTENCY_KEY",
token="YOUR_TOKEN",
)
diff --git a/src/whop_sdk/users/preferences/notifications/client.py b/src/whop_sdk/users/preferences/notifications/client.py
index 9843d42b..9c9f6901 100644
--- a/src/whop_sdk/users/preferences/notifications/client.py
+++ b/src/whop_sdk/users/preferences/notifications/client.py
@@ -44,7 +44,7 @@ def set(
"""
Sets the authenticated user's notification preferences. Each preference is addressed by `scope`, not by id, so a scope read back from either list endpoint can be sent straight here.
- A scope naming an experience with no topic sets that experience's level, and accepts all three levels. Any other scope sets a topic override, which is binary — `all` or `nothing` — and requires a `channel`.
+ A scope naming an experience with no topic sets that experience's level, and accepts all three levels. Any other scope sets a topic override, which is binary — `all` or `nothing`. A topic override with no `channel` applies to every delivery channel.
`level: null` clears the preference. Preferences are stored as overrides, so clearing one means the scope inherits its default again rather than being switched off.
@@ -72,7 +72,7 @@ def set(
)
client = Whop(
- "2026-09-02-2",
+ "2026-09-06",
idempotency_key="YOUR_IDEMPOTENCY_KEY",
token="YOUR_TOKEN",
)
@@ -131,7 +131,7 @@ async def set(
"""
Sets the authenticated user's notification preferences. Each preference is addressed by `scope`, not by id, so a scope read back from either list endpoint can be sent straight here.
- A scope naming an experience with no topic sets that experience's level, and accepts all three levels. Any other scope sets a topic override, which is binary — `all` or `nothing` — and requires a `channel`.
+ A scope naming an experience with no topic sets that experience's level, and accepts all three levels. Any other scope sets a topic override, which is binary — `all` or `nothing`. A topic override with no `channel` applies to every delivery channel.
`level: null` clears the preference. Preferences are stored as overrides, so clearing one means the scope inherits its default again rather than being switched off.
@@ -161,7 +161,7 @@ async def set(
)
client = AsyncWhop(
- "2026-09-02-2",
+ "2026-09-06",
idempotency_key="YOUR_IDEMPOTENCY_KEY",
token="YOUR_TOKEN",
)
diff --git a/src/whop_sdk/users/preferences/notifications/experiences/client.py b/src/whop_sdk/users/preferences/notifications/experiences/client.py
index baa02122..6e403cb0 100644
--- a/src/whop_sdk/users/preferences/notifications/experiences/client.py
+++ b/src/whop_sdk/users/preferences/notifications/experiences/client.py
@@ -56,7 +56,7 @@ def list(
from whop_sdk import Whop
client = Whop(
- "2026-09-02-2",
+ "2026-09-06",
idempotency_key="YOUR_IDEMPOTENCY_KEY",
token="YOUR_TOKEN",
)
@@ -118,7 +118,7 @@ async def list(
from whop_sdk import AsyncWhop
client = AsyncWhop(
- "2026-09-02-2",
+ "2026-09-06",
idempotency_key="YOUR_IDEMPOTENCY_KEY",
token="YOUR_TOKEN",
)
diff --git a/src/whop_sdk/users/preferences/notifications/raw_client.py b/src/whop_sdk/users/preferences/notifications/raw_client.py
index ae487e4c..75948f3d 100644
--- a/src/whop_sdk/users/preferences/notifications/raw_client.py
+++ b/src/whop_sdk/users/preferences/notifications/raw_client.py
@@ -33,7 +33,7 @@ def set(
"""
Sets the authenticated user's notification preferences. Each preference is addressed by `scope`, not by id, so a scope read back from either list endpoint can be sent straight here.
- A scope naming an experience with no topic sets that experience's level, and accepts all three levels. Any other scope sets a topic override, which is binary — `all` or `nothing` — and requires a `channel`.
+ A scope naming an experience with no topic sets that experience's level, and accepts all three levels. Any other scope sets a topic override, which is binary — `all` or `nothing`. A topic override with no `channel` applies to every delivery channel.
`level: null` clears the preference. Preferences are stored as overrides, so clearing one means the scope inherits its default again rather than being switched off.
@@ -123,7 +123,7 @@ async def set(
"""
Sets the authenticated user's notification preferences. Each preference is addressed by `scope`, not by id, so a scope read back from either list endpoint can be sent straight here.
- A scope naming an experience with no topic sets that experience's level, and accepts all three levels. Any other scope sets a topic override, which is binary — `all` or `nothing` — and requires a `channel`.
+ A scope naming an experience with no topic sets that experience's level, and accepts all three levels. Any other scope sets a topic override, which is binary — `all` or `nothing`. A topic override with no `channel` applies to every delivery channel.
`level: null` clears the preference. Preferences are stored as overrides, so clearing one means the scope inherits its default again rather than being switched off.
diff --git a/src/whop_sdk/users/preferences/notifications/topics/client.py b/src/whop_sdk/users/preferences/notifications/topics/client.py
index 60e2a4eb..400e2547 100644
--- a/src/whop_sdk/users/preferences/notifications/topics/client.py
+++ b/src/whop_sdk/users/preferences/notifications/topics/client.py
@@ -77,7 +77,7 @@ def list(
from whop_sdk import Whop
client = Whop(
- "2026-09-02-2",
+ "2026-09-06",
idempotency_key="YOUR_IDEMPOTENCY_KEY",
token="YOUR_TOKEN",
)
@@ -168,7 +168,7 @@ async def list(
from whop_sdk import AsyncWhop
client = AsyncWhop(
- "2026-09-02-2",
+ "2026-09-06",
idempotency_key="YOUR_IDEMPOTENCY_KEY",
token="YOUR_TOKEN",
)
diff --git a/src/whop_sdk/users/preferences/notifications/types/set_notifications_request_preferences_item_scope.py b/src/whop_sdk/users/preferences/notifications/types/set_notifications_request_preferences_item_scope.py
index 4933e9c6..0d11d39d 100644
--- a/src/whop_sdk/users/preferences/notifications/types/set_notifications_request_preferences_item_scope.py
+++ b/src/whop_sdk/users/preferences/notifications/types/set_notifications_request_preferences_item_scope.py
@@ -19,7 +19,7 @@ class SetNotificationsRequestPreferencesItemScope(UniversalBaseModel):
channel: typing.Optional[SetNotificationsRequestPreferencesItemScopeChannel] = pydantic.Field(default=None)
"""
- Delivery channel the preference applies to. Required when setting a topic override.
+ Delivery channel the preference applies to. Omit it (or pass `null`) to apply the preference to every channel.
"""
experience_id: typing.Optional[str] = pydantic.Field(default=None)
diff --git a/src/whop_sdk/verifications/client.py b/src/whop_sdk/verifications/client.py
index d8fdb804..b8dc5f62 100644
--- a/src/whop_sdk/verifications/client.py
+++ b/src/whop_sdk/verifications/client.py
@@ -68,7 +68,7 @@ def list(
from whop_sdk import Whop
client = Whop(
- "2026-09-02-2",
+ "2026-09-06",
idempotency_key="YOUR_IDEMPOTENCY_KEY",
token="YOUR_TOKEN",
)
@@ -112,7 +112,7 @@ def create(
from whop_sdk.verifications import CreateVerificationsRequestBody_Individual
client = Whop(
- "2026-09-02-2",
+ "2026-09-06",
idempotency_key="YOUR_IDEMPOTENCY_KEY",
token="YOUR_TOKEN",
)
@@ -148,7 +148,7 @@ def retrieve(
from whop_sdk import Whop
client = Whop(
- "2026-09-02-2",
+ "2026-09-06",
idempotency_key="YOUR_IDEMPOTENCY_KEY",
token="YOUR_TOKEN",
)
@@ -190,7 +190,7 @@ def update(
from whop_sdk.verifications import UpdateVerificationsRequestBodyPersonalAddress
client = Whop(
- "2026-09-02-2",
+ "2026-09-06",
idempotency_key="YOUR_IDEMPOTENCY_KEY",
token="YOUR_TOKEN",
)
@@ -255,7 +255,7 @@ async def list(
from whop_sdk import AsyncWhop
client = AsyncWhop(
- "2026-09-02-2",
+ "2026-09-06",
idempotency_key="YOUR_IDEMPOTENCY_KEY",
token="YOUR_TOKEN",
)
@@ -307,7 +307,7 @@ async def create(
from whop_sdk.verifications import CreateVerificationsRequestBody_Individual
client = AsyncWhop(
- "2026-09-02-2",
+ "2026-09-06",
idempotency_key="YOUR_IDEMPOTENCY_KEY",
token="YOUR_TOKEN",
)
@@ -353,7 +353,7 @@ async def retrieve(
from whop_sdk import AsyncWhop
client = AsyncWhop(
- "2026-09-02-2",
+ "2026-09-06",
idempotency_key="YOUR_IDEMPOTENCY_KEY",
token="YOUR_TOKEN",
)
@@ -403,7 +403,7 @@ async def update(
from whop_sdk.verifications import UpdateVerificationsRequestBodyPersonalAddress
client = AsyncWhop(
- "2026-09-02-2",
+ "2026-09-06",
idempotency_key="YOUR_IDEMPOTENCY_KEY",
token="YOUR_TOKEN",
)
diff --git a/src/whop_sdk/webhooks/__init__.py b/src/whop_sdk/webhooks/__init__.py
index 7038d188..db99bec1 100644
--- a/src/whop_sdk/webhooks/__init__.py
+++ b/src/whop_sdk/webhooks/__init__.py
@@ -9,9 +9,6 @@
from .types import (
CreateWebhooksRequestEventsItem,
DeleteWebhooksResponse,
- DeliveriesWebhookResponse,
- DeliveriesWebhookResponseDataItem,
- DeliveriesWebhookResponsePageInfo,
ListDeliveriesWebhooksResponse,
ListDeliveriesWebhooksResponsePageInfo,
ListWebhooksResponse,
@@ -24,9 +21,6 @@
_dynamic_imports: typing.Dict[str, str] = {
"CreateWebhooksRequestEventsItem": ".types",
"DeleteWebhooksResponse": ".types",
- "DeliveriesWebhookResponse": ".types",
- "DeliveriesWebhookResponseDataItem": ".types",
- "DeliveriesWebhookResponsePageInfo": ".types",
"ListDeliveriesWebhooksResponse": ".types",
"ListDeliveriesWebhooksResponsePageInfo": ".types",
"ListWebhooksResponse": ".types",
@@ -62,9 +56,6 @@ def __dir__():
__all__ = [
"CreateWebhooksRequestEventsItem",
"DeleteWebhooksResponse",
- "DeliveriesWebhookResponse",
- "DeliveriesWebhookResponseDataItem",
- "DeliveriesWebhookResponsePageInfo",
"ListDeliveriesWebhooksResponse",
"ListDeliveriesWebhooksResponsePageInfo",
"ListWebhooksResponse",
diff --git a/src/whop_sdk/webhooks/client.py b/src/whop_sdk/webhooks/client.py
index b549ffea..cd600679 100644
--- a/src/whop_sdk/webhooks/client.py
+++ b/src/whop_sdk/webhooks/client.py
@@ -11,8 +11,6 @@
from .raw_client import AsyncRawWebhooksClient, RawWebhooksClient
from .types.create_webhooks_request_events_item import CreateWebhooksRequestEventsItem
from .types.delete_webhooks_response import DeleteWebhooksResponse
-from .types.deliveries_webhook_response import DeliveriesWebhookResponse
-from .types.deliveries_webhook_response_data_item import DeliveriesWebhookResponseDataItem
from .types.list_deliveries_webhooks_response import ListDeliveriesWebhooksResponse
from .types.list_webhooks_response import ListWebhooksResponse
from .types.replay_delivery_webhooks_response import ReplayDeliveryWebhooksResponse
@@ -94,7 +92,7 @@ def list(
from whop_sdk import Whop
client = Whop(
- "2026-09-02-2",
+ "2026-09-06",
idempotency_key="YOUR_IDEMPOTENCY_KEY",
token="YOUR_TOKEN",
)
@@ -166,7 +164,7 @@ def create(
from whop_sdk import Whop
client = Whop(
- "2026-09-02-2",
+ "2026-09-06",
idempotency_key="YOUR_IDEMPOTENCY_KEY",
token="YOUR_TOKEN",
)
@@ -207,7 +205,7 @@ def retrieve(self, id: str, *, request_options: typing.Optional[RequestOptions]
from whop_sdk import Whop
client = Whop(
- "2026-09-02-2",
+ "2026-09-06",
idempotency_key="YOUR_IDEMPOTENCY_KEY",
token="YOUR_TOKEN",
)
@@ -240,7 +238,7 @@ def delete(self, id: str, *, request_options: typing.Optional[RequestOptions] =
from whop_sdk import Whop
client = Whop(
- "2026-09-02-2",
+ "2026-09-06",
idempotency_key="YOUR_IDEMPOTENCY_KEY",
token="YOUR_TOKEN",
)
@@ -298,7 +296,7 @@ def update(
from whop_sdk import Whop
client = Whop(
- "2026-09-02-2",
+ "2026-09-06",
idempotency_key="YOUR_IDEMPOTENCY_KEY",
token="YOUR_TOKEN",
)
@@ -352,7 +350,7 @@ def list_deliveries(
from whop_sdk import Whop
client = Whop(
- "2026-09-02-2",
+ "2026-09-06",
idempotency_key="YOUR_IDEMPOTENCY_KEY",
token="YOUR_TOKEN",
)
@@ -402,7 +400,7 @@ def replay_delivery(
from whop_sdk import Whop
client = Whop(
- "2026-09-02-2",
+ "2026-09-06",
idempotency_key="YOUR_IDEMPOTENCY_KEY",
token="YOUR_TOKEN",
)
@@ -463,7 +461,7 @@ def replay(
from whop_sdk import Whop
client = Whop(
- "2026-09-02-2",
+ "2026-09-06",
idempotency_key="YOUR_IDEMPOTENCY_KEY",
token="YOUR_TOKEN",
)
@@ -510,7 +508,7 @@ def test(
from whop_sdk import Whop
client = Whop(
- "2026-09-02-2",
+ "2026-09-06",
idempotency_key="YOUR_IDEMPOTENCY_KEY",
token="YOUR_TOKEN",
)
@@ -522,71 +520,6 @@ def test(
_response = self._raw_client.test(id, event=event, request_options=request_options)
return _response.data
- def deliveries_webhook(
- self,
- webhook_id: str,
- *,
- after: typing.Optional[str] = None,
- before: typing.Optional[str] = None,
- first: typing.Optional[int] = None,
- last: typing.Optional[int] = None,
- request_options: typing.Optional[RequestOptions] = None,
- ) -> SyncPager[DeliveriesWebhookResponseDataItem, DeliveriesWebhookResponse]:
- """
- Returns a paginated list of delivery attempts for a webhook, ordered by most recent first. Includes the request payload, response body, response code, and timing for each attempt.
-
- Required permissions:
- - `developer:manage_webhook`
-
- Parameters
- ----------
- webhook_id : str
- The unique identifier of the webhook to list deliveries for.
-
- after : typing.Optional[str]
- Returns the elements in the list that come after the specified cursor.
-
- before : typing.Optional[str]
- Returns the elements in the list that come before the specified cursor.
-
- first : typing.Optional[int]
- Returns the first _n_ elements from the list.
-
- last : typing.Optional[int]
- Returns the last _n_ elements from the list.
-
- request_options : typing.Optional[RequestOptions]
- Request-specific configuration.
-
- Returns
- -------
- SyncPager[DeliveriesWebhookResponseDataItem, DeliveriesWebhookResponse]
- A successful response
-
- Examples
- --------
- from whop_sdk import Whop
-
- client = Whop(
- "2026-09-02-2",
- idempotency_key="YOUR_IDEMPOTENCY_KEY",
- token="YOUR_TOKEN",
- )
- response = client.webhooks.deliveries_webhook(
- webhook_id="webhook_id",
- first=42,
- last=42,
- )
- for item in response:
- yield item
- # alternatively, you can paginate page-by-page
- for page in response.iter_pages():
- yield page
- """
- return self._raw_client.deliveries_webhook(
- webhook_id, after=after, before=before, first=first, last=last, request_options=request_options
- )
-
class AsyncWebhooksClient:
def __init__(self, *, client_wrapper: AsyncClientWrapper):
@@ -660,7 +593,7 @@ async def list(
from whop_sdk import AsyncWhop
client = AsyncWhop(
- "2026-09-02-2",
+ "2026-09-06",
idempotency_key="YOUR_IDEMPOTENCY_KEY",
token="YOUR_TOKEN",
)
@@ -741,7 +674,7 @@ async def create(
from whop_sdk import AsyncWhop
client = AsyncWhop(
- "2026-09-02-2",
+ "2026-09-06",
idempotency_key="YOUR_IDEMPOTENCY_KEY",
token="YOUR_TOKEN",
)
@@ -790,7 +723,7 @@ async def retrieve(self, id: str, *, request_options: typing.Optional[RequestOpt
from whop_sdk import AsyncWhop
client = AsyncWhop(
- "2026-09-02-2",
+ "2026-09-06",
idempotency_key="YOUR_IDEMPOTENCY_KEY",
token="YOUR_TOKEN",
)
@@ -833,7 +766,7 @@ async def delete(
from whop_sdk import AsyncWhop
client = AsyncWhop(
- "2026-09-02-2",
+ "2026-09-06",
idempotency_key="YOUR_IDEMPOTENCY_KEY",
token="YOUR_TOKEN",
)
@@ -899,7 +832,7 @@ async def update(
from whop_sdk import AsyncWhop
client = AsyncWhop(
- "2026-09-02-2",
+ "2026-09-06",
idempotency_key="YOUR_IDEMPOTENCY_KEY",
token="YOUR_TOKEN",
)
@@ -961,7 +894,7 @@ async def list_deliveries(
from whop_sdk import AsyncWhop
client = AsyncWhop(
- "2026-09-02-2",
+ "2026-09-06",
idempotency_key="YOUR_IDEMPOTENCY_KEY",
token="YOUR_TOKEN",
)
@@ -1020,7 +953,7 @@ async def replay_delivery(
from whop_sdk import AsyncWhop
client = AsyncWhop(
- "2026-09-02-2",
+ "2026-09-06",
idempotency_key="YOUR_IDEMPOTENCY_KEY",
token="YOUR_TOKEN",
)
@@ -1089,7 +1022,7 @@ async def replay(
from whop_sdk import AsyncWhop
client = AsyncWhop(
- "2026-09-02-2",
+ "2026-09-06",
idempotency_key="YOUR_IDEMPOTENCY_KEY",
token="YOUR_TOKEN",
)
@@ -1144,7 +1077,7 @@ async def test(
from whop_sdk import AsyncWhop
client = AsyncWhop(
- "2026-09-02-2",
+ "2026-09-06",
idempotency_key="YOUR_IDEMPOTENCY_KEY",
token="YOUR_TOKEN",
)
@@ -1161,77 +1094,3 @@ async def main() -> None:
"""
_response = await self._raw_client.test(id, event=event, request_options=request_options)
return _response.data
-
- async def deliveries_webhook(
- self,
- webhook_id: str,
- *,
- after: typing.Optional[str] = None,
- before: typing.Optional[str] = None,
- first: typing.Optional[int] = None,
- last: typing.Optional[int] = None,
- request_options: typing.Optional[RequestOptions] = None,
- ) -> AsyncPager[DeliveriesWebhookResponseDataItem, DeliveriesWebhookResponse]:
- """
- Returns a paginated list of delivery attempts for a webhook, ordered by most recent first. Includes the request payload, response body, response code, and timing for each attempt.
-
- Required permissions:
- - `developer:manage_webhook`
-
- Parameters
- ----------
- webhook_id : str
- The unique identifier of the webhook to list deliveries for.
-
- after : typing.Optional[str]
- Returns the elements in the list that come after the specified cursor.
-
- before : typing.Optional[str]
- Returns the elements in the list that come before the specified cursor.
-
- first : typing.Optional[int]
- Returns the first _n_ elements from the list.
-
- last : typing.Optional[int]
- Returns the last _n_ elements from the list.
-
- request_options : typing.Optional[RequestOptions]
- Request-specific configuration.
-
- Returns
- -------
- AsyncPager[DeliveriesWebhookResponseDataItem, DeliveriesWebhookResponse]
- A successful response
-
- Examples
- --------
- import asyncio
-
- from whop_sdk import AsyncWhop
-
- client = AsyncWhop(
- "2026-09-02-2",
- idempotency_key="YOUR_IDEMPOTENCY_KEY",
- token="YOUR_TOKEN",
- )
-
-
- async def main() -> None:
- response = await client.webhooks.deliveries_webhook(
- webhook_id="webhook_id",
- first=42,
- last=42,
- )
- async for item in response:
- yield item
-
- # alternatively, you can paginate page-by-page
- async for page in response.iter_pages():
- yield page
-
-
- asyncio.run(main())
- """
- return await self._raw_client.deliveries_webhook(
- webhook_id, after=after, before=before, first=first, last=last, request_options=request_options
- )
diff --git a/src/whop_sdk/webhooks/raw_client.py b/src/whop_sdk/webhooks/raw_client.py
index 6369489d..31f866ef 100644
--- a/src/whop_sdk/webhooks/raw_client.py
+++ b/src/whop_sdk/webhooks/raw_client.py
@@ -14,19 +14,14 @@
from ..errors.bad_request_error import BadRequestError
from ..errors.conflict_error import ConflictError
from ..errors.forbidden_error import ForbiddenError
-from ..errors.internal_server_error import InternalServerError
from ..errors.not_found_error import NotFoundError
-from ..errors.too_many_requests_error import TooManyRequestsError
from ..errors.unauthorized_error import UnauthorizedError
-from ..errors.unprocessable_entity_error import UnprocessableEntityError
from ..types.v1error_response import V1ErrorResponse
from ..types.webhook import Webhook
from ..types.webhook_delivery import WebhookDelivery
from ..types.webhook_list_item import WebhookListItem
from .types.create_webhooks_request_events_item import CreateWebhooksRequestEventsItem
from .types.delete_webhooks_response import DeleteWebhooksResponse
-from .types.deliveries_webhook_response import DeliveriesWebhookResponse
-from .types.deliveries_webhook_response_data_item import DeliveriesWebhookResponseDataItem
from .types.list_deliveries_webhooks_response import ListDeliveriesWebhooksResponse
from .types.list_webhooks_response import ListWebhooksResponse
from .types.replay_delivery_webhooks_response import ReplayDeliveryWebhooksResponse
@@ -1051,168 +1046,6 @@ def test(
)
raise ApiError(status_code=_response.status_code, headers=dict(_response.headers), body=_response_json)
- def deliveries_webhook(
- self,
- webhook_id: str,
- *,
- after: typing.Optional[str] = None,
- before: typing.Optional[str] = None,
- first: typing.Optional[int] = None,
- last: typing.Optional[int] = None,
- request_options: typing.Optional[RequestOptions] = None,
- ) -> SyncPager[DeliveriesWebhookResponseDataItem, DeliveriesWebhookResponse]:
- """
- Returns a paginated list of delivery attempts for a webhook, ordered by most recent first. Includes the request payload, response body, response code, and timing for each attempt.
-
- Required permissions:
- - `developer:manage_webhook`
-
- Parameters
- ----------
- webhook_id : str
- The unique identifier of the webhook to list deliveries for.
-
- after : typing.Optional[str]
- Returns the elements in the list that come after the specified cursor.
-
- before : typing.Optional[str]
- Returns the elements in the list that come before the specified cursor.
-
- first : typing.Optional[int]
- Returns the first _n_ elements from the list.
-
- last : typing.Optional[int]
- Returns the last _n_ elements from the list.
-
- request_options : typing.Optional[RequestOptions]
- Request-specific configuration.
-
- Returns
- -------
- SyncPager[DeliveriesWebhookResponseDataItem, DeliveriesWebhookResponse]
- A successful response
- """
- _response = self._client_wrapper.httpx_client.request(
- f"webhooks/{encode_path_param(webhook_id)}/deliveries",
- method="GET",
- params={
- "after": after,
- "before": before,
- "first": first,
- "last": last,
- },
- request_options=request_options,
- )
- try:
- if 200 <= _response.status_code < 300:
- _parsed_response = typing.cast(
- DeliveriesWebhookResponse,
- parse_obj_as(
- type_=DeliveriesWebhookResponse, # type: ignore
- object_=_response.json(),
- ),
- )
- _items = _parsed_response.data
- _has_next = False
- _get_next = None
- if _parsed_response.page_info is not None:
- _parsed_next = _parsed_response.page_info.end_cursor
- _has_next = _parsed_next is not None and _parsed_next != ""
- _get_next = lambda: self.deliveries_webhook(
- webhook_id,
- after=_parsed_next,
- before=before,
- first=first,
- last=last,
- request_options=request_options,
- )
- return SyncPager(has_next=_has_next, items=_items, get_next=_get_next, response=_parsed_response)
- if _response.status_code == 400:
- raise BadRequestError(
- headers=dict(_response.headers),
- body=typing.cast(
- typing.Any,
- parse_obj_as(
- type_=typing.Any, # type: ignore
- object_=_response.json(),
- ),
- ),
- )
- if _response.status_code == 401:
- raise UnauthorizedError(
- headers=dict(_response.headers),
- body=typing.cast(
- typing.Any,
- parse_obj_as(
- type_=typing.Any, # type: ignore
- object_=_response.json(),
- ),
- ),
- )
- if _response.status_code == 403:
- raise ForbiddenError(
- headers=dict(_response.headers),
- body=typing.cast(
- typing.Any,
- parse_obj_as(
- type_=typing.Any, # type: ignore
- object_=_response.json(),
- ),
- ),
- )
- if _response.status_code == 404:
- raise NotFoundError(
- headers=dict(_response.headers),
- body=typing.cast(
- typing.Any,
- parse_obj_as(
- type_=typing.Any, # type: ignore
- object_=_response.json(),
- ),
- ),
- )
- if _response.status_code == 422:
- raise UnprocessableEntityError(
- headers=dict(_response.headers),
- body=typing.cast(
- typing.Any,
- parse_obj_as(
- type_=typing.Any, # type: ignore
- object_=_response.json(),
- ),
- ),
- )
- if _response.status_code == 429:
- raise TooManyRequestsError(
- headers=dict(_response.headers),
- body=typing.cast(
- typing.Any,
- parse_obj_as(
- type_=typing.Any, # type: ignore
- object_=_response.json(),
- ),
- ),
- )
- if _response.status_code == 500:
- raise InternalServerError(
- headers=dict(_response.headers),
- body=typing.cast(
- typing.Any,
- parse_obj_as(
- type_=typing.Any, # type: ignore
- object_=_response.json(),
- ),
- ),
- )
- _response_json = _response.json()
- except JSONDecodeError:
- raise ApiError(status_code=_response.status_code, headers=dict(_response.headers), body=_response.text)
- except ValidationError as e:
- raise ParsingError(
- status_code=_response.status_code, headers=dict(_response.headers), body=_response.json(), cause=e
- )
- raise ApiError(status_code=_response.status_code, headers=dict(_response.headers), body=_response_json)
-
class AsyncRawWebhooksClient:
def __init__(self, *, client_wrapper: AsyncClientWrapper):
@@ -2233,168 +2066,3 @@ async def test(
status_code=_response.status_code, headers=dict(_response.headers), body=_response.json(), cause=e
)
raise ApiError(status_code=_response.status_code, headers=dict(_response.headers), body=_response_json)
-
- async def deliveries_webhook(
- self,
- webhook_id: str,
- *,
- after: typing.Optional[str] = None,
- before: typing.Optional[str] = None,
- first: typing.Optional[int] = None,
- last: typing.Optional[int] = None,
- request_options: typing.Optional[RequestOptions] = None,
- ) -> AsyncPager[DeliveriesWebhookResponseDataItem, DeliveriesWebhookResponse]:
- """
- Returns a paginated list of delivery attempts for a webhook, ordered by most recent first. Includes the request payload, response body, response code, and timing for each attempt.
-
- Required permissions:
- - `developer:manage_webhook`
-
- Parameters
- ----------
- webhook_id : str
- The unique identifier of the webhook to list deliveries for.
-
- after : typing.Optional[str]
- Returns the elements in the list that come after the specified cursor.
-
- before : typing.Optional[str]
- Returns the elements in the list that come before the specified cursor.
-
- first : typing.Optional[int]
- Returns the first _n_ elements from the list.
-
- last : typing.Optional[int]
- Returns the last _n_ elements from the list.
-
- request_options : typing.Optional[RequestOptions]
- Request-specific configuration.
-
- Returns
- -------
- AsyncPager[DeliveriesWebhookResponseDataItem, DeliveriesWebhookResponse]
- A successful response
- """
- _response = await self._client_wrapper.httpx_client.request(
- f"webhooks/{encode_path_param(webhook_id)}/deliveries",
- method="GET",
- params={
- "after": after,
- "before": before,
- "first": first,
- "last": last,
- },
- request_options=request_options,
- )
- try:
- if 200 <= _response.status_code < 300:
- _parsed_response = typing.cast(
- DeliveriesWebhookResponse,
- parse_obj_as(
- type_=DeliveriesWebhookResponse, # type: ignore
- object_=_response.json(),
- ),
- )
- _items = _parsed_response.data
- _has_next = False
- _get_next = None
- if _parsed_response.page_info is not None:
- _parsed_next = _parsed_response.page_info.end_cursor
- _has_next = _parsed_next is not None and _parsed_next != ""
-
- async def _get_next():
- return await self.deliveries_webhook(
- webhook_id,
- after=_parsed_next,
- before=before,
- first=first,
- last=last,
- request_options=request_options,
- )
-
- return AsyncPager(has_next=_has_next, items=_items, get_next=_get_next, response=_parsed_response)
- if _response.status_code == 400:
- raise BadRequestError(
- headers=dict(_response.headers),
- body=typing.cast(
- typing.Any,
- parse_obj_as(
- type_=typing.Any, # type: ignore
- object_=_response.json(),
- ),
- ),
- )
- if _response.status_code == 401:
- raise UnauthorizedError(
- headers=dict(_response.headers),
- body=typing.cast(
- typing.Any,
- parse_obj_as(
- type_=typing.Any, # type: ignore
- object_=_response.json(),
- ),
- ),
- )
- if _response.status_code == 403:
- raise ForbiddenError(
- headers=dict(_response.headers),
- body=typing.cast(
- typing.Any,
- parse_obj_as(
- type_=typing.Any, # type: ignore
- object_=_response.json(),
- ),
- ),
- )
- if _response.status_code == 404:
- raise NotFoundError(
- headers=dict(_response.headers),
- body=typing.cast(
- typing.Any,
- parse_obj_as(
- type_=typing.Any, # type: ignore
- object_=_response.json(),
- ),
- ),
- )
- if _response.status_code == 422:
- raise UnprocessableEntityError(
- headers=dict(_response.headers),
- body=typing.cast(
- typing.Any,
- parse_obj_as(
- type_=typing.Any, # type: ignore
- object_=_response.json(),
- ),
- ),
- )
- if _response.status_code == 429:
- raise TooManyRequestsError(
- headers=dict(_response.headers),
- body=typing.cast(
- typing.Any,
- parse_obj_as(
- type_=typing.Any, # type: ignore
- object_=_response.json(),
- ),
- ),
- )
- if _response.status_code == 500:
- raise InternalServerError(
- headers=dict(_response.headers),
- body=typing.cast(
- typing.Any,
- parse_obj_as(
- type_=typing.Any, # type: ignore
- object_=_response.json(),
- ),
- ),
- )
- _response_json = _response.json()
- except JSONDecodeError:
- raise ApiError(status_code=_response.status_code, headers=dict(_response.headers), body=_response.text)
- except ValidationError as e:
- raise ParsingError(
- status_code=_response.status_code, headers=dict(_response.headers), body=_response.json(), cause=e
- )
- raise ApiError(status_code=_response.status_code, headers=dict(_response.headers), body=_response_json)
diff --git a/src/whop_sdk/webhooks/types/__init__.py b/src/whop_sdk/webhooks/types/__init__.py
index cfdf6fc2..0db58734 100644
--- a/src/whop_sdk/webhooks/types/__init__.py
+++ b/src/whop_sdk/webhooks/types/__init__.py
@@ -8,9 +8,6 @@
if typing.TYPE_CHECKING:
from .create_webhooks_request_events_item import CreateWebhooksRequestEventsItem
from .delete_webhooks_response import DeleteWebhooksResponse
- from .deliveries_webhook_response import DeliveriesWebhookResponse
- from .deliveries_webhook_response_data_item import DeliveriesWebhookResponseDataItem
- from .deliveries_webhook_response_page_info import DeliveriesWebhookResponsePageInfo
from .list_deliveries_webhooks_response import ListDeliveriesWebhooksResponse
from .list_deliveries_webhooks_response_page_info import ListDeliveriesWebhooksResponsePageInfo
from .list_webhooks_response import ListWebhooksResponse
@@ -22,9 +19,6 @@
_dynamic_imports: typing.Dict[str, str] = {
"CreateWebhooksRequestEventsItem": ".create_webhooks_request_events_item",
"DeleteWebhooksResponse": ".delete_webhooks_response",
- "DeliveriesWebhookResponse": ".deliveries_webhook_response",
- "DeliveriesWebhookResponseDataItem": ".deliveries_webhook_response_data_item",
- "DeliveriesWebhookResponsePageInfo": ".deliveries_webhook_response_page_info",
"ListDeliveriesWebhooksResponse": ".list_deliveries_webhooks_response",
"ListDeliveriesWebhooksResponsePageInfo": ".list_deliveries_webhooks_response_page_info",
"ListWebhooksResponse": ".list_webhooks_response",
@@ -60,9 +54,6 @@ def __dir__():
__all__ = [
"CreateWebhooksRequestEventsItem",
"DeleteWebhooksResponse",
- "DeliveriesWebhookResponse",
- "DeliveriesWebhookResponseDataItem",
- "DeliveriesWebhookResponsePageInfo",
"ListDeliveriesWebhooksResponse",
"ListDeliveriesWebhooksResponsePageInfo",
"ListWebhooksResponse",
diff --git a/src/whop_sdk/webhooks/types/create_webhooks_request_events_item.py b/src/whop_sdk/webhooks/types/create_webhooks_request_events_item.py
index 3179d28e..ff9e7a2c 100644
--- a/src/whop_sdk/webhooks/types/create_webhooks_request_events_item.py
+++ b/src/whop_sdk/webhooks/types/create_webhooks_request_events_item.py
@@ -69,6 +69,8 @@
"shipment.updated",
"member.created",
"ad_campaign.payment_failed",
+ "ad_campaign.updated",
+ "ad.updated",
"chat.message.created",
"chat.reaction.created",
"payment.created",
diff --git a/src/whop_sdk/webhooks/types/deliveries_webhook_response.py b/src/whop_sdk/webhooks/types/deliveries_webhook_response.py
deleted file mode 100644
index 04cd32a1..00000000
--- a/src/whop_sdk/webhooks/types/deliveries_webhook_response.py
+++ /dev/null
@@ -1,33 +0,0 @@
-# This file was auto-generated by Fern from our API Definition.
-
-import typing
-
-import pydantic
-from ...core.pydantic_utilities import IS_PYDANTIC_V2, UniversalBaseModel
-from .deliveries_webhook_response_data_item import DeliveriesWebhookResponseDataItem
-from .deliveries_webhook_response_page_info import DeliveriesWebhookResponsePageInfo
-
-
-class DeliveriesWebhookResponse(UniversalBaseModel):
- """
- The connection type for WebhookLog.
- """
-
- data: typing.List[DeliveriesWebhookResponseDataItem] = pydantic.Field()
- """
- A list of nodes.
- """
-
- page_info: DeliveriesWebhookResponsePageInfo = pydantic.Field()
- """
- Information to aid in pagination.
- """
-
- if IS_PYDANTIC_V2:
- model_config: typing.ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(extra="allow", frozen=True) # type: ignore # Pydantic v2
- else:
-
- class Config:
- frozen = True
- smart_union = True
- extra = pydantic.Extra.allow
diff --git a/src/whop_sdk/webhooks/types/deliveries_webhook_response_data_item.py b/src/whop_sdk/webhooks/types/deliveries_webhook_response_data_item.py
deleted file mode 100644
index fbcefff3..00000000
--- a/src/whop_sdk/webhooks/types/deliveries_webhook_response_data_item.py
+++ /dev/null
@@ -1,52 +0,0 @@
-# This file was auto-generated by Fern from our API Definition.
-
-import datetime as dt
-import typing
-
-import pydantic
-from ...core.pydantic_utilities import IS_PYDANTIC_V2, UniversalBaseModel
-
-
-class DeliveriesWebhookResponseDataItem(UniversalBaseModel):
- """
- A webhook log entry containing the request and response details
- """
-
- request_body: typing.Dict[str, typing.Any] = pydantic.Field()
- """
- The request body sent to the webhook endpoint
- """
-
- resource_id: str = pydantic.Field()
- """
- The ID of the resource that triggered the webhook
- """
-
- response_body: typing.Dict[str, typing.Any] = pydantic.Field()
- """
- The response body received from the webhook endpoint
- """
-
- response_code: int = pydantic.Field()
- """
- The HTTP response code received from the webhook endpoint
- """
-
- sent_at: dt.datetime = pydantic.Field()
- """
- The timestamp when the webhook was sent
- """
-
- total_time: float = pydantic.Field()
- """
- The total time taken to send the webhook request in seconds
- """
-
- if IS_PYDANTIC_V2:
- model_config: typing.ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(extra="allow", frozen=True) # type: ignore # Pydantic v2
- else:
-
- class Config:
- frozen = True
- smart_union = True
- extra = pydantic.Extra.allow
diff --git a/src/whop_sdk/webhooks/types/deliveries_webhook_response_page_info.py b/src/whop_sdk/webhooks/types/deliveries_webhook_response_page_info.py
deleted file mode 100644
index 4a663593..00000000
--- a/src/whop_sdk/webhooks/types/deliveries_webhook_response_page_info.py
+++ /dev/null
@@ -1,31 +0,0 @@
-# This file was auto-generated by Fern from our API Definition.
-
-import typing
-
-import pydantic
-from ...core.pydantic_utilities import IS_PYDANTIC_V2, UniversalBaseModel
-
-
-class DeliveriesWebhookResponsePageInfo(UniversalBaseModel):
- """
- Information to aid in pagination.
- """
-
- end_cursor: typing.Optional[str] = pydantic.Field(default=None)
- """
- When paginating forwards, the cursor to continue.
- """
-
- has_next_page: bool = pydantic.Field()
- """
- When paginating forwards, are there more items?
- """
-
- if IS_PYDANTIC_V2:
- model_config: typing.ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(extra="allow", frozen=True) # type: ignore # Pydantic v2
- else:
-
- class Config:
- frozen = True
- smart_union = True
- extra = pydantic.Extra.allow
diff --git a/src/whop_sdk/webhooks/types/update_webhooks_request_events_item.py b/src/whop_sdk/webhooks/types/update_webhooks_request_events_item.py
index bdbdf518..8942dd9d 100644
--- a/src/whop_sdk/webhooks/types/update_webhooks_request_events_item.py
+++ b/src/whop_sdk/webhooks/types/update_webhooks_request_events_item.py
@@ -69,6 +69,8 @@
"shipment.updated",
"member.created",
"ad_campaign.payment_failed",
+ "ad_campaign.updated",
+ "ad.updated",
"chat.message.created",
"chat.reaction.created",
"payment.created",
From e4b197a92cd51c6d704cc3320e28adc9ba2d8a15 Mon Sep 17 00:00:00 2001
From: "fern-api[bot]" <115122769+fern-api[bot]@users.noreply.github.com>
Date: Tue, 8 Sep 2026 20:01:13 +0000
Subject: [PATCH 2/2] [fern-replay] advance lockfile
---
.fern/replay.lock | 8 +++++++-
1 file changed, 7 insertions(+), 1 deletion(-)
diff --git a/.fern/replay.lock b/.fern/replay.lock
index ff0de0f1..5e72dac6 100644
--- a/.fern/replay.lock
+++ b/.fern/replay.lock
@@ -84,5 +84,11 @@ generations:
cli_version: unknown
generator_versions:
fernapi/fern-python-sdk: 5.28.0
-current_generation: 07a0765014469286dd690afc59cee2c993661576
+ - commit_sha: 1c3c5e0568ef0ee38e0fe3fce9b931a2d4b7a2e5
+ tree_hash: 6c0a41c85a3c6131359917b83ed5078c924c63bb
+ timestamp: 2026-09-08T20:01:10.043Z
+ cli_version: unknown
+ generator_versions:
+ fernapi/fern-python-sdk: 5.28.0
+current_generation: 1c3c5e0568ef0ee38e0fe3fce9b931a2d4b7a2e5
patches: []