airbyte-source-iterable 0.4.0__py3-none-any.whl → 0.5.1__py3-none-any.whl

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 (29) hide show
  1. {airbyte_source_iterable-0.4.0.dist-info → airbyte_source_iterable-0.5.1.dist-info}/METADATA +2 -2
  2. airbyte_source_iterable-0.5.1.dist-info/RECORD +31 -0
  3. source_iterable/components.py +41 -0
  4. source_iterable/manifest.yaml +440 -0
  5. source_iterable/schemas/campaigns.json +18 -0
  6. source_iterable/schemas/campaigns_metrics.json +1 -0
  7. source_iterable/schemas/channels.json +4 -0
  8. source_iterable/schemas/email_bounce.json +10 -0
  9. source_iterable/schemas/email_click.json +18 -0
  10. source_iterable/schemas/email_complaint.json +10 -0
  11. source_iterable/schemas/email_open.json +15 -0
  12. source_iterable/schemas/email_send.json +38 -0
  13. source_iterable/schemas/email_send_skip.json +38 -0
  14. source_iterable/schemas/email_subscribe.json +11 -0
  15. source_iterable/schemas/email_unsubscribe.json +15 -0
  16. source_iterable/schemas/events.json +8 -0
  17. source_iterable/schemas/list_users.json +2 -0
  18. source_iterable/schemas/lists.json +4 -0
  19. source_iterable/schemas/message_types.json +3 -0
  20. source_iterable/schemas/metadata.json +1 -0
  21. source_iterable/schemas/templates.json +8 -0
  22. source_iterable/schemas/users.json +132 -11
  23. source_iterable/source.py +54 -96
  24. source_iterable/spec.json +2 -3
  25. source_iterable/streams.py +0 -123
  26. source_iterable/utils.py +0 -7
  27. airbyte_source_iterable-0.4.0.dist-info/RECORD +0 -29
  28. {airbyte_source_iterable-0.4.0.dist-info → airbyte_source_iterable-0.5.1.dist-info}/WHEEL +0 -0
  29. {airbyte_source_iterable-0.4.0.dist-info → airbyte_source_iterable-0.5.1.dist-info}/entry_points.txt +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: airbyte-source-iterable
3
- Version: 0.4.0
3
+ Version: 0.5.1
4
4
  Summary: Source implementation for Iterable.
5
5
  Home-page: https://airbyte.com
6
6
  License: MIT
@@ -12,7 +12,7 @@ Classifier: Programming Language :: Python :: 3
12
12
  Classifier: Programming Language :: Python :: 3.9
13
13
  Classifier: Programming Language :: Python :: 3.10
14
14
  Classifier: Programming Language :: Python :: 3.11
15
- Requires-Dist: airbyte-cdk (>=0,<1)
15
+ Requires-Dist: airbyte-cdk (==0.80.0)
16
16
  Requires-Dist: pendulum (==2.1.2)
17
17
  Requires-Dist: python-dateutil (==2.8.2)
18
18
  Requires-Dist: requests (==2.31.0)
