@productcraft/waitlist 0.1.1 → 0.2.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.
package/dist/index.d.ts CHANGED
@@ -57,6 +57,30 @@ interface paths {
57
57
  patch?: never;
58
58
  trace?: never;
59
59
  };
60
+ "/v1/workspaces/{workspace_id}/stats": {
61
+ parameters: {
62
+ query?: never;
63
+ header?: never;
64
+ path?: never;
65
+ cookie?: never;
66
+ };
67
+ /**
68
+ * Waitlist stats for a workspace
69
+ * @description Waitlist count, total entries, signups in the window, the most recent signup and a daily signup series, across every waitlist in the workspace.
70
+ *
71
+ * **Active** means a signup: a new waitlist entry.
72
+ *
73
+ * Days are UTC. Counts only: no entrant emails, names, referrers or IPs. Cached for up to 60 seconds (`generated_at`).
74
+ */
75
+ get: operations["WorkspaceStatsController_get"];
76
+ put?: never;
77
+ post?: never;
78
+ delete?: never;
79
+ options?: never;
80
+ head?: never;
81
+ patch?: never;
82
+ trace?: never;
83
+ };
60
84
  "/v1/workspaces/{workspace_id}/waitlist/settings": {
61
85
  parameters: {
62
86
  query?: never;
@@ -64,7 +88,10 @@ interface paths {
64
88
  path?: never;
65
89
  cookie?: never;
66
90
  };
67
- /** Read workspace-level Waitlist defaults */
91
+ /**
92
+ * Read workspace-level Waitlist defaults
93
+ * @description The settings plus `email_setup` (whether Waitlist emails can go out and what is missing; the sender domain and template names are checked against Mail, cached for up to 60 seconds) and `skipped_sends` (emails not sent in the last 7 days because the setup was incomplete). Waitlist never falls back to a ProductCraft sender: an email that cannot go out is recorded, not sent.
94
+ */
68
95
  get: operations["SettingsController_get"];
69
96
  /** Update workspace-level Waitlist defaults */
70
97
  put: operations["SettingsController_update"];
@@ -75,6 +102,26 @@ interface paths {
75
102
  patch?: never;
76
103
  trace?: never;
77
104
  };
105
+ "/v1/workspaces/{workspace_id}/waitlist/settings/notifications/{slot}/test": {
106
+ parameters: {
107
+ query?: never;
108
+ header?: never;
109
+ path?: never;
110
+ cookie?: never;
111
+ };
112
+ get?: never;
113
+ put?: never;
114
+ /**
115
+ * Send me a test of one Waitlist email
116
+ * @description Sends the slot's real Mail template, with the workspace's real Waitlist sender (the workspace default or the custom address) and example values, to your own verified account address. It cannot be sent anywhere else. It uses your own Mail access, goes through the same send path as real emails, and shows up in Mail > Emails. At most 10 tests per person per hour. Not available to API keys (a key has no inbox).
117
+ */
118
+ post: operations["SettingsController_sendTest"];
119
+ delete?: never;
120
+ options?: never;
121
+ head?: never;
122
+ patch?: never;
123
+ trace?: never;
124
+ };
78
125
  "/v1/workspaces/{workspace_id}/waitlists": {
79
126
  parameters: {
80
127
  query?: never;
@@ -85,7 +132,10 @@ interface paths {
85
132
  /** List waitlists in this workspace */
86
133
  get: operations["WaitlistController_list"];
87
134
  put?: never;
88
- /** Create a waitlist (workspace-scoped) */
135
+ /**
136
+ * Create a waitlist (workspace-scoped)
137
+ * @description Pass `status: "active"` to accept public sign-ups straight away. Without it the waitlist starts as a draft, and the response says so in `accepting_signups: false` and `signups_note`.
138
+ */
89
139
  post: operations["WaitlistController_create"];
90
140
  delete?: never;
91
141
  options?: never;
@@ -136,7 +186,10 @@ interface paths {
136
186
  path?: never;
137
187
  cookie?: never;
138
188
  };
139
- /** Aggregate counts, viral coefficient, top referrers + referrals */
189
+ /**
190
+ * Aggregate counts, viral coefficient, top referrers + referrals
191
+ * @description Test entries ("Add test signup") are left out unless `include_test=true`.
192
+ */
140
193
  get: operations["AnalyticsController_get"];
141
194
  put?: never;
142
195
  post?: never;
@@ -170,7 +223,7 @@ interface paths {
170
223
  path?: never;
171
224
  cookie?: never;
172
225
  };
173
- /** List entries on a waitlist (paginated) */
226
+ /** List entries on a waitlist (queue-position order, cursor-paginated). Filterable by status, free-text search across email/name, and a created_at window. */
174
227
  get: operations["EntryController_list"];
175
228
  put?: never;
176
229
  post?: never;
@@ -204,7 +257,7 @@ interface paths {
204
257
  path?: never;
205
258
  cookie?: never;
206
259
  };
207
- /** Total entry count for a waitlist */
260
+ /** Entry count for a waitlist (test entries left out unless include_test=true) */
208
261
  get: operations["EntryController_count"];
209
262
  put?: never;
210
263
  post?: never;
@@ -221,7 +274,7 @@ interface paths {
221
274
  path?: never;
222
275
  cookie?: never;
223
276
  };
224
- /** Stream every entry as CSV (admin export) */
277
+ /** Stream every entry as CSV (admin export; test entries left out unless include_test=true) */
225
278
  get: operations["EntryController_exportCsv"];
226
279
  put?: never;
227
280
  post?: never;
@@ -267,6 +320,26 @@ interface paths {
267
320
  patch?: never;
268
321
  trace?: never;
269
322
  };
323
+ "/v1/workspaces/{workspace_id}/waitlists/{waitlist_id}/test-entries": {
324
+ parameters: {
325
+ query?: never;
326
+ header?: never;
327
+ path?: never;
328
+ cookie?: never;
329
+ };
330
+ get?: never;
331
+ put?: never;
332
+ /**
333
+ * Add a test signup
334
+ * @description Creates an entry marked `is_test` with a generated Amazon SES mailbox-simulator address (`success+test-…@simulator.amazonses.com`). Works on draft and paused waitlists and ignores `max_entries`. The entry shows in the entries list, takes a negative position, and is left out of counts, analytics, exports and webhooks unless asked. No email is sent unless `send_welcome_email` is true. Delete it like any other entry.
335
+ */
336
+ post: operations["TestEntryController_create"];
337
+ delete?: never;
338
+ options?: never;
339
+ head?: never;
340
+ patch?: never;
341
+ trace?: never;
342
+ };
270
343
  "/v1/workspaces/{workspace_id}/waitlists/{waitlist_id}/variants": {
271
344
  parameters: {
272
345
  query?: never;
@@ -274,7 +347,7 @@ interface paths {
274
347
  path?: never;
275
348
  cookie?: never;
276
349
  };
277
- /** List all variants on a waitlist */
350
+ /** List variants on a waitlist (cursor-paginated). BREAKING: this endpoint used to return a bare JSON array; it now returns the standard `{ data, pagination }` envelope. */
278
351
  get: operations["VariantController_list"];
279
352
  put?: never;
280
353
  /** Create a variant */
@@ -310,10 +383,18 @@ interface paths {
310
383
  path?: never;
311
384
  cookie?: never;
312
385
  };
313
- /** List webhooks for the workspace (secrets masked) */
386
+ /**
387
+ * List webhooks for the workspace, newest first, cursor-paginated (secrets masked)
388
+ * @deprecated
389
+ * @description Deprecated: use `/v1/workspaces/{workspace_id}/webhooks/endpoints` (event descriptions, Send test that reports the result, event log, replay, rotation with a grace period). Responses carry `Deprecation: true` and `Sunset: Fri, 15 Jan 2027 00:00:00 GMT`.
390
+ */
314
391
  get: operations["WebhookController_list"];
315
392
  put?: never;
316
- /** Create a workspace webhook. The response includes the per-row signing secret in clear EXACTLY ONCE — copy it now. */
393
+ /**
394
+ * Create a workspace webhook. The response includes the signing secret in clear EXACTLY ONCE — copy it now.
395
+ * @deprecated
396
+ * @description Deprecated: use `/v1/workspaces/{workspace_id}/webhooks/endpoints` (event descriptions, Send test that reports the result, event log, replay, rotation with a grace period). Responses carry `Deprecation: true` and `Sunset: Fri, 15 Jan 2027 00:00:00 GMT`.
397
+ */
317
398
  post: operations["WebhookController_create"];
318
399
  delete?: never;
319
400
  options?: never;
@@ -321,6 +402,172 @@ interface paths {
321
402
  patch?: never;
322
403
  trace?: never;
323
404
  };
405
+ "/v1/workspaces/{workspace_id}/webhooks/endpoints": {
406
+ parameters: {
407
+ query?: never;
408
+ header?: never;
409
+ path?: never;
410
+ cookie?: never;
411
+ };
412
+ /**
413
+ * List webhook endpoints, oldest first.
414
+ * @description At most 10, so this is always one page. Signing secrets are never returned here, only their last 4 characters.
415
+ */
416
+ get: operations["WebhooksController_waitlist_workspace_listEndpoints"];
417
+ put?: never;
418
+ /**
419
+ * Add a webhook endpoint. Returns its signing secret once.
420
+ * @description Deliveries are signed with the Standard Webhooks headers `webhook-id`, `webhook-timestamp` and `webhook-signature` (`v1,<base64 HMAC-SHA256 of "<id>.<timestamp>.<body>">`); the returned `whsec_…` secret works unchanged with any Standard Webhooks library. Failed deliveries are retried after 1 min, 5 min, 30 min, 2 h, 6 h and 24 h.
421
+ */
422
+ post: operations["WebhooksController_waitlist_workspace_createEndpoint"];
423
+ delete?: never;
424
+ options?: never;
425
+ head?: never;
426
+ patch?: never;
427
+ trace?: never;
428
+ };
429
+ "/v1/workspaces/{workspace_id}/webhooks/endpoints/{endpoint_id}": {
430
+ parameters: {
431
+ query?: never;
432
+ header?: never;
433
+ path?: never;
434
+ cookie?: never;
435
+ };
436
+ /** Get one webhook endpoint (without its secret). */
437
+ get: operations["WebhooksController_waitlist_workspace_getEndpoint"];
438
+ put?: never;
439
+ post?: never;
440
+ /**
441
+ * Delete a webhook endpoint.
442
+ * @description Queued retries are dropped. Its past attempts stay in the event log until the events expire.
443
+ */
444
+ delete: operations["WebhooksController_waitlist_workspace_deleteEndpoint"];
445
+ options?: never;
446
+ head?: never;
447
+ /**
448
+ * Change a webhook endpoint: URL, description, events, on/off.
449
+ * @description Only the fields sent change. `enabled: true` (or a new URL) also clears an automatic disable. Switching off cancels queued retries. The secret is unchanged; rotate it with `POST …/rotate-secret`.
450
+ */
451
+ patch: operations["WebhooksController_waitlist_workspace_updateEndpoint"];
452
+ trace?: never;
453
+ };
454
+ "/v1/workspaces/{workspace_id}/webhooks/endpoints/{endpoint_id}/rotate-secret": {
455
+ parameters: {
456
+ query?: never;
457
+ header?: never;
458
+ path?: never;
459
+ cookie?: never;
460
+ };
461
+ get?: never;
462
+ put?: never;
463
+ /**
464
+ * Rotate the signing secret. The new one is returned once.
465
+ * @description For `grace_hours` (default 24) the previous secret keeps signing too: `webhook-signature` then lists one `v1,` signature per secret, so receivers can switch over without dropping a delivery.
466
+ */
467
+ post: operations["WebhooksController_waitlist_workspace_rotateSecret"];
468
+ delete?: never;
469
+ options?: never;
470
+ head?: never;
471
+ patch?: never;
472
+ trace?: never;
473
+ };
474
+ "/v1/workspaces/{workspace_id}/webhooks/endpoints/{endpoint_id}/test": {
475
+ parameters: {
476
+ query?: never;
477
+ header?: never;
478
+ path?: never;
479
+ cookie?: never;
480
+ };
481
+ get?: never;
482
+ put?: never;
483
+ /**
484
+ * Send a test event to this endpoint now and return the result.
485
+ * @description Delivers the catalogue example of `event_type`, signed like any delivery, with `"test": true` in the body. Works while the endpoint is switched off or not subscribed to that type, is logged in the event log, and is never retried or counted toward an automatic disable. Waits up to 15 s for your receiver.
486
+ */
487
+ post: operations["WebhooksController_waitlist_workspace_sendTest"];
488
+ delete?: never;
489
+ options?: never;
490
+ head?: never;
491
+ patch?: never;
492
+ trace?: never;
493
+ };
494
+ "/v1/workspaces/{workspace_id}/webhooks/event-types": {
495
+ parameters: {
496
+ query?: never;
497
+ header?: never;
498
+ path?: never;
499
+ cookie?: never;
500
+ };
501
+ /**
502
+ * List the events an endpoint can subscribe to.
503
+ * @description Each type with a plain description, its group and an example `data` object (what "Send test" delivers).
504
+ */
505
+ get: operations["WebhooksController_waitlist_workspace_listEventTypes"];
506
+ put?: never;
507
+ post?: never;
508
+ delete?: never;
509
+ options?: never;
510
+ head?: never;
511
+ patch?: never;
512
+ trace?: never;
513
+ };
514
+ "/v1/workspaces/{workspace_id}/webhooks/events": {
515
+ parameters: {
516
+ query?: never;
517
+ header?: never;
518
+ path?: never;
519
+ cookie?: never;
520
+ };
521
+ /**
522
+ * List webhook events, newest first (kept for 30 days).
523
+ * @description Every event logged while at least one endpoint existed, with the latest state per endpoint and when the next retry is due.
524
+ */
525
+ get: operations["WebhooksController_waitlist_workspace_listEvents"];
526
+ put?: never;
527
+ post?: never;
528
+ delete?: never;
529
+ options?: never;
530
+ head?: never;
531
+ patch?: never;
532
+ trace?: never;
533
+ };
534
+ "/v1/workspaces/{workspace_id}/webhooks/events/{event_id}": {
535
+ parameters: {
536
+ query?: never;
537
+ header?: never;
538
+ path?: never;
539
+ cookie?: never;
540
+ };
541
+ /** Get one webhook event with every delivery attempt. */
542
+ get: operations["WebhooksController_waitlist_workspace_getEvent"];
543
+ put?: never;
544
+ post?: never;
545
+ delete?: never;
546
+ options?: never;
547
+ head?: never;
548
+ patch?: never;
549
+ trace?: never;
550
+ };
551
+ "/v1/workspaces/{workspace_id}/webhooks/events/{event_id}/replay": {
552
+ parameters: {
553
+ query?: never;
554
+ header?: never;
555
+ path?: never;
556
+ cookie?: never;
557
+ };
558
+ get?: never;
559
+ put?: never;
560
+ /**
561
+ * Send a logged event again, to its endpoints or to one endpoint.
562
+ * @description Same body and `webhook-id`, freshly signed, to every switched-on endpoint that receives this event type now, or only to `endpoint_id`. Waits for the receivers (up to 15 s each) and returns the attempts. A success cancels a retry still queued for that endpoint.
563
+ */
564
+ post: operations["WebhooksController_waitlist_workspace_replay"];
565
+ delete?: never;
566
+ options?: never;
567
+ head?: never;
568
+ patch?: never;
569
+ trace?: never;
570
+ };
324
571
  "/v1/workspaces/{workspace_id}/webhooks/{id}": {
325
572
  parameters: {
326
573
  query?: never;
@@ -328,15 +575,27 @@ interface paths {
328
575
  path?: never;
329
576
  cookie?: never;
330
577
  };
331
- /** Get a webhook (secret masked) */
578
+ /**
579
+ * Get a webhook (secret masked)
580
+ * @deprecated
581
+ * @description Deprecated: use `/v1/workspaces/{workspace_id}/webhooks/endpoints` (event descriptions, Send test that reports the result, event log, replay, rotation with a grace period). Responses carry `Deprecation: true` and `Sunset: Fri, 15 Jan 2027 00:00:00 GMT`.
582
+ */
332
583
  get: operations["WebhookController_get"];
333
584
  put?: never;
334
585
  post?: never;
335
- /** Delete a webhook */
586
+ /**
587
+ * Delete a webhook
588
+ * @deprecated
589
+ * @description Deprecated: use `/v1/workspaces/{workspace_id}/webhooks/endpoints` (event descriptions, Send test that reports the result, event log, replay, rotation with a grace period). Responses carry `Deprecation: true` and `Sunset: Fri, 15 Jan 2027 00:00:00 GMT`.
590
+ */
336
591
  delete: operations["WebhookController_remove"];
337
592
  options?: never;
338
593
  head?: never;
339
- /** Update url / events / active flag */
594
+ /**
595
+ * Update url / events / active flag. `active: true` also clears an automatic switch-off.
596
+ * @deprecated
597
+ * @description Deprecated: use `/v1/workspaces/{workspace_id}/webhooks/endpoints` (event descriptions, Send test that reports the result, event log, replay, rotation with a grace period). Responses carry `Deprecation: true` and `Sunset: Fri, 15 Jan 2027 00:00:00 GMT`.
598
+ */
340
599
  patch: operations["WebhookController_update"];
341
600
  trace?: never;
342
601
  };
@@ -347,7 +606,11 @@ interface paths {
347
606
  path?: never;
348
607
  cookie?: never;
349
608
  };
350
- /** Recent delivery attempts for a webhook (default 50, max 200, newest first) */
609
+ /**
610
+ * Delivery attempts for a webhook, newest first, cursor-paginated (default 50, max 200)
611
+ * @deprecated
612
+ * @description Deprecated: use `/v1/workspaces/{workspace_id}/webhooks/endpoints` (event descriptions, Send test that reports the result, event log, replay, rotation with a grace period). Responses carry `Deprecation: true` and `Sunset: Fri, 15 Jan 2027 00:00:00 GMT`.
613
+ */
351
614
  get: operations["WebhookController_recentDeliveries"];
352
615
  put?: never;
353
616
  post?: never;
@@ -366,7 +629,11 @@ interface paths {
366
629
  };
367
630
  get?: never;
368
631
  put?: never;
369
- /** Rotate the signing secret. Returns the new secret in clear EXACTLY ONCE. */
632
+ /**
633
+ * Rotate the signing secret. Returns the new secret in clear EXACTLY ONCE; the old one stops at once.
634
+ * @deprecated
635
+ * @description Deprecated: use `/v1/workspaces/{workspace_id}/webhooks/endpoints` (event descriptions, Send test that reports the result, event log, replay, rotation with a grace period). Responses carry `Deprecation: true` and `Sunset: Fri, 15 Jan 2027 00:00:00 GMT`.
636
+ */
370
637
  post: operations["WebhookController_rotateSecret"];
371
638
  delete?: never;
372
639
  options?: never;
@@ -383,7 +650,11 @@ interface paths {
383
650
  };
384
651
  get?: never;
385
652
  put?: never;
386
- /** Fire a synthetic test event to this webhook (asynchronous; check the destination logs) */
653
+ /**
654
+ * Send the example of an event to this webhook; the attempt shows in `/deliveries`
655
+ * @deprecated
656
+ * @description Deprecated: use `/v1/workspaces/{workspace_id}/webhooks/endpoints` (event descriptions, Send test that reports the result, event log, replay, rotation with a grace period). Responses carry `Deprecation: true` and `Sunset: Fri, 15 Jan 2027 00:00:00 GMT`.
657
+ */
387
658
  post: operations["WebhookController_fireTest"];
388
659
  delete?: never;
389
660
  options?: never;
@@ -394,6 +665,38 @@ interface paths {
394
665
  }
395
666
  interface components {
396
667
  schemas: {
668
+ AnalyticsTimelinePointDto: {
669
+ /** @description Signups on that day (0 for gap days). */
670
+ count: number;
671
+ /**
672
+ * @description UTC day, `YYYY-MM-DD`.
673
+ * @example 2026-08-01
674
+ */
675
+ date: string;
676
+ };
677
+ AnalyticsTimelineResponseDto: {
678
+ /** @enum {string} */
679
+ granularity: "day";
680
+ /** @description Oldest first; every day in [since, until) is present. */
681
+ points: components["schemas"]["AnalyticsTimelinePointDto"][];
682
+ };
683
+ AnalyticsTopReferralDto: {
684
+ /** @description `position - referral_count * referral_boost`, floored at 1. */
685
+ effective_position: number;
686
+ email: string;
687
+ /** Format: uuid */
688
+ id: string;
689
+ name: string;
690
+ /** @description Immutable signup position. */
691
+ position: number;
692
+ referral_code: string;
693
+ referral_count: number;
694
+ };
695
+ AnalyticsTopReferrerDto: {
696
+ count: number;
697
+ /** @description Free-text referrer value; null groups entries without one. */
698
+ referrer: string | null;
699
+ };
397
700
  BulkEntryActionDto: {
398
701
  /**
399
702
  * @description Action to apply to every id.
@@ -420,6 +723,25 @@ interface components {
420
723
  */
421
724
  send_email: boolean;
422
725
  };
726
+ BulkEntryActionResponseDto: {
727
+ failed: number;
728
+ /** @description Number of unique ids processed (after de-dupe). */
729
+ requested: number;
730
+ results: components["schemas"]["BulkEntryResultDto"][];
731
+ succeeded: number;
732
+ };
733
+ BulkEntryErrorDto: {
734
+ /** @description HTTP-style status code for the per-row failure. */
735
+ code: number;
736
+ message: string;
737
+ };
738
+ BulkEntryResultDto: {
739
+ error?: components["schemas"]["BulkEntryErrorDto"];
740
+ /** Format: uuid */
741
+ id: string;
742
+ /** @enum {string} */
743
+ status: "ok" | "error";
744
+ };
423
745
  CreateEntryDto: {
424
746
  /**
425
747
  * @description Email address
@@ -435,7 +757,7 @@ interface components {
435
757
  * @example Ada Lovelace
436
758
  */
437
759
  name: string;
438
- /** @description reCAPTCHA v3 token; verified server-side when the waitlist has settings.recaptcha_site_key */
760
+ /** @description reCAPTCHA v3 token, created with the action `waitlist_signup`. Required when the waitlist has a reCAPTCHA site key; verified server-side with the secret key saved on the waitlist. */
439
761
  recaptcha_token?: string;
440
762
  /** @description Referral code from a prior signup; bumps that signup’s position when honoured */
441
763
  referral_code?: string;
@@ -447,6 +769,23 @@ interface components {
447
769
  */
448
770
  variant_id?: string;
449
771
  };
772
+ CreateTestEntryDto: {
773
+ /**
774
+ * @description Name on the test entry. Defaults to "Test signup".
775
+ * @example Test signup
776
+ */
777
+ name?: string;
778
+ /**
779
+ * @description Send the welcome email for this entry. It goes to the entry's mailbox-simulator address, which accepts it without delivering to a real inbox. Default `false`.
780
+ * @default false
781
+ */
782
+ send_welcome_email: boolean;
783
+ /**
784
+ * @description Send `entry.created` (and `entry.approved` when the waitlist auto-approves) to your webhook endpoints for this entry. The payload carries `is_test: true`. Default `false`.
785
+ * @default false
786
+ */
787
+ trigger_webhooks: boolean;
788
+ };
450
789
  CreateVariantDto: {
451
790
  /** @default true */
452
791
  active: boolean;
@@ -466,6 +805,15 @@ interface components {
466
805
  weight: number;
467
806
  };
468
807
  CreateWaitlistDto: {
808
+ /**
809
+ * @description Web origins (scheme and host, for example `https://acme.com` or `http://localhost:3000`) that browsers may submit public sign-ups from. `https://*.acme.com` matches any subdomain. An empty list means any origin. A browser request from another origin gets 403 `ORIGIN_NOT_ALLOWED`; server-side calls without an `Origin` header are not checked. Entries are normalised (lower case, no trailing slash, default port dropped).
810
+ * @default []
811
+ * @example [
812
+ * "https://acme.com",
813
+ * "https://*.acme.com"
814
+ * ]
815
+ */
816
+ allowed_origins: string[];
469
817
  /** @description Description returned in the public waitlist payload — customer frontends typically render it under the display name on their signup form. */
470
818
  description?: string;
471
819
  /**
@@ -473,13 +821,19 @@ interface components {
473
821
  * @example Early Access Program
474
822
  */
475
823
  display_name: string;
476
- /** @description Waitlist settings (max_entries, approval_required, custom_fields, confirmation_message, referral_boost) */
824
+ /** @description Waitlist settings (max_entries, approval_required, custom_fields, confirmation_message, referral_boost, referral_rewards, recaptcha_site_key). To turn on reCAPTCHA v3, send recaptcha_site_key together with recaptcha_secret_key (both from your reCAPTCHA admin console); the secret is stored encrypted and is never returned. Send recaptcha_site_key: null to turn it off. */
477
825
  settings?: Record<string, never>;
478
826
  /**
479
827
  * @description URL-safe slug
480
828
  * @example early-access
481
829
  */
482
830
  slug: string;
831
+ /**
832
+ * @description Start state. `active` accepts public sign-ups straight away; `draft` (the default) refuses them with 422 until the status is changed to `active`.
833
+ * @default draft
834
+ * @enum {string}
835
+ */
836
+ status: "draft" | "active";
483
837
  };
484
838
  CreateWebhookDto: {
485
839
  /** @description Disabled webhooks store events but never deliver */
@@ -495,6 +849,83 @@ interface components {
495
849
  /** @description Destination URL (must be https in prod) */
496
850
  url: string;
497
851
  };
852
+ CreateWebhookEndpointDto: {
853
+ /** @example Production receiver */
854
+ description?: string | null;
855
+ /**
856
+ * @description Create it switched off.
857
+ * @default true
858
+ */
859
+ enabled: boolean;
860
+ /**
861
+ * @description Event types from `GET …/webhooks/event-types`. Empty or omitted means every event, including types added later.
862
+ * @example [
863
+ * "entry.created",
864
+ * "entry.approved"
865
+ * ]
866
+ */
867
+ event_types?: ("entry.created" | "entry.approved" | "entry.rejected")[];
868
+ /**
869
+ * Format: uri
870
+ * @description Where to send events: an absolute https:// URL on a public host.
871
+ * @example https://api.acme.com/webhooks
872
+ */
873
+ url: string;
874
+ };
875
+ EffectiveSenderDto: {
876
+ /**
877
+ * @description The From Waitlist emails go out with (a bare address or `Name <address>`); null when none is set, or when the workspace default could not be read (`verified: null`).
878
+ * @example Acme <hello@acme.com>
879
+ */
880
+ address: string | null;
881
+ /**
882
+ * @description The sender domain's live `verification_status` in Mail (`verified`, `pending`, `temporary_failure`, `failed`, …) in both modes, `deleted` when the domain behind the workspace default was removed, `not_found` for a custom sender domain that is gone (or receive-only), or null when unknown or there is no address. The shared `SenderDomainStatus` enum, the same in Mail and Auth.
883
+ * @example verified
884
+ */
885
+ domain_status: components["schemas"]["SenderDomainStatus"] | null;
886
+ /**
887
+ * @description `workspace`: the workspace default sender set in Mail. `custom`: the Waitlist sender domain + address.
888
+ * @example workspace
889
+ * @enum {string}
890
+ */
891
+ source: "workspace" | "custom";
892
+ /**
893
+ * @description Whether mail from this sender goes out right now, checked live in Mail (cached up to 60 seconds). null: not checked (your role cannot read Mail, or Mail did not answer).
894
+ * @example true
895
+ */
896
+ verified: boolean | null;
897
+ };
898
+ EmailSetupDto: {
899
+ /**
900
+ * @description Whether the sender domain and template names were checked against Mail on this read (results are cached for up to 60 seconds). `false` when Mail could not be asked, for example because the caller cannot read Mail domains or templates; nothing is reported missing on an unchecked item.
901
+ * @example true
902
+ */
903
+ mail_checked: boolean;
904
+ /**
905
+ * @description What is missing, in a fixed order. `not_enabled`: notifications are off. `no_sender_domain`: no sender domain is chosen, or the chosen one no longer exists in Mail (or is receive-only). `sender_domain_unverified`: the sender domain is not verified in Mail yet. `no_sender_address`: no From address is set. `no_template`: at least one email has no template, or its template was deleted in Mail; `missing_templates` says which. Empty when `state` is `ready`.
906
+ * @example [
907
+ * "no_template"
908
+ * ]
909
+ */
910
+ missing: ("not_enabled" | "no_sender_domain" | "sender_domain_unverified" | "no_sender_address" | "no_template")[];
911
+ /**
912
+ * @description The emails whose template is not set or no longer exists in Mail: `welcome` (on signup), `approved`, `rejected`.
913
+ * @example [
914
+ * "welcome"
915
+ * ]
916
+ */
917
+ missing_templates: ("welcome" | "approved" | "rejected")[];
918
+ /**
919
+ * @description `ready`: every piece is in place and emails go out. `incomplete`: notifications are on but something in `missing` stops some or all emails. `off`: notifications are off (`notifications_via_envoi = false`), so Waitlist sends no email and webhooks are the way to reach signups.
920
+ * @example incomplete
921
+ * @enum {string}
922
+ */
923
+ state: "ready" | "incomplete" | "off";
924
+ };
925
+ EntryCountResponseDto: {
926
+ /** @description Number of entries on the waitlist. Test entries are left out unless `include_test=true`. */
927
+ count: number;
928
+ };
498
929
  EntryListPaginationDto: {
499
930
  has_more: boolean;
500
931
  next_cursor: string | null;
@@ -510,8 +941,14 @@ interface components {
510
941
  interest: string | null;
511
942
  invited_at: string | null;
512
943
  invited_to_app_slug: string | null;
944
+ /**
945
+ * @description Made with "Add test signup". Test entries use a mailbox-simulator address and are left out of counts, analytics, exports and webhooks unless asked.
946
+ * @example false
947
+ */
948
+ is_test: boolean;
513
949
  metadata: Record<string, never>;
514
950
  name: string;
951
+ /** @description Place in the queue, from 1. Test entries have negative positions (-1, -2…) so they never take a real place. */
515
952
  position: number;
516
953
  referral_code: string;
517
954
  referral_count: number;
@@ -523,6 +960,23 @@ interface components {
523
960
  waitlist_id: string;
524
961
  workspace_id: string;
525
962
  };
963
+ ErrorResponseDto: {
964
+ /**
965
+ * @description Stable, machine-readable error code; branch on this, not on `message`. Always present. A route-specific code when the route defines one (e.g. `WEBHOOK_ENDPOINT_NOT_FOUND`, `SERVICE_NOT_ENABLED`), otherwise the generic code for the status: `BAD_REQUEST`, `VALIDATION_ERROR` (400 from request validation), `UNAUTHORIZED`, `FORBIDDEN`, `NOT_FOUND`, `CONFLICT`, `PAYLOAD_TOO_LARGE`, `UNPROCESSABLE_ENTITY`, `RATE_LIMITED`, `INTERNAL_SERVER_ERROR`, `SERVICE_UNAVAILABLE`.
966
+ * @example SERVICE_NOT_ENABLED
967
+ */
968
+ code: string;
969
+ /**
970
+ * @description Human-readable error message. May be a class-validator array on 400.
971
+ * @example Policy denies waitlist.read on pcft:workspace/7a0c2f7e-2b8d-4f7f-9a51-3f1f0e1f3c11
972
+ */
973
+ message: string | string[];
974
+ /**
975
+ * @description HTTP status code echoed in the body. Spelled `statusCode` (camelCase) in every ProductCraft API.
976
+ * @example 403
977
+ */
978
+ statusCode: number;
979
+ };
526
980
  InviteToAppDto: {
527
981
  /** @description Auth app slug to invite into; defaults to the workspace Waitlist settings default (`default_heimdall_app_slug`) */
528
982
  app_slug?: string;
@@ -532,23 +986,245 @@ interface components {
532
986
  */
533
987
  send_email: boolean;
534
988
  };
535
- TestWebhookDto: {
989
+ InviteToAppResponseDto: {
990
+ /** @description The entry row after `invited_at` / `invited_to_app_slug` were stamped. */
991
+ entry: components["schemas"]["EntryResponseDto"];
992
+ /** @description Auth invite id created in the linked app. */
993
+ invite_id: string;
994
+ /** @description Invite acceptance URL, when the Auth app returned one. Baked into the approval email when send_email is enabled. */
995
+ invite_url?: string;
996
+ };
997
+ LegacyWebhookDeliveryAttemptDto: {
998
+ /** @description Which attempt this was for the event: 1 for the first delivery, then 2 to 7 for the automatic retries (1m, 5m, 30m, 2h, 6h and 24h after each failure). Retries keep the same `event_id`. A test or a replay is numbered in the same sequence. */
999
+ attempt_number: number;
1000
+ /** Format: date-time */
1001
+ attempted_at: string;
1002
+ error_message: string | null;
1003
+ /** @description Id of the event (`evt_…`), the same across retries. */
1004
+ event_id: string;
1005
+ /** @enum {string} */
1006
+ event_type: "entry.created" | "entry.approved" | "entry.rejected";
1007
+ /** Format: uuid */
1008
+ id: string;
1009
+ latency_ms: number | null;
1010
+ response_body_truncated: string | null;
1011
+ /** @description HTTP status from the destination; null when the request errored before a response. */
1012
+ status_code: number | null;
1013
+ /** Format: uuid */
1014
+ webhook_id: string;
1015
+ };
1016
+ ListWebhookEndpointsResponseDto: {
1017
+ data: components["schemas"]["WebhookEndpointDto"][];
1018
+ /** @description Always one page (an endpoint limit applies). */
1019
+ pagination: components["schemas"]["WebhookPaginationDto"];
1020
+ };
1021
+ ListWebhookEventTypesResponseDto: {
1022
+ data: components["schemas"]["WebhookEventTypeDto"][];
1023
+ };
1024
+ ListWebhookEventsResponseDto: {
1025
+ data: components["schemas"]["WebhookEventDto"][];
1026
+ pagination: components["schemas"]["WebhookPaginationDto"];
1027
+ };
1028
+ NotificationTestResponseDto: {
536
1029
  /**
537
- * @description Event type to fire as a synthetic test
538
- * @enum {string}
1030
+ * @description The From it went out with.
1031
+ * @example Acme <hello@acme.com>
539
1032
  */
540
- event: "entry.created" | "entry.approved" | "entry.rejected";
541
- /** @description Waitlist UUID to reference in the synthetic payload. Defaults to a placeholder UUID when omitted. */
542
- waitlist_id?: string;
1033
+ from: string | null;
1034
+ /**
1035
+ * Format: uuid
1036
+ * @description The Mail message id; look it up in Mail > Emails to follow delivery.
1037
+ * @example 0d6c1c3e-5f2a-4b8e-9d17-3a4b5c6d7e8f
1038
+ */
1039
+ message_id: string | null;
1040
+ /**
1041
+ * @description The Mail template that was sent.
1042
+ * @example waitlist-welcome
1043
+ */
1044
+ template_name: string;
1045
+ /**
1046
+ * Format: email
1047
+ * @description Your own verified account address: tests only ever go to the person who asked.
1048
+ * @example you@acme.com
1049
+ */
1050
+ to: string;
543
1051
  };
544
- UpdateEntryStatusDto: {
1052
+ OriginNotAllowedErrorDto: {
545
1053
  /**
546
- * @description Target status
1054
+ * @example ORIGIN_NOT_ALLOWED
547
1055
  * @enum {string}
548
1056
  */
549
- status: "approved" | "rejected";
1057
+ code: "ORIGIN_NOT_ALLOWED";
1058
+ /** @example Sign-ups from https://evil.test are not allowed for this waitlist. Add the origin to the waitlist's allowed origins. */
1059
+ message: string;
1060
+ /**
1061
+ * @description The `Origin` header the request carried.
1062
+ * @example https://evil.test
1063
+ */
1064
+ origin: string;
1065
+ /** @example 403 */
1066
+ statusCode: number;
550
1067
  };
551
- UpdateSettingsDto: {
1068
+ PaginationDto: {
1069
+ /**
1070
+ * @description True iff another page exists; if true, pass `next_cursor` on the next request.
1071
+ * @example false
1072
+ */
1073
+ has_more: boolean;
1074
+ /**
1075
+ * @description Opaque cursor for the next page. `null` when no more pages are available.
1076
+ * @example eyJwb3NpdGlvbiI6MjB9
1077
+ */
1078
+ next_cursor: string | null;
1079
+ };
1080
+ PublicEntryCreatedDto: {
1081
+ /** Format: date-time */
1082
+ created_at: string;
1083
+ /** @description Visible position after applying the referral boost — "you would be #N if approved now". Equals `position` at signup time (no referrals yet), and always for a test sign-up. */
1084
+ effective_position: number;
1085
+ /** @description Normalised (lower-cased) email. */
1086
+ email: string;
1087
+ /**
1088
+ * Format: uuid
1089
+ * @description Entry id.
1090
+ */
1091
+ id: string;
1092
+ /** @description `true` when the email is an Amazon SES mailbox-simulator address (`…@simulator.amazonses.com`). Such a sign-up is stored as a test entry: it is left out of counts, analytics, exports and webhooks, and only the welcome email (to the simulator) goes out. */
1093
+ is_test: boolean;
1094
+ name: string;
1095
+ /** @description Immutable signup position (1-based order of signup). Negative for a test sign-up (`is_test: true`), which takes no place in line. */
1096
+ position: number;
1097
+ /** @description Referral code for this signup. Build your referral URL from it and pass it as `referral_code` on subsequent signups. */
1098
+ referral_code: string;
1099
+ /**
1100
+ * @description `approved` when the waitlist auto-approves; `pending` when admin approval is required.
1101
+ * @enum {string}
1102
+ */
1103
+ status: "pending" | "approved";
1104
+ };
1105
+ PublicLeaderboardEntryDto: {
1106
+ /**
1107
+ * @description Masked email, e.g. `a***@example.com`.
1108
+ * @example a***@example.com
1109
+ */
1110
+ masked_email: string;
1111
+ /** @description Signup position on the waitlist. */
1112
+ position: number;
1113
+ /** @description Number of honoured referrals. */
1114
+ referral_count: number;
1115
+ };
1116
+ PublicReferralRewardMilestoneDto: {
1117
+ /** @description Referral count that unlocks the reward. */
1118
+ count: number;
1119
+ /** @description Reward description shown to the signer-up. */
1120
+ reward: string;
1121
+ };
1122
+ PublicReferralRewardsDto: {
1123
+ /** @description Milestones sorted by count, ascending. Empty when the waitlist has no referral rewards configured. */
1124
+ milestones: components["schemas"]["PublicReferralRewardMilestoneDto"][];
1125
+ };
1126
+ PublicWaitlistBrandDto: {
1127
+ brand_logo_url: string | null;
1128
+ brand_name: string | null;
1129
+ /** @description Primary brand colour as #RRGGBB. */
1130
+ primary_color: string | null;
1131
+ };
1132
+ PublicWaitlistCustomFieldDto: {
1133
+ /** @description Stable field key. Submit values under this key in the entry `metadata` object. */
1134
+ key: string;
1135
+ /** @description Human-readable label for the field. */
1136
+ label?: string;
1137
+ /** @description Choices for select-style fields. */
1138
+ options?: string[];
1139
+ required?: boolean;
1140
+ /** @description Field type hint (e.g. `text`, `select`). */
1141
+ type?: string;
1142
+ };
1143
+ PublicWaitlistInfoDto: {
1144
+ brand: components["schemas"]["PublicWaitlistBrandDto"];
1145
+ /** @description Canonical workspace slug. When the request URL used a stale slug, compare with the URL slug and 301-redirect. */
1146
+ canonical_workspace_slug: string;
1147
+ /** @description Message to show after a successful signup. */
1148
+ confirmation_message: string;
1149
+ custom_fields: components["schemas"]["PublicWaitlistCustomFieldDto"][];
1150
+ description: string | null;
1151
+ /** @description Display name (active variant copy wins over the stored name). */
1152
+ display_name: string;
1153
+ /** @description reCAPTCHA v3 site key. When non-null, POST .../entries requires a `recaptcha_token` created with the action `waitlist_signup`. */
1154
+ recaptcha_site_key: string | null;
1155
+ referral_rewards: components["schemas"]["PublicReferralRewardsDto"];
1156
+ /** @description Waitlist slug. */
1157
+ slug: string;
1158
+ /** @description Always `active` — non-active waitlists return 404. */
1159
+ status: string;
1160
+ /** @description Active A/B or locale variant served for this request; null when none configured. */
1161
+ variant: components["schemas"]["PublicWaitlistVariantDto"] | null;
1162
+ /** @description Workspace slug the request resolved against. */
1163
+ workspace_slug: string;
1164
+ };
1165
+ PublicWaitlistVariantDto: {
1166
+ /**
1167
+ * Format: uuid
1168
+ * @description Active variant id. Round-trip it as `variant_id` on POST .../entries to attribute the signup.
1169
+ */
1170
+ id: string;
1171
+ /** @enum {string} */
1172
+ kind: "ab" | "locale";
1173
+ /** @description BCP-47 locale of the served copy. */
1174
+ locale: string;
1175
+ };
1176
+ ReplayWebhookEventResponseDto: {
1177
+ /** @description One attempt per endpoint it was sent to. */
1178
+ attempts: components["schemas"]["WebhookDeliveryAttemptDto"][];
1179
+ event_id: string;
1180
+ };
1181
+ RotateWebhookSecretDto: {
1182
+ /**
1183
+ * @description Hours the previous secret keeps signing too (0 ends it now).
1184
+ * @default 24
1185
+ */
1186
+ grace_hours: number;
1187
+ };
1188
+ SendWebhookTestDto: {
1189
+ /**
1190
+ * @description Which event to send; its catalogue example is the `data`.
1191
+ * @example entry.created
1192
+ * @enum {string}
1193
+ */
1194
+ event_type: "entry.created" | "entry.approved" | "entry.rejected";
1195
+ };
1196
+ /** @enum {string} */
1197
+ SenderDomainStatus: "not_started" | "pending" | "partially_verified" | "verified" | "temporary_failure" | "failed" | "disabled" | "deleted" | "not_found";
1198
+ StatsSeriesPointDto: {
1199
+ /**
1200
+ * Format: date
1201
+ * @description UTC calendar day.
1202
+ * @example 2026-10-07
1203
+ */
1204
+ date: string;
1205
+ /**
1206
+ * @description Value for that day.
1207
+ * @example 4
1208
+ */
1209
+ value: number;
1210
+ };
1211
+ TestWebhookDto: {
1212
+ /**
1213
+ * @description Event type to fire as a synthetic test
1214
+ * @enum {string}
1215
+ */
1216
+ event: "entry.created" | "entry.approved" | "entry.rejected";
1217
+ /** @description Accepted for older clients and ignored: the test delivers the event's example payload from `GET …/webhooks/event-types`. */
1218
+ waitlist_id?: string;
1219
+ };
1220
+ UpdateEntryStatusDto: {
1221
+ /**
1222
+ * @description Target status
1223
+ * @enum {string}
1224
+ */
1225
+ status: "approved" | "rejected";
1226
+ };
1227
+ UpdateSettingsDto: {
552
1228
  /** @description Mail template name used for entry.approved notifications. Must already exist in the workspace template store. */
553
1229
  approved_template_name?: string | null;
554
1230
  /** @description Logo URL returned in the public waitlist payload. Customer frontends render it on their own signup form. */
@@ -557,16 +1233,25 @@ interface components {
557
1233
  brand_name?: string;
558
1234
  /** @description Auth consumer-app slug to invite approved entries into. null clears the link. */
559
1235
  default_heimdall_app_slug?: string | null;
560
- /** @description Verified sender address used as the From envelope on Waitlist notifications. Must belong to default_sender_domain_id. null clears the override. */
1236
+ /**
1237
+ * Format: email
1238
+ * @description The From used when `sender_mode` is `custom` (kept, but unused, in `workspace` mode). Must belong to default_sender_domain_id. null clears it.
1239
+ */
561
1240
  default_sender_address?: string | null;
562
1241
  /** @description Mail domain UUID to use as default sender for Waitlist notifications. null clears the override. */
563
1242
  default_sender_domain_id?: string | null;
564
- /** @description Route Waitlist notifications through the Mail service (workspace sender domain + per-event template selection) instead of staying silent. Requires default_sender_domain_id, default_sender_address, and a template name for every supported event. Default false; when off, Waitlist sends no notification emails and the customer is expected to handle email via the webhook lane. */
1243
+ /** @description Route Waitlist notifications through the Mail service instead of staying silent. Needs a sender (the workspace default in `workspace` mode, or the custom domain + address) and a template for every event. Turning it on (from off) creates the default templates `waitlist-welcome`, `waitlist-approved` and `waitlist-rejected` in Mail for every empty slot, reusing a template that already has that name, with your own Mail access. Default false; when off, Waitlist sends no notification emails and the customer is expected to handle email via the webhook lane. */
565
1244
  notifications_via_envoi?: boolean;
566
1245
  /** @description Primary brand colour as #RRGGBB */
567
1246
  primary_color?: string;
568
1247
  /** @description Mail template name used for entry.rejected notifications. Must already exist in the workspace template store. */
569
1248
  rejected_template_name?: string | null;
1249
+ /**
1250
+ * @description Where the From comes from. `workspace` (the default): the workspace default sender set in Mail, resolved at send time, so changing it in Mail changes it for every product. `custom`: `default_sender_domain_id` + `default_sender_address`. Sending `default_sender_address` without `sender_mode` sets `custom`; sending it as null sets `workspace`.
1251
+ * @example workspace
1252
+ * @enum {string}
1253
+ */
1254
+ sender_mode?: "workspace" | "custom";
570
1255
  /** @description Mail template name used for entry.created notifications. Must already exist in the workspace template store. */
571
1256
  welcome_template_name?: string | null;
572
1257
  };
@@ -577,11 +1262,18 @@ interface components {
577
1262
  weight?: number;
578
1263
  };
579
1264
  UpdateWaitlistDto: {
1265
+ /**
1266
+ * @description Web origins (scheme and host, for example `https://acme.com` or `http://localhost:3000`) that browsers may submit public sign-ups from. `https://*.acme.com` matches any subdomain. An empty list means any origin. A browser request from another origin gets 403 `ORIGIN_NOT_ALLOWED`; server-side calls without an `Origin` header are not checked. Entries are normalised (lower case, no trailing slash, default port dropped). Replaces the whole list; send `[]` to allow any origin again.
1267
+ * @example [
1268
+ * "https://acme.com"
1269
+ * ]
1270
+ */
1271
+ allowed_origins?: string[];
580
1272
  /** @description New description */
581
1273
  description?: string;
582
1274
  /** @description New display name */
583
1275
  display_name?: string;
584
- /** @description Updated settings (merged shallow) */
1276
+ /** @description Updated settings, merged shallowly into the saved ones. Keys: max_entries, approval_required, custom_fields, confirmation_message, referral_boost, referral_rewards, recaptcha_site_key. To turn on reCAPTCHA v3, send recaptcha_site_key together with recaptcha_secret_key (both from your reCAPTCHA admin console); the secret is stored encrypted and is never returned. Send recaptcha_site_key: null to turn it off. */
585
1277
  settings?: Record<string, never>;
586
1278
  };
587
1279
  UpdateWaitlistStatusDto: {
@@ -599,6 +1291,18 @@ interface components {
599
1291
  /** @description New URL */
600
1292
  url?: string;
601
1293
  };
1294
+ UpdateWebhookEndpointDto: {
1295
+ description?: string | null;
1296
+ /** @description Switch it on or off. Switching on also clears an automatic disable. */
1297
+ enabled?: boolean;
1298
+ /** @description Replaces the subscription. Event types from `GET …/webhooks/event-types`. Empty or omitted means every event, including types added later. */
1299
+ event_types?: ("entry.created" | "entry.approved" | "entry.rejected")[];
1300
+ /**
1301
+ * Format: uri
1302
+ * @example https://api.acme.com/webhooks
1303
+ */
1304
+ url?: string;
1305
+ };
602
1306
  VariantCopyDto: {
603
1307
  confirmation_message?: string;
604
1308
  description?: string;
@@ -606,6 +1310,7 @@ interface components {
606
1310
  };
607
1311
  VariantListResponseDto: {
608
1312
  data: components["schemas"]["VariantResponseDto"][];
1313
+ pagination: components["schemas"]["PaginationDto"];
609
1314
  };
610
1315
  VariantResponseDto: {
611
1316
  active: boolean;
@@ -618,6 +1323,30 @@ interface components {
618
1323
  waitlist_id: string;
619
1324
  weight: number;
620
1325
  };
1326
+ WaitlistAnalyticsResponseDto: {
1327
+ /**
1328
+ * @description Entry counts keyed by status (`pending` / `approved` / `rejected`).
1329
+ * @example {
1330
+ * "approved": 40,
1331
+ * "pending": 12,
1332
+ * "rejected": 3
1333
+ * }
1334
+ */
1335
+ by_status: {
1336
+ [key: string]: number;
1337
+ };
1338
+ referred_count: number;
1339
+ signups_this_month: number;
1340
+ signups_this_week: number;
1341
+ signups_today: number;
1342
+ top_referrals: components["schemas"]["AnalyticsTopReferralDto"][];
1343
+ top_referrers: components["schemas"]["AnalyticsTopReferrerDto"][];
1344
+ total_entries: number;
1345
+ /** @description referrals / total_entries — the K-factor proxy. 0 when no entries. */
1346
+ viral_coefficient: number;
1347
+ /** Format: uuid */
1348
+ waitlist_id: string;
1349
+ };
621
1350
  WaitlistListPaginationDto: {
622
1351
  has_more: boolean;
623
1352
  next_cursor: string | null;
@@ -627,6 +1356,16 @@ interface components {
627
1356
  pagination: components["schemas"]["WaitlistListPaginationDto"];
628
1357
  };
629
1358
  WaitlistResponseDto: {
1359
+ /**
1360
+ * @description Whether the public sign-up endpoint accepts entries right now (only an `active` waitlist does).
1361
+ * @example false
1362
+ */
1363
+ accepting_signups: boolean;
1364
+ /**
1365
+ * @description Web origins (scheme and host, for example `https://acme.com` or `http://localhost:3000`) that browsers may submit public sign-ups from. `https://*.acme.com` matches any subdomain. An empty list means any origin. A browser request from another origin gets 403 `ORIGIN_NOT_ALLOWED`; server-side calls without an `Origin` header are not checked. Entries are normalised (lower case, no trailing slash, default port dropped).
1366
+ * @example []
1367
+ */
1368
+ allowed_origins: string[];
630
1369
  created_at: string;
631
1370
  created_by: string;
632
1371
  description: string | null;
@@ -635,8 +1374,13 @@ interface components {
635
1374
  /** @example b1a4... */
636
1375
  id: string;
637
1376
  previous_workspace_slug: string | null;
638
- /** @description Waitlist settings (max_entries, approval_required, custom_fields, confirmation_message, referral_boost). */
1377
+ /** @description Waitlist settings (max_entries, approval_required, custom_fields, confirmation_message, referral_boost, referral_rewards, recaptcha_site_key). The reCAPTCHA secret key is never returned; recaptcha_secret_configured says whether one is saved. */
639
1378
  settings: Record<string, never>;
1379
+ /**
1380
+ * @description Plain explanation when public sign-ups are refused, and how to open them; null when the waitlist is active.
1381
+ * @example This waitlist is a draft, so public sign-ups are refused (422) until you change its status to active.
1382
+ */
1383
+ signups_note: string | null;
640
1384
  /** @example early-access */
641
1385
  slug: string;
642
1386
  /** @enum {string} */
@@ -647,37 +1391,436 @@ interface components {
647
1391
  /** @example acme */
648
1392
  workspace_slug: string;
649
1393
  };
1394
+ WaitlistSettingsResponseDto: {
1395
+ approved_template_name: string | null;
1396
+ brand_logo_url: string | null;
1397
+ brand_name: string | null;
1398
+ /** @description Auth consumer-app slug approved entries are invited into. */
1399
+ default_heimdall_app_slug: string | null;
1400
+ /** @description The From used when `sender_mode` is `custom`. */
1401
+ default_sender_address: string | null;
1402
+ /**
1403
+ * Format: uuid
1404
+ * @description Mail domain UUID used as default sender for Waitlist notifications.
1405
+ */
1406
+ default_sender_domain_id: string | null;
1407
+ /** @description The sender Waitlist emails actually go out from, with its live status in Mail. */
1408
+ effective_sender: components["schemas"]["EffectiveSenderDto"];
1409
+ /** @description Whether Waitlist emails can go out and, if not, what is missing. Computed on the server on every read. */
1410
+ email_setup: components["schemas"]["EmailSetupDto"];
1411
+ /** @description Whether Waitlist notifications are routed through the Mail service. */
1412
+ notifications_via_envoi: boolean;
1413
+ /** @description Primary brand colour as #RRGGBB */
1414
+ primary_color: string | null;
1415
+ rejected_template_name: string | null;
1416
+ /**
1417
+ * @description Where the From comes from: `workspace` (the workspace default sender set in Mail; the default) or `custom` (`default_sender_domain_id` + `default_sender_address`). Workspaces that had an address before this setting existed are `custom`.
1418
+ * @example workspace
1419
+ * @enum {string}
1420
+ */
1421
+ sender_mode: "workspace" | "custom";
1422
+ /** @description Emails Waitlist did not send in the last 7 days because the setup was incomplete. */
1423
+ skipped_sends: components["schemas"]["WaitlistSkippedEmailsDto"];
1424
+ /**
1425
+ * Format: date-time
1426
+ * @description null when the workspace has no explicit settings row yet.
1427
+ */
1428
+ updated_at: string | null;
1429
+ welcome_template_name: string | null;
1430
+ /** Format: uuid */
1431
+ workspace_id: string;
1432
+ };
1433
+ WaitlistSkippedEmailsDto: {
1434
+ /**
1435
+ * @description Emails not sent in the last 7 days because the setup was incomplete (`email_setup.missing`). Emails not sent because notifications are off are not counted.
1436
+ * @example 3
1437
+ */
1438
+ count: number;
1439
+ /**
1440
+ * @deprecated
1441
+ * @description The same number as `count`, under its old name. Read `count`.
1442
+ * @example 3
1443
+ */
1444
+ last_7_days: number;
1445
+ /**
1446
+ * Format: date-time
1447
+ * @description When the most recent counted email was skipped; null when none in the last 7 days.
1448
+ */
1449
+ last_at: string | null;
1450
+ };
1451
+ WaitlistStatsInWindowDto: {
1452
+ /**
1453
+ * @description Entries created in the requested window.
1454
+ * @example 212
1455
+ */
1456
+ signups: number;
1457
+ };
1458
+ WaitlistStatsSeriesDto: {
1459
+ /**
1460
+ * @description Bucket width.
1461
+ * @example day
1462
+ * @enum {string}
1463
+ */
1464
+ granularity: "day";
1465
+ /**
1466
+ * @description New waitlist entries per UTC day across every waitlist in the workspace.
1467
+ * @example signups
1468
+ * @enum {string}
1469
+ */
1470
+ metric: "signups";
1471
+ /** @description Dense and zero-filled: one point per UTC day in the window, oldest first, ending today. */
1472
+ points: components["schemas"]["StatsSeriesPointDto"][];
1473
+ };
1474
+ WaitlistStatsTotalsDto: {
1475
+ /**
1476
+ * @description Entries across those waitlists, all time, in any status.
1477
+ * @example 1380
1478
+ */
1479
+ entries: number;
1480
+ /**
1481
+ * @description Waitlists in the workspace, in any status.
1482
+ * @example 2
1483
+ */
1484
+ waitlists: number;
1485
+ };
1486
+ WaitlistWorkspaceStatsDto: {
1487
+ /**
1488
+ * Format: date-time
1489
+ * @description When these numbers were computed. Responses are cached for up to 60 seconds.
1490
+ * @example 2026-10-07T09:00:00.000Z
1491
+ */
1492
+ generated_at: string;
1493
+ /** @description Counts for the window. */
1494
+ in_window: components["schemas"]["WaitlistStatsInWindowDto"];
1495
+ /**
1496
+ * Format: date-time
1497
+ * @description Most recent signup on any of the workspace's waitlists. Null when there has never been one.
1498
+ * @example 2026-10-07T08:41:12.000Z
1499
+ */
1500
+ last_activity_at: string | null;
1501
+ /** @description Daily signups. */
1502
+ series: components["schemas"]["WaitlistStatsSeriesDto"];
1503
+ /** @description All-time counts. */
1504
+ totals: components["schemas"]["WaitlistStatsTotalsDto"];
1505
+ /**
1506
+ * @description Window the counts cover.
1507
+ * @example 30d
1508
+ * @enum {string}
1509
+ */
1510
+ window: "1d" | "7d" | "30d";
1511
+ };
650
1512
  WebhookCreateResponseDto: {
1513
+ /** @description Whether it receives events (`enabled` on the new routes). */
651
1514
  active: boolean;
1515
+ /** @description Set when it was switched off automatically after sustained failures. */
652
1516
  auto_disabled_at: string | null;
653
1517
  created_at: string;
1518
+ /** @description Subscribed events (`event_types` on the new routes). */
654
1519
  events: ("entry.created" | "entry.approved" | "entry.rejected")[];
1520
+ /** @description Failed deliveries in a row (`consecutive_failures` on the new routes). */
655
1521
  failure_count: number;
656
1522
  first_failure_at: string | null;
657
1523
  id: string;
1524
+ /** @description When the latest attempt was made. */
658
1525
  last_attempt_at: string | null;
1526
+ /** @description HTTP status of the latest attempt. */
659
1527
  last_status_code: number | null;
660
- /** @description Plaintext signing secret returned EXACTLY ONCE on create + rotate. Persist immediately — it does not appear on subsequent GETs. */
1528
+ /** @description The same secret as `signing_secret`, under the name older clients read. */
1529
+ secret_one_time_reveal: string;
1530
+ /** @description Always true: every webhook has a signing secret. */
1531
+ secret_set?: boolean;
1532
+ /** @description Plaintext signing secret (`whsec_…`), returned EXACTLY ONCE. Persist immediately; it does not appear on later reads. */
661
1533
  signing_secret: string;
662
1534
  url: string;
663
1535
  workspace_id: string;
664
1536
  };
1537
+ WebhookDeliveryAttemptDto: {
1538
+ /** @description 1 for the first delivery; retries and replays count up. */
1539
+ attempt_number: number;
1540
+ /** Format: date-time */
1541
+ attempted_at: string;
1542
+ /** Format: uuid */
1543
+ endpoint_id: string;
1544
+ /** @example request timed out */
1545
+ error_message: string | null;
1546
+ /** @example evt_3f0c3c1e-8a2b-4c55-9d3f-0a1b2c3d4e5f */
1547
+ event_id: string;
1548
+ /** @example user.created */
1549
+ event_type: string;
1550
+ /** Format: uuid */
1551
+ id: string;
1552
+ latency_ms: number | null;
1553
+ /** @description The first 1 KiB of the response body. */
1554
+ response_body: string | null;
1555
+ /** @description HTTP status; null when no response came back. */
1556
+ status_code: number | null;
1557
+ /** @description True for a 2xx response. */
1558
+ succeeded: boolean;
1559
+ /**
1560
+ * @description `automatic` (first delivery or a retry), `replay` or `test`.
1561
+ * @enum {string}
1562
+ */
1563
+ trigger: "automatic" | "replay" | "test";
1564
+ /**
1565
+ * Format: uri
1566
+ * @description Where it was sent.
1567
+ */
1568
+ url: string;
1569
+ };
1570
+ WebhookDeliveryListResponseDto: {
1571
+ data: components["schemas"]["LegacyWebhookDeliveryAttemptDto"][];
1572
+ pagination: components["schemas"]["PaginationDto"];
1573
+ };
1574
+ WebhookEndpointDto: {
1575
+ /** @description Failed automatic deliveries in a row; a success resets it. */
1576
+ consecutive_failures: number;
1577
+ /** Format: date-time */
1578
+ created_at: string;
1579
+ /** @example Production receiver */
1580
+ description: string | null;
1581
+ /** Format: date-time */
1582
+ disabled_at: string | null;
1583
+ /** @enum {string|null} */
1584
+ disabled_reason: "manual" | "failing" | null;
1585
+ /** @description The on/off switch (`PATCH … { enabled }`). */
1586
+ enabled: boolean;
1587
+ /**
1588
+ * @description Subscribed event types. Empty means every event, including types added later.
1589
+ * @example []
1590
+ */
1591
+ event_types: string[];
1592
+ /**
1593
+ * Format: date-time
1594
+ * @description Start of the current failure streak.
1595
+ */
1596
+ first_failure_at: string | null;
1597
+ /** Format: uuid */
1598
+ id: string;
1599
+ /** @description True for endpoints carried over from the product's previous webhook system: they also receive the old signature header until its sunset date. */
1600
+ legacy_signature: boolean;
1601
+ /** @description True while the previous secret still signs too (after a rotation, for its grace period). */
1602
+ prev_signing_secret_active: boolean;
1603
+ /**
1604
+ * Format: date-time
1605
+ * @description Until then the previous secret signs too (after a rotation).
1606
+ */
1607
+ prev_signing_secret_expires_at: string | null;
1608
+ /** @description Id of the owning workspace, app or community. */
1609
+ scope_id: string;
1610
+ /**
1611
+ * @description What owns the endpoint: `workspace`, `app` or `community`.
1612
+ * @example workspace
1613
+ */
1614
+ scope_type: string;
1615
+ /**
1616
+ * @description Last 4 characters of the signing secret.
1617
+ * @example x9Q=
1618
+ */
1619
+ signing_secret_hint: string;
1620
+ /**
1621
+ * @description `enabled` receives events. `disabled` was switched off. `auto_disabled` was switched off after 20 failed deliveries in a row or 24 hours of failures; `PATCH { enabled: true }` turns it back on.
1622
+ * @enum {string}
1623
+ */
1624
+ status: "enabled" | "disabled" | "auto_disabled";
1625
+ /** Format: date-time */
1626
+ updated_at: string;
1627
+ /**
1628
+ * Format: uri
1629
+ * @example https://api.acme.com/webhooks
1630
+ */
1631
+ url: string;
1632
+ };
1633
+ WebhookEndpointWithSecretDto: {
1634
+ /** @description Failed automatic deliveries in a row; a success resets it. */
1635
+ consecutive_failures: number;
1636
+ /** Format: date-time */
1637
+ created_at: string;
1638
+ /** @example Production receiver */
1639
+ description: string | null;
1640
+ /** Format: date-time */
1641
+ disabled_at: string | null;
1642
+ /** @enum {string|null} */
1643
+ disabled_reason: "manual" | "failing" | null;
1644
+ /** @description The on/off switch (`PATCH … { enabled }`). */
1645
+ enabled: boolean;
1646
+ /**
1647
+ * @description Subscribed event types. Empty means every event, including types added later.
1648
+ * @example []
1649
+ */
1650
+ event_types: string[];
1651
+ /**
1652
+ * Format: date-time
1653
+ * @description Start of the current failure streak.
1654
+ */
1655
+ first_failure_at: string | null;
1656
+ /** Format: uuid */
1657
+ id: string;
1658
+ /** @description True for endpoints carried over from the product's previous webhook system: they also receive the old signature header until its sunset date. */
1659
+ legacy_signature: boolean;
1660
+ /** @description True while the previous secret still signs too (after a rotation, for its grace period). */
1661
+ prev_signing_secret_active: boolean;
1662
+ /**
1663
+ * Format: date-time
1664
+ * @description Until then the previous secret signs too (after a rotation).
1665
+ */
1666
+ prev_signing_secret_expires_at: string | null;
1667
+ /** @description Id of the owning workspace, app or community. */
1668
+ scope_id: string;
1669
+ /**
1670
+ * @description What owns the endpoint: `workspace`, `app` or `community`.
1671
+ * @example workspace
1672
+ */
1673
+ scope_type: string;
1674
+ /**
1675
+ * @description The signing secret, shown once: pass it unchanged to any Standard Webhooks verifier. Store it now; it cannot be shown again.
1676
+ * @example whsec_MfKQ9r8GKYqrTwjUPD8ILPZIo2LaLaSw
1677
+ */
1678
+ signing_secret: string;
1679
+ /**
1680
+ * @description Last 4 characters of the signing secret.
1681
+ * @example x9Q=
1682
+ */
1683
+ signing_secret_hint: string;
1684
+ /**
1685
+ * @description `enabled` receives events. `disabled` was switched off. `auto_disabled` was switched off after 20 failed deliveries in a row or 24 hours of failures; `PATCH { enabled: true }` turns it back on.
1686
+ * @enum {string}
1687
+ */
1688
+ status: "enabled" | "disabled" | "auto_disabled";
1689
+ /** Format: date-time */
1690
+ updated_at: string;
1691
+ /**
1692
+ * Format: uri
1693
+ * @example https://api.acme.com/webhooks
1694
+ */
1695
+ url: string;
1696
+ };
1697
+ WebhookEventDeliveryDto: {
1698
+ /** @description Number of the latest attempt; retries and replays count up. */
1699
+ attempt_number: number;
1700
+ /** Format: date-time */
1701
+ attempted_at: string;
1702
+ /** Format: uuid */
1703
+ endpoint_id: string;
1704
+ /**
1705
+ * Format: date-time
1706
+ * @description When the next automatic attempt is due; null when none is queued.
1707
+ */
1708
+ next_attempt_at: string | null;
1709
+ status_code: number | null;
1710
+ /** @description True when the latest attempt got a 2xx. */
1711
+ succeeded: boolean;
1712
+ };
1713
+ WebhookEventDetailDto: {
1714
+ /** @description Every attempt, newest first. */
1715
+ attempts: components["schemas"]["WebhookDeliveryAttemptDto"][];
1716
+ /** Format: date-time */
1717
+ created_at: string;
1718
+ /** @description Latest attempt per endpoint (an endpoint whose first attempt is still queued is not listed yet). */
1719
+ deliveries: components["schemas"]["WebhookEventDeliveryDto"][];
1720
+ /**
1721
+ * @description Sent as `webhook-id`; the same on every retry and replay.
1722
+ * @example evt_3f0c3c1e-8a2b-4c55-9d3f-0a1b2c3d4e5f
1723
+ */
1724
+ id: string;
1725
+ /** @description The JSON body exactly as sent. */
1726
+ payload: {
1727
+ [key: string]: unknown;
1728
+ };
1729
+ /**
1730
+ * @description `pending`: a delivery is queued. `failed`: the latest attempt to some endpoint failed and none is queued. `delivered`: every endpoint answered 2xx. `not_sent`: no endpoint subscribed.
1731
+ * @enum {string}
1732
+ */
1733
+ status: "pending" | "delivered" | "failed" | "not_sent";
1734
+ /** @description Made by "Send test". */
1735
+ test: boolean;
1736
+ /**
1737
+ * @example entry.created
1738
+ * @enum {string}
1739
+ */
1740
+ type: "entry.created" | "entry.approved" | "entry.rejected";
1741
+ };
1742
+ WebhookEventDto: {
1743
+ /** Format: date-time */
1744
+ created_at: string;
1745
+ /** @description Latest attempt per endpoint (an endpoint whose first attempt is still queued is not listed yet). */
1746
+ deliveries: components["schemas"]["WebhookEventDeliveryDto"][];
1747
+ /**
1748
+ * @description Sent as `webhook-id`; the same on every retry and replay.
1749
+ * @example evt_3f0c3c1e-8a2b-4c55-9d3f-0a1b2c3d4e5f
1750
+ */
1751
+ id: string;
1752
+ /** @description The JSON body exactly as sent. */
1753
+ payload: {
1754
+ [key: string]: unknown;
1755
+ };
1756
+ /**
1757
+ * @description `pending`: a delivery is queued. `failed`: the latest attempt to some endpoint failed and none is queued. `delivered`: every endpoint answered 2xx. `not_sent`: no endpoint subscribed.
1758
+ * @enum {string}
1759
+ */
1760
+ status: "pending" | "delivered" | "failed" | "not_sent";
1761
+ /** @description Made by "Send test". */
1762
+ test: boolean;
1763
+ /**
1764
+ * @example entry.created
1765
+ * @enum {string}
1766
+ */
1767
+ type: "entry.created" | "entry.approved" | "entry.rejected";
1768
+ };
1769
+ WebhookEventTypeDto: {
1770
+ /**
1771
+ * @description Group shown in the event picker.
1772
+ * @example Users
1773
+ */
1774
+ category: string;
1775
+ /** @example A user signed up or was created by an admin. */
1776
+ description: string;
1777
+ /** @description An example `data` object; "Send test" delivers exactly this. */
1778
+ example: {
1779
+ [key: string]: unknown;
1780
+ };
1781
+ /**
1782
+ * @example entry.created
1783
+ * @enum {string}
1784
+ */
1785
+ type: "entry.created" | "entry.approved" | "entry.rejected";
1786
+ };
665
1787
  WebhookListResponseDto: {
666
1788
  data: components["schemas"]["WebhookResponseDto"][];
1789
+ pagination: components["schemas"]["PaginationDto"];
1790
+ };
1791
+ WebhookPaginationDto: {
1792
+ /** @description Whether another page follows. */
1793
+ has_more: boolean;
1794
+ /** @description Pass as `cursor` to get the next page; null on the last page. */
1795
+ next_cursor: string | null;
667
1796
  };
668
1797
  WebhookResponseDto: {
1798
+ /** @description Whether it receives events (`enabled` on the new routes). */
669
1799
  active: boolean;
1800
+ /** @description Set when it was switched off automatically after sustained failures. */
670
1801
  auto_disabled_at: string | null;
671
1802
  created_at: string;
1803
+ /** @description Subscribed events (`event_types` on the new routes). */
672
1804
  events: ("entry.created" | "entry.approved" | "entry.rejected")[];
1805
+ /** @description Failed deliveries in a row (`consecutive_failures` on the new routes). */
673
1806
  failure_count: number;
674
1807
  first_failure_at: string | null;
675
1808
  id: string;
1809
+ /** @description When the latest attempt was made. */
676
1810
  last_attempt_at: string | null;
1811
+ /** @description HTTP status of the latest attempt. */
677
1812
  last_status_code: number | null;
1813
+ /** @description Always true: every webhook has a signing secret. */
1814
+ secret_set?: boolean;
678
1815
  url: string;
679
1816
  workspace_id: string;
680
1817
  };
1818
+ WebhookRotateSecretResponseDto: {
1819
+ /** Format: uuid */
1820
+ id: string;
1821
+ /** @description New plaintext signing secret, returned EXACTLY ONCE. Persist immediately — it does not appear on subsequent GETs. */
1822
+ secret: string;
1823
+ };
681
1824
  };
682
1825
  responses: never;
683
1826
  parameters: never;
@@ -706,14 +1849,18 @@ interface operations {
706
1849
  headers: {
707
1850
  [name: string]: unknown;
708
1851
  };
709
- content?: never;
1852
+ content: {
1853
+ "application/json": components["schemas"]["PublicWaitlistInfoDto"];
1854
+ };
710
1855
  };
711
- /** @description Waitlist not found or not active */
1856
+ /** @description Code `WAITLIST_NOT_FOUND`: no such waitlist, not active, or its workspace was deleted. The answer is the same in every case. */
712
1857
  404: {
713
1858
  headers: {
714
1859
  [name: string]: unknown;
715
1860
  };
716
- content?: never;
1861
+ content: {
1862
+ "application/json": components["schemas"]["ErrorResponseDto"];
1863
+ };
717
1864
  };
718
1865
  };
719
1866
  };
@@ -733,47 +1880,68 @@ interface operations {
733
1880
  };
734
1881
  };
735
1882
  responses: {
736
- /** @description Entry created */
1883
+ /** @description Entry created. Persist `referral_code` client-side to build the referral URL; `status` is `approved` when the waitlist auto-approves. A sign-up from an Amazon SES mailbox-simulator address (`…@simulator.amazonses.com`) is stored as a test entry (`is_test: true`, negative `position`), so test runs never land on the real list. */
737
1884
  201: {
738
1885
  headers: {
739
1886
  [name: string]: unknown;
740
1887
  };
741
- content?: never;
1888
+ content: {
1889
+ "application/json": components["schemas"]["PublicEntryCreatedDto"];
1890
+ };
742
1891
  };
743
1892
  /** @description Validation or spam check failed */
744
1893
  400: {
745
1894
  headers: {
746
1895
  [name: string]: unknown;
747
1896
  };
748
- content?: never;
1897
+ content: {
1898
+ "application/json": components["schemas"]["ErrorResponseDto"];
1899
+ };
1900
+ };
1901
+ /** @description The request came from a web origin (`Origin` header) that is not on the waitlist's `allowed_origins` list. Requests without an `Origin` header (server-side calls) are not checked. A CORS preflight from such an origin gets the same 403. */
1902
+ 403: {
1903
+ headers: {
1904
+ [name: string]: unknown;
1905
+ };
1906
+ content: {
1907
+ "application/json": components["schemas"]["OriginNotAllowedErrorDto"];
1908
+ };
749
1909
  };
750
- /** @description Waitlist not found */
1910
+ /** @description Code `WAITLIST_NOT_FOUND`: no such waitlist, or its workspace was deleted. The answer is the same in both cases. */
751
1911
  404: {
752
1912
  headers: {
753
1913
  [name: string]: unknown;
754
1914
  };
755
- content?: never;
1915
+ content: {
1916
+ "application/json": components["schemas"]["ErrorResponseDto"];
1917
+ };
756
1918
  };
757
1919
  /** @description Email already on this waitlist */
758
1920
  409: {
759
1921
  headers: {
760
1922
  [name: string]: unknown;
761
1923
  };
762
- content?: never;
1924
+ content: {
1925
+ "application/json": components["schemas"]["ErrorResponseDto"];
1926
+ };
763
1927
  };
764
1928
  /** @description Waitlist is not active or is full */
765
1929
  422: {
766
1930
  headers: {
767
1931
  [name: string]: unknown;
768
1932
  };
769
- content?: never;
1933
+ content: {
1934
+ "application/json": components["schemas"]["ErrorResponseDto"];
1935
+ };
770
1936
  };
771
1937
  /** @description Too many requests from this IP */
772
1938
  429: {
773
1939
  headers: {
774
1940
  [name: string]: unknown;
775
1941
  };
776
- content?: never;
1942
+ content: {
1943
+ "application/json": components["schemas"]["ErrorResponseDto"];
1944
+ };
777
1945
  };
778
1946
  };
779
1947
  };
@@ -797,14 +1965,71 @@ interface operations {
797
1965
  headers: {
798
1966
  [name: string]: unknown;
799
1967
  };
800
- content?: never;
1968
+ content: {
1969
+ "application/json": components["schemas"]["PublicLeaderboardEntryDto"][];
1970
+ };
801
1971
  };
802
- /** @description Waitlist not found or not active */
1972
+ /** @description Code `WAITLIST_NOT_FOUND`: no such waitlist, not active, or its workspace was deleted. The answer is the same in every case. */
803
1973
  404: {
804
1974
  headers: {
805
1975
  [name: string]: unknown;
806
1976
  };
807
- content?: never;
1977
+ content: {
1978
+ "application/json": components["schemas"]["ErrorResponseDto"];
1979
+ };
1980
+ };
1981
+ };
1982
+ };
1983
+ WorkspaceStatsController_get: {
1984
+ parameters: {
1985
+ query?: {
1986
+ /** @description Window for `in_window.signups` and the length of `series`, in UTC days ending today. */
1987
+ window?: "1d" | "7d" | "30d";
1988
+ };
1989
+ header?: never;
1990
+ path: {
1991
+ /** @description Workspace id. */
1992
+ workspace_id: string;
1993
+ };
1994
+ cookie?: never;
1995
+ };
1996
+ requestBody?: never;
1997
+ responses: {
1998
+ /** @description Waitlist stats. */
1999
+ 200: {
2000
+ headers: {
2001
+ [name: string]: unknown;
2002
+ };
2003
+ content: {
2004
+ "application/json": components["schemas"]["WaitlistWorkspaceStatsDto"];
2005
+ };
2006
+ };
2007
+ /** @description `window` is not one of 1d, 7d, 30d. */
2008
+ 400: {
2009
+ headers: {
2010
+ [name: string]: unknown;
2011
+ };
2012
+ content: {
2013
+ "application/json": components["schemas"]["ErrorResponseDto"];
2014
+ };
2015
+ };
2016
+ /** @description Caller lacks `waitlist.read` on the workspace, or Waitlist is not enabled on it (`SERVICE_NOT_ENABLED`). */
2017
+ 403: {
2018
+ headers: {
2019
+ [name: string]: unknown;
2020
+ };
2021
+ content: {
2022
+ "application/json": components["schemas"]["ErrorResponseDto"];
2023
+ };
2024
+ };
2025
+ /** @description Workspace not found: the id is unknown, is not a UUID, or is not visible to the caller. Same answer as the service's other workspace routes. */
2026
+ 404: {
2027
+ headers: {
2028
+ [name: string]: unknown;
2029
+ };
2030
+ content: {
2031
+ "application/json": components["schemas"]["ErrorResponseDto"];
2032
+ };
808
2033
  };
809
2034
  };
810
2035
  };
@@ -819,26 +2044,41 @@ interface operations {
819
2044
  };
820
2045
  requestBody?: never;
821
2046
  responses: {
822
- /** @description Workspace Waitlist settings. */
2047
+ /** @description Workspace Waitlist settings with the email setup state. */
823
2048
  200: {
824
2049
  headers: {
825
2050
  [name: string]: unknown;
826
2051
  };
827
- content?: never;
2052
+ content: {
2053
+ "application/json": components["schemas"]["WaitlistSettingsResponseDto"];
2054
+ };
2055
+ };
2056
+ /** @description No valid session or API key. */
2057
+ 401: {
2058
+ headers: {
2059
+ [name: string]: unknown;
2060
+ };
2061
+ content: {
2062
+ "application/json": components["schemas"]["ErrorResponseDto"];
2063
+ };
828
2064
  };
829
2065
  /** @description Caller lacks `waitlist.settings.read` on the workspace. */
830
2066
  403: {
831
2067
  headers: {
832
2068
  [name: string]: unknown;
833
2069
  };
834
- content?: never;
2070
+ content: {
2071
+ "application/json": components["schemas"]["ErrorResponseDto"];
2072
+ };
835
2073
  };
836
2074
  /** @description Workspace does not exist or is not Waitlist-enabled. */
837
2075
  404: {
838
2076
  headers: {
839
2077
  [name: string]: unknown;
840
2078
  };
841
- content?: never;
2079
+ content: {
2080
+ "application/json": components["schemas"]["ErrorResponseDto"];
2081
+ };
842
2082
  };
843
2083
  };
844
2084
  };
@@ -857,33 +2097,158 @@ interface operations {
857
2097
  };
858
2098
  };
859
2099
  responses: {
860
- /** @description Updated workspace Waitlist settings. */
2100
+ /** @description Updated workspace Waitlist settings with the email setup state. */
861
2101
  200: {
862
2102
  headers: {
863
2103
  [name: string]: unknown;
864
2104
  };
865
- content?: never;
2105
+ content: {
2106
+ "application/json": components["schemas"]["WaitlistSettingsResponseDto"];
2107
+ };
866
2108
  };
867
2109
  /** @description Validation failure on the patch body (per `UpdateSettingsDto`). */
868
2110
  400: {
869
2111
  headers: {
870
2112
  [name: string]: unknown;
871
2113
  };
872
- content?: never;
2114
+ content: {
2115
+ "application/json": components["schemas"]["ErrorResponseDto"];
2116
+ };
2117
+ };
2118
+ /** @description No valid session or API key. */
2119
+ 401: {
2120
+ headers: {
2121
+ [name: string]: unknown;
2122
+ };
2123
+ content: {
2124
+ "application/json": components["schemas"]["ErrorResponseDto"];
2125
+ };
873
2126
  };
874
2127
  /** @description Caller lacks `waitlist.settings.update` on the workspace. */
875
2128
  403: {
876
2129
  headers: {
877
2130
  [name: string]: unknown;
878
2131
  };
879
- content?: never;
2132
+ content: {
2133
+ "application/json": components["schemas"]["ErrorResponseDto"];
2134
+ };
880
2135
  };
881
2136
  /** @description Workspace does not exist or is not Waitlist-enabled. */
882
2137
  404: {
883
2138
  headers: {
884
2139
  [name: string]: unknown;
885
2140
  };
886
- content?: never;
2141
+ content: {
2142
+ "application/json": components["schemas"]["ErrorResponseDto"];
2143
+ };
2144
+ };
2145
+ };
2146
+ };
2147
+ SettingsController_sendTest: {
2148
+ parameters: {
2149
+ query?: never;
2150
+ header?: {
2151
+ /** @description Stripe-style idempotency key. A retried request with the same key returns the first response instead of sending a second email. 24h TTL. */
2152
+ "Idempotency-Key"?: string;
2153
+ };
2154
+ path: {
2155
+ workspace_id: string;
2156
+ /** @description The email to test. */
2157
+ slot: "welcome" | "approved" | "rejected";
2158
+ };
2159
+ cookie?: never;
2160
+ };
2161
+ requestBody?: never;
2162
+ responses: {
2163
+ /** @description Accepted by Mail and queued for delivery. */
2164
+ 202: {
2165
+ headers: {
2166
+ [name: string]: unknown;
2167
+ };
2168
+ content: {
2169
+ "application/json": components["schemas"]["NotificationTestResponseDto"];
2170
+ };
2171
+ };
2172
+ /** @description Unknown `slot`, or `workspaceId` is not a UUID. */
2173
+ 400: {
2174
+ headers: {
2175
+ [name: string]: unknown;
2176
+ };
2177
+ content: {
2178
+ "application/json": components["schemas"]["ErrorResponseDto"];
2179
+ };
2180
+ };
2181
+ /** @description No valid session or API key. */
2182
+ 401: {
2183
+ headers: {
2184
+ [name: string]: unknown;
2185
+ };
2186
+ content: {
2187
+ "application/json": components["schemas"]["ErrorResponseDto"];
2188
+ };
2189
+ };
2190
+ /** @description Caller lacks `waitlist.settings.update`, or Mail refused the send for your role (you need Mail send access in this workspace). */
2191
+ 403: {
2192
+ headers: {
2193
+ [name: string]: unknown;
2194
+ };
2195
+ content: {
2196
+ "application/json": components["schemas"]["ErrorResponseDto"];
2197
+ };
2198
+ };
2199
+ /** @description Workspace not Waitlist-enabled, or the slot's template no longer exists in Mail. */
2200
+ 404: {
2201
+ headers: {
2202
+ [name: string]: unknown;
2203
+ };
2204
+ content: {
2205
+ "application/json": components["schemas"]["ErrorResponseDto"];
2206
+ };
2207
+ };
2208
+ /** @description Idempotency-Key reused with a different body (`IDEMPOTENCY_KEY_REUSE`). */
2209
+ 409: {
2210
+ headers: {
2211
+ [name: string]: unknown;
2212
+ };
2213
+ content: {
2214
+ "application/json": components["schemas"]["ErrorResponseDto"];
2215
+ };
2216
+ };
2217
+ /** @description `no_template`: the slot has no template. `no_sender_address`: custom sender mode with no address. */
2218
+ 412: {
2219
+ headers: {
2220
+ [name: string]: unknown;
2221
+ };
2222
+ content: {
2223
+ "application/json": components["schemas"]["ErrorResponseDto"];
2224
+ };
2225
+ };
2226
+ /** @description `operator_email_unavailable`: the caller has no verified account email (API keys included). From Mail: `no_default_sender` (workspace mode and no default sender set in Mail), `from_domain_not_verified`, `domain_not_verified_by_provider`, a suppressed address, or a render failure. */
2227
+ 422: {
2228
+ headers: {
2229
+ [name: string]: unknown;
2230
+ };
2231
+ content: {
2232
+ "application/json": components["schemas"]["ErrorResponseDto"];
2233
+ };
2234
+ };
2235
+ /** @description More than 10 tests by you in the last hour (`RATE_LIMITED`), or over a Mail send limit. */
2236
+ 429: {
2237
+ headers: {
2238
+ [name: string]: unknown;
2239
+ };
2240
+ content: {
2241
+ "application/json": components["schemas"]["ErrorResponseDto"];
2242
+ };
2243
+ };
2244
+ /** @description `MAIL_UNREACHABLE`: Mail did not answer. */
2245
+ 503: {
2246
+ headers: {
2247
+ [name: string]: unknown;
2248
+ };
2249
+ content: {
2250
+ "application/json": components["schemas"]["ErrorResponseDto"];
2251
+ };
887
2252
  };
888
2253
  };
889
2254
  };
@@ -942,26 +2307,32 @@ interface operations {
942
2307
  "application/json": components["schemas"]["WaitlistResponseDto"];
943
2308
  };
944
2309
  };
945
- /** @description Validation failure. */
2310
+ /** @description Validation failure, including an `allowed_origins` entry that is not a plain origin. */
946
2311
  400: {
947
2312
  headers: {
948
2313
  [name: string]: unknown;
949
2314
  };
950
- content?: never;
2315
+ content: {
2316
+ "application/json": components["schemas"]["ErrorResponseDto"];
2317
+ };
951
2318
  };
952
2319
  /** @description Caller lacks `waitlist.create`, or workspace has not enabled the `waitlist` service. */
953
2320
  403: {
954
2321
  headers: {
955
2322
  [name: string]: unknown;
956
2323
  };
957
- content?: never;
2324
+ content: {
2325
+ "application/json": components["schemas"]["ErrorResponseDto"];
2326
+ };
958
2327
  };
959
2328
  /** @description Slug already taken in this workspace. */
960
2329
  409: {
961
2330
  headers: {
962
2331
  [name: string]: unknown;
963
2332
  };
964
- content?: never;
2333
+ content: {
2334
+ "application/json": components["schemas"]["ErrorResponseDto"];
2335
+ };
965
2336
  };
966
2337
  };
967
2338
  };
@@ -971,6 +2342,7 @@ interface operations {
971
2342
  header?: never;
972
2343
  path: {
973
2344
  id: string;
2345
+ workspace_id: string;
974
2346
  };
975
2347
  cookie?: never;
976
2348
  };
@@ -990,7 +2362,9 @@ interface operations {
990
2362
  headers: {
991
2363
  [name: string]: unknown;
992
2364
  };
993
- content?: never;
2365
+ content: {
2366
+ "application/json": components["schemas"]["ErrorResponseDto"];
2367
+ };
994
2368
  };
995
2369
  };
996
2370
  };
@@ -1000,6 +2374,7 @@ interface operations {
1000
2374
  header?: never;
1001
2375
  path: {
1002
2376
  id: string;
2377
+ workspace_id: string;
1003
2378
  };
1004
2379
  cookie?: never;
1005
2380
  };
@@ -1017,14 +2392,18 @@ interface operations {
1017
2392
  headers: {
1018
2393
  [name: string]: unknown;
1019
2394
  };
1020
- content?: never;
2395
+ content: {
2396
+ "application/json": components["schemas"]["ErrorResponseDto"];
2397
+ };
1021
2398
  };
1022
2399
  /** @description Waitlist not found. */
1023
2400
  404: {
1024
2401
  headers: {
1025
2402
  [name: string]: unknown;
1026
2403
  };
1027
- content?: never;
2404
+ content: {
2405
+ "application/json": components["schemas"]["ErrorResponseDto"];
2406
+ };
1028
2407
  };
1029
2408
  };
1030
2409
  };
@@ -1034,6 +2413,7 @@ interface operations {
1034
2413
  header?: never;
1035
2414
  path: {
1036
2415
  id: string;
2416
+ workspace_id: string;
1037
2417
  };
1038
2418
  cookie?: never;
1039
2419
  };
@@ -1052,19 +2432,23 @@ interface operations {
1052
2432
  "application/json": components["schemas"]["WaitlistResponseDto"];
1053
2433
  };
1054
2434
  };
1055
- /** @description Validation failure. */
2435
+ /** @description Validation failure, including an `allowed_origins` entry that is not a plain origin. */
1056
2436
  400: {
1057
2437
  headers: {
1058
2438
  [name: string]: unknown;
1059
2439
  };
1060
- content?: never;
2440
+ content: {
2441
+ "application/json": components["schemas"]["ErrorResponseDto"];
2442
+ };
1061
2443
  };
1062
2444
  /** @description Waitlist not found. */
1063
2445
  404: {
1064
2446
  headers: {
1065
2447
  [name: string]: unknown;
1066
2448
  };
1067
- content?: never;
2449
+ content: {
2450
+ "application/json": components["schemas"]["ErrorResponseDto"];
2451
+ };
1068
2452
  };
1069
2453
  };
1070
2454
  };
@@ -1074,6 +2458,7 @@ interface operations {
1074
2458
  header?: never;
1075
2459
  path: {
1076
2460
  id: string;
2461
+ workspace_id: string;
1077
2462
  };
1078
2463
  cookie?: never;
1079
2464
  };
@@ -1097,20 +2482,27 @@ interface operations {
1097
2482
  headers: {
1098
2483
  [name: string]: unknown;
1099
2484
  };
1100
- content?: never;
2485
+ content: {
2486
+ "application/json": components["schemas"]["ErrorResponseDto"];
2487
+ };
1101
2488
  };
1102
2489
  /** @description Waitlist not found. */
1103
2490
  404: {
1104
2491
  headers: {
1105
2492
  [name: string]: unknown;
1106
2493
  };
1107
- content?: never;
2494
+ content: {
2495
+ "application/json": components["schemas"]["ErrorResponseDto"];
2496
+ };
1108
2497
  };
1109
2498
  };
1110
2499
  };
1111
2500
  AnalyticsController_get: {
1112
2501
  parameters: {
1113
- query?: never;
2502
+ query?: {
2503
+ /** @description Count test entries ("Add test signup") too. Default `false`: they are left out. */
2504
+ include_test?: boolean;
2505
+ };
1114
2506
  header?: never;
1115
2507
  path: {
1116
2508
  workspace_id: string;
@@ -1125,21 +2517,27 @@ interface operations {
1125
2517
  headers: {
1126
2518
  [name: string]: unknown;
1127
2519
  };
1128
- content?: never;
2520
+ content: {
2521
+ "application/json": components["schemas"]["WaitlistAnalyticsResponseDto"];
2522
+ };
1129
2523
  };
1130
2524
  /** @description Caller lacks `waitlist.read` on the workspace. */
1131
2525
  403: {
1132
2526
  headers: {
1133
2527
  [name: string]: unknown;
1134
2528
  };
1135
- content?: never;
2529
+ content: {
2530
+ "application/json": components["schemas"]["ErrorResponseDto"];
2531
+ };
1136
2532
  };
1137
2533
  /** @description Waitlist does not exist or is not in the path workspace. */
1138
2534
  404: {
1139
2535
  headers: {
1140
2536
  [name: string]: unknown;
1141
2537
  };
1142
- content?: never;
2538
+ content: {
2539
+ "application/json": components["schemas"]["ErrorResponseDto"];
2540
+ };
1143
2541
  };
1144
2542
  };
1145
2543
  };
@@ -1150,6 +2548,8 @@ interface operations {
1150
2548
  since: string;
1151
2549
  /** @description ISO-8601 exclusive end */
1152
2550
  until: string;
2551
+ /** @description Count test entries ("Add test signup") too. Default `false`: they are left out. */
2552
+ include_test?: boolean;
1153
2553
  };
1154
2554
  header?: never;
1155
2555
  path: {
@@ -1165,28 +2565,36 @@ interface operations {
1165
2565
  headers: {
1166
2566
  [name: string]: unknown;
1167
2567
  };
1168
- content?: never;
2568
+ content: {
2569
+ "application/json": components["schemas"]["AnalyticsTimelineResponseDto"];
2570
+ };
1169
2571
  };
1170
2572
  /** @description `since` / `until` missing, malformed, or `until <= since`. */
1171
2573
  400: {
1172
2574
  headers: {
1173
2575
  [name: string]: unknown;
1174
2576
  };
1175
- content?: never;
2577
+ content: {
2578
+ "application/json": components["schemas"]["ErrorResponseDto"];
2579
+ };
1176
2580
  };
1177
2581
  /** @description Caller lacks `waitlist.read` on the workspace. */
1178
2582
  403: {
1179
2583
  headers: {
1180
2584
  [name: string]: unknown;
1181
2585
  };
1182
- content?: never;
2586
+ content: {
2587
+ "application/json": components["schemas"]["ErrorResponseDto"];
2588
+ };
1183
2589
  };
1184
2590
  /** @description Waitlist does not exist or is not in the path workspace. */
1185
2591
  404: {
1186
2592
  headers: {
1187
2593
  [name: string]: unknown;
1188
2594
  };
1189
- content?: never;
2595
+ content: {
2596
+ "application/json": components["schemas"]["ErrorResponseDto"];
2597
+ };
1190
2598
  };
1191
2599
  };
1192
2600
  };
@@ -1198,6 +2606,14 @@ interface operations {
1198
2606
  cursor?: string;
1199
2607
  /** @description Filter by status */
1200
2608
  status?: string;
2609
+ /** @description Case-insensitive substring match across the entry `email` OR `name`. Trimmed; blank means no filter. Composes (AND) with `status`, `since` and `until`. */
2610
+ search?: string;
2611
+ /** @description ISO-8601 inclusive lower bound on `created_at`. Malformed values are rejected with a 400. */
2612
+ since?: string;
2613
+ /** @description ISO-8601 exclusive upper bound on `created_at`. Must be after `since`. Malformed values are rejected with a 400. */
2614
+ until?: string;
2615
+ /** @description `true` lists only test entries ("Add test signup"), `false` only real ones. Omitted lists both; test entries come first (negative positions). */
2616
+ is_test?: boolean;
1201
2617
  };
1202
2618
  header?: never;
1203
2619
  path: {
@@ -1217,19 +2633,32 @@ interface operations {
1217
2633
  "application/json": components["schemas"]["EntryListResponseDto"];
1218
2634
  };
1219
2635
  };
2636
+ /** @description Invalid cursor, overlong `search`, malformed `since` / `until`, or `until <= since`. */
2637
+ 400: {
2638
+ headers: {
2639
+ [name: string]: unknown;
2640
+ };
2641
+ content: {
2642
+ "application/json": components["schemas"]["ErrorResponseDto"];
2643
+ };
2644
+ };
1220
2645
  /** @description Caller lacks `entry.read`, or workspace has not enabled the `waitlist` service. */
1221
2646
  403: {
1222
2647
  headers: {
1223
2648
  [name: string]: unknown;
1224
2649
  };
1225
- content?: never;
2650
+ content: {
2651
+ "application/json": components["schemas"]["ErrorResponseDto"];
2652
+ };
1226
2653
  };
1227
2654
  /** @description Waitlist not found in this workspace. */
1228
2655
  404: {
1229
2656
  headers: {
1230
2657
  [name: string]: unknown;
1231
2658
  };
1232
- content?: never;
2659
+ content: {
2660
+ "application/json": components["schemas"]["ErrorResponseDto"];
2661
+ };
1233
2662
  };
1234
2663
  };
1235
2664
  };
@@ -1254,34 +2683,45 @@ interface operations {
1254
2683
  headers: {
1255
2684
  [name: string]: unknown;
1256
2685
  };
1257
- content?: never;
2686
+ content: {
2687
+ "application/json": components["schemas"]["BulkEntryActionResponseDto"];
2688
+ };
1258
2689
  };
1259
2690
  /** @description Empty `ids`, more than 100 ids, or unknown action. */
1260
2691
  400: {
1261
2692
  headers: {
1262
2693
  [name: string]: unknown;
1263
2694
  };
1264
- content?: never;
2695
+ content: {
2696
+ "application/json": components["schemas"]["ErrorResponseDto"];
2697
+ };
1265
2698
  };
1266
2699
  /** @description Caller lacks `entry.update`. */
1267
2700
  403: {
1268
2701
  headers: {
1269
2702
  [name: string]: unknown;
1270
2703
  };
1271
- content?: never;
2704
+ content: {
2705
+ "application/json": components["schemas"]["ErrorResponseDto"];
2706
+ };
1272
2707
  };
1273
2708
  /** @description Waitlist not found. */
1274
2709
  404: {
1275
2710
  headers: {
1276
2711
  [name: string]: unknown;
1277
2712
  };
1278
- content?: never;
2713
+ content: {
2714
+ "application/json": components["schemas"]["ErrorResponseDto"];
2715
+ };
1279
2716
  };
1280
2717
  };
1281
2718
  };
