featurebase-node 0.15.0 → 0.15.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (96) hide show
  1. package/CHANGELOG.md +4 -0
  2. package/client.d.mts +6 -0
  3. package/client.d.mts.map +1 -1
  4. package/client.d.ts +6 -0
  5. package/client.d.ts.map +1 -1
  6. package/client.js +6 -0
  7. package/client.js.map +1 -1
  8. package/client.mjs +6 -0
  9. package/client.mjs.map +1 -1
  10. package/package.json +1 -1
  11. package/resources/audit-logs.d.mts +2 -2
  12. package/resources/audit-logs.d.mts.map +1 -1
  13. package/resources/audit-logs.d.ts +2 -2
  14. package/resources/audit-logs.d.ts.map +1 -1
  15. package/resources/conversation-attributes.d.mts +5 -0
  16. package/resources/conversation-attributes.d.mts.map +1 -1
  17. package/resources/conversation-attributes.d.ts +5 -0
  18. package/resources/conversation-attributes.d.ts.map +1 -1
  19. package/resources/index.d.mts +1 -0
  20. package/resources/index.d.mts.map +1 -1
  21. package/resources/index.d.ts +1 -0
  22. package/resources/index.d.ts.map +1 -1
  23. package/resources/index.js +3 -1
  24. package/resources/index.js.map +1 -1
  25. package/resources/index.mjs +1 -0
  26. package/resources/index.mjs.map +1 -1
  27. package/resources/reports.d.mts +101 -19
  28. package/resources/reports.d.mts.map +1 -1
  29. package/resources/reports.d.ts +101 -19
  30. package/resources/reports.d.ts.map +1 -1
  31. package/resources/reports.js +15 -8
  32. package/resources/reports.js.map +1 -1
  33. package/resources/reports.mjs +15 -8
  34. package/resources/reports.mjs.map +1 -1
  35. package/resources/support/conversations/conversations.d.mts +22 -1
  36. package/resources/support/conversations/conversations.d.mts.map +1 -1
  37. package/resources/support/conversations/conversations.d.ts +22 -1
  38. package/resources/support/conversations/conversations.d.ts.map +1 -1
  39. package/resources/support/conversations/conversations.js.map +1 -1
  40. package/resources/support/conversations/conversations.mjs.map +1 -1
  41. package/resources/training-data/files.d.mts +292 -0
  42. package/resources/training-data/files.d.mts.map +1 -0
  43. package/resources/training-data/files.d.ts +292 -0
  44. package/resources/training-data/files.d.ts.map +1 -0
  45. package/resources/training-data/files.js +171 -0
  46. package/resources/training-data/files.js.map +1 -0
  47. package/resources/training-data/files.mjs +167 -0
  48. package/resources/training-data/files.mjs.map +1 -0
  49. package/resources/training-data/index.d.mts +4 -0
  50. package/resources/training-data/index.d.mts.map +1 -0
  51. package/resources/training-data/index.d.ts +4 -0
  52. package/resources/training-data/index.d.ts.map +1 -0
  53. package/resources/training-data/index.js +11 -0
  54. package/resources/training-data/index.js.map +1 -0
  55. package/resources/training-data/index.mjs +5 -0
  56. package/resources/training-data/index.mjs.map +1 -0
  57. package/resources/training-data/qna.d.mts +370 -0
  58. package/resources/training-data/qna.d.mts.map +1 -0
  59. package/resources/training-data/qna.d.ts +370 -0
  60. package/resources/training-data/qna.d.ts.map +1 -0
  61. package/resources/training-data/qna.js +177 -0
  62. package/resources/training-data/qna.js.map +1 -0
  63. package/resources/training-data/qna.mjs +173 -0
  64. package/resources/training-data/qna.mjs.map +1 -0
  65. package/resources/training-data/training-data.d.mts +442 -0
  66. package/resources/training-data/training-data.d.mts.map +1 -0
  67. package/resources/training-data/training-data.d.ts +442 -0
  68. package/resources/training-data/training-data.d.ts.map +1 -0
  69. package/resources/training-data/training-data.js +105 -0
  70. package/resources/training-data/training-data.js.map +1 -0
  71. package/resources/training-data/training-data.mjs +100 -0
  72. package/resources/training-data/training-data.mjs.map +1 -0
  73. package/resources/training-data.d.mts +2 -0
  74. package/resources/training-data.d.mts.map +1 -0
  75. package/resources/training-data.d.ts +2 -0
  76. package/resources/training-data.d.ts.map +1 -0
  77. package/resources/training-data.js +6 -0
  78. package/resources/training-data.js.map +1 -0
  79. package/resources/training-data.mjs +3 -0
  80. package/resources/training-data.mjs.map +1 -0
  81. package/src/client.ts +20 -0
  82. package/src/resources/audit-logs.ts +12 -0
  83. package/src/resources/conversation-attributes.ts +6 -0
  84. package/src/resources/index.ts +7 -0
  85. package/src/resources/reports.ts +160 -19
  86. package/src/resources/support/conversations/conversations.ts +27 -1
  87. package/src/resources/training-data/files.ts +431 -0
  88. package/src/resources/training-data/index.ts +31 -0
  89. package/src/resources/training-data/qna.ts +514 -0
  90. package/src/resources/training-data/training-data.ts +603 -0
  91. package/src/resources/training-data.ts +3 -0
  92. package/src/version.ts +1 -1
  93. package/version.d.mts +1 -1
  94. package/version.d.ts +1 -1
  95. package/version.js +1 -1
  96. package/version.mjs +1 -1
