Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
11 changes: 11 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,17 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),

Check our main [developer changelog](https://developer.paddle.com/?utm_source=dx&utm_medium=paddle-python-sdk) for information about changes to the Paddle Billing platform, the Paddle API, and other developer tools.

## Unreleased

### Added

- Added `paypal` to transaction payment `method_details`, showing the PayPal account used for a payment attempt. See [related changelog](https://developer.paddle.com/changelog/2026/paypal-transaction-payments?utm_source=dx&utm_medium=paddle-python-sdk)
- Added `view_subscription` to subscription `management_urls` and customer portal session subscription `urls`. See [related changelog](https://developer.paddle.com/changelog/2026/view-subscription-customer-portal-link?utm_source=dx&utm_medium=paddle-python-sdk)
- Added `blocked_by_policy`, `declined_not_retryable`, `preferred_network_not_supported`, and `prepaid_card_not_supported` to `ErrorCode`
- Added `eu_withdrawal` to `SubscriptionHistoryReason`
- Added `ids` filter to list checkout domains operation
- Added `exposed_at` to api_key events

## 1.15.0 - 2026-07-28

### Added
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,11 +8,13 @@ class CustomerPortalSessionSubscriptionUrl:
id: str
cancel_subscription: str
update_subscription_payment_method: str
view_subscription: str | None = None

@staticmethod
def from_dict(data: dict[str, Any]) -> CustomerPortalSessionSubscriptionUrl:
return CustomerPortalSessionSubscriptionUrl(
id=data["id"],
cancel_subscription=data["cancel_subscription"],
update_subscription_payment_method=data["update_subscription_payment_method"],
view_subscription=data.get("view_subscription"),
)
4 changes: 4 additions & 0 deletions paddle_billing/Entities/Shared/ErrorCode.py
Original file line number Diff line number Diff line change
Expand Up @@ -5,15 +5,19 @@ class ErrorCode(PaddleStrEnum, metaclass=PaddleStrEnumMeta):
AlreadyCanceled: "ErrorCode" = "already_canceled"
AlreadyRefunded: "ErrorCode" = "already_refunded"
AuthenticationFailed: "ErrorCode" = "authentication_failed"
BlockedByPolicy: "ErrorCode" = "blocked_by_policy"
BlockedCard: "ErrorCode" = "blocked_card"
Canceled: "ErrorCode" = "canceled"
Declined: "ErrorCode" = "declined"
DeclinedNotRetryable: "ErrorCode" = "declined_not_retryable"
ExpiredCard: "ErrorCode" = "expired_card"
Fraud: "ErrorCode" = "fraud"
InvalidAmount: "ErrorCode" = "invalid_amount"
InvalidPaymentDetails: "ErrorCode" = "invalid_payment_details"
IssuerUnavailable: "ErrorCode" = "issuer_unavailable"
NotEnoughBalance: "ErrorCode" = "not_enough_balance"
PreferredNetworkNotSupported: "ErrorCode" = "preferred_network_not_supported"
PrepaidCardNotSupported: "ErrorCode" = "prepaid_card_not_supported"
PspError: "ErrorCode" = "psp_error"
RedactedPaymentMethod: "ErrorCode" = "redacted_payment_method"
SystemError: "ErrorCode" = "system_error"
Expand Down
3 changes: 3 additions & 0 deletions paddle_billing/Entities/Shared/MethodDetails.py
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@
from paddle_billing.Entities.Shared.PaymentMethodType import PaymentMethodType
from paddle_billing.Entities.Shared.PaymentMethodUnderlyingDetails import PaymentMethodUnderlyingDetails
from paddle_billing.Entities.Shared.SouthKoreaLocalCard import SouthKoreaLocalCard
from paddle_billing.Entities.Shared.TransactionPaypal import TransactionPaypal


@dataclass
Expand All @@ -14,6 +15,7 @@ class MethodDetails:
card: Card | None
underlying_details: PaymentMethodUnderlyingDetails | None # deprecated
south_korea_local_card: SouthKoreaLocalCard | None
paypal: TransactionPaypal | None = None

@staticmethod
def from_dict(data: dict[str, Any]) -> MethodDetails:
Expand All @@ -30,4 +32,5 @@ def from_dict(data: dict[str, Any]) -> MethodDetails:
if data.get("south_korea_local_card")
else None
),
TransactionPaypal.from_dict(data["paypal"]) if data.get("paypal") else None,
)
16 changes: 16 additions & 0 deletions paddle_billing/Entities/Shared/TransactionPaypal.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
from __future__ import annotations
from dataclasses import dataclass
from typing import Any


@dataclass
class TransactionPaypal:
email: str
reference: str | None

@staticmethod
def from_dict(data: dict[str, Any]) -> TransactionPaypal:
return TransactionPaypal(
email=data["email"],
reference=data.get("reference"),
)
1 change: 1 addition & 0 deletions paddle_billing/Entities/Shared/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -55,6 +55,7 @@
from paddle_billing.Entities.Shared.TimePeriod import TimePeriod
from paddle_billing.Entities.Shared.Totals import Totals
from paddle_billing.Entities.Shared.TransactionOrigin import TransactionOrigin
from paddle_billing.Entities.Shared.TransactionPaypal import TransactionPaypal
from paddle_billing.Entities.Shared.TransactionPaymentAttempt import TransactionPaymentAttempt
from paddle_billing.Entities.Shared.TransactionPayoutTotals import TransactionPayoutTotals
from paddle_billing.Entities.Shared.TransactionPayoutTotalsAdjusted import TransactionPayoutTotalsAdjusted
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,3 +8,4 @@ class SubscriptionHistoryReason(PaddleStrEnum, metaclass=PaddleStrEnumMeta):
SellerRequest: "SubscriptionHistoryReason" = "seller_request"
CustomerRequest: "SubscriptionHistoryReason" = "customer_request"
Chargeback: "SubscriptionHistoryReason" = "chargeback"
EuWithdrawal: "SubscriptionHistoryReason" = "eu_withdrawal"
Original file line number Diff line number Diff line change
Expand Up @@ -7,10 +7,12 @@
class SubscriptionManagementUrls:
update_payment_method: str | None
cancel: str
view_subscription: str | None = None

@staticmethod
def from_dict(data: dict[str, Any]) -> SubscriptionManagementUrls:
return SubscriptionManagementUrls(
update_payment_method=data.get("update_payment_method"),
cancel=data["cancel"],
view_subscription=data.get("view_subscription"),
)
2 changes: 2 additions & 0 deletions paddle_billing/Notifications/Entities/ApiKey.py
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,7 @@ class ApiKey(Entity):
created_at: datetime
updated_at: datetime
rotatable: bool | None = None
exposed_at: datetime | None = None

@staticmethod
def from_dict(data: dict[str, Any]) -> ApiKey:
Expand All @@ -35,4 +36,5 @@ def from_dict(data: dict[str, Any]) -> ApiKey:
created_at=datetime.fromisoformat(data["created_at"]),
updated_at=datetime.fromisoformat(data["updated_at"]),
rotatable=data.get("rotatable"),
exposed_at=datetime.fromisoformat(data["exposed_at"]) if data.get("exposed_at") else None,
)
4 changes: 4 additions & 0 deletions paddle_billing/Notifications/Entities/Shared/ErrorCode.py
Original file line number Diff line number Diff line change
Expand Up @@ -5,15 +5,19 @@ class ErrorCode(PaddleStrEnum, metaclass=PaddleStrEnumMeta):
AlreadyCanceled: "ErrorCode" = "already_canceled"
AlreadyRefunded: "ErrorCode" = "already_refunded"
AuthenticationFailed: "ErrorCode" = "authentication_failed"
BlockedByPolicy: "ErrorCode" = "blocked_by_policy"
BlockedCard: "ErrorCode" = "blocked_card"
Canceled: "ErrorCode" = "canceled"
Declined: "ErrorCode" = "declined"
DeclinedNotRetryable: "ErrorCode" = "declined_not_retryable"
ExpiredCard: "ErrorCode" = "expired_card"
Fraud: "ErrorCode" = "fraud"
InvalidAmount: "ErrorCode" = "invalid_amount"
InvalidPaymentDetails: "ErrorCode" = "invalid_payment_details"
IssuerUnavailable: "ErrorCode" = "issuer_unavailable"
NotEnoughBalance: "ErrorCode" = "not_enough_balance"
PreferredNetworkNotSupported: "ErrorCode" = "preferred_network_not_supported"
PrepaidCardNotSupported: "ErrorCode" = "prepaid_card_not_supported"
PspError: "ErrorCode" = "psp_error"
RedactedPaymentMethod: "ErrorCode" = "redacted_payment_method"
SystemError: "ErrorCode" = "system_error"
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@
from paddle_billing.Notifications.Entities.Shared.PaymentMethodType import PaymentMethodType
from paddle_billing.Notifications.Entities.Shared.PaymentMethodUnderlyingDetails import PaymentMethodUnderlyingDetails
from paddle_billing.Notifications.Entities.Shared.SouthKoreaLocalCard import SouthKoreaLocalCard
from paddle_billing.Notifications.Entities.Shared.TransactionPaypal import TransactionPaypal


