diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 8406231a..72eb57b2 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -18,7 +18,7 @@ jobs: lint: timeout-minutes: 10 name: lint - runs-on: ${{ github.repository == 'stainless-sdks/lithic-python' && 'depot-ubuntu-24.04' || 'ubuntu-latest' }} + runs-on: ${{ startsWith(github.repository, 'stainless-sdks/') && 'depot-ubuntu-24.04' || 'ubuntu-latest' }} if: (github.event_name == 'push' || github.event.pull_request.head.repo.fork) && (github.event_name != 'push' || github.event.head_commit.message != 'codegen metadata') steps: - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 @@ -44,7 +44,7 @@ jobs: permissions: contents: read id-token: write - runs-on: ${{ github.repository == 'stainless-sdks/lithic-python' && 'depot-ubuntu-24.04' || 'ubuntu-latest' }} + runs-on: ${{ startsWith(github.repository, 'stainless-sdks/') && 'depot-ubuntu-24.04' || 'ubuntu-latest' }} steps: - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 @@ -84,7 +84,7 @@ jobs: test: timeout-minutes: 10 name: test - runs-on: ${{ github.repository == 'stainless-sdks/lithic-python' && 'depot-ubuntu-24.04' || 'ubuntu-latest' }} + runs-on: ${{ startsWith(github.repository, 'stainless-sdks/') && 'depot-ubuntu-24.04' || 'ubuntu-latest' }} if: github.event_name == 'push' || github.event.pull_request.head.repo.fork steps: - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 @@ -106,7 +106,7 @@ jobs: examples: timeout-minutes: 10 name: examples - runs-on: ${{ github.repository == 'stainless-sdks/lithic-python' && 'depot-ubuntu-24.04' || 'ubuntu-latest' }} + runs-on: ${{ startsWith(github.repository, 'stainless-sdks/') && 'depot-ubuntu-24.04' || 'ubuntu-latest' }} if: github.repository == 'lithic-com/lithic-python' && (github.event_name == 'push' || github.event.pull_request.head.repo.fork) && (github.event_name != 'push' || github.event.head_commit.message != 'codegen metadata') steps: diff --git a/.release-please-manifest.json b/.release-please-manifest.json index 65b6e7b4..37e99723 100644 --- a/.release-please-manifest.json +++ b/.release-please-manifest.json @@ -1,3 +1,3 @@ { - ".": "0.129.0" + ".": "0.130.0" } \ No newline at end of file diff --git a/.stats.yml b/.stats.yml index 8f07c5db..2261796e 100644 --- a/.stats.yml +++ b/.stats.yml @@ -1,4 +1,4 @@ configured_endpoints: 213 -openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/lithic/lithic-9e397c65ffb81e2928b8ecf979769a79131ae6058b6fb373a5e930dc8a168732.yml -openapi_spec_hash: 93aea3855d2d1c390107d223762aa818 +openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/lithic/lithic-90a1307b64fb449a81303dd73185b15e40f48c10415f4e4f483e59d828c53084.yml +openapi_spec_hash: 4c752106ab99b1c537fc364535736eaa config_hash: 5bb913c05ebeb301ec925b16e75bb251 diff --git a/CHANGELOG.md b/CHANGELOG.md index fe1b518e..59ae516f 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,31 @@ # Changelog +## 0.130.0 (2026-07-22) + +Full Changelog: [v0.129.0...v0.130.0](https://github.com/lithic-com/lithic-python/compare/v0.129.0...v0.130.0) + +### Features + +* **api:** add embed.session_generated and embed.viewed webhook events ([84ae573](https://github.com/lithic-com/lithic-python/commit/84ae5737ab2f64c05b512dc8cc0ac6de0579de70)) +* **api:** add PAYMENT enum value to book_transfers ([64b5358](https://github.com/lithic-com/lithic-python/commit/64b535810856b0344875a50a10bfed3212a1bb8a)) +* **api:** add PROGRAM_TRANSFER category and LITHIC/BANK_PROGRAM_TRANSFER type enums ([c10d6da](https://github.com/lithic-com/lithic-python/commit/c10d6da217709c34f2c2a3d7c39306a0372a1735)) +* **api:** add recipient_name field to payment ACH method attributes ([99e1525](https://github.com/lithic-com/lithic-python/commit/99e1525f200cf84137eee26ffaa5dde53406ad42)) +* **api:** add REVERSED status value to payments list method ([0f01552](https://github.com/lithic-com/lithic-python/commit/0f0155270dd93252f2717ad754f816b72b6abb61)) +* **stlc:** configurable CI runner and private-production-repo support in workflow templates ([d2bf66d](https://github.com/lithic-com/lithic-python/commit/d2bf66d3cb39aaeb20363b620223a1c010aaf846)) + + +### Chores + +* **internal:** regenerate SDK with no functional changes ([11f2bc1](https://github.com/lithic-com/lithic-python/commit/11f2bc121e233392a77b71cee01b873ef12ce780)) + + +### Documentation + +* **api:** clarify dispute event descriptions in Event model ([92638f2](https://github.com/lithic-com/lithic-python/commit/92638f2617ed8c2114082008a5d30171bbdd17ae)) +* **api:** clarify simulate_clearing behavior in transactions ([85d2d96](https://github.com/lithic-com/lithic-python/commit/85d2d9657022d3e7848477b329ba7f347efa7007)) +* **api:** update category parameter description in external_payments ([7c331aa](https://github.com/lithic-com/lithic-python/commit/7c331aae7db42d9e5663d71d26ec2f8a7ee91153)) +* **types:** increase max duration to 90 days in velocity_limit_period ([3423f7a](https://github.com/lithic-com/lithic-python/commit/3423f7aa9cc494895464c2c18056feafb5e6f95b)) + ## 0.129.0 (2026-06-29) Full Changelog: [v0.128.0...v0.129.0](https://github.com/lithic-com/lithic-python/compare/v0.128.0...v0.129.0) diff --git a/api.md b/api.md index 21d83b17..eb6a70ad 100644 --- a/api.md +++ b/api.md @@ -1015,6 +1015,8 @@ from lithic.types import ( DigitalWalletTokenizationUpdatedWebhookEvent, DisputeUpdatedWebhookEvent, DisputeEvidenceUploadFailedWebhookEvent, + EmbedSessionGeneratedWebhookEvent, + EmbedViewedWebhookEvent, ExternalBankAccountCreatedWebhookEvent, ExternalBankAccountUpdatedWebhookEvent, ExternalPaymentCreatedWebhookEvent, diff --git a/pyproject.toml b/pyproject.toml index 7b0df418..beb88420 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,6 +1,6 @@ [project] name = "lithic" -version = "0.129.0" +version = "0.130.0" description = "The official Python library for the lithic API" dynamic = ["readme"] license = "Apache-2.0" diff --git a/src/lithic/_version.py b/src/lithic/_version.py index 25fca04f..a8fc2b35 100644 --- a/src/lithic/_version.py +++ b/src/lithic/_version.py @@ -1,4 +1,4 @@ # File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details. __title__ = "lithic" -__version__ = "0.129.0" # x-release-please-version +__version__ = "0.130.0" # x-release-please-version diff --git a/src/lithic/resources/account_activity.py b/src/lithic/resources/account_activity.py index 3b9a3119..71222c27 100644 --- a/src/lithic/resources/account_activity.py +++ b/src/lithic/resources/account_activity.py @@ -72,6 +72,7 @@ def list( "MANAGEMENT_DISBURSEMENT", "HOLD", "PROGRAM_FUNDING", + "PROGRAM_TRANSFER", ] | Omit = omit, end: Union[str, datetime] | Omit = omit, @@ -244,6 +245,7 @@ def list( "MANAGEMENT_DISBURSEMENT", "HOLD", "PROGRAM_FUNDING", + "PROGRAM_TRANSFER", ] | Omit = omit, end: Union[str, datetime] | Omit = omit, diff --git a/src/lithic/resources/book_transfers.py b/src/lithic/resources/book_transfers.py index 5addf008..c82d497b 100644 --- a/src/lithic/resources/book_transfers.py +++ b/src/lithic/resources/book_transfers.py @@ -60,6 +60,7 @@ def create( "INTERNAL", "REWARD", "PROGRAM_FUNDING", + "PROGRAM_TRANSFER", "TRANSFER", ], from_financial_account_token: str, @@ -86,6 +87,7 @@ def create( "INTEREST", "LATE_PAYMENT", "BILL_PAYMENT", + "PAYMENT_FEE", "CASH_BACK", "ACCOUNT_TO_ACCOUNT", "CARD_TO_CARD", @@ -101,6 +103,8 @@ def create( "SERVICE", "TRANSFER", "COLLECTION", + "LITHIC_PROGRAM_TRANSFER", + "BANK_PROGRAM_TRANSFER", ], token: str | Omit = omit, external_id: str | Omit = omit, @@ -225,6 +229,7 @@ def list( "INTERNAL", "REWARD", "PROGRAM_FUNDING", + "PROGRAM_TRANSFER", "TRANSFER", ] | Omit = omit, @@ -419,6 +424,7 @@ async def create( "INTERNAL", "REWARD", "PROGRAM_FUNDING", + "PROGRAM_TRANSFER", "TRANSFER", ], from_financial_account_token: str, @@ -445,6 +451,7 @@ async def create( "INTEREST", "LATE_PAYMENT", "BILL_PAYMENT", + "PAYMENT_FEE", "CASH_BACK", "ACCOUNT_TO_ACCOUNT", "CARD_TO_CARD", @@ -460,6 +467,8 @@ async def create( "SERVICE", "TRANSFER", "COLLECTION", + "LITHIC_PROGRAM_TRANSFER", + "BANK_PROGRAM_TRANSFER", ], token: str | Omit = omit, external_id: str | Omit = omit, @@ -584,6 +593,7 @@ def list( "INTERNAL", "REWARD", "PROGRAM_FUNDING", + "PROGRAM_TRANSFER", "TRANSFER", ] | Omit = omit, diff --git a/src/lithic/resources/card_authorizations.py b/src/lithic/resources/card_authorizations.py index 217eb046..aeb24031 100644 --- a/src/lithic/resources/card_authorizations.py +++ b/src/lithic/resources/card_authorizations.py @@ -54,7 +54,7 @@ def challenge_response( Programs that have Authorization Challenges configured as Out of Band receive a - [card_authorization.challenge](https://docs.lithic.com/reference/post_card-authorization-challenge) + [card_authorization.challenge](https://docs.lithic.com/reference/cardauthorizationchallengewebhook) webhook when an authorization attempt triggers a challenge. The card program should respond using this endpoint after the cardholder completes the challenge. @@ -120,7 +120,7 @@ async def challenge_response( Programs that have Authorization Challenges configured as Out of Band receive a - [card_authorization.challenge](https://docs.lithic.com/reference/post_card-authorization-challenge) + [card_authorization.challenge](https://docs.lithic.com/reference/cardauthorizationchallengewebhook) webhook when an authorization attempt triggers a challenge. The card program should respond using this endpoint after the cardholder completes the challenge. diff --git a/src/lithic/resources/cards/cards.py b/src/lithic/resources/cards/cards.py index 41d0e592..e9943503 100644 --- a/src/lithic/resources/cards/cards.py +++ b/src/lithic/resources/cards/cards.py @@ -6,6 +6,7 @@ import json import base64 import hashlib +import typing_extensions from typing import Any, Union, cast from datetime import datetime, timezone, timedelta from typing_extensions import Literal @@ -675,6 +676,7 @@ def convert_physical( cast_to=Card, ) + @typing_extensions.deprecated("deprecated") def embed( self, *, @@ -688,6 +690,9 @@ def embed( timeout: float | httpx.Timeout | None | NotGiven = not_given, ) -> str: """ + **Deprecated.** Use the modern embedded card flow instead: create a session with + `POST /v1/cards/{card_token}/embed` and render it via `GET /v1/embed`. + Handling full card PANs and CVV codes requires that you comply with the Payment Card Industry Data Security Standards (PCI DSS). Some clients choose to reduce their compliance obligations by leveraging our embedded card UI solution @@ -1903,6 +1908,7 @@ async def convert_physical( cast_to=Card, ) + @typing_extensions.deprecated("deprecated") async def embed( self, *, @@ -1916,6 +1922,9 @@ async def embed( timeout: float | httpx.Timeout | None | NotGiven = not_given, ) -> str: """ + **Deprecated.** Use the modern embedded card flow instead: create a session with + `POST /v1/cards/{card_token}/embed` and render it via `GET /v1/embed`. + Handling full card PANs and CVV codes requires that you comply with the Payment Card Industry Data Security Standards (PCI DSS). Some clients choose to reduce their compliance obligations by leveraging our embedded card UI solution @@ -2539,8 +2548,10 @@ def __init__(self, cards: Cards) -> None: self.convert_physical = _legacy_response.to_raw_response_wrapper( cards.convert_physical, ) - self.embed = _legacy_response.to_raw_response_wrapper( - cards.embed, + self.embed = ( # pyright: ignore[reportDeprecated] + _legacy_response.to_raw_response_wrapper( + cards.embed, # pyright: ignore[reportDeprecated], + ) ) self.provision = _legacy_response.to_raw_response_wrapper( cards.provision, @@ -2592,8 +2603,10 @@ def __init__(self, cards: AsyncCards) -> None: self.convert_physical = _legacy_response.async_to_raw_response_wrapper( cards.convert_physical, ) - self.embed = _legacy_response.async_to_raw_response_wrapper( - cards.embed, + self.embed = ( # pyright: ignore[reportDeprecated] + _legacy_response.async_to_raw_response_wrapper( + cards.embed, # pyright: ignore[reportDeprecated], + ) ) self.provision = _legacy_response.async_to_raw_response_wrapper( cards.provision, @@ -2645,8 +2658,10 @@ def __init__(self, cards: Cards) -> None: self.convert_physical = to_streamed_response_wrapper( cards.convert_physical, ) - self.embed = to_streamed_response_wrapper( - cards.embed, + self.embed = ( # pyright: ignore[reportDeprecated] + to_streamed_response_wrapper( + cards.embed, # pyright: ignore[reportDeprecated], + ) ) self.provision = to_streamed_response_wrapper( cards.provision, @@ -2698,8 +2713,10 @@ def __init__(self, cards: AsyncCards) -> None: self.convert_physical = async_to_streamed_response_wrapper( cards.convert_physical, ) - self.embed = async_to_streamed_response_wrapper( - cards.embed, + self.embed = ( # pyright: ignore[reportDeprecated] + async_to_streamed_response_wrapper( + cards.embed, # pyright: ignore[reportDeprecated], + ) ) self.provision = async_to_streamed_response_wrapper( cards.provision, diff --git a/src/lithic/resources/events/events.py b/src/lithic/resources/events/events.py index e81e5c2f..36fd0dbc 100644 --- a/src/lithic/resources/events/events.py +++ b/src/lithic/resources/events/events.py @@ -140,6 +140,8 @@ def list( "dispute_transaction.created", "dispute_transaction.updated", "dispute.updated", + "embed.session_generated", + "embed.viewed", "external_bank_account.created", "external_bank_account.updated", "external_payment.created", @@ -421,6 +423,8 @@ def list( "dispute_transaction.created", "dispute_transaction.updated", "dispute.updated", + "embed.session_generated", + "embed.viewed", "external_bank_account.created", "external_bank_account.updated", "external_payment.created", diff --git a/src/lithic/resources/events/subscriptions.py b/src/lithic/resources/events/subscriptions.py index 1a622e2a..bb5390ad 100644 --- a/src/lithic/resources/events/subscriptions.py +++ b/src/lithic/resources/events/subscriptions.py @@ -92,6 +92,8 @@ def create( "dispute_transaction.created", "dispute_transaction.updated", "dispute.updated", + "embed.session_generated", + "embed.viewed", "external_bank_account.created", "external_bank_account.updated", "external_payment.created", @@ -245,6 +247,8 @@ def update( "dispute_transaction.created", "dispute_transaction.updated", "dispute.updated", + "embed.session_generated", + "embed.viewed", "external_bank_account.created", "external_bank_account.updated", "external_payment.created", @@ -721,6 +725,8 @@ def send_simulated_example( "dispute_transaction.created", "dispute_transaction.updated", "dispute.updated", + "embed.session_generated", + "embed.viewed", "external_bank_account.created", "external_bank_account.updated", "external_payment.created", @@ -851,6 +857,8 @@ async def create( "dispute_transaction.created", "dispute_transaction.updated", "dispute.updated", + "embed.session_generated", + "embed.viewed", "external_bank_account.created", "external_bank_account.updated", "external_payment.created", @@ -1004,6 +1012,8 @@ async def update( "dispute_transaction.created", "dispute_transaction.updated", "dispute.updated", + "embed.session_generated", + "embed.viewed", "external_bank_account.created", "external_bank_account.updated", "external_payment.created", @@ -1480,6 +1490,8 @@ async def send_simulated_example( "dispute_transaction.created", "dispute_transaction.updated", "dispute.updated", + "embed.session_generated", + "embed.viewed", "external_bank_account.created", "external_bank_account.updated", "external_payment.created", diff --git a/src/lithic/resources/external_payments.py b/src/lithic/resources/external_payments.py index 2ad951b2..19116fd9 100644 --- a/src/lithic/resources/external_payments.py +++ b/src/lithic/resources/external_payments.py @@ -175,7 +175,7 @@ def list( Only entries created after the specified time will be included. UTC time zone. - category: External Payment category to be returned. + category: The external rail the funds moved on end: Date string in RFC 3339 format. Only entries created before the specified time will be included. UTC time zone. @@ -563,7 +563,7 @@ def list( Only entries created after the specified time will be included. UTC time zone. - category: External Payment category to be returned. + category: The external rail the funds moved on end: Date string in RFC 3339 format. Only entries created before the specified time will be included. UTC time zone. diff --git a/src/lithic/resources/payments.py b/src/lithic/resources/payments.py index c6275973..bfe781ed 100644 --- a/src/lithic/resources/payments.py +++ b/src/lithic/resources/payments.py @@ -162,7 +162,7 @@ def list( page_size: int | Omit = omit, result: Literal["APPROVED", "DECLINED"] | Omit = omit, starting_after: str | Omit = omit, - status: Literal["DECLINED", "PENDING", "RETURNED", "SETTLED"] | Omit = omit, + status: Literal["DECLINED", "PENDING", "RETURNED", "REVERSED", "SETTLED"] | Omit = omit, # Use the following arguments if you need to pass additional parameters to the API that aren't available via kwargs. # The extra values given here take precedence over values defined on the client or passed to this method. extra_headers: Headers | None = None, @@ -667,7 +667,7 @@ def list( page_size: int | Omit = omit, result: Literal["APPROVED", "DECLINED"] | Omit = omit, starting_after: str | Omit = omit, - status: Literal["DECLINED", "PENDING", "RETURNED", "SETTLED"] | Omit = omit, + status: Literal["DECLINED", "PENDING", "RETURNED", "REVERSED", "SETTLED"] | Omit = omit, # Use the following arguments if you need to pass additional parameters to the API that aren't available via kwargs. # The extra values given here take precedence over values defined on the client or passed to this method. extra_headers: Headers | None = None, diff --git a/src/lithic/resources/three_ds/decisioning.py b/src/lithic/resources/three_ds/decisioning.py index 476e2cd9..6a188790 100644 --- a/src/lithic/resources/three_ds/decisioning.py +++ b/src/lithic/resources/three_ds/decisioning.py @@ -54,7 +54,7 @@ def challenge_response( Challenge Request is emitted as a webhook - [three_ds_authentication.challenge](https://docs.lithic.com/reference/post_three-ds-authentication-challenge) + [three_ds_authentication.challenge](https://docs.lithic.com/reference/threedsauthenticationchallengewebhook) and your Card Program needs to be configured with Out of Band (OOB) Challenges in order to receive it (see https://docs.lithic.com/docs/3ds-challenge-flow for more information). @@ -177,7 +177,7 @@ async def challenge_response( Challenge Request is emitted as a webhook - [three_ds_authentication.challenge](https://docs.lithic.com/reference/post_three-ds-authentication-challenge) + [three_ds_authentication.challenge](https://docs.lithic.com/reference/threedsauthenticationchallengewebhook) and your Card Program needs to be configured with Out of Band (OOB) Challenges in order to receive it (see https://docs.lithic.com/docs/3ds-challenge-flow for more information). diff --git a/src/lithic/resources/transactions/transactions.py b/src/lithic/resources/transactions/transactions.py index 979da846..65f3daca 100644 --- a/src/lithic/resources/transactions/transactions.py +++ b/src/lithic/resources/transactions/transactions.py @@ -470,9 +470,10 @@ def simulate_clearing( After this event, the transaction transitions from `PENDING` to `SETTLED` status. - If `amount` is not set, the full amount of the transaction will be cleared. - Transactions that have already cleared, either partially or fully, cannot be - cleared again using this endpoint. + If `amount` is not set, the full amount of the transaction will be cleared. This + endpoint may be called multiple times against the same authorization to simulate + a multiple-completion scenario, with each call creating a separate clearing + event. Args: token: The transaction token returned from the /v1/simulate/authorize response. @@ -483,9 +484,10 @@ def simulate_clearing( example, entering 100 in this field will result in a -100 amount in the transaction, if the original authorization is a credit authorization. - If `amount` is not set, the full amount of the transaction will be cleared. - Transactions that have already cleared, either partially or fully, cannot be - cleared again using this endpoint. + If `amount` is not set, the full amount of the transaction will be cleared. This + endpoint may be called multiple times against the same authorization to simulate + a multiple-completion scenario, with each call creating a separate clearing + event. extra_headers: Send extra headers @@ -1214,9 +1216,10 @@ async def simulate_clearing( After this event, the transaction transitions from `PENDING` to `SETTLED` status. - If `amount` is not set, the full amount of the transaction will be cleared. - Transactions that have already cleared, either partially or fully, cannot be - cleared again using this endpoint. + If `amount` is not set, the full amount of the transaction will be cleared. This + endpoint may be called multiple times against the same authorization to simulate + a multiple-completion scenario, with each call creating a separate clearing + event. Args: token: The transaction token returned from the /v1/simulate/authorize response. @@ -1227,9 +1230,10 @@ async def simulate_clearing( example, entering 100 in this field will result in a -100 amount in the transaction, if the original authorization is a credit authorization. - If `amount` is not set, the full amount of the transaction will be cleared. - Transactions that have already cleared, either partially or fully, cannot be - cleared again using this endpoint. + If `amount` is not set, the full amount of the transaction will be cleared. This + endpoint may be called multiple times against the same authorization to simulate + a multiple-completion scenario, with each call creating a separate clearing + event. extra_headers: Send extra headers diff --git a/src/lithic/types/__init__.py b/src/lithic/types/__init__.py index 3ea5203b..a1dac934 100644 --- a/src/lithic/types/__init__.py +++ b/src/lithic/types/__init__.py @@ -119,6 +119,7 @@ from .card_renewed_webhook_event import CardRenewedWebhookEvent as CardRenewedWebhookEvent from .card_shipped_webhook_event import CardShippedWebhookEvent as CardShippedWebhookEvent from .card_updated_webhook_event import CardUpdatedWebhookEvent as CardUpdatedWebhookEvent +from .embed_viewed_webhook_event import EmbedViewedWebhookEvent as EmbedViewedWebhookEvent from .event_list_attempts_params import EventListAttemptsParams as EventListAttemptsParams from .settlement_summary_details import SettlementSummaryDetails as SettlementSummaryDetails from .transfer_limit_list_params import TransferLimitListParams as TransferLimitListParams @@ -203,6 +204,9 @@ from .claim_document_uploaded_webhook_event import ( ClaimDocumentUploadedWebhookEvent as ClaimDocumentUploadedWebhookEvent, ) +from .embed_session_generated_webhook_event import ( + EmbedSessionGeneratedWebhookEvent as EmbedSessionGeneratedWebhookEvent, +) from .external_bank_account_create_response import ( ExternalBankAccountCreateResponse as ExternalBankAccountCreateResponse, ) diff --git a/src/lithic/types/account_activity_list_params.py b/src/lithic/types/account_activity_list_params.py index 1edf4ab8..5d2a6928 100644 --- a/src/lithic/types/account_activity_list_params.py +++ b/src/lithic/types/account_activity_list_params.py @@ -47,6 +47,7 @@ class AccountActivityListParams(TypedDict, total=False): "MANAGEMENT_DISBURSEMENT", "HOLD", "PROGRAM_FUNDING", + "PROGRAM_TRANSFER", ] """Filter by transaction category""" diff --git a/src/lithic/types/account_activity_list_response.py b/src/lithic/types/account_activity_list_response.py index 77fff49b..7e687b12 100644 --- a/src/lithic/types/account_activity_list_response.py +++ b/src/lithic/types/account_activity_list_response.py @@ -46,6 +46,7 @@ class FinancialTransaction(BaseModel): "MANAGEMENT_DISBURSEMENT", "HOLD", "PROGRAM_FUNDING", + "PROGRAM_TRANSFER", ] """Transaction category""" diff --git a/src/lithic/types/account_activity_retrieve_transaction_response.py b/src/lithic/types/account_activity_retrieve_transaction_response.py index ddb55e7d..9d131bc2 100644 --- a/src/lithic/types/account_activity_retrieve_transaction_response.py +++ b/src/lithic/types/account_activity_retrieve_transaction_response.py @@ -46,6 +46,7 @@ class FinancialTransaction(BaseModel): "MANAGEMENT_DISBURSEMENT", "HOLD", "PROGRAM_FUNDING", + "PROGRAM_TRANSFER", ] """Transaction category""" diff --git a/src/lithic/types/auth_rules/velocity_limit_period.py b/src/lithic/types/auth_rules/velocity_limit_period.py index 7ac08d9f..81949297 100644 --- a/src/lithic/types/auth_rules/velocity_limit_period.py +++ b/src/lithic/types/auth_rules/velocity_limit_period.py @@ -19,7 +19,7 @@ class TrailingWindowObject(BaseModel): duration: int """The size of the trailing window to calculate Spend Velocity over in seconds. - The minimum value is 10 seconds, and the maximum value is 2678400 seconds (31 + The minimum value is 10 seconds, and the maximum value is 7776000 seconds (90 days). """ diff --git a/src/lithic/types/auth_rules/velocity_limit_period_param.py b/src/lithic/types/auth_rules/velocity_limit_period_param.py index d55b61f6..8a32cb6a 100644 --- a/src/lithic/types/auth_rules/velocity_limit_period_param.py +++ b/src/lithic/types/auth_rules/velocity_limit_period_param.py @@ -19,7 +19,7 @@ class TrailingWindowObject(TypedDict, total=False): duration: Required[int] """The size of the trailing window to calculate Spend Velocity over in seconds. - The minimum value is 10 seconds, and the maximum value is 2678400 seconds (31 + The minimum value is 10 seconds, and the maximum value is 7776000 seconds (90 days). """ diff --git a/src/lithic/types/book_transfer_create_params.py b/src/lithic/types/book_transfer_create_params.py index b5cab3b2..3b55ed33 100644 --- a/src/lithic/types/book_transfer_create_params.py +++ b/src/lithic/types/book_transfer_create_params.py @@ -24,6 +24,7 @@ class BookTransferCreateParams(TypedDict, total=False): "INTERNAL", "REWARD", "PROGRAM_FUNDING", + "PROGRAM_TRANSFER", "TRANSFER", ] ] @@ -65,6 +66,7 @@ class BookTransferCreateParams(TypedDict, total=False): "INTEREST", "LATE_PAYMENT", "BILL_PAYMENT", + "PAYMENT_FEE", "CASH_BACK", "ACCOUNT_TO_ACCOUNT", "CARD_TO_CARD", @@ -80,6 +82,8 @@ class BookTransferCreateParams(TypedDict, total=False): "SERVICE", "TRANSFER", "COLLECTION", + "LITHIC_PROGRAM_TRANSFER", + "BANK_PROGRAM_TRANSFER", ] ] """Type of the book transfer""" diff --git a/src/lithic/types/book_transfer_list_params.py b/src/lithic/types/book_transfer_list_params.py index 1c773ca7..87b9e89e 100644 --- a/src/lithic/types/book_transfer_list_params.py +++ b/src/lithic/types/book_transfer_list_params.py @@ -31,6 +31,7 @@ class BookTransferListParams(TypedDict, total=False): "INTERNAL", "REWARD", "PROGRAM_FUNDING", + "PROGRAM_TRANSFER", "TRANSFER", ] """Book Transfer category to be returned.""" diff --git a/src/lithic/types/book_transfer_response.py b/src/lithic/types/book_transfer_response.py index a9648905..77d98430 100644 --- a/src/lithic/types/book_transfer_response.py +++ b/src/lithic/types/book_transfer_response.py @@ -60,6 +60,7 @@ class Event(BaseModel): "INTEREST", "LATE_PAYMENT", "BILL_PAYMENT", + "PAYMENT_FEE", "CASH_BACK", "ACCOUNT_TO_ACCOUNT", "CARD_TO_CARD", @@ -75,6 +76,8 @@ class Event(BaseModel): "SERVICE", "TRANSFER", "COLLECTION", + "LITHIC_PROGRAM_TRANSFER", + "BANK_PROGRAM_TRANSFER", ] """Type of the book transfer""" @@ -104,6 +107,7 @@ class BookTransferResponse(BaseModel): "INTERNAL", "REWARD", "PROGRAM_FUNDING", + "PROGRAM_TRANSFER", "TRANSFER", ] diff --git a/src/lithic/types/embed_session_generated_webhook_event.py b/src/lithic/types/embed_session_generated_webhook_event.py new file mode 100644 index 00000000..253aa461 --- /dev/null +++ b/src/lithic/types/embed_session_generated_webhook_event.py @@ -0,0 +1,34 @@ +# File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details. + +from typing_extensions import Literal + +from .._models import BaseModel + +__all__ = ["EmbedSessionGeneratedWebhookEvent", "DeviceDetails"] + + +class DeviceDetails(BaseModel): + """Details about the request that generated the embed session""" + + ip_address: str + """The IP address recorded for the request that generated the event""" + + +class EmbedSessionGeneratedWebhookEvent(BaseModel): + account_token: str + """The token of the account associated with the card""" + + card_token: str + """The token of the card associated with the embed session""" + + device_details: DeviceDetails + """Details about the request that generated the embed session""" + + event_type: Literal["embed.session_generated"] + """The type of event""" + + session_id: str + """The identifier shared by webhook events for the same embed session.""" + + session_type: Literal["CARD_EMBED", "PIN_SETTING_EMBED"] + """The type of embed session that was generated""" diff --git a/src/lithic/types/embed_viewed_webhook_event.py b/src/lithic/types/embed_viewed_webhook_event.py new file mode 100644 index 00000000..8b574d33 --- /dev/null +++ b/src/lithic/types/embed_viewed_webhook_event.py @@ -0,0 +1,34 @@ +# File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details. + +from typing_extensions import Literal + +from .._models import BaseModel + +__all__ = ["EmbedViewedWebhookEvent", "DeviceDetails"] + + +class DeviceDetails(BaseModel): + """Details about the request that revealed the card detail""" + + ip_address: str + """The IP address recorded for the request that generated the event""" + + +class EmbedViewedWebhookEvent(BaseModel): + account_token: str + """The token of the account associated with the card""" + + card_token: str + """The token of the card whose details were revealed""" + + device_details: DeviceDetails + """Details about the request that revealed the card detail""" + + embed_type: Literal["PAN", "CVV", "EXP_MONTH", "EXP_YEAR"] + """The type of card detail that was revealed""" + + event_type: Literal["embed.viewed"] + """The type of event""" + + session_id: str + """The identifier shared by webhook events for the same embed session.""" diff --git a/src/lithic/types/event.py b/src/lithic/types/event.py index 2d663b0a..dcbd1046 100644 --- a/src/lithic/types/event.py +++ b/src/lithic/types/event.py @@ -54,6 +54,8 @@ class Event(BaseModel): "dispute_transaction.created", "dispute_transaction.updated", "dispute.updated", + "embed.session_generated", + "embed.viewed", "external_bank_account.created", "external_bank_account.updated", "external_payment.created", @@ -85,7 +87,7 @@ class Event(BaseModel): """The type of event that occurred. Possible values: - account_holder_document.updated: Occurs when an account holder's document - upload status has been updated + upload status has been updated. - account_holder.created: Occurs when a new account_holder is created. - account_holder.updated: Occurs when an account_holder is updated. - account_holder.verification: Occurs when an asynchronous account_holder's @@ -149,10 +151,25 @@ class Event(BaseModel): This event will be deprecated in the future. We recommend using `tokenization.updated` instead. - - dispute_evidence.upload_failed: Occurs when a dispute evidence upload fails. + - dispute_evidence.upload_failed: Occurs when an evidence upload fails for a + dispute filed through the Chargebacks API (`/v1/disputes`). + + This event is not emitted for Managed Disputes. + - dispute_transaction.created: Occurs when a new dispute transaction is created - - dispute_transaction.updated: Occurs when a dispute transaction is updated - - dispute.updated: Occurs when a dispute is updated. + for a Managed Disputes case. + - dispute_transaction.updated: Occurs when a dispute transaction for a Managed + Disputes case is updated. + - dispute.updated: Occurs when a dispute filed through the Chargebacks API + (`/v1/disputes`) is created or updated. + + This event is not emitted for Managed Disputes. Use + `dispute_transaction.created` and `dispute_transaction.updated` instead. + + - embed.session_generated: Occurs when a card embed session is successfully + generated. + - embed.viewed: Occurs when a card detail is successfully revealed through an + embed. - external_bank_account.created: Occurs when an external bank account is created. - external_bank_account.updated: Occurs when an external bank account is @@ -174,12 +191,12 @@ class Event(BaseModel): - payment_transaction.updated: Occurs when a payment transaction is updated. - settlement_report.updated: Occurs when a settlement report is created or updated. - - statements.created: Occurs when a statement has been created + - statements.created: Occurs when a statement has been created. - three_ds_authentication.challenge: The `three_ds_authentication.challenge` event. Upon receiving this request, the Card Program should issue its own challenge to the cardholder. After a cardholder challenge is successfully completed, the Card Program needs to respond back to Lithic by call to - [/v1/three_ds_decisioning/challenge_response](https://docs.lithic.com/reference/post_v1-three-ds-decisioning-challenge-response). + [/v1/three_ds_decisioning/challenge_response](https://docs.lithic.com/reference/postthreedschallengeresponse). Then the cardholder must navigate back to the merchant checkout flow to complete the transaction. Some merchants will include an `app_requestor_url` for app-based purchases; Lithic recommends triggering a redirect to that URL diff --git a/src/lithic/types/event_list_params.py b/src/lithic/types/event_list_params.py index 942d5943..8f4b11ef 100644 --- a/src/lithic/types/event_list_params.py +++ b/src/lithic/types/event_list_params.py @@ -64,6 +64,8 @@ class EventListParams(TypedDict, total=False): "dispute_transaction.created", "dispute_transaction.updated", "dispute.updated", + "embed.session_generated", + "embed.viewed", "external_bank_account.created", "external_bank_account.updated", "external_payment.created", diff --git a/src/lithic/types/event_subscription.py b/src/lithic/types/event_subscription.py index 76556966..a8349d20 100644 --- a/src/lithic/types/event_subscription.py +++ b/src/lithic/types/event_subscription.py @@ -57,6 +57,8 @@ class EventSubscription(BaseModel): "dispute_transaction.created", "dispute_transaction.updated", "dispute.updated", + "embed.session_generated", + "embed.viewed", "external_bank_account.created", "external_bank_account.updated", "external_payment.created", diff --git a/src/lithic/types/events/subscription_create_params.py b/src/lithic/types/events/subscription_create_params.py index 965d26f1..00f5ccbf 100644 --- a/src/lithic/types/events/subscription_create_params.py +++ b/src/lithic/types/events/subscription_create_params.py @@ -52,6 +52,8 @@ class SubscriptionCreateParams(TypedDict, total=False): "dispute_transaction.created", "dispute_transaction.updated", "dispute.updated", + "embed.session_generated", + "embed.viewed", "external_bank_account.created", "external_bank_account.updated", "external_payment.created", diff --git a/src/lithic/types/events/subscription_send_simulated_example_params.py b/src/lithic/types/events/subscription_send_simulated_example_params.py index f86b8eb7..5fdb92c0 100644 --- a/src/lithic/types/events/subscription_send_simulated_example_params.py +++ b/src/lithic/types/events/subscription_send_simulated_example_params.py @@ -41,6 +41,8 @@ class SubscriptionSendSimulatedExampleParams(TypedDict, total=False): "dispute_transaction.created", "dispute_transaction.updated", "dispute.updated", + "embed.session_generated", + "embed.viewed", "external_bank_account.created", "external_bank_account.updated", "external_payment.created", diff --git a/src/lithic/types/events/subscription_update_params.py b/src/lithic/types/events/subscription_update_params.py index 701e60a9..6571ac66 100644 --- a/src/lithic/types/events/subscription_update_params.py +++ b/src/lithic/types/events/subscription_update_params.py @@ -52,6 +52,8 @@ class SubscriptionUpdateParams(TypedDict, total=False): "dispute_transaction.created", "dispute_transaction.updated", "dispute.updated", + "embed.session_generated", + "embed.viewed", "external_bank_account.created", "external_bank_account.updated", "external_payment.created", diff --git a/src/lithic/types/external_payment_list_params.py b/src/lithic/types/external_payment_list_params.py index f54ac91c..13c3710b 100644 --- a/src/lithic/types/external_payment_list_params.py +++ b/src/lithic/types/external_payment_list_params.py @@ -23,7 +23,7 @@ class ExternalPaymentListParams(TypedDict, total=False): category: Literal[ "EXTERNAL_WIRE", "EXTERNAL_ACH", "EXTERNAL_CHECK", "EXTERNAL_FEDNOW", "EXTERNAL_RTP", "EXTERNAL_TRANSFER" ] - """External Payment category to be returned.""" + """The external rail the funds moved on""" end: Annotated[Union[str, datetime], PropertyInfo(format="iso8601")] """Date string in RFC 3339 format. diff --git a/src/lithic/types/financial_accounts/statements/statement_line_items.py b/src/lithic/types/financial_accounts/statements/statement_line_items.py index 8eca65b5..53d3dafd 100644 --- a/src/lithic/types/financial_accounts/statements/statement_line_items.py +++ b/src/lithic/types/financial_accounts/statements/statement_line_items.py @@ -39,6 +39,7 @@ class Data(BaseModel): "MANAGEMENT_DISBURSEMENT", "HOLD", "PROGRAM_FUNDING", + "PROGRAM_TRANSFER", ] """ Note: Inbound wire transfers are coming soon (availability varies by partner @@ -140,6 +141,8 @@ class Data(BaseModel): "RETURNED_PAYMENT", "RETURNED_PAYMENT_REVERSAL", "LITHIC_NETWORK_PAYMENT", + "LITHIC_PROGRAM_TRANSFER", + "BANK_PROGRAM_TRANSFER", "ANNUAL", "ANNUAL_REVERSAL", "QUARTERLY", diff --git a/src/lithic/types/parsed_webhook_event.py b/src/lithic/types/parsed_webhook_event.py index c5684335..3959e4a3 100644 --- a/src/lithic/types/parsed_webhook_event.py +++ b/src/lithic/types/parsed_webhook_event.py @@ -10,6 +10,7 @@ from .card_renewed_webhook_event import CardRenewedWebhookEvent from .card_shipped_webhook_event import CardShippedWebhookEvent from .card_updated_webhook_event import CardUpdatedWebhookEvent +from .embed_viewed_webhook_event import EmbedViewedWebhookEvent from .card_reissued_webhook_event import CardReissuedWebhookEvent from .claim_created_webhook_event import ClaimCreatedWebhookEvent from .claim_updated_webhook_event import ClaimUpdatedWebhookEvent @@ -28,6 +29,7 @@ from .claim_document_accepted_webhook_event import ClaimDocumentAcceptedWebhookEvent from .claim_document_rejected_webhook_event import ClaimDocumentRejectedWebhookEvent from .claim_document_uploaded_webhook_event import ClaimDocumentUploadedWebhookEvent +from .embed_session_generated_webhook_event import EmbedSessionGeneratedWebhookEvent from .card_transaction_updated_webhook_event import CardTransactionUpdatedWebhookEvent from .external_payment_created_webhook_event import ExternalPaymentCreatedWebhookEvent from .external_payment_updated_webhook_event import ExternalPaymentUpdatedWebhookEvent @@ -465,6 +467,8 @@ class LegacyPayload(BaseModel): DigitalWalletTokenizationUpdatedWebhookEvent, DisputeUpdatedWebhookEvent, DisputeEvidenceUploadFailedWebhookEvent, + EmbedSessionGeneratedWebhookEvent, + EmbedViewedWebhookEvent, ExternalBankAccountCreatedWebhookEvent, ExternalBankAccountUpdatedWebhookEvent, ExternalPaymentCreatedWebhookEvent, diff --git a/src/lithic/types/payment.py b/src/lithic/types/payment.py index badcc500..12df49a3 100644 --- a/src/lithic/types/payment.py +++ b/src/lithic/types/payment.py @@ -166,6 +166,9 @@ class MethodAttributesACHMethodAttributes(BaseModel): receipt_routing_number: Optional[str] = None """Receipt routing number""" + recipient_name: Optional[str] = None + """Name of the recipient on ACH receipts. Reflects the originating bank's record""" + retries: Optional[int] = None """Number of retries attempted""" @@ -239,6 +242,7 @@ class Payment(BaseModel): "MANAGEMENT_DISBURSEMENT", "HOLD", "PROGRAM_FUNDING", + "PROGRAM_TRANSFER", ] """Transaction category""" diff --git a/src/lithic/types/payment_list_params.py b/src/lithic/types/payment_list_params.py index f2168b52..6c4fe92e 100644 --- a/src/lithic/types/payment_list_params.py +++ b/src/lithic/types/payment_list_params.py @@ -50,4 +50,4 @@ class PaymentListParams(TypedDict, total=False): Used to retrieve the next page of results after this item. """ - status: Literal["DECLINED", "PENDING", "RETURNED", "SETTLED"] + status: Literal["DECLINED", "PENDING", "RETURNED", "REVERSED", "SETTLED"] diff --git a/src/lithic/types/shared/financial_event.py b/src/lithic/types/shared/financial_event.py index 77304eb3..fd673539 100644 --- a/src/lithic/types/shared/financial_event.py +++ b/src/lithic/types/shared/financial_event.py @@ -113,6 +113,8 @@ class FinancialEvent(BaseModel): "RETURNED_PAYMENT", "RETURNED_PAYMENT_REVERSAL", "LITHIC_NETWORK_PAYMENT", + "LITHIC_PROGRAM_TRANSFER", + "BANK_PROGRAM_TRANSFER", "ANNUAL", "ANNUAL_REVERSAL", "QUARTERLY", diff --git a/src/lithic/types/transaction_simulate_clearing_params.py b/src/lithic/types/transaction_simulate_clearing_params.py index ab45523f..ed7e202c 100644 --- a/src/lithic/types/transaction_simulate_clearing_params.py +++ b/src/lithic/types/transaction_simulate_clearing_params.py @@ -20,7 +20,8 @@ class TransactionSimulateClearingParams(TypedDict, total=False): will result in a -100 amount in the transaction, if the original authorization is a credit authorization. - If `amount` is not set, the full amount of the transaction will be cleared. - Transactions that have already cleared, either partially or fully, cannot be - cleared again using this endpoint. + If `amount` is not set, the full amount of the transaction will be cleared. This + endpoint may be called multiple times against the same authorization to simulate + a multiple-completion scenario, with each call creating a separate clearing + event. """ diff --git a/tests/api_resources/test_cards.py b/tests/api_resources/test_cards.py index 1e289d72..e654f1ca 100644 --- a/tests/api_resources/test_cards.py +++ b/tests/api_resources/test_cards.py @@ -20,6 +20,8 @@ from lithic._utils import parse_datetime from lithic.pagination import SyncCursorPage, AsyncCursorPage +# pyright: reportDeprecated=false + base_url = os.environ.get("TEST_API_BASE_URL", "http://127.0.0.1:4010") @@ -326,18 +328,21 @@ def test_path_params_convert_physical(self, client: Lithic) -> None: @parametrize def test_method_embed(self, client: Lithic) -> None: - card = client.cards.embed( - embed_request="embed_request", - hmac="hmac", - ) + with pytest.warns(DeprecationWarning): + card = client.cards.embed( + embed_request="embed_request", + hmac="hmac", + ) + assert_matches_type(str, card, path=["response"]) @parametrize def test_raw_response_embed(self, client: Lithic) -> None: - response = client.cards.with_raw_response.embed( - embed_request="embed_request", - hmac="hmac", - ) + with pytest.warns(DeprecationWarning): + response = client.cards.with_raw_response.embed( + embed_request="embed_request", + hmac="hmac", + ) assert response.is_closed is True assert response.http_request.headers.get("X-Stainless-Lang") == "python" @@ -346,15 +351,16 @@ def test_raw_response_embed(self, client: Lithic) -> None: @parametrize def test_streaming_response_embed(self, client: Lithic) -> None: - with client.cards.with_streaming_response.embed( - embed_request="embed_request", - hmac="hmac", - ) as response: - assert not response.is_closed - assert response.http_request.headers.get("X-Stainless-Lang") == "python" + with pytest.warns(DeprecationWarning): + with client.cards.with_streaming_response.embed( + embed_request="embed_request", + hmac="hmac", + ) as response: + assert not response.is_closed + assert response.http_request.headers.get("X-Stainless-Lang") == "python" - card = response.parse() - assert_matches_type(str, card, path=["response"]) + card = response.parse() + assert_matches_type(str, card, path=["response"]) assert cast(Any, response.is_closed) is True @@ -1043,18 +1049,21 @@ async def test_path_params_convert_physical(self, async_client: AsyncLithic) -> @parametrize async def test_method_embed(self, async_client: AsyncLithic) -> None: - card = await async_client.cards.embed( - embed_request="embed_request", - hmac="hmac", - ) + with pytest.warns(DeprecationWarning): + card = await async_client.cards.embed( + embed_request="embed_request", + hmac="hmac", + ) + assert_matches_type(str, card, path=["response"]) @parametrize async def test_raw_response_embed(self, async_client: AsyncLithic) -> None: - response = await async_client.cards.with_raw_response.embed( - embed_request="embed_request", - hmac="hmac", - ) + with pytest.warns(DeprecationWarning): + response = await async_client.cards.with_raw_response.embed( + embed_request="embed_request", + hmac="hmac", + ) assert response.is_closed is True assert response.http_request.headers.get("X-Stainless-Lang") == "python" @@ -1063,15 +1072,16 @@ async def test_raw_response_embed(self, async_client: AsyncLithic) -> None: @parametrize async def test_streaming_response_embed(self, async_client: AsyncLithic) -> None: - async with async_client.cards.with_streaming_response.embed( - embed_request="embed_request", - hmac="hmac", - ) as response: - assert not response.is_closed - assert response.http_request.headers.get("X-Stainless-Lang") == "python" - - card = await response.parse() - assert_matches_type(str, card, path=["response"]) + with pytest.warns(DeprecationWarning): + async with async_client.cards.with_streaming_response.embed( + embed_request="embed_request", + hmac="hmac", + ) as response: + assert not response.is_closed + assert response.http_request.headers.get("X-Stainless-Lang") == "python" + + card = await response.parse() + assert_matches_type(str, card, path=["response"]) assert cast(Any, response.is_closed) is True