Skip to content

Commit faf60f2

Browse files
blackmad-cradleclaude
authored andcommitted
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 0ac7ff8 commit faf60f2

File tree

11 files changed

+412
-0
lines changed

11 files changed

+412
-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)