@@ -0,0 +1,2 @@
1
+ export * from "./training-data/index.js";
2
+ //# sourceMappingURL=training-data.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"training-data.d.ts","sourceRoot":"","sources":["../src/resources/training-data.ts"],"names":[],"mappings":"AAEA,yCAAsC"}
@@ -0,0 +1,6 @@
1
+ "use strict";
2
+ // File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.
3
+ Object.defineProperty(exports, "__esModule", { value: true });
4
+ const tslib_1 = require("../internal/tslib.js");
5
+ tslib_1.__exportStar(require("./training-data/index.js"), exports);
6
+ //# sourceMappingURL=training-data.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"training-data.js","sourceRoot":"","sources":["../src/resources/training-data.ts"],"names":[],"mappings":";AAAA,sFAAsF;;;AAEtF,mEAAsC"}
@@ -0,0 +1,3 @@
1
+ // File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.
2
+ export * from "./training-data/index.mjs";
3
+ //# sourceMappingURL=training-data.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"training-data.mjs","sourceRoot":"","sources":["../src/resources/training-data.ts"],"names":[],"mappings":"AAAA,sFAAsF;AAEtF,0CAAsC"}
package/src/client.ts CHANGED
@@ -101,6 +101,13 @@ import { Feedback } from './resources/feedback/feedback';
101
101
  import { HelpCenter } from './resources/help-center/help-center';
102
102
  import { Organization } from './resources/organization/organization';
103
103
  import { Support } from './resources/support/support';
104
+ import {
105
+ KnowledgeSearch,
106
+ Oracle,
107
+ TrainingData,
108
+ TrainingDataOracleParams,
109
+ TrainingDataSearchParams,
110
+ } from './resources/training-data/training-data';
104
111
  import { Users } from './resources/users/users';
105
112
  import { type Fetch } from './internal/builtin-types';
106
113
  import { HeadersLike, NullableHeaders, buildHeaders } from './internal/headers';
@@ -872,6 +879,10 @@ export class Featurebase {
872
879
  * Query your workspace analytics: conversation volume, response times, CSAT, SLA compliance, teammate performance, AI agent resolutions and more. Start with the datasets catalog to discover metrics and attributes, then run queries with filters, grouping and period comparison.
873
880
  */
874
881
  reports: API.Reports = new API.Reports(this);
882
+ /**
883
+ * Training data teaches the AI agent about your product beyond your public Help Center: training files (documents, policies, internal notes) and Q&A entries (question variants with the exact answer to give). Use these endpoints to keep that knowledge in sync from your own systems — for example, pushing resolved support conversations, internal runbooks, or SOP documents automatically.
884
+ */
885
+ trainingData: API.TrainingData = new API.TrainingData(this);
875
886
  }
876
887
 
877
888
  Featurebase.Support = Support;
@@ -885,6 +896,7 @@ Featurebase.Webhooks = Webhooks;
885
896
  Featurebase.ConversationAttributes = ConversationAttributes;
886
897
  Featurebase.AuditLogs = AuditLogs;