@dataclass
Expand All @@ -14,6 +15,7 @@ class MethodDetails:
card: Card | None
underlying_details: PaymentMethodUnderlyingDetails | None # deprecated
south_korea_local_card: SouthKoreaLocalCard | None
paypal: TransactionPaypal | None = None

@staticmethod
def from_dict(data: dict[str, Any]) -> MethodDetails:
Expand All @@ -30,4 +32,5 @@ def from_dict(data: dict[str, Any]) -> MethodDetails:
if data.get("south_korea_local_card")
else None
),
TransactionPaypal.from_dict(data["paypal"]) if data.get("paypal") else None,
)
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
from __future__ import annotations
from dataclasses import dataclass
from typing import Any


@dataclass
class TransactionPaypal:
email: str
reference: str | None

@staticmethod
def from_dict(data: dict[str, Any]) -> TransactionPaypal:
return TransactionPaypal(
email=data["email"],
reference=data.get("reference"),
)
1 change: 1 addition & 0 deletions paddle_billing/Notifications/Entities/Shared/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -47,6 +47,7 @@
from paddle_billing.Notifications.Entities.Shared.TimePeriod import TimePeriod
from paddle_billing.Notifications.Entities.Shared.Totals import Totals
from paddle_billing.Notifications.Entities.Shared.TransactionOrigin import TransactionOrigin
from paddle_billing.Notifications.Entities.Shared.TransactionPaypal import TransactionPaypal
from paddle_billing.Notifications.Entities.Shared.TransactionPaymentAttempt import TransactionPaymentAttempt
from paddle_billing.Notifications.Entities.Shared.TransactionPayoutTotals import TransactionPayoutTotals
from paddle_billing.Notifications.Entities.Shared.TransactionPayoutTotalsAdjusted import TransactionPayoutTotalsAdjusted
Expand Down
6 changes: 6 additions & 0 deletions paddle_billing/Notifications/Entities/Simulations/ApiKey.py
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,7 @@ class ApiKey(SimulationEntity):
created_at: datetime | Undefined = Undefined()
updated_at: datetime | Undefined = Undefined()
rotatable: bool | None | Undefined = Undefined()
exposed_at: datetime | None | Undefined = Undefined()