@@ -0,0 +1,31 @@
1
+ source_iterable/__init__.py,sha256=8WKQT800ggxG1vGPoA_ZHUkozwEM7qMhGMhzEPCdA4o,65
2
+ source_iterable/components.py,sha256=dHp23THc43TmogP_tCxcv12mAgZSRs5fKir2ckr4hHI,1374
3
+ source_iterable/manifest.yaml,sha256=uO7z-bIU6CtGms6IsLwjyZ-cb3tVY-vLUMLOZGkZDts,13996
4
+ source_iterable/run.py,sha256=-Bvz772Z7iJWExDoJS7chxv725hG4e9e5Engrtp66iE,236
5
+ source_iterable/schemas/campaigns.json,sha256=FONoPuz_4aRat8OZzhj7BcHFAqetpBYUDmOZfroCu7I,2494
6
+ source_iterable/schemas/campaigns_metrics.json,sha256=Aa6pNdVxHOG-LSxlLzhxFY8uIdfrPBTgX9QyWrLJ4Fs,168
7
+ source_iterable/schemas/channels.json,sha256=hgH6VJRvv_cFhWt-oQvoCLD-aOy4QRb9uFKAnuiQj6w,605
8
+ source_iterable/schemas/email_bounce.json,sha256=6HKfaL06RNpedqxf7jHBC75dbpBfLx--7nWR3JiB7eg,1755
9
+ source_iterable/schemas/email_click.json,sha256=A0L6JH1Kfgnpj4Wa-50OyqHyGEWH9tfJvoFGrrCN42Y,2749
10
+ source_iterable/schemas/email_complaint.json,sha256=lM20rsQiIQ810zgG0zVKl34FyspUTfCp8b_aGPJp2rA,1704
11
+ source_iterable/schemas/email_open.json,sha256=efYIpHb6vShC_LalRT26-x8Kx_BSuaevzThnX9N_tNE,2257
12
+ source_iterable/schemas/email_send.json,sha256=UQ7ZYCdhn9A4tYpyHoMGy7JLIOF9VLz7Xgw-q6mg_Aw,5994
13
+ source_iterable/schemas/email_send_skip.json,sha256=Fl4p-QFMDEDDb2JjfkfEGkcsav1Ak7nqkVTCvVd7cKA,6124
14
+ source_iterable/schemas/email_subscribe.json,sha256=rLkVbvkd6v521zyDQzV7Ji7DVTGpzgbiXzMngQq55J8,1773
15
+ source_iterable/schemas/email_unsubscribe.json,sha256=KBPOA5dauT7Ldk-OoJQEVzDlJZRaKiDrVJPVbBaGAsU,2665
16
+ source_iterable/schemas/events.json,sha256=Pp5U47p4rIepPVq8vH4WLFJzqFnB1LovCK_c9HN-BtQ,1193
17
+ source_iterable/schemas/list_users.json,sha256=7XvNCMxgM6ViEY0rvBu31JgongagVy9ciRBkt5J94TE,307
18
+ source_iterable/schemas/lists.json,sha256=3DRUaV2vrQqSJ_uWIzTpAvrJTNNXaWU64yFw9INCuoQ,521
19
+ source_iterable/schemas/message_types.json,sha256=DmbunfoTVfBjF6UVpCKJi0KbIXV2Lk4sp2t2WlXtfc8,437
20
+ source_iterable/schemas/metadata.json,sha256=ioQcAKtObfsY-TonvGA75Q0BJwD7oBNgRAdD7O2PJvk,158
21
+ source_iterable/schemas/templates.json,sha256=TLKmKP0qS18umiGHuS1MZ2Wh_vvxF1XuMAIfKpbgFyU,1156
22
+ source_iterable/schemas/users.json,sha256=CHqA30cnsTXfI-M0n54NwVaaZEO12tt_IgQ9yPHNcXU,14569
23
+ source_iterable/slice_generators.py,sha256=neRuWD52Xnr84KvWQ0kjaErR44sOKjxIyLCNeofohzE,6482
24
+ source_iterable/source.py,sha256=AhZQ4L54VTo6jf2QltvFCqDNgqaPSEKCfR0GInCLEEc,4537
25
+ source_iterable/spec.json,sha256=y5_YFTkPPtxjvzGtaZZql90Tc37fyZZpQKXFGPL_cYE,1009
26
+ source_iterable/streams.py,sha256=ZEC8IqBrTeD2oYOvLL51E62iOsIOK3jiTN7pLI-CwRs,19468
27
+ source_iterable/utils.py,sha256=2oM8AjBZXs9nTG_PhSWmxBWEmp-w-tWFaxQQvAfUuMM,649
28
+ airbyte_source_iterable-0.5.1.dist-info/METADATA,sha256=uAZc_ji5dOSIM6JcTRA92z8cJek8fvxxieqBCy6nn0w,5352
29
+ airbyte_source_iterable-0.5.1.dist-info/WHEEL,sha256=sP946D7jFCHeNz5Iq4fL4Lu-PrWrFsgfLXbbkciIZwg,88
30
+ airbyte_source_iterable-0.5.1.dist-info/entry_points.txt,sha256=pjzrNtsOX3jW37IK0U5pSmLiraiuLTPr5aB5-hBXpAo,59
31
+ airbyte_source_iterable-0.5.1.dist-info/RECORD,,
@@ -0,0 +1,41 @@
1
+ #
2
+ # Copyright (c) 2023 Airbyte, Inc., all rights reserved.
3
+ #
4
+
5
+ import json
6
+ from dataclasses import dataclass
7
+ from io import StringIO
8
+
9
+ import requests
10
+ from airbyte_cdk.sources.declarative.extractors.dpath_extractor import DpathExtractor
11
+ from airbyte_cdk.sources.declarative.types import Config, Record, StreamSlice, StreamState
12
+
13
+
14
+ @dataclass
15
+ class XJsonRecordExtractor(DpathExtractor):
16
+ def extract_records(self, response: requests.Response) -> list[Record]:
17
+ return [json.loads(record) for record in response.iter_lines()]
18
+
19
+
20
+ @dataclass
21
+ class ListUsersRecordExtractor(DpathExtractor):
22
+ def extract_records(self, response: requests.Response) -> list[Record]:
23
+ return [{"email": record.decode()} for record in response.iter_lines()]
24
+
25
+
26
+ @dataclass
27
+ class EventsRecordExtractor(DpathExtractor):
28
+ common_fields = ("itblInternal", "_type", "createdAt", "email")
29
+
30
+ def extract_records(self, response: requests.Response) -> list[Record]:
31
+ jsonl_records = StringIO(response.text)
32
+ records = []
33
+ for record in jsonl_records:
34
+ record_dict = json.loads(record)
35
+ record_dict_common_fields = {}
36
+ for field in self.common_fields:
37
+ record_dict_common_fields[field] = record_dict.pop(field, None)
38
+
39
+ records.append({**record_dict_common_fields, "data": record_dict})
40
+
41
+ return records
@@ -0,0 +1,440 @@
1
+ spec:
2
+ type: Spec
3
+ connection_specification:
4
+ $schema: http://json-schema.org/draft-07/schema#
5
+ title: Iterable Spec
6
+ type: object
7
+ required:
8
+ - start_date
9
+ - api_key
10
+ additionalProperties: true
11
+ properties:
12
+ api_key:
13
+ type: "string"
14
+ title: "API Key"
15
+ description: >-
16
+ Iterable API Key. See the <a href=\"https://docs.airbyte.com/integrations/sources/iterable\">docs</a>
17
+ for more information on how to obtain this key.
18
+ airbyte_secret: true
19
+ order: 0
20
+ start_date:
21
+ type: "string"
22
+ title: "Start Date"
23
+ description: >-
24
+ The date from which you'd like to replicate data for Iterable, in the format YYYY-MM-DDT00:00:00Z.
25
+ All data generated after this date will be replicated.
26
+ examples: ["2021-04-01T00:00:00Z"]
27
+ pattern: ^[0-9]{4}-[0-9]{2}-[0-9]{2}T[0-9]{2}:[0-9]{2}:[0-9]{2}Z$
28
+ order: 1
29
+ format: "date-time"
30
+ type: DeclarativeSource
31
+ check:
32
+ type: CheckStream
33
+ stream_names:
34
+ - lists
35
+ streams:
36
+ - name: lists
37
+ type: DeclarativeStream
38
+ retriever:
39
+ type: SimpleRetriever
40
+ paginator:
41
+ type: NoPagination
42
+ requester:
43
+ path: lists
44
+ type: HttpRequester
45
+ url_base: https://api.iterable.com/api/
46
+ http_method: GET
47
+ authenticator:
48
+ type: ApiKeyAuthenticator
49
+ api_token: "{{ config['api_key'] }}"
50
+ inject_into:
51
+ type: RequestOption
52
+ field_name: Api-Key
53
+ inject_into: header
54
+ request_headers: {}
55
+ request_body_json: {}
56
+ request_parameters: {}
57
+ record_selector:
58
+ type: RecordSelector
59
+ extractor:
60
+ type: DpathExtractor
61
+ field_path:
62
+ - lists
63
+ partition_router: []
64
+ primary_key:
65
+ - id
66
+ - name: list_users
67
+ type: DeclarativeStream
68
+ retriever:
69
+ type: SimpleRetriever
70
+ paginator:
71
+ type: NoPagination
72
+ requester:
73
+ path: lists/getUsers
74
+ type: HttpRequester
75
+ url_base: https://api.iterable.com/api/
76
+ http_method: GET
77
+ authenticator:
78
+ type: ApiKeyAuthenticator
79
+ api_token: "{{ config['api_key'] }}"
80
+ inject_into:
81
+ type: RequestOption
82
+ field_name: Api-Key
83
+ inject_into: header
84
+ request_headers: {}
85
+ request_body_json: {}
86
+ request_parameters: {}
87
+ record_selector:
88
+ type: RecordSelector
89
+ extractor:
90
+ class_name: source_iterable.components.ListUsersRecordExtractor
91
+ field_path:
92
+ - getUsers
93
+ partition_router:
94
+ - type: SubstreamPartitionRouter
95
+ parent_stream_configs:
96
+ - type: ParentStreamConfig
97
+ parent_key: id
98
+ request_option:
99
+ inject_into: request_parameter
100
+ type: RequestOption
101
+ field_name: listId
102
+ partition_field: list_id
103
+ stream:
104
+ type: DeclarativeStream
105
+ name: lists
106
+ primary_key:
107
+ - id
108
+ retriever:
109
+ type: SimpleRetriever
110
+ requester:
111
+ type: HttpRequester
112
+ url_base: https://api.iterable.com/api/
113
+ path: lists
114
+ http_method: GET
115
+ request_parameters: {}
116
+ request_headers: {}
117
+ authenticator:
118
+ type: ApiKeyAuthenticator
119
+ api_token: "{{ config['api_key'] }}"
120
+ inject_into:
121
+ type: RequestOption
122
+ field_name: Api-Key
123
+ inject_into: header
124
+ request_body_json: {}
125
+ record_selector:
126
+ type: RecordSelector
127
+ extractor:
128
+ type: DpathExtractor
129
+ field_path:
130
+ - lists
131
+ paginator:
132
+ type: NoPagination
133
+ partition_router: []
134
+ primary_key:
135
+ - listId
136
+ transformations:
137
+ - type: AddFields
138
+ fields:
139
+ - path:
140
+ - listId
141
+ value: "{{ stream_slice.list_id }}"
142
+ - name: campaigns
143
+ type: DeclarativeStream
144
+ retriever:
145
+ type: SimpleRetriever
146
+ paginator:
147
+ type: NoPagination
148
+ requester:
149
+ path: campaigns
150
+ type: HttpRequester
151
+ url_base: https://api.iterable.com/api/
152
+ http_method: GET
153
+ authenticator:
154
+ type: ApiKeyAuthenticator
155
+ api_token: "{{ config['api_key'] }}"
156
+ inject_into:
157
+ type: RequestOption
158
+ field_name: Api-Key
159
+ inject_into: header
160
+ request_headers: {}
161
+ request_body_json: {}
162
+ request_parameters: {}
163
+ record_selector:
164
+ type: RecordSelector
165
+ extractor:
166
+ type: DpathExtractor
167
+ field_path:
168
+ - campaigns
169
+ partition_router: []
170
+ primary_key:
171
+ - id
172
+ - name: channels
173
+ type: DeclarativeStream
174
+ retriever:
175
+ type: SimpleRetriever
176
+ paginator:
177
+ type: NoPagination
178
+ requester:
179
+ path: channels
180
+ type: HttpRequester
181
+ url_base: https://api.iterable.com/api/
182
+ http_method: GET
183
+ authenticator:
184
+ type: ApiKeyAuthenticator
185
+ api_token: "{{ config['api_key'] }}"
186
+ inject_into:
187
+ type: RequestOption
188
+ field_name: Api-Key
189
+ inject_into: header
190
+ request_headers: {}
191
+ request_body_json: {}
192
+ request_parameters: {}
193
+ record_selector:
194
+ type: RecordSelector
195
+ extractor:
196
+ type: DpathExtractor
197
+ field_path:
198
+ - channels
199
+ partition_router: []
200
+ primary_key:
201
+ - id
202
+ - name: message_types
203
+ type: DeclarativeStream
204
+ retriever:
205
+ type: SimpleRetriever
206
+ paginator:
207
+ type: NoPagination
208
+ requester:
209
+ path: messageTypes
210
+ type: HttpRequester
211
+ url_base: https://api.iterable.com/api/
212
+ http_method: GET
213
+ authenticator:
214
+ type: ApiKeyAuthenticator
215
+ api_token: "{{ config['api_key'] }}"
216
+ inject_into:
217
+ type: RequestOption
218
+ field_name: Api-Key
219
+ inject_into: header
220
+ request_headers: {}
221
+ request_body_json: {}
222
+ request_parameters: {}
223
+ record_selector:
224
+ type: RecordSelector
225
+ extractor:
226
+ type: DpathExtractor
227
+ field_path:
228
+ - messageTypes
229
+ partition_router: []
230
+ primary_key:
231
+ - id
232
+ - name: metadata
233
+ type: DeclarativeStream
234
+ retriever:
235
+ type: SimpleRetriever
236
+ paginator:
237
+ type: NoPagination
238
+ requester:
239
+ path: metadata
240
+ type: HttpRequester
241
+ url_base: https://api.iterable.com/api/
242
+ http_method: GET
243
+ authenticator:
244
+ type: ApiKeyAuthenticator
245
+ api_token: "{{ config['api_key'] }}"
246
+ inject_into:
247
+ type: RequestOption
248
+ field_name: Api-Key
249
+ inject_into: header
250
+ request_headers: {}
251
+ request_body_json: {}
252
+ request_parameters: {}
253
+ record_selector:
254
+ type: RecordSelector
255
+ extractor:
256
+ type: DpathExtractor
257
+ field_path:
258
+ - results
259
+ partition_router: []
260
+ primary_key: []
261
+ - name: users
262
+ type: DeclarativeStream
263
+ retriever:
264
+ type: SimpleRetriever
265
+ paginator:
266
+ type: NoPagination
267
+ requester:
268
+ path: export/data.json
269
+ type: HttpRequester
270
+ url_base: https://api.iterable.com/api/
271
+ http_method: GET
272
+ authenticator:
273
+ type: ApiKeyAuthenticator
274
+ api_token: "{{ config['api_key'] }}"
275
+ inject_into:
276
+ type: RequestOption
277
+ field_name: Api-Key
278
+ inject_into: header
279
+ request_headers: {}
280
+ request_body_json: {}
281
+ request_parameters:
282
+ stream: "True"
283
+ dataTypeName: user
284
+ record_selector:
285
+ type: RecordSelector
286
+ extractor:
287
+ class_name: source_iterable.components.XJsonRecordExtractor
288
+ field_path:
289
+ - users
290
+ partition_router: []
291
+ primary_key: []
292
+ incremental_sync:
293
+ step: P90D
294
+ type: DatetimeBasedCursor
295
+ cursor_field: profileUpdatedAt
296
+ end_datetime:
297
+ type: MinMaxDatetime
298
+ datetime: "{{ config['end_date'] if config['end_date'] else now_utc().strftime('%Y-%m-%dT%H:%M:%SZ') }}"
299
+ datetime_format: "%Y-%m-%dT%H:%M:%SZ"
300
+ start_datetime:
301
+ type: MinMaxDatetime
302
+ datetime: "{{ config['start_date'] }}"
303
+ datetime_format: "%Y-%m-%dT%H:%M:%SZ"
304
+ datetime_format: "%Y-%m-%d %H:%M:%S"
305
+ end_time_option:
306
+ type: RequestOption
307
+ field_name: endDateTime
308
+ inject_into: request_parameter
309
+ start_time_option:
310
+ type: RequestOption
311
+ field_name: startDateTime
312
+ inject_into: request_parameter
313
+ cursor_granularity: PT1S
314
+ cursor_datetime_formats:
315
+ - "%Y-%m-%d %H:%M:%S %z"
316
+ - "%Y-%m-%dT%H:%M:%S%z"
317
+ - name: events
318
+ primary_key: []
319
+ retriever:
320
+ type: SimpleRetriever
321
+ requester:
322
+ type: HttpRequester
323
+ url_base: https://api.iterable.com/api/
324
+ path: export/userEvents
325
+ http_method: GET
326
+ request_parameters:
327
+ includeCustomEvents: "true"
328
+ request_headers: {}
329
+ authenticator:
330
+ type: ApiKeyAuthenticator
331
+ api_token: "{{ config['api_key'] }}"
332
+ inject_into:
333
+ type: RequestOption
334
+ field_name: Api-Key
335
+ inject_into: header
336
+ request_body_json: {}
337
+ record_selector:
338
+ type: RecordSelector
339
+ extractor:
340
+ class_name: source_iterable.components.EventsRecordExtractor
341
+ field_path:
342
+ - events
343
+ paginator:
344
+ type: NoPagination
345
+ partition_router:
346
+ - type: SubstreamPartitionRouter
347
+ parent_stream_configs:
348
+ - type: ParentStreamConfig
349
+ parent_key: email
350
+ request_option:
351
+ inject_into: request_parameter
352
+ type: RequestOption
353
+ field_name: email
354
+ partition_field: email
355
+ stream:
356
+ name: list_users
357
+ type: DeclarativeStream
358
+ retriever:
359
+ type: SimpleRetriever
360
+ paginator:
361
+ type: NoPagination
362
+ requester:
363
+ path: lists/getUsers
364
+ type: HttpRequester
365
+ url_base: https://api.iterable.com/api/
366
+ http_method: GET
367
+ authenticator:
368
+ type: ApiKeyAuthenticator
369
+ api_token: "{{ config['api_key'] }}"
370
+ inject_into:
371
+ type: RequestOption
372
+ field_name: Api-Key
373
+ inject_into: header
374
+ request_headers: {}
375
+ request_body_json: {}
376
+ request_parameters: {}
377
+ record_selector:
378
+ type: RecordSelector
379
+ extractor:
380
+ class_name: source_iterable.components.ListUsersRecordExtractor
381
+ field_path:
382
+ - getUsers
383
+ partition_router:
384
+ - type: SubstreamPartitionRouter
385
+ parent_stream_configs:
386
+ - type: ParentStreamConfig
387
+ parent_key: id
388
+ request_option:
389
+ inject_into: request_parameter
390
+ type: RequestOption
391
+ field_name: listId
392
+ partition_field: list_id
393
+ stream:
394
+ type: DeclarativeStream
395
+ name: lists
396
+ primary_key:
397
+ - id
398
+ retriever:
399
+ type: SimpleRetriever
400
+ requester:
401
+ type: HttpRequester
402
+ url_base: https://api.iterable.com/api/
403
+ path: lists
404
+ http_method: GET
405
+ request_parameters: {}
406
+ request_headers: {}
407
+ authenticator:
408
+ type: ApiKeyAuthenticator
409
+ api_token: "{{ config['api_key'] }}"
410
+ inject_into:
411
+ type: RequestOption
412
+ field_name: Api-Key
413
+ inject_into: header
414
+ request_body_json: {}
415
+ record_selector:
416
+ type: RecordSelector
417
+ extractor:
418
+ type: DpathExtractor
419
+ field_path:
420
+ - lists
421
+ paginator:
422
+ type: NoPagination
423
+ partition_router: []
424
+ primary_key:
425
+ - id
426
+ transformations:
427
+ - type: AddFields
428
+ fields:
429
+ - path:
430
+ - list_id
431
+ value: "{{ stream_slice.list_id }}"
432
+ version: 0.65.0
433
+ metadata:
434
+ autoImportSchema:
435
+ users: false
436
+ lists: false
437
+ channels: false
438
+ metadata: false
439
+ campaigns: false
440
+ message_types: false
@@ -1,60 +1,78 @@
1
1
  {
2
2
  "properties": {
3
3
  "id": {
4
+ "description": "The unique identifier of the campaign",
4
5
  "type": ["null", "integer"]
5
6
  },
6
7
  "createdAt": {
8
+ "description": "The timestamp when the campaign was created",
7
9
  "type": ["null", "integer"]
8
10
  },
9
11
  "updatedAt": {
12
+ "description": "The timestamp when the campaign was last updated",
10
13
  "type": ["null", "integer"]
11
14
  },
12
15
  "startAt": {
16
+ "description": "The timestamp when the campaign will start",
13
17
  "type": ["null", "integer"]
14
18
  },
15
19
  "endedAt": {
20
+ "description": "The timestamp when the campaign ended",
16
21
  "type": ["null", "integer"]
17
22
  },
18
23
  "name": {
24
+ "description": "The name of the campaign",
19
25
  "type": ["null", "string"]
20
26
  },
21
27
  "templateId": {
28
+ "description": "The ID of the template used for the campaign",
22
29
  "type": ["null", "integer"]
23
30
  },
24
31
  "messageMedium": {
32
+ "description": "The medium used to deliver the campaign message (e.g., email, SMS)",
25
33
  "type": ["null", "string"]
26
34
  },
27
35
  "createdByUserId": {
36
+ "description": "The ID of the user who created the campaign",
28
37
  "type": ["null", "string"]
29
38
  },
30
39
  "updatedByUserId": {
40
+ "description": "The ID of the user who last updated the campaign",
31
41
  "type": ["null", "string"]
32
42
  },
33
43
  "campaignState": {
44
+ "description": "The current state of the campaign (e.g., draft, active, paused)",
34
45
  "type": ["null", "string"]
35
46
  },
36
47
  "listIds": {
48
+ "description": "List of IDs of the lists targeted by the campaign",
37
49
  "type": ["null", "array"],
38
50
  "items": {}
39
51
  },
40
52
  "suppressionListIds": {
53
+ "description": "List of IDs of suppression lists for the campaign",
41
54
  "type": ["null", "array"],
42
55
  "items": {}
43
56
  },
44
57
  "sendSize": {
58
+ "description": "The size of the audience targeted by the campaign",
45
59
  "type": ["null", "number"]
46
60
  },
47
61
  "recurringCampaignId": {
62
+ "description": "If the campaign is recurring, the ID of the parent recurring campaign",
48
63
  "type": ["null", "number"]
49
64
  },
50
65
  "workflowId": {
66
+ "description": "The ID of the workflow associated with the campaign",
51
67
  "type": ["null", "number"]
52
68
  },
53
69
  "labels": {
70
+ "description": "List of labels associated with the campaign",
54
71
  "type": ["null", "array"],
55
72
  "items": {}
56
73
  },
57
74
  "type": {
75
+ "description": "The type of campaign (e.g., one-time, recurring)",
58
76
  "type": ["null", "string"]
59
77
  }
60
78
  },
@@ -1,6 +1,7 @@
1
1
  {
2
2
  "properties": {
3
3
  "data": {
4
+ "description": "Contains the campaign metrics data",
4
5
  "type": ["null", "object"]
5
6
  }
6
7
  },
@@ -1,15 +1,19 @@
1
1
  {
2
2
  "properties": {
3
3
  "id": {
4
+ "description": "The unique identifier of the channel.",
4
5
  "type": ["null", "number"]
5
6
  },
6
7
  "name": {
8
+ "description": "The name or title of the channel.",
7
9
  "type": ["null", "string"]
8
10
  },
9
11
  "channelType": {
12
+ "description": "The type of channel, such as email, SMS, or push notification.",
10
13
  "type": ["null", "string"]
11
14
  },
12
15
  "messageMedium": {
16
+ "description": "The medium used to deliver messages through this channel, such as text, image, or video.",
13
17
  "type": ["null", "string"]
14
18
  }
15
19
  },
@@ -1,38 +1,48 @@
1
1
  {
2
2
  "properties": {
3
3
  "createdAt": {
4
+ "description": "The date and time when the email bounce data was created.",
4
5
  "type": ["null", "string"],
5
6
  "format": "date-time"
6
7
  },
7
8
  "campaignId": {
9
+ "description": "The unique identifier of the campaign associated with the email bounce data.",
8
10
  "type": ["null", "integer"]
9
11
  },
10
12
  "itblInternal": {
13
+ "description": "Internal information related to Iterable.",
11
14
  "type": ["null", "object"],
12
15
  "properties": {
13
16
  "documentCreatedAt": {
17
+ "description": "The date and time when the internal document for Iterable was created.",
14
18
  "type": ["null", "string"],
15
19
  "format": "date-time"
16
20
  },
17
21
  "documentUpdatedAt": {
22
+ "description": "The date and time when the internal document for Iterable was last updated.",
18
23
  "type": ["null", "string"],
19
24
  "format": "date-time"
20
25
  }
21
26
  }
22
27
  },
23
28
  "messageId": {
29
+ "description": "The unique identifier of the message associated with the email bounce data.",
24
30
  "type": ["null", "string"]
25
31
  },
26
32
  "templateId": {
33
+ "description": "The unique identifier of the email template associated with the bounce data.",
27
34
  "type": ["null", "integer"]
28
35
  },
29
36
  "email": {
37
+ "description": "The email address that encountered a bounce.",
30
38
  "type": ["null", "string"]
31
39
  },
32
40
  "userId": {
41
+ "description": "The unique identifier of the user associated with the bounced email address.",
33
42
  "type": ["null", "string"]
34
43
  },
35
44
  "recipientState": {
45
+ "description": "The state of the recipient email address at the time of the bounce (e.g., active, inactive).",
36
46
  "type": ["null", "string"]
37
47
  }
38
48
  },