@productcraft/waitlist 0.2.2 → 0.2.4

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.cts CHANGED
@@ -850,7 +850,10 @@ interface components {
850
850
  url: string;
851
851
  };
852
852
  CreateWebhookEndpointDto: {
853
- /** @example Production receiver */
853
+ /**
854
+ * @description A label for people.
855
+ * @example Production receiver
856
+ */
854
857
  description?: string | null;
855
858
  /**
856
859
  * @description Create it switched off.
@@ -922,10 +925,136 @@ interface components {
922
925
  */
923
926
  state: "ready" | "incomplete" | "off";
924
927
  };
928
+ /**
929
+ * EntryApprovedEvent
930
+ * @description An entry was approved: by you, or automatically when the waitlist does not need approval. Every real delivery also carries the keys of the previous webhook body (`event`, `occurred_at`, `entry`) until its sunset; read `type`, `created_at` and `data` instead.
931
+ * @example {
932
+ * "created_at": "2026-11-05T09:00:00.000Z",
933
+ * "data": {
934
+ * "entry": {
935
+ * "created_at": "2026-10-17T10:00:00.000Z",
936
+ * "email": "ada@example.com",
937
+ * "id": "1d0b7828-0e1a-407b-8706-aeb7ff619088",
938
+ * "is_test": false,
939
+ * "name": "Ada Lovelace",
940
+ * "position": 4,
941
+ * "referral_code": "464QTHE0",
942
+ * "referral_count": 0,
943
+ * "referred_by_entry_id": null,
944
+ * "status": "approved",
945
+ * "updated_at": "2026-10-17T10:00:00.000Z"
946
+ * },
947
+ * "waitlist_id": "33a8b309-8753-4f08-90d7-9dc484eff392"
948
+ * },
949
+ * "id": "evt_3f0c3c1e-8a2b-4c55-9d3f-0a1b2c3d4e5f",
950
+ * "type": "entry.approved",
951
+ * "waitlist_id": "33a8b309-8753-4f08-90d7-9dc484eff392",
952
+ * "workspace_id": "9b2f6c1e-0d6a-4a63-9a43-2f1c3e4d5a6b"
953
+ * }
954
+ */
955
+ EntryApprovedEvent: {
956
+ /**
957
+ * Format: date-time
958
+ * @description When the event happened (the same on every retry).
959
+ * @example 2026-11-05T09:00:00.000Z
960
+ */
961
+ created_at: string;
962
+ data: components["schemas"]["EntryEventDataDto"];
963
+ /**
964
+ * @description The event id, also sent as `webhook-id`; the same on every retry and replay.
965
+ * @example evt_3f0c3c1e-8a2b-4c55-9d3f-0a1b2c3d4e5f
966
+ */
967
+ id: string;
968
+ /** @description Present and true only on a delivery made by "Send test"; its `data` is the catalogue example. */
969
+ test?: boolean;
970
+ /**
971
+ * @description The event type. Switch on it to narrow the event.
972
+ * @enum {string}
973
+ */
974
+ type: "entry.approved";
975
+ /**
976
+ * Format: uuid
977
+ * @description The waitlist, so you can route without opening `data` (also in `data.waitlist_id`). Absent on "Send test" deliveries.
978
+ */
979
+ waitlist_id?: string;
980
+ /**
981
+ * Format: uuid
982
+ * @description The workspace the waitlist belongs to. Absent on "Send test" deliveries.
983
+ */
984
+ workspace_id?: string;
985
+ };
925
986
  EntryCountResponseDto: {
926
987
  /** @description Number of entries on the waitlist. Test entries are left out unless `include_test=true`. */
927
988
  count: number;
928
989
  };
