ttd-data 0.2.7__tar.gz → 0.3.0__tar.gz
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.
- {ttd_data-0.2.7/src/ttd_data.egg-info → ttd_data-0.3.0}/PKG-INFO +170 -172
- {ttd_data-0.2.7 → ttd_data-0.3.0}/README-PYPI.md +169 -171
- {ttd_data-0.2.7 → ttd_data-0.3.0}/README.md +169 -171
- {ttd_data-0.2.7 → ttd_data-0.3.0}/pyproject.toml +1 -1
- {ttd_data-0.2.7 → ttd_data-0.3.0}/src/ttd_data/_version.py +2 -2
- {ttd_data-0.2.7 → ttd_data-0.3.0}/src/ttd_data/advertiser.py +31 -34
- {ttd_data-0.2.7 → ttd_data-0.3.0}/src/ttd_data/basesdk.py +2 -2
- {ttd_data-0.2.7 → ttd_data-0.3.0}/src/ttd_data/client.py +23 -1
- {ttd_data-0.2.7 → ttd_data-0.3.0}/src/ttd_data/deletionoptout.py +77 -88
- {ttd_data-0.2.7 → ttd_data-0.3.0}/src/ttd_data/ipaddress.py +45 -52
- {ttd_data-0.2.7 → ttd_data-0.3.0}/src/ttd_data/models/__init__.py +5 -48
- {ttd_data-0.2.7 → ttd_data-0.3.0}/src/ttd_data/models/advertiserdataresponseerrorcode.py +1 -0
- {ttd_data-0.2.7 → ttd_data-0.3.0}/src/ttd_data/models/datasubjectrequestadvertiserdataop.py +0 -22
- {ttd_data-0.2.7 → ttd_data-0.3.0}/src/ttd_data/models/datasubjectrequestmerchantdataop.py +0 -22
- {ttd_data-0.2.7 → ttd_data-0.3.0}/src/ttd_data/models/datasubjectrequestthirdpartydataop.py +0 -22
- {ttd_data-0.2.7 → ttd_data-0.3.0}/src/ttd_data/models/ingestadvertiserdataop.py +0 -22
- {ttd_data-0.2.7 → ttd_data-0.3.0}/src/ttd_data/models/ingestfirstpartyipaddressdataop.py +0 -22
- {ttd_data-0.2.7 → ttd_data-0.3.0}/src/ttd_data/models/ingestofflineconversiondataop.py +0 -25
- {ttd_data-0.2.7 → ttd_data-0.3.0}/src/ttd_data/models/ingestthirdpartydataop.py +0 -22
- {ttd_data-0.2.7 → ttd_data-0.3.0}/src/ttd_data/models/ingestthirdpartyipaddressdataop.py +0 -22
- {ttd_data-0.2.7 → ttd_data-0.3.0}/src/ttd_data/models/ipaddressdataresponseerrorcode.py +1 -0
- ttd_data-0.3.0/src/ttd_data/models/security.py +43 -0
- {ttd_data-0.2.7 → ttd_data-0.3.0}/src/ttd_data/models/thirdpartydataresponseerrorcode.py +1 -0
- {ttd_data-0.2.7 → ttd_data-0.3.0}/src/ttd_data/offlineconversion.py +35 -38
- {ttd_data-0.2.7 → ttd_data-0.3.0}/src/ttd_data/sdk.py +14 -1
- {ttd_data-0.2.7 → ttd_data-0.3.0}/src/ttd_data/sdkconfiguration.py +3 -1
- {ttd_data-0.2.7 → ttd_data-0.3.0}/src/ttd_data/thirdparty.py +31 -34
- {ttd_data-0.2.7 → ttd_data-0.3.0}/src/ttd_data/utils/__init__.py +4 -1
- {ttd_data-0.2.7 → ttd_data-0.3.0}/src/ttd_data/utils/security.py +17 -0
- {ttd_data-0.2.7 → ttd_data-0.3.0/src/ttd_data.egg-info}/PKG-INFO +170 -172
- {ttd_data-0.2.7 → ttd_data-0.3.0}/src/ttd_data.egg-info/SOURCES.txt +1 -0
- {ttd_data-0.2.7 → ttd_data-0.3.0}/LICENSE +0 -0
- {ttd_data-0.2.7 → ttd_data-0.3.0}/NOTICES.txt +0 -0
- {ttd_data-0.2.7 → ttd_data-0.3.0}/setup.cfg +0 -0
- {ttd_data-0.2.7 → ttd_data-0.3.0}/src/ttd_data/__init__.py +0 -0
- {ttd_data-0.2.7 → ttd_data-0.3.0}/src/ttd_data/_hooks/__init__.py +0 -0
- {ttd_data-0.2.7 → ttd_data-0.3.0}/src/ttd_data/_hooks/data_origins_hook.py +0 -0
- {ttd_data-0.2.7 → ttd_data-0.3.0}/src/ttd_data/_hooks/plain_text_error_normalizer.py +0 -0
- {ttd_data-0.2.7 → ttd_data-0.3.0}/src/ttd_data/_hooks/registration.py +0 -0
- {ttd_data-0.2.7 → ttd_data-0.3.0}/src/ttd_data/_hooks/sdkhooks.py +0 -0
- {ttd_data-0.2.7 → ttd_data-0.3.0}/src/ttd_data/_hooks/types.py +0 -0
- {ttd_data-0.2.7 → ttd_data-0.3.0}/src/ttd_data/errors/__init__.py +0 -0
- {ttd_data-0.2.7 → ttd_data-0.3.0}/src/ttd_data/errors/advertiserdataserverresponse_error.py +0 -0
- {ttd_data-0.2.7 → ttd_data-0.3.0}/src/ttd_data/errors/advertiserdsrresponse_error.py +0 -0
- {ttd_data-0.2.7 → ttd_data-0.3.0}/src/ttd_data/errors/apierror.py +0 -0
- {ttd_data-0.2.7 → ttd_data-0.3.0}/src/ttd_data/errors/dataerror.py +0 -0
- {ttd_data-0.2.7 → ttd_data-0.3.0}/src/ttd_data/errors/ipaddressdataserverresponse_error.py +0 -0
- {ttd_data-0.2.7 → ttd_data-0.3.0}/src/ttd_data/errors/merchantdsrresponse_error.py +0 -0
- {ttd_data-0.2.7 → ttd_data-0.3.0}/src/ttd_data/errors/no_response_error.py +0 -0
- {ttd_data-0.2.7 → ttd_data-0.3.0}/src/ttd_data/errors/offlineconversiondataserverresponse_error.py +0 -0
- {ttd_data-0.2.7 → ttd_data-0.3.0}/src/ttd_data/errors/responsevalidationerror.py +0 -0
- {ttd_data-0.2.7 → ttd_data-0.3.0}/src/ttd_data/errors/thirdpartydataserverresponse_error.py +0 -0
- {ttd_data-0.2.7 → ttd_data-0.3.0}/src/ttd_data/errors/thirdpartydsrresponse_error.py +0 -0
- {ttd_data-0.2.7 → ttd_data-0.3.0}/src/ttd_data/errors/ttddataerror.py +0 -0
- {ttd_data-0.2.7 → ttd_data-0.3.0}/src/ttd_data/errors/uid2serviceerror.py +0 -0
- {ttd_data-0.2.7 → ttd_data-0.3.0}/src/ttd_data/httpclient.py +0 -0
- {ttd_data-0.2.7 → ttd_data-0.3.0}/src/ttd_data/models/advertiserdata.py +0 -0
- {ttd_data-0.2.7 → ttd_data-0.3.0}/src/ttd_data/models/advertiserdatarequest.py +0 -0
- {ttd_data-0.2.7 → ttd_data-0.3.0}/src/ttd_data/models/advertiserdataserverresponse.py +0 -0
- {ttd_data-0.2.7 → ttd_data-0.3.0}/src/ttd_data/models/advertiserdataserverresponseline.py +0 -0
- {ttd_data-0.2.7 → ttd_data-0.3.0}/src/ttd_data/models/advertiserdsrfailedline.py +0 -0
- {ttd_data-0.2.7 → ttd_data-0.3.0}/src/ttd_data/models/advertiserdsrrequest.py +0 -0
- {ttd_data-0.2.7 → ttd_data-0.3.0}/src/ttd_data/models/advertiserdsrresponse.py +0 -0
- {ttd_data-0.2.7 → ttd_data-0.3.0}/src/ttd_data/models/baseadvertiserdataitem.py +0 -0
- {ttd_data-0.2.7 → ttd_data-0.3.0}/src/ttd_data/models/baseofflineconversiondataitem.py +0 -0
- {ttd_data-0.2.7 → ttd_data-0.3.0}/src/ttd_data/models/basepartnerdsrdataitem.py +0 -0
- {ttd_data-0.2.7 → ttd_data-0.3.0}/src/ttd_data/models/basethirdpartydataitem.py +0 -0
- {ttd_data-0.2.7 → ttd_data-0.3.0}/src/ttd_data/models/dataorigin.py +0 -0
- {ttd_data-0.2.7 → ttd_data-0.3.0}/src/ttd_data/models/dataorigintype.py +0 -0
- {ttd_data-0.2.7 → ttd_data-0.3.0}/src/ttd_data/models/dsrerrorcode.py +0 -0
- {ttd_data-0.2.7 → ttd_data-0.3.0}/src/ttd_data/models/expandedipaddress.py +0 -0
- {ttd_data-0.2.7 → ttd_data-0.3.0}/src/ttd_data/models/httpmetadata.py +0 -0
- {ttd_data-0.2.7 → ttd_data-0.3.0}/src/ttd_data/models/ipaddressdata.py +0 -0
- {ttd_data-0.2.7 → ttd_data-0.3.0}/src/ttd_data/models/ipaddressdataitem.py +0 -0
- {ttd_data-0.2.7 → ttd_data-0.3.0}/src/ttd_data/models/ipaddressdatarequest.py +0 -0
- {ttd_data-0.2.7 → ttd_data-0.3.0}/src/ttd_data/models/ipaddressdataserverresponse.py +0 -0
- {ttd_data-0.2.7 → ttd_data-0.3.0}/src/ttd_data/models/ipaddressdataserverresponseline.py +0 -0
- {ttd_data-0.2.7 → ttd_data-0.3.0}/src/ttd_data/models/merchantdsrfailedline.py +0 -0
- {ttd_data-0.2.7 → ttd_data-0.3.0}/src/ttd_data/models/merchantdsrrequest.py +0 -0
- {ttd_data-0.2.7 → ttd_data-0.3.0}/src/ttd_data/models/merchantdsrresponse.py +0 -0
- {ttd_data-0.2.7 → ttd_data-0.3.0}/src/ttd_data/models/offlineconversiondatarequest.py +0 -0
- {ttd_data-0.2.7 → ttd_data-0.3.0}/src/ttd_data/models/offlineconversiondataresponseerrorcode.py +0 -0
- {ttd_data-0.2.7 → ttd_data-0.3.0}/src/ttd_data/models/offlineconversiondataserverresponse.py +0 -0
- {ttd_data-0.2.7 → ttd_data-0.3.0}/src/ttd_data/models/offlineconversiondataserverresponseline.py +0 -0
- {ttd_data-0.2.7 → ttd_data-0.3.0}/src/ttd_data/models/partnerdsrrequesttype.py +0 -0
- {ttd_data-0.2.7 → ttd_data-0.3.0}/src/ttd_data/models/realtimeconversioneventlineitem.py +0 -0
- {ttd_data-0.2.7 → ttd_data-0.3.0}/src/ttd_data/models/realtimeconversioneventsprivacysetting.py +0 -0
- {ttd_data-0.2.7 → ttd_data-0.3.0}/src/ttd_data/models/thirdpartydata.py +0 -0
- {ttd_data-0.2.7 → ttd_data-0.3.0}/src/ttd_data/models/thirdpartydatarequest.py +0 -0
- {ttd_data-0.2.7 → ttd_data-0.3.0}/src/ttd_data/models/thirdpartydataserverresponse.py +0 -0
- {ttd_data-0.2.7 → ttd_data-0.3.0}/src/ttd_data/models/thirdpartydataserverresponseline.py +0 -0
- {ttd_data-0.2.7 → ttd_data-0.3.0}/src/ttd_data/models/thirdpartydsrfailedline.py +0 -0
- {ttd_data-0.2.7 → ttd_data-0.3.0}/src/ttd_data/models/thirdpartydsrrequest.py +0 -0
- {ttd_data-0.2.7 → ttd_data-0.3.0}/src/ttd_data/models/thirdpartydsrresponse.py +0 -0
- {ttd_data-0.2.7 → ttd_data-0.3.0}/src/ttd_data/py.typed +0 -0
- {ttd_data-0.2.7 → ttd_data-0.3.0}/src/ttd_data/types/__init__.py +0 -0
- {ttd_data-0.2.7 → ttd_data-0.3.0}/src/ttd_data/types/base64fileinput.py +0 -0
- {ttd_data-0.2.7 → ttd_data-0.3.0}/src/ttd_data/types/basemodel.py +0 -0
- {ttd_data-0.2.7 → ttd_data-0.3.0}/src/ttd_data/uid2/__init__.py +0 -0
- {ttd_data-0.2.7 → ttd_data-0.3.0}/src/ttd_data/uid2/config.py +0 -0
- {ttd_data-0.2.7 → ttd_data-0.3.0}/src/ttd_data/uid2/models.py +0 -0
- {ttd_data-0.2.7 → ttd_data-0.3.0}/src/ttd_data/uid2/resolver.py +0 -0
- {ttd_data-0.2.7 → ttd_data-0.3.0}/src/ttd_data/utils/annotations.py +0 -0
- {ttd_data-0.2.7 → ttd_data-0.3.0}/src/ttd_data/utils/datetimes.py +0 -0
- {ttd_data-0.2.7 → ttd_data-0.3.0}/src/ttd_data/utils/dynamic_imports.py +0 -0
- {ttd_data-0.2.7 → ttd_data-0.3.0}/src/ttd_data/utils/enums.py +0 -0
- {ttd_data-0.2.7 → ttd_data-0.3.0}/src/ttd_data/utils/eventstreaming.py +0 -0
- {ttd_data-0.2.7 → ttd_data-0.3.0}/src/ttd_data/utils/forms.py +0 -0
- {ttd_data-0.2.7 → ttd_data-0.3.0}/src/ttd_data/utils/headers.py +0 -0
- {ttd_data-0.2.7 → ttd_data-0.3.0}/src/ttd_data/utils/logger.py +0 -0
- {ttd_data-0.2.7 → ttd_data-0.3.0}/src/ttd_data/utils/metadata.py +0 -0
- {ttd_data-0.2.7 → ttd_data-0.3.0}/src/ttd_data/utils/queryparams.py +0 -0
- {ttd_data-0.2.7 → ttd_data-0.3.0}/src/ttd_data/utils/requestbodies.py +0 -0
- {ttd_data-0.2.7 → ttd_data-0.3.0}/src/ttd_data/utils/retries.py +0 -0
- {ttd_data-0.2.7 → ttd_data-0.3.0}/src/ttd_data/utils/serializers.py +0 -0
- {ttd_data-0.2.7 → ttd_data-0.3.0}/src/ttd_data/utils/unmarshal_json_response.py +0 -0
- {ttd_data-0.2.7 → ttd_data-0.3.0}/src/ttd_data/utils/url.py +0 -0
- {ttd_data-0.2.7 → ttd_data-0.3.0}/src/ttd_data/utils/values.py +0 -0
- {ttd_data-0.2.7 → ttd_data-0.3.0}/src/ttd_data.egg-info/dependency_links.txt +0 -0
- {ttd_data-0.2.7 → ttd_data-0.3.0}/src/ttd_data.egg-info/requires.txt +0 -0
- {ttd_data-0.2.7 → ttd_data-0.3.0}/src/ttd_data.egg-info/top_level.txt +0 -0
- {ttd_data-0.2.7 → ttd_data-0.3.0}/src/ttd_data_python/_hooks/registration.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: ttd-data
|
|
3
|
-
Version: 0.
|
|
3
|
+
Version: 0.3.0
|
|
4
4
|
Summary: Python Client SDK for TTD Data API.
|
|
5
5
|
Author: Speakeasy
|
|
6
6
|
License: map[name:Apache License 2.0 shortName:Apache-2.0 url:https://www.apache.org/licenses/LICENSE-2.0]
|
|
@@ -144,19 +144,18 @@ Generally, the SDK will work well with most IDEs out of the box. However, when u
|
|
|
144
144
|
```python
|
|
145
145
|
from ttd_data import DataClient, models
|
|
146
146
|
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
)
|
|
147
|
+
client = DataClient(ttd_auth=TTD_AUTH_TOKEN)
|
|
148
|
+
response = client.advertiser.ingest_advertiser_data(
|
|
149
|
+
advertiser_id=ADVERTISER_ID,
|
|
150
|
+
items=[
|
|
151
|
+
models.AdvertiserDataItem(
|
|
152
|
+
tdid="<TDID>",
|
|
153
|
+
data=[
|
|
154
|
+
models.AdvertiserData(name="loyalty_members"),
|
|
155
|
+
],
|
|
156
|
+
)
|
|
157
|
+
],
|
|
158
|
+
)
|
|
160
159
|
|
|
161
160
|
```
|
|
162
161
|
|
|
@@ -165,19 +164,18 @@ with DataClient() as client:
|
|
|
165
164
|
```python
|
|
166
165
|
from ttd_data import DataClient, models
|
|
167
166
|
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
)
|
|
167
|
+
client = DataClient(ttd_auth=TTD_AUTH_TOKEN)
|
|
168
|
+
response = client.third_party.ingest_third_party_data(
|
|
169
|
+
data_provider_id=DATA_PROVIDER_ID,
|
|
170
|
+
items=[
|
|
171
|
+
models.ThirdPartyDataItem(
|
|
172
|
+
tdid="<TDID>",
|
|
173
|
+
data=[
|
|
174
|
+
models.ThirdPartyData(name="in_market_auto"),
|
|
175
|
+
],
|
|
176
|
+
)
|
|
177
|
+
],
|
|
178
|
+
)
|
|
181
179
|
```
|
|
182
180
|
|
|
183
181
|
### 3. Offline Conversions Data (CAPI)
|
|
@@ -186,28 +184,29 @@ with DataClient() as client:
|
|
|
186
184
|
from datetime import datetime, timezone
|
|
187
185
|
from ttd_data import DataClient, UserIdType, models
|
|
188
186
|
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
187
|
+
client = DataClient(ttd_auth=TTD_AUTH_TOKEN)
|
|
188
|
+
response = client.offline_conversion.ingest_offline_conversion_data(
|
|
189
|
+
data_provider_id=DATA_PROVIDER_ID,
|
|
190
|
+
items=[
|
|
191
|
+
# Pre-resolved TDID
|
|
192
|
+
models.OfflineConversionDataItem(
|
|
193
|
+
tracking_tag_id=TRACKING_TAG_ID,
|
|
194
|
+
timestamp_utc=datetime.now(timezone.utc),
|
|
195
|
+
tdid="<TDID>",
|
|
196
|
+
),
|
|
197
|
+
# Multiple identifiers via UserIdArray
|
|
198
|
+
models.OfflineConversionDataItem(
|
|
199
|
+
tracking_tag_id=TRACKING_TAG_ID,
|
|
200
|
+
timestamp_utc=datetime.now(timezone.utc),
|
|
201
|
+
user_id_array=[
|
|
202
|
+
[UserIdType.TDID, "<TDID>"],
|
|
203
|
+
[UserIdType.UID2, "<UID2>"],
|
|
204
|
+
],
|
|
205
|
+
),
|
|
206
|
+
],
|
|
207
|
+
# Required whenever any item uses user_id_array
|
|
208
|
+
user_id_array_metadata_format=["type", "id"],
|
|
209
|
+
)
|
|
211
210
|
```
|
|
212
211
|
|
|
213
212
|
### 4. Optouts and Deletion - Advertiser - Data Subject Request
|
|
@@ -215,17 +214,16 @@ with DataClient() as client:
|
|
|
215
214
|
```python
|
|
216
215
|
from ttd_data import DataClient, models
|
|
217
216
|
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
)
|
|
217
|
+
client = DataClient(ttd_auth=TTD_AUTH_TOKEN)
|
|
218
|
+
response = client.deletion_opt_out.data_subject_request_advertiser_data(
|
|
219
|
+
advertiser_id=ADVERTISER_ID,
|
|
220
|
+
request_type=models.PartnerDsrRequestType.DELETION,
|
|
221
|
+
items=[
|
|
222
|
+
models.PartnerDsrDataItem(tdid="<TDID>"),
|
|
223
|
+
models.PartnerDsrDataItem(daid="<DAID>"),
|
|
224
|
+
models.PartnerDsrDataItem(euid="<EUID>"),
|
|
225
|
+
],
|
|
226
|
+
)
|
|
229
227
|
```
|
|
230
228
|
|
|
231
229
|
### 5. Optouts and Deletion - Data Provider - Data Subject Request
|
|
@@ -233,16 +231,15 @@ with DataClient() as client:
|
|
|
233
231
|
```python
|
|
234
232
|
from ttd_data import DataClient, models
|
|
235
233
|
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
)
|
|
234
|
+
client = DataClient(ttd_auth=TTD_AUTH_TOKEN)
|
|
235
|
+
response = client.deletion_opt_out.data_subject_request_third_party_data(
|
|
236
|
+
data_provider_id=DATA_PROVIDER_ID,
|
|
237
|
+
request_type=models.PartnerDsrRequestType.OPT_OUT,
|
|
238
|
+
items=[
|
|
239
|
+
models.PartnerDsrDataItem(tdid="<TDID>"),
|
|
240
|
+
models.PartnerDsrDataItem(ramp_id="<RAMP_ID>"),
|
|
241
|
+
],
|
|
242
|
+
)
|
|
246
243
|
```
|
|
247
244
|
|
|
248
245
|
### 6. Optouts and Deletion - Merchant - Data Subject Request
|
|
@@ -250,15 +247,14 @@ with DataClient() as client:
|
|
|
250
247
|
```python
|
|
251
248
|
from ttd_data import DataClient, models
|
|
252
249
|
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
)
|
|
250
|
+
client = DataClient(ttd_auth=TTD_AUTH_TOKEN)
|
|
251
|
+
response = client.deletion_opt_out.data_subject_request_merchant_data(
|
|
252
|
+
merchant_id=MERCHANT_ID,
|
|
253
|
+
request_type=models.PartnerDsrRequestType.DELETION,
|
|
254
|
+
items=[
|
|
255
|
+
models.PartnerDsrDataItem(tdid="<TDID>"),
|
|
256
|
+
],
|
|
257
|
+
)
|
|
262
258
|
```
|
|
263
259
|
|
|
264
260
|
|
|
@@ -278,44 +274,47 @@ uid2_config = UID2Config(
|
|
|
278
274
|
)
|
|
279
275
|
|
|
280
276
|
try:
|
|
281
|
-
|
|
282
|
-
|
|
283
|
-
|
|
284
|
-
|
|
285
|
-
|
|
286
|
-
|
|
287
|
-
|
|
288
|
-
|
|
289
|
-
|
|
290
|
-
|
|
291
|
-
|
|
292
|
-
|
|
293
|
-
|
|
294
|
-
|
|
295
|
-
|
|
296
|
-
|
|
297
|
-
|
|
298
|
-
|
|
299
|
-
|
|
300
|
-
|
|
301
|
-
|
|
302
|
-
|
|
303
|
-
|
|
304
|
-
|
|
305
|
-
|
|
306
|
-
|
|
307
|
-
|
|
308
|
-
|
|
309
|
-
|
|
310
|
-
|
|
311
|
-
|
|
312
|
-
|
|
277
|
+
client = DataClient(
|
|
278
|
+
ttd_auth=TTD_AUTH_TOKEN,
|
|
279
|
+
uid2_config=uid2_config,
|
|
280
|
+
server_url="<TTD_DATA_SERVER_URL>",
|
|
281
|
+
)
|
|
282
|
+
response = client.advertiser.ingest_advertiser_data(
|
|
283
|
+
advertiser_id=ADVERTISER_ID,
|
|
284
|
+
items=[
|
|
285
|
+
# Raw email — resolved to UID2 before ingest
|
|
286
|
+
AdvertiserDataItem(
|
|
287
|
+
data=[AdvertiserData(name="loyalty_members")],
|
|
288
|
+
email="user@example.com",
|
|
289
|
+
),
|
|
290
|
+
# Pre-hashed email (SHA-256, base64-encoded)
|
|
291
|
+
AdvertiserDataItem(
|
|
292
|
+
data=[AdvertiserData(name="loyalty_members")],
|
|
293
|
+
hashed_email="<SHA256_BASE64>",
|
|
294
|
+
),
|
|
295
|
+
# Raw phone (E.164 format) — resolved to UID2 before ingest
|
|
296
|
+
AdvertiserDataItem(
|
|
297
|
+
data=[AdvertiserData(name="loyalty_members")],
|
|
298
|
+
phone="+15555550123",
|
|
299
|
+
),
|
|
300
|
+
# Pre-hashed phone (SHA-256 of the normalized E.164 string, base64-encoded)
|
|
301
|
+
AdvertiserDataItem(
|
|
302
|
+
data=[AdvertiserData(name="loyalty_members")],
|
|
303
|
+
hashed_phone="<SHA256_BASE64>",
|
|
304
|
+
),
|
|
305
|
+
# Pre-resolved TDID — no UID2 work needed
|
|
306
|
+
AdvertiserDataItem(
|
|
307
|
+
data=[AdvertiserData(name="loyalty_members")],
|
|
308
|
+
tdid="<TDID>",
|
|
309
|
+
),
|
|
310
|
+
],
|
|
311
|
+
)
|
|
313
312
|
|
|
314
|
-
|
|
315
|
-
|
|
316
|
-
|
|
317
|
-
|
|
318
|
-
|
|
313
|
+
# Check for per-item mapping failures
|
|
314
|
+
server_response = response.advertiser_data_server_response
|
|
315
|
+
if server_response and server_response.failed_lines:
|
|
316
|
+
for line in server_response.failed_lines:
|
|
317
|
+
print(f"Item {line.item_number} failed: {line.error_code} — {line.message}")
|
|
319
318
|
|
|
320
319
|
except UID2ServiceError as e:
|
|
321
320
|
# The UID2 identity-map service itself failed — no items were sent
|
|
@@ -332,23 +331,21 @@ import asyncio
|
|
|
332
331
|
from ttd_data import DataClient, models
|
|
333
332
|
|
|
334
333
|
async def main():
|
|
334
|
+
data_client = DataClient(ttd_auth=TTD_AUTH_TOKEN)
|
|
335
|
+
response = await data_client.advertiser.ingest_advertiser_data_async(
|
|
336
|
+
advertiser_id=ADVERTISER_ID,
|
|
337
|
+
items=[
|
|
338
|
+
models.AdvertiserDataItem(
|
|
339
|
+
tdid="<TDID>",
|
|
340
|
+
data=[
|
|
341
|
+
models.AdvertiserData(name="loyalty_members"),
|
|
342
|
+
],
|
|
343
|
+
)
|
|
344
|
+
],
|
|
345
|
+
)
|
|
335
346
|
|
|
336
|
-
|
|
337
|
-
|
|
338
|
-
ttd_auth=TTD_AUTH_TOKEN,
|
|
339
|
-
advertiser_id=ADVERTISER_ID,
|
|
340
|
-
items=[
|
|
341
|
-
models.AdvertiserDataItem(
|
|
342
|
-
tdid="<TDID>",
|
|
343
|
-
data=[
|
|
344
|
-
models.AdvertiserData(name="loyalty_members"),
|
|
345
|
-
],
|
|
346
|
-
)
|
|
347
|
-
],
|
|
348
|
-
)
|
|
349
|
-
|
|
350
|
-
# Handle response
|
|
351
|
-
print(response.advertiser_data_server_response)
|
|
347
|
+
# Handle response
|
|
348
|
+
print(response.advertiser_data_server_response)
|
|
352
349
|
|
|
353
350
|
asyncio.run(main())
|
|
354
351
|
```
|
|
@@ -392,15 +389,15 @@ from ttd_data import DataClient
|
|
|
392
389
|
from ttd_data.utils import BackoffStrategy, RetryConfig
|
|
393
390
|
|
|
394
391
|
|
|
395
|
-
|
|
392
|
+
data_client = DataClient(ttd_auth="<value>")
|
|
396
393
|
|
|
397
|
-
|
|
398
|
-
|
|
394
|
+
res = data_client.advertiser.ingest_advertiser_data(advertiser_id="<id>",
|
|
395
|
+
retries=RetryConfig("backoff", BackoffStrategy(1, 50, 1.1, 100), False))
|
|
399
396
|
|
|
400
|
-
|
|
397
|
+
assert res.advertiser_data_server_response is not None
|
|
401
398
|
|
|
402
|
-
|
|
403
|
-
|
|
399
|
+
# Handle response
|
|
400
|
+
print(res.advertiser_data_server_response)
|
|
404
401
|
|
|
405
402
|
```
|
|
406
403
|
|
|
@@ -410,16 +407,17 @@ from ttd_data import DataClient
|
|
|
410
407
|
from ttd_data.utils import BackoffStrategy, RetryConfig
|
|
411
408
|
|
|
412
409
|
|
|
413
|
-
|
|
410
|
+
data_client = DataClient(
|
|
411
|
+
ttd_auth="<value>",
|
|
414
412
|
retry_config=RetryConfig("backoff", BackoffStrategy(1, 50, 1.1, 100), False),
|
|
415
|
-
)
|
|
413
|
+
)
|
|
416
414
|
|
|
417
|
-
|
|
415
|
+
res = data_client.advertiser.ingest_advertiser_data(advertiser_id="<id>")
|
|
418
416
|
|
|
419
|
-
|
|
417
|
+
assert res.advertiser_data_server_response is not None
|
|
420
418
|
|
|
421
|
-
|
|
422
|
-
|
|
419
|
+
# Handle response
|
|
420
|
+
print(res.advertiser_data_server_response)
|
|
423
421
|
|
|
424
422
|
```
|
|
425
423
|
<!-- End Retries [retries] -->
|
|
@@ -443,30 +441,30 @@ with DataClient(
|
|
|
443
441
|
from ttd_data import DataClient, errors
|
|
444
442
|
|
|
445
443
|
|
|
446
|
-
|
|
447
|
-
|
|
448
|
-
|
|
444
|
+
data_client = DataClient(ttd_auth="<value>")
|
|
445
|
+
res = None
|
|
446
|
+
try:
|
|
449
447
|
|
|
450
|
-
|
|
448
|
+
res = data_client.advertiser.ingest_advertiser_data(advertiser_id="<id>")
|
|
451
449
|
|
|
452
|
-
|
|
450
|
+
assert res.advertiser_data_server_response is not None
|
|
453
451
|
|
|
454
|
-
|
|
455
|
-
|
|
452
|
+
# Handle response
|
|
453
|
+
print(res.advertiser_data_server_response)
|
|
456
454
|
|
|
457
455
|
|
|
458
|
-
|
|
459
|
-
|
|
460
|
-
|
|
461
|
-
|
|
462
|
-
|
|
463
|
-
|
|
464
|
-
|
|
456
|
+
except errors.DataError as e:
|
|
457
|
+
# The base class for HTTP error responses
|
|
458
|
+
print(e.message)
|
|
459
|
+
print(e.status_code)
|
|
460
|
+
print(e.body)
|
|
461
|
+
print(e.headers)
|
|
462
|
+
print(e.raw_response)
|
|
465
463
|
|
|
466
|
-
|
|
467
|
-
|
|
468
|
-
|
|
469
|
-
|
|
464
|
+
# Depending on the method different errors may be thrown
|
|
465
|
+
if isinstance(e, errors.AdvertiserDataServerResponseError):
|
|
466
|
+
print(e.data.failed_lines) # OptionalNullable[List[models.AdvertiserDataServerResponseLine]]
|
|
467
|
+
print(e.data.http_meta) # models.HTTPMetadata
|
|
470
468
|
```
|
|
471
469
|
|
|
472
470
|
### Error Classes
|
|
@@ -517,6 +515,7 @@ or you could wrap the client with your own custom logic:
|
|
|
517
515
|
```python
|
|
518
516
|
from ttd_data import DataClient
|
|
519
517
|
from ttd_data.httpclient import AsyncHttpClient
|
|
518
|
+
from typing import Any, Optional, Union
|
|
520
519
|
import httpx
|
|
521
520
|
|
|
522
521
|
class CustomClient(AsyncHttpClient):
|
|
@@ -581,23 +580,22 @@ s = DataClient(async_client=CustomClient(httpx.AsyncClient()))
|
|
|
581
580
|
<!-- Start Resource Management [resource-management] -->
|
|
582
581
|
## Resource Management
|
|
583
582
|
|
|
584
|
-
|
|
585
|
-
|
|
586
|
-
[context-manager]: https://docs.python.org/3/reference/datamodel.html#context-managers
|
|
583
|
+
`DataClient` registers a finalizer that closes the underlying sync and async HTTPX clients when the instance is garbage collected. This closes HTTP connections, releases memory and frees up other resources held by the SDK. In short-lived Python programs and notebooks that make a few SDK method calls, resource management may not be a concern. However, in longer-lived programs, it is beneficial to create a single SDK instance and reuse it across the application.
|
|
587
584
|
|
|
588
585
|
```python
|
|
589
586
|
from ttd_data import DataClient
|
|
590
|
-
def main():
|
|
591
587
|
|
|
592
|
-
|
|
593
|
-
# Rest of application here...
|
|
588
|
+
client = DataClient(ttd_auth="<TTD_AUTH_TOKEN>")
|
|
594
589
|
|
|
595
590
|
|
|
596
|
-
|
|
597
|
-
|
|
591
|
+
def main():
|
|
592
|
+
# Reuse the single client for every request
|
|
593
|
+
...
|
|
594
|
+
|
|
598
595
|
|
|
599
|
-
|
|
600
|
-
|
|
596
|
+
# The same instance also serves async calls:
|
|
597
|
+
async def amain():
|
|
598
|
+
...
|
|
601
599
|
```
|
|
602
600
|
<!-- End Resource Management [resource-management] -->
|
|
603
601
|
|