@lessly/sdk-app 17.0.0 → 17.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (53) hide show
  1. package/dist/analytics/index.d.cts +1 -1
  2. package/dist/analytics/index.d.ts +1 -1
  3. package/dist/brain/index.cjs +0 -5
  4. package/dist/brain/index.cjs.map +1 -1
  5. package/dist/brain/index.d.cts +2 -6
  6. package/dist/brain/index.d.ts +2 -6
  7. package/dist/brain/index.js +1 -5
  8. package/dist/brain/index.js.map +1 -1
  9. package/dist/{client.gen-DYlVp4ZF.d.cts → client.gen-BhAPseKn.d.cts} +3043 -232
  10. package/dist/{client.gen-DYlVp4ZF.d.ts → client.gen-BhAPseKn.d.ts} +3043 -232
  11. package/dist/consent/index.d.cts +1 -1
  12. package/dist/consent/index.d.ts +1 -1
  13. package/dist/deployment/index.d.cts +1 -1
  14. package/dist/deployment/index.d.ts +1 -1
  15. package/dist/index.cjs +846 -13
  16. package/dist/index.cjs.map +1 -1
  17. package/dist/index.d.cts +1 -1
  18. package/dist/index.d.ts +1 -1
  19. package/dist/index.js +846 -13
  20. package/dist/index.js.map +1 -1
  21. package/dist/mail/index.d.cts +2 -2
  22. package/dist/mail/index.d.ts +2 -2
  23. package/dist/organization/index.d.cts +1 -1
  24. package/dist/organization/index.d.ts +1 -1
  25. package/dist/playground/index.cjs +66 -0
  26. package/dist/playground/index.cjs.map +1 -0
  27. package/dist/playground/index.d.cts +52 -0
  28. package/dist/playground/index.d.ts +52 -0
  29. package/dist/playground/index.js +53 -0
  30. package/dist/playground/index.js.map +1 -0
  31. package/dist/realtime/index.d.cts +1 -1
  32. package/dist/realtime/index.d.ts +1 -1
  33. package/dist/tracking/index.d.cts +1 -1
  34. package/dist/tracking/index.d.ts +1 -1
  35. package/dist/users/index.cjs +216 -0
  36. package/dist/users/index.cjs.map +1 -0
  37. package/dist/users/index.d.cts +172 -0
  38. package/dist/users/index.d.ts +172 -0
  39. package/dist/users/index.js +173 -0
  40. package/dist/users/index.js.map +1 -0
  41. package/dist/waitlist/index.d.cts +1 -1
  42. package/dist/waitlist/index.d.ts +1 -1
  43. package/package.json +12 -2
  44. package/src/gen/bindings.gen.ts +846 -13
  45. package/src/gen/brain/index.ts +1 -1
  46. package/src/gen/brain/queryOptions.gen.ts +0 -7
  47. package/src/gen/client.gen.ts +210 -5
  48. package/src/gen/manifest.gen.ts +1 -1
  49. package/src/gen/playground/index.ts +3 -0
  50. package/src/gen/playground/queryOptions.gen.ts +86 -0
  51. package/src/gen/types.gen.ts +2924 -96
  52. package/src/gen/users/index.ts +3 -0
  53. package/src/gen/users/queryOptions.gen.ts +268 -0
@@ -1028,98 +1028,6 @@ snapshotId: string
1028
1028
  preRestoreSnapshotId: (string | null)
1029
1029
  } | null)
1030
1030
 
1031
- export interface BrainUsageReportInput {
1032
- /**
1033
- * How many UTC days of this product's ledger to return, ending today (default 30, max 90)
1034
- */
1035
- days?: number
1036
- }
1037
-
1038
- export interface BrainUsageReportOutput {
1039
- note: string
1040
- /**
1041
- * Brain's own ledger, for THIS product only
1042
- */
1043
- product: {
1044
- /**
1045
- * Inclusive UTC end of the window (today), YYYY-MM-DD
1046
- */
1047
- to: string
1048
- /**
1049
- * The window actually used, after clamping
1050
- */
1051
- days: number
1052
- /**
1053
- * Inclusive UTC start of the window, YYYY-MM-DD
1054
- */
1055
- from: string
1056
- rows: {
1057
- /**
1058
- * 'sync' | 'batch'; '' when the push carried none
1059
- */
1060
- mode: string
1061
- /**
1062
- * Manifest meter slug, e.g. llm-tokens
1063
- */
1064
- meter: string
1065
- /**
1066
- * Model dimension; '' when the push carried none
1067
- */
1068
- model: string
1069
- /**
1070
- * How many record() calls landed in this slice
1071
- */
1072
- events: number
1073
- /**
1074
- * Tokens we metered for this slice, delivered or not
1075
- */
1076
- tokens: number
1077
- /**
1078
- * Purpose dimension; '' when the push carried none
1079
- */
1080
- purpose: string
1081
- /**
1082
- * UTC calendar day, YYYY-MM-DD
1083
- */
1084
- usage_date: string
1085
- /**
1086
- * Of those events, how many billing did not accept
1087
- */
1088
- delivery_failed: number
1089
- }[]
1090
- /**
1091
- * The rows rolled up per meter across the whole window
1092
- */
1093
- totals: {
1094
- meter: string
1095
- events: number
1096
- tokens: number
1097
- delivery_failed: number
1098
- }[]
1099
- product_id: string
1100
- }
1101
- /**
1102
- * The platform billing aggregate for the whole ORG; null if it could not be read
1103
- */
1104
- platform: ({
1105
- plan: string
1106
- scope: "org"
1107
- meters: {
1108
- unit?: string
1109
- used?: number
1110
- limit?: (number | null)
1111
- remaining?: (number | null)
1112
- unlimited?: boolean
1113
- meter_slug: string
1114
- }[]
1115
- org_id: string
1116
- } | null)
1117
- /**
1118
- * Why the platform aggregate is null; null when it was read successfully
1119
- */
1120
- platform_error: (string | null)
1121
- }
1122
-
1123
1031
  export interface ConsentConfigCookieDomainUpsertInput {
1124
1032
  cookieDomain: ("" | null | string)
1125
1033
  }
@@ -2719,7 +2627,7 @@ baseEnvironmentId: (string | null)
2719
2627
  }
2720
2628
 