@staticmethod
def from_dict(data: dict[str, Any]) -> ApiKey:
Expand Down Expand Up @@ -48,4 +49,9 @@ def from_dict(data: dict[str, Any]) -> ApiKey:
created_at=datetime.fromisoformat(data["created_at"]) if data.get("created_at") else Undefined(),
updated_at=datetime.fromisoformat(data["updated_at"]) if data.get("updated_at") else Undefined(),
rotatable=data.get("rotatable", Undefined()),
exposed_at=(
datetime.fromisoformat(data["exposed_at"])
if data.get("exposed_at")
else data.get("exposed_at", Undefined())
),
)
Original file line number Diff line number Diff line change
Expand Up @@ -14,13 +14,16 @@ def __init__(
pager: Pager | None = None,
domain: str | None = None,
statuses: list[CheckoutDomainStatus] | None = None,
ids: list[str] | None = None,
):
self.pager = pager
self.domain = domain
self.statuses = statuses if statuses is not None else []
self.ids = ids if ids is not None else []

# Validation
for field_name, field_value, field_type in [
("ids", self.ids, str),
("statuses", self.statuses, CheckoutDomainStatus),
]:
invalid_items = [item for item in field_value if not isinstance(item, field_type)]
Expand All @@ -33,6 +36,8 @@ def get_parameters(self) -> dict[str, str]:
parameters = {}
if self.pager:
parameters.update(self.pager.get_parameters())
if self.ids:
parameters["id"] = ",".join(self.ids)
if self.domain:
parameters["domain"] = self.domain
if self.statuses:
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,11 @@ class TestCheckoutDomainsClient:
"/checkout-domains?after=chedom_01hv8h6jj90jjz0d71m6hj4r9z&order_by=id[asc]&per_page=50",
),
(ListCheckoutDomains(domain="example.com"), 200, "/checkout-domains?domain=example.com"),
(
ListCheckoutDomains(ids=["chedom_01hv8h6jj90jjz0d71m6hj4r9z", "chedom_01hv8h6jj90jjz0d71m6hj4r9y"]),
200,
"/checkout-domains?id=chedom_01hv8h6jj90jjz0d71m6hj4r9z,chedom_01hv8h6jj90jjz0d71m6hj4r9y",
),
(
ListCheckoutDomains(statuses=[CheckoutDomainStatus.Approved]),
200,
Expand All @@ -42,6 +47,7 @@ class TestCheckoutDomainsClient:
"List checkout domains with default pagination",
"List paginated checkout domains after specified id",
"List checkout domains filtered by domain",
"List checkout domains filtered by ids",
"List checkout domains filtered by status",
"List checkout domains filtered by multiple statuses",
],
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -10,12 +10,14 @@
{
"id": "sub_01h04vsc0qhwtsbsxh3422wjs4",
"cancel_subscription": "https://customer-portal.paddle.com/cpl_01j7zbyqs3vah3aafp4jf62qaw?action=cancel_subscription&subscription_id=sub_01h04vsc0qhwtsbsxh3422wjs4&token=pga_eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiJjdG1fMDFncm5uNHp0YTVhMW1mMDJqanplN3kyeXMiLCJuYW1lIjoiSm9obiBEb2UiLCJpYXQiOjE3Mjc2NzkyMzh9._oO12IejzdKmyKTwb7BLjmiILkx4_cSyGjXraOBUI_g",
"update_subscription_payment_method": "https://customer-portal.paddle.com/cpl_01j7zbyqs3vah3aafp4jf62qaw?action=update_subscription_payment_method&subscription_id=sub_01h04vsc0qhwtsbsxh3422wjs4&token=pga_eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiJjdG1fMDFncm5uNHp0YTVhMW1mMDJqanplN3kyeXMiLCJuYW1lIjoiSm9obiBEb2UiLCJpYXQiOjE3Mjc2NzkyMzh9._oO12IejzdKmyKTwb7BLjmiILkx4_cSyGjXraOBUI_g"
"update_subscription_payment_method": "https://customer-portal.paddle.com/cpl_01j7zbyqs3vah3aafp4jf62qaw?action=update_subscription_payment_method&subscription_id=sub_01h04vsc0qhwtsbsxh3422wjs4&token=pga_eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiJjdG1fMDFncm5uNHp0YTVhMW1mMDJqanplN3kyeXMiLCJuYW1lIjoiSm9obiBEb2UiLCJpYXQiOjE3Mjc2NzkyMzh9._oO12IejzdKmyKTwb7BLjmiILkx4_cSyGjXraOBUI_g",
"view_subscription": "https://customer-portal.paddle.com/cpl_01j7zbyqs3vah3aafp4jf62qaw?action=view_subscription&subscription_id=sub_01h04vsc0qhwtsbsxh3422wjs4&token=pga_eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiJjdG1fMDFncm5uNHp0YTVhMW1mMDJqanplN3kyeXMiLCJuYW1lIjoiSm9obiBEb2UiLCJpYXQiOjE3Mjc2NzkyMzh9._oO12IejzdKmyKTwb7BLjmiILkx4_cSyGjXraOBUI_g"
},
{
"id": "sub_02h04vsc0qhwtsbsxh3422wjs4",
"cancel_subscription": "https://customer-portal.paddle.com/cpl_01j7zbyqs3vah3aafp4jf62qaw?action=cancel_subscription&subscription_id=sub_02h04vsc0qhwtsbsxh3422wjs4&token=pga_eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiJjdG1fMDFncm5uNHp0YTVhMW1mMDJqanplN3kyeXMiLCJuYW1lIjoiSm9obiBEb2UiLCJpYXQiOjE3Mjc2NzkyMzh9._oO12IejzdKmyKTwb7BLjmiILkx4_cSyGjXraOBUI_g",
"update_subscription_payment_method": "https://customer-portal.paddle.com/cpl_01j7zbyqs3vah3aafp4jf62qaw?action=update_subscription_payment_method&subscription_id=sub_02h04vsc0qhwtsbsxh3422wjs4&token=pga_eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiJjdG1fMDFncm5uNHp0YTVhMW1mMDJqanplN3kyeXMiLCJuYW1lIjoiSm9obiBEb2UiLCJpYXQiOjE3Mjc2NzkyMzh9._oO12IejzdKmyKTwb7BLjmiILkx4_cSyGjXraOBUI_g"
"update_subscription_payment_method": "https://customer-portal.paddle.com/cpl_01j7zbyqs3vah3aafp4jf62qaw?action=update_subscription_payment_method&subscription_id=sub_02h04vsc0qhwtsbsxh3422wjs4&token=pga_eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiJjdG1fMDFncm5uNHp0YTVhMW1mMDJqanplN3kyeXMiLCJuYW1lIjoiSm9obiBEb2UiLCJpYXQiOjE3Mjc2NzkyMzh9._oO12IejzdKmyKTwb7BLjmiILkx4_cSyGjXraOBUI_g",
"view_subscription": "https://customer-portal.paddle.com/cpl_01j7zbyqs3vah3aafp4jf62qaw?action=view_subscription&subscription_id=sub_02h04vsc0qhwtsbsxh3422wjs4&token=pga_eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiJjdG1fMDFncm5uNHp0YTVhMW1mMDJqanplN3kyeXMiLCJuYW1lIjoiSm9obiBEb2UiLCJpYXQiOjE3Mjc2NzkyMzh9._oO12IejzdKmyKTwb7BLjmiILkx4_cSyGjXraOBUI_g"
}
]
},
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,8 @@
{
"id": "sub_01h04vsc0qhwtsbsxh3422wjs4",
"cancel_subscription": "https://customer-portal.paddle.com/cpl_01j7zbyqs3vah3aafp4jf62qaw?action=cancel_subscription&subscription_id=sub_01h04vsc0qhwtsbsxh3422wjs4&token=pga_eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiJjdG1fMDFncm5uNHp0YTVhMW1mMDJqanplN3kyeXMiLCJuYW1lIjoiSm9obiBEb2UiLCJpYXQiOjE3Mjc2NzkyMzh9._oO12IejzdKmyKTwb7BLjmiILkx4_cSyGjXraOBUI_g",
"update_subscription_payment_method": "https://customer-portal.paddle.com/cpl_01j7zbyqs3vah3aafp4jf62qaw?action=update_subscription_payment_method&subscription_id=sub_01h04vsc0qhwtsbsxh3422wjs4&token=pga_eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiJjdG1fMDFncm5uNHp0YTVhMW1mMDJqanplN3kyeXMiLCJuYW1lIjoiSm9obiBEb2UiLCJpYXQiOjE3Mjc2NzkyMzh9._oO12IejzdKmyKTwb7BLjmiILkx4_cSyGjXraOBUI_g"
"update_subscription_payment_method": "https://customer-portal.paddle.com/cpl_01j7zbyqs3vah3aafp4jf62qaw?action=update_subscription_payment_method&subscription_id=sub_01h04vsc0qhwtsbsxh3422wjs4&token=pga_eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiJjdG1fMDFncm5uNHp0YTVhMW1mMDJqanplN3kyeXMiLCJuYW1lIjoiSm9obiBEb2UiLCJpYXQiOjE3Mjc2NzkyMzh9._oO12IejzdKmyKTwb7BLjmiILkx4_cSyGjXraOBUI_g",
"view_subscription": "https://customer-portal.paddle.com/cpl_01j7zbyqs3vah3aafp4jf62qaw?action=view_subscription&subscription_id=sub_01h04vsc0qhwtsbsxh3422wjs4&token=pga_eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiJjdG1fMDFncm5uNHp0YTVhMW1mMDJqanplN3kyeXMiLCJuYW1lIjoiSm9obiBEb2UiLCJpYXQiOjE3Mjc2NzkyMzh9._oO12IejzdKmyKTwb7BLjmiILkx4_cSyGjXraOBUI_g"
}
]
},
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -129,6 +129,10 @@ def test_create_returns_expected_response(
subscription1.update_subscription_payment_method
== "https://customer-portal.paddle.com/cpl_01j7zbyqs3vah3aafp4jf62qaw?action=update_subscription_payment_method&subscription_id=sub_01h04vsc0qhwtsbsxh3422wjs4&token=pga_eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiJjdG1fMDFncm5uNHp0YTVhMW1mMDJqanplN3kyeXMiLCJuYW1lIjoiSm9obiBEb2UiLCJpYXQiOjE3Mjc2NzkyMzh9._oO12IejzdKmyKTwb7BLjmiILkx4_cSyGjXraOBUI_g"
)
assert (
subscription1.view_subscription
== "https://customer-portal.paddle.com/cpl_01j7zbyqs3vah3aafp4jf62qaw?action=view_subscription&subscription_id=sub_01h04vsc0qhwtsbsxh3422wjs4&token=pga_eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiJjdG1fMDFncm5uNHp0YTVhMW1mMDJqanplN3kyeXMiLCJuYW1lIjoiSm9obiBEb2UiLCJpYXQiOjE3Mjc2NzkyMzh9._oO12IejzdKmyKTwb7BLjmiILkx4_cSyGjXraOBUI_g"
)

