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
2 changes: 1 addition & 1 deletion API_VERSION
Original file line number Diff line number Diff line change
@@ -1 +1 @@
5a9ac40aabbc00a67ae2a186633fc8dd64b25c56
5a9ac40aabbc00a67ae2a186633fc8dd64b25c56
10 changes: 10 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,5 +1,9 @@
# Changelog

## 13.2.0 - 2025-11-05
* [#1662](https://github.com/stripe/stripe-python/pull/1662) Update generated code
* Add support for `capture_method` on `PaymentIntent.PaymentMethodOption.CardPresent`, `PaymentIntentConfirmParamsPaymentMethodOptionCardPresent`, `PaymentIntentCreateParamsPaymentMethodOptionCardPresent`, and `PaymentIntentModifyParamsPaymentMethodOptionCardPresent`

## 13.2.0b1 - 2025-10-29

This release changes the pinned API version to `2025-10-29.preview`.
Expand Down Expand Up @@ -36,6 +40,12 @@ This release changes the pinned API version to `2025-10-29.preview`.
* Add support for `last_seen_at` on `Terminal.Reader`
* Add support for new value `2025-10-29.clover` on enum `WebhookEndpointCreateParams.api_version`

## 13.1.2 - 2025-11-04
* [#1661](https://github.com/stripe/stripe-python/pull/1661) Add support for value `payment_record` to enum `InvoicePayment.payment.type`

## 13.1.1 - 2025-10-31
* [#1660](https://github.com/stripe/stripe-python/pull/1660) Fix `stripe-context` header not being included in paged list requests

## 13.1.1b1 - 2025-10-03
* [#1617](https://github.com/stripe/stripe-python/pull/1617) Update generated code for beta
* Add support for `last_seen_at` on `Terminal.Reader`
Expand Down
2 changes: 1 addition & 1 deletion OPENAPI_VERSION
Original file line number Diff line number Diff line change
@@ -1 +1 @@
v2103
v2103
2 changes: 2 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -275,6 +275,8 @@ Stripe has features in the [private preview phase](https://docs.stripe.com/relea

### Custom requests

> This feature is only available from version 11 of this SDK.

If you would like to send a request to an undocumented API (for example you are in a private beta), or if you prefer to bypass the method definitions in the library and specify your request details directly, you can use the `raw_request` method on `StripeClient`.

```python
Expand Down
2 changes: 1 addition & 1 deletion deps/test-requirements.txt
Original file line number Diff line number Diff line change
Expand Up @@ -14,4 +14,4 @@ anyio[trio] == 4.11.0; python_version >= "3.13"
pytest-mock >= 2.0.0
mock >= 4.0; python_version < "3.8"
pytest-xdist >= 1.31.0
pytest >= 6.0.0
pytest >= 6.0.0,<9.0.0
2 changes: 1 addition & 1 deletion stripe/_account.py
Original file line number Diff line number Diff line change
Expand Up @@ -1414,7 +1414,7 @@ class Invoices(StripeObject):
Literal["always", "never", "offer"]
]
"""
Whether payment methods should be saved when a payment is completed for a one-time invoices on a hosted invoice page.
Whether to save the payment method after a payment is completed for a one-time invoice or a subscription invoice when the customer already has a default payment method on the hosted invoice page.
"""

class Payments(StripeObject):
Expand Down
21 changes: 15 additions & 6 deletions stripe/_api_requestor.py
Original file line number Diff line number Diff line change
Expand Up @@ -45,7 +45,11 @@
StripeStreamResponse,
StripeStreamResponseAsync,
)
from stripe._request_options import RequestOptions, merge_options
from stripe._request_options import (
PERSISTENT_OPTIONS_KEYS,
RequestOptions,
merge_options,
)
from stripe._requestor_options import (
RequestorOptions,
_GlobalRequestorOptions,
Expand Down Expand Up @@ -124,12 +128,15 @@ def _get_http_client(self) -> HTTPClient:
return stripe.default_http_client
return client

def _replace_options(
def _new_requestor_with_options(
self, options: Optional[RequestOptions]
) -> "_APIRequestor":
"""
Returns a new _APIRequestor instance with the same HTTP client but a (potentially) updated set of options. Useful for ensuring the original isn't modified, but any options the original had are still used.
"""
options = options or {}
new_options = self._options.to_dict()
for key in ["api_key", "stripe_account", "stripe_version"]:
for key in PERSISTENT_OPTIONS_KEYS:
if key in options and options[key] is not None:
new_options[key] = options[key]
return _APIRequestor(
Expand Down Expand Up @@ -168,7 +175,9 @@ def _global_instance(cls):
def _global_with_options(
**params: Unpack[RequestOptions],
) -> "_APIRequestor":
return _APIRequestor._global_instance()._replace_options(params)
return _APIRequestor._global_instance()._new_requestor_with_options(
params
)

@classmethod
def _format_app_info(cls, info):
Expand All @@ -190,7 +199,7 @@ def request(
usage: Optional[List[str]] = None,
) -> "StripeObject":
api_mode = get_api_mode(url)
requestor = self._replace_options(options)
requestor = self._new_requestor_with_options(options)
rbody, rcode, rheaders = requestor.request_raw(
method.lower(),
url,
Expand Down Expand Up @@ -224,7 +233,7 @@ async def request_async(
usage: Optional[List[str]] = None,
) -> "StripeObject":
api_mode = get_api_mode(url)
requestor = self._replace_options(options)
requestor = self._new_requestor_with_options(options)
rbody, rcode, rheaders = await requestor.request_raw_async(
method.lower(),
url,
Expand Down
4 changes: 2 additions & 2 deletions stripe/_error_object.py
Original file line number Diff line number Diff line change
Expand Up @@ -39,7 +39,7 @@ def refresh_from(
values=values,
partial=partial,
last_response=last_response,
requestor=self._requestor._replace_options(
requestor=self._requestor._new_requestor_with_options(
{
"api_key": api_key,
"stripe_version": stripe_version,
Expand Down Expand Up @@ -102,7 +102,7 @@ def refresh_from(
values=values,
partial=partial,
last_response=last_response,
requestor=self._requestor._replace_options(
requestor=self._requestor._new_requestor_with_options(
{
"api_key": api_key,
"stripe_version": stripe_version,
Expand Down
2 changes: 1 addition & 1 deletion stripe/_invoice.py
Original file line number Diff line number Diff line change
Expand Up @@ -1406,7 +1406,7 @@ class TaxRateDetails(StripeObject):
* `subscription_cycle`: A subscription advanced into a new period.
* `subscription_threshold`: A subscription reached a billing threshold.
* `subscription_update`: A subscription was updated.
* `upcoming`: Reserved for simulated invoices, per the upcoming invoice endpoint.
* `upcoming`: Reserved for upcoming invoices created through the Create Preview Invoice API or when an `invoice.upcoming` event is generated for an upcoming invoice on a subscription.
"""
collection_method: Literal["charge_automatically", "send_invoice"]
"""
Expand Down
2 changes: 1 addition & 1 deletion stripe/_invoice_payment.py
Original file line number Diff line number Diff line change
Expand Up @@ -47,7 +47,7 @@ class Payment(StripeObject):
"""
ID of the PaymentRecord associated with this payment when `type` is `payment_record`.
"""
type: Literal["charge", "payment_intent"]
type: Literal["charge", "payment_intent", "payment_record"]
"""
Type of payment object associated with this invoice payment.
"""
Expand Down
4 changes: 4 additions & 0 deletions stripe/_payment_intent.py
Original file line number Diff line number Diff line change
Expand Up @@ -2248,6 +2248,10 @@ class Routing(StripeObject):
Requested routing priority
"""

capture_method: Optional[Literal["manual", "manual_preferred"]]
"""
Controls when the funds will be captured from the customer's account.
"""
request_extended_authorization: Optional[bool]
"""
Request ability to capture this payment beyond the standard [authorization validity window](https://stripe.com/docs/terminal/features/extended-authorizations#authorization-validity)
Expand Down
12 changes: 12 additions & 0 deletions stripe/_request_options.py
Original file line number Diff line number Diff line change
Expand Up @@ -54,6 +54,18 @@ def merge_options(
}


PERSISTENT_OPTIONS_KEYS = {
"api_key",
"stripe_version",
"stripe_account",
"stripe_context",
}
"""
These are the keys in RequestOptions that should persist across requests made
by the same requestor.
"""


def extract_options_from_dict(
d: Optional[Mapping[str, Any]],
) -> Tuple[RequestOptions, Dict[str, Any]]:
Expand Down
13 changes: 9 additions & 4 deletions stripe/_stripe_object.py
Original file line number Diff line number Diff line change
Expand Up @@ -27,7 +27,10 @@
StripeStreamResponseAsync,
)
from stripe._encode import _encode_datetime # pyright: ignore
from stripe._request_options import extract_options_from_dict
from stripe._request_options import (
PERSISTENT_OPTIONS_KEYS,
extract_options_from_dict,
)
from stripe._api_mode import ApiMode
from stripe._base_address import BaseAddress

Expand Down Expand Up @@ -152,8 +155,10 @@ def update( # pyright: ignore
if not TYPE_CHECKING:

def __setattr__(self, k, v):
if k in {"api_key", "stripe_account", "stripe_version"}:
self._requestor = self._requestor._replace_options({k: v})
if k in PERSISTENT_OPTIONS_KEYS:
self._requestor = self._requestor._new_requestor_with_options(
{k: v}
)
return None

if k[0] == "_" or k in self.__dict__:
Expand Down Expand Up @@ -303,7 +308,7 @@ def refresh_from(
values=values,
partial=partial,
last_response=last_response,
requestor=self._requestor._replace_options( # pyright: ignore[reportPrivateUsage]
requestor=self._requestor._new_requestor_with_options( # pyright: ignore[reportPrivateUsage]
{
"api_key": api_key,
"stripe_version": stripe_version,
Expand Down
2 changes: 1 addition & 1 deletion stripe/params/_account_create_params.py
Original file line number Diff line number Diff line change
Expand Up @@ -2137,7 +2137,7 @@ class AccountCreateParamsSettingsInvoices(TypedDict):
Literal["always", "never", "offer"]
]
"""
Whether payment methods should be saved when a payment is completed for a one-time invoices on a hosted invoice page.
Whether to save the payment method after a payment is completed for a one-time invoice or a subscription invoice when the customer already has a default payment method on the hosted invoice page.
"""


Expand Down
2 changes: 1 addition & 1 deletion stripe/params/_account_update_params.py
Original file line number Diff line number Diff line change
Expand Up @@ -2053,7 +2053,7 @@ class AccountUpdateParamsSettingsInvoices(TypedDict):
Literal["always", "never", "offer"]
]
"""
Whether payment methods should be saved when a payment is completed for a one-time invoices on a hosted invoice page.
Whether to save the payment method after a payment is completed for a one-time invoice or a subscription invoice when the customer already has a default payment method on the hosted invoice page.
"""


Expand Down
2 changes: 1 addition & 1 deletion stripe/params/_customer_session_create_params.py
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@
class CustomerSessionCreateParams(RequestOptions):
components: "CustomerSessionCreateParamsComponents"
"""
Configuration for each component. Exactly 1 component must be enabled.
Configuration for each component. At least 1 component must be enabled.
"""
customer: NotRequired[str]
"""
Expand Down
8 changes: 8 additions & 0 deletions stripe/params/_payment_intent_confirm_params.py
Original file line number Diff line number Diff line change
Expand Up @@ -3018,6 +3018,14 @@ class PaymentIntentConfirmParamsPaymentMethodOptionsCardThreeDSecureNetworkOptio


class PaymentIntentConfirmParamsPaymentMethodOptionsCardPresent(TypedDict):
capture_method: NotRequired[Literal["manual", "manual_preferred"]]
"""
Controls when the funds are captured from the customer's account.

If provided, this parameter overrides the behavior of the top-level [capture_method](https://docs.stripe.com/api/payment_intents/update#update_payment_intent-capture_method) for this payment method type when finalizing the payment with this payment method type.

If `capture_method` is already set on the PaymentIntent, providing an empty value for this parameter unsets the stored value for this payment method type.
"""
request_extended_authorization: NotRequired[bool]
"""
Request ability to capture this payment beyond the standard [authorization validity window](https://stripe.com/docs/terminal/features/extended-authorizations#authorization-validity)
Expand Down
8 changes: 8 additions & 0 deletions stripe/params/_payment_intent_create_params.py
Original file line number Diff line number Diff line change
Expand Up @@ -3145,6 +3145,14 @@ class PaymentIntentCreateParamsPaymentMethodOptionsCardThreeDSecureNetworkOption


class PaymentIntentCreateParamsPaymentMethodOptionsCardPresent(TypedDict):
capture_method: NotRequired[Literal["manual", "manual_preferred"]]
"""
Controls when the funds are captured from the customer's account.

If provided, this parameter overrides the behavior of the top-level [capture_method](https://docs.stripe.com/api/payment_intents/update#update_payment_intent-capture_method) for this payment method type when finalizing the payment with this payment method type.

If `capture_method` is already set on the PaymentIntent, providing an empty value for this parameter unsets the stored value for this payment method type.
"""
request_extended_authorization: NotRequired[bool]
"""
Request ability to capture this payment beyond the standard [authorization validity window](https://stripe.com/docs/terminal/features/extended-authorizations#authorization-validity)
Expand Down
8 changes: 8 additions & 0 deletions stripe/params/_payment_intent_modify_params.py
Original file line number Diff line number Diff line change
Expand Up @@ -3003,6 +3003,14 @@ class PaymentIntentModifyParamsPaymentMethodOptionsCardThreeDSecureNetworkOption


class PaymentIntentModifyParamsPaymentMethodOptionsCardPresent(TypedDict):
capture_method: NotRequired[Literal["manual", "manual_preferred"]]
"""
Controls when the funds are captured from the customer's account.

If provided, this parameter overrides the behavior of the top-level [capture_method](https://docs.stripe.com/api/payment_intents/update#update_payment_intent-capture_method) for this payment method type when finalizing the payment with this payment method type.

If `capture_method` is already set on the PaymentIntent, providing an empty value for this parameter unsets the stored value for this payment method type.
"""
request_extended_authorization: NotRequired[bool]
"""
Request ability to capture this payment beyond the standard [authorization validity window](https://stripe.com/docs/terminal/features/extended-authorizations#authorization-validity)
Expand Down
8 changes: 8 additions & 0 deletions stripe/params/_payment_intent_update_params.py
Original file line number Diff line number Diff line change
Expand Up @@ -3002,6 +3002,14 @@ class PaymentIntentUpdateParamsPaymentMethodOptionsCardThreeDSecureNetworkOption


class PaymentIntentUpdateParamsPaymentMethodOptionsCardPresent(TypedDict):
capture_method: NotRequired[Literal["manual", "manual_preferred"]]
"""
Controls when the funds are captured from the customer's account.

If provided, this parameter overrides the behavior of the top-level [capture_method](https://docs.stripe.com/api/payment_intents/update#update_payment_intent-capture_method) for this payment method type when finalizing the payment with this payment method type.

If `capture_method` is already set on the PaymentIntent, providing an empty value for this parameter unsets the stored value for this payment method type.
"""
request_extended_authorization: NotRequired[bool]
"""
Request ability to capture this payment beyond the standard [authorization validity window](https://stripe.com/docs/terminal/features/extended-authorizations#authorization-validity)
Expand Down
18 changes: 9 additions & 9 deletions stripe/params/terminal/_configuration_create_params.py
Original file line number Diff line number Diff line change
Expand Up @@ -8,11 +8,11 @@
class ConfigurationCreateParams(RequestOptions):
bbpos_wisepad3: NotRequired["ConfigurationCreateParamsBbposWisepad3"]
"""
An object containing device type specific settings for BBPOS WisePad 3 readers
An object containing device type specific settings for BBPOS WisePad 3 readers.
"""
bbpos_wisepos_e: NotRequired["ConfigurationCreateParamsBbposWiseposE"]
"""
An object containing device type specific settings for BBPOS WisePOS E readers
An object containing device type specific settings for BBPOS WisePOS E readers.
"""
expand: NotRequired[List[str]]
"""
Expand All @@ -34,19 +34,19 @@ class ConfigurationCreateParams(RequestOptions):
"""
reboot_window: NotRequired["ConfigurationCreateParamsRebootWindow"]
"""
Reboot time settings for readers that support customized reboot time configuration.
Reboot time settings for readers. that support customized reboot time configuration.
"""
stripe_s700: NotRequired["ConfigurationCreateParamsStripeS700"]
"""
An object containing device type specific settings for Stripe S700 readers
An object containing device type specific settings for Stripe S700 readers.
"""
tipping: NotRequired["Literal['']|ConfigurationCreateParamsTipping"]
"""
Tipping configurations for readers supporting on-reader tips
Tipping configurations for readers. supporting on-reader tips
"""
verifone_p400: NotRequired["ConfigurationCreateParamsVerifoneP400"]
"""
An object containing device type specific settings for Verifone P400 readers
An object containing device type specific settings for Verifone P400 readers.
"""
wifi: NotRequired["Literal['']|ConfigurationCreateParamsWifi"]
"""
Expand All @@ -57,7 +57,7 @@ class ConfigurationCreateParams(RequestOptions):
class ConfigurationCreateParamsBbposWisepad3(TypedDict):
splashscreen: NotRequired["Literal['']|str"]
"""
A File ID representing an image you would like displayed on the reader.
A File ID representing an image you want to display on the reader.
"""


Expand Down Expand Up @@ -96,7 +96,7 @@ class ConfigurationCreateParamsRebootWindow(TypedDict):
class ConfigurationCreateParamsStripeS700(TypedDict):
splashscreen: NotRequired["Literal['']|str"]
"""
A File ID representing an image you would like displayed on the reader.
A File ID representing an image you want to display on the reader.
"""


Expand Down Expand Up @@ -524,7 +524,7 @@ class ConfigurationCreateParamsTippingUsd(TypedDict):
class ConfigurationCreateParamsVerifoneP400(TypedDict):
splashscreen: NotRequired["Literal['']|str"]
"""
A File ID representing an image you would like displayed on the reader.
A File ID representing an image you want to display on the reader.
"""


Expand Down
Loading