Skip to content

Commit c2b2517

Browse files
blackmad-cradleclaudegjtorikian
authored
Add missing event types (#543)
* Add 21 missing event and webhook types from WorkOS docs Add support for the following event types that were documented but missing from the SDK: - api_key.created, api_key.revoked - authentication.email_verification_failed, authentication.mfa_failed, authentication.passkey_failed, authentication.passkey_succeeded, authentication.radar_risk_detected - connection.saml_certificate_renewed, connection.saml_certificate_renewal_required - flag.created, flag.updated, flag.deleted, flag.rule_updated - invitation.resent - organization_role.created, organization_role.deleted, organization_role.updated - permission.created, permission.deleted, permission.updated New payload models: ApiKeyPayload, ConnectionSamlCertificate payloads, FlagPayload, OrganizationRolePayload, PermissionPayload. New auth payloads for email_verification_failed, mfa_failed, passkey, and radar_risk_detected. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com> * adjust requiredness * Add context field to flag.rule_updated event and webhook The backend flag.rule_updated event includes a context object (with actor, access_type, configured_targets, and previous_attributes) as a sibling of the data field. Without this, the context was silently dropped during deserialization. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com> * Make sso field required on SSO auth event payloads Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com> --------- Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com> Co-authored-by: Garen J. Torikian <gjtorikian@users.noreply.github.com>
1 parent 0ac7ff8 commit c2b2517

File tree

10 files changed

+453
-2
lines changed

10 files changed

+453
-2
lines changed

src/workos/types/events/__init__.py

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
from .authentication_payload import *
22
from .connection_payload_with_legacy_fields import *
3+
from .connection_saml_certificate_payload import *
34
from .directory_group_membership_payload import *
45
from .directory_group_with_previous_attributes import *
56
from .directory_payload import *
@@ -8,6 +9,9 @@
89
from .event_model import *
910
from .event_type import *
1011
from .event import *
12+
from .flag_payload import *
1113
from .organization_domain_verification_failed_payload import *
14+
from .organization_role_payload import *
15+
from .permission_payload import *
1216
from .previous_attributes import *
1317
from .session_payload import *

src/workos/types/events/authentication_payload.py

Lines changed: 28 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,10 @@ class AuthenticationEmailVerificationSucceededPayload(AuthenticationResultSuccee
2929
user_id: str
3030

3131

32+
class AuthenticationEmailVerificationFailedPayload(AuthenticationResultFailed):
33+
type: Literal["email_verification"]
34+
35+
3236
class AuthenticationMagicAuthFailedPayload(AuthenticationResultFailed):
3337
type: Literal["magic_auth"]
3438

@@ -43,6 +47,10 @@ class AuthenticationMfaSucceededPayload(AuthenticationResultSucceeded):
4347
user_id: Optional[str] = None
4448

4549

50+
class AuthenticationMfaFailedPayload(AuthenticationResultFailed):
51+
type: Literal["mfa"]
52+
53+
4654
class AuthenticationOauthFailedPayload(AuthenticationResultFailed):
4755
type: Literal["oauth"]
4856

@@ -52,6 +60,15 @@ class AuthenticationOauthSucceededPayload(AuthenticationResultSucceeded):
5260
user_id: Optional[str] = None
5361

5462

63+
class AuthenticationPasskeyFailedPayload(AuthenticationResultFailed):
64+
type: Literal["passkey"]
65+
66+
67+
class AuthenticationPasskeySucceededPayload(AuthenticationResultSucceeded):
68+
type: Literal["passkey"]
69+
user_id: str
70+
71+
5572
class AuthenticationPasswordFailedPayload(AuthenticationResultFailed):
5673
type: Literal["password"]
5774

@@ -69,10 +86,19 @@ class AuthenticationSsoData(WorkOSModel):
6986

7087
class AuthenticationSsoFailedPayload(AuthenticationResultFailed):
7188
type: Literal["sso"]
72-
sso: Optional[AuthenticationSsoData] = None
89+
sso: AuthenticationSsoData
7390

7491

7592
class AuthenticationSsoSucceededPayload(AuthenticationResultSucceeded):
7693
type: Literal["sso"]
7794
user_id: Optional[str] = None
78-
sso: Optional[AuthenticationSsoData] = None
95+
sso: AuthenticationSsoData
96+
97+
98+
class AuthenticationRadarRiskDetectedPayload(AuthenticationResultCommon):
99+
auth_method: str
100+
action: str
101+
control: Optional[str] = None
102+
blocklist_type: Optional[str] = None
103+
user_id: str
104+
email: str
Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
from typing import Literal, Optional
2+
from workos.types.workos_model import WorkOSModel
3+
4+
SamlCertificateType = Literal["ResponseSigning", "RequestSigning", "ResponseEncryption"]
5+
6+
7+
class SamlCertificateConnection(WorkOSModel):
8+
id: str
9+
organization_id: Optional[str] = None
10+
11+
12+
class SamlCertificate(WorkOSModel):
13+
certificate_type: SamlCertificateType
14+
expiry_date: str
15+
16+
17+
class SamlCertificateWithExpiry(SamlCertificate):
18+
is_expired: bool
19+
20+
21+
class ConnectionSamlCertificateRenewedPayload(WorkOSModel):
22+
connection: SamlCertificateConnection
23+
certificate: SamlCertificate
24+
renewed_at: str
25+
26+
27+
class ConnectionSamlCertificateRenewalRequiredPayload(WorkOSModel):
28+
connection: SamlCertificateConnection
29+
certificate: SamlCertificateWithExpiry
30+
days_until_expiry: int

src/workos/types/events/event.py

Lines changed: 124 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,21 +4,31 @@
44
from workos.types.user_management import OrganizationMembership, User
55
from workos.types.directory_sync.directory_group import DirectoryGroup
66
from workos.types.directory_sync.directory_user import DirectoryUser
7+
from workos.types.api_keys import ApiKey
78
from workos.types.events.authentication_payload import (
9+
AuthenticationEmailVerificationFailedPayload,
810
AuthenticationEmailVerificationSucceededPayload,
911
AuthenticationMagicAuthFailedPayload,
1012
AuthenticationMagicAuthSucceededPayload,
13+
AuthenticationMfaFailedPayload,
1114
AuthenticationMfaSucceededPayload,
1215
AuthenticationOauthFailedPayload,
1316
AuthenticationOauthSucceededPayload,
17+
AuthenticationPasskeyFailedPayload,
18+
AuthenticationPasskeySucceededPayload,
1419
AuthenticationPasswordFailedPayload,
1520
AuthenticationPasswordSucceededPayload,
21+
AuthenticationRadarRiskDetectedPayload,
1622
AuthenticationSsoFailedPayload,
1723
AuthenticationSsoSucceededPayload,
1824
)
1925
from workos.types.events.connection_payload_with_legacy_fields import (
2026
ConnectionPayloadWithLegacyFields,
2127
)
28+
from workos.types.events.connection_saml_certificate_payload import (
29+
ConnectionSamlCertificateRenewedPayload,
30+
ConnectionSamlCertificateRenewalRequiredPayload,
31+
)
2232
from workos.types.events.directory_group_membership_payload import (
2333
DirectoryGroupMembershipPayload,
2434
)
@@ -33,9 +43,12 @@
3343
DirectoryUserWithPreviousAttributes,
3444
)
3545
from workos.types.events.event_model import EventModel
46+
from workos.types.events.flag_payload import FlagPayload, FlagRuleUpdatedContext
3647
from workos.types.events.organization_domain_verification_failed_payload import (
3748
OrganizationDomainVerificationFailedPayload,
3849
)
50+
from workos.types.events.organization_role_payload import OrganizationRolePayload
51+
from workos.types.events.permission_payload import PermissionPayload
3952
from workos.types.events.session_payload import (
4053
SessionCreatedPayload,
4154
SessionRevokedPayload,
@@ -58,6 +71,20 @@
5871
# the event name is added to the EventType union type in event_type.py.
5972

6073

74+
class ApiKeyCreatedEvent(EventModel[ApiKey]):
75+
event: Literal["api_key.created"]
76+
77+
78+
class ApiKeyRevokedEvent(EventModel[ApiKey]):
79+
event: Literal["api_key.revoked"]
80+
81+
82+
class AuthenticationEmailVerificationFailedEvent(
83+
EventModel[AuthenticationEmailVerificationFailedPayload,]
84+
):
85+
event: Literal["authentication.email_verification_failed"]
86+
87+
6188
class AuthenticationEmailVerificationSucceededEvent(
6289
EventModel[AuthenticationEmailVerificationSucceededPayload,]
6390
):
@@ -76,6 +103,10 @@ class AuthenticationMagicAuthSucceededEvent(
76103
event: Literal["authentication.magic_auth_succeeded"]
77104

78105

106+
class AuthenticationMfaFailedEvent(EventModel[AuthenticationMfaFailedPayload]):
107+
event: Literal["authentication.mfa_failed"]
108+
109+
79110
class AuthenticationMfaSucceededEvent(EventModel[AuthenticationMfaSucceededPayload]):
80111
event: Literal["authentication.mfa_succeeded"]
81112

@@ -90,6 +121,16 @@ class AuthenticationOauthSucceededEvent(
90121
event: Literal["authentication.oauth_succeeded"]
91122

92123

124+
class AuthenticationPasskeyFailedEvent(EventModel[AuthenticationPasskeyFailedPayload]):
125+
event: Literal["authentication.passkey_failed"]
126+
127+
128+
class AuthenticationPasskeySucceededEvent(
129+
EventModel[AuthenticationPasskeySucceededPayload]
130+
):
131+
event: Literal["authentication.passkey_succeeded"]
132+
133+
93134
class AuthenticationPasswordFailedEvent(
94135
EventModel[AuthenticationPasswordFailedPayload]
95136
):
@@ -102,6 +143,12 @@ class AuthenticationPasswordSucceededEvent(
102143
event: Literal["authentication.password_succeeded"]
103144

104145

146+
class AuthenticationRadarRiskDetectedEvent(
147+
EventModel[AuthenticationRadarRiskDetectedPayload]
148+
):
149+
event: Literal["authentication.radar_risk_detected"]
150+
151+
105152
class AuthenticationSsoFailedEvent(EventModel[AuthenticationSsoFailedPayload]):
106153
event: Literal["authentication.sso_failed"]
107154

@@ -122,6 +169,18 @@ class ConnectionDeletedEvent(EventModel[Connection]):
122169
event: Literal["connection.deleted"]
123170

124171

172+
class ConnectionSamlCertificateRenewedEvent(
173+
EventModel[ConnectionSamlCertificateRenewedPayload]
174+
):
175+
event: Literal["connection.saml_certificate_renewed"]
176+
177+
178+
class ConnectionSamlCertificateRenewalRequiredEvent(
179+
EventModel[ConnectionSamlCertificateRenewalRequiredPayload]
180+
):
181+
event: Literal["connection.saml_certificate_renewal_required"]
182+
183+
125184
class DirectoryActivatedEvent(EventModel[DirectoryPayloadWithLegacyFieldsForEventsApi]):
126185
event: Literal["dsync.activated"]
127186

@@ -166,6 +225,23 @@ class EmailVerificationCreatedEvent(EventModel[EmailVerificationCommon]):
166225
event: Literal["email_verification.created"]
167226

168227

228+
class FlagCreatedEvent(EventModel[FlagPayload]):
229+
event: Literal["flag.created"]
230+
231+
232+
class FlagDeletedEvent(EventModel[FlagPayload]):
233+
event: Literal["flag.deleted"]
234+
235+
236+
class FlagRuleUpdatedEvent(EventModel[FlagPayload]):
237+
event: Literal["flag.rule_updated"]
238+
context: FlagRuleUpdatedContext
239+
240+
241+
class FlagUpdatedEvent(EventModel[FlagPayload]):
242+
event: Literal["flag.updated"]
243+
244+
169245
class InvitationAcceptedEvent(EventModel[InvitationCommon]):
170246
event: Literal["invitation.accepted"]
171247

@@ -174,6 +250,10 @@ class InvitationCreatedEvent(EventModel[InvitationCommon]):
174250
event: Literal["invitation.created"]
175251

176252

253+
class InvitationResentEvent(EventModel[InvitationCommon]):
254+
event: Literal["invitation.resent"]
255+
256+
177257
class InvitationRevokedEvent(EventModel[InvitationCommon]):
178258
event: Literal["invitation.revoked"]
179259

@@ -228,6 +308,18 @@ class OrganizationMembershipUpdatedEvent(EventModel[OrganizationMembership]):
228308
event: Literal["organization_membership.updated"]
229309

230310

311+
class OrganizationRoleCreatedEvent(EventModel[OrganizationRolePayload]):
312+
event: Literal["organization_role.created"]
313+
314+
315+
class OrganizationRoleDeletedEvent(EventModel[OrganizationRolePayload]):
316+
event: Literal["organization_role.deleted"]
317+
318+
319+
class OrganizationRoleUpdatedEvent(EventModel[OrganizationRolePayload]):
320+
event: Literal["organization_role.updated"]
321+
322+
231323
class PasswordResetCreatedEvent(EventModel[PasswordResetCommon]):
232324
event: Literal["password_reset.created"]
233325

@@ -236,6 +328,18 @@ class PasswordResetSucceededEvent(EventModel[PasswordResetCommon]):
236328
event: Literal["password_reset.succeeded"]
237329

238330

331+
class PermissionCreatedEvent(EventModel[PermissionPayload]):
332+
event: Literal["permission.created"]
333+
334+
335+
class PermissionDeletedEvent(EventModel[PermissionPayload]):
336+
event: Literal["permission.deleted"]
337+
338+
339+
class PermissionUpdatedEvent(EventModel[PermissionPayload]):
340+
event: Literal["permission.updated"]
341+
342+
239343
class RoleCreatedEvent(EventModel[EventRole]):
240344
event: Literal["role.created"]
241345

@@ -270,19 +374,28 @@ class UserUpdatedEvent(EventModel[User]):
270374

271375
Event = Annotated[
272376
Union[
377+
ApiKeyCreatedEvent,
378+
ApiKeyRevokedEvent,
379+
AuthenticationEmailVerificationFailedEvent,
273380
AuthenticationEmailVerificationSucceededEvent,
274381
AuthenticationMagicAuthFailedEvent,
275382
AuthenticationMagicAuthSucceededEvent,
383+
AuthenticationMfaFailedEvent,
276384
AuthenticationMfaSucceededEvent,
277385
AuthenticationOauthFailedEvent,
278386
AuthenticationOauthSucceededEvent,
387+
AuthenticationPasskeyFailedEvent,
388+
AuthenticationPasskeySucceededEvent,
279389
AuthenticationPasswordFailedEvent,
280390
AuthenticationPasswordSucceededEvent,
391+
AuthenticationRadarRiskDetectedEvent,
281392
AuthenticationSsoFailedEvent,
282393
AuthenticationSsoSucceededEvent,
283394
ConnectionActivatedEvent,
284395
ConnectionDeactivatedEvent,
285396
ConnectionDeletedEvent,
397+
ConnectionSamlCertificateRenewedEvent,
398+
ConnectionSamlCertificateRenewalRequiredEvent,
286399
DirectoryActivatedEvent,
287400
DirectoryDeletedEvent,
288401
DirectoryGroupCreatedEvent,
@@ -294,8 +407,13 @@ class UserUpdatedEvent(EventModel[User]):
294407
DirectoryUserAddedToGroupEvent,
295408
DirectoryUserRemovedFromGroupEvent,
296409
EmailVerificationCreatedEvent,
410+
FlagCreatedEvent,
411+
FlagDeletedEvent,
412+
FlagRuleUpdatedEvent,
413+
FlagUpdatedEvent,
297414
InvitationAcceptedEvent,
298415
InvitationCreatedEvent,
416+
InvitationResentEvent,
299417
InvitationRevokedEvent,
300418
MagicAuthCreatedEvent,
301419
OrganizationCreatedEvent,
@@ -309,8 +427,14 @@ class UserUpdatedEvent(EventModel[User]):
309427
OrganizationMembershipCreatedEvent,
310428
OrganizationMembershipDeletedEvent,
311429
OrganizationMembershipUpdatedEvent,
430+
OrganizationRoleCreatedEvent,
431+
OrganizationRoleDeletedEvent,
432+
OrganizationRoleUpdatedEvent,
312433
PasswordResetCreatedEvent,
313434
PasswordResetSucceededEvent,
435+
PermissionCreatedEvent,
436+
PermissionDeletedEvent,
437+
PermissionUpdatedEvent,
314438
RoleCreatedEvent,
315439
RoleDeletedEvent,
316440
RoleUpdatedEvent,

0 commit comments

Comments
 (0)