887
898
  Featurebase.Reports = Reports;
899
+ Featurebase.TrainingData = TrainingData;
888
900
 
889
901
  export declare namespace Featurebase {
890
902
  export type RequestOptions = Opts.RequestOptions;
@@ -985,4 +997,12 @@ export declare namespace Featurebase {
985
997
  type ReportLookupFilterValuesParams as ReportLookupFilterValuesParams,
986
998
  type ReportQueryParams as ReportQueryParams,
987
999
  };
1000
+
1001
+ export {
1002
+ TrainingData as TrainingData,
1003
+ type KnowledgeSearch as KnowledgeSearch,
1004
+ type Oracle as Oracle,
1005
+ type TrainingDataOracleParams as TrainingDataOracleParams,
1006
+ type TrainingDataSearchParams as TrainingDataSearchParams,
1007
+ };
988
1008
  }
@@ -276,6 +276,12 @@ export interface AuditLogListResponse {
276
276
  | 'ai_agent.guidance_changed'
277
277
  | 'ai_agent.multilingual_changed'
278
278
  | 'ai_agent.data_context_changed'
279
+ | 'ai_agent.training_file_created'
280
+ | 'ai_agent.training_file_updated'
281
+ | 'ai_agent.training_file_deleted'
282
+ | 'ai_agent.qna_created'
283
+ | 'ai_agent.qna_updated'
284
+ | 'ai_agent.qna_deleted'
279
285
  | 'email.sending_address_created'
280
286
  | 'email.sending_address_updated'
281
287
  | 'email.sending_address_deleted'
@@ -560,6 +566,12 @@ export interface AuditLogListParams extends CursorPageParams {
560
566
  | 'ai_agent.guidance_changed'
561
567
  | 'ai_agent.multilingual_changed'
562
568
  | 'ai_agent.data_context_changed'
569
+ | 'ai_agent.training_file_created'
570
+ | 'ai_agent.training_file_updated'
571
+ | 'ai_agent.training_file_deleted'
572
+ | 'ai_agent.qna_created'
573
+ | 'ai_agent.qna_updated'
574
+ | 'ai_agent.qna_deleted'
563
575
  | 'email.sending_address_created'
564
576
  | 'email.sending_address_updated'
565
577
  | 'email.sending_address_deleted'
@@ -113,6 +113,12 @@ export interface ConversationAttribute {
113
113
  */
114
114
  options?: Array<ConversationAttributeOption>;
115
115
 
116
+ /**
117
+ * Whether teammates must set a value before closing a conversation from the Inbox.
118
+ * Closes via the API, workflows, and Fibi are not blocked.
119
+ */
120
+ required?: boolean;
121
+
116
122
  /**
117
123
  * ISO timestamp when the attribute was last updated.
118
124
  */
@@ -63,6 +63,13 @@ export {
63
63
  type SurveysCursorPage,
64
64
  type SurveyListResponsesResponsesCursorPage,
65
65
  } from './surveys';
66
+ export {
67
+ TrainingData,
68
+ type KnowledgeSearch,
69
+ type Oracle,
70
+ type TrainingDataOracleParams,
71
+ type TrainingDataSearchParams,
72
+ } from './training-data/training-data';
66
73
  export { Users } from './users/users';
67
74
  export {
68
75
  Webhooks,
@@ -20,6 +20,8 @@ export class Reports extends APIResource {
20
20
  * `dataPointFilters` selecting the data point:
21
21
  *
22
22
  * - `timeBucket` — a `date` from the time series
23
+ * - `timeSegmentValue` + `timeSegmentGranularity` — the selected bucket from a
24
+ * Segment-by-Time series
23
25
  * - `groupValue` / `segmentValue` — a `group` / `segment` value from grouped data
24
26
  * - `dayOfWeek` + `hourOfDay` — a heatmap cell (`hourly_heatmap` view)
25
27
  * - `flowPathId` or `sourceNodeId` + `targetNodeId` — a flow edge (`sankey` view)
@@ -187,14 +189,19 @@ export class Reports extends APIResource {
187
189
  * For high-cardinality breakdowns, cap the number of returned series:
188
190
  *
189
191
  * - `topValuesLimit` keeps only the top **N** `groupBy` values;
190
- * `segmentTopValuesLimit` does the same for `segmentBy`. Allowed values: **5, 7,
191
- * 10, 15, 20**. `topValuesLimit` requires `groupBy`; `segmentTopValuesLimit`
192
- * requires `segmentBy`.
193
- * - Members are ranked by the selected metric/aggregation over the **full filtered
194
- * primary range**, so the ranked set is **stable across every time bucket** (a
195
- * value that spikes in one bucket but is small overall does not enter the set).
196
- * A comparison period reuses the **primary period's** ranked set it is never
197
- * re-ranked, so the legend stays identical period-over-period.
192
+ * `segmentTopValuesLimit` does the same for `segmentBy`. Both accept integers
193
+ * from **1 to 100**; the editor offers common presets plus a Custom value.
194
+ * `topValuesLimit` requires `groupBy`; `segmentTopValuesLimit` requires
195
+ * `segmentBy`.
196
+ * - For time-series segment breakdowns, members are ranked **inside each time
197
+ * bucket**. The response keeps the union of those bucket winners in its series
198
+ * catalog, while a member outside a bucket's Top N has a zero value in that
199
+ * bucket. This matches the chart's per-period ranking semantics. A comparison
200
+ * period is folded into the primary period's union of visible members so current
201
+ * and previous series keep the same identities.
202
+ * - For non-time-series grouped results, members are ranked over the full filtered
203
+ * primary range. A comparison period reuses the primary period's ranked set
204
+ * rather than independently changing the legend.
198
205
  * - `showOther` / `segmentShowOther` append a single synthetic bucket with id
199
206
  * `__other__` and label `Other` that sums every value outside the top set.
200
207
  * Because the values are summed, Show Other is only supported for **additive
@@ -339,6 +346,38 @@ export interface ReportAttributeOption {
339
346
  label: string;
340
347
 
341
348
  value: string;
349
+
350
+ presentation?: ReportAttributeOption.Presentation;
351
+ }
352
+
353
+ export namespace ReportAttributeOption {
354
+ export interface Presentation {
355
+ kind:
356
+ | 'brand'
357
+ | 'company'
358
+ | 'country'
359
+ | 'knowledge_source'
360
+ | 'plain'
361
+ | 'sla'
362
+ | 'tag'
363
+ | 'team'
364
+ | 'teammate'
365
+ | 'ticket_category'
366
+ | 'ticket_state'
367
+ | 'ticket_type'
368
+ | 'user'
369
+ | 'workflow';
370
+
371
+ color?: string;
372
+
373
+ icon?: unknown;
374
+
375
+ iconSvg?: string;
376
+
377
+ imageUrl?: string;
378
+
379
+ secondaryLabel?: string;
380
+ }
342
381
  }
343
382
 
344
383
  export interface ReportDataset {
@@ -428,11 +467,29 @@ export interface ReportGroupedDatum {
428
467
 
429
468
  groupLabel?: string;
430
469
 
470
+ identity?: ReportGroupedDatum.Identity;
471
+
431
472
  previousValue?: number;
432
473
 
433
474
  segments?: Array<ReportSegmentDatum>;
434
475
  }
435
476
 
477
+ export namespace ReportGroupedDatum {
478
+ export interface Identity {
479
+ id: string;
480
+
481
+ kind: 'teammate' | 'team' | 'user' | 'company' | 'fibi';
482
+
483
+ label: string;
484
+
485
+ avatarUrl?: string;
486
+
487
+ color?: string;
488
+
489
+ website?: string;
490
+ }
491
+ }
492
+
436
493
  export interface ReportMetric {
437
494
  /**
438
495
  * Metric ID — use as `metric` in query requests.
@@ -445,6 +502,8 @@ export interface ReportMetric {
445
502
  'count' | 'sum' | 'avg' | 'median' | 'min' | 'max' | 'range' | 'percentile' | 'value'
446
503
  >;
447
504
 
505
+ definitionVersion: number;
506
+
448
507
  description: string;
449
508
 
450
509
  executionKind: 'pipe_aggregate' | 'pipe_computed_ratio';
@@ -528,11 +587,29 @@ export interface ReportSegmentDatum {
528
587
 
529
588
  value: number;
530
589
 
590
+ identity?: ReportSegmentDatum.Identity;
591
+
531
592
  previousValue?: number;
532
593
 
533
594
  segmentLabel?: string;
534
595
  }
535
596
 
597
+ export namespace ReportSegmentDatum {
598
+ export interface Identity {
599
+ id: string;
600
+
601
+ kind: 'teammate' | 'team' | 'user' | 'company' | 'fibi';
602
+
603
+ label: string;
604
+
605
+ avatarUrl?: string;
606
+
607
+ color?: string;
608
+
609
+ website?: string;
610
+ }
611
+ }
612
+
536
613
  export interface ReportTimeSeriesDatum {
537
614
  /**
538
615
  * Time bucket start (ISO 8601).
@@ -687,8 +764,12 @@ export interface ReportLookupFilterValuesResponse {
687
764
 
688
765
  object: 'list';
689
766
 
767
+ lookupContextKey?: string;
768
+
690
769
  nextCursor?: string;
691
770
 
771
+ truncated?: boolean;
772
+
692
773
  unavailableSelectedValues?: Array<string>;
693
774
  }
694
775
 
@@ -820,16 +901,38 @@ export namespace ReportQueryResponse {
820
901
  export interface Cells {
821
902
  display: string;
822
903
 
904
+ deltaPercent?: number;
905
+
823
906
  denominator?: number;
824
907
 
908
+ identity?: Cells.Identity;
909
+
825
910
  numerator?: number;
826
911
 
912
+ previousValue?: number;
913
+
827
914
  raw?: unknown;
828
915
 
829
916
  sortValue?: string | number | null;
830
917
 
831
918
  value?: unknown;
832
919
  }
920
+
921
+ export namespace Cells {
922
+ export interface Identity {
923
+ id: string;
924
+
925
+ kind: 'teammate' | 'team' | 'user' | 'company' | 'fibi';
926
+
927
+ label: string;
928
+
929
+ avatarUrl?: string;
930
+
931
+ color?: string;
932
+
933
+ website?: string;
934
+ }
935
+ }
833
936
  }
834
937
 
835
938
  export interface Sort {
@@ -848,16 +951,38 @@ export namespace ReportQueryResponse {
848
951
  export interface Cells {
849
952
  display: string;
850
953
 
954
+ deltaPercent?: number;
955
+
851
956
  denominator?: number;
852
957
 
958
+ identity?: Cells.Identity;
959
+
853
960
  numerator?: number;
854
961
 
962
+ previousValue?: number;
963
+
855
964
  raw?: unknown;
856
965
 
857
966
  sortValue?: string | number | null;
858
967
 
859
968
  value?: unknown;
860
969
  }
970
+
971
+ export namespace Cells {
972
+ export interface Identity {
973
+ id: string;
974
+
975
+ kind: 'teammate' | 'team' | 'user' | 'company' | 'fibi';
976
+
977
+ label: string;
978
+
979
+ avatarUrl?: string;
980
+
981
+ color?: string;
982
+
983
+ website?: string;
984
+ }
985
+ }
861
986
  }
862
987
  }
863
988
  }
@@ -1018,6 +1143,16 @@ export namespace ReportDrillInParams {
1018
1143
  * Time bucket to drill into (a `date` value from the query time series).
1019
1144
  */
1020
1145
  timeBucket?: string;
1146
+
1147
+ /**
1148
+ * Granularity of `timeSegmentValue`; both fields must be sent together.
1149
+ */
1150
+ timeSegmentGranularity?: 'hour' | 'day' | 'week' | 'month';
1151
+
1152
+ /**
1153
+ * Time-segment bucket selected from a Segment-by-Time series.
1154
+ */
1155
+ timeSegmentValue?: string;
1021
1156
  }
1022
1157
 
1023
1158
  export interface Sort {
@@ -1065,6 +1200,12 @@ export interface ReportLookupFilterValuesParams {
1065
1200
  */
1066
1201
  limit?: number;
1067
1202
 
1203
+ /**
1204
+ * Body param: Opaque client context echoed by the response so stale lookup results
1205
+ * can be discarded safely.
1206
+ */
1207
+ lookupContextKey?: string;
1208
+
1068
1209
  /**
1069
1210
  * Body param
1070
1211
  */
@@ -1177,13 +1318,14 @@ export interface ReportQueryParams {
1177
1318
  segmentShowOther?: boolean;
1178
1319
 
1179
1320
  /**
1180
- * Body param: Keep only the top N `segmentBy` values per series, ranked by the
1181
- * selected metric over the full filtered primary range. Under a time View-by the
1182
- * ranked segment set is identical across every bucket; under a dimension View-by
1183
- * the ranking is applied within each retained parent group. Allowed values: `5`,
1184
- * `7`, `10`, `15`, `20`. Requires `segmentBy`.
1321
+ * Body param: Keep only the top N `segmentBy` values per series. Under a time
1322
+ * View-by, segments are ranked independently inside each time bucket and the
1323
+ * response series catalog contains the union of bucket winners. Under a dimension
1324
+ * View-by, ranking is applied within each retained parent group. Allowed range:
1325
+ * `1` to `100`; the editor offers common presets plus a Custom value. Requires
1326
+ * `segmentBy`.
1185
1327
  */
1186
- segmentTopValuesLimit?: 5 | 7 | 10 | 15 | 20;
1328
+ segmentTopValuesLimit?: number;
1187
1329
 
1188
1330
  /**
1189
1331
  * Body param: When `true`, append a single synthetic group with id `__other__` and
@@ -1202,12 +1344,11 @@ export interface ReportQueryParams {
1202
1344
 
1203
1345
  /**
1204
1346
  * Body param: Keep only the top N `groupBy` (View-by) values, ranked by the
1205
- * selected metric/aggregation over the full filtered primary range. Allowed
1206
- * values: `5`, `7`, `10`, `15`, `20`. The ranked set is stable across every time
1207
- * bucket, and a comparison period reuses the primary period's ranked set (never
1208
- * re-ranked). Requires `groupBy`.
1347
+ * selected metric/aggregation over the full filtered primary range. Allowed range:
1348
+ * `1` to `100`; the editor offers common presets plus a Custom value. A comparison
1349
+ * period reuses the primary period's ranked set. Requires `groupBy`.
1209
1350
  */
1210
- topValuesLimit?: 5 | 7 | 10 | 15 | 20;
1351
+ topValuesLimit?: number;
1211
1352
 
1212
1353
  /**
1213
1354
  * Body param: Result shape. `standard` returns a time series (plus grouped/segment
@@ -1546,6 +1546,12 @@ export interface ConversationAttributeValue {
1546
1546
  */
1547
1547
  options?: Array<ConversationAttributesAPI.ConversationAttributeOption>;
1548
1548
 
1549
+ /**
1550
+ * Whether teammates must set a value before closing a conversation from the Inbox.
1551
+ * Closes via the API, workflows, and Fibi are not blocked.
1552
+ */
1553
+ required?: boolean;
1554
+
1549
1555
  /**
1550
1556
  * The conversation-specific custom attribute value.
1551
1557
  */
@@ -2683,7 +2689,17 @@ export interface CsatEmailDelivery {
2683
2689
  /**
2684
2690
  * Email delivery status for the CSAT request when applicable
2685
2691
  */
2686
- status: 'pending' | 'sent' | 'failed';
2692
+ status: 'pending' | 'sending' | 'ambiguous' | 'retry_wait' | 'sent' | 'failed';
2693
+
2694
+ /**
2695
+ * Number of delivery attempts made for this CSAT email
2696
+ */
2697
+ attempts?: number;
2698
+
2699
+ /**
2700
+ * ISO timestamp when the current delivery attempt was durably claimed
2701
+ */
2702
+ claimedAt?: string;
2687
2703
 
2688
2704
  /**
2689
2705
  * ISO timestamp when the CSAT email failed
@@ -2695,11 +2711,21 @@ export interface CsatEmailDelivery {
2695
2711
  */
2696
2712
  failureReason?: string;
2697
2713
 
2714
+ /**
2715
+ * Stable provider-correlation key for this CSAT delivery
2716
+ */
2717
+ idempotencyKey?: string;
2718
+
2698
2719
  /**
2699
2720
  * Email message ID associated with delivery
2700
2721
  */
2701
2722
  messageId?: string;
2702
2723
 
2724
+ /**
2725
+ * ISO timestamp when a retry-waiting CSAT email may be attempted again
2726
+ */
2727
+ nextAttemptAt?: string;
2728
+
2703
2729
  /**
2704
2730
  * ISO timestamp when the CSAT email was sent
2705
2731
  */