Skip to content

Commit 84ae573

Browse files
feat(api): add embed.session_generated and embed.viewed webhook events
1 parent 64b5358 commit 84ae573

16 files changed

Lines changed: 180 additions & 43 deletions

.stats.yml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
11
configured_endpoints: 213
2-
openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/lithic/lithic-09b6d1b85c657173562e9a372adc74551f07d476122003078e9168467329f792.yml
3-
openapi_spec_hash: a2b3a526310ceccd4ccb59ec428d246f
2+
openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/lithic/lithic-2d2600072500797474f0d7798c1a8b668bfbc4e0c6a8f076ca7b4cc7ad82058b.yml
3+
openapi_spec_hash: 7605eb6be77a3d150078916f0eb0e9ac
44
config_hash: 5bb913c05ebeb301ec925b16e75bb251

api.md

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1015,6 +1015,8 @@ from lithic.types import (
10151015
DigitalWalletTokenizationUpdatedWebhookEvent,
10161016
DisputeUpdatedWebhookEvent,
10171017
DisputeEvidenceUploadFailedWebhookEvent,
1018+
EmbedSessionGeneratedWebhookEvent,
1019+
EmbedViewedWebhookEvent,
10181020
ExternalBankAccountCreatedWebhookEvent,
10191021
ExternalBankAccountUpdatedWebhookEvent,
10201022
ExternalPaymentCreatedWebhookEvent,

src/lithic/resources/cards/cards.py

Lines changed: 25 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
import json
77
import base64
88
import hashlib
9+
import typing_extensions
910
from typing import Any, Union, cast
1011
from datetime import datetime, timezone, timedelta
1112
from typing_extensions import Literal
@@ -675,6 +676,7 @@ def convert_physical(
675676
cast_to=Card,
676677
)
677678

679+
@typing_extensions.deprecated("deprecated")
678680
def embed(
679681
self,
680682
*,
@@ -688,6 +690,9 @@ def embed(
688690
timeout: float | httpx.Timeout | None | NotGiven = not_given,
689691
) -> str:
690692
"""
693+
**Deprecated.** Use the modern embedded card flow instead: create a session with
694+
`POST /v1/cards/{card_token}/embed` and render it via `GET /v1/embed`.
695+
691696
Handling full card PANs and CVV codes requires that you comply with the Payment
692697
Card Industry Data Security Standards (PCI DSS). Some clients choose to reduce
693698
their compliance obligations by leveraging our embedded card UI solution
@@ -1903,6 +1908,7 @@ async def convert_physical(
19031908
cast_to=Card,
19041909
)
19051910

1911+
@typing_extensions.deprecated("deprecated")
19061912
async def embed(
19071913
self,
19081914
*,
@@ -1916,6 +1922,9 @@ async def embed(
19161922
timeout: float | httpx.Timeout | None | NotGiven = not_given,
19171923
) -> str:
19181924
"""
1925+
**Deprecated.** Use the modern embedded card flow instead: create a session with
1926+
`POST /v1/cards/{card_token}/embed` and render it via `GET /v1/embed`.
1927+
19191928
Handling full card PANs and CVV codes requires that you comply with the Payment
19201929
Card Industry Data Security Standards (PCI DSS). Some clients choose to reduce
19211930
their compliance obligations by leveraging our embedded card UI solution
@@ -2539,8 +2548,10 @@ def __init__(self, cards: Cards) -> None:
25392548
self.convert_physical = _legacy_response.to_raw_response_wrapper(
25402549
cards.convert_physical,
25412550
)
2542-
self.embed = _legacy_response.to_raw_response_wrapper(
2543-
cards.embed,
2551+
self.embed = ( # pyright: ignore[reportDeprecated]
2552+
_legacy_response.to_raw_response_wrapper(
2553+
cards.embed, # pyright: ignore[reportDeprecated],
2554+
)
25442555
)
25452556
self.provision = _legacy_response.to_raw_response_wrapper(
25462557
cards.provision,
@@ -2592,8 +2603,10 @@ def __init__(self, cards: AsyncCards) -> None:
25922603
self.convert_physical = _legacy_response.async_to_raw_response_wrapper(
25932604
cards.convert_physical,
25942605
)
2595-
self.embed = _legacy_response.async_to_raw_response_wrapper(
2596-
cards.embed,
2606+
self.embed = ( # pyright: ignore[reportDeprecated]
2607+
_legacy_response.async_to_raw_response_wrapper(
2608+
cards.embed, # pyright: ignore[reportDeprecated],
2609+
)
25972610
)
25982611
self.provision = _legacy_response.async_to_raw_response_wrapper(
25992612
cards.provision,
@@ -2645,8 +2658,10 @@ def __init__(self, cards: Cards) -> None:
26452658
self.convert_physical = to_streamed_response_wrapper(
26462659
cards.convert_physical,
26472660
)
2648-
self.embed = to_streamed_response_wrapper(
2649-
cards.embed,
2661+
self.embed = ( # pyright: ignore[reportDeprecated]
2662+
to_streamed_response_wrapper(
2663+
cards.embed, # pyright: ignore[reportDeprecated],
2664+
)
26502665
)
26512666
self.provision = to_streamed_response_wrapper(
26522667
cards.provision,
@@ -2698,8 +2713,10 @@ def __init__(self, cards: AsyncCards) -> None:
26982713
self.convert_physical = async_to_streamed_response_wrapper(
26992714
cards.convert_physical,
27002715
)
2701-
self.embed = async_to_streamed_response_wrapper(
2702-
cards.embed,
2716+
self.embed = ( # pyright: ignore[reportDeprecated]
2717+
async_to_streamed_response_wrapper(
2718+
cards.embed, # pyright: ignore[reportDeprecated],
2719+
)
27032720
)
27042721
self.provision = async_to_streamed_response_wrapper(
27052722
cards.provision,

src/lithic/resources/events/events.py

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -140,6 +140,8 @@ def list(
140140
"dispute_transaction.created",
141141
"dispute_transaction.updated",
142142
"dispute.updated",
143+
"embed.session_generated",
144+
"embed.viewed",
143145
"external_bank_account.created",
144146
"external_bank_account.updated",
145147
"external_payment.created",
@@ -421,6 +423,8 @@ def list(
421423
"dispute_transaction.created",
422424
"dispute_transaction.updated",
423425
"dispute.updated",
426+
"embed.session_generated",
427+
"embed.viewed",
424428
"external_bank_account.created",
425429
"external_bank_account.updated",
426430
"external_payment.created",

src/lithic/resources/events/subscriptions.py

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -92,6 +92,8 @@ def create(
9292
"dispute_transaction.created",
9393
"dispute_transaction.updated",
9494
"dispute.updated",
95+
"embed.session_generated",
96+
"embed.viewed",
9597
"external_bank_account.created",
9698
"external_bank_account.updated",
9799
"external_payment.created",
@@ -245,6 +247,8 @@ def update(
245247
"dispute_transaction.created",
246248
"dispute_transaction.updated",
247249
"dispute.updated",
250+
"embed.session_generated",
251+
"embed.viewed",
248252
"external_bank_account.created",
249253
"external_bank_account.updated",
250254
"external_payment.created",
@@ -721,6 +725,8 @@ def send_simulated_example(
721725
"dispute_transaction.created",
722726
"dispute_transaction.updated",
723727
"dispute.updated",
728+
"embed.session_generated",
729+
"embed.viewed",
724730
"external_bank_account.created",
725731
"external_bank_account.updated",
726732
"external_payment.created",
@@ -851,6 +857,8 @@ async def create(
851857
"dispute_transaction.created",
852858
"dispute_transaction.updated",
853859
"dispute.updated",
860+
"embed.session_generated",
861+
"embed.viewed",
854862
"external_bank_account.created",
855863
"external_bank_account.updated",
856864
"external_payment.created",
@@ -1004,6 +1012,8 @@ async def update(
10041012
"dispute_transaction.created",
10051013
"dispute_transaction.updated",
10061014
"dispute.updated",
1015+
"embed.session_generated",
1016+
"embed.viewed",
10071017
"external_bank_account.created",
10081018
"external_bank_account.updated",
10091019
"external_payment.created",
@@ -1480,6 +1490,8 @@ async def send_simulated_example(
14801490
"dispute_transaction.created",
14811491
"dispute_transaction.updated",
14821492
"dispute.updated",
1493+
"embed.session_generated",
1494+
"embed.viewed",
14831495
"external_bank_account.created",
14841496
"external_bank_account.updated",
14851497
"external_payment.created",

src/lithic/types/__init__.py

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -119,6 +119,7 @@
119119
from .card_renewed_webhook_event import CardRenewedWebhookEvent as CardRenewedWebhookEvent
120120
from .card_shipped_webhook_event import CardShippedWebhookEvent as CardShippedWebhookEvent
121121
from .card_updated_webhook_event import CardUpdatedWebhookEvent as CardUpdatedWebhookEvent
122+
from .embed_viewed_webhook_event import EmbedViewedWebhookEvent as EmbedViewedWebhookEvent
122123
from .event_list_attempts_params import EventListAttemptsParams as EventListAttemptsParams
123124
from .settlement_summary_details import SettlementSummaryDetails as SettlementSummaryDetails
124125
from .transfer_limit_list_params import TransferLimitListParams as TransferLimitListParams
@@ -203,6 +204,9 @@
203204
from .claim_document_uploaded_webhook_event import (
204205
ClaimDocumentUploadedWebhookEvent as ClaimDocumentUploadedWebhookEvent,
205206
)
207+
from .embed_session_generated_webhook_event import (
208+
EmbedSessionGeneratedWebhookEvent as EmbedSessionGeneratedWebhookEvent,
209+
)
206210
from .external_bank_account_create_response import (
207211
ExternalBankAccountCreateResponse as ExternalBankAccountCreateResponse,
208212
)
Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
# File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.
2+
3+
from typing_extensions import Literal
4+
5+
from .._models import BaseModel
6+
7+
__all__ = ["EmbedSessionGeneratedWebhookEvent", "DeviceDetails"]
8+
9+
10+
class DeviceDetails(BaseModel):
11+
"""Details about the request that generated the embed session"""
12+
13+
ip_address: str
14+
"""The IP address recorded for the request that generated the event"""
15+
16+
17+
class EmbedSessionGeneratedWebhookEvent(BaseModel):
18+
account_token: str
19+
"""The token of the account associated with the card"""
20+
21+
card_token: str
22+
"""The token of the card associated with the embed session"""
23+
24+
device_details: DeviceDetails
25+
"""Details about the request that generated the embed session"""
26+
27+
event_type: Literal["embed.session_generated"]
28+
"""The type of event"""
29+
30+
session_id: str
31+
"""The identifier shared by webhook events for the same embed session."""
32+
33+
session_type: Literal["CARD_EMBED", "PIN_SETTING_EMBED"]
34+
"""The type of embed session that was generated"""
Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
# File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.
2+
3+
from typing_extensions import Literal
4+
5+
from .._models import BaseModel
6+
7+
__all__ = ["EmbedViewedWebhookEvent", "DeviceDetails"]
8+
9+
10+
class DeviceDetails(BaseModel):
11+
"""Details about the request that revealed the card detail"""
12+
13+
ip_address: str
14+
"""The IP address recorded for the request that generated the event"""
15+
16+
17+
class EmbedViewedWebhookEvent(BaseModel):
18+
account_token: str
19+
"""The token of the account associated with the card"""
20+
21+
card_token: str
22+
"""The token of the card whose details were revealed"""
23+
24+
device_details: DeviceDetails
25+
"""Details about the request that revealed the card detail"""
26+
27+
embed_type: Literal["PAN", "CVV", "EXP_MONTH", "EXP_YEAR"]
28+
"""The type of card detail that was revealed"""
29+
30+
event_type: Literal["embed.viewed"]
31+
"""The type of event"""
32+
33+
session_id: str
34+
"""The identifier shared by webhook events for the same embed session."""

src/lithic/types/event.py

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -54,6 +54,8 @@ class Event(BaseModel):
5454
"dispute_transaction.created",
5555
"dispute_transaction.updated",
5656
"dispute.updated",
57+
"embed.session_generated",
58+
"embed.viewed",
5759
"external_bank_account.created",
5860
"external_bank_account.updated",
5961
"external_payment.created",
@@ -164,6 +166,10 @@ class Event(BaseModel):
164166
This event is not emitted for Managed Disputes. Use
165167
`dispute_transaction.created` and `dispute_transaction.updated` instead.
166168
169+
- embed.session_generated: Occurs when a card embed session is successfully
170+
generated.
171+
- embed.viewed: Occurs when a card detail is successfully revealed through an
172+
embed.
167173
- external_bank_account.created: Occurs when an external bank account is
168174
created.
169175
- external_bank_account.updated: Occurs when an external bank account is

src/lithic/types/event_list_params.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -64,6 +64,8 @@ class EventListParams(TypedDict, total=False):
6464
"dispute_transaction.created",
6565
"dispute_transaction.updated",
6666
"dispute.updated",
67+
"embed.session_generated",
68+
"embed.viewed",
6769
"external_bank_account.created",
6870
"external_bank_account.updated",
6971
"external_payment.created",

0 commit comments

Comments
 (0)