diff --git a/.speakeasy/gen.lock b/.speakeasy/gen.lock
index b50b26ae..1f8441e3 100644
--- a/.speakeasy/gen.lock
+++ b/.speakeasy/gen.lock
@@ -1,19 +1,19 @@
lockVersion: 2.0.0
id: 833c6a67-4a4a-4ef1-ba24-165a29264e4a
management:
- docChecksum: 9faf39793edec13a55a217705a2a6fd9
+ docChecksum: 4fdb818a59991531ca2894adabab5124
docVersion: 1.0.0
- speakeasyVersion: 1.778.0
- generationVersion: 2.904.2
- releaseVersion: 2.1.10
- configChecksum: cb5bfdcdb4073015499b550983b99c6d
+ speakeasyVersion: 1.780.0
+ generationVersion: 2.906.0
+ releaseVersion: 2.1.11
+ configChecksum: a4b2b1d859362c5d0ba2efed3fa1da20
repoURL: https://github.com/gr4vy/gr4vy-python.git
installationURL: https://github.com/gr4vy/gr4vy-python.git
published: true
persistentEdits:
- generation_id: e2a5a013-c423-4648-ae85-16bdd9395ccc
- pristine_commit_hash: 9c6ca3bec58bb624b861e6639006e566e364f6f7
- pristine_tree_hash: c4d370e9a1a26c73f6e57f454d74e6c21ca88993
+ generation_id: f547f727-5aaa-4fc9-86c4-09adccdb4679
+ pristine_commit_hash: b93b03e3455dd717ed22dce7633ecd6a07c87f57
+ pristine_tree_hash: 0176ae0d72f589968c845b6edc780bedec34163f
features:
python:
additionalDependencies: 1.1.0
@@ -37,7 +37,7 @@ features:
openEnums: 1.0.4
pagination: 3.0.10
responseFormat: 1.1.0
- retries: 3.0.5
+ retries: 3.0.6
sdkHooks: 1.2.1
serverIDs: 3.0.0
unions: 3.1.6
@@ -180,8 +180,8 @@ trackedFiles:
pristine_git_object: 78276b8752601503bc20e0389189789ab1189858
docs/models/adyencardoptions.md:
id: b4250440538b
- last_write_checksum: sha1:008378be8d8e3e2329c8dd0c59178f202f7179aa
- pristine_git_object: 253da576995744126f9abbd72f5bf0b49bf5e241
+ last_write_checksum: sha1:ab1c9f15360ff7aa4c757bc696b5ed7b173aba8e
+ pristine_git_object: 0c9d5c1c730aa4e336a1b5d647d4d61e30d078d3
docs/models/adyenoptions.md:
id: 9dae80e273ed
last_write_checksum: sha1:6f471957fa79997ed800b9886295914c2ab1e3c3
@@ -2680,8 +2680,8 @@ trackedFiles:
pristine_git_object: cb9c15d314c1930557401074329ed7a737147919
pyproject.toml:
id: 5d07e7d72637
- last_write_checksum: sha1:909346221099dc094aef858f0510886bf78faa7a
- pristine_git_object: 4102cafa82114c58f84419763c2b574bc61edab2
+ last_write_checksum: sha1:4dfc7696461275d90ed8c5f62c98ced4cd873c58
+ pristine_git_object: 871f02fd43a8f388f4a5509158f0d2cf7989f3e6
scripts/prepare_readme.py:
id: e0c5957a6035
last_write_checksum: sha1:63a92abbd1de3323613f0d4c1ae4412076577710
@@ -2708,8 +2708,8 @@ trackedFiles:
pristine_git_object: 83a0d00f9b5b1a6d837643a32bfd0f82cd4f98ce
src/gr4vy/_version.py:
id: 1b5ad1da47aa
- last_write_checksum: sha1:5a90a65ce589939a6e71a662ed45b09a041f2233
- pristine_git_object: 7432aa522ee4efc6892220c6f91fd1e3237a9792
+ last_write_checksum: sha1:8be4fd492a00e6633d02cc48f883750f4987e7f2
+ pristine_git_object: 14eac953319cb12c29b0b823c4d4c3184a13eedb
src/gr4vy/account_updater.py:
id: 6dc8f39e2fb9
last_write_checksum: sha1:fabc79a59dd06fb927ce2d834fbafbcad5836a4b
@@ -2920,8 +2920,8 @@ trackedFiles:
pristine_git_object: 6e326e646ca00e7e57cad5b8bbc0fd793b8ef2a9
src/gr4vy/models/adyencardoptions.py:
id: a85776b081fa
- last_write_checksum: sha1:92b0cb1fdc76fa899f4bdd47c9f1bb18b49c799d
- pristine_git_object: 75b3312eff478ce8c7d40993b2ec5b0540bc2742
+ last_write_checksum: sha1:0e0c9e306bc17d25ec77ab03186cca9c912a4423
+ pristine_git_object: 59caa6e17acaacae5ef94306ea8d748e741802ea
src/gr4vy/models/adyenoptions.py:
id: 77d460c16e14
last_write_checksum: sha1:b61eb557bdf7f70041adeee65b61314a283da14d
@@ -4772,8 +4772,8 @@ trackedFiles:
pristine_git_object: 591415af8e64baa410627b507d2740afb5387d13
src/gr4vy/utils/retries.py:
id: c486412ce323
- last_write_checksum: sha1:471372f5c5d1dd5583239c9cf3c75f1b636e5d87
- pristine_git_object: af07d4e941007af4213c5ec9047ef8a2fca04e5e
+ last_write_checksum: sha1:9fcb404e0a5113634df964b4f393ba4eea5a76f3
+ pristine_git_object: bab2066f128973f7a38a94ccc5b378bd849a3cd9
src/gr4vy/utils/security.py:
id: 648156d4ba48
last_write_checksum: sha1:8f2a2aef55d9cf6eb91a7a752d3b22ff83e98312
@@ -8751,7 +8751,7 @@ examples:
application/json: {"type": "error", "code": "gateway_timeout", "status": 504, "message": "Request could not be processed"}
examplesVersion: 1.0.2
generatedTests: {}
-releaseNotes: "## Python SDK Changes:\n* `gr4vy.buyers.payment_methods.list()`: `response.items[].method.enum(cashappafterpay)` **Added**\n* `gr4vy.payment_methods.list()`: `response.items[].method.enum(cashappafterpay)` **Added**\n* `gr4vy.payment_methods.create()`: \n * `request_body.union(RedirectPaymentMethodCreate).method.enum(cashappafterpay)` **Added**\n * `response.method.enum(cashappafterpay)` **Added**\n* `gr4vy.payment_methods.get()`: `response.method.enum(cashappafterpay)` **Added**\n* `gr4vy.payment_methods.update()`: `response.method.enum(cashappafterpay)` **Added**\n* `gr4vy.transactions.list()`: \n * `request.method` **Changed**\n * `response.items[].payment_method.method.enum(cashappafterpay)` **Added**\n* `gr4vy.transactions.create()`: \n * `request` **Changed**\n * `response.payment_method.method.enum(cashappafterpay)` **Added**\n* `gr4vy.transactions.get()`: `response.payment_method.method.enum(cashappafterpay)` **Added**\n* `gr4vy.transactions.update()`: \n * `request.connection_options.adyen_cashappafterpay` **Added**\n * `response.payment_method.method.enum(cashappafterpay)` **Added**\n* `gr4vy.transactions.capture()`: `response.union(TransactionCapture).transaction.payment_method.method.enum(cashappafterpay)` **Added**\n* `gr4vy.transactions.void()`: `response.union(Transaction).payment_method.method.enum(cashappafterpay)` **Added**\n* `gr4vy.transactions.cancel()`: `response.transaction.payment_method.method.enum(cashappafterpay)` **Added**\n* `gr4vy.transactions.sync()`: `response.payment_method.method.enum(cashappafterpay)` **Added**\n* `gr4vy.payment_service_definitions.list()`: `response.items[].method.enum(cashappafterpay)` **Added**\n* `gr4vy.payment_service_definitions.get()`: `response.method.enum(cashappafterpay)` **Added**\n* `gr4vy.payment_services.list()`: \n * `request.method` **Changed**\n * `response.items[].method.enum(cashappafterpay)` **Added**\n* `gr4vy.payment_services.create()`: `response.method.enum(cashappafterpay)` **Added**\n* `gr4vy.payment_services.get()`: `response.method.enum(cashappafterpay)` **Added**\n* `gr4vy.payment_services.update()`: `response.method.enum(cashappafterpay)` **Added**\n* `gr4vy.payouts.list()`: `response.items[].payment_method.method.enum(cashappafterpay)` **Added**\n* `gr4vy.payouts.create()`: `response.payment_method.method.enum(cashappafterpay)` **Added**\n* `gr4vy.payouts.get()`: `response.payment_method.method.enum(cashappafterpay)` **Added**\n* `gr4vy.payment_links.create()`: \n * `request.connection_options.adyen_cashappafterpay` **Added**\n"
+releaseNotes: "## Python SDK Changes:\n* `gr4vy.transactions.create()`: \n * `request.connection_options.adyen_card` **Changed**\n* `gr4vy.transactions.update()`: \n * `request.connection_options.adyen_card` **Changed**\n* `gr4vy.payment_links.create()`: \n * `request.connection_options.adyen_card` **Changed**\n"
generatedFiles:
- .gitattributes
- .vscode/settings.json
diff --git a/.speakeasy/gen.yaml b/.speakeasy/gen.yaml
index 0477d593..1dca2425 100644
--- a/.speakeasy/gen.yaml
+++ b/.speakeasy/gen.yaml
@@ -29,7 +29,7 @@ generation:
generateNewTests: false
skipResponseBodyAssertions: false
python:
- version: 2.1.10
+ version: 2.1.11
additionalDependencies:
dev:
freezegun: ^1.5.1
@@ -56,6 +56,7 @@ python:
enableCustomCodeRegions: false
enumFormat: union
envVarPrefix: GR4VY
+ errorSchemaValidation: true
eventStreamClassNames:
async: EventStreamAsync
sync: EventStream
diff --git a/.speakeasy/workflow.lock b/.speakeasy/workflow.lock
index f321139c..1d348b27 100644
--- a/.speakeasy/workflow.lock
+++ b/.speakeasy/workflow.lock
@@ -1,9 +1,9 @@
-speakeasyVersion: 1.778.0
+speakeasyVersion: 1.780.0
sources:
openapi:
sourceNamespace: openapi
- sourceRevisionDigest: sha256:68ce4128cf61e4d0ad003743a0721d885dc8f71fc7c2bcc3ee74663fceeeeae5
- sourceBlobDigest: sha256:c753189022bd1b9b86045723686a8bfbbc5d69acaa9a5a0c36b411c076c55b37
+ sourceRevisionDigest: sha256:833eb24386a201c5dfbd2531e47afead6c4b53966cebad471038ea9ce767289b
+ sourceBlobDigest: sha256:28c33078b578408e783911018cd8093eaf98799884febe9df73c9dc7fa422213
tags:
- latest
- 1.0.0
@@ -11,10 +11,10 @@ targets:
python:
source: openapi
sourceNamespace: openapi
- sourceRevisionDigest: sha256:68ce4128cf61e4d0ad003743a0721d885dc8f71fc7c2bcc3ee74663fceeeeae5
- sourceBlobDigest: sha256:c753189022bd1b9b86045723686a8bfbbc5d69acaa9a5a0c36b411c076c55b37
+ sourceRevisionDigest: sha256:833eb24386a201c5dfbd2531e47afead6c4b53966cebad471038ea9ce767289b
+ sourceBlobDigest: sha256:28c33078b578408e783911018cd8093eaf98799884febe9df73c9dc7fa422213
codeSamplesNamespace: openapi-python-code-samples
- codeSamplesRevisionDigest: sha256:d18fbde68c150c9e2abff807dd3818ad4f90de99877e41e6fc442e1a8d48b1e6
+ codeSamplesRevisionDigest: sha256:cb565749e8866597ba4c8fbe7fc9e5ac5c51c467a8eb1b644aba419c4a059b8d
workflow:
workflowVersion: 1.0.0
speakeasyVersion: latest
diff --git a/RELEASES.md b/RELEASES.md
index c664968e..aefe76d5 100644
--- a/RELEASES.md
+++ b/RELEASES.md
@@ -2018,4 +2018,14 @@ Based on:
### Generated
- [python v2.1.10] .
### Releases
-- [PyPI v2.1.10] https://pypi.org/project/gr4vy/2.1.10 - .
\ No newline at end of file
+- [PyPI v2.1.10] https://pypi.org/project/gr4vy/2.1.10 - .
+
+## 2026-06-16 15:24:29
+### Changes
+Based on:
+- OpenAPI Doc
+- Speakeasy CLI 1.780.0 (2.906.0) https://github.com/speakeasy-api/speakeasy
+### Generated
+- [python v2.1.11] .
+### Releases
+- [PyPI v2.1.11] https://pypi.org/project/gr4vy/2.1.11 - .
\ No newline at end of file
diff --git a/docs/models/adyencardoptions.md b/docs/models/adyencardoptions.md
index 253da576..0c9d5c1c 100644
--- a/docs/models/adyencardoptions.md
+++ b/docs/models/adyencardoptions.md
@@ -10,4 +10,9 @@
| `additional_data` | Dict[str, *str*] | :heavy_minus_sign: | Passes additional data to the Adyen API when creating a transaction. | {
"subMerchantID": "12345"
} |
| `auto_rescue_scenario` | [OptionalNullable[models.AdyenCardAutoRescueScenariosEnum]](../models/adyencardautorescuescenariosenum.md) | :heavy_minus_sign: | The rescue scenario to simulate for a transaction, when `autoRescue` is set to `true`. | AutoRescueSuccessfulFirst |
| `window_origin` | *OptionalNullable[str]* | :heavy_minus_sign: | The origin of the window where the payment is initiated, used for 3D Secure authentication. | https://example.com |
-| `splits` | [OptionalNullable[models.AdyenSplitsOptions]](../models/adyensplitsoptions.md) | :heavy_minus_sign: | Passes information of splitting payment amounts to the Adyen API. | |
\ No newline at end of file
+| `splits` | [OptionalNullable[models.AdyenSplitsOptions]](../models/adyensplitsoptions.md) | :heavy_minus_sign: | Passes information of splitting payment amounts to the Adyen API. | |
+| `merchant_risk_indicator` | Dict[str, *Any*] | :heavy_minus_sign: | Passes `merchantRiskIndicator` data to Adyen. | |
+| `account_info` | Dict[str, *Any*] | :heavy_minus_sign: | Passes `accountInfo` data to Adyen. | |
+| `risk_data` | Dict[str, *Any*] | :heavy_minus_sign: | Passes `riskData.customFields` to Adyen. | |
+| `three_ds_requestor_challenge_ind` | *OptionalNullable[str]* | :heavy_minus_sign: | Passes `threeDS2RequestData.threeDSRequestorChallengeInd` to Adyen. | |
+| `attempt_authentication` | *OptionalNullable[str]* | :heavy_minus_sign: | Passes `authenticationData.attemptAuthentication` to Adyen. | |
\ No newline at end of file
diff --git a/pyproject.toml b/pyproject.toml
index 4102cafa..871f02fd 100644
--- a/pyproject.toml
+++ b/pyproject.toml
@@ -1,7 +1,7 @@
[project]
name = "gr4vy"
-version = "2.1.10"
+version = "2.1.11"
description = "Python Client SDK Generated by Speakeasy."
authors = [{ name = "Gr4vy" },]
readme = "README-PYPI.md"
diff --git a/src/gr4vy/_version.py b/src/gr4vy/_version.py
index 7432aa52..14eac953 100644
--- a/src/gr4vy/_version.py
+++ b/src/gr4vy/_version.py
@@ -3,10 +3,10 @@
import importlib.metadata
__title__: str = "gr4vy"
-__version__: str = "2.1.10"
+__version__: str = "2.1.11"
__openapi_doc_version__: str = "1.0.0"
-__gen_version__: str = "2.904.2"
-__user_agent__: str = "speakeasy-sdk/python 2.1.10 2.904.2 1.0.0 gr4vy"
+__gen_version__: str = "2.906.0"
+__user_agent__: str = "speakeasy-sdk/python 2.1.11 2.906.0 1.0.0 gr4vy"
try:
if __package__ is not None:
diff --git a/src/gr4vy/models/adyencardoptions.py b/src/gr4vy/models/adyencardoptions.py
index 75b3312e..59caa6e1 100644
--- a/src/gr4vy/models/adyencardoptions.py
+++ b/src/gr4vy/models/adyencardoptions.py
@@ -6,7 +6,7 @@
from gr4vy.types import BaseModel, Nullable, OptionalNullable, UNSET, UNSET_SENTINEL
import pydantic
from pydantic import model_serializer
-from typing import Dict
+from typing import Any, Dict
from typing_extensions import Annotated, NotRequired, TypedDict
@@ -23,6 +23,16 @@ class AdyenCardOptionsTypedDict(TypedDict):
r"""The origin of the window where the payment is initiated, used for 3D Secure authentication."""
splits: NotRequired[Nullable[AdyenSplitsOptionsTypedDict]]
r"""Passes information of splitting payment amounts to the Adyen API."""
+ merchant_risk_indicator: NotRequired[Nullable[Dict[str, Any]]]
+ r"""Passes `merchantRiskIndicator` data to Adyen."""
+ account_info: NotRequired[Nullable[Dict[str, Any]]]
+ r"""Passes `accountInfo` data to Adyen."""
+ risk_data: NotRequired[Nullable[Dict[str, Any]]]
+ r"""Passes `riskData.customFields` to Adyen."""
+ three_ds_requestor_challenge_ind: NotRequired[Nullable[str]]
+ r"""Passes `threeDS2RequestData.threeDSRequestorChallengeInd` to Adyen."""
+ attempt_authentication: NotRequired[Nullable[str]]
+ r"""Passes `authenticationData.attemptAuthentication` to Adyen."""
class AdyenCardOptions(BaseModel):
@@ -53,6 +63,31 @@ class AdyenCardOptions(BaseModel):
splits: OptionalNullable[AdyenSplitsOptions] = UNSET
r"""Passes information of splitting payment amounts to the Adyen API."""
+ merchant_risk_indicator: Annotated[
+ OptionalNullable[Dict[str, Any]], pydantic.Field(alias="merchantRiskIndicator")
+ ] = UNSET
+ r"""Passes `merchantRiskIndicator` data to Adyen."""
+
+ account_info: Annotated[
+ OptionalNullable[Dict[str, Any]], pydantic.Field(alias="accountInfo")
+ ] = UNSET
+ r"""Passes `accountInfo` data to Adyen."""
+
+ risk_data: Annotated[
+ OptionalNullable[Dict[str, Any]], pydantic.Field(alias="riskData")
+ ] = UNSET
+ r"""Passes `riskData.customFields` to Adyen."""
+
+ three_ds_requestor_challenge_ind: Annotated[
+ OptionalNullable[str], pydantic.Field(alias="threeDSRequestorChallengeInd")
+ ] = UNSET
+ r"""Passes `threeDS2RequestData.threeDSRequestorChallengeInd` to Adyen."""
+
+ attempt_authentication: Annotated[
+ OptionalNullable[str], pydantic.Field(alias="attemptAuthentication")
+ ] = UNSET
+ r"""Passes `authenticationData.attemptAuthentication` to Adyen."""
+
@model_serializer(mode="wrap")
def serialize_model(self, handler):
optional_fields = set(
@@ -63,6 +98,11 @@ def serialize_model(self, handler):
"autoRescueScenario",
"window_origin",
"splits",
+ "merchantRiskIndicator",
+ "accountInfo",
+ "riskData",
+ "threeDSRequestorChallengeInd",
+ "attemptAuthentication",
]
)
nullable_fields = set(
@@ -73,6 +113,11 @@ def serialize_model(self, handler):
"autoRescueScenario",
"window_origin",
"splits",
+ "merchantRiskIndicator",
+ "accountInfo",
+ "riskData",
+ "threeDSRequestorChallengeInd",
+ "attemptAuthentication",
]
)
serialized = handler(self)
diff --git a/src/gr4vy/utils/retries.py b/src/gr4vy/utils/retries.py
index af07d4e9..bab2066f 100644
--- a/src/gr4vy/utils/retries.py
+++ b/src/gr4vy/utils/retries.py
@@ -93,6 +93,21 @@ def _parse_retry_after_header(response: httpx.Response) -> Optional[int]:
return None
+def _parse_retry_after_ms_header(response: httpx.Response) -> Optional[int]:
+ retry_after_ms_header = response.headers.get("retry-after-ms")
+ if not retry_after_ms_header:
+ return None
+
+ try:
+ milliseconds = float(retry_after_ms_header)
+ if milliseconds >= 0:
+ return round(milliseconds)
+ except (OverflowError, ValueError):
+ pass
+
+ return None
+
+
def _get_sleep_interval(
exception: Exception,
initial_interval: int,
@@ -234,6 +249,10 @@ def retry_with_backoff(
raise
+ if isinstance(exception, TemporaryError):
+ retry_after_ms = _parse_retry_after_ms_header(exception.response)
+ if retry_after_ms is not None:
+ exception.retry_after = retry_after_ms
sleep = _get_sleep_interval(
exception, initial_interval, max_interval, exponent, retries
)
@@ -264,6 +283,10 @@ async def retry_with_backoff_async(
raise
+ if isinstance(exception, TemporaryError):
+ retry_after_ms = _parse_retry_after_ms_header(exception.response)
+ if retry_after_ms is not None:
+ exception.retry_after = retry_after_ms
sleep = _get_sleep_interval(
exception, initial_interval, max_interval, exponent, retries
)