1282
2719
  EntryController_count: {
1283
2720
  parameters: {
1284
- query?: never;
2721
+ query?: {
2722
+ /** @description Count test entries ("Add test signup") too. Default `false`: they are left out. */
2723
+ include_test?: boolean;
2724
+ };
1285
2725
  header?: never;
1286
2726
  path: {
1287
2727
  workspace_id: string;
@@ -1291,17 +2731,32 @@ interface operations {
1291
2731
  };
1292
2732
  requestBody?: never;
1293
2733
  responses: {
2734
+ /** @description Entry count. */
1294
2735
  200: {
1295
2736
  headers: {
1296
2737
  [name: string]: unknown;
1297
2738
  };
1298
- content?: never;
1299
- };
2739
+ content: {
2740
+ "application/json": components["schemas"]["EntryCountResponseDto"];
2741
+ };
2742
+ };
2743
+ /** @description Waitlist not found in this workspace. */
2744
+ 404: {
2745
+ headers: {
2746
+ [name: string]: unknown;
2747
+ };
2748
+ content: {
2749
+ "application/json": components["schemas"]["ErrorResponseDto"];
2750
+ };
2751
+ };
1300
2752
  };
1301
2753
  };
1302
2754
  EntryController_exportCsv: {
1303
2755
  parameters: {
1304
- query?: never;
2756
+ query?: {
2757
+ /** @description Count test entries ("Add test signup") too. Default `false`: they are left out. */
2758
+ include_test?: boolean;
2759
+ };
1305
2760
  header?: never;
1306
2761
  path: {
1307
2762
  workspace_id: string;
@@ -1311,12 +2766,32 @@ interface operations {
1311
2766
  };
1312
2767
  requestBody?: never;
1313
2768
  responses: {
1314
- /** @description CSV stream */
2769
+ /** @description text/csv stream — one header row + one row per entry. Content-Disposition: attachment. */
1315
2770
  200: {
1316
2771
  headers: {
1317
2772
  [name: string]: unknown;
1318
2773
  };
1319
- content?: never;
2774
+ content: {
2775
+ "text/csv": string;
2776
+ };
2777
+ };
2778
+ /** @description Caller lacks `waitlist.export`. */
2779
+ 403: {
2780
+ headers: {
2781
+ [name: string]: unknown;
2782
+ };
2783
+ content: {
2784
+ "application/json": components["schemas"]["ErrorResponseDto"];
2785
+ };
2786
+ };
2787
+ /** @description Waitlist not found in this workspace. */
2788
+ 404: {
2789
+ headers: {
2790
+ [name: string]: unknown;
2791
+ };
2792
+ content: {
2793
+ "application/json": components["schemas"]["ErrorResponseDto"];
2794
+ };
1320
2795
  };
1321
2796
  };
1322
2797
  };
@@ -1347,7 +2822,9 @@ interface operations {
1347
2822
  headers: {
1348
2823
  [name: string]: unknown;
1349
2824
  };
1350
- content?: never;
2825
+ content: {
2826
+ "application/json": components["schemas"]["ErrorResponseDto"];
2827
+ };
1351
2828
  };
1352
2829
  };
1353
2830
  };
@@ -1376,14 +2853,18 @@ interface operations {
1376
2853
  headers: {
1377
2854
  [name: string]: unknown;
1378
2855
  };
1379
- content?: never;
2856
+ content: {
2857
+ "application/json": components["schemas"]["ErrorResponseDto"];
2858
+ };
1380
2859
  };
1381
2860
  /** @description Entry not found. */
1382
2861
  404: {
1383
2862
  headers: {
1384
2863
  [name: string]: unknown;
1385
2864
  };
1386
- content?: never;
2865
+ content: {
2866
+ "application/json": components["schemas"]["ErrorResponseDto"];
2867
+ };
1387
2868
  };
1388
2869
  };
