Skip to content

Commit 8f96bf8

Browse files
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>
1 parent 2ce9c79 commit 8f96bf8

File tree

11 files changed

+411
-0
lines changed

11 files changed

+411
-0
lines changed

src/workos/types/events/__init__.py

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
1+
from .api_key_payload import *
12
from .authentication_payload import *
23
from .connection_payload_with_legacy_fields import *
4+
from .connection_saml_certificate_payload import *
35
from .directory_group_membership_payload import *
46
from .directory_group_with_previous_attributes import *
57
from .directory_payload import *
@@ -8,6 +10,9 @@
810
from .event_model import *
911
from .event_type import *
1012
from .event import *
13+
from .flag_payload import *
1114
from .organization_domain_verification_failed_payload import *
15+
from .organization_role_payload import *
16+
from .permission_payload import *
1217
from .previous_attributes import *
1318
from .session_payload import *
Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
from typing import Literal, Optional, Sequence
2+
from workos.types.workos_model import WorkOSModel
3+
4+
5+
class ApiKeyOwner(WorkOSModel):
6+
id: str
7+
type: str
8+
9+
10+
class ApiKeyPayload(WorkOSModel):
11+
object: Literal["api_key"]
12+
id: str
13+
name: str
14+
owner: ApiKeyOwner
15+
obfuscated_value: str
16+
permissions: Sequence[str]
17+
last_used_at: Optional[str] = None
18+
created_at: str
19+
updated_at: str

src/workos/types/events/authentication_payload.py

Lines changed: 25 additions & 0 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

@@ -76,3 +93,11 @@ class AuthenticationSsoSucceededPayload(AuthenticationResultSucceeded):
7693
type: Literal["sso"]
7794
user_id: Optional[str] = None
7895
sso: Optional[AuthenticationSsoData] = None
96+
97+
98+
class AuthenticationRadarRiskDetectedPayload(AuthenticationResultCommon):
99+
auth_method: str
100+
action: str
101+
control: str
102+
blocklist_type: Optional[str] = None
103+
user_id: Optional[str] = None
Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
from typing import Literal
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: str
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: 123 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.events.api_key_payload import ApiKeyPayload
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
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[ApiKeyPayload]):
75+
event: Literal["api_key.created"]
76+
77+
78+
class ApiKeyRevokedEvent(EventModel[ApiKeyPayload]):
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,22 @@ 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+
239+
240+
class FlagUpdatedEvent(EventModel[FlagPayload]):
241+
event: Literal["flag.updated"]
242+
243+
169244
class InvitationAcceptedEvent(EventModel[InvitationCommon]):
170245
event: Literal["invitation.accepted"]
171246

@@ -174,6 +249,10 @@ class InvitationCreatedEvent(EventModel[InvitationCommon]):
174249
event: Literal["invitation.created"]
175250

176251

252+
class InvitationResentEvent(EventModel[InvitationCommon]):
253+
event: Literal["invitation.resent"]
254+
255+
177256
class InvitationRevokedEvent(EventModel[InvitationCommon]):
178257
event: Literal["invitation.revoked"]
179258

@@ -228,6 +307,18 @@ class OrganizationMembershipUpdatedEvent(EventModel[OrganizationMembership]):
228307
event: Literal["organization_membership.updated"]
229308

230309

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

@@ -236,6 +327,18 @@ class PasswordResetSucceededEvent(EventModel[PasswordResetCommon]):
236327
event: Literal["password_reset.succeeded"]
237328

238329

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

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

271374
Event = Annotated[
272375
Union[
376+
ApiKeyCreatedEvent,
377+
ApiKeyRevokedEvent,
378+
AuthenticationEmailVerificationFailedEvent,
273379
AuthenticationEmailVerificationSucceededEvent,
274380
AuthenticationMagicAuthFailedEvent,
275381
AuthenticationMagicAuthSucceededEvent,
382+
AuthenticationMfaFailedEvent,
276383
AuthenticationMfaSucceededEvent,
277384
AuthenticationOauthFailedEvent,
278385
AuthenticationOauthSucceededEvent,
386+
AuthenticationPasskeyFailedEvent,
387+
AuthenticationPasskeySucceededEvent,
279388
AuthenticationPasswordFailedEvent,
280389
AuthenticationPasswordSucceededEvent,
390+
AuthenticationRadarRiskDetectedEvent,
281391
AuthenticationSsoFailedEvent,
282392
AuthenticationSsoSucceededEvent,
283393
ConnectionActivatedEvent,
284394
ConnectionDeactivatedEvent,
285395
ConnectionDeletedEvent,
396+
ConnectionSamlCertificateRenewedEvent,
397+
ConnectionSamlCertificateRenewalRequiredEvent,
286398
DirectoryActivatedEvent,
287399
DirectoryDeletedEvent,
288400
DirectoryGroupCreatedEvent,
@@ -294,8 +406,13 @@ class UserUpdatedEvent(EventModel[User]):
294406
DirectoryUserAddedToGroupEvent,
295407
DirectoryUserRemovedFromGroupEvent,
296408
EmailVerificationCreatedEvent,
409+
FlagCreatedEvent,
410+
FlagDeletedEvent,
411+
FlagRuleUpdatedEvent,
412+
FlagUpdatedEvent,
297413
InvitationAcceptedEvent,
298414
InvitationCreatedEvent,
415+
InvitationResentEvent,
299416
InvitationRevokedEvent,
300417
MagicAuthCreatedEvent,
301418
OrganizationCreatedEvent,
@@ -309,8 +426,14 @@ class UserUpdatedEvent(EventModel[User]):
309426
OrganizationMembershipCreatedEvent,
310427
OrganizationMembershipDeletedEvent,
311428
OrganizationMembershipUpdatedEvent,
429+
OrganizationRoleCreatedEvent,
430+
OrganizationRoleDeletedEvent,
431+
OrganizationRoleUpdatedEvent,
312432
PasswordResetCreatedEvent,
313433
PasswordResetSucceededEvent,
434+
PermissionCreatedEvent,
435+
PermissionDeletedEvent,
436+
PermissionUpdatedEvent,
314437
RoleCreatedEvent,
315438
RoleDeletedEvent,
316439
RoleUpdatedEvent,

0 commit comments

Comments
 (0)