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.
- {airbyte_source_iterable-0.4.0.dist-info → airbyte_source_iterable-0.5.1.dist-info}/METADATA +2 -2
- airbyte_source_iterable-0.5.1.dist-info/RECORD +31 -0
- source_iterable/components.py +41 -0
- source_iterable/manifest.yaml +440 -0
- source_iterable/schemas/campaigns.json +18 -0
- source_iterable/schemas/campaigns_metrics.json +1 -0
- source_iterable/schemas/channels.json +4 -0
- source_iterable/schemas/email_bounce.json +10 -0
- source_iterable/schemas/email_click.json +18 -0
- source_iterable/schemas/email_complaint.json +10 -0
- source_iterable/schemas/email_open.json +15 -0
- source_iterable/schemas/email_send.json +38 -0
- source_iterable/schemas/email_send_skip.json +38 -0
- source_iterable/schemas/email_subscribe.json +11 -0
- source_iterable/schemas/email_unsubscribe.json +15 -0
- source_iterable/schemas/events.json +8 -0
- source_iterable/schemas/list_users.json +2 -0
- source_iterable/schemas/lists.json +4 -0
- source_iterable/schemas/message_types.json +3 -0
- source_iterable/schemas/metadata.json +1 -0
- source_iterable/schemas/templates.json +8 -0
- source_iterable/schemas/users.json +132 -11
- source_iterable/source.py +54 -96
- source_iterable/spec.json +2 -3
- source_iterable/streams.py +0 -123
- source_iterable/utils.py +0 -7
- airbyte_source_iterable-0.4.0.dist-info/RECORD +0 -29
- {airbyte_source_iterable-0.4.0.dist-info → airbyte_source_iterable-0.5.1.dist-info}/WHEEL +0 -0
- {airbyte_source_iterable-0.4.0.dist-info → airbyte_source_iterable-0.5.1.dist-info}/entry_points.txt +0 -0
{airbyte_source_iterable-0.4.0.dist-info → airbyte_source_iterable-0.5.1.dist-info}/METADATA
RENAMED
@@ -1,6 +1,6 @@
|
|
1
1
|
Metadata-Version: 2.1
|
2
2
|
Name: airbyte-source-iterable
|
3
|
-
Version: 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 (
|
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,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
|
},
|