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.
Files changed (122) hide show
  1. {ttd_data-0.2.7/src/ttd_data.egg-info → ttd_data-0.3.0}/PKG-INFO +170 -172
  2. {ttd_data-0.2.7 → ttd_data-0.3.0}/README-PYPI.md +169 -171
  3. {ttd_data-0.2.7 → ttd_data-0.3.0}/README.md +169 -171
  4. {ttd_data-0.2.7 → ttd_data-0.3.0}/pyproject.toml +1 -1
  5. {ttd_data-0.2.7 → ttd_data-0.3.0}/src/ttd_data/_version.py +2 -2
  6. {ttd_data-0.2.7 → ttd_data-0.3.0}/src/ttd_data/advertiser.py +31 -34
  7. {ttd_data-0.2.7 → ttd_data-0.3.0}/src/ttd_data/basesdk.py +2 -2
  8. {ttd_data-0.2.7 → ttd_data-0.3.0}/src/ttd_data/client.py +23 -1
  9. {ttd_data-0.2.7 → ttd_data-0.3.0}/src/ttd_data/deletionoptout.py +77 -88
  10. {ttd_data-0.2.7 → ttd_data-0.3.0}/src/ttd_data/ipaddress.py +45 -52
  11. {ttd_data-0.2.7 → ttd_data-0.3.0}/src/ttd_data/models/__init__.py +5 -48
  12. {ttd_data-0.2.7 → ttd_data-0.3.0}/src/ttd_data/models/advertiserdataresponseerrorcode.py +1 -0
  13. {ttd_data-0.2.7 → ttd_data-0.3.0}/src/ttd_data/models/datasubjectrequestadvertiserdataop.py +0 -22
  14. {ttd_data-0.2.7 → ttd_data-0.3.0}/src/ttd_data/models/datasubjectrequestmerchantdataop.py +0 -22
  15. {ttd_data-0.2.7 → ttd_data-0.3.0}/src/ttd_data/models/datasubjectrequestthirdpartydataop.py +0 -22
  16. {ttd_data-0.2.7 → ttd_data-0.3.0}/src/ttd_data/models/ingestadvertiserdataop.py +0 -22
  17. {ttd_data-0.2.7 → ttd_data-0.3.0}/src/ttd_data/models/ingestfirstpartyipaddressdataop.py +0 -22
  18. {ttd_data-0.2.7 → ttd_data-0.3.0}/src/ttd_data/models/ingestofflineconversiondataop.py +0 -25
  19. {ttd_data-0.2.7 → ttd_data-0.3.0}/src/ttd_data/models/ingestthirdpartydataop.py +0 -22
  20. {ttd_data-0.2.7 → ttd_data-0.3.0}/src/ttd_data/models/ingestthirdpartyipaddressdataop.py +0 -22
  21. {ttd_data-0.2.7 → ttd_data-0.3.0}/src/ttd_data/models/ipaddressdataresponseerrorcode.py +1 -0
  22. ttd_data-0.3.0/src/ttd_data/models/security.py +43 -0
  23. {ttd_data-0.2.7 → ttd_data-0.3.0}/src/ttd_data/models/thirdpartydataresponseerrorcode.py +1 -0
  24. {ttd_data-0.2.7 → ttd_data-0.3.0}/src/ttd_data/offlineconversion.py +35 -38
  25. {ttd_data-0.2.7 → ttd_data-0.3.0}/src/ttd_data/sdk.py +14 -1
  26. {ttd_data-0.2.7 → ttd_data-0.3.0}/src/ttd_data/sdkconfiguration.py +3 -1
  27. {ttd_data-0.2.7 → ttd_data-0.3.0}/src/ttd_data/thirdparty.py +31 -34
  28. {ttd_data-0.2.7 → ttd_data-0.3.0}/src/ttd_data/utils/__init__.py +4 -1
  29. {ttd_data-0.2.7 → ttd_data-0.3.0}/src/ttd_data/utils/security.py +17 -0
  30. {ttd_data-0.2.7 → ttd_data-0.3.0/src/ttd_data.egg-info}/PKG-INFO +170 -172
  31. {ttd_data-0.2.7 → ttd_data-0.3.0}/src/ttd_data.egg-info/SOURCES.txt +1 -0
  32. {ttd_data-0.2.7 → ttd_data-0.3.0}/LICENSE +0 -0
  33. {ttd_data-0.2.7 → ttd_data-0.3.0}/NOTICES.txt +0 -0
  34. {ttd_data-0.2.7 → ttd_data-0.3.0}/setup.cfg +0 -0
  35. {ttd_data-0.2.7 → ttd_data-0.3.0}/src/ttd_data/__init__.py +0 -0
  36. {ttd_data-0.2.7 → ttd_data-0.3.0}/src/ttd_data/_hooks/__init__.py +0 -0
  37. {ttd_data-0.2.7 → ttd_data-0.3.0}/src/ttd_data/_hooks/data_origins_hook.py +0 -0
  38. {ttd_data-0.2.7 → ttd_data-0.3.0}/src/ttd_data/_hooks/plain_text_error_normalizer.py +0 -0
  39. {ttd_data-0.2.7 → ttd_data-0.3.0}/src/ttd_data/_hooks/registration.py +0 -0
  40. {ttd_data-0.2.7 → ttd_data-0.3.0}/src/ttd_data/_hooks/sdkhooks.py +0 -0
  41. {ttd_data-0.2.7 → ttd_data-0.3.0}/src/ttd_data/_hooks/types.py +0 -0
  42. {ttd_data-0.2.7 → ttd_data-0.3.0}/src/ttd_data/errors/__init__.py +0 -0
  43. {ttd_data-0.2.7 → ttd_data-0.3.0}/src/ttd_data/errors/advertiserdataserverresponse_error.py +0 -0
  44. {ttd_data-0.2.7 → ttd_data-0.3.0}/src/ttd_data/errors/advertiserdsrresponse_error.py +0 -0
  45. {ttd_data-0.2.7 → ttd_data-0.3.0}/src/ttd_data/errors/apierror.py +0 -0
  46. {ttd_data-0.2.7 → ttd_data-0.3.0}/src/ttd_data/errors/dataerror.py +0 -0
  47. {ttd_data-0.2.7 → ttd_data-0.3.0}/src/ttd_data/errors/ipaddressdataserverresponse_error.py +0 -0
  48. {ttd_data-0.2.7 → ttd_data-0.3.0}/src/ttd_data/errors/merchantdsrresponse_error.py +0 -0
  49. {ttd_data-0.2.7 → ttd_data-0.3.0}/src/ttd_data/errors/no_response_error.py +0 -0
  50. {ttd_data-0.2.7 → ttd_data-0.3.0}/src/ttd_data/errors/offlineconversiondataserverresponse_error.py +0 -0
  51. {ttd_data-0.2.7 → ttd_data-0.3.0}/src/ttd_data/errors/responsevalidationerror.py +0 -0
  52. {ttd_data-0.2.7 → ttd_data-0.3.0}/src/ttd_data/errors/thirdpartydataserverresponse_error.py +0 -0
  53. {ttd_data-0.2.7 → ttd_data-0.3.0}/src/ttd_data/errors/thirdpartydsrresponse_error.py +0 -0
  54. {ttd_data-0.2.7 → ttd_data-0.3.0}/src/ttd_data/errors/ttddataerror.py +0 -0
  55. {ttd_data-0.2.7 → ttd_data-0.3.0}/src/ttd_data/errors/uid2serviceerror.py +0 -0
  56. {ttd_data-0.2.7 → ttd_data-0.3.0}/src/ttd_data/httpclient.py +0 -0
  57. {ttd_data-0.2.7 → ttd_data-0.3.0}/src/ttd_data/models/advertiserdata.py +0 -0
  58. {ttd_data-0.2.7 → ttd_data-0.3.0}/src/ttd_data/models/advertiserdatarequest.py +0 -0
  59. {ttd_data-0.2.7 → ttd_data-0.3.0}/src/ttd_data/models/advertiserdataserverresponse.py +0 -0
  60. {ttd_data-0.2.7 → ttd_data-0.3.0}/src/ttd_data/models/advertiserdataserverresponseline.py +0 -0
  61. {ttd_data-0.2.7 → ttd_data-0.3.0}/src/ttd_data/models/advertiserdsrfailedline.py +0 -0
  62. {ttd_data-0.2.7 → ttd_data-0.3.0}/src/ttd_data/models/advertiserdsrrequest.py +0 -0
  63. {ttd_data-0.2.7 → ttd_data-0.3.0}/src/ttd_data/models/advertiserdsrresponse.py +0 -0
  64. {ttd_data-0.2.7 → ttd_data-0.3.0}/src/ttd_data/models/baseadvertiserdataitem.py +0 -0
  65. {ttd_data-0.2.7 → ttd_data-0.3.0}/src/ttd_data/models/baseofflineconversiondataitem.py +0 -0
  66. {ttd_data-0.2.7 → ttd_data-0.3.0}/src/ttd_data/models/basepartnerdsrdataitem.py +0 -0
  67. {ttd_data-0.2.7 → ttd_data-0.3.0}/src/ttd_data/models/basethirdpartydataitem.py +0 -0
  68. {ttd_data-0.2.7 → ttd_data-0.3.0}/src/ttd_data/models/dataorigin.py +0 -0
  69. {ttd_data-0.2.7 → ttd_data-0.3.0}/src/ttd_data/models/dataorigintype.py +0 -0
  70. {ttd_data-0.2.7 → ttd_data-0.3.0}/src/ttd_data/models/dsrerrorcode.py +0 -0
  71. {ttd_data-0.2.7 → ttd_data-0.3.0}/src/ttd_data/models/expandedipaddress.py +0 -0
  72. {ttd_data-0.2.7 → ttd_data-0.3.0}/src/ttd_data/models/httpmetadata.py +0 -0
  73. {ttd_data-0.2.7 → ttd_data-0.3.0}/src/ttd_data/models/ipaddressdata.py +0 -0
  74. {ttd_data-0.2.7 → ttd_data-0.3.0}/src/ttd_data/models/ipaddressdataitem.py +0 -0
  75. {ttd_data-0.2.7 → ttd_data-0.3.0}/src/ttd_data/models/ipaddressdatarequest.py +0 -0
  76. {ttd_data-0.2.7 → ttd_data-0.3.0}/src/ttd_data/models/ipaddressdataserverresponse.py +0 -0
  77. {ttd_data-0.2.7 → ttd_data-0.3.0}/src/ttd_data/models/ipaddressdataserverresponseline.py +0 -0
  78. {ttd_data-0.2.7 → ttd_data-0.3.0}/src/ttd_data/models/merchantdsrfailedline.py +0 -0
  79. {ttd_data-0.2.7 → ttd_data-0.3.0}/src/ttd_data/models/merchantdsrrequest.py +0 -0
  80. {ttd_data-0.2.7 → ttd_data-0.3.0}/src/ttd_data/models/merchantdsrresponse.py +0 -0
  81. {ttd_data-0.2.7 → ttd_data-0.3.0}/src/ttd_data/models/offlineconversiondatarequest.py +0 -0
  82. {ttd_data-0.2.7 → ttd_data-0.3.0}/src/ttd_data/models/offlineconversiondataresponseerrorcode.py +0 -0
  83. {ttd_data-0.2.7 → ttd_data-0.3.0}/src/ttd_data/models/offlineconversiondataserverresponse.py +0 -0
  84. {ttd_data-0.2.7 → ttd_data-0.3.0}/src/ttd_data/models/offlineconversiondataserverresponseline.py +0 -0
  85. {ttd_data-0.2.7 → ttd_data-0.3.0}/src/ttd_data/models/partnerdsrrequesttype.py +0 -0
  86. {ttd_data-0.2.7 → ttd_data-0.3.0}/src/ttd_data/models/realtimeconversioneventlineitem.py +0 -0
  87. {ttd_data-0.2.7 → ttd_data-0.3.0}/src/ttd_data/models/realtimeconversioneventsprivacysetting.py +0 -0
  88. {ttd_data-0.2.7 → ttd_data-0.3.0}/src/ttd_data/models/thirdpartydata.py +0 -0
  89. {ttd_data-0.2.7 → ttd_data-0.3.0}/src/ttd_data/models/thirdpartydatarequest.py +0 -0
  90. {ttd_data-0.2.7 → ttd_data-0.3.0}/src/ttd_data/models/thirdpartydataserverresponse.py +0 -0
  91. {ttd_data-0.2.7 → ttd_data-0.3.0}/src/ttd_data/models/thirdpartydataserverresponseline.py +0 -0
  92. {ttd_data-0.2.7 → ttd_data-0.3.0}/src/ttd_data/models/thirdpartydsrfailedline.py +0 -0
  93. {ttd_data-0.2.7 → ttd_data-0.3.0}/src/ttd_data/models/thirdpartydsrrequest.py +0 -0
  94. {ttd_data-0.2.7 → ttd_data-0.3.0}/src/ttd_data/models/thirdpartydsrresponse.py +0 -0
  95. {ttd_data-0.2.7 → ttd_data-0.3.0}/src/ttd_data/py.typed +0 -0
  96. {ttd_data-0.2.7 → ttd_data-0.3.0}/src/ttd_data/types/__init__.py +0 -0
  97. {ttd_data-0.2.7 → ttd_data-0.3.0}/src/ttd_data/types/base64fileinput.py +0 -0
  98. {ttd_data-0.2.7 → ttd_data-0.3.0}/src/ttd_data/types/basemodel.py +0 -0
  99. {ttd_data-0.2.7 → ttd_data-0.3.0}/src/ttd_data/uid2/__init__.py +0 -0
  100. {ttd_data-0.2.7 → ttd_data-0.3.0}/src/ttd_data/uid2/config.py +0 -0
  101. {ttd_data-0.2.7 → ttd_data-0.3.0}/src/ttd_data/uid2/models.py +0 -0
  102. {ttd_data-0.2.7 → ttd_data-0.3.0}/src/ttd_data/uid2/resolver.py +0 -0
  103. {ttd_data-0.2.7 → ttd_data-0.3.0}/src/ttd_data/utils/annotations.py +0 -0
  104. {ttd_data-0.2.7 → ttd_data-0.3.0}/src/ttd_data/utils/datetimes.py +0 -0
  105. {ttd_data-0.2.7 → ttd_data-0.3.0}/src/ttd_data/utils/dynamic_imports.py +0 -0
  106. {ttd_data-0.2.7 → ttd_data-0.3.0}/src/ttd_data/utils/enums.py +0 -0
  107. {ttd_data-0.2.7 → ttd_data-0.3.0}/src/ttd_data/utils/eventstreaming.py +0 -0
  108. {ttd_data-0.2.7 → ttd_data-0.3.0}/src/ttd_data/utils/forms.py +0 -0
  109. {ttd_data-0.2.7 → ttd_data-0.3.0}/src/ttd_data/utils/headers.py +0 -0
  110. {ttd_data-0.2.7 → ttd_data-0.3.0}/src/ttd_data/utils/logger.py +0 -0
  111. {ttd_data-0.2.7 → ttd_data-0.3.0}/src/ttd_data/utils/metadata.py +0 -0
  112. {ttd_data-0.2.7 → ttd_data-0.3.0}/src/ttd_data/utils/queryparams.py +0 -0
  113. {ttd_data-0.2.7 → ttd_data-0.3.0}/src/ttd_data/utils/requestbodies.py +0 -0
  114. {ttd_data-0.2.7 → ttd_data-0.3.0}/src/ttd_data/utils/retries.py +0 -0
  115. {ttd_data-0.2.7 → ttd_data-0.3.0}/src/ttd_data/utils/serializers.py +0 -0
  116. {ttd_data-0.2.7 → ttd_data-0.3.0}/src/ttd_data/utils/unmarshal_json_response.py +0 -0
  117. {ttd_data-0.2.7 → ttd_data-0.3.0}/src/ttd_data/utils/url.py +0 -0
  118. {ttd_data-0.2.7 → ttd_data-0.3.0}/src/ttd_data/utils/values.py +0 -0
  119. {ttd_data-0.2.7 → ttd_data-0.3.0}/src/ttd_data.egg-info/dependency_links.txt +0 -0
  120. {ttd_data-0.2.7 → ttd_data-0.3.0}/src/ttd_data.egg-info/requires.txt +0 -0
  121. {ttd_data-0.2.7 → ttd_data-0.3.0}/src/ttd_data.egg-info/top_level.txt +0 -0
  122. {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.2.7
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
- with DataClient() as client:
148
- response = client.advertiser.ingest_advertiser_data(
149
- ttd_auth=TTD_AUTH_TOKEN,
150
- advertiser_id=ADVERTISER_ID,
151
- items=[
152
- models.AdvertiserDataItem(
153
- tdid="<TDID>",
154
- data=[
155
- models.AdvertiserData(name="loyalty_members"),
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
- with DataClient() as client:
169
- response = client.third_party.ingest_third_party_data(
170
- ttd_auth=TTD_AUTH_TOKEN,
171
- data_provider_id=DATA_PROVIDER_ID,
172
- items=[
173
- models.ThirdPartyDataItem(
174
- tdid="<TDID>",
175
- data=[
176
- models.ThirdPartyData(name="in_market_auto"),
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
- with DataClient() as client:
190
- response = client.offline_conversion.ingest_offline_conversion_data(
191
- ttd_auth=TTD_AUTH_TOKEN,
192
- data_provider_id=DATA_PROVIDER_ID,
193
- items=[
194
- # Pre-resolved TDID
195
- models.OfflineConversionDataItem(
196
- tracking_tag_id=TRACKING_TAG_ID,
197
- timestamp_utc=datetime.now(timezone.utc),
198
- tdid="<TDID>",
199
- ),
200
- # Multiple identifiers via UserIdArray
201
- models.OfflineConversionDataItem(
202
- tracking_tag_id=TRACKING_TAG_ID,
203
- timestamp_utc=datetime.now(timezone.utc),
204
- user_id_array=[
205
- [UserIdType.TDID, "<TDID>"],
206
- [UserIdType.UID2, "<UID2>"],
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
- with DataClient() as client:
219
- response = client.deletion_opt_out.data_subject_request_advertiser_data(
220
- ttd_auth=TTD_AUTH_TOKEN,
221
- advertiser_id=ADVERTISER_ID,
222
- request_type=models.PartnerDsrRequestType.DELETION,
223
- items=[
224
- models.PartnerDsrDataItem(tdid="<TDID>"),
225
- models.PartnerDsrDataItem(daid="<DAID>"),
226
- models.PartnerDsrDataItem(euid="<EUID>"),
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
- with DataClient() as client:
237
- response = client.deletion_opt_out.data_subject_request_third_party_data(
238
- ttd_auth=TTD_AUTH_TOKEN,
239
- data_provider_id=DATA_PROVIDER_ID,
240
- request_type=models.PartnerDsrRequestType.OPT_OUT,
241
- items=[
242
- models.PartnerDsrDataItem(tdid="<TDID>"),
243
- models.PartnerDsrDataItem(ramp_id="<RAMP_ID>"),
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
- with DataClient() as client:
254
- response = client.deletion_opt_out.data_subject_request_merchant_data(
255
- ttd_auth=TTD_AUTH_TOKEN,
256
- merchant_id=MERCHANT_ID,
257
- request_type=models.PartnerDsrRequestType.DELETION,
258
- items=[
259
- models.PartnerDsrDataItem(tdid="<TDID>"),
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
- with DataClient(uid2_config=uid2_config, server_url="<TTD_DATA_SERVER_URL>") as client:
282
- response = client.advertiser.ingest_advertiser_data(
283
- ttd_auth=TTD_AUTH_TOKEN,
284
- advertiser_id=ADVERTISER_ID,
285
- items=[
286
- # Raw email — resolved to UID2 before ingest
287
- AdvertiserDataItem(
288
- data=[AdvertiserData(name="loyalty_members")],
289
- email="user@example.com",
290
- ),
291
- # Pre-hashed email (SHA-256, base64-encoded)
292
- AdvertiserDataItem(
293
- data=[AdvertiserData(name="loyalty_members")],
294
- hashed_email="<SHA256_BASE64>",
295
- ),
296
- # Raw phone (E.164 format) — resolved to UID2 before ingest
297
- AdvertiserDataItem(
298
- data=[AdvertiserData(name="loyalty_members")],
299
- phone="+15555550123",
300
- ),
301
- # Pre-hashed phone (SHA-256 of the normalized E.164 string, base64-encoded)
302
- AdvertiserDataItem(
303
- data=[AdvertiserData(name="loyalty_members")],
304
- hashed_phone="<SHA256_BASE64>",
305
- ),
306
- # Pre-resolved TDID — no UID2 work needed
307
- AdvertiserDataItem(
308
- data=[AdvertiserData(name="loyalty_members")],
309
- tdid="<TDID>",
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
- # Check for per-item mapping failures
315
- server_response = response.advertiser_data_server_response
316
- if server_response and server_response.failed_lines:
317
- for line in server_response.failed_lines:
318
- print(f"Item {line.item_number} failed: {line.error_code} — {line.message}")
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
- async with DataClient() as data_client:
337
- response = data_client.advertiser.ingest_advertiser_data(
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
- with DataClient() as data_client:
392
+ data_client = DataClient(ttd_auth="<value>")
396
393
 
397
- res = data_client.advertiser.ingest_advertiser_data(ttd_auth="<value>", advertiser_id="<id>",
398
- RetryConfig("backoff", BackoffStrategy(1, 50, 1.1, 100), False))
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
- assert res.advertiser_data_server_response is not None
397
+ assert res.advertiser_data_server_response is not None
401
398
 
402
- # Handle response
403
- print(res.advertiser_data_server_response)
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
- with DataClient(
410
+ data_client = DataClient(
411
+ ttd_auth="<value>",
414
412
  retry_config=RetryConfig("backoff", BackoffStrategy(1, 50, 1.1, 100), False),
415
- ) as data_client:
413
+ )
416
414
 
417
- res = data_client.advertiser.ingest_advertiser_data(ttd_auth="<value>", advertiser_id="<id>")
415
+ res = data_client.advertiser.ingest_advertiser_data(advertiser_id="<id>")
418
416
 
419
- assert res.advertiser_data_server_response is not None
417
+ assert res.advertiser_data_server_response is not None
420
418
 
421
- # Handle response
422
- print(res.advertiser_data_server_response)
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
- with DataClient() as data_client:
447
- res = None
448
- try:
444
+ data_client = DataClient(ttd_auth="<value>")
445
+ res = None
446
+ try:
449
447
 
450
- res = data_client.advertiser.ingest_advertiser_data(ttd_auth="<value>", advertiser_id="<id>")
448
+ res = data_client.advertiser.ingest_advertiser_data(advertiser_id="<id>")
451
449
 
452
- assert res.advertiser_data_server_response is not None
450
+ assert res.advertiser_data_server_response is not None
453
451
 
454
- # Handle response
455
- print(res.advertiser_data_server_response)
452
+ # Handle response
453
+ print(res.advertiser_data_server_response)
456
454
 
457
455
 
458
- except errors.DataError as e:
459
- # The base class for HTTP error responses
460
- print(e.message)
461
- print(e.status_code)
462
- print(e.body)
463
- print(e.headers)
464
- print(e.raw_response)
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
- # Depending on the method different errors may be thrown
467
- if isinstance(e, errors.AdvertiserDataServerResponseError):
468
- print(e.data.failed_lines) # OptionalNullable[List[models.AdvertiserDataServerResponseLine]]
469
- print(e.data.http_meta) # models.HTTPMetadata
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
- The `DataClient` class implements the context manager protocol and registers a finalizer function to close the underlying sync and async HTTPX clients it uses under the hood. This will close HTTP connections, release memory and free 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 via a [context manager][context-manager] and reuse it across the application.
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
- with DataClient() as data_client:
593
- # Rest of application here...
588
+ client = DataClient(ttd_auth="<TTD_AUTH_TOKEN>")
594
589
 
595
590
 
596
- # Or when using async:
597
- async def amain():
591
+ def main():
592
+ # Reuse the single client for every request
593
+ ...
594
+
598
595
 
599
- async with DataClient() as data_client:
600
- # Rest of application here...
596
+ # The same instance also serves async calls:
597
+ async def amain():
598
+ ...
601
599
  ```
602
600
  <!-- End Resource Management [resource-management] -->
603
601