subscription2 = urls.subscriptions[1]
assert isinstance(subscription2, CustomerPortalSessionSubscriptionUrl)
Expand All @@ -141,3 +145,7 @@ def test_create_returns_expected_response(
subscription2.update_subscription_payment_method
== "https://customer-portal.paddle.com/cpl_01j7zbyqs3vah3aafp4jf62qaw?action=update_subscription_payment_method&subscription_id=sub_02h04vsc0qhwtsbsxh3422wjs4&token=pga_eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiJjdG1fMDFncm5uNHp0YTVhMW1mMDJqanplN3kyeXMiLCJuYW1lIjoiSm9obiBEb2UiLCJpYXQiOjE3Mjc2NzkyMzh9._oO12IejzdKmyKTwb7BLjmiILkx4_cSyGjXraOBUI_g"
)
assert (
subscription2.view_subscription
== "https://customer-portal.paddle.com/cpl_01j7zbyqs3vah3aafp4jf62qaw?action=view_subscription&subscription_id=sub_02h04vsc0qhwtsbsxh3422wjs4&token=pga_eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiJjdG1fMDFncm5uNHp0YTVhMW1mMDJqanplN3kyeXMiLCJuYW1lIjoiSm9obiBEb2UiLCJpYXQiOjE3Mjc2NzkyMzh9._oO12IejzdKmyKTwb7BLjmiILkx4_cSyGjXraOBUI_g"
)
Loading
Loading