1389
2870
  };
@@ -1418,232 +2899,1072 @@ interface operations {
1418
2899
  headers: {
1419
2900
  [name: string]: unknown;
1420
2901
  };
1421
- content?: never;
2902
+ content: {
2903
+ "application/json": components["schemas"]["ErrorResponseDto"];
2904
+ };
1422
2905
  };
1423
2906
  /** @description Caller lacks `entry.update`. */
1424
2907
  403: {
1425
2908
  headers: {
1426
2909
  [name: string]: unknown;
1427
2910
  };
1428
- content?: never;
2911
+ content: {
2912
+ "application/json": components["schemas"]["ErrorResponseDto"];
2913
+ };
2914
+ };
2915
+ /** @description Entry not found in this waitlist. */
2916
+ 404: {
2917
+ headers: {
2918
+ [name: string]: unknown;
2919
+ };
2920
+ content: {
2921
+ "application/json": components["schemas"]["ErrorResponseDto"];
2922
+ };
2923
+ };
2924
+ };
2925
+ };
2926
+ EntryController_inviteToApp: {
2927
+ parameters: {
2928
+ query?: never;
2929
+ header?: never;
2930
+ path: {
2931
+ workspace_id: string;
2932
+ waitlist_id: string;
2933
+ entry_id: string;
2934
+ };
2935
+ cookie?: never;
2936
+ };
2937
+ requestBody: {
2938
+ content: {
2939
+ "application/json": components["schemas"]["InviteToAppDto"];
2940
+ };
2941
+ };
2942
+ responses: {
2943
+ /** @description Invite created in Auth */
2944
+ 200: {
2945
+ headers: {
2946
+ [name: string]: unknown;
2947
+ };
2948
+ content: {
2949
+ "application/json": components["schemas"]["InviteToAppResponseDto"];
2950
+ };
2951
+ };
2952
+ /** @description No linked Auth app for this workspace */
2953
+ 422: {
2954
+ headers: {
2955
+ [name: string]: unknown;
2956
+ };
2957
+ content: {
2958
+ "application/json": components["schemas"]["ErrorResponseDto"];
2959
+ };
2960
+ };
2961
+ };
2962
+ };
2963
+ TestEntryController_create: {
2964
+ parameters: {
2965
+ query?: never;
2966
+ header?: {
2967
+ /** @description Idempotency key (24 h). A retry with the same key returns the first test entry instead of adding a second one. */
2968
+ "Idempotency-Key"?: string;
2969
+ };
2970
+ path: {
2971
+ workspace_id: string;
2972
+ waitlist_id: string;
2973
+ };
2974
+ cookie?: never;
2975
+ };
2976
+ requestBody: {
2977
+ content: {
2978
+ "application/json": components["schemas"]["CreateTestEntryDto"];
2979
+ };
2980
+ };
2981
+ responses: {
2982
+ /** @description Test entry created. */
2983
+ 201: {
2984
+ headers: {
2985
+ [name: string]: unknown;
2986
+ };
2987
+ content: {
2988
+ "application/json": components["schemas"]["EntryResponseDto"];
2989
+ };
2990
+ };
2991
+ /** @description Validation failure. */
2992
+ 400: {
2993
+ headers: {
2994
+ [name: string]: unknown;
2995
+ };
2996
+ content: {
2997
+ "application/json": components["schemas"]["ErrorResponseDto"];
2998
+ };
2999
+ };
3000
+ /** @description Caller lacks `waitlist.update`, or workspace has not enabled the `waitlist` service. */
3001
+ 403: {
3002
+ headers: {
3003
+ [name: string]: unknown;
3004
+ };
3005
+ content: {
3006
+ "application/json": components["schemas"]["ErrorResponseDto"];
3007
+ };
3008
+ };
3009
+ /** @description Waitlist not found in this workspace. */
3010
+ 404: {
3011
+ headers: {
3012
+ [name: string]: unknown;
3013
+ };
3014
+ content: {
3015
+ "application/json": components["schemas"]["ErrorResponseDto"];
3016
+ };
3017
+ };
3018
+ /** @description Idempotency-Key reused with a different body. */
3019
+ 409: {
3020
+ headers: {
3021
+ [name: string]: unknown;
3022
+ };
3023
+ content: {
3024
+ "application/json": components["schemas"]["ErrorResponseDto"];
3025
+ };
3026
+ };
3027
+ /** @description The waitlist is closed. */
3028
+ 422: {
3029
+ headers: {
3030
+ [name: string]: unknown;
3031
+ };
3032
+ content: {
3033
+ "application/json": components["schemas"]["ErrorResponseDto"];
3034
+ };
3035
+ };
3036
+ };
3037
+ };
3038
+ VariantController_list: {
3039
+ parameters: {
3040
+ query?: {
3041
+ /** @description Page size. Defaults to 20; values above 100 are clamped to 100. */
3042
+ limit?: number;
3043
+ /** @description Opaque cursor from the previous page's `pagination.next_cursor`. Omit for the first page. */
3044
+ cursor?: string;
3045
+ };
3046
+ header?: never;
3047
+ path: {
3048
+ workspace_id: string;
3049
+ waitlist_id: string;
3050
+ };
3051
+ cookie?: never;
3052
+ };
3053
+ requestBody?: never;
3054
+ responses: {
3055
+ /** @description Page of variants in (kind, locale, created_at) order with a pagination cursor. */
3056
+ 200: {
3057
+ headers: {
3058
+ [name: string]: unknown;
3059
+ };
3060
+ content: {
3061
+ "application/json": components["schemas"]["VariantListResponseDto"];
3062
+ };
3063
+ };
3064
+ /** @description Invalid cursor. */
3065
+ 400: {
3066
+ headers: {
3067
+ [name: string]: unknown;
3068
+ };
3069
+ content: {
3070
+ "application/json": components["schemas"]["ErrorResponseDto"];
3071
+ };
3072
+ };
3073
+ /** @description Waitlist not found in this workspace */
3074
+ 404: {
3075
+ headers: {
3076
+ [name: string]: unknown;
3077
+ };
3078
+ content: {
3079
+ "application/json": components["schemas"]["ErrorResponseDto"];
3080
+ };
3081
+ };
3082
+ };
3083
+ };
3084
+ VariantController_create: {
3085
+ parameters: {
3086
+ query?: never;
3087
+ header?: never;
3088
+ path: {
3089
+ workspace_id: string;
3090
+ waitlist_id: string;
3091
+ };
3092
+ cookie?: never;
3093
+ };
3094
+ requestBody: {
3095
+ content: {
3096
+ "application/json": components["schemas"]["CreateVariantDto"];
3097
+ };
3098
+ };
3099
+ responses: {
3100
+ /** @description Variant created */
3101
+ 201: {
3102
+ headers: {
3103
+ [name: string]: unknown;
3104
+ };
3105
+ content: {
3106
+ "application/json": components["schemas"]["VariantResponseDto"];
3107
+ };
3108
+ };
3109
+ /** @description Validation failure */
3110
+ 400: {
3111
+ headers: {
3112
+ [name: string]: unknown;
3113
+ };
3114
+ content: {
3115
+ "application/json": components["schemas"]["ErrorResponseDto"];
3116
+ };
3117
+ };
3118
+ /** @description Waitlist not found in this workspace */
3119
+ 404: {
3120
+ headers: {
3121
+ [name: string]: unknown;
3122
+ };
3123
+ content: {
3124
+ "application/json": components["schemas"]["ErrorResponseDto"];
3125
+ };
3126
+ };
3127
+ };
3128
+ };
3129
+ VariantController_remove: {
3130
+ parameters: {
3131
+ query?: never;
3132
+ header?: never;
3133
+ path: {
3134
+ workspace_id: string;
3135
+ waitlist_id: string;
3136
+ id: string;
3137
+ };
3138
+ cookie?: never;
3139
+ };
3140
+ requestBody?: never;
3141
+ responses: {
3142
+ /** @description Variant deleted */
3143
+ 204: {
3144
+ headers: {
3145
+ [name: string]: unknown;
3146
+ };
3147
+ content?: never;
3148
+ };
3149
+ /** @description Variant not found */
3150
+ 404: {
3151
+ headers: {
3152
+ [name: string]: unknown;
3153
+ };
3154
+ content: {
3155
+ "application/json": components["schemas"]["ErrorResponseDto"];
3156
+ };
3157
+ };
3158
+ };
3159
+ };
3160
+ VariantController_update: {
3161
+ parameters: {
3162
+ query?: never;
3163
+ header?: never;
3164
+ path: {
3165
+ workspace_id: string;
3166
+ waitlist_id: string;
3167
+ id: string;
3168
+ };
3169
+ cookie?: never;
3170
+ };
3171
+ requestBody: {
3172
+ content: {
3173
+ "application/json": components["schemas"]["UpdateVariantDto"];
3174
+ };
3175
+ };
3176
+ responses: {
3177
+ /** @description Variant updated */
3178
+ 200: {
3179
+ headers: {
3180
+ [name: string]: unknown;
3181
+ };
3182
+ content: {
3183
+ "application/json": components["schemas"]["VariantResponseDto"];
3184
+ };
3185
+ };
3186
+ /** @description Variant not found */
3187
+ 404: {
3188
+ headers: {
3189
+ [name: string]: unknown;
3190
+ };
3191
+ content: {
3192
+ "application/json": components["schemas"]["ErrorResponseDto"];
3193
+ };
3194
+ };
3195
+ };
3196
+ };
3197
+ WebhookController_list: {
3198
+ parameters: {
3199
+ query?: {
3200
+ /** @description Page size. Defaults to 20; values above 100 are clamped to 100. */
3201
+ limit?: number;
3202
+ /** @description Opaque cursor from the previous page's `pagination.next_cursor`. Omit for the first page. */
3203
+ cursor?: string;
3204
+ };
3205
+ header?: never;
3206
+ path: {
3207
+ workspace_id: string;
3208
+ };
3209
+ cookie?: never;
3210
+ };
3211
+ requestBody?: never;
3212
+ responses: {
3213
+ /** @description Page of webhooks for the workspace. */
3214
+ 200: {
3215
+ headers: {
3216
+ [name: string]: unknown;
3217
+ };
3218
+ content: {
3219
+ "application/json": components["schemas"]["WebhookListResponseDto"];
3220
+ };
3221
+ };
3222
+ /** @description Invalid cursor. */
3223
+ 400: {
3224
+ headers: {
3225
+ [name: string]: unknown;
3226
+ };
3227
+ content: {
3228
+ "application/json": components["schemas"]["ErrorResponseDto"];
3229
+ };
3230
+ };
3231
+ };
3232
+ };
3233
+ WebhookController_create: {
3234
+ parameters: {
3235
+ query?: never;
3236
+ header?: {
3237
+ /** @description Stripe-style idempotency key. The signing secret is returned exactly once; a retry without this header creates a second webhook + secret you never see the plaintext for. 24h TTL. */
3238
+ "Idempotency-Key"?: string;
3239
+ };
3240
+ path: {
3241
+ workspace_id: string;
3242
+ };
3243
+ cookie?: never;
3244
+ };
3245
+ requestBody: {
3246
+ content: {
3247
+ "application/json": components["schemas"]["CreateWebhookDto"];
3248
+ };
3249
+ };
3250
+ responses: {
3251
+ /** @description Webhook created. Includes plaintext `signing_secret` exactly once. */
3252
+ 201: {
3253
+ headers: {
3254
+ [name: string]: unknown;
3255
+ };
3256
+ content: {
3257
+ "application/json": components["schemas"]["WebhookCreateResponseDto"];
3258
+ };
3259
+ };
3260
+ /** @description The workspace already has 10 webhooks. */
3261
+ 409: {
3262
+ headers: {
3263
+ [name: string]: unknown;
3264
+ };
3265
+ content: {
3266
+ "application/json": components["schemas"]["ErrorResponseDto"];
3267
+ };
3268
+ };
3269
+ };
3270
+ };
3271
+ WebhooksController_waitlist_workspace_listEndpoints: {
3272
+ parameters: {
3273
+ query?: never;
3274
+ header?: never;
3275
+ path: {
3276
+ workspace_id: string;
3277
+ };
3278
+ cookie?: never;
3279
+ };
3280
+ requestBody?: never;
3281
+ responses: {
3282
+ 200: {
3283
+ headers: {
3284
+ [name: string]: unknown;
3285
+ };
3286
+ content: {
3287
+ "application/json": components["schemas"]["ListWebhookEndpointsResponseDto"];
3288
+ };
3289
+ };
3290
+ /** @description The scope id in the path is malformed. */
3291
+ 400: {
3292
+ headers: {
3293
+ [name: string]: unknown;
3294
+ };
3295
+ content: {
3296
+ "application/json": components["schemas"]["ErrorResponseDto"];
3297
+ };
3298
+ };
3299
+ /** @description Missing or invalid bearer token. */
3300
+ 401: {
3301
+ headers: {
3302
+ [name: string]: unknown;
3303
+ };
3304
+ content: {
3305
+ "application/json": components["schemas"]["ErrorResponseDto"];
3306
+ };
3307
+ };
3308
+ /** @description Caller lacks `waitlist.webhook.read` (reads) or `waitlist.webhook.manage` (changes, Send test, replay), or Waitlist is not enabled for the workspace (`SERVICE_NOT_ENABLED`). */
3309
+ 403: {
3310
+ headers: {
3311
+ [name: string]: unknown;
3312
+ };
3313
+ content: {
3314
+ "application/json": components["schemas"]["ErrorResponseDto"];
3315
+ };
3316
+ };
3317
+ };
3318
+ };
3319
+ WebhooksController_waitlist_workspace_createEndpoint: {
3320
+ parameters: {
3321
+ query?: never;
3322
+ header?: {
3323
+ /** @description Opaque client-generated string (1-256 chars, `[A-Za-z0-9_-:]`) that makes a retry of this request safe for 24 hours. The same key with a different body returns 409 `IDEMPOTENCY_KEY_REUSE`. */
3324
+ "Idempotency-Key"?: string;
3325
+ };
3326
+ path: {
3327
+ workspace_id: string;
3328
+ };
3329
+ cookie?: never;
3330
+ };
3331
+ requestBody: {
3332
+ content: {
3333
+ "application/json": components["schemas"]["CreateWebhookEndpointDto"];
3334
+ };
3335
+ };
3336
+ responses: {
3337
+ 201: {
3338
+ headers: {
3339
+ [name: string]: unknown;
3340
+ };
3341
+ content: {
3342
+ "application/json": components["schemas"]["WebhookEndpointWithSecretDto"];
3343
+ };
3344
+ };
3345
+ /** @description Validation failure: URL not https with a public host, or an unknown event type (`WEBHOOK_EVENT_TYPE_UNKNOWN`). */
3346
+ 400: {
3347
+ headers: {
3348
+ [name: string]: unknown;
3349
+ };
3350
+ content: {
3351
+ "application/json": components["schemas"]["ErrorResponseDto"];
3352
+ };
3353
+ };
3354
+ /** @description Missing or invalid bearer token. */
3355
+ 401: {
3356
+ headers: {
3357
+ [name: string]: unknown;
3358
+ };
3359
+ content: {
3360
+ "application/json": components["schemas"]["ErrorResponseDto"];
3361
+ };
3362
+ };
3363
+ /** @description Caller lacks `waitlist.webhook.read` (reads) or `waitlist.webhook.manage` (changes, Send test, replay), or Waitlist is not enabled for the workspace (`SERVICE_NOT_ENABLED`). */
3364
+ 403: {
3365
+ headers: {
3366
+ [name: string]: unknown;
3367
+ };
3368
+ content: {
3369
+ "application/json": components["schemas"]["ErrorResponseDto"];
3370
+ };
3371
+ };
3372
+ /** @description Already 10 endpoints (`WEBHOOK_ENDPOINT_LIMIT`), or Idempotency-Key reused with a different body (`IDEMPOTENCY_KEY_REUSE`). */
3373
+ 409: {
3374
+ headers: {
3375
+ [name: string]: unknown;
3376
+ };
3377
+ content: {
3378
+ "application/json": components["schemas"]["ErrorResponseDto"];
3379
+ };
3380
+ };
3381
+ /** @description The URL points at a private, loopback or internal address. */
3382
+ 422: {
3383
+ headers: {
3384
+ [name: string]: unknown;
3385
+ };
3386
+ content: {
3387
+ "application/json": components["schemas"]["ErrorResponseDto"];
3388
+ };
3389
+ };
3390
+ };
3391
+ };
3392
+ WebhooksController_waitlist_workspace_getEndpoint: {
3393
+ parameters: {
3394
+ query?: never;
3395
+ header?: never;
3396
+ path: {
3397
+ workspace_id: string;
3398
+ endpoint_id: string;
3399
+ };
3400
+ cookie?: never;
3401
+ };
3402
+ requestBody?: never;
3403
+ responses: {
3404
+ 200: {
3405
+ headers: {
3406
+ [name: string]: unknown;
3407
+ };
3408
+ content: {
3409
+ "application/json": components["schemas"]["WebhookEndpointDto"];
3410
+ };
3411
+ };
3412
+ /** @description `endpoint_id` is not a UUID. */
3413
+ 400: {
3414
+ headers: {
3415
+ [name: string]: unknown;
3416
+ };
3417
+ content: {
3418
+ "application/json": components["schemas"]["ErrorResponseDto"];
3419
+ };
3420
+ };
3421
+ /** @description Missing or invalid bearer token. */
3422
+ 401: {
3423
+ headers: {
3424
+ [name: string]: unknown;
3425
+ };
3426
+ content: {
3427
+ "application/json": components["schemas"]["ErrorResponseDto"];
3428
+ };
3429
+ };
3430
+ /** @description Caller lacks `waitlist.webhook.read` (reads) or `waitlist.webhook.manage` (changes, Send test, replay), or Waitlist is not enabled for the workspace (`SERVICE_NOT_ENABLED`). */
3431
+ 403: {
3432
+ headers: {
3433
+ [name: string]: unknown;
3434
+ };
3435
+ content: {
3436
+ "application/json": components["schemas"]["ErrorResponseDto"];
3437
+ };
3438
+ };
3439
+ /** @description No such endpoint here (`WEBHOOK_ENDPOINT_NOT_FOUND`). */
3440
+ 404: {
3441
+ headers: {
3442
+ [name: string]: unknown;
3443
+ };
3444
+ content: {
3445
+ "application/json": components["schemas"]["ErrorResponseDto"];
3446
+ };
3447
+ };
3448
+ };
3449
+ };
3450
+ WebhooksController_waitlist_workspace_deleteEndpoint: {
3451
+ parameters: {
3452
+ query?: never;
3453
+ header?: never;
3454
+ path: {
3455
+ workspace_id: string;
3456
+ endpoint_id: string;
3457
+ };
3458
+ cookie?: never;
3459
+ };
3460
+ requestBody?: never;
3461
+ responses: {
3462
+ /** @description Deleted. */
3463
+ 204: {
3464
+ headers: {
3465
+ [name: string]: unknown;
3466
+ };
3467
+ content?: never;
3468
+ };
3469
+ /** @description `endpoint_id` is not a UUID. */
3470
+ 400: {
3471
+ headers: {
3472
+ [name: string]: unknown;
3473
+ };
3474
+ content: {
3475
+ "application/json": components["schemas"]["ErrorResponseDto"];
3476
+ };
3477
+ };
3478
+ /** @description Missing or invalid bearer token. */
3479
+ 401: {
3480
+ headers: {
3481
+ [name: string]: unknown;
3482
+ };
3483
+ content: {
3484
+ "application/json": components["schemas"]["ErrorResponseDto"];
3485
+ };
3486
+ };
3487
+ /** @description Caller lacks `waitlist.webhook.read` (reads) or `waitlist.webhook.manage` (changes, Send test, replay), or Waitlist is not enabled for the workspace (`SERVICE_NOT_ENABLED`). */
3488
+ 403: {
3489
+ headers: {
3490
+ [name: string]: unknown;
3491
+ };
3492
+ content: {
3493
+ "application/json": components["schemas"]["ErrorResponseDto"];
3494
+ };
3495
+ };
3496
+ /** @description No such endpoint here (`WEBHOOK_ENDPOINT_NOT_FOUND`). */
3497
+ 404: {
3498
+ headers: {
3499
+ [name: string]: unknown;
3500
+ };
3501
+ content: {
3502
+ "application/json": components["schemas"]["ErrorResponseDto"];
3503
+ };
3504
+ };
3505
+ };
3506
+ };
3507
+ WebhooksController_waitlist_workspace_updateEndpoint: {
3508
+ parameters: {
3509
+ query?: never;
3510
+ header?: {
3511
+ /** @description Opaque client-generated string (1-256 chars, `[A-Za-z0-9_-:]`) that makes a retry of this request safe for 24 hours. The same key with a different body returns 409 `IDEMPOTENCY_KEY_REUSE`. */
3512
+ "Idempotency-Key"?: string;
3513
+ };
3514
+ path: {
3515
+ workspace_id: string;
3516
+ endpoint_id: string;
3517
+ };
3518
+ cookie?: never;
3519
+ };
3520
+ requestBody: {
3521
+ content: {
3522
+ "application/json": components["schemas"]["UpdateWebhookEndpointDto"];
3523
+ };
3524
+ };
3525
+ responses: {
3526
+ 200: {
3527
+ headers: {
3528
+ [name: string]: unknown;
3529
+ };
3530
+ content: {
3531
+ "application/json": components["schemas"]["WebhookEndpointDto"];
3532
+ };
3533
+ };
3534
+ /** @description Validation failure, or `endpoint_id` is not a UUID. */
3535
+ 400: {
3536
+ headers: {
3537
+ [name: string]: unknown;
3538
+ };
3539
+ content: {
3540
+ "application/json": components["schemas"]["ErrorResponseDto"];
3541
+ };
3542
+ };
3543
+ /** @description Missing or invalid bearer token. */
3544
+ 401: {
3545
+ headers: {
3546
+ [name: string]: unknown;
3547
+ };
3548
+ content: {
3549
+ "application/json": components["schemas"]["ErrorResponseDto"];
3550
+ };
3551
+ };
3552
+ /** @description Caller lacks `waitlist.webhook.read` (reads) or `waitlist.webhook.manage` (changes, Send test, replay), or Waitlist is not enabled for the workspace (`SERVICE_NOT_ENABLED`). */
3553
+ 403: {
3554
+ headers: {
3555
+ [name: string]: unknown;
3556
+ };
3557
+ content: {
3558
+ "application/json": components["schemas"]["ErrorResponseDto"];
3559
+ };
3560
+ };
3561
+ /** @description No such endpoint here (`WEBHOOK_ENDPOINT_NOT_FOUND`). */
3562
+ 404: {
3563
+ headers: {
3564
+ [name: string]: unknown;
3565
+ };
3566
+ content: {
3567
+ "application/json": components["schemas"]["ErrorResponseDto"];
3568
+ };
3569
+ };
3570
+ /** @description Idempotency-Key reused with a different body (`IDEMPOTENCY_KEY_REUSE`). */
3571
+ 409: {
3572
+ headers: {
3573
+ [name: string]: unknown;
3574
+ };
3575
+ content: {
3576
+ "application/json": components["schemas"]["ErrorResponseDto"];
3577
+ };
3578
+ };
3579
+ /** @description The new URL points at a private, loopback or internal address. */
3580
+ 422: {
3581
+ headers: {
3582
+ [name: string]: unknown;
3583
+ };
3584
+ content: {
3585
+ "application/json": components["schemas"]["ErrorResponseDto"];
3586
+ };
3587
+ };
3588
+ };
3589
+ };
3590
+ WebhooksController_waitlist_workspace_rotateSecret: {
3591
+ parameters: {
3592
+ query?: never;
3593
+ header?: {
3594
+ /** @description Opaque client-generated string (1-256 chars, `[A-Za-z0-9_-:]`) that makes a retry of this request safe for 24 hours. The same key with a different body returns 409 `IDEMPOTENCY_KEY_REUSE`. */
3595
+ "Idempotency-Key"?: string;
3596
+ };
3597
+ path: {
3598
+ workspace_id: string;
3599
+ endpoint_id: string;
3600
+ };
3601
+ cookie?: never;
3602
+ };
3603
+ requestBody: {
3604
+ content: {
3605
+ "application/json": components["schemas"]["RotateWebhookSecretDto"];
3606
+ };
3607
+ };
3608
+ responses: {
3609
+ 200: {
3610
+ headers: {
3611
+ [name: string]: unknown;
3612
+ };
3613
+ content: {
3614
+ "application/json": components["schemas"]["WebhookEndpointWithSecretDto"];
3615
+ };
3616
+ };
3617
+ /** @description `grace_hours` out of range, or `endpoint_id` is not a UUID. */
3618
+ 400: {
3619
+ headers: {
3620
+ [name: string]: unknown;
3621
+ };
3622
+ content: {
3623
+ "application/json": components["schemas"]["ErrorResponseDto"];
3624
+ };
3625
+ };
3626
+ /** @description Missing or invalid bearer token. */
3627
+ 401: {
3628
+ headers: {
3629
+ [name: string]: unknown;
3630
+ };
3631
+ content: {
3632
+ "application/json": components["schemas"]["ErrorResponseDto"];
3633
+ };
3634
+ };
3635
+ /** @description Caller lacks `waitlist.webhook.read` (reads) or `waitlist.webhook.manage` (changes, Send test, replay), or Waitlist is not enabled for the workspace (`SERVICE_NOT_ENABLED`). */
3636
+ 403: {
3637
+ headers: {
3638
+ [name: string]: unknown;
3639
+ };
3640
+ content: {
3641
+ "application/json": components["schemas"]["ErrorResponseDto"];
3642
+ };
3643
+ };
3644
+ /** @description No such endpoint here (`WEBHOOK_ENDPOINT_NOT_FOUND`). */
3645
+ 404: {
3646
+ headers: {
3647
+ [name: string]: unknown;
3648
+ };
3649
+ content: {
3650
+ "application/json": components["schemas"]["ErrorResponseDto"];
3651
+ };
3652
+ };
3653
+ /** @description Idempotency-Key reused with a different body (`IDEMPOTENCY_KEY_REUSE`). */
3654
+ 409: {
3655
+ headers: {
3656
+ [name: string]: unknown;
3657
+ };
3658
+ content: {
3659
+ "application/json": components["schemas"]["ErrorResponseDto"];
3660
+ };
3661
+ };
3662
+ };
3663
+ };
3664
+ WebhooksController_waitlist_workspace_sendTest: {
3665
+ parameters: {
3666
+ query?: never;
3667
+ header?: {
3668
+ /** @description Opaque client-generated string (1-256 chars, `[A-Za-z0-9_-:]`) that makes a retry of this request safe for 24 hours. The same key with a different body returns 409 `IDEMPOTENCY_KEY_REUSE`. */
3669
+ "Idempotency-Key"?: string;
3670
+ };
3671
+ path: {
3672
+ workspace_id: string;
3673
+ endpoint_id: string;
3674
+ };
3675
+ cookie?: never;
3676
+ };
3677
+ requestBody: {
3678
+ content: {
3679
+ "application/json": components["schemas"]["SendWebhookTestDto"];
3680
+ };
3681
+ };
3682
+ responses: {
3683
+ /** @description The attempt, successful or not. */
3684
+ 200: {
3685
+ headers: {
3686
+ [name: string]: unknown;
3687
+ };
3688
+ content: {
3689
+ "application/json": components["schemas"]["WebhookDeliveryAttemptDto"];
3690
+ };
3691
+ };
3692
+ /** @description Unknown `event_type`, or `endpoint_id` is not a UUID. */
3693
+ 400: {
3694
+ headers: {
3695
+ [name: string]: unknown;
3696
+ };
3697
+ content: {
3698
+ "application/json": components["schemas"]["ErrorResponseDto"];
3699
+ };
3700
+ };
3701
+ /** @description Missing or invalid bearer token. */
3702
+ 401: {
3703
+ headers: {
3704
+ [name: string]: unknown;
3705
+ };
3706
+ content: {
3707
+ "application/json": components["schemas"]["ErrorResponseDto"];
3708
+ };
3709
+ };
3710
+ /** @description Caller lacks `waitlist.webhook.read` (reads) or `waitlist.webhook.manage` (changes, Send test, replay), or Waitlist is not enabled for the workspace (`SERVICE_NOT_ENABLED`). */
3711
+ 403: {
3712
+ headers: {
3713
+ [name: string]: unknown;
3714
+ };
3715
+ content: {
3716
+ "application/json": components["schemas"]["ErrorResponseDto"];
3717
+ };
3718
+ };
3719
+ /** @description No such endpoint here (`WEBHOOK_ENDPOINT_NOT_FOUND`). */
3720
+ 404: {
3721
+ headers: {
3722
+ [name: string]: unknown;
3723
+ };
3724
+ content: {
3725
+ "application/json": components["schemas"]["ErrorResponseDto"];
3726
+ };
1429
3727
  };
1430
- /** @description Entry not found in this waitlist. */
1431
- 404: {
3728
+ /** @description Idempotency-Key reused with a different body (`IDEMPOTENCY_KEY_REUSE`). */
3729
+ 409: {
1432
3730
  headers: {
1433
3731
  [name: string]: unknown;
1434
3732
  };
1435
- content?: never;
3733
+ content: {
3734
+ "application/json": components["schemas"]["ErrorResponseDto"];
3735
+ };
1436
3736
  };
1437
3737
  };
1438
3738
  };
1439
- EntryController_inviteToApp: {
3739
+ WebhooksController_waitlist_workspace_listEventTypes: {
1440
3740
  parameters: {
1441
3741
  query?: never;
1442
3742
  header?: never;
1443
3743
  path: {
1444
3744
  workspace_id: string;
1445
- waitlist_id: string;
1446
- entry_id: string;
1447
3745
  };
1448
3746
  cookie?: never;
1449
3747
  };
1450
- requestBody: {
1451
- content: {
1452
- "application/json": components["schemas"]["InviteToAppDto"];
1453
- };
1454
- };
3748
+ requestBody?: never;
1455
3749
  responses: {
1456
- /** @description Invite created in Auth */
1457
3750
  200: {
1458
3751
  headers: {
1459
3752
  [name: string]: unknown;
1460
3753
  };
1461
- content?: never;
3754
+ content: {
3755
+ "application/json": components["schemas"]["ListWebhookEventTypesResponseDto"];
3756
+ };
1462
3757
  };
1463
- /** @description No linked Auth app for this workspace */
1464
- 422: {
3758
+ /** @description Missing or invalid bearer token. */
3759
+ 401: {
1465
3760
  headers: {
1466
3761
  [name: string]: unknown;
1467
3762
  };
1468
- content?: never;
3763
+ content: {
3764
+ "application/json": components["schemas"]["ErrorResponseDto"];
3765
+ };
3766
+ };
3767
+ /** @description Caller lacks `waitlist.webhook.read` (reads) or `waitlist.webhook.manage` (changes, Send test, replay), or Waitlist is not enabled for the workspace (`SERVICE_NOT_ENABLED`). */
3768
+ 403: {
3769
+ headers: {
3770
+ [name: string]: unknown;
3771
+ };
3772
+ content: {
3773
+ "application/json": components["schemas"]["ErrorResponseDto"];
3774
+ };
1469
3775
  };
1470
3776
  };
1471
3777
  };
1472
- VariantController_list: {
3778
+ WebhooksController_waitlist_workspace_listEvents: {
1473
3779
  parameters: {
1474
- query?: never;
3780
+ query?: {
3781
+ /** @description Only these types. Repeat the parameter or comma-separate. */
3782
+ type?: ("entry.created" | "entry.approved" | "entry.rejected")[];
3783
+ /** @description Only events sent (or queued) to this endpoint. */
3784
+ endpoint_id?: string;
3785
+ status?: "pending" | "delivered" | "failed" | "not_sent";
3786
+ /** @description Only events created at or after this instant. */
3787
+ created_after?: string;
3788
+ /** @description Only events created before this instant. */
3789
+ created_before?: string;
3790
+ limit?: number;
3791
+ /** @description The previous page's `pagination.next_cursor`. */
3792
+ cursor?: string;
3793
+ };
1475
3794
  header?: never;
1476
3795
  path: {
1477
3796
  workspace_id: string;
1478
- waitlist_id: string;
1479
3797
  };
1480
3798
  cookie?: never;
1481
3799
  };
1482
3800
  requestBody?: never;
1483
3801
  responses: {
1484
- /** @description Bare array of variants */
1485
3802
  200: {
1486
3803
  headers: {
1487
3804
  [name: string]: unknown;
1488
3805
  };
1489
3806
  content: {
1490
- "application/json": components["schemas"]["VariantListResponseDto"];
3807
+ "application/json": components["schemas"]["ListWebhookEventsResponseDto"];
1491
3808
  };
1492
3809
  };
1493
- };
1494
- };
1495
- VariantController_create: {
1496
- parameters: {
1497
- query?: never;
1498
- header?: never;
1499
- path: {
1500
- workspace_id: string;
1501
- waitlist_id: string;
1502
- };
1503
- cookie?: never;
1504
- };
1505
- requestBody: {
1506
- content: {
1507
- "application/json": components["schemas"]["CreateVariantDto"];
1508
- };
1509
- };
1510
- responses: {
1511
- /** @description Variant created */
1512
- 201: {
3810
+ /** @description Invalid filter value or cursor. */
3811
+ 400: {
1513
3812
  headers: {
1514
3813
  [name: string]: unknown;
1515
3814
  };
1516
3815
  content: {
1517
- "application/json": components["schemas"]["VariantResponseDto"];
3816
+ "application/json": components["schemas"]["ErrorResponseDto"];
1518
3817
  };
1519
3818
  };
1520
- /** @description Validation failure */
1521
- 400: {
3819
+ /** @description Missing or invalid bearer token. */
3820
+ 401: {
1522
3821
  headers: {
1523
3822
  [name: string]: unknown;
1524
3823
  };
1525
- content?: never;
3824
+ content: {
3825
+ "application/json": components["schemas"]["ErrorResponseDto"];
3826
+ };
1526
3827
  };
1527
- /** @description Waitlist not found in this workspace */
1528
- 404: {
3828
+ /** @description Caller lacks `waitlist.webhook.read` (reads) or `waitlist.webhook.manage` (changes, Send test, replay), or Waitlist is not enabled for the workspace (`SERVICE_NOT_ENABLED`). */
3829
+ 403: {
1529
3830
  headers: {
1530
3831
  [name: string]: unknown;
1531
3832
  };
1532
- content?: never;
3833
+ content: {
3834
+ "application/json": components["schemas"]["ErrorResponseDto"];
3835
+ };
1533
3836
  };
1534
3837
  };
1535
3838
  };
1536
- VariantController_remove: {
3839
+ WebhooksController_waitlist_workspace_getEvent: {
1537
3840
  parameters: {
1538
3841
  query?: never;
1539
3842
  header?: never;
1540
3843
  path: {
1541
3844
  workspace_id: string;
1542
- waitlist_id: string;
1543
- id: string;
3845
+ /** @description The event id, `evt_<uuid>`. */
3846
+ event_id: string;
1544
3847
  };
1545
3848
  cookie?: never;
1546
3849
  };
1547
3850
  requestBody?: never;
1548
3851
  responses: {
1549
- /** @description Variant deleted */
1550
- 204: {
3852
+ 200: {
1551
3853
  headers: {
1552
3854
  [name: string]: unknown;
1553
3855
  };
1554
- content?: never;
3856
+ content: {
3857
+ "application/json": components["schemas"]["WebhookEventDetailDto"];
3858
+ };
1555
3859
  };
1556
- /** @description Variant not found */
1557
- 404: {
3860
+ /** @description `event_id` is not `evt_<uuid>`. */
3861
+ 400: {
1558
3862
  headers: {
1559
3863
  [name: string]: unknown;
1560
3864
  };
1561
- content?: never;
1562
- };
1563
- };
1564
- };
1565
- VariantController_update: {
1566
- parameters: {
1567
- query?: never;
1568
- header?: never;
1569
- path: {
1570
- workspace_id: string;
1571
- waitlist_id: string;
1572
- id: string;
3865
+ content: {
3866
+ "application/json": components["schemas"]["ErrorResponseDto"];
3867
+ };
1573
3868
  };
1574
- cookie?: never;
1575
- };
1576
- requestBody: {
1577
- content: {
1578
- "application/json": components["schemas"]["UpdateVariantDto"];
3869
+ /** @description Missing or invalid bearer token. */
3870
+ 401: {
3871
+ headers: {
3872
+ [name: string]: unknown;
3873
+ };
3874
+ content: {
3875
+ "application/json": components["schemas"]["ErrorResponseDto"];
3876
+ };
1579
3877
  };
1580
- };
1581
- responses: {
1582
- /** @description Variant updated */
1583
- 200: {
3878
+ /** @description Caller lacks `waitlist.webhook.read` (reads) or `waitlist.webhook.manage` (changes, Send test, replay), or Waitlist is not enabled for the workspace (`SERVICE_NOT_ENABLED`). */
3879
+ 403: {
1584
3880
  headers: {
1585
3881
  [name: string]: unknown;
1586
3882
  };
1587
3883
  content: {
1588
- "application/json": components["schemas"]["VariantResponseDto"];
3884
+ "application/json": components["schemas"]["ErrorResponseDto"];
1589
3885
  };
1590
3886
  };
1591
- /** @description Variant not found */
3887
+ /** @description No such event here (`WEBHOOK_EVENT_NOT_FOUND`); events are kept for 30 days. */
1592
3888
  404: {
1593
3889
  headers: {
1594
3890
  [name: string]: unknown;
1595
3891
  };
1596
- content?: never;
3892
+ content: {
3893
+ "application/json": components["schemas"]["ErrorResponseDto"];
3894
+ };
1597
3895
  };
1598
3896
  };
1599
3897
  };
1600
- WebhookController_list: {
3898
+ WebhooksController_waitlist_workspace_replay: {
1601
3899
  parameters: {
1602
- query?: never;
1603
- header?: never;
3900
+ query?: {
3901
+ /** @description Send to this endpoint only. */
3902
+ endpoint_id?: string;
3903
+ };
3904
+ header?: {
3905
+ /** @description Opaque client-generated string (1-256 chars, `[A-Za-z0-9_-:]`) that makes a retry of this request safe for 24 hours. The same key with a different body returns 409 `IDEMPOTENCY_KEY_REUSE`. */
3906
+ "Idempotency-Key"?: string;
3907
+ };
1604
3908
  path: {
1605
3909
  workspace_id: string;
3910
+ /** @description The event id, `evt_<uuid>`. */
3911
+ event_id: string;
1606
3912
  };
1607
3913
  cookie?: never;
1608
3914
  };
1609
3915
  requestBody?: never;
1610
3916
  responses: {
1611
- /** @description Webhooks for the workspace. */
1612
3917
  200: {
1613
3918
  headers: {
1614
3919
  [name: string]: unknown;
1615
3920
  };
1616
3921
  content: {
1617
- "application/json": components["schemas"]["WebhookListResponseDto"];
3922
+ "application/json": components["schemas"]["ReplayWebhookEventResponseDto"];
1618
3923
  };
1619
3924
  };
1620
- };
1621
- };
1622
- WebhookController_create: {
1623
- parameters: {
1624
- query?: never;
1625
- header?: {
1626
- /** @description Stripe-style idempotency key. The signing secret is returned exactly once; a retry without this header creates a second webhook + secret you never see the plaintext for. 24h TTL. */
1627
- "Idempotency-Key"?: string;
3925
+ /** @description `event_id` is not `evt_<uuid>`, or `endpoint_id` is not a UUID. */
3926
+ 400: {
3927
+ headers: {
3928
+ [name: string]: unknown;
3929
+ };
3930
+ content: {
3931
+ "application/json": components["schemas"]["ErrorResponseDto"];
3932
+ };
1628
3933
  };
1629
- path: {
1630
- workspace_id: string;
3934
+ /** @description Missing or invalid bearer token. */
3935
+ 401: {
3936
+ headers: {
3937
+ [name: string]: unknown;
3938
+ };
3939
+ content: {
3940
+ "application/json": components["schemas"]["ErrorResponseDto"];
3941
+ };
1631
3942
  };
1632
- cookie?: never;
1633
- };
1634
- requestBody: {
1635
- content: {
1636
- "application/json": components["schemas"]["CreateWebhookDto"];
3943
+ /** @description Caller lacks `waitlist.webhook.read` (reads) or `waitlist.webhook.manage` (changes, Send test, replay), or Waitlist is not enabled for the workspace (`SERVICE_NOT_ENABLED`). */
3944
+ 403: {
3945
+ headers: {
3946
+ [name: string]: unknown;
3947
+ };
3948
+ content: {
3949
+ "application/json": components["schemas"]["ErrorResponseDto"];
3950
+ };
1637
3951
  };
1638
- };
1639
- responses: {
1640
- /** @description Webhook created. Includes plaintext `signing_secret` exactly once. */
1641
- 201: {
3952
+ /** @description No such event here (`WEBHOOK_EVENT_NOT_FOUND`); events are kept for 30 days. Or No such endpoint here (`WEBHOOK_ENDPOINT_NOT_FOUND`). */
3953
+ 404: {
1642
3954
  headers: {
1643
3955
  [name: string]: unknown;
1644
3956
  };
1645
3957
  content: {
1646
- "application/json": components["schemas"]["WebhookCreateResponseDto"];
3958
+ "application/json": components["schemas"]["ErrorResponseDto"];
3959
+ };
3960
+ };
3961
+ /** @description `endpoint_id` is switched off or does not receive this event type (`WEBHOOK_ENDPOINT_NOT_SUBSCRIBED`), or Idempotency-Key reused with a different body (`IDEMPOTENCY_KEY_REUSE`). */
3962
+ 409: {
3963
+ headers: {
3964
+ [name: string]: unknown;
3965
+ };
3966
+ content: {
3967
+ "application/json": components["schemas"]["ErrorResponseDto"];
1647
3968
  };
1648
3969
  };
1649
3970
  };
@@ -1660,7 +3981,7 @@ interface operations {
1660
3981
  };
1661
3982
  requestBody?: never;
1662
3983
  responses: {
1663
- /** @description Webhook row. */
3984
+ /** @description Webhook. */
1664
3985
  200: {
1665
3986
  headers: {
1666
3987
  [name: string]: unknown;
@@ -1669,12 +3990,23 @@ interface operations {
1669
3990
  "application/json": components["schemas"]["WebhookResponseDto"];
1670
3991
  };
1671
3992
  };
3993
+ /** @description `id` is not a UUID. */
3994
+ 400: {
3995
+ headers: {
3996
+ [name: string]: unknown;
3997
+ };
3998
+ content: {
3999
+ "application/json": components["schemas"]["ErrorResponseDto"];
4000
+ };
4001
+ };
1672
4002
  /** @description Webhook not found. */
1673
4003
  404: {
1674
4004
  headers: {
1675
4005
  [name: string]: unknown;
1676
4006
  };
1677
- content?: never;
4007
+ content: {
4008
+ "application/json": components["schemas"]["ErrorResponseDto"];
4009
+ };
1678
4010
  };
1679
4011
  };
1680
4012
  };
@@ -1690,12 +4022,22 @@ interface operations {
1690
4022
  };
1691
4023
  requestBody?: never;
1692
4024
  responses: {
4025
+ /** @description Deleted. */
1693
4026
  204: {
1694
4027
  headers: {
1695
4028
  [name: string]: unknown;
1696
4029
  };
1697
4030
  content?: never;
1698
4031
  };
4032
+ /** @description Webhook not found. */
4033
+ 404: {
4034
+ headers: {
4035
+ [name: string]: unknown;
4036
+ };
4037
+ content: {
4038
+ "application/json": components["schemas"]["ErrorResponseDto"];
4039
+ };
4040
+ };
1699
4041
  };
1700
4042
  };
1701
4043
  WebhookController_update: {
@@ -1714,17 +4056,36 @@ interface operations {
1714
4056
  };
1715
4057
  };
1716
4058
  responses: {
4059
+ /** @description Updated webhook (secret masked). */
1717
4060
  200: {
1718
4061
  headers: {
1719
4062
  [name: string]: unknown;
1720
4063
  };
1721
- content?: never;
4064
+ content: {
4065
+ "application/json": components["schemas"]["WebhookResponseDto"];
4066
+ };
4067
+ };
4068
+ /** @description Webhook not found. */
4069
+ 404: {
4070
+ headers: {
4071
+ [name: string]: unknown;
4072
+ };
4073
+ content: {
4074
+ "application/json": components["schemas"]["ErrorResponseDto"];
4075
+ };
1722
4076
  };
1723
4077
  };
1724
4078
  };
1725
4079
  WebhookController_recentDeliveries: {
1726
4080
  parameters: {
1727
- query?: never;
4081
+ query?: {
4082
+ /** @description Page size. Defaults to 50; values above 200 are clamped to 200. */
4083
+ limit?: number;
4084
+ /** @description Opaque cursor from the previous page's `pagination.next_cursor`. Omit for the first page. */
4085
+ cursor?: string;
4086
+ /** @description `success` is a 2xx response; `failed` is everything else, including attempts that got no response at all (null `status_code`). Unrecognised values are rejected with a 400. */
4087
+ status?: "success" | "failed";
4088
+ };
1728
4089
  header?: never;
1729
4090
  path: {
1730
4091
  workspace_id: string;
@@ -1734,12 +4095,32 @@ interface operations {
1734
4095
  };
1735
4096
  requestBody?: never;
1736
4097
  responses: {
1737
- /** @description `{ data: Array<{ id, event_id, event_type, attempt_number, status_code, response_body, error_message, latency_ms, created_at }> }` */
4098
+ /** @description Delivery attempts, newest first. */
1738
4099
  200: {
1739
4100
  headers: {
1740
4101
  [name: string]: unknown;
1741
4102
  };
1742
- content?: never;
4103
+ content: {
4104
+ "application/json": components["schemas"]["WebhookDeliveryListResponseDto"];
4105
+ };
4106
+ };
4107
+ /** @description Invalid cursor or unknown `status` filter. */
4108
+ 400: {
4109
+ headers: {
4110
+ [name: string]: unknown;
4111
+ };
4112
+ content: {
4113
+ "application/json": components["schemas"]["ErrorResponseDto"];
4114
+ };
4115
+ };
4116
+ /** @description Webhook not found. */
4117
+ 404: {
4118
+ headers: {
4119
+ [name: string]: unknown;
4120
+ };
4121
+ content: {
4122
+ "application/json": components["schemas"]["ErrorResponseDto"];
4123
+ };
1743
4124
  };
1744
4125
  };
1745
4126
  };
@@ -1755,11 +4136,23 @@ interface operations {
1755
4136
  };
1756
4137
  requestBody?: never;
1757
4138
  responses: {
4139
+ /** @description Secret rotated. Includes the new plaintext secret exactly once. */
1758
4140
  201: {
1759
4141
  headers: {
1760
4142
  [name: string]: unknown;
1761
4143
  };
1762
- content?: never;
4144
+ content: {
4145
+ "application/json": components["schemas"]["WebhookRotateSecretResponseDto"];
4146
+ };
4147
+ };
4148
+ /** @description Webhook not found. */
4149
+ 404: {
4150
+ headers: {
4151
+ [name: string]: unknown;
4152
+ };
4153
+ content: {
4154
+ "application/json": components["schemas"]["ErrorResponseDto"];
4155
+ };
1763
4156
  };
1764
4157
  };
1765
4158
  };
@@ -1779,12 +4172,31 @@ interface operations {
1779
4172
  };
1780
4173
  };
1781
4174
  responses: {
4175
+ /** @description Sent. Read the outcome from `/deliveries`. */
1782
4176
  202: {
1783
4177
  headers: {
1784
4178
  [name: string]: unknown;
1785
4179
  };
1786
4180
  content?: never;
1787
4181
  };
4182
+ /** @description Webhook not found. */
4183
+ 404: {
4184
+ headers: {
4185
+ [name: string]: unknown;
4186
+ };
4187
+ content: {
4188
+ "application/json": components["schemas"]["ErrorResponseDto"];
4189
+ };
4190
+ };
4191
+ /** @description The webhook is switched off. */
4192
+ 422: {
4193
+ headers: {
4194
+ [name: string]: unknown;
4195
+ };
4196
+ content: {
4197
+ "application/json": components["schemas"]["ErrorResponseDto"];
4198
+ };
4199
+ };
1788
4200
  };
1789
4201
  };
1790
4202
  }