2721
2629
  export interface DeploymentEventsListByEnvironmentInput {
2722
- type?: ("deployment.queued" | "deployment.build.started" | "deployment.build.succeeded" | "deployment.build.failed" | "deployment.deploying" | "deployment.variable.ignored" | "deployment.healthcheck.passed" | "deployment.healthcheck.failed" | "deployment.healthy" | "deployment.failed" | "deployment.replaced" | "deployment.release.started" | "deployment.release.log" | "deployment.release.succeeded" | "deployment.release.failed" | "replica.restarted" | "service.scaled" | "service.restarted" | "service.restart-failed" | "domain.verified" | "domain.tls.issued" | "domain.tls.failed" | "domain.www-tls.issued" | "domain.www-tls.failed" | "domain.routing.active" | "domain.routing.failed" | "domain.removed" | "domain.governance.mirror-failed" | "service.slept" | "service.woke" | "service.wake_failed" | "service.sleep-enabled" | "service.sleep-disabled" | "service.sleep-enable-failed")
2630
+ type?: ("deployment.queued" | "deployment.build.started" | "deployment.build.succeeded" | "deployment.build.failed" | "deployment.deploying" | "deployment.variable.ignored" | "deployment.healthcheck.passed" | "deployment.healthcheck.failed" | "deployment.healthy" | "deployment.failed" | "deployment.replaced" | "deployment.release.started" | "deployment.release.log" | "deployment.release.succeeded" | "deployment.release.failed" | "replica.restarted" | "service.scaled" | "service.restarted" | "service.restart-failed" | "domain.verified" | "domain.tls.issued" | "domain.tls.failed" | "domain.www-tls.issued" | "domain.www-tls.failed" | "domain.routing.active" | "domain.routing.failed" | "domain.removed" | "domain.governance.mirror-failed" | "service.slept" | "service.woke" | "service.wake_failed" | "service.sleep-enabled" | "service.sleep-disabled")
2723
2631
  limit?: number
2724
2632
  since?: string
2725
2633
  until?: string
@@ -2728,7 +2636,7 @@ environmentId: string
2728
2636
 
2729
2637
  export type DeploymentEventsListByEnvironmentOutput = {
2730
2638
  id: string
2731
- type: ("deployment.queued" | "deployment.build.started" | "deployment.build.succeeded" | "deployment.build.failed" | "deployment.deploying" | "deployment.variable.ignored" | "deployment.healthcheck.passed" | "deployment.healthcheck.failed" | "deployment.healthy" | "deployment.failed" | "deployment.replaced" | "deployment.release.started" | "deployment.release.log" | "deployment.release.succeeded" | "deployment.release.failed" | "replica.restarted" | "service.scaled" | "service.restarted" | "service.restart-failed" | "domain.verified" | "domain.tls.issued" | "domain.tls.failed" | "domain.www-tls.issued" | "domain.www-tls.failed" | "domain.routing.active" | "domain.routing.failed" | "domain.removed" | "domain.governance.mirror-failed" | "service.slept" | "service.woke" | "service.wake_failed" | "service.sleep-enabled" | "service.sleep-disabled" | "service.sleep-enable-failed")
2639
+ type: ("deployment.queued" | "deployment.build.started" | "deployment.build.succeeded" | "deployment.build.failed" | "deployment.deploying" | "deployment.variable.ignored" | "deployment.healthcheck.passed" | "deployment.healthcheck.failed" | "deployment.healthy" | "deployment.failed" | "deployment.replaced" | "deployment.release.started" | "deployment.release.log" | "deployment.release.succeeded" | "deployment.release.failed" | "replica.restarted" | "service.scaled" | "service.restarted" | "service.restart-failed" | "domain.verified" | "domain.tls.issued" | "domain.tls.failed" | "domain.www-tls.issued" | "domain.www-tls.failed" | "domain.routing.active" | "domain.routing.failed" | "domain.removed" | "domain.governance.mirror-failed" | "service.slept" | "service.woke" | "service.wake_failed" | "service.sleep-enabled" | "service.sleep-disabled")
2732
2640
  payload: {
2733
2641
  [k: string]: unknown
2734
2642
  }
@@ -2741,7 +2649,7 @@ environmentId: (string | null)
2741
2649
  }[]
2742
2650
 
2743
2651
  export interface DeploymentEventsListByServiceInput {
2744
- type?: ("deployment.queued" | "deployment.build.started" | "deployment.build.succeeded" | "deployment.build.failed" | "deployment.deploying" | "deployment.variable.ignored" | "deployment.healthcheck.passed" | "deployment.healthcheck.failed" | "deployment.healthy" | "deployment.failed" | "deployment.replaced" | "deployment.release.started" | "deployment.release.log" | "deployment.release.succeeded" | "deployment.release.failed" | "replica.restarted" | "service.scaled" | "service.restarted" | "service.restart-failed" | "domain.verified" | "domain.tls.issued" | "domain.tls.failed" | "domain.www-tls.issued" | "domain.www-tls.failed" | "domain.routing.active" | "domain.routing.failed" | "domain.removed" | "domain.governance.mirror-failed" | "service.slept" | "service.woke" | "service.wake_failed" | "service.sleep-enabled" | "service.sleep-disabled" | "service.sleep-enable-failed")
2652
+ type?: ("deployment.queued" | "deployment.build.started" | "deployment.build.succeeded" | "deployment.build.failed" | "deployment.deploying" | "deployment.variable.ignored" | "deployment.healthcheck.passed" | "deployment.healthcheck.failed" | "deployment.healthy" | "deployment.failed" | "deployment.replaced" | "deployment.release.started" | "deployment.release.log" | "deployment.release.succeeded" | "deployment.release.failed" | "replica.restarted" | "service.scaled" | "service.restarted" | "service.restart-failed" | "domain.verified" | "domain.tls.issued" | "domain.tls.failed" | "domain.www-tls.issued" | "domain.www-tls.failed" | "domain.routing.active" | "domain.routing.failed" | "domain.removed" | "domain.governance.mirror-failed" | "service.slept" | "service.woke" | "service.wake_failed" | "service.sleep-enabled" | "service.sleep-disabled")
2745
2653
  limit?: number
2746
2654
  since?: string
2747
2655
  until?: string
@@ -2751,7 +2659,7 @@ deploymentId?: string
2751
2659
 
2752
2660
  export type DeploymentEventsListByServiceOutput = {
2753
2661
  id: string
2754
- type: ("deployment.queued" | "deployment.build.started" | "deployment.build.succeeded" | "deployment.build.failed" | "deployment.deploying" | "deployment.variable.ignored" | "deployment.healthcheck.passed" | "deployment.healthcheck.failed" | "deployment.healthy" | "deployment.failed" | "deployment.replaced" | "deployment.release.started" | "deployment.release.log" | "deployment.release.succeeded" | "deployment.release.failed" | "replica.restarted" | "service.scaled" | "service.restarted" | "service.restart-failed" | "domain.verified" | "domain.tls.issued" | "domain.tls.failed" | "domain.www-tls.issued" | "domain.www-tls.failed" | "domain.routing.active" | "domain.routing.failed" | "domain.removed" | "domain.governance.mirror-failed" | "service.slept" | "service.woke" | "service.wake_failed" | "service.sleep-enabled" | "service.sleep-disabled" | "service.sleep-enable-failed")
2662
+ type: ("deployment.queued" | "deployment.build.started" | "deployment.build.succeeded" | "deployment.build.failed" | "deployment.deploying" | "deployment.variable.ignored" | "deployment.healthcheck.passed" | "deployment.healthcheck.failed" | "deployment.healthy" | "deployment.failed" | "deployment.replaced" | "deployment.release.started" | "deployment.release.log" | "deployment.release.succeeded" | "deployment.release.failed" | "replica.restarted" | "service.scaled" | "service.restarted" | "service.restart-failed" | "domain.verified" | "domain.tls.issued" | "domain.tls.failed" | "domain.www-tls.issued" | "domain.www-tls.failed" | "domain.routing.active" | "domain.routing.failed" | "domain.removed" | "domain.governance.mirror-failed" | "service.slept" | "service.woke" | "service.wake_failed" | "service.sleep-enabled" | "service.sleep-disabled")
2755
2663
  payload: {
2756
2664
  [k: string]: unknown
2757
2665
  }
@@ -12588,6 +12496,7 @@ export interface OrganizationAuthMeOutput {
12588
12496
  email: string
12589
12497
  identityId: string
12590
12498
  displayName: string
12499
+ identityType: string
12591
12500
  }
12592
12501
 
12593
12502
  export interface OrganizationBindingsListInput {
@@ -13476,6 +13385,226 @@ name: string
13476
13385
  activeProductId: (string | null)
13477
13386
  }
13478
13387
 
13388
+ export interface PlaygroundAnalyticsOverviewInput {
13389
+ /**
13390
+ * Max records per entity in recent[]; omit for the endpoint default
13391
+ */
13392
+ limit?: number
13393
+ }
13394
+
13395
+ export interface PlaygroundAnalyticsOverviewOutput {
13396
+ ok: boolean
13397
+ minted: boolean
13398
+ overview?: unknown
13399
+ http_status: number
13400
+ }
13401
+
13402
+ export interface PlaygroundBillingEntitlementsInput {
13403
+
13404
+ }
13405
+
13406
+ export interface PlaygroundBillingEntitlementsOutput {
13407
+ ok: boolean
13408
+ minted: boolean
13409
+ http_status: number
13410
+ entitlements?: unknown
13411
+ }
13412
+
13413
+ export interface PlaygroundBillingRecordUsageInput {
13414
+ /**
13415
+ * Quantity of events to record against playground-events (SUM); defaults to 1
13416
+ */
13417
+ value?: number
13418
+ }
13419
+
13420
+ export interface PlaygroundBillingRecordUsageOutput {
13421
+ minted: boolean
13422
+ accepted: (number | null)
13423
+ recorded: boolean
13424
+ duplicates: (number | null)
13425
+ http_status: number
13426
+ }
13427
+
13428
+ export interface PlaygroundClickupCreateTaskInput {
13429
+ /**
13430
+ * Task title; defaults to a fixture label
13431
+ */
13432
+ name?: string
13433
+ /**
13434
+ * ClickUp list id; falls back to CLICKUP_TEST_LIST_ID
13435
+ */
13436
+ listId?: string
13437
+ }
13438
+
13439
+ export interface PlaygroundClickupCreateTaskOutput {
13440
+ minted: boolean
13441
+ task_id: (string | null)
13442
+ list_status: number
13443
+ vend_status: number
13444
+ clickup_status: number
13445
+ installation_count: number
13446
+ }
13447
+
13448
+ export interface PlaygroundClickupGetLastWebhookInput {
13449
+
13450
+ }
13451
+
13452
+ export type PlaygroundClickupGetLastWebhookOutput = ({
13453
+ payload: string
13454
+ event_id: string
13455
+ provider: string
13456
+ verified: boolean
13457
+ product_id: string
13458
+ occurred_at: string
13459
+ connector_id: string
13460
+ clickup_event: (string | null)
13461
+ receipt_count: number
13462
+ } | {
13463
+ found: false
13464
+ })
13465
+
13466
+ export interface PlaygroundClickupGetOverviewInput {
13467
+
13468
+ }
13469
+
13470
+ export interface PlaygroundClickupGetOverviewOutput {
13471
+ team: ({
13472
+ teamId: string
13473
+ teamName: string
13474
+ } | null)
13475
+ lists: PlaygroundClickupGetOverviewOutputItems[]
13476
+ tasks: {
13477
+ id: string
13478
+ name: string
13479
+ status: (string | null)
13480
+ }[]
13481
+ minted: boolean
13482
+ spaces: PlaygroundClickupGetOverviewOutputItems[]
13483
+ list_status: number
13484
+ vend_status: number
13485
+ lists_status: number
13486
+ tasks_status: number
13487
+ spaces_status: number
13488
+ folders_status: number
13489
+ installation_count: number
13490
+ }
13491
+ export interface PlaygroundClickupGetOverviewOutputItems {
13492
+ id: string
13493
+ name: string
13494
+ }
13495
+
13496
+ export interface PlaygroundGdriveGetLastChangeInput {
13497
+
13498
+ }
13499
+
13500
+ export type PlaygroundGdriveGetLastChangeOutput = ({
13501
+ file_id: string
13502
+ removed: boolean
13503
+ file_name: (string | null)
13504
+ mime_type: (string | null)
13505
+ product_id: string
13506
+ occurred_at: string
13507
+ connector_id: string
13508
+ resource_state: string
13509
+ } | {
13510
+ found: false
13511
+ })
13512
+
13513
+ export interface PlaygroundGdriveReadFileInput {
13514
+ /**
13515
+ * Drive file id; falls back to GDRIVE_TEST_FILE_ID, then the first picked file
13516
+ */
13517
+ fileId?: string
13518
+ }
13519
+
13520
+ export interface PlaygroundGdriveReadFileOutput {
13521
+ minted: boolean
13522
+ file_id: (string | null)
13523
+ file_name: (string | null)
13524
+ mime_type: (string | null)
13525
+ file_count: number
13526
+ get_status: number
13527
+ list_status: number
13528
+ vend_status: number
13529
+ content_bytes: (number | null)
13530
+ }
13531
+
13532
+ export interface PlaygroundGoogleadsReadCustomerInput {
13533
+
13534
+ }
13535
+
13536
+ export interface PlaygroundGoogleadsReadCustomerOutput {
13537
+ minted: boolean
13538
+ vended: boolean
13539
+ customer_id: (string | null)
13540
+ vend_status: number
13541
+ result_count: number
13542
+ search_status: number
13543
+ login_customer_id: (string | null)
13544
+ }
13545
+
13546
+ export interface PlaygroundLifecycleGetStateInput {
13547
+
13548
+ }
13549
+
13550
+ export interface PlaygroundLifecycleGetStateOutput {
13551
+ blocked: boolean
13552
+ archived: boolean
13553
+ productId: string
13554
+ lastBlockTransition: ({
13555
+ eventId: string
13556
+ eventName: string
13557
+ productId: string
13558
+ occurredAt: string
13559
+ recordedAt: string
13560
+ receiptCount: number
13561
+ organizationId: string
13562
+ cascadedFromOrg: boolean
13563
+ } | null)
13564
+ lastArchiveTransition: ({
13565
+ eventId: string
13566
+ eventName: string
13567
+ productId: string
13568
+ occurredAt: string
13569
+ recordedAt: string
13570
+ receiptCount: number
13571
+ organizationId: string
13572
+ cascadedFromOrg: boolean
13573
+ } | null)
13574
+ }
13575
+
13576
+ export interface PlaygroundLifecycleListEventsInput {
13577
+
13578
+ }
13579
+
13580
+ export type PlaygroundLifecycleListEventsOutput = {
13581
+ eventId: string
13582
+ eventName: string
13583
+ productId: string
13584
+ occurredAt: string
13585
+ recordedAt: string
13586
+ receiptCount: number
13587
+ organizationId: string
13588
+ cascadedFromOrg: boolean
13589
+ }[]
13590
+
13591
+ export interface PlaygroundWebhookGetLastInput {
13592
+
13593
+ }
13594
+
13595
+ export type PlaygroundWebhookGetLastOutput = ({
13596
+ payload?: unknown
13597
+ event_id: string
13598
+ provider: string
13599
+ verified: boolean
13600
+ product_id: string
13601
+ occurred_at: string
13602
+ connector_id: string
13603
+ delivery_count: number
13604
+ } | {
13605
+ found: false
13606
+ })
13607
+
13479
13608
  export interface RealtimeApikeyCreateInput {
13480
13609
  /**
13481
13610
  * Human-readable label for the key, e.g. "production backend"
@@ -15461,6 +15590,2705 @@ scriptUrl: string
15461
15590
  minimalSnippet: string
15462
15591
  }
15463
15592
 
15593
+ export interface UsersApikeysCreateInput {
15594
+ /**
15595
+ * A label only humans read — which backend or environment holds this key.
15596
+ */
15597
+ name: string
15598
+ /**
15599
+ * 'server' mints a SECRET key (usk_…) for the Product's backend — returned exactly once and stored hashed. 'publishable' mints a non-secret key (upk_…) that identifies this product in browser flows and stays readable.
15600
+ */
15601
+ type: ("server" | "publishable")
15602
+ }
15603
+
15604
+ export interface UsersApikeysCreateOutput {
15605
+ id: string
15606
+ key: string
15607
+ name: string
15608
+ type: ("server" | "publishable")
15609
+ value: (string | null)
15610
+ prefix: string
15611
+ createdAt: string
15612
+ revokedAt: (string | null)
15613
+ }
15614
+
15615
+ export interface UsersApikeysListInput {
15616
+
15617
+ }
15618
+
15619
+ export interface UsersApikeysListOutput {
15620
+ keys: {
15621
+ id: string
15622
+ name: string
15623
+ type: ("server" | "publishable")
15624
+ value: (string | null)
15625
+ prefix: string
15626
+ createdAt: string
15627
+ revokedAt: (string | null)
15628
+ }[]
15629
+ }
15630
+
15631
+ export interface UsersApikeysRevokeInput {
15632
+ /**
15633
+ * Id of the key to revoke. Revocation is immediate and final.
15634
+ */
15635
+ id: string
15636
+ }
15637
+
15638
+ export interface UsersApikeysRevokeOutput {
15639
+ id: string
15640
+ revoked: true
15641
+ }
15642
+
15643
+ export interface UsersAuditListInput {
15644
+ /**
15645
+ * Page size, 1-100. Default 25.
15646
+ */
15647
+ limit?: number
15648
+ /**
15649
+ * ISO-8601 lower bound (inclusive) on the event timestamp.
15650
+ */
15651
+ since?: string
15652
+ /**
15653
+ * ISO-8601 upper bound (exclusive) on the event timestamp.
15654
+ */
15655
+ until?: string
15656
+ /**
15657
+ * Exact action to filter by, e.g. 'user.banned'. Omit for all actions.
15658
+ */
15659
+ action?: string
15660
+ /**
15661
+ * Opaque cursor from a previous response's `nextCursor`. Omit for the first page.
15662
+ */
15663
+ cursor?: string
15664
+ /**
15665
+ * Exact id of the audited target, e.g. a user id.
15666
+ */
15667
+ targetId?: string
15668
+ /**
15669
+ * Target kind to filter by, e.g. 'user'.
15670
+ */
15671
+ targetType?: string
15672
+ }
15673
+
15674
+ export interface UsersAuditListOutput {
15675
+ events: {
15676
+ id: string
15677
+ ip: (string | null)
15678
+ action: string
15679
+ actorId: (string | null)
15680
+ metadata: {
15681
+ [k: string]: unknown
15682
+ }
15683
+ targetId: (string | null)
15684
+ actorType: ("operator" | "system" | "end_user")
15685
+ createdAt: string
15686
+ productId: string
15687
+ userAgent: (string | null)
15688
+ targetType: (string | null)
15689
+ }[]
15690
+ nextCursor: (string | null)
15691
+ }
15692
+
15693
+ export interface UsersConfigGetInput {
15694
+
15695
+ }
15696
+
15697
+ export interface UsersConfigGetOutput {
15698
+ mfa: {
15699
+ /**
15700
+ * Whether a second factor is MANDATORY for this product. When true, a user may not unenroll their last verified factor. Default false.
15701
+ */
15702
+ required: boolean
15703
+ /**
15704
+ * How many single-use backup codes a batch contains. Default 10.
15705
+ */
15706
+ backupCodeCount: number
15707
+ /**
15708
+ * Mandatory delay on an operator-initiated factor reset, in hours — the abort window the user is emailed. Default 72.
15709
+ */
15710
+ resetDelayHours: number
15711
+ /**
15712
+ * How long a passed step-up challenge stays spendable, in minutes. The grant is SINGLE-USE regardless. Default 5.
15713
+ */
15714
+ stepUpGrantMinutes: number
15715
+ /**
15716
+ * Wrong BACKUP codes before the account is locked, counted separately from TOTP. Default 5.
15717
+ */
15718
+ maxBackupCodeAttempts: number
15719
+ /**
15720
+ * Wrong second-factor codes before the account is locked. Default 5.
15721
+ */
15722
+ maxSecondFactorAttempts: number
15723
+ /**
15724
+ * How recently the caller must have authenticated to enroll or regenerate a factor, in minutes. Default 10.
15725
+ */
15726
+ sensitiveAuthAgeMinutes: number
15727
+ }
15728
+ email: {
15729
+ /**
15730
+ * Sender for auth email, e.g. "Acme <auth@acme.com>". MUST be on a domain verified in this product's mail toolkit. While it is null, email_code/email_link are not offered as strategies.
15731
+ */
15732
+ from: (string | null)
15733
+ /**
15734
+ * Offer the 6-digit code strategy (email_code). Default true.
15735
+ */
15736
+ codeEnabled: boolean
15737
+ /**
15738
+ * Base URL magic links point at, e.g. "https://public.lessly.com/{productId}/users". Null uses the deployment default.
15739
+ */
15740
+ linkBaseUrl: (string | null)
15741
+ /**
15742
+ * Offer the magic-link strategy (email_link). Default true.
15743
+ */
15744
+ linkEnabled: boolean
15745
+ /**
15746
+ * How long an emailed code or link stays usable, in minutes. Default 15.
15747
+ */
15748
+ codeTtlMinutes: number
15749
+ /**
15750
+ * Auth emails one address may receive per day. Default 10.
15751
+ */
15752
+ resendDailyCap: number
15753
+ /**
15754
+ * Wrong-code entries allowed per token before it is spent. Default 5.
15755
+ */
15756
+ maxCodeAttempts: number
15757
+ /**
15758
+ * Minimum seconds between two auth emails to one address. Floor of 60 is enforced regardless. Default 60.
15759
+ */
15760
+ resendCooldownSeconds: number
15761
+ }
15762
+ oauth: {
15763
+ providers: {
15764
+ github: UsersConfigGetOutputGoogle
15765
+ google: UsersConfigGetOutputGoogle
15766
+ }
15767
+ }
15768
+ hosted: {
15769
+ /**
15770
+ * Serve the hosted sign-in, sign-up and recovery pages for this product. Default true. False answers those routes with a refusal page instead — for a product that ships its own frontend and wants no second front door.
15771
+ */
15772
+ enabled: boolean
15773
+ /**
15774
+ * Absolute https URL of a logo rendered above the form. Null renders no logo.
15775
+ */
15776
+ logoUrl: (string | null)
15777
+ /**
15778
+ * Terms link rendered in the footer. Null renders no link.
15779
+ */
15780
+ termsUrl: (string | null)
15781
+ /**
15782
+ * CSS colour of the body text.
15783
+ */
15784
+ textColor: string
15785
+ /**
15786
+ * One line under the card. Null renders no footer.
15787
+ */
15788
+ footerText: (string | null)
15789
+ /**
15790
+ * Privacy-policy link rendered in the footer. Null renders no link.
15791
+ */
15792
+ privacyUrl: (string | null)
15793
+ /**
15794
+ * CSS colour for the submit button, the links and the focus ring.
15795
+ */
15796
+ accentColor: string
15797
+ /**
15798
+ * Shown in the heading and the page title. Default "This product".
15799
+ */
15800
+ productName: string
15801
+ /**
15802
+ * CSS length for the card and its controls, e.g. "12px".
15803
+ */
15804
+ borderRadius: string
15805
+ /**
15806
+ * CSS colour of the card itself.
15807
+ */
15808
+ surfaceColor: string
15809
+ /**
15810
+ * CSS colour of secondary text and hints.
15811
+ */
15812
+ mutedTextColor: string
15813
+ /**
15814
+ * CSS colour of the page behind the card.
15815
+ */
15816
+ backgroundColor: string
15817
+ }
15818
+ invite: {
15819
+ /**
15820
+ * How long an invite link stays usable, in days. Default 14.
15821
+ */
15822
+ ttlDays: number
15823
+ /**
15824
+ * Minimum minutes between two invite emails to one address. Default 60.
15825
+ */
15826
+ resendCooldownMinutes: number
15827
+ }
15828
+ status: ("active" | "paused")
15829
+ captcha: {
15830
+ enabled: boolean
15831
+ siteKey: (string | null)
15832
+ provider: "turnstile"
15833
+ riskElevated: boolean
15834
+ }
15835
+ recovery: {
15836
+ /**
15837
+ * Offer the password-recovery flow at all. Default true.
15838
+ */
15839
+ enabled: boolean
15840
+ /**
15841
+ * How long a reset link stays usable, in minutes. Default 60.
15842
+ */
15843
+ ttlMinutes: number
15844
+ }
15845
+ testMode: {
15846
+ /**
15847
+ * Opt this product into test mode. Refused outright on a production deployment — the environment gate is checked first and cannot be configured away. Turning it on is audited and raises an alert. Default false.
15848
+ */
15849
+ enabled: boolean
15850
+ }
15851
+ waitlist: {
15852
+ /**
15853
+ * The embeddable widget’s copy and colours.
15854
+ */
15855
+ widget: {
15856
+ /**
15857
+ * Heading above the widget form.
15858
+ */
15859
+ title: string
15860
+ /**
15861
+ * Link rendered beside the consent text. Null renders no link.
15862
+ */
15863
+ policyUrl: (string | null)
15864
+ /**
15865
+ * CSS colour for the button and the focus ring.
15866
+ */
15867
+ accentColor: string
15868
+ /**
15869
+ * Submit button copy.
15870
+ */
15871
+ buttonLabel: string
15872
+ /**
15873
+ * Consent checkbox copy. Null renders no checkbox, and the signup records the consent proof as `unspecified`.
15874
+ */
15875
+ consentText: (string | null)
15876
+ /**
15877
+ * One line under the heading.
15878
+ */
15879
+ description: string
15880
+ /**
15881
+ * The privacy-policy version the widget records in each consent proof.
15882
+ */
15883
+ policyVersion: string
15884
+ /**
15885
+ * Shown after a submission. ONE message for every outcome: the signup route answers identically whether or not the address was already on the list.
15886
+ */
15887
+ successMessage: string
15888
+ }
15889
+ /**
15890
+ * Require a confirmation email before a waitlist signup counts. Default false — the entry is created either way, but an unconfirmed one is reported separately and is never invited.
15891
+ */
15892
+ doubleOptIn: boolean
15893
+ /**
15894
+ * How long a still-pending waitlist entry is kept before the sweep erases it. Default 365.
15895
+ */
15896
+ retentionDays: number
15897
+ /**
15898
+ * How long a double-opt-in confirmation link stays usable, in hours. Default 48.
15899
+ */
15900
+ confirmTtlHours: number
15901
+ }
15902
+ productId: string
15903
+ retention: {
15904
+ /**
15905
+ * How long an EXPIRED flow attempt is kept after its own expiry. Default 0 — swept as soon as it dies, which is what the reaper did before this window existed.
15906
+ */
15907
+ flowAttemptDays: number
15908
+ /**
15909
+ * How long a SPENT or EXPIRED one-time token row (an OTP, a magic link, a recovery or abort token) is kept after it stops being usable, for forensics. The secret is a hash and the row is already dead — this only decides how long the trail lives. Default 30.
15910
+ */
15911
+ oneTimeTokenDays: number
15912
+ /**
15913
+ * How long an EXPIRED session and its refresh tokens are kept after expiry. Zero does not shorten any lifetime: a session past either window can never be refreshed again, so the row is already inert. Default 0.
15914
+ */
15915
+ expiredSessionDays: number
15916
+ }
15917
+ protection: {
15918
+ /**
15919
+ * Check passwords against the HaveIBeenPwned breach corpus (k-anonymity). Blocking at sign-up, advisory at sign-in. Default true.
15920
+ */
15921
+ hibpEnabled: boolean
15922
+ /**
15923
+ * How long an account stays locked. Self-healing — the lock expires on its own. Default 15.
15924
+ */
15925
+ lockoutMinutes: number
15926
+ /**
15927
+ * Failed sign-ins for one identifier before the account is locked. Default 10.
15928
+ */
15929
+ maxFailedAttempts: number
15930
+ /**
15931
+ * Flow calls allowed per IP per product per window before HTTP 429. Default 120.
15932
+ */
15933
+ ipAttemptsPerWindow: number
15934
+ /**
15935
+ * Sliding window the failed sign-ins are counted over, in minutes. Default 15.
15936
+ */
15937
+ failedAttemptWindowMinutes: number
15938
+ /**
15939
+ * Flow calls allowed per identifier per window before HTTP 429. Default 30.
15940
+ */
15941
+ identifierAttemptsPerWindow: number
15942
+ }
15943
+ signupMode: ("public" | "invite-only" | "waitlist")
15944
+ emailChange: {
15945
+ /**
15946
+ * Allow end users to change their email address. Default true.
15947
+ */
15948
+ enabled: boolean
15949
+ /**
15950
+ * How long after a REVERT further email changes are refused, in days. Default 7.
15951
+ */
15952
+ cooldownDays: number
15953
+ /**
15954
+ * How long the old address may undo the change, in days. Default 30.
15955
+ */
15956
+ revertTtlDays: number
15957
+ /**
15958
+ * How long the two confirmation links stay usable, in hours. Default 24.
15959
+ */
15960
+ requestTtlHours: number
15961
+ /**
15962
+ * Mandatory delay on an operator-assisted override, in hours — the abort window the old address is notified with. Default 72.
15963
+ */
15964
+ overrideDelayHours: number
15965
+ }
15966
+ notifications: {
15967
+ /**
15968
+ * Email the user the first time a session appears from an unseen device. Default true.
15969
+ */
15970
+ newDevice: boolean
15971
+ /**
15972
+ * Email the old address when an email change is requested, completed, reverted or overridden. Default true.
15973
+ */
15974
+ emailChange: boolean
15975
+ /**
15976
+ * Email the user when an operator impersonates their account. Default true.
15977
+ */
15978
+ impersonation: boolean
15979
+ /**
15980
+ * Email the user when their password is set or changed. Default true.
15981
+ */
15982
+ passwordChanged: boolean
15983
+ }
15984
+ allowedOrigins: string[]
15985
+ passwordPolicy: {
15986
+ /**
15987
+ * Minimum password length. Default 8.
15988
+ */
15989
+ minLength: number
15990
+ /**
15991
+ * Require at least one digit.
15992
+ */
15993
+ requireNumber: boolean
15994
+ /**
15995
+ * Require at least one non-alphanumeric character.
15996
+ */
15997
+ requireSymbol: boolean
15998
+ /**
15999
+ * Require at least one uppercase letter.
16000
+ */
16001
+ requireUppercase: boolean
16002
+ }
16003
+ sessionTtlHours: number
16004
+ lifecycleBlocked: boolean
16005
+ lifecycleArchived: boolean
16006
+ refreshSlidingDays: number
16007
+ refreshAbsoluteDays: number
16008
+ redirectUriAllowlist: string[]
16009
+ accessTokenTtlMinutes: number
16010
+ captchaSecretConfigured: boolean
16011
+ }
16012
+ export interface UsersConfigGetOutputGoogle {
16013
+ enabled: boolean
16014
+ clientId: (string | null)
16015
+ secretConfigured: boolean
16016
+ }
16017
+
16018
+ export interface UsersConfigUpsertInput {
16019
+ /**
16020
+ * MFA settings: backup-code batch size, the operator-reset delay, how fresh authentication must be to enroll, and the second-factor lockout ceilings. Merged field-by-field.
16021
+ */
16022
+ mfa?: {
16023
+ /**
16024
+ * Whether a second factor is MANDATORY for this product. When true, a user may not unenroll their last verified factor. Default false.
16025
+ */
16026
+ required?: boolean
16027
+ /**
16028
+ * How many single-use backup codes a batch contains. Default 10.
16029
+ */
16030
+ backupCodeCount?: number
16031
+ /**
16032
+ * Mandatory delay on an operator-initiated factor reset, in hours — the abort window the user is emailed. Default 72.
16033
+ */
16034
+ resetDelayHours?: number
16035
+ /**
16036
+ * How long a passed step-up challenge stays spendable, in minutes. The grant is SINGLE-USE regardless. Default 5.
16037
+ */
16038
+ stepUpGrantMinutes?: number
16039
+ /**
16040
+ * Wrong BACKUP codes before the account is locked, counted separately from TOTP. Default 5.
16041
+ */
16042
+ maxBackupCodeAttempts?: number
16043
+ /**
16044
+ * Wrong second-factor codes before the account is locked. Default 5.
16045
+ */
16046
+ maxSecondFactorAttempts?: number
16047
+ /**
16048
+ * How recently the caller must have authenticated to enroll or regenerate a factor, in minutes. Default 10.
16049
+ */
16050
+ sensitiveAuthAgeMinutes?: number
16051
+ }
16052
+ /**
16053
+ * Email OTP / magic-link settings. Merged field-by-field. Set `email.from` to a sender on a domain verified in this product's mail toolkit — until then the email strategies are not offered.
16054
+ */
16055
+ email?: {
16056
+ /**
16057
+ * Sender for auth email, e.g. "Acme <auth@acme.com>". MUST be on a domain verified in this product's mail toolkit. While it is null, email_code/email_link are not offered as strategies.
16058
+ */
16059
+ from?: (string | null)
16060
+ /**
16061
+ * Offer the 6-digit code strategy (email_code). Default true.
16062
+ */
16063
+ codeEnabled?: boolean
16064
+ /**
16065
+ * Base URL magic links point at, e.g. "https://public.lessly.com/{productId}/users". Null uses the deployment default.
16066
+ */
16067
+ linkBaseUrl?: (string | null)
16068
+ /**
16069
+ * Offer the magic-link strategy (email_link). Default true.
16070
+ */
16071
+ linkEnabled?: boolean
16072
+ /**
16073
+ * How long an emailed code or link stays usable, in minutes. Default 15.
16074
+ */
16075
+ codeTtlMinutes?: number
16076
+ /**
16077
+ * Auth emails one address may receive per day. Default 10.
16078
+ */
16079
+ resendDailyCap?: number
16080
+ /**
16081
+ * Wrong-code entries allowed per token before it is spent. Default 5.
16082
+ */
16083
+ maxCodeAttempts?: number
16084
+ /**
16085
+ * Minimum seconds between two auth emails to one address. Floor of 60 is enforced regardless. Default 60.
16086
+ */
16087
+ resendCooldownSeconds?: number
16088
+ }
16089
+ /**
16090
+ * OAuth provider credentials and switches, per provider. Merged field-by-field. A provider is offered as a sign-in strategy only when it is enabled AND a full client id + secret pair resolves — from here, or from the deployment's shared development credentials.
16091
+ */
16092
+ oauth?: {
16093
+ github?: UsersConfigUpsertInputGoogle
16094
+ /**
16095
+ * Google sign-in credentials and switch.
16096
+ */
16097
+ google?: {
16098
+ /**
16099
+ * Offer this provider as a sign-in strategy.
16100
+ */
16101
+ enabled?: boolean
16102
+ /**
16103
+ * The OAuth client id from the provider console. Pass null to clear it and fall back to the deployment's shared development credentials, if it has any.
16104
+ */
16105
+ clientId?: (string | null)
16106
+ /**
16107
+ * WRITE-ONLY. The OAuth client secret; stored encrypted and never returned. Omit to leave the stored secret untouched, pass null to clear it.
16108
+ */
16109
+ clientSecret?: (string | null)
16110
+ }
16111
+ }
16112
+ /**
16113
+ * The hosted sign-in / sign-up / recovery pages: whether they are served, and the product name, logo, colours and footer links they render with. Merged field-by-field, so setting one colour leaves the rest alone.
16114
+ */
16115
+ hosted?: {
16116
+ /**
16117
+ * Serve the hosted sign-in, sign-up and recovery pages for this product. Default true. False answers those routes with a refusal page instead — for a product that ships its own frontend and wants no second front door.
16118
+ */
16119
+ enabled?: boolean
16120
+ /**
16121
+ * Absolute https URL of a logo rendered above the form. Null renders no logo.
16122
+ */
16123
+ logoUrl?: (string | null)
16124
+ /**
16125
+ * Terms link rendered in the footer. Null renders no link.
16126
+ */
16127
+ termsUrl?: (string | null)
16128
+ /**
16129
+ * CSS colour of the body text.
16130
+ */
16131
+ textColor?: string
16132
+ /**
16133
+ * One line under the card. Null renders no footer.
16134
+ */
16135
+ footerText?: (string | null)
16136
+ /**
16137
+ * Privacy-policy link rendered in the footer. Null renders no link.
16138
+ */
16139
+ privacyUrl?: (string | null)
16140
+ /**
16141
+ * CSS colour for the submit button, the links and the focus ring.
16142
+ */
16143
+ accentColor?: string
16144
+ /**
16145
+ * Shown in the heading and the page title. Default "This product".
16146
+ */
16147
+ productName?: string
16148
+ /**
16149
+ * CSS length for the card and its controls, e.g. "12px".
16150
+ */
16151
+ borderRadius?: string
16152
+ /**
16153
+ * CSS colour of the card itself.
16154
+ */
16155
+ surfaceColor?: string
16156
+ /**
16157
+ * CSS colour of secondary text and hints.
16158
+ */
16159
+ mutedTextColor?: string
16160
+ /**
16161
+ * CSS colour of the page behind the card.
16162
+ */
16163
+ backgroundColor?: string
16164
+ }
16165
+ /**
16166
+ * Invite lifetime and re-invite cooldown. Merged field-by-field.
16167
+ */
16168
+ invite?: {
16169
+ /**
16170
+ * How long an invite link stays usable, in days. Default 14.
16171
+ */
16172
+ ttlDays?: number
16173
+ /**
16174
+ * Minimum minutes between two invite emails to one address. Default 60.
16175
+ */
16176
+ resendCooldownMinutes?: number
16177
+ }
16178
+ /**
16179
+ * Captcha (Cloudflare Turnstile) settings for flow creation. Merged field-by-field.
16180
+ */
16181
+ captcha?: {
16182
+ /**
16183
+ * Require a captcha token when a flow attempt is created.
16184
+ */
16185
+ enabled?: boolean
16186
+ /**
16187
+ * The public site key the Product renders the widget with.
16188
+ */
16189
+ siteKey?: (string | null)
16190
+ /**
16191
+ * WRITE-ONLY. The provider secret used server-side to verify tokens; stored encrypted and never returned. Omit to leave the stored secret untouched, pass null to clear it.
16192
+ */
16193
+ secretKey?: (string | null)
16194
+ /**
16195
+ * Demand a captcha from an identifier that is currently accumulating failed attempts, even when `enabled` is false. Default true.
16196
+ */
16197
+ riskElevated?: boolean
16198
+ }
16199
+ /**
16200
+ * Password-recovery settings (whether it is offered, how long a reset link lives). Merged field-by-field.
16201
+ */
16202
+ recovery?: {
16203
+ /**
16204
+ * Offer the password-recovery flow at all. Default true.
16205
+ */
16206
+ enabled?: boolean
16207
+ /**
16208
+ * How long a reset link stays usable, in minutes. Default 60.
16209
+ */
16210
+ ttlMinutes?: number
16211
+ }
16212
+ /**
16213
+ * Test mode: whether this product may have TEST USERS — accounts that are excluded from metering, kept out of the default directory listing, never really emailed, and (when the deployment sets one) able to sign in with the fixed magic OTP. REFUSED on a production deployment. Merged field-by-field.
16214
+ */
16215
+ testMode?: {
16216
+ /**
16217
+ * Opt this product into test mode. Refused outright on a production deployment — the environment gate is checked first and cannot be configured away. Turning it on is audited and raises an alert. Default false.
16218
+ */
16219
+ enabled?: boolean
16220
+ }
16221
+ /**
16222
+ * Waitlist settings: the double-opt-in toggle, how long a pending entry is retained before the sweep erases it, the confirmation link lifetime, and the embeddable widget’s copy and colours. Merged field-by-field, including inside `widget`.
16223
+ */
16224
+ waitlist?: {
16225
+ /**
16226
+ * The embeddable widget’s copy and colours. Merged field-by-field, so setting one line leaves the rest alone.
16227
+ */
16228
+ widget?: {
16229
+ /**
16230
+ * Heading above the widget form.
16231
+ */
16232
+ title?: string
16233
+ /**
16234
+ * Link rendered beside the consent text. Null renders no link.
16235
+ */
16236
+ policyUrl?: (string | null)
16237
+ /**
16238
+ * CSS colour for the button and the focus ring.
16239
+ */
16240
+ accentColor?: string
16241
+ /**
16242
+ * Submit button copy.
16243
+ */
16244
+ buttonLabel?: string
16245
+ /**
16246
+ * Consent checkbox copy. Null renders no checkbox, and the signup records the consent proof as `unspecified`.
16247
+ */
16248
+ consentText?: (string | null)
16249
+ /**
16250
+ * One line under the heading.
16251
+ */
16252
+ description?: string
16253
+ /**
16254
+ * The privacy-policy version the widget records in each consent proof.
16255
+ */
16256
+ policyVersion?: string
16257
+ /**
16258
+ * Shown after a submission. ONE message for every outcome: the signup route answers identically whether or not the address was already on the list.
16259
+ */
16260
+ successMessage?: string
16261
+ }
16262
+ /**
16263
+ * Require a confirmation email before a waitlist signup counts. Default false — the entry is created either way, but an unconfirmed one is reported separately and is never invited.
16264
+ */
16265
+ doubleOptIn?: boolean
16266
+ /**
16267
+ * How long a still-pending waitlist entry is kept before the sweep erases it. Default 365.
16268
+ */
16269
+ retentionDays?: number
16270
+ /**
16271
+ * How long a double-opt-in confirmation link stays usable, in hours. Default 48.
16272
+ */
16273
+ confirmTtlHours?: number
16274
+ }
16275
+ /**
16276
+ * How long DEAD rows are kept before the retention sweep removes them: spent one-time tokens, expired flow attempts, expired sessions and their refresh tokens. These are grace periods on top of expiry, never lifetimes — an unswept expired row is inert. Merged field-by-field.
16277
+ */
16278
+ retention?: {
16279
+ /**
16280
+ * How long an EXPIRED flow attempt is kept after its own expiry. Default 0 — swept as soon as it dies, which is what the reaper did before this window existed.
16281
+ */
16282
+ flowAttemptDays?: number
16283
+ /**
16284
+ * How long a SPENT or EXPIRED one-time token row (an OTP, a magic link, a recovery or abort token) is kept after it stops being usable, for forensics. The secret is a hash and the row is already dead — this only decides how long the trail lives. Default 30.
16285
+ */
16286
+ oneTimeTokenDays?: number
16287
+ /**
16288
+ * How long an EXPIRED session and its refresh tokens are kept after expiry. Zero does not shorten any lifetime: a session past either window can never be refreshed again, so the row is already inert. Default 0.
16289
+ */
16290
+ expiredSessionDays?: number
16291
+ }
16292
+ /**
16293
+ * Rate limits, lockout and breached-password settings. Merged field-by-field.
16294
+ */
16295
+ protection?: {
16296
+ /**
16297
+ * Check passwords against the HaveIBeenPwned breach corpus (k-anonymity). Blocking at sign-up, advisory at sign-in. Default true.
16298
+ */
16299
+ hibpEnabled?: boolean
16300
+ /**
16301
+ * How long an account stays locked. Self-healing — the lock expires on its own. Default 15.
16302
+ */
16303
+ lockoutMinutes?: number
16304
+ /**
16305
+ * Failed sign-ins for one identifier before the account is locked. Default 10.
16306
+ */
16307
+ maxFailedAttempts?: number
16308
+ /**
16309
+ * Flow calls allowed per IP per product per window before HTTP 429. Default 120.
16310
+ */
16311
+ ipAttemptsPerWindow?: number
16312
+ /**
16313
+ * Sliding window the failed sign-ins are counted over, in minutes. Default 15.
16314
+ */
16315
+ failedAttemptWindowMinutes?: number
16316
+ /**
16317
+ * Flow calls allowed per identifier per window before HTTP 429. Default 30.
16318
+ */
16319
+ identifierAttemptsPerWindow?: number
16320
+ }
16321
+ /**
16322
+ * How end users may join this product: 'public' (anyone), 'invite-only', or 'waitlist'. Default 'public'.
16323
+ */
16324
+ signupMode?: ("public" | "invite-only" | "waitlist")
16325
+ /**
16326
+ * Email-change settings: confirmation lifetime, the old address's revert window, the post-revert cooldown and the operator-override delay. Merged field-by-field.
16327
+ */
16328
+ emailChange?: {
16329
+ /**
16330
+ * Allow end users to change their email address. Default true.
16331
+ */
16332
+ enabled?: boolean
16333
+ /**
16334
+ * How long after a REVERT further email changes are refused, in days. Default 7.
16335
+ */
16336
+ cooldownDays?: number
16337
+ /**
16338
+ * How long the old address may undo the change, in days. Default 30.
16339
+ */
16340
+ revertTtlDays?: number
16341
+ /**
16342
+ * How long the two confirmation links stay usable, in hours. Default 24.
16343
+ */
16344
+ requestTtlHours?: number
16345
+ /**
16346
+ * Mandatory delay on an operator-assisted override, in hours — the abort window the old address is notified with. Default 72.
16347
+ */
16348
+ overrideDelayHours?: number
16349
+ }
16350
+ /**
16351
+ * Which security notification emails this product sends. All on by default. Merged field-by-field.
16352
+ */
16353
+ notifications?: {
16354
+ /**
16355
+ * Email the user the first time a session appears from an unseen device. Default true.
16356
+ */
16357
+ newDevice?: boolean
16358
+ /**
16359
+ * Email the old address when an email change is requested, completed, reverted or overridden. Default true.
16360
+ */
16361
+ emailChange?: boolean
16362
+ /**
16363
+ * Email the user when an operator impersonates their account. Default true.
16364
+ */
16365
+ impersonation?: boolean
16366
+ /**
16367
+ * Email the user when their password is set or changed. Default true.
16368
+ */
16369
+ passwordChanged?: boolean
16370
+ }
16371
+ /**
16372
+ * Browser origins allowed to drive this product's end-user flows, up to 20. Scheme + host + port only, matched exactly. Replaces the whole list. Empty means "no browser origin" once this product has a publishable key.
16373
+ *
16374
+ * @maxItems 20
16375
+ */
16376
+ allowedOrigins?: []|[string]|[string, string]|[string, string, string]|[string, string, string, string]|[string, string, string, string, string]|[string, string, string, string, string, string]|[string, string, string, string, string, string, string]|[string, string, string, string, string, string, string, string]|[string, string, string, string, string, string, string, string, string]|[string, string, string, string, string, string, string, string, string, string]|[string, string, string, string, string, string, string, string, string, string, string]|[string, string, string, string, string, string, string, string, string, string, string, string]|[string, string, string, string, string, string, string, string, string, string, string, string, string]|[string, string, string, string, string, string, string, string, string, string, string, string, string, string]|[string, string, string, string, string, string, string, string, string, string, string, string, string, string, string]|[string, string, string, string, string, string, string, string, string, string, string, string, string, string, string, string]|[string, string, string, string, string, string, string, string, string, string, string, string, string, string, string, string, string]|[string, string, string, string, string, string, string, string, string, string, string, string, string, string, string, string, string, string]|[string, string, string, string, string, string, string, string, string, string, string, string, string, string, string, string, string, string, string]|[string, string, string, string, string, string, string, string, string, string, string, string, string, string, string, string, string, string, string, string]
16377
+ /**
16378
+ * Password rules for this product. Merged field-by-field into the current policy.
16379
+ */
16380
+ passwordPolicy?: {
16381
+ /**
16382
+ * Minimum password length. Default 8.
16383
+ */
16384
+ minLength?: number
16385
+ /**
16386
+ * Require at least one digit.
16387
+ */
16388
+ requireNumber?: boolean
16389
+ /**
16390
+ * Require at least one non-alphanumeric character.
16391
+ */
16392
+ requireSymbol?: boolean
16393
+ /**
16394
+ * Require at least one uppercase letter.
16395
+ */
16396
+ requireUppercase?: boolean
16397
+ }
16398
+ /**
16399
+ * End-user session lifetime in hours. Default 720 (30 days).
16400
+ */
16401
+ sessionTtlHours?: number
16402
+ /**
16403
+ * Inactivity window of a session in days — every refresh slides it forward. Default 30.
16404
+ */
16405
+ refreshSlidingDays?: number
16406
+ /**
16407
+ * Hard time-box of a session in days, counted from sign-in and never extended. Default 365.
16408
+ */
16409
+ refreshAbsoluteDays?: number
16410
+ /**
16411
+ * Callback URIs the browser code handoff may deliver a one-time authorization code to, up to 20. Matched EXACTLY — no wildcards, no prefixes, no fragments — so list every callback in full. Replaces the whole list.
16412
+ *
16413
+ * @maxItems 20
16414
+ */
16415
+ redirectUriAllowlist?: []|[string]|[string, string]|[string, string, string]|[string, string, string, string]|[string, string, string, string, string]|[string, string, string, string, string, string]|[string, string, string, string, string, string, string]|[string, string, string, string, string, string, string, string]|[string, string, string, string, string, string, string, string, string]|[string, string, string, string, string, string, string, string, string, string]|[string, string, string, string, string, string, string, string, string, string, string]|[string, string, string, string, string, string, string, string, string, string, string, string]|[string, string, string, string, string, string, string, string, string, string, string, string, string]|[string, string, string, string, string, string, string, string, string, string, string, string, string, string]|[string, string, string, string, string, string, string, string, string, string, string, string, string, string, string]|[string, string, string, string, string, string, string, string, string, string, string, string, string, string, string, string]|[string, string, string, string, string, string, string, string, string, string, string, string, string, string, string, string, string]|[string, string, string, string, string, string, string, string, string, string, string, string, string, string, string, string, string, string]|[string, string, string, string, string, string, string, string, string, string, string, string, string, string, string, string, string, string, string]|[string, string, string, string, string, string, string, string, string, string, string, string, string, string, string, string, string, string, string, string]
16416
+ /**
16417
+ * Access JWT lifetime in minutes, 5-60. Default 10. Short on purpose: a revoked session dies within one TTL.
16418
+ */
16419
+ accessTokenTtlMinutes?: number
16420
+ }
16421
+ /**
16422
+ * GitHub sign-in credentials and switch.
16423
+ */
16424
+ export interface UsersConfigUpsertInputGoogle {
16425
+ /**
16426
+ * Offer this provider as a sign-in strategy.
16427
+ */
16428
+ enabled?: boolean
16429
+ /**
16430
+ * The OAuth client id from the provider console. Pass null to clear it and fall back to the deployment's shared development credentials, if it has any.
16431
+ */
16432
+ clientId?: (string | null)
16433
+ /**
16434
+ * WRITE-ONLY. The OAuth client secret; stored encrypted and never returned. Omit to leave the stored secret untouched, pass null to clear it.
16435
+ */
16436
+ clientSecret?: (string | null)
16437
+ }
16438
+
16439
+ export interface UsersConfigUpsertOutput {
16440
+ mfa: {
16441
+ /**
16442
+ * Whether a second factor is MANDATORY for this product. When true, a user may not unenroll their last verified factor. Default false.
16443
+ */
16444
+ required: boolean
16445
+ /**
16446
+ * How many single-use backup codes a batch contains. Default 10.
16447
+ */
16448
+ backupCodeCount: number
16449
+ /**
16450
+ * Mandatory delay on an operator-initiated factor reset, in hours — the abort window the user is emailed. Default 72.
16451
+ */
16452
+ resetDelayHours: number
16453
+ /**
16454
+ * How long a passed step-up challenge stays spendable, in minutes. The grant is SINGLE-USE regardless. Default 5.
16455
+ */
16456
+ stepUpGrantMinutes: number
16457
+ /**
16458
+ * Wrong BACKUP codes before the account is locked, counted separately from TOTP. Default 5.
16459
+ */
16460
+ maxBackupCodeAttempts: number
16461
+ /**
16462
+ * Wrong second-factor codes before the account is locked. Default 5.
16463
+ */
16464
+ maxSecondFactorAttempts: number
16465
+ /**
16466
+ * How recently the caller must have authenticated to enroll or regenerate a factor, in minutes. Default 10.
16467
+ */
16468
+ sensitiveAuthAgeMinutes: number
16469
+ }
16470
+ email: {
16471
+ /**
16472
+ * Sender for auth email, e.g. "Acme <auth@acme.com>". MUST be on a domain verified in this product's mail toolkit. While it is null, email_code/email_link are not offered as strategies.
16473
+ */
16474
+ from: (string | null)
16475
+ /**
16476
+ * Offer the 6-digit code strategy (email_code). Default true.
16477
+ */
16478
+ codeEnabled: boolean
16479
+ /**
16480
+ * Base URL magic links point at, e.g. "https://public.lessly.com/{productId}/users". Null uses the deployment default.
16481
+ */
16482
+ linkBaseUrl: (string | null)
16483
+ /**
16484
+ * Offer the magic-link strategy (email_link). Default true.
16485
+ */
16486
+ linkEnabled: boolean
16487
+ /**
16488
+ * How long an emailed code or link stays usable, in minutes. Default 15.
16489
+ */
16490
+ codeTtlMinutes: number
16491
+ /**
16492
+ * Auth emails one address may receive per day. Default 10.
16493
+ */
16494
+ resendDailyCap: number
16495
+ /**
16496
+ * Wrong-code entries allowed per token before it is spent. Default 5.
16497
+ */
16498
+ maxCodeAttempts: number
16499
+ /**
16500
+ * Minimum seconds between two auth emails to one address. Floor of 60 is enforced regardless. Default 60.
16501
+ */
16502
+ resendCooldownSeconds: number
16503
+ }
16504
+ oauth: {
16505
+ providers: {
16506
+ github: UsersConfigUpsertOutputGoogle
16507
+ google: UsersConfigUpsertOutputGoogle
16508
+ }
16509
+ }
16510
+ hosted: {
16511
+ /**
16512
+ * Serve the hosted sign-in, sign-up and recovery pages for this product. Default true. False answers those routes with a refusal page instead — for a product that ships its own frontend and wants no second front door.
16513
+ */
16514
+ enabled: boolean
16515
+ /**
16516
+ * Absolute https URL of a logo rendered above the form. Null renders no logo.
16517
+ */
16518
+ logoUrl: (string | null)
16519
+ /**
16520
+ * Terms link rendered in the footer. Null renders no link.
16521
+ */
16522
+ termsUrl: (string | null)
16523
+ /**
16524
+ * CSS colour of the body text.
16525
+ */
16526
+ textColor: string
16527
+ /**
16528
+ * One line under the card. Null renders no footer.
16529
+ */
16530
+ footerText: (string | null)
16531
+ /**
16532
+ * Privacy-policy link rendered in the footer. Null renders no link.
16533
+ */
16534
+ privacyUrl: (string | null)
16535
+ /**
16536
+ * CSS colour for the submit button, the links and the focus ring.
16537
+ */
16538
+ accentColor: string
16539
+ /**
16540
+ * Shown in the heading and the page title. Default "This product".
16541
+ */
16542
+ productName: string
16543
+ /**
16544
+ * CSS length for the card and its controls, e.g. "12px".
16545
+ */
16546
+ borderRadius: string
16547
+ /**
16548
+ * CSS colour of the card itself.
16549
+ */
16550
+ surfaceColor: string
16551
+ /**
16552
+ * CSS colour of secondary text and hints.
16553
+ */
16554
+ mutedTextColor: string
16555
+ /**
16556
+ * CSS colour of the page behind the card.
16557
+ */
16558
+ backgroundColor: string
16559
+ }
16560
+ invite: {
16561
+ /**
16562
+ * How long an invite link stays usable, in days. Default 14.
16563
+ */
16564
+ ttlDays: number
16565
+ /**
16566
+ * Minimum minutes between two invite emails to one address. Default 60.
16567
+ */
16568
+ resendCooldownMinutes: number
16569
+ }
16570
+ status: ("active" | "paused")
16571
+ captcha: {
16572
+ enabled: boolean
16573
+ siteKey: (string | null)
16574
+ provider: "turnstile"
16575
+ riskElevated: boolean
16576
+ }
16577
+ recovery: {
16578
+ /**
16579
+ * Offer the password-recovery flow at all. Default true.
16580
+ */
16581
+ enabled: boolean
16582
+ /**
16583
+ * How long a reset link stays usable, in minutes. Default 60.
16584
+ */
16585
+ ttlMinutes: number
16586
+ }
16587
+ testMode: {
16588
+ /**
16589
+ * Opt this product into test mode. Refused outright on a production deployment — the environment gate is checked first and cannot be configured away. Turning it on is audited and raises an alert. Default false.
16590
+ */
16591
+ enabled: boolean
16592
+ }
16593
+ waitlist: {
16594
+ /**
16595
+ * The embeddable widget’s copy and colours.
16596
+ */
16597
+ widget: {
16598
+ /**
16599
+ * Heading above the widget form.
16600
+ */
16601
+ title: string
16602
+ /**
16603
+ * Link rendered beside the consent text. Null renders no link.
16604
+ */
16605
+ policyUrl: (string | null)
16606
+ /**
16607
+ * CSS colour for the button and the focus ring.
16608
+ */
16609
+ accentColor: string
16610
+ /**
16611
+ * Submit button copy.
16612
+ */
16613
+ buttonLabel: string
16614
+ /**
16615
+ * Consent checkbox copy. Null renders no checkbox, and the signup records the consent proof as `unspecified`.
16616
+ */
16617
+ consentText: (string | null)
16618
+ /**
16619
+ * One line under the heading.
16620
+ */
16621
+ description: string
16622
+ /**
16623
+ * The privacy-policy version the widget records in each consent proof.
16624
+ */
16625
+ policyVersion: string
16626
+ /**
16627
+ * Shown after a submission. ONE message for every outcome: the signup route answers identically whether or not the address was already on the list.
16628
+ */
16629
+ successMessage: string
16630
+ }
16631
+ /**
16632
+ * Require a confirmation email before a waitlist signup counts. Default false — the entry is created either way, but an unconfirmed one is reported separately and is never invited.
16633
+ */
16634
+ doubleOptIn: boolean
16635
+ /**
16636
+ * How long a still-pending waitlist entry is kept before the sweep erases it. Default 365.
16637
+ */
16638
+ retentionDays: number
16639
+ /**
16640
+ * How long a double-opt-in confirmation link stays usable, in hours. Default 48.
16641
+ */
16642
+ confirmTtlHours: number
16643
+ }
16644
+ productId: string
16645
+ retention: {
16646
+ /**
16647
+ * How long an EXPIRED flow attempt is kept after its own expiry. Default 0 — swept as soon as it dies, which is what the reaper did before this window existed.
16648
+ */
16649
+ flowAttemptDays: number
16650
+ /**
16651
+ * How long a SPENT or EXPIRED one-time token row (an OTP, a magic link, a recovery or abort token) is kept after it stops being usable, for forensics. The secret is a hash and the row is already dead — this only decides how long the trail lives. Default 30.
16652
+ */
16653
+ oneTimeTokenDays: number
16654
+ /**
16655
+ * How long an EXPIRED session and its refresh tokens are kept after expiry. Zero does not shorten any lifetime: a session past either window can never be refreshed again, so the row is already inert. Default 0.
16656
+ */
16657
+ expiredSessionDays: number
16658
+ }
16659
+ protection: {
16660
+ /**
16661
+ * Check passwords against the HaveIBeenPwned breach corpus (k-anonymity). Blocking at sign-up, advisory at sign-in. Default true.
16662
+ */
16663
+ hibpEnabled: boolean
16664
+ /**
16665
+ * How long an account stays locked. Self-healing — the lock expires on its own. Default 15.
16666
+ */
16667
+ lockoutMinutes: number
16668
+ /**
16669
+ * Failed sign-ins for one identifier before the account is locked. Default 10.
16670
+ */
16671
+ maxFailedAttempts: number
16672
+ /**
16673
+ * Flow calls allowed per IP per product per window before HTTP 429. Default 120.
16674
+ */
16675
+ ipAttemptsPerWindow: number
16676
+ /**
16677
+ * Sliding window the failed sign-ins are counted over, in minutes. Default 15.
16678
+ */
16679
+ failedAttemptWindowMinutes: number
16680
+ /**
16681
+ * Flow calls allowed per identifier per window before HTTP 429. Default 30.
16682
+ */
16683
+ identifierAttemptsPerWindow: number
16684
+ }
16685
+ signupMode: ("public" | "invite-only" | "waitlist")
16686
+ emailChange: {
16687
+ /**
16688
+ * Allow end users to change their email address. Default true.
16689
+ */
16690
+ enabled: boolean
16691
+ /**
16692
+ * How long after a REVERT further email changes are refused, in days. Default 7.
16693
+ */
16694
+ cooldownDays: number
16695
+ /**
16696
+ * How long the old address may undo the change, in days. Default 30.
16697
+ */
16698
+ revertTtlDays: number
16699
+ /**
16700
+ * How long the two confirmation links stay usable, in hours. Default 24.
16701
+ */
16702
+ requestTtlHours: number
16703
+ /**
16704
+ * Mandatory delay on an operator-assisted override, in hours — the abort window the old address is notified with. Default 72.
16705
+ */
16706
+ overrideDelayHours: number
16707
+ }
16708
+ notifications: {
16709
+ /**
16710
+ * Email the user the first time a session appears from an unseen device. Default true.
16711
+ */
16712
+ newDevice: boolean
16713
+ /**
16714
+ * Email the old address when an email change is requested, completed, reverted or overridden. Default true.
16715
+ */
16716
+ emailChange: boolean
16717
+ /**
16718
+ * Email the user when an operator impersonates their account. Default true.
16719
+ */
16720
+ impersonation: boolean
16721
+ /**
16722
+ * Email the user when their password is set or changed. Default true.
16723
+ */
16724
+ passwordChanged: boolean
16725
+ }
16726
+ allowedOrigins: string[]
16727
+ passwordPolicy: {
16728
+ /**
16729
+ * Minimum password length. Default 8.
16730
+ */
16731
+ minLength: number
16732
+ /**
16733
+ * Require at least one digit.
16734
+ */
16735
+ requireNumber: boolean
16736
+ /**
16737
+ * Require at least one non-alphanumeric character.
16738
+ */
16739
+ requireSymbol: boolean
16740
+ /**
16741
+ * Require at least one uppercase letter.
16742
+ */
16743
+ requireUppercase: boolean
16744
+ }
16745
+ sessionTtlHours: number
16746
+ lifecycleBlocked: boolean
16747
+ lifecycleArchived: boolean
16748
+ refreshSlidingDays: number
16749
+ refreshAbsoluteDays: number
16750
+ redirectUriAllowlist: string[]
16751
+ accessTokenTtlMinutes: number
16752
+ captchaSecretConfigured: boolean
16753
+ }
16754
+ export interface UsersConfigUpsertOutputGoogle {
16755
+ enabled: boolean
16756
+ clientId: (string | null)
16757
+ secretConfigured: boolean
16758
+ }
16759
+
16760
+ export interface UsersFactorsListInput {
16761
+ /**
16762
+ * The end user whose enrolled factors to list.
16763
+ */
16764
+ userId: string
16765
+ }
16766
+
16767
+ export interface UsersFactorsListOutput {
16768
+ factors: {
16769
+ type: ("totp" | "backup_codes")
16770
+ status: ("unverified" | "verified")
16771
+ createdAt: string
16772
+ remaining: (number | null)
16773
+ lastUsedAt: (string | null)
16774
+ verifiedAt: (string | null)
16775
+ }[]
16776
+ }
16777
+
16778
+ export interface UsersFactorsResetInput {
16779
+ /**
16780
+ * What identity proofing was done and under which ticket. Recorded verbatim in the audit row — this is the whole point of the tool being audited.
16781
+ */
16782
+ reason: string
16783
+ /**
16784
+ * The end user whose second factor is being reset.
16785
+ */
16786
+ userId: string
16787
+ }
16788
+
16789
+ export interface UsersFactorsResetOutput {
16790
+ requestId: string
16791
+ scheduledFor: string
16792
+ }
16793
+
16794
+ export interface UsersKeysListInput {
16795
+
16796
+ }
16797
+
16798
+ export interface UsersKeysListOutput {
16799
+ keys: {
16800
+ /**
16801
+ * The RFC 7638 JWK thumbprint — what a token header carries.
16802
+ */
16803
+ kid: string
16804
+ /**
16805
+ * `standby` is pre-generated and not published; `current` signs; `retired` is still in JWKS for the overlap; `revoked` was evicted.
16806
+ */
16807
+ state: ("standby" | "current" | "retired" | "revoked")
16808
+ createdAt: string
16809
+ retiredAt: (string | null)
16810
+ revokedAt: (string | null)
16811
+ /**
16812
+ * When a retired key leaves JWKS. Null unless the key is retired.
16813
+ */
16814
+ overlapExpiresAt: (string | null)
16815
+ }[]
16816
+ }
16817
+
16818
+ export interface UsersKeysRevokeInput {
16819
+ /**
16820
+ * The key to evict, as listed by users_keys_list.
16821
+ */
16822
+ kid: string
16823
+ /**
16824
+ * Why. Goes into the audit row and is the only account of the incident it keeps.
16825
+ */
16826
+ reason?: string
16827
+ /**
16828
+ * Sign every end user of this product out as well. Defaults to TRUE: a compromised signing key could have minted any of those sessions. Pass false ONLY when you know no forged token was ever issued.
16829
+ */
16830
+ revokeSessions?: boolean
16831
+ }
16832
+
16833
+ export interface UsersKeysRevokeOutput {
16834
+ /**
16835
+ * The fresh key minted or promoted in its place.
16836
+ */
16837
+ currentKid: string
16838
+ revokedKid: string
16839
+ sessionsRevoked: number
16840
+ }
16841
+
16842
+ export interface UsersKeysRotateInput {
16843
+
16844
+ }
16845
+
16846
+ export interface UsersKeysRotateOutput {
16847
+ /**
16848
+ * The key signing from now on.
16849
+ */
16850
+ currentKid: string
16851
+ /**
16852
+ * The key just retired. Null if there was none.
16853
+ */
16854
+ previousKid: (string | null)
16855
+ /**
16856
+ * When the retired key stops verifying. Both kids are in JWKS until then.
16857
+ */
16858
+ overlapExpiresAt: (string | null)
16859
+ }
16860
+
16861
+ export interface UsersOpsRetentionGetInput {
16862
+
16863
+ }
16864
+
16865
+ export interface UsersOpsRetentionGetOutput {
16866
+ /**
16867
+ * The single retention job. There is exactly one — it replaced the sessions reaper and the waitlist sweep.
16868
+ */
16869
+ sweep: {
16870
+ /**
16871
+ * Its schedule, in cron syntax.
16872
+ */
16873
+ cron: string
16874
+ /**
16875
+ * What one pass removes, in the order it removes it.
16876
+ */
16877
+ removes: string[]
16878
+ /**
16879
+ * The Synapse cron function that performs every sweep below.
16880
+ */
16881
+ functionId: string
16882
+ }
16883
+ /**
16884
+ * This product’s EFFECTIVE windows — what it configured, with the documented default filling anything it did not.
16885
+ */
16886
+ windows: {
16887
+ /**
16888
+ * How long an EXPIRED flow attempt is kept after its own expiry. Default 0 — swept as soon as it dies, which is what the reaper did before this window existed.
16889
+ */
16890
+ flowAttemptDays: number
16891
+ /**
16892
+ * How long a SPENT or EXPIRED one-time token row (an OTP, a magic link, a recovery or abort token) is kept after it stops being usable, for forensics. The secret is a hash and the row is already dead — this only decides how long the trail lives. Default 30.
16893
+ */
16894
+ oneTimeTokenDays: number
16895
+ /**
16896
+ * How long an EXPIRED session and its refresh tokens are kept after expiry. Zero does not shorten any lifetime: a session past either window can never be refreshed again, so the row is already inert. Default 0.
16897
+ */
16898
+ expiredSessionDays: number
16899
+ }
16900
+ /**
16901
+ * The documented defaults, so a reader can tell a deliberate window from an inherited one without a second call.
16902
+ */
16903
+ defaults: {
16904
+ /**
16905
+ * How long an EXPIRED flow attempt is kept after its own expiry. Default 0 — swept as soon as it dies, which is what the reaper did before this window existed.
16906
+ */
16907
+ flowAttemptDays: number
16908
+ /**
16909
+ * How long a SPENT or EXPIRED one-time token row (an OTP, a magic link, a recovery or abort token) is kept after it stops being usable, for forensics. The secret is a hash and the row is already dead — this only decides how long the trail lives. Default 30.
16910
+ */
16911
+ oneTimeTokenDays: number
16912
+ /**
16913
+ * How long an EXPIRED session and its refresh tokens are kept after expiry. Zero does not shorten any lifetime: a session past either window can never be refreshed again, so the row is already inert. Default 0.
16914
+ */
16915
+ expiredSessionDays: number
16916
+ }
16917
+ /**
16918
+ * What this service deliberately keeps forever, and why. Reading a retention surface that lists only what IS deleted is how an operator concludes the audit log ages out — it does not.
16919
+ */
16920
+ notSwept: {
16921
+ why: string
16922
+ what: string
16923
+ }[]
16924
+ /**
16925
+ * How long a still-PENDING waitlist entry is kept. It lives in the `waitlist` config block rather than in `retention`, because it is not a grace period on a dead row: a pending entry never expires on its own, so this window is the whole of what makes it go away — and the sweep ERASES it (audit row, `users/waitlist-entry.erased`) rather than deleting it.
16926
+ */
16927
+ waitlistRetentionDays: number
16928
+ }
16929
+
16930
+ export interface UsersOpsSloGetInput {
16931
+
16932
+ }
16933
+
16934
+ export interface UsersOpsSloGetOutput {
16935
+ /**
16936
+ * Every published objective and its verdict for this window.
16937
+ */
16938
+ slos: {
16939
+ /**
16940
+ * Stable id of the objective — the key to quote in a runbook.
16941
+ */
16942
+ id: string
16943
+ /**
16944
+ * Short human name.
16945
+ */
16946
+ title: string
16947
+ /**
16948
+ * `insufficient_data` is NOT `ok`: it means the window is too quiet to judge, which an operator reading a dashboard must be able to tell apart from health.
16949
+ */
16950
+ status: ("ok" | "breached" | "insufficient_data")
16951
+ /**
16952
+ * How many events went into `observed`.
16953
+ */
16954
+ samples: number
16955
+ /**
16956
+ * What this replica sees in the CURRENT window, in the same unit as `objective`. NULL when nothing was observed.
16957
+ */
16958
+ observed: (number | null)
16959
+ /**
16960
+ * The `users/alert.raised` kind a breach of this objective fires, for wiring an alert route.
16961
+ */
16962
+ alertKind: string
16963
+ /**
16964
+ * The published objective, as a ratio in 0..1.
16965
+ */
16966
+ objective: number
16967
+ /**
16968
+ * Which side of `objective` is healthy: a success rate is at-least, an error rate at-most.
16969
+ */
16970
+ comparator: ("at-least" | "at-most")
16971
+ /**
16972
+ * Below this many samples the ratio is not judged at all — a quiet window is not an outage.
16973
+ */
16974
+ minSamples: number
16975
+ /**
16976
+ * What is counted, and what is deliberately NOT counted.
16977
+ */
16978
+ description: string
16979
+ /**
16980
+ * The window the observation is computed over.
16981
+ */
16982
+ windowSeconds: number
16983
+ }[]
16984
+ /**
16985
+ * These numbers come from ONE replica’s in-process window, not from the whole deployment. Treat them as a spot check, not as the fleet’s error budget.
16986
+ */
16987
+ scope: "replica"
16988
+ /**
16989
+ * The current window, exactly as the alert hook sees it.
16990
+ */
16991
+ window: {
16992
+ mail: {
16993
+ /**
16994
+ * Auth emails handed to mail (a cooldown or daily cap never reaches this).
16995
+ */
16996
+ total: number
16997
+ /**
16998
+ * Of those, the ones mail would not take.
16999
+ */
17000
+ failures: number
17001
+ /**
17002
+ * failures / total. NULL when nothing was sent.
17003
+ */
17004
+ failureRate: (number | null)
17005
+ }
17006
+ signIn: {
17007
+ /**
17008
+ * SETTLED flow attempts — completed or failed. A pending one is neither.
17009
+ */
17010
+ total: number
17011
+ /**
17012
+ * Of those, the ones that failed.
17013
+ */
17014
+ failures: number
17015
+ /**
17016
+ * completed / settled. NULL, never 0, when nothing settled.
17017
+ */
17018
+ successRate: (number | null)
17019
+ }
17020
+ refresh: {
17021
+ /**
17022
+ * Refresh attempts.
17023
+ */
17024
+ total: number
17025
+ /**
17026
+ * Failed refreshes, detected reuse included.
17027
+ */
17028
+ errors: number
17029
+ /**
17030
+ * Detected token REUSE — theft, counted rather than rated.
17031
+ */
17032
+ reuses: number
17033
+ /**
17034
+ * errors / total. NULL when nothing was refreshed.
17035
+ */
17036
+ errorRate: (number | null)
17037
+ }
17038
+ /**
17039
+ * Length of the evaluation window.
17040
+ */
17041
+ windowSeconds: number
17042
+ /**
17043
+ * ISO start of the window these numbers belong to.
17044
+ */
17045
+ windowStartedAt: string
17046
+ /**
17047
+ * This product’s OWN trailing sign-in failure rate, over CLOSED windows. What the anomaly signal compares the live window against — NULL until at least one window has closed.
17048
+ */
17049
+ signInFailureBaseline: (number | null)
17050
+ }
17051
+ }
17052
+
17053
+ export interface UsersSessionsGetInput {
17054
+ /**
17055
+ * The session to read.
17056
+ */
17057
+ sessionId: string
17058
+ }
17059
+
17060
+ export interface UsersSessionsGetOutput {
17061
+ id: string
17062
+ ip: (string | null)
17063
+ /**
17064
+ * `aal2` only if a verified second factor completed.
17065
+ */
17066
+ aal: ("aal1" | "aal2")
17067
+ /**
17068
+ * The factors this session was established with.
17069
+ */
17070
+ amr: string[]
17071
+ status: ("active" | "revoked")
17072
+ userId: string
17073
+ createdAt: string
17074
+ expiresAt: string
17075
+ revokedAt: (string | null)
17076
+ userAgent: (string | null)
17077
+ revokedReason: (string | null)
17078
+ /**
17079
+ * The operator behind an impersonated session, or null for an ordinary one.
17080
+ */
17081
+ impersonatedBy: (string | null)
17082
+ lastRefreshedAt: (string | null)
17083
+ absoluteExpiresAt: string
17084
+ }
17085
+
17086
+ export interface UsersSessionsImpersonateInput {
17087
+ /**
17088
+ * Why. Recorded in the audit trail and shown to the user in the notification email — write what you would want to read in an incident review (a ticket number and one sentence).
17089
+ */
17090
+ reason: string
17091
+ /**
17092
+ * The end user to sign in as.
17093
+ */
17094
+ userId: string
17095
+ }
17096
+
17097
+ export interface UsersSessionsImpersonateOutput {
17098
+ userId: string
17099
+ /**
17100
+ * When the session dies. It cannot be extended or refreshed.
17101
+ */
17102
+ expiresAt: string
17103
+ /**
17104
+ * Seconds until the access token expires.
17105
+ */
17106
+ expiresIn: number
17107
+ sessionId: string
17108
+ /**
17109
+ * The access JWT of the impersonated session. There is NO refresh token.
17110
+ */
17111
+ accessToken: string
17112
+ }
17113
+
17114
+ export interface UsersSessionsListInput {
17115
+ /**
17116
+ * The end user whose sessions to list.
17117
+ */
17118
+ userId: string
17119
+ }
17120
+
17121
+ export interface UsersSessionsListOutput {
17122
+ sessions: {
17123
+ id: string
17124
+ ip: (string | null)
17125
+ status: ("active" | "revoked")
17126
+ userId: string
17127
+ createdAt: string
17128
+ expiresAt: string
17129
+ revokedAt: (string | null)
17130
+ userAgent: (string | null)
17131
+ lastRefreshedAt: (string | null)
17132
+ absoluteExpiresAt: string
17133
+ }[]
17134
+ }
17135
+
17136
+ export interface UsersSessionsRevokeInput {
17137
+ /**
17138
+ * Revoke every session of this user.
17139
+ */
17140
+ userId?: string
17141
+ /**
17142
+ * Revoke exactly this session.
17143
+ */
17144
+ sessionId?: string
17145
+ }
17146
+
17147
+ export interface UsersSessionsRevokeOutput {
17148
+ revoked: number
17149
+ }
17150
+
17151
+ export interface UsersStatsGetInput {
17152
+ /**
17153
+ * Look-back window for the TIME-BOUNDED numbers — the sign-in counters, the abuse block and `sessions.createdInWindow`: '24h', '7d', '30d' or '90d'. Default '7d'. The user, live-session and factor populations are point-in-time and ignore it.
17154
+ */
17155
+ window?: ("24h" | "7d" | "30d" | "90d")
17156
+ }
17157
+
17158
+ export interface UsersStatsGetOutput {
17159
+ /**
17160
+ * Abuse signals over the window. Denied origins are deliberately absent: that check fires on unauthenticated traffic and is served by logs and metrics, not by per-product audit rows.
17161
+ */
17162
+ abuse: {
17163
+ /**
17164
+ * Accounts locked by a failed-attempt ceiling — password and second factor both.
17165
+ */
17166
+ lockouts: number
17167
+ /**
17168
+ * The subset of `lockouts` caused by the SECOND-factor ceiling.
17169
+ */
17170
+ mfaLockouts: number
17171
+ /**
17172
+ * Mirrors `signIns.failed`, so the abuse block reads on its own.
17173
+ */
17174
+ failedSignIns: number
17175
+ /**
17176
+ * Breach-corpus matches against a user's password.
17177
+ */
17178
+ pwnedPasswordsSeen: number
17179
+ /**
17180
+ * Refresh tokens spent twice outside the grace window — theft, not staleness. Each one revoked a whole session family.
17181
+ */
17182
+ refreshReuseDetected: number
17183
+ }
17184
+ /**
17185
+ * ISO start of that window — the `created_at` floor every counter used.
17186
+ */
17187
+ since: string
17188
+ /**
17189
+ * Point-in-time directory populations by DERIVED status — `user` has no status column, these are computed from `waitlisted` and the ban/delete/erase timestamps.
17190
+ */
17191
+ users: {
17192
+ /**
17193
+ * Every directory row, GDPR tombstones included.
17194
+ */
17195
+ total: number
17196
+ /**
17197
+ * Full accounts: not waitlisted, not banned, not deleted, not erased.
17198
+ */
17199
+ active: number
17200
+ /**
17201
+ * Banned accounts that are still present.
17202
+ */
17203
+ banned: number
17204
+ /**
17205
+ * GDPR-erased tombstones: the id survives, the PII does not.
17206
+ */
17207
+ erased: number
17208
+ /**
17209
+ * SOFT-deleted and still recoverable — not erased.
17210
+ */
17211
+ deleted: number
17212
+ /**
17213
+ * Waitlist signups with no credential yet.
17214
+ */
17215
+ waitlisted: number
17216
+ }
17217
+ /**
17218
+ * The window the time-bounded numbers were computed over.
17219
+ */
17220
+ window: ("24h" | "7d" | "30d" | "90d")
17221
+ /**
17222
+ * Enrolled second factors (TOTP and backup-code batches).
17223
+ */
17224
+ factors: {
17225
+ /**
17226
+ * VERIFIED second factors; an unverified enrollment gates nothing.
17227
+ */
17228
+ verified: number
17229
+ /**
17230
+ * Distinct users holding at least one verified factor.
17231
+ */
17232
+ usersWithFactor: number
17233
+ }
17234
+ /**
17235
+ * Sign-in outcomes over the window, from the audit log.
17236
+ */
17237
+ signIns: {
17238
+ /**
17239
+ * Failed sign-in attempts in the window.
17240
+ */
17241
+ failed: number
17242
+ /**
17243
+ * Successful sign-ins in the window.
17244
+ */
17245
+ succeeded: number
17246
+ /**
17247
+ * succeeded / (succeeded + failed), 4 decimals. NULL — never 0 — when nothing was attempted: an idle window and a totally broken one are opposite facts.
17248
+ */
17249
+ successRate: (number | null)
17250
+ }
17251
+ /**
17252
+ * Device sessions.
17253
+ */
17254
+ sessions: {
17255
+ /**
17256
+ * Live right now: active, unrevoked and inside BOTH the sliding and absolute expiry.
17257
+ */
17258
+ active: number
17259
+ /**
17260
+ * Sessions established since `since`.
17261
+ */
17262
+ createdInWindow: number
17263
+ }
17264
+ }
17265
+
17266
+ export interface UsersUsersBanInput {
17267
+ /**
17268
+ * The opaque user id returned by users_users_create or _list.
17269
+ */
17270
+ userId: string
17271
+ }
17272
+
17273
+ export interface UsersUsersBanOutput {
17274
+ id: string
17275
+ name: (string | null)
17276
+ bannedAt: (string | null)
17277
+ erasedAt: (string | null)
17278
+ imageUrl: (string | null)
17279
+ testUser: boolean
17280
+ createdAt: string
17281
+ deletedAt: (string | null)
17282
+ productId: string
17283
+ updatedAt: string
17284
+ waitlisted: boolean
17285
+ identifiers: {
17286
+ id: string
17287
+ type: "email"
17288
+ value: string
17289
+ isPrimary: boolean
17290
+ verifiedAt: (string | null)
17291
+ valueCanonical: string
17292
+ verificationStatus: ("unverified" | "verified" | "expired")
17293
+ }[]
17294
+ lockedUntil: (string | null)
17295
+ lastSignInAt: (string | null)
17296
+ requiresReset: boolean
17297
+ publicMetadata: UsersUsersBanOutputPublicMetadata
17298
+ unsafeMetadata: UsersUsersBanOutputPublicMetadata
17299
+ privateMetadata: UsersUsersBanOutputPublicMetadata
17300
+ emailChangeLockedUntil: (string | null)
17301
+ }
17302
+ export interface UsersUsersBanOutputPublicMetadata {
17303
+ [k: string]: unknown
17304
+ }
17305
+
17306
+ export interface UsersUsersCreateInput {
17307
+ /**
17308
+ * The user's display name.
17309
+ */
17310
+ name?: string
17311
+ /**
17312
+ * URL of the user's avatar image.
17313
+ */
17314
+ imageUrl?: string
17315
+ /**
17316
+ * Optional credential to store for this user. Hashes only — this toolkit never accepts a plaintext password. Nothing verifies it until Phase 2.
17317
+ */
17318
+ password?: {
17319
+ /**
17320
+ * A PHC-format password hash (e.g. an argon2id string) to store as-is. Never send a plaintext password.
17321
+ */
17322
+ phcHash?: string
17323
+ /**
17324
+ * An imported hash from another system, to be lazily rehashed on the first successful sign-in (Phase 2).
17325
+ */
17326
+ foreignHash?: string
17327
+ /**
17328
+ * Algorithm of `foreignHash`. Required when `foreignHash` is set.
17329
+ */
17330
+ foreignHashAlgo?: ("bcrypt" | "argon2" | "pbkdf2" | "scrypt")
17331
+ }
17332
+ /**
17333
+ * Create this user as a TEST FIXTURE: excluded from metering (it never counts toward retained-users), hidden from the default users_users_list view, never really emailed, and — when the deployment configures one — able to sign in with the fixed magic OTP. REFUSED unless this product has test mode enabled, which a production deployment cannot do. There is no way to set or clear this later. Default false.
17334
+ */
17335
+ testUser?: boolean
17336
+ /**
17337
+ * Create the user as a waitlist signup: no way in until promoted. Default false.
17338
+ */
17339
+ waitlisted?: boolean
17340
+ /**
17341
+ * The email addresses that reach this user. At least one is required.
17342
+ *
17343
+ * @minItems 1
17344
+ */
17345
+ identifiers: [{
17346
+ /**
17347
+ * Identifier kind. Only 'email' exists in this phase.
17348
+ */
17349
+ type: "email"
17350
+ /**
17351
+ * The email address. Stored canonicalised (lowercase, NFC) plus raw for display.
17352
+ */
17353
+ value: string
17354
+ /**
17355
+ * Record the identifier as already verified (use for trusted imports). Only ONE verified copy of a value may exist per product; unverified duplicates are allowed. Default false.
17356
+ */
17357
+ verified?: boolean
17358
+ /**
17359
+ * Mark as the primary identifier of its type. The first identifier of a type defaults to primary.
17360
+ */
17361
+ isPrimary?: boolean
17362
+ }, ...({
17363
+ /**
17364
+ * Identifier kind. Only 'email' exists in this phase.
17365
+ */
17366
+ type: "email"
17367
+ /**
17368
+ * The email address. Stored canonicalised (lowercase, NFC) plus raw for display.
17369
+ */
17370
+ value: string
17371
+ /**
17372
+ * Record the identifier as already verified (use for trusted imports). Only ONE verified copy of a value may exist per product; unverified duplicates are allowed. Default false.
17373
+ */
17374
+ verified?: boolean
17375
+ /**
17376
+ * Mark as the primary identifier of its type. The first identifier of a type defaults to primary.
17377
+ */
17378
+ isPrimary?: boolean
17379
+ })[]]
17380
+ /**
17381
+ * Force a password reset before the user can sign in (use for unverifiable imported hashes). Default false.
17382
+ */
17383
+ requiresReset?: boolean
17384
+ /**
17385
+ * Metadata the end user may READ and that may flow into the JWT. Management-plane write only.
17386
+ */
17387
+ publicMetadata?: {
17388
+ [k: string]: unknown
17389
+ }
17390
+ unsafeMetadata?: UsersUsersCreateInputPublicMetadata
17391
+ privateMetadata?: UsersUsersCreateInputPublicMetadata1
17392
+ }
17393
+ /**
17394
+ * Metadata the end user may WRITE in a later phase. Never trust it for authorization.
17395
+ */
17396
+ export interface UsersUsersCreateInputPublicMetadata {
17397
+ [k: string]: unknown
17398
+ }
17399
+ /**
17400
+ * Metadata visible to the management plane only. Never exposed to the end user.
17401
+ */
17402
+ export interface UsersUsersCreateInputPublicMetadata1 {
17403
+ [k: string]: unknown
17404
+ }
17405
+
17406
+ export interface UsersUsersCreateOutput {
17407
+ id: string
17408
+ name: (string | null)
17409
+ bannedAt: (string | null)
17410
+ erasedAt: (string | null)
17411
+ imageUrl: (string | null)
17412
+ testUser: boolean
17413
+ createdAt: string
17414
+ deletedAt: (string | null)
17415
+ productId: string
17416
+ updatedAt: string
17417
+ waitlisted: boolean
17418
+ identifiers: {
17419
+ id: string
17420
+ type: "email"
17421
+ value: string
17422
+ isPrimary: boolean
17423
+ verifiedAt: (string | null)
17424
+ valueCanonical: string
17425
+ verificationStatus: ("unverified" | "verified" | "expired")
17426
+ }[]
17427
+ lockedUntil: (string | null)
17428
+ lastSignInAt: (string | null)
17429
+ requiresReset: boolean
17430
+ publicMetadata: UsersUsersCreateOutputPublicMetadata
17431
+ unsafeMetadata: UsersUsersCreateOutputPublicMetadata
17432
+ privateMetadata: UsersUsersCreateOutputPublicMetadata
17433
+ emailChangeLockedUntil: (string | null)
17434
+ }
17435
+ export interface UsersUsersCreateOutputPublicMetadata {
17436
+ [k: string]: unknown
17437
+ }
17438
+
17439
+ export interface UsersUsersDeleteInput {
17440
+ /**
17441
+ * The opaque user id returned by users_users_create or _list.
17442
+ */
17443
+ userId: string
17444
+ }
17445
+
17446
+ export interface UsersUsersDeleteOutput {
17447
+ id: string
17448
+ name: (string | null)
17449
+ bannedAt: (string | null)
17450
+ erasedAt: (string | null)
17451
+ imageUrl: (string | null)
17452
+ testUser: boolean
17453
+ createdAt: string
17454
+ deletedAt: (string | null)
17455
+ productId: string
17456
+ updatedAt: string
17457
+ waitlisted: boolean
17458
+ identifiers: {
17459
+ id: string
17460
+ type: "email"
17461
+ value: string
17462
+ isPrimary: boolean
17463
+ verifiedAt: (string | null)
17464
+ valueCanonical: string
17465
+ verificationStatus: ("unverified" | "verified" | "expired")
17466
+ }[]
17467
+ lockedUntil: (string | null)
17468
+ lastSignInAt: (string | null)
17469
+ requiresReset: boolean
17470
+ publicMetadata: UsersUsersDeleteOutputPublicMetadata
17471
+ unsafeMetadata: UsersUsersDeleteOutputPublicMetadata
17472
+ privateMetadata: UsersUsersDeleteOutputPublicMetadata
17473
+ emailChangeLockedUntil: (string | null)
17474
+ }
17475
+ export interface UsersUsersDeleteOutputPublicMetadata {
17476
+ [k: string]: unknown
17477
+ }
17478
+
17479
+ export interface UsersUsersEraseInput {
17480
+ /**
17481
+ * The opaque user id returned by users_users_create or _list.
17482
+ */
17483
+ userId: string
17484
+ }
17485
+
17486
+ export interface UsersUsersEraseOutput {
17487
+ id: string
17488
+ name: (string | null)
17489
+ bannedAt: (string | null)
17490
+ erasedAt: (string | null)
17491
+ imageUrl: (string | null)
17492
+ testUser: boolean
17493
+ createdAt: string
17494
+ deletedAt: (string | null)
17495
+ productId: string
17496
+ updatedAt: string
17497
+ waitlisted: boolean
17498
+ identifiers: {
17499
+ id: string
17500
+ type: "email"
17501
+ value: string
17502
+ isPrimary: boolean
17503
+ verifiedAt: (string | null)
17504
+ valueCanonical: string
17505
+ verificationStatus: ("unverified" | "verified" | "expired")
17506
+ }[]
17507
+ lockedUntil: (string | null)
17508
+ lastSignInAt: (string | null)
17509
+ requiresReset: boolean
17510
+ publicMetadata: UsersUsersEraseOutputPublicMetadata
17511
+ unsafeMetadata: UsersUsersEraseOutputPublicMetadata
17512
+ privateMetadata: UsersUsersEraseOutputPublicMetadata
17513
+ emailChangeLockedUntil: (string | null)
17514
+ }
17515
+ export interface UsersUsersEraseOutputPublicMetadata {
17516
+ [k: string]: unknown
17517
+ }
17518
+
17519
+ export interface UsersUsersExportInput {
17520
+ /**
17521
+ * Rows per page, 1-500. Default 100.
17522
+ */
17523
+ limit?: number
17524
+ /**
17525
+ * Case-insensitive substring match against the user's identifiers (email) and name.
17526
+ */
17527
+ query?: string
17528
+ /**
17529
+ * Opaque cursor from the previous page's `nextCursor`. Omit for the first page.
17530
+ */
17531
+ cursor?: string
17532
+ /**
17533
+ * Filter by status: 'active', 'banned' or 'waitlisted'. Omit for all.
17534
+ */
17535
+ status?: ("active" | "banned" | "waitlisted")
17536
+ /**
17537
+ * Include soft-deleted users. Default false.
17538
+ */
17539
+ includeDeleted?: boolean
17540
+ }
17541
+
17542
+ export interface UsersUsersExportOutput {
17543
+ count: number
17544
+ users: {
17545
+ id: string
17546
+ name: (string | null)
17547
+ bannedAt: (string | null)
17548
+ erasedAt: (string | null)
17549
+ imageUrl: (string | null)
17550
+ testUser: boolean
17551
+ createdAt: string
17552
+ deletedAt: (string | null)
17553
+ productId: string
17554
+ updatedAt: string
17555
+ waitlisted: boolean
17556
+ identifiers: {
17557
+ id: string
17558
+ type: "email"
17559
+ value: string
17560
+ isPrimary: boolean
17561
+ verifiedAt: (string | null)
17562
+ valueCanonical: string
17563
+ verificationStatus: ("unverified" | "verified" | "expired")
17564
+ }[]
17565
+ lockedUntil: (string | null)
17566
+ lastSignInAt: (string | null)
17567
+ requiresReset: boolean
17568
+ publicMetadata: UsersUsersExportOutputPublicMetadata
17569
+ unsafeMetadata: UsersUsersExportOutputPublicMetadata
17570
+ privateMetadata: UsersUsersExportOutputPublicMetadata
17571
+ emailChangeLockedUntil: (string | null)
17572
+ }[]
17573
+ exportedAt: string
17574
+ nextCursor: (string | null)
17575
+ }
17576
+ export interface UsersUsersExportOutputPublicMetadata {
17577
+ [k: string]: unknown
17578
+ }
17579
+
17580
+ export interface UsersUsersGetInput {
17581
+ /**
17582
+ * The opaque user id returned by users_users_create or _list.
17583
+ */
17584
+ userId: string
17585
+ }
17586
+
17587
+ export interface UsersUsersGetOutput {
17588
+ id: string
17589
+ name: (string | null)
17590
+ bannedAt: (string | null)
17591
+ erasedAt: (string | null)
17592
+ imageUrl: (string | null)
17593
+ testUser: boolean
17594
+ createdAt: string
17595
+ deletedAt: (string | null)
17596
+ productId: string
17597
+ updatedAt: string
17598
+ waitlisted: boolean
17599
+ identifiers: {
17600
+ id: string
17601
+ type: "email"
17602
+ value: string
17603
+ isPrimary: boolean
17604
+ verifiedAt: (string | null)
17605
+ valueCanonical: string
17606
+ verificationStatus: ("unverified" | "verified" | "expired")
17607
+ }[]
17608
+ lockedUntil: (string | null)
17609
+ lastSignInAt: (string | null)
17610
+ requiresReset: boolean
17611
+ publicMetadata: UsersUsersGetOutputPublicMetadata
17612
+ unsafeMetadata: UsersUsersGetOutputPublicMetadata
17613
+ privateMetadata: UsersUsersGetOutputPublicMetadata
17614
+ emailChangeLockedUntil: (string | null)
17615
+ }
17616
+ export interface UsersUsersGetOutputPublicMetadata {
17617
+ [k: string]: unknown
17618
+ }
17619
+
17620
+ export interface UsersUsersImportInput {
17621
+ /**
17622
+ * The users to import, at most 500 per call — batch client-side beyond that. Each row: identifiers (email), optional profile, optional password HASH, optional flags.
17623
+ *
17624
+ * @minItems 1
17625
+ * @maxItems 500
17626
+ */
17627
+ users: [unknown, ...(unknown)[]]
17628
+ }
17629
+
17630
+ export interface UsersUsersImportOutput {
17631
+ failed: number
17632
+ created: number
17633
+ results: {
17634
+ row: number
17635
+ reason: (string | null)
17636
+ status: ("created" | "skipped" | "failed")
17637
+ userId: (string | null)
17638
+ }[]
17639
+ skipped: number
17640
+ requested: number
17641
+ }
17642
+
17643
+ export interface UsersUsersInviteInput {
17644
+ /**
17645
+ * The invitee's display name.
17646
+ */
17647
+ name?: string
17648
+ /**
17649
+ * The address to invite. Stored canonicalised (lowercase, NFC) plus raw for display.
17650
+ */
17651
+ email: string
17652
+ /**
17653
+ * Metadata the end user may READ and that may flow into the JWT.
17654
+ */
17655
+ publicMetadata?: {
17656
+ [k: string]: unknown
17657
+ }
17658
+ /**
17659
+ * Metadata visible to the management plane only. Never exposed to the end user.
17660
+ */
17661
+ privateMetadata?: {
17662
+ [k: string]: unknown
17663
+ }
17664
+ }
17665
+
17666
+ export interface UsersUsersInviteOutput {
17667
+ mailed: boolean
17668
+ userId: string
17669
+ created: boolean
17670
+ expiresAt: string
17671
+ }
17672
+
17673
+ export interface UsersUsersListInput {
17674
+ /**
17675
+ * Page size, 1-100. Default 25.
17676
+ */
17677
+ limit?: number
17678
+ /**
17679
+ * Case-insensitive substring match against the user's identifiers (email) and name.
17680
+ */
17681
+ query?: string
17682
+ /**
17683
+ * Opaque cursor from a previous response's `nextCursor`. Omit for the first page.
17684
+ */
17685
+ cursor?: string
17686
+ /**
17687
+ * Filter by status: 'active' (not banned, not waitlisted), 'banned', or 'waitlisted'. Omit for all.
17688
+ */
17689
+ status?: ("active" | "banned" | "waitlisted")
17690
+ /**
17691
+ * Include soft-deleted users. Default false — deleted users are hidden.
17692
+ */
17693
+ includeDeleted?: boolean
17694
+ /**
17695
+ * Include TEST USERS. Default false: a test user is a fixture, not a customer — it is excluded from metering and from this listing for the same reason. Ask for it explicitly when you are debugging the fixtures themselves.
17696
+ */
17697
+ includeTestUsers?: boolean
17698
+ /**
17699
+ * Include waitlist signups. Default false: a waitlisted row is somebody who ASKED to join and cannot sign in, so it is not part of the directory an operator browses. Use `status: "waitlisted"` to see only them, or `users_waitlist_list` for the funnel.
17700
+ */
17701
+ includeWaitlisted?: boolean
17702
+ }
17703
+
17704
+ export interface UsersUsersListOutput {
17705
+ users: {
17706
+ id: string
17707
+ name: (string | null)
17708
+ bannedAt: (string | null)
17709
+ erasedAt: (string | null)
17710
+ imageUrl: (string | null)
17711
+ testUser: boolean
17712
+ createdAt: string
17713
+ deletedAt: (string | null)
17714
+ productId: string
17715
+ updatedAt: string
17716
+ waitlisted: boolean
17717
+ identifiers: {
17718
+ id: string
17719
+ type: "email"
17720
+ value: string
17721
+ isPrimary: boolean
17722
+ verifiedAt: (string | null)
17723
+ valueCanonical: string
17724
+ verificationStatus: ("unverified" | "verified" | "expired")
17725
+ }[]
17726
+ lockedUntil: (string | null)
17727
+ lastSignInAt: (string | null)
17728
+ requiresReset: boolean
17729
+ publicMetadata: UsersUsersListOutputPublicMetadata
17730
+ unsafeMetadata: UsersUsersListOutputPublicMetadata
17731
+ privateMetadata: UsersUsersListOutputPublicMetadata
17732
+ emailChangeLockedUntil: (string | null)
17733
+ }[]
17734
+ nextCursor: (string | null)
17735
+ }
17736
+ export interface UsersUsersListOutputPublicMetadata {
17737
+ [k: string]: unknown
17738
+ }
17739
+
17740
+ export interface UsersUsersSetPrimaryIdentifierInput {
17741
+ /**
17742
+ * The address to make primary. Must not already belong, verified, to another user of this product.
17743
+ */
17744
+ email: string
17745
+ /**
17746
+ * What identity proofing was done and under which ticket. Recorded verbatim in the audit row — this is the whole point of the tool being audited.
17747
+ */
17748
+ reason: string
17749
+ /**
17750
+ * The user whose primary email address is being replaced.
17751
+ */
17752
+ userId: string
17753
+ }
17754
+
17755
+ export interface UsersUsersSetPrimaryIdentifierOutput {
17756
+ requestId: string
17757
+ scheduledFor: string
17758
+ }
17759
+
17760
+ export interface UsersUsersUnbanInput {
17761
+ /**
17762
+ * The opaque user id returned by users_users_create or _list.
17763
+ */
17764
+ userId: string
17765
+ }
17766
+
17767
+ export interface UsersUsersUnbanOutput {
17768
+ id: string
17769
+ name: (string | null)
17770
+ bannedAt: (string | null)
17771
+ erasedAt: (string | null)
17772
+ imageUrl: (string | null)
17773
+ testUser: boolean
17774
+ createdAt: string
17775
+ deletedAt: (string | null)
17776
+ productId: string
17777
+ updatedAt: string
17778
+ waitlisted: boolean
17779
+ identifiers: {
17780
+ id: string
17781
+ type: "email"
17782
+ value: string
17783
+ isPrimary: boolean
17784
+ verifiedAt: (string | null)
17785
+ valueCanonical: string
17786
+ verificationStatus: ("unverified" | "verified" | "expired")
17787
+ }[]
17788
+ lockedUntil: (string | null)
17789
+ lastSignInAt: (string | null)
17790
+ requiresReset: boolean
17791
+ publicMetadata: UsersUsersUnbanOutputPublicMetadata
17792
+ unsafeMetadata: UsersUsersUnbanOutputPublicMetadata
17793
+ privateMetadata: UsersUsersUnbanOutputPublicMetadata
17794
+ emailChangeLockedUntil: (string | null)
17795
+ }
17796
+ export interface UsersUsersUnbanOutputPublicMetadata {
17797
+ [k: string]: unknown
17798
+ }
17799
+
17800
+ export interface UsersUsersUpdateInput {
17801
+ /**
17802
+ * The user's display name. Pass null to clear.
17803
+ */
17804
+ name?: (string | null)
17805
+ /**
17806
+ * The user to update.
17807
+ */
17808
+ userId: string
17809
+ /**
17810
+ * URL of the user's avatar image. Pass null to clear.
17811
+ */
17812
+ imageUrl?: (string | null)
17813
+ /**
17814
+ * Whether the user is still a waitlist signup.
17815
+ */
17816
+ waitlisted?: boolean
17817
+ /**
17818
+ * ISO-8601 timestamp of a temporary, self-healing lockout — the failed-attempt ceiling sets it and it expires on its own. Pass null to unlock the account immediately (audited as `user.unlocked`).
17819
+ */
17820
+ lockedUntil?: (string | null)
17821
+ /**
17822
+ * Whether the user must reset their password before signing in.
17823
+ */
17824
+ requiresReset?: boolean
17825
+ /**
17826
+ * REPLACES the whole public metadata bag. Management-plane write, end-user read.
17827
+ */
17828
+ publicMetadata?: {
17829
+ [k: string]: unknown
17830
+ }
17831
+ unsafeMetadata?: UsersUsersUpdateInputPublicMetadata
17832
+ privateMetadata?: UsersUsersUpdateInputPublicMetadata1
17833
+ }
17834
+ /**
17835
+ * REPLACES the whole unsafe metadata bag. End-user writable in a later phase; never authoritative.
17836
+ */
17837
+ export interface UsersUsersUpdateInputPublicMetadata {
17838
+ [k: string]: unknown
17839
+ }
17840
+ /**
17841
+ * REPLACES the whole private metadata bag. Management plane only.
17842
+ */
17843
+ export interface UsersUsersUpdateInputPublicMetadata1 {
17844
+ [k: string]: unknown
17845
+ }
17846
+
17847
+ export interface UsersUsersUpdateOutput {
17848
+ id: string
17849
+ name: (string | null)
17850
+ bannedAt: (string | null)
17851
+ erasedAt: (string | null)
17852
+ imageUrl: (string | null)
17853
+ testUser: boolean
17854
+ createdAt: string
17855
+ deletedAt: (string | null)
17856
+ productId: string
17857
+ updatedAt: string
17858
+ waitlisted: boolean
17859
+ identifiers: {
17860
+ id: string
17861
+ type: "email"
17862
+ value: string
17863
+ isPrimary: boolean
17864
+ verifiedAt: (string | null)
17865
+ valueCanonical: string
17866
+ verificationStatus: ("unverified" | "verified" | "expired")
17867
+ }[]
17868
+ lockedUntil: (string | null)
17869
+ lastSignInAt: (string | null)
17870
+ requiresReset: boolean
17871
+ publicMetadata: UsersUsersUpdateOutputPublicMetadata
17872
+ unsafeMetadata: UsersUsersUpdateOutputPublicMetadata
17873
+ privateMetadata: UsersUsersUpdateOutputPublicMetadata
17874
+ emailChangeLockedUntil: (string | null)
17875
+ }
17876
+ export interface UsersUsersUpdateOutputPublicMetadata {
17877
+ [k: string]: unknown
17878
+ }
17879
+
17880
+ export interface UsersWaitlistEraseInput {
17881
+ /**
17882
+ * The waitlisted user whose entry and directory row to erase.
17883
+ */
17884
+ userId: string
17885
+ }
17886
+
17887
+ export interface UsersWaitlistEraseOutput {
17888
+ erased: boolean
17889
+ }
17890
+
17891
+ export interface UsersWaitlistFunnelInput {
17892
+
17893
+ }
17894
+
17895
+ export interface UsersWaitlistFunnelOutput {
17896
+ total: number
17897
+ invited: number
17898
+ pending: number
17899
+ withdrawn: number
17900
+ registered: number
17901
+ unconfirmed: number
17902
+ }
17903
+
17904
+ export interface UsersWaitlistImportInput {
17905
+ /**
17906
+ * The legacy signups to import, at most 500 per call — batch client-side beyond that.
17907
+ *
17908
+ * @minItems 1
17909
+ * @maxItems 500
17910
+ */
17911
+ entries: [{
17912
+ /**
17913
+ * The signup's display name.
17914
+ */
17915
+ name?: string
17916
+ /**
17917
+ * The consent proof from the source system. REQUIRED: a waitlist entry with no evidence of consent is exactly what this import exists to avoid creating.
17918
+ */
17919
+ consent: {
17920
+ /**
17921
+ * The IP the source system recorded, when it recorded one.
17922
+ */
17923
+ ip?: (string | null)
17924
+ /**
17925
+ * Where the acceptance happened in the source system, e.g. `legacy-widget`.
17926
+ */
17927
+ source: string
17928
+ /**
17929
+ * The user agent the source system recorded, when it recorded one.
17930
+ */
17931
+ userAgent?: (string | null)
17932
+ /**
17933
+ * When they accepted it, as recorded by the source system. Carried over verbatim — this is the evidence, and stamping it with the import time would destroy it.
17934
+ */
17935
+ acceptedAt: string
17936
+ /**
17937
+ * The privacy-policy version the signer accepted in the SOURCE system.
17938
+ */
17939
+ policyVersion: string
17940
+ }
17941
+ /**
17942
+ * Whether the address had proven itself reachable in the source system. Default true — a legacy list has already been mailed. Pass false to land the row as unconfirmed, where it is reported separately and is never invited.
17943
+ */
17944
+ confirmed?: boolean
17945
+ /**
17946
+ * The email address on the legacy list. Stored canonicalised plus raw for display.
17947
+ */
17948
+ identifier: string
17949
+ /**
17950
+ * Referrer / UTM attribution the source system recorded.
17951
+ */
17952
+ attribution?: {
17953
+ /**
17954
+ * utm_term of the visit.
17955
+ */
17956
+ utmTerm?: string
17957
+ /**
17958
+ * The document referrer of the signup page.
17959
+ */
17960
+ referrer?: string
17961
+ /**
17962
+ * utm_medium of the visit.
17963
+ */
17964
+ utmMedium?: string
17965
+ /**
17966
+ * utm_source of the visit.
17967
+ */
17968
+ utmSource?: string
17969
+ /**
17970
+ * utm_content of the visit.
17971
+ */
17972
+ utmContent?: string
17973
+ /**
17974
+ * The URL the signup was submitted from.
17975
+ */
17976
+ landingPage?: string
17977
+ /**
17978
+ * utm_campaign of the visit.
17979
+ */
17980
+ utmCampaign?: string
17981
+ }
17982
+ /**
17983
+ * End-user-writable metadata to carry onto the created user.
17984
+ */
17985
+ unsafeMetadata?: {
17986
+ [k: string]: unknown
17987
+ }
17988
+ }, ...({
17989
+ /**
17990
+ * The signup's display name.
17991
+ */
17992
+ name?: string
17993
+ /**
17994
+ * The consent proof from the source system. REQUIRED: a waitlist entry with no evidence of consent is exactly what this import exists to avoid creating.
17995
+ */
17996
+ consent: {
17997
+ /**
17998
+ * The IP the source system recorded, when it recorded one.
17999
+ */
18000
+ ip?: (string | null)
18001
+ /**
18002
+ * Where the acceptance happened in the source system, e.g. `legacy-widget`.
18003
+ */
18004
+ source: string
18005
+ /**
18006
+ * The user agent the source system recorded, when it recorded one.
18007
+ */
18008
+ userAgent?: (string | null)
18009
+ /**
18010
+ * When they accepted it, as recorded by the source system. Carried over verbatim — this is the evidence, and stamping it with the import time would destroy it.
18011
+ */
18012
+ acceptedAt: string
18013
+ /**
18014
+ * The privacy-policy version the signer accepted in the SOURCE system.
18015
+ */
18016
+ policyVersion: string
18017
+ }
18018
+ /**
18019
+ * Whether the address had proven itself reachable in the source system. Default true — a legacy list has already been mailed. Pass false to land the row as unconfirmed, where it is reported separately and is never invited.
18020
+ */
18021
+ confirmed?: boolean
18022
+ /**
18023
+ * The email address on the legacy list. Stored canonicalised plus raw for display.
18024
+ */
18025
+ identifier: string
18026
+ /**
18027
+ * Referrer / UTM attribution the source system recorded.
18028
+ */
18029
+ attribution?: {
18030
+ /**
18031
+ * utm_term of the visit.
18032
+ */
18033
+ utmTerm?: string
18034
+ /**
18035
+ * The document referrer of the signup page.
18036
+ */
18037
+ referrer?: string
18038
+ /**
18039
+ * utm_medium of the visit.
18040
+ */
18041
+ utmMedium?: string
18042
+ /**
18043
+ * utm_source of the visit.
18044
+ */
18045
+ utmSource?: string
18046
+ /**
18047
+ * utm_content of the visit.
18048
+ */
18049
+ utmContent?: string
18050
+ /**
18051
+ * The URL the signup was submitted from.
18052
+ */
18053
+ landingPage?: string
18054
+ /**
18055
+ * utm_campaign of the visit.
18056
+ */
18057
+ utmCampaign?: string
18058
+ }
18059
+ /**
18060
+ * End-user-writable metadata to carry onto the created user.
18061
+ */
18062
+ unsafeMetadata?: {
18063
+ [k: string]: unknown
18064
+ }
18065
+ })[]]
18066
+ }
18067
+
18068
+ export interface UsersWaitlistImportOutput {
18069
+ failed: number
18070
+ results: {
18071
+ row: number
18072
+ reason: (string | null)
18073
+ status: ("imported" | "skipped" | "failed")
18074
+ userId: (string | null)
18075
+ }[]
18076
+ skipped: number
18077
+ imported: number
18078
+ requested: number
18079
+ }
18080
+
18081
+ export interface UsersWaitlistInviteInput {
18082
+ /**
18083
+ * The waitlisted users to promote, up to 100 per call. Each gets the STANDARD invite email; accepting it is what creates their credential.
18084
+ *
18085
+ * @minItems 1
18086
+ * @maxItems 100
18087
+ */
18088
+ userIds: [string, ...(string)[]]
18089
+ }
18090
+
18091
+ export interface UsersWaitlistInviteOutput {
18092
+ invited: number
18093
+ results: {
18094
+ reason: (("suppressed" | "not_found" | "already_registered") | null)
18095
+ status: ("invited" | "skipped")
18096
+ userId: string
18097
+ }[]
18098
+ skipped: number
18099
+ }
18100
+
18101
+ export interface UsersWaitlistListInput {
18102
+ /**
18103
+ * Entries per page, 1-100. Default 25.
18104
+ */
18105
+ limit?: number
18106
+ /**
18107
+ * Opaque cursor from the previous page's `nextCursor`. Omit for the first page.
18108
+ */
18109
+ cursor?: string
18110
+ /**
18111
+ * Filter by funnel status: 'pending', 'invited', 'registered' or 'withdrawn'. Omit for all.
18112
+ */
18113
+ status?: ("pending" | "invited" | "registered" | "withdrawn")
18114
+ /**
18115
+ * Double opt-in only: false returns entries whose address never confirmed. Omit for both.
18116
+ */
18117
+ confirmed?: boolean
18118
+ }
18119
+
18120
+ export interface UsersWaitlistListOutput {
18121
+ entries: {
18122
+ status: ("pending" | "invited" | "registered" | "withdrawn")
18123
+ userId: string
18124
+ createdAt: string
18125
+ invitedAt: (string | null)
18126
+ identifier: string
18127
+ attribution: {
18128
+ [k: string]: unknown
18129
+ }
18130
+ confirmedAt: (string | null)
18131
+ withdrawnAt: (string | null)
18132
+ consentProof: {
18133
+ [k: string]: unknown
18134
+ }
18135
+ registeredAt: (string | null)
18136
+ inviteTokenId: (string | null)
18137
+ }[]
18138
+ nextCursor: (string | null)
18139
+ }
18140
+
18141
+ export interface UsersWebhooksCreateInput {
18142
+ /**
18143
+ * Where deliveries are POSTed. HTTPS only, no embedded credentials.
18144
+ */
18145
+ url: string
18146
+ /**
18147
+ * Which events to deliver. `user.created`, `user.updated` and `user.deleted` mirror the directory; `session.revoked` fires on sign-out, ban, erase and refresh-token reuse.
18148
+ *
18149
+ * @minItems 1
18150
+ */
18151
+ events: [("user.created" | "user.updated" | "user.deleted" | "session.revoked"), ...(("user.created" | "user.updated" | "user.deleted" | "session.revoked"))[]]
18152
+ /**
18153
+ * A label only humans read — which system this endpoint feeds.
18154
+ */
18155
+ description?: string
18156
+ }
18157
+
18158
+ export interface UsersWebhooksCreateOutput {
18159
+ id: string
18160
+ url: string
18161
+ active: boolean
18162
+ events: ("user.created" | "user.updated" | "user.deleted" | "session.revoked")[]
18163
+ secret: string
18164
+ createdAt: string
18165
+ updatedAt: string
18166
+ description: (string | null)
18167
+ secretPrefix: string
18168
+ }
18169
+
18170
+ export interface UsersWebhooksDeleteInput {
18171
+ /**
18172
+ * Id of the webhook endpoint.
18173
+ */
18174
+ id: string
18175
+ }
18176
+
18177
+ export interface UsersWebhooksDeleteOutput {
18178
+ id: string
18179
+ deleted: true
18180
+ }
18181
+
18182
+ export interface UsersWebhooksDeliveriesListInput {
18183
+ /**
18184
+ * Id of the webhook endpoint whose deliveries to list.
18185
+ */
18186
+ id: string
18187
+ limit?: number
18188
+ }
18189
+
18190
+ export interface UsersWebhooksDeliveriesListOutput {
18191
+ deliveries: {
18192
+ id: string
18193
+ status: ("pending" | "succeeded" | "failed")
18194
+ eventId: string
18195
+ attempts: number
18196
+ createdAt: string
18197
+ eventType: ("user.created" | "user.updated" | "user.deleted" | "session.revoked")
18198
+ lastError: (string | null)
18199
+ webhookId: string
18200
+ lastAttemptAt: (string | null)
18201
+ responseStatus: (number | null)
18202
+ }[]
18203
+ }
18204
+
18205
+ export interface UsersWebhooksGetInput {
18206
+ /**
18207
+ * Id of the webhook endpoint.
18208
+ */
18209
+ id: string
18210
+ }
18211
+
18212
+ export interface UsersWebhooksGetOutput {
18213
+ id: string
18214
+ url: string
18215
+ active: boolean
18216
+ events: ("user.created" | "user.updated" | "user.deleted" | "session.revoked")[]
18217
+ createdAt: string
18218
+ updatedAt: string
18219
+ description: (string | null)
18220
+ secretPrefix: string
18221
+ }
18222
+
18223
+ export interface UsersWebhooksListInput {
18224
+
18225
+ }
18226
+
18227
+ export interface UsersWebhooksListOutput {
18228
+ webhooks: {
18229
+ id: string
18230
+ url: string
18231
+ active: boolean
18232
+ events: ("user.created" | "user.updated" | "user.deleted" | "session.revoked")[]
18233
+ createdAt: string
18234
+ updatedAt: string
18235
+ description: (string | null)
18236
+ secretPrefix: string
18237
+ }[]
18238
+ }
18239
+
18240
+ export interface UsersWebhooksRotateSecretInput {
18241
+ /**
18242
+ * Id of the webhook endpoint.
18243
+ */
18244
+ id: string
18245
+ }
18246
+
18247
+ export interface UsersWebhooksRotateSecretOutput {
18248
+ id: string
18249
+ url: string
18250
+ active: boolean
18251
+ events: ("user.created" | "user.updated" | "user.deleted" | "session.revoked")[]
18252
+ secret: string
18253
+ createdAt: string
18254
+ updatedAt: string
18255
+ description: (string | null)
18256
+ secretPrefix: string
18257
+ }
18258
+
18259
+ export interface UsersWebhooksUpdateInput {
18260
+ /**
18261
+ * Id of the webhook endpoint.
18262
+ */
18263
+ id: string
18264
+ /**
18265
+ * Where deliveries are POSTed. HTTPS only, no embedded credentials.
18266
+ */
18267
+ url?: string
18268
+ /**
18269
+ * false pauses delivery without losing the endpoint or its secret.
18270
+ */
18271
+ active?: boolean
18272
+ /**
18273
+ * Which events to deliver. `user.created`, `user.updated` and `user.deleted` mirror the directory; `session.revoked` fires on sign-out, ban, erase and refresh-token reuse.
18274
+ *
18275
+ * @minItems 1
18276
+ */
18277
+ events?: [("user.created" | "user.updated" | "user.deleted" | "session.revoked"), ...(("user.created" | "user.updated" | "user.deleted" | "session.revoked"))[]]
18278
+ description?: (string | null)
18279
+ }
18280
+
18281
+ export interface UsersWebhooksUpdateOutput {
18282
+ id: string
18283
+ url: string
18284
+ active: boolean
18285
+ events: ("user.created" | "user.updated" | "user.deleted" | "session.revoked")[]
18286
+ createdAt: string
18287
+ updatedAt: string
18288
+ description: (string | null)
18289
+ secretPrefix: string
18290
+ }
18291
+
15464
18292
  export interface WaitlistConfigGetInput {
15465
18293
 
15466
18294
  }