990
+ /**
991
+ * EntryCreatedEvent
992
+ * @description Someone joined a waitlist. On a waitlist that does not need approval, entry.approved follows straight away. Every real delivery also carries the keys of the previous webhook body (`event`, `occurred_at`, `entry`) until its sunset; read `type`, `created_at` and `data` instead.
993
+ * @example {
994
+ * "created_at": "2026-11-05T09:00:00.000Z",
995
+ * "data": {
996
+ * "entry": {
997
+ * "created_at": "2026-10-17T10:00:00.000Z",
998
+ * "email": "ada@example.com",
999
+ * "id": "1d0b7828-0e1a-407b-8706-aeb7ff619088",
1000
+ * "is_test": false,
1001
+ * "name": "Ada Lovelace",
1002
+ * "position": 4,
1003
+ * "referral_code": "464QTHE0",
1004
+ * "referral_count": 0,
1005
+ * "referred_by_entry_id": null,
1006
+ * "status": "pending",
1007
+ * "updated_at": "2026-10-17T10:00:00.000Z"
1008
+ * },
1009
+ * "waitlist_id": "33a8b309-8753-4f08-90d7-9dc484eff392"
1010
+ * },
1011
+ * "id": "evt_3f0c3c1e-8a2b-4c55-9d3f-0a1b2c3d4e5f",
1012
+ * "type": "entry.created",
1013
+ * "waitlist_id": "33a8b309-8753-4f08-90d7-9dc484eff392",
1014
+ * "workspace_id": "9b2f6c1e-0d6a-4a63-9a43-2f1c3e4d5a6b"
1015
+ * }
1016
+ */
1017
+ EntryCreatedEvent: {
1018
+ /**
1019
+ * Format: date-time
1020
+ * @description When the event happened (the same on every retry).
1021
+ * @example 2026-11-05T09:00:00.000Z
1022
+ */
1023
+ created_at: string;
1024
+ data: components["schemas"]["EntryEventDataDto"];
1025
+ /**
1026
+ * @description The event id, also sent as `webhook-id`; the same on every retry and replay.
1027
+ * @example evt_3f0c3c1e-8a2b-4c55-9d3f-0a1b2c3d4e5f
1028
+ */
1029
+ id: string;
1030
+ /** @description Present and true only on a delivery made by "Send test"; its `data` is the catalogue example. */
1031
+ test?: boolean;
1032
+ /**
1033
+ * @description The event type. Switch on it to narrow the event.
1034
+ * @enum {string}
1035
+ */
1036
+ type: "entry.created";
1037
+ /**
1038
+ * Format: uuid
1039
+ * @description The waitlist, so you can route without opening `data` (also in `data.waitlist_id`). Absent on "Send test" deliveries.
1040
+ */
1041
+ waitlist_id?: string;
1042
+ /**
1043
+ * Format: uuid
1044
+ * @description The workspace the waitlist belongs to. Absent on "Send test" deliveries.
1045
+ */
1046
+ workspace_id?: string;
1047
+ };
1048
+ EntryEventDataDto: {
1049
+ /** @description The entry, as it is after the event. */
1050
+ entry: components["schemas"]["WebhookEntryDto"];
1051
+ /**
1052
+ * Format: uuid
1053
+ * @description The waitlist the entry belongs to.
1054
+ * @example 33a8b309-8753-4f08-90d7-9dc484eff392
1055
+ */
1056
+ waitlist_id: string;
1057
+ };
929
1058
  EntryListPaginationDto: {
930
1059
  has_more: boolean;
931
1060
  next_cursor: string | null;
@@ -934,6 +1063,64 @@ interface components {
934
1063
  data: components["schemas"]["EntryResponseDto"][];
935
1064
  pagination: components["schemas"]["EntryListPaginationDto"];
936
1065
  };
1066
+ /**
1067
+ * EntryRejectedEvent
1068
+ * @description An entry was rejected. Every real delivery also carries the keys of the previous webhook body (`event`, `occurred_at`, `entry`) until its sunset; read `type`, `created_at` and `data` instead.
1069
+ * @example {
1070
+ * "created_at": "2026-11-05T09:00:00.000Z",
1071
+ * "data": {
1072
+ * "entry": {
1073
+ * "created_at": "2026-10-17T10:00:00.000Z",
1074
+ * "email": "ada@example.com",
1075
+ * "id": "1d0b7828-0e1a-407b-8706-aeb7ff619088",
1076
+ * "is_test": false,
1077
+ * "name": "Ada Lovelace",
1078
+ * "position": 4,
1079
+ * "referral_code": "464QTHE0",
1080
+ * "referral_count": 0,
1081
+ * "referred_by_entry_id": null,
1082
+ * "status": "rejected",
1083
+ * "updated_at": "2026-10-17T10:00:00.000Z"
1084
+ * },
1085
+ * "waitlist_id": "33a8b309-8753-4f08-90d7-9dc484eff392"
1086
+ * },
1087
+ * "id": "evt_3f0c3c1e-8a2b-4c55-9d3f-0a1b2c3d4e5f",
1088
+ * "type": "entry.rejected",
1089
+ * "waitlist_id": "33a8b309-8753-4f08-90d7-9dc484eff392",
1090
+ * "workspace_id": "9b2f6c1e-0d6a-4a63-9a43-2f1c3e4d5a6b"
1091
+ * }
1092
+ */
1093
+ EntryRejectedEvent: {
1094
+ /**
1095
+ * Format: date-time
1096
+ * @description When the event happened (the same on every retry).
1097
+ * @example 2026-11-05T09:00:00.000Z
1098
+ */
1099
+ created_at: string;
1100
+ data: components["schemas"]["EntryEventDataDto"];
1101
+ /**
1102
+ * @description The event id, also sent as `webhook-id`; the same on every retry and replay.
1103
+ * @example evt_3f0c3c1e-8a2b-4c55-9d3f-0a1b2c3d4e5f
1104
+ */
1105
+ id: string;
1106
+ /** @description Present and true only on a delivery made by "Send test"; its `data` is the catalogue example. */
1107
+ test?: boolean;
1108
+ /**
1109
+ * @description The event type. Switch on it to narrow the event.
1110
+ * @enum {string}
1111
+ */
1112
+ type: "entry.rejected";
1113
+ /**
1114
+ * Format: uuid
1115
+ * @description The waitlist, so you can route without opening `data` (also in `data.waitlist_id`). Absent on "Send test" deliveries.
1116
+ */
1117
+ waitlist_id?: string;
1118
+ /**
1119
+ * Format: uuid
1120
+ * @description The workspace the waitlist belongs to. Absent on "Send test" deliveries.
1121
+ */
1122
+ workspace_id?: string;
1123
+ };
937
1124
  EntryResponseDto: {
938
1125
  created_at: string;
939
1126
  email: string;
@@ -960,6 +1147,8 @@ interface components {
960
1147
  waitlist_id: string;
961
1148
  workspace_id: string;
962
1149
  };
1150
+ /** @enum {string} */
1151
+ EntryStatus: "pending" | "approved" | "rejected";
963
1152
  ErrorParamDto: {
964
1153
  /**
965
1154
  * @description The failed rule (class-validator constraint name, e.g. `isEmail`, `isUuid`, `whitelistValidation` for a field the operation does not declare), or `invalid`.
@@ -1054,15 +1243,19 @@ interface components {
1054
1243
  webhook_id: string;
1055
1244
  };
1056
1245
  ListWebhookEndpointsResponseDto: {
1246
+ /** @description The endpoints, newest first. */
1057
1247
  data: components["schemas"]["WebhookEndpointDto"][];
1058
1248
  /** @description Always one page (an endpoint limit applies). */
1059
1249
  pagination: components["schemas"]["WebhookPaginationDto"];
1060
1250
  };
1061
1251
  ListWebhookEventTypesResponseDto: {
1252
+ /** @description Every event type this product sends. */
1062
1253
  data: components["schemas"]["WebhookEventTypeDto"][];
1063
1254
  };
1064
1255
  ListWebhookEventsResponseDto: {
1256
+ /** @description The events, newest first. */
1065
1257
  data: components["schemas"]["WebhookEventDto"][];
1258
+ /** @description The cursor for the next page. */
1066
1259
  pagination: components["schemas"]["WebhookPaginationDto"];
1067
1260
  };
1068
1261
  NotificationTestResponseDto: {
@@ -1222,6 +1415,7 @@ interface components {
1222
1415
  ReplayWebhookEventResponseDto: {
1223
1416
  /** @description One attempt per endpoint it was sent to. */
1224
1417
  attempts: components["schemas"]["WebhookDeliveryAttemptDto"][];
1418
+ /** @description The replayed event (the same id as the original). */
1225
1419
  event_id: string;
1226
1420
  };
1227
1421
  RotateWebhookSecretDto: {
@@ -1338,6 +1532,7 @@ interface components {
1338
1532
  url?: string;
1339
1533
  };
1340
1534
  UpdateWebhookEndpointDto: {
1535
+ /** @description A new label; null clears it. */
1341
1536
  description?: string | null;
1342
1537
  /** @description Switch it on or off. Switching on also clears an automatic disable. */
1343
1538
  enabled?: boolean;
@@ -1345,6 +1540,7 @@ interface components {
1345
1540
  event_types?: ("entry.created" | "entry.approved" | "entry.rejected")[];
1346
1541
  /**
1347
1542
  * Format: uri
1543
+ * @description A new absolute https:// URL on a public host.
1348
1544
  * @example https://api.acme.com/webhooks
1349
1545
  */
1350
1546
  url?: string;
@@ -1394,7 +1590,7 @@ interface components {
1394
1590
  waitlist_id: string;
1395
1591
  };
1396
1592
  /** @description Error codes this API returns (open set: a client must accept codes it does not know; new codes are not a breaking change). Each is documented at https://productcraft.co/docs/errors#<code>. */
1397
- WaitlistErrorCode: ("BAD_REQUEST" | "VALIDATION_ERROR" | "UNAUTHORIZED" | "PAYMENT_REQUIRED" | "FORBIDDEN" | "NOT_FOUND" | "METHOD_NOT_ALLOWED" | "NOT_ACCEPTABLE" | "REQUEST_TIMEOUT" | "CONFLICT" | "GONE" | "PRECONDITION_FAILED" | "PAYLOAD_TOO_LARGE" | "UNSUPPORTED_MEDIA_TYPE" | "UNPROCESSABLE_ENTITY" | "PRECONDITION_REQUIRED" | "RATE_LIMITED" | "INTERNAL_SERVER_ERROR" | "NOT_IMPLEMENTED" | "BAD_GATEWAY" | "SERVICE_UNAVAILABLE" | "GATEWAY_TIMEOUT" | "SERVICE_NOT_ENABLED" | "INVALID_CREDENTIALS" | "SESSION_REVOKED" | "MCP_NOT_PERMITTED" | "MCP_WORKSPACE_MISMATCH" | "PAK_NOT_PERMITTED" | "ACTIONS_NOT_GRANTABLE" | "IDEMPOTENCY_KEY_REUSE" | "IDEMPOTENCY_KEY_REQUIRED" | "WEBHOOK_ENDPOINT_LIMIT" | "WEBHOOK_ENDPOINT_NOT_FOUND" | "WEBHOOK_ENDPOINT_NOT_SUBSCRIBED" | "WEBHOOK_EVENT_NOT_FOUND" | "WEBHOOK_EVENT_TYPE_UNKNOWN" | "MAIL_UNREACHABLE" | "ORIGIN_NOT_ALLOWED" | "WAITLIST_NOT_FOUND" | "domain_not_verified_by_provider" | "from_domain_not_verified" | "no_default_sender") | string;
1593
+ WaitlistErrorCode: ("BAD_REQUEST" | "VALIDATION_ERROR" | "UNAUTHORIZED" | "PAYMENT_REQUIRED" | "FORBIDDEN" | "NOT_FOUND" | "METHOD_NOT_ALLOWED" | "NOT_ACCEPTABLE" | "REQUEST_TIMEOUT" | "CONFLICT" | "GONE" | "PRECONDITION_FAILED" | "PAYLOAD_TOO_LARGE" | "UNSUPPORTED_MEDIA_TYPE" | "UNPROCESSABLE_ENTITY" | "PRECONDITION_REQUIRED" | "RATE_LIMITED" | "INTERNAL_SERVER_ERROR" | "NOT_IMPLEMENTED" | "BAD_GATEWAY" | "SERVICE_UNAVAILABLE" | "GATEWAY_TIMEOUT" | "SERVICE_NOT_ENABLED" | "INVALID_CREDENTIALS" | "SESSION_REVOKED" | "MCP_NOT_PERMITTED" | "MCP_WORKSPACE_MISMATCH" | "PAK_NOT_PERMITTED" | "ACTIONS_NOT_GRANTABLE" | "IDEMPOTENCY_KEY_REUSE" | "IDEMPOTENCY_KEY_REQUIRED" | "IDEMPOTENCY_IN_PROGRESS" | "WEBHOOK_ENDPOINT_LIMIT" | "WEBHOOK_ENDPOINT_NOT_FOUND" | "WEBHOOK_ENDPOINT_NOT_SUBSCRIBED" | "WEBHOOK_EVENT_NOT_FOUND" | "WEBHOOK_EVENT_TYPE_UNKNOWN" | "MAIL_UNREACHABLE" | "ORIGIN_NOT_ALLOWED" | "WAITLIST_NOT_FOUND" | "domain_not_verified_by_provider" | "from_domain_not_verified" | "no_default_sender") | string;
1398
1594
  WaitlistListPaginationDto: {
1399
1595
  has_more: boolean;
1400
1596
  next_cursor: string | null;
@@ -1557,6 +1753,8 @@ interface components {
1557
1753
  */
1558
1754
  window: "1d" | "7d" | "30d";
1559
1755
  };
1756
+ /** @enum {string} */
1757
+ WebhookAttemptTrigger: "automatic" | "replay" | "test";
1560
1758
  WebhookCreateResponseDto: {
1561
1759
  /** @description Whether it receives events (`enabled` on the new routes). */
1562
1760
  active: boolean;
@@ -1585,18 +1783,37 @@ interface components {
1585
1783
  WebhookDeliveryAttemptDto: {
1586
1784
  /** @description 1 for the first delivery; retries and replays count up. */
1587
1785
  attempt_number: number;
1588
- /** Format: date-time */
1786
+ /**
1787
+ * Format: date-time
1788
+ * @description When the attempt was made.
1789
+ */
1589
1790
  attempted_at: string;
1590
- /** Format: uuid */
1791
+ /**
1792
+ * Format: uuid
1793
+ * @description The endpoint it was delivered to.
1794
+ */
1591
1795
  endpoint_id: string;
1592
- /** @example request timed out */
1796
+ /**
1797
+ * @description Why the attempt failed when no 2xx came back; null on success.
1798
+ * @example request timed out
1799
+ */
1593
1800
  error_message: string | null;
1594
- /** @example evt_3f0c3c1e-8a2b-4c55-9d3f-0a1b2c3d4e5f */
1801
+ /**
1802
+ * @description The event that was delivered.
1803
+ * @example evt_3f0c3c1e-8a2b-4c55-9d3f-0a1b2c3d4e5f
1804
+ */
1595
1805
  event_id: string;
1596
- /** @example user.created */
1806
+ /**
1807
+ * @description The event's type.
1808
+ * @example user.created
1809
+ */
1597
1810
  event_type: string;
1598
- /** Format: uuid */
1811
+ /**
1812
+ * Format: uuid
1813
+ * @description The attempt's id.
1814
+ */
1599
1815
  id: string;
1816
+ /** @description Milliseconds until the response; null when none came back. */
1600
1817
  latency_ms: number | null;
1601
1818
  /** @description The first 1 KiB of the response body. */
1602
1819
  response_body: string | null;
@@ -1604,11 +1821,8 @@ interface components {
1604
1821
  status_code: number | null;
1605
1822
  /** @description True for a 2xx response. */
1606
1823
  succeeded: boolean;
1607
- /**
1608
- * @description `automatic` (first delivery or a retry), `replay` or `test`.
1609
- * @enum {string}
1610
- */
1611
- trigger: "automatic" | "replay" | "test";
1824
+ /** @description `automatic` (first delivery or a retry), `replay` or `test`. */
1825
+ trigger: components["schemas"]["WebhookAttemptTrigger"];
1612
1826
  /**
1613
1827
  * Format: uri
1614
1828
  * @description Where it was sent.
@@ -1619,17 +1833,28 @@ interface components {
1619
1833
  data: components["schemas"]["LegacyWebhookDeliveryAttemptDto"][];
1620
1834
  pagination: components["schemas"]["PaginationDto"];
1621
1835
  };
1836
+ /** @enum {string} */
1837
+ WebhookEndpointDisabledReason: "manual" | "failing";
1622
1838
  WebhookEndpointDto: {
1623
1839
  /** @description Failed automatic deliveries in a row; a success resets it. */
1624
1840
  consecutive_failures: number;
1625
- /** Format: date-time */
1841
+ /**
1842
+ * Format: date-time
1843
+ * @description When the endpoint was created.
1844
+ */
1626
1845
  created_at: string;
1627
- /** @example Production receiver */
1846
+ /**
1847
+ * @description A label for people; null when unset.
1848
+ * @example Production receiver
1849
+ */
1628
1850
  description: string | null;
1629
- /** Format: date-time */
1851
+ /**
1852
+ * Format: date-time
1853
+ * @description When it was switched off; null while enabled.
1854
+ */
1630
1855
  disabled_at: string | null;
1631
- /** @enum {string|null} */
1632
- disabled_reason: "manual" | "failing" | null;
1856
+ /** @description `manual`: switched off by a caller. `failing`: switched off automatically after failed deliveries. Null while enabled. */
1857
+ disabled_reason: components["schemas"]["WebhookEndpointDisabledReason"] | null;
1633
1858
  /** @description The on/off switch (`PATCH … { enabled }`). */
1634
1859
  enabled: boolean;
1635
1860
  /**
@@ -1642,7 +1867,10 @@ interface components {
1642
1867
  * @description Start of the current failure streak.
1643
1868
  */
1644
1869
  first_failure_at: string | null;
1645
- /** Format: uuid */
1870
+ /**
1871
+ * Format: uuid
1872
+ * @description The endpoint's id.
1873
+ */
1646
1874
  id: string;
1647
1875
  /** @description True for endpoints carried over from the product's previous webhook system: they also receive the old signature header until its sunset date. */
1648
1876
  legacy_signature: boolean;
@@ -1665,30 +1893,42 @@ interface components {
1665
1893
  * @example x9Q=
1666
1894
  */
1667
1895
  signing_secret_hint: string;
1896
+ /** @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. */
1897
+ status: components["schemas"]["WebhookEndpointStatus"];
1668
1898
  /**
1669
- * @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.
1670
- * @enum {string}
1899
+ * Format: date-time
1900
+ * @description When the endpoint last changed.
1671
1901
  */
1672
- status: "enabled" | "disabled" | "auto_disabled";
1673
- /** Format: date-time */
1674
1902
  updated_at: string;
1675
1903
  /**
1676
1904
  * Format: uri
1905
+ * @description Where events are sent.
1677
1906
  * @example https://api.acme.com/webhooks
1678
1907
  */
1679
1908
  url: string;
1680
1909
  };
1910
+ /** @enum {string} */
1911
+ WebhookEndpointStatus: "enabled" | "disabled" | "auto_disabled";
1681
1912
  WebhookEndpointWithSecretDto: {
1682
1913
  /** @description Failed automatic deliveries in a row; a success resets it. */
1683
1914
  consecutive_failures: number;
1684
- /** Format: date-time */
1915
+ /**
1916
+ * Format: date-time
1917
+ * @description When the endpoint was created.
1918
+ */
1685
1919
  created_at: string;
1686
- /** @example Production receiver */
1920
+ /**
1921
+ * @description A label for people; null when unset.
1922
+ * @example Production receiver
1923
+ */
1687
1924
  description: string | null;
1688
- /** Format: date-time */
1925
+ /**
1926
+ * Format: date-time
1927
+ * @description When it was switched off; null while enabled.
1928
+ */
1689
1929
  disabled_at: string | null;
1690
- /** @enum {string|null} */
1691
- disabled_reason: "manual" | "failing" | null;
1930
+ /** @description `manual`: switched off by a caller. `failing`: switched off automatically after failed deliveries. Null while enabled. */
1931
+ disabled_reason: components["schemas"]["WebhookEndpointDisabledReason"] | null;
1692
1932
  /** @description The on/off switch (`PATCH … { enabled }`). */
1693
1933
  enabled: boolean;
1694
1934
  /**
@@ -1701,7 +1941,10 @@ interface components {
1701
1941
  * @description Start of the current failure streak.
1702
1942
  */
1703
1943
  first_failure_at: string | null;
1704
- /** Format: uuid */
1944
+ /**
1945
+ * Format: uuid
1946
+ * @description The endpoint's id.
1947
+ */
1705
1948
  id: string;
1706
1949
  /** @description True for endpoints carried over from the product's previous webhook system: they also receive the old signature header until its sunset date. */
1707
1950
  legacy_signature: boolean;
@@ -1729,31 +1972,101 @@ interface components {
1729
1972
  * @example x9Q=
1730
1973
  */
1731
1974
  signing_secret_hint: string;
1975
+ /** @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. */
1976
+ status: components["schemas"]["WebhookEndpointStatus"];
1732
1977
  /**
1733
- * @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.
1734
- * @enum {string}
1978
+ * Format: date-time
1979
+ * @description When the endpoint last changed.
1735
1980
  */
1736
- status: "enabled" | "disabled" | "auto_disabled";
1737
- /** Format: date-time */
1738
1981
  updated_at: string;
1739
1982
  /**
1740
1983
  * Format: uri
1984
+ * @description Where events are sent.
1741
1985
  * @example https://api.acme.com/webhooks
1742
1986
  */
1743
1987
  url: string;
1744
1988
  };
1989
+ WebhookEntryDto: {
1990
+ /**
1991
+ * Format: date-time
1992
+ * @description When the entry was created.
1993
+ * @example 2026-10-17T10:00:00.000Z
1994
+ */
1995
+ created_at: string;
1996
+ /**
1997
+ * Format: email
1998
+ * @description The email address that signed up.
1999
+ * @example ada@example.com
2000
+ */
2001
+ email: string;
2002
+ /**
2003
+ * Format: uuid
2004
+ * @description The entry id.
2005
+ * @example 1d0b7828-0e1a-407b-8706-aeb7ff619088
2006
+ */
2007
+ id: string;
2008
+ /**
2009
+ * @description True for an entry made with "Add test signup" (those send no webhooks unless asked).
2010
+ * @example false
2011
+ */
2012
+ is_test: boolean;
2013
+ /**
2014
+ * @description The name given at signup.
2015
+ * @example Ada Lovelace
2016
+ */
2017
+ name: string;
2018
+ /**
2019
+ * @description Place in the queue, 1 first.
2020
+ * @example 4
2021
+ */
2022
+ position: number;
2023
+ /**
2024
+ * @description The code this entry shares to refer others.
2025
+ * @example 464QTHE0
2026
+ */
2027
+ referral_code: string;
2028
+ /**
2029
+ * @description How many signups used this entry's referral code.
2030
+ * @example 0
2031
+ */
2032
+ referral_count: number;
2033
+ /**
2034
+ * Format: uuid
2035
+ * @description The entry whose referral code this one signed up with; null when none.
2036
+ * @example null
2037
+ */
2038
+ referred_by_entry_id: string | null;
2039
+ /**
2040
+ * @description Review status after this event: `pending`, `approved` or `rejected`.
2041
+ * @example pending
2042
+ */
2043
+ status: components["schemas"]["EntryStatus"];
2044
+ /**
2045
+ * Format: date-time
2046
+ * @description When the entry last changed.
2047
+ * @example 2026-10-17T10:00:00.000Z
2048
+ */
2049
+ updated_at: string;
2050
+ };
1745
2051
  WebhookEventDeliveryDto: {
1746
2052
  /** @description Number of the latest attempt; retries and replays count up. */
1747
2053
  attempt_number: number;
1748
- /** Format: date-time */
2054
+ /**
2055
+ * Format: date-time
2056
+ * @description When the latest attempt was made.
2057
+ */
1749
2058
  attempted_at: string;
1750
- /** Format: uuid */
2059
+ /**
2060
+ * Format: uuid
2061
+ * @description The endpoint.
2062
+ */
1751
2063
  endpoint_id: string;
1752
2064
  /**
1753
2065
  * Format: date-time
1754
2066
  * @description When the next automatic attempt is due; null when none is queued.
1755
2067
  */
1756
2068
  next_attempt_at: string | null;
2069
+ /** @description HTTP status of the latest attempt; null when no response came back. */
1757
2070
  status_code: number | null;
1758
2071
  /** @description True when the latest attempt got a 2xx. */
1759
2072
  succeeded: boolean;
@@ -1761,7 +2074,10 @@ interface components {
1761
2074
  WebhookEventDetailDto: {
1762
2075
  /** @description Every attempt, newest first. */
1763
2076
  attempts: components["schemas"]["WebhookDeliveryAttemptDto"][];
1764
- /** Format: date-time */
2077
+ /**
2078
+ * Format: date-time
2079
+ * @description When the event happened.
2080
+ */
1765
2081
  created_at: string;
1766
2082
  /** @description Latest attempt per endpoint (an endpoint whose first attempt is still queued is not listed yet). */
1767
2083
  deliveries: components["schemas"]["WebhookEventDeliveryDto"][];
@@ -1774,21 +2090,21 @@ interface components {
1774
2090
  payload: {
1775
2091
  [key: string]: unknown;
1776
2092
  };
1777
- /**
1778
- * @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.
1779
- * @enum {string}
1780
- */
1781
- status: "pending" | "delivered" | "failed" | "not_sent";
2093
+ /** @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. */
2094
+ status: components["schemas"]["WebhookEventStatus"];
1782
2095
  /** @description Made by "Send test". */
1783
2096
  test: boolean;
1784
2097
  /**
2098
+ * @description The event type (one of this product's catalogue).
1785
2099
  * @example entry.created
1786
- * @enum {string}
1787
2100
  */
1788
- type: "entry.created" | "entry.approved" | "entry.rejected";
2101
+ type: components["schemas"]["WebhookEventType"];
1789
2102
  };
1790
2103
  WebhookEventDto: {
1791
- /** Format: date-time */
2104
+ /**
2105
+ * Format: date-time
2106
+ * @description When the event happened.
2107
+ */
1792
2108
  created_at: string;
1793
2109
  /** @description Latest attempt per endpoint (an endpoint whose first attempt is still queued is not listed yet). */
1794
2110
  deliveries: components["schemas"]["WebhookEventDeliveryDto"][];
@@ -1801,36 +2117,43 @@ interface components {
1801
2117
  payload: {
1802
2118
  [key: string]: unknown;
1803
2119
  };
1804
- /**
1805
- * @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.
1806
- * @enum {string}
1807
- */
1808
- status: "pending" | "delivered" | "failed" | "not_sent";
2120
+ /** @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. */
2121
+ status: components["schemas"]["WebhookEventStatus"];
1809
2122
  /** @description Made by "Send test". */
1810
2123
  test: boolean;
1811
2124
  /**
2125
+ * @description The event type (one of this product's catalogue).
1812
2126
  * @example entry.created
1813
- * @enum {string}
1814
2127
  */
1815
- type: "entry.created" | "entry.approved" | "entry.rejected";
2128
+ type: components["schemas"]["WebhookEventType"];
1816
2129
  };
2130
+ /** @enum {string} */
2131
+ WebhookEventStatus: "pending" | "delivered" | "failed" | "not_sent";
2132
+ /**
2133
+ * @description Every event type this product sends; `x-webhooks` maps each to its payload schema. New types can be added, so treat it as open.
2134
+ * @enum {string}
2135
+ */
2136
+ WebhookEventType: "entry.created" | "entry.approved" | "entry.rejected";
1817
2137
  WebhookEventTypeDto: {
1818
2138
  /**
1819
2139
  * @description Group shown in the event picker.
1820
2140
  * @example Users
1821
2141
  */
1822
2142
  category: string;
1823
- /** @example A user signed up or was created by an admin. */
2143
+ /**
2144
+ * @description When this event is sent.
2145
+ * @example A user signed up or was created by an admin.
2146
+ */
1824
2147
  description: string;
1825
2148
  /** @description An example `data` object; "Send test" delivers exactly this. */
1826
2149
  example: {
1827
2150
  [key: string]: unknown;
1828
2151
  };
1829
2152
  /**
2153
+ * @description The event type (one of this product's catalogue).
1830
2154
  * @example entry.created
1831
- * @enum {string}
1832
2155
  */
1833
- type: "entry.created" | "entry.approved" | "entry.rejected";
2156
+ type: components["schemas"]["WebhookEventType"];
1834
2157
  };
1835
2158
  WebhookListResponseDto: {
1836
2159
  data: components["schemas"]["WebhookResponseDto"][];
@@ -2238,6 +2561,8 @@ interface operations {
2238
2561
  /** @description Accepted by Mail and queued for delivery. */
2239
2562
  202: {
2240
2563
  headers: {
2564
+ /** @description `true` when this response is a replay of an earlier request with the same `Idempotency-Key`. */
2565
+ "Idempotent-Replay"?: "true";
2241
2566
  "X-Request-Id": components["headers"]["RequestId"];
2242
2567
  [name: string]: unknown;
2243
2568
  };
@@ -2285,9 +2610,11 @@ interface operations {
2285
2610
  "application/json": components["schemas"]["ErrorResponseDto"];
2286
2611
  };
2287
2612
  };
2288
- /** @description Idempotency-Key reused with a different body (`IDEMPOTENCY_KEY_REUSE`). */
2613
+ /** @description Idempotency-Key reused with a different body (`IDEMPOTENCY_KEY_REUSE`). Idempotency: `IDEMPOTENCY_KEY_REUSE` when this `Idempotency-Key` was already used with a different body or route; `IDEMPOTENCY_IN_PROGRESS` while another request with the same key is still running (retry after `Retry-After` seconds, with the same key). */
2289
2614
  409: {
2290
2615
  headers: {
2616
+ /** @description Seconds to wait before retrying with the same key (sent with `IDEMPOTENCY_IN_PROGRESS`). */
2617
+ "Retry-After"?: number;
2291
2618
  "X-Request-Id": components["headers"]["RequestId"];
2292
2619
  [name: string]: unknown;
2293
2620
  };
@@ -2387,6 +2714,8 @@ interface operations {
2387
2714
  /** @description Waitlist created. */
2388
2715
  201: {
2389
2716
  headers: {
2717
+ /** @description `true` when this response is a replay of an earlier request with the same `Idempotency-Key`. */
2718
+ "Idempotent-Replay"?: "true";
2390
2719
  "X-Request-Id": components["headers"]["RequestId"];
2391
2720
  [name: string]: unknown;
2392
2721
  };
@@ -2414,9 +2743,11 @@ interface operations {
2414
2743
  "application/json": components["schemas"]["ErrorResponseDto"];
2415
2744
  };
2416
2745
  };
2417
- /** @description Slug already taken in this workspace. */
2746
+ /** @description Slug already taken in this workspace. Idempotency: `IDEMPOTENCY_KEY_REUSE` when this `Idempotency-Key` was already used with a different body or route; `IDEMPOTENCY_IN_PROGRESS` while another request with the same key is still running (retry after `Retry-After` seconds, with the same key). */
2418
2747
  409: {
2419
2748
  headers: {
2749
+ /** @description Seconds to wait before retrying with the same key (sent with `IDEMPOTENCY_IN_PROGRESS`). */
2750
+ "Retry-After"?: number;
2420
2751
  "X-Request-Id": components["headers"]["RequestId"];
2421
2752
  [name: string]: unknown;
2422
2753
  };
@@ -3114,6 +3445,8 @@ interface operations {
3114
3445
  /** @description Test entry created. */
3115
3446
  201: {
3116
3447
  headers: {
3448
+ /** @description `true` when this response is a replay of an earlier request with the same `Idempotency-Key`. */
3449
+ "Idempotent-Replay"?: "true";
3117
3450
  "X-Request-Id": components["headers"]["RequestId"];
3118
3451
  [name: string]: unknown;
3119
3452
  };
@@ -3151,9 +3484,11 @@ interface operations {
3151
3484
  "application/json": components["schemas"]["ErrorResponseDto"];
3152
3485
  };
3153
3486
  };
3154
- /** @description Idempotency-Key reused with a different body. */
3487
+ /** @description Idempotency-Key reused with a different body. Idempotency: `IDEMPOTENCY_KEY_REUSE` when this `Idempotency-Key` was already used with a different body or route; `IDEMPOTENCY_IN_PROGRESS` while another request with the same key is still running (retry after `Retry-After` seconds, with the same key). */
3155
3488
  409: {
3156
3489
  headers: {
3490
+ /** @description Seconds to wait before retrying with the same key (sent with `IDEMPOTENCY_IN_PROGRESS`). */
3491
+ "Retry-After"?: number;
3157
3492
  "X-Request-Id": components["headers"]["RequestId"];
3158
3493
  [name: string]: unknown;
3159
3494
  };
@@ -3401,6 +3736,8 @@ interface operations {
3401
3736
  /** @description Webhook created. Includes plaintext `signing_secret` exactly once. */
3402
3737
  201: {
3403
3738
  headers: {
3739
+ /** @description `true` when this response is a replay of an earlier request with the same `Idempotency-Key`. */
3740
+ "Idempotent-Replay"?: "true";
3404
3741
  "X-Request-Id": components["headers"]["RequestId"];
3405
3742
  [name: string]: unknown;
3406
3743
  };
@@ -3408,9 +3745,11 @@ interface operations {
3408
3745
  "application/json": components["schemas"]["WebhookCreateResponseDto"];
3409
3746
  };
3410
3747
  };
3411
- /** @description The workspace already has 10 webhooks. */
3748
+ /** @description The workspace already has 10 webhooks. Idempotency: `IDEMPOTENCY_KEY_REUSE` when this `Idempotency-Key` was already used with a different body or route; `IDEMPOTENCY_IN_PROGRESS` while another request with the same key is still running (retry after `Retry-After` seconds, with the same key). */
3412
3749
  409: {
3413
3750
  headers: {
3751
+ /** @description Seconds to wait before retrying with the same key (sent with `IDEMPOTENCY_IN_PROGRESS`). */
3752
+ "Retry-After"?: number;
3414
3753
  "X-Request-Id": components["headers"]["RequestId"];
3415
3754
  [name: string]: unknown;
3416
3755
  };
@@ -3492,6 +3831,8 @@ interface operations {
3492
3831
  responses: {
3493
3832
  201: {
3494
3833
  headers: {
3834
+ /** @description `true` when this response is a replay of an earlier request with the same `Idempotency-Key`. */
3835
+ "Idempotent-Replay"?: "true";
3495
3836
  "X-Request-Id": components["headers"]["RequestId"];
3496
3837
  [name: string]: unknown;
3497
3838
  };
@@ -3529,9 +3870,11 @@ interface operations {
3529
3870
  "application/json": components["schemas"]["ErrorResponseDto"];
3530
3871
  };
3531
3872
  };
3532
- /** @description Already 10 endpoints (`WEBHOOK_ENDPOINT_LIMIT`), or Idempotency-Key reused with a different body (`IDEMPOTENCY_KEY_REUSE`). */
3873
+ /** @description Already 10 endpoints (`WEBHOOK_ENDPOINT_LIMIT`), or Idempotency-Key reused with a different body (`IDEMPOTENCY_KEY_REUSE`). Idempotency: `IDEMPOTENCY_KEY_REUSE` when this `Idempotency-Key` was already used with a different body or route; `IDEMPOTENCY_IN_PROGRESS` while another request with the same key is still running (retry after `Retry-After` seconds, with the same key). */
3533
3874
  409: {
3534
3875
  headers: {
3876
+ /** @description Seconds to wait before retrying with the same key (sent with `IDEMPOTENCY_IN_PROGRESS`). */
3877
+ "Retry-After"?: number;
3535
3878
  "X-Request-Id": components["headers"]["RequestId"];
3536
3879
  [name: string]: unknown;
3537
3880
  };
@@ -3697,6 +4040,8 @@ interface operations {
3697
4040
  responses: {
3698
4041
  200: {
3699
4042
  headers: {
4043
+ /** @description `true` when this response is a replay of an earlier request with the same `Idempotency-Key`. */
4044
+ "Idempotent-Replay"?: "true";
3700
4045
  "X-Request-Id": components["headers"]["RequestId"];
3701
4046
  [name: string]: unknown;
3702
4047
  };
@@ -3744,9 +4089,11 @@ interface operations {
3744
4089
  "application/json": components["schemas"]["ErrorResponseDto"];
3745
4090
  };
3746
4091
  };
3747
- /** @description Idempotency-Key reused with a different body (`IDEMPOTENCY_KEY_REUSE`). */
4092
+ /** @description Idempotency-Key reused with a different body (`IDEMPOTENCY_KEY_REUSE`). Idempotency: `IDEMPOTENCY_KEY_REUSE` when this `Idempotency-Key` was already used with a different body or route; `IDEMPOTENCY_IN_PROGRESS` while another request with the same key is still running (retry after `Retry-After` seconds, with the same key). */
3748
4093
  409: {
3749
4094
  headers: {
4095
+ /** @description Seconds to wait before retrying with the same key (sent with `IDEMPOTENCY_IN_PROGRESS`). */
4096
+ "Retry-After"?: number;
3750
4097
  "X-Request-Id": components["headers"]["RequestId"];
3751
4098
  [name: string]: unknown;
3752
4099
  };
@@ -3787,6 +4134,8 @@ interface operations {
3787
4134
  responses: {
3788
4135
  200: {
3789
4136
  headers: {
4137
+ /** @description `true` when this response is a replay of an earlier request with the same `Idempotency-Key`. */
4138
+ "Idempotent-Replay"?: "true";
3790
4139
  "X-Request-Id": components["headers"]["RequestId"];
3791
4140
  [name: string]: unknown;
3792
4141
  };
@@ -3834,9 +4183,11 @@ interface operations {
3834
4183
  "application/json": components["schemas"]["ErrorResponseDto"];
3835
4184
  };
3836
4185
  };
3837
- /** @description Idempotency-Key reused with a different body (`IDEMPOTENCY_KEY_REUSE`). */
4186
+ /** @description Idempotency-Key reused with a different body (`IDEMPOTENCY_KEY_REUSE`). Idempotency: `IDEMPOTENCY_KEY_REUSE` when this `Idempotency-Key` was already used with a different body or route; `IDEMPOTENCY_IN_PROGRESS` while another request with the same key is still running (retry after `Retry-After` seconds, with the same key). */
3838
4187
  409: {
3839
4188
  headers: {
4189
+ /** @description Seconds to wait before retrying with the same key (sent with `IDEMPOTENCY_IN_PROGRESS`). */
4190
+ "Retry-After"?: number;
3840
4191
  "X-Request-Id": components["headers"]["RequestId"];
3841
4192
  [name: string]: unknown;
3842
4193
  };
@@ -3868,6 +4219,8 @@ interface operations {
3868
4219
  /** @description The attempt, successful or not. */
3869
4220
  200: {
3870
4221
  headers: {
4222
+ /** @description `true` when this response is a replay of an earlier request with the same `Idempotency-Key`. */
4223
+ "Idempotent-Replay"?: "true";
3871
4224
  "X-Request-Id": components["headers"]["RequestId"];
3872
4225
  [name: string]: unknown;
3873
4226
  };
@@ -3915,9 +4268,11 @@ interface operations {
3915
4268
  "application/json": components["schemas"]["ErrorResponseDto"];
3916
4269
  };
3917
4270
  };
3918
- /** @description Idempotency-Key reused with a different body (`IDEMPOTENCY_KEY_REUSE`). */
4271
+ /** @description Idempotency-Key reused with a different body (`IDEMPOTENCY_KEY_REUSE`). Idempotency: `IDEMPOTENCY_KEY_REUSE` when this `Idempotency-Key` was already used with a different body or route; `IDEMPOTENCY_IN_PROGRESS` while another request with the same key is still running (retry after `Retry-After` seconds, with the same key). */
3919
4272
  409: {
3920
4273
  headers: {
4274
+ /** @description Seconds to wait before retrying with the same key (sent with `IDEMPOTENCY_IN_PROGRESS`). */
4275
+ "Retry-After"?: number;
3921
4276
  "X-Request-Id": components["headers"]["RequestId"];
3922
4277
  [name: string]: unknown;
3923
4278
  };
@@ -3976,11 +4331,13 @@ interface operations {
3976
4331
  type?: ("entry.created" | "entry.approved" | "entry.rejected")[];
3977
4332
  /** @description Only events sent (or queued) to this endpoint. */
3978
4333
  endpoint_id?: string;
3979
- status?: "pending" | "delivered" | "failed" | "not_sent";
4334
+ /** @description Only events in this delivery status. */
4335
+ status?: components["schemas"]["WebhookEventStatus"];
3980
4336
  /** @description Only events created at or after this instant. */
3981
4337
  created_after?: string;
3982
4338
  /** @description Only events created before this instant. */
3983
4339
  created_before?: string;
4340
+ /** @description Page size. */
3984
4341
  limit?: number;
3985
4342
  /** @description The previous page's `pagination.next_cursor`. */
3986
4343
  cursor?: string;
@@ -4119,6 +4476,8 @@ interface operations {
4119
4476
  responses: {
4120
4477
  200: {
4121
4478
  headers: {
4479
+ /** @description `true` when this response is a replay of an earlier request with the same `Idempotency-Key`. */
4480
+ "Idempotent-Replay"?: "true";
4122
4481
  "X-Request-Id": components["headers"]["RequestId"];
4123
4482
  [name: string]: unknown;
4124
4483
  };
@@ -4166,9 +4525,11 @@ interface operations {
4166
4525
  "application/json": components["schemas"]["ErrorResponseDto"];
4167
4526
  };
4168
4527
  };
4169
- /** @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`). */
4528
+ /** @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`). Idempotency: `IDEMPOTENCY_KEY_REUSE` when this `Idempotency-Key` was already used with a different body or route; `IDEMPOTENCY_IN_PROGRESS` while another request with the same key is still running (retry after `Retry-After` seconds, with the same key). */
4170
4529
  409: {
4171
4530
  headers: {
4531
+ /** @description Seconds to wait before retrying with the same key (sent with `IDEMPOTENCY_IN_PROGRESS`). */
4532
+ "Retry-After"?: number;
4172
4533
  "X-Request-Id": components["headers"]["RequestId"];
4173
4534
  [name: string]: unknown;
4174
4535
  };