python-amazon-ad-api 1.1.6__tar.gz → 1.1.8__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. {python_amazon_ad_api-1.1.6 → python_amazon_ad_api-1.1.8}/PKG-INFO +1 -1
  2. {python_amazon_ad_api-1.1.6 → python_amazon_ad_api-1.1.8}/ad_api/api/sb/ad_creatives_v4.py +86 -0
  3. {python_amazon_ad_api-1.1.6 → python_amazon_ad_api-1.1.8}/ad_api/api/sb/ads_v4.py +79 -0
  4. {python_amazon_ad_api-1.1.6 → python_amazon_ad_api-1.1.8}/ad_api/api/sb/campaigns_v4.py +28 -0
  5. {python_amazon_ad_api-1.1.6 → python_amazon_ad_api-1.1.8}/ad_api/api/sb/targeting_categories.py +23 -0
  6. python_amazon_ad_api-1.1.8/ad_api/version.py +1 -0
  7. {python_amazon_ad_api-1.1.6 → python_amazon_ad_api-1.1.8}/python_amazon_ad_api.egg-info/PKG-INFO +1 -1
  8. {python_amazon_ad_api-1.1.6 → python_amazon_ad_api-1.1.8}/setup.cfg +1 -1
  9. {python_amazon_ad_api-1.1.6 → python_amazon_ad_api-1.1.8}/setup.py +1 -1
  10. python_amazon_ad_api-1.1.6/ad_api/version.py +0 -1
  11. {python_amazon_ad_api-1.1.6 → python_amazon_ad_api-1.1.8}/LICENSE +0 -0
  12. {python_amazon_ad_api-1.1.6 → python_amazon_ad_api-1.1.8}/README.md +0 -0
  13. {python_amazon_ad_api-1.1.6 → python_amazon_ad_api-1.1.8}/ad_api/__init__.py +0 -0
  14. {python_amazon_ad_api-1.1.6 → python_amazon_ad_api-1.1.8}/ad_api/api/__init__.py +0 -0
  15. {python_amazon_ad_api-1.1.6 → python_amazon_ad_api-1.1.8}/ad_api/api/account.py +0 -0
  16. {python_amazon_ad_api-1.1.6 → python_amazon_ad_api-1.1.8}/ad_api/api/advertising_test_account.py +0 -0
  17. {python_amazon_ad_api-1.1.6 → python_amazon_ad_api-1.1.8}/ad_api/api/attribution.py +0 -0
  18. {python_amazon_ad_api-1.1.6 → python_amazon_ad_api-1.1.8}/ad_api/api/audiences.py +0 -0
  19. {python_amazon_ad_api-1.1.6 → python_amazon_ad_api-1.1.8}/ad_api/api/billing.py +0 -0
  20. {python_amazon_ad_api-1.1.6 → python_amazon_ad_api-1.1.8}/ad_api/api/brand_metrics.py +0 -0
  21. {python_amazon_ad_api-1.1.6 → python_amazon_ad_api-1.1.8}/ad_api/api/creative_assets.py +0 -0
  22. {python_amazon_ad_api-1.1.6 → python_amazon_ad_api-1.1.8}/ad_api/api/eligibility.py +0 -0
  23. {python_amazon_ad_api-1.1.6 → python_amazon_ad_api-1.1.8}/ad_api/api/exports.py +0 -0
  24. {python_amazon_ad_api-1.1.6 → python_amazon_ad_api-1.1.8}/ad_api/api/history.py +0 -0
  25. {python_amazon_ad_api-1.1.6 → python_amazon_ad_api-1.1.8}/ad_api/api/insights.py +0 -0
  26. {python_amazon_ad_api-1.1.6 → python_amazon_ad_api-1.1.8}/ad_api/api/invoices.py +0 -0
  27. {python_amazon_ad_api-1.1.6 → python_amazon_ad_api-1.1.8}/ad_api/api/localization.py +0 -0
  28. {python_amazon_ad_api-1.1.6 → python_amazon_ad_api-1.1.8}/ad_api/api/manager_accounts.py +0 -0
  29. {python_amazon_ad_api-1.1.6 → python_amazon_ad_api-1.1.8}/ad_api/api/metadata.py +0 -0
  30. {python_amazon_ad_api-1.1.6 → python_amazon_ad_api-1.1.8}/ad_api/api/portfolios.py +0 -0
  31. {python_amazon_ad_api-1.1.6 → python_amazon_ad_api-1.1.8}/ad_api/api/portfolios_v3.py +0 -0
  32. {python_amazon_ad_api-1.1.6 → python_amazon_ad_api-1.1.8}/ad_api/api/profiles.py +0 -0
  33. {python_amazon_ad_api-1.1.6 → python_amazon_ad_api-1.1.8}/ad_api/api/recommendations.py +0 -0
  34. {python_amazon_ad_api-1.1.6 → python_amazon_ad_api-1.1.8}/ad_api/api/reports.py +0 -0
  35. {python_amazon_ad_api-1.1.6 → python_amazon_ad_api-1.1.8}/ad_api/api/sb/__init__.py +0 -0
  36. {python_amazon_ad_api-1.1.6 → python_amazon_ad_api-1.1.8}/ad_api/api/sb/ad_groups.py +0 -0
  37. {python_amazon_ad_api-1.1.6 → python_amazon_ad_api-1.1.8}/ad_api/api/sb/ad_groups_v4.py +0 -0
  38. {python_amazon_ad_api-1.1.6 → python_amazon_ad_api-1.1.8}/ad_api/api/sb/benchmarks.py +0 -0
  39. {python_amazon_ad_api-1.1.6 → python_amazon_ad_api-1.1.8}/ad_api/api/sb/bid_recommendations.py +0 -0
  40. {python_amazon_ad_api-1.1.6 → python_amazon_ad_api-1.1.8}/ad_api/api/sb/brands.py +0 -0
  41. {python_amazon_ad_api-1.1.6 → python_amazon_ad_api-1.1.8}/ad_api/api/sb/budget_rules.py +0 -0
  42. {python_amazon_ad_api-1.1.6 → python_amazon_ad_api-1.1.8}/ad_api/api/sb/campaigns.py +0 -0
  43. {python_amazon_ad_api-1.1.6 → python_amazon_ad_api-1.1.8}/ad_api/api/sb/forecast.py +0 -0
  44. {python_amazon_ad_api-1.1.6 → python_amazon_ad_api-1.1.8}/ad_api/api/sb/keywords.py +0 -0
  45. {python_amazon_ad_api-1.1.6 → python_amazon_ad_api-1.1.8}/ad_api/api/sb/keywords_recommendations.py +0 -0
  46. {python_amazon_ad_api-1.1.6 → python_amazon_ad_api-1.1.8}/ad_api/api/sb/landing_page_asins.py +0 -0
  47. {python_amazon_ad_api-1.1.6 → python_amazon_ad_api-1.1.8}/ad_api/api/sb/media.py +0 -0
  48. {python_amazon_ad_api-1.1.6 → python_amazon_ad_api-1.1.8}/ad_api/api/sb/migration.py +0 -0
  49. {python_amazon_ad_api-1.1.6 → python_amazon_ad_api-1.1.8}/ad_api/api/sb/negative_keywords.py +0 -0
  50. {python_amazon_ad_api-1.1.6 → python_amazon_ad_api-1.1.8}/ad_api/api/sb/negative_product_targeting.py +0 -0
  51. {python_amazon_ad_api-1.1.6 → python_amazon_ad_api-1.1.8}/ad_api/api/sb/optimization_rules.py +0 -0
  52. {python_amazon_ad_api-1.1.6 → python_amazon_ad_api-1.1.8}/ad_api/api/sb/product_targeting.py +0 -0
  53. {python_amazon_ad_api-1.1.6 → python_amazon_ad_api-1.1.8}/ad_api/api/sb/recommendations.py +0 -0
  54. {python_amazon_ad_api-1.1.6 → python_amazon_ad_api-1.1.8}/ad_api/api/sb/reports.py +0 -0
  55. {python_amazon_ad_api-1.1.6 → python_amazon_ad_api-1.1.8}/ad_api/api/sb/stores.py +0 -0
  56. {python_amazon_ad_api-1.1.6 → python_amazon_ad_api-1.1.8}/ad_api/api/sb/targeting_recommendations.py +0 -0
  57. {python_amazon_ad_api-1.1.6 → python_amazon_ad_api-1.1.8}/ad_api/api/sb/themes.py +0 -0
  58. {python_amazon_ad_api-1.1.6 → python_amazon_ad_api-1.1.8}/ad_api/api/sd/__init__.py +0 -0
  59. {python_amazon_ad_api-1.1.6 → python_amazon_ad_api-1.1.8}/ad_api/api/sd/ad_groups.py +0 -0
  60. {python_amazon_ad_api-1.1.6 → python_amazon_ad_api-1.1.8}/ad_api/api/sd/bid_recommendations.py +0 -0
  61. {python_amazon_ad_api-1.1.6 → python_amazon_ad_api-1.1.8}/ad_api/api/sd/brand_safety.py +0 -0
  62. {python_amazon_ad_api-1.1.6 → python_amazon_ad_api-1.1.8}/ad_api/api/sd/budget_rules.py +0 -0
  63. {python_amazon_ad_api-1.1.6 → python_amazon_ad_api-1.1.8}/ad_api/api/sd/campaigns.py +0 -0
  64. {python_amazon_ad_api-1.1.6 → python_amazon_ad_api-1.1.8}/ad_api/api/sd/campaigns_budget_usage.py +0 -0
  65. {python_amazon_ad_api-1.1.6 → python_amazon_ad_api-1.1.8}/ad_api/api/sd/creatives.py +0 -0
  66. {python_amazon_ad_api-1.1.6 → python_amazon_ad_api-1.1.8}/ad_api/api/sd/forecast.py +0 -0
  67. {python_amazon_ad_api-1.1.6 → python_amazon_ad_api-1.1.8}/ad_api/api/sd/negative_product_targeting.py +0 -0
  68. {python_amazon_ad_api-1.1.6 → python_amazon_ad_api-1.1.8}/ad_api/api/sd/product_ads.py +0 -0
  69. {python_amazon_ad_api-1.1.6 → python_amazon_ad_api-1.1.8}/ad_api/api/sd/product_targeting.py +0 -0
  70. {python_amazon_ad_api-1.1.6 → python_amazon_ad_api-1.1.8}/ad_api/api/sd/recommendations.py +0 -0
  71. {python_amazon_ad_api-1.1.6 → python_amazon_ad_api-1.1.8}/ad_api/api/sd/reports.py +0 -0
  72. {python_amazon_ad_api-1.1.6 → python_amazon_ad_api-1.1.8}/ad_api/api/sd/snapshots.py +0 -0
  73. {python_amazon_ad_api-1.1.6 → python_amazon_ad_api-1.1.8}/ad_api/api/sd/targeting_recommendations.py +0 -0
  74. {python_amazon_ad_api-1.1.6 → python_amazon_ad_api-1.1.8}/ad_api/api/sp/__init__.py +0 -0
  75. {python_amazon_ad_api-1.1.6 → python_amazon_ad_api-1.1.8}/ad_api/api/sp/ad_groups_v3.py +0 -0
  76. {python_amazon_ad_api-1.1.6 → python_amazon_ad_api-1.1.8}/ad_api/api/sp/bid_recommendations_v3.py +0 -0
  77. {python_amazon_ad_api-1.1.6 → python_amazon_ad_api-1.1.8}/ad_api/api/sp/budget_initial_recommendation.py +0 -0
  78. {python_amazon_ad_api-1.1.6 → python_amazon_ad_api-1.1.8}/ad_api/api/sp/budget_recommendations.py +0 -0
  79. {python_amazon_ad_api-1.1.6 → python_amazon_ad_api-1.1.8}/ad_api/api/sp/budget_rules.py +0 -0
  80. {python_amazon_ad_api-1.1.6 → python_amazon_ad_api-1.1.8}/ad_api/api/sp/budget_rules_recommendations.py +0 -0
  81. {python_amazon_ad_api-1.1.6 → python_amazon_ad_api-1.1.8}/ad_api/api/sp/campaign_consolidated_recommendations.py +0 -0
  82. {python_amazon_ad_api-1.1.6 → python_amazon_ad_api-1.1.8}/ad_api/api/sp/campaign_negative_keywords_v3.py +0 -0
  83. {python_amazon_ad_api-1.1.6 → python_amazon_ad_api-1.1.8}/ad_api/api/sp/campaign_negative_targets.py +0 -0
  84. {python_amazon_ad_api-1.1.6 → python_amazon_ad_api-1.1.8}/ad_api/api/sp/campaigns_budget_usage.py +0 -0
  85. {python_amazon_ad_api-1.1.6 → python_amazon_ad_api-1.1.8}/ad_api/api/sp/campaigns_v3.py +0 -0
  86. {python_amazon_ad_api-1.1.6 → python_amazon_ad_api-1.1.8}/ad_api/api/sp/campaings_optimization.py +0 -0
  87. {python_amazon_ad_api-1.1.6 → python_amazon_ad_api-1.1.8}/ad_api/api/sp/keywords_v3.py +0 -0
  88. {python_amazon_ad_api-1.1.6 → python_amazon_ad_api-1.1.8}/ad_api/api/sp/negative_keywords_v3.py +0 -0
  89. {python_amazon_ad_api-1.1.6 → python_amazon_ad_api-1.1.8}/ad_api/api/sp/negative_product_targeting_v3.py +0 -0
  90. {python_amazon_ad_api-1.1.6 → python_amazon_ad_api-1.1.8}/ad_api/api/sp/product_ads_v3.py +0 -0
  91. {python_amazon_ad_api-1.1.6 → python_amazon_ad_api-1.1.8}/ad_api/api/sp/product_recommendations.py +0 -0
  92. {python_amazon_ad_api-1.1.6 → python_amazon_ad_api-1.1.8}/ad_api/api/sp/product_targeting_v3.py +0 -0
  93. {python_amazon_ad_api-1.1.6 → python_amazon_ad_api-1.1.8}/ad_api/api/sp/ranked_keywords_recommendations.py +0 -0
  94. {python_amazon_ad_api-1.1.6 → python_amazon_ad_api-1.1.8}/ad_api/api/sp/schedule_based_bid_optimization.py +0 -0
  95. {python_amazon_ad_api-1.1.6 → python_amazon_ad_api-1.1.8}/ad_api/api/stores.py +0 -0
  96. {python_amazon_ad_api-1.1.6 → python_amazon_ad_api-1.1.8}/ad_api/api/stream.py +0 -0
  97. {python_amazon_ad_api-1.1.6 → python_amazon_ad_api-1.1.8}/ad_api/api/v1/__init__.py +0 -0
  98. {python_amazon_ad_api-1.1.6 → python_amazon_ad_api-1.1.8}/ad_api/api/v1/ad_groups.py +0 -0
  99. {python_amazon_ad_api-1.1.6 → python_amazon_ad_api-1.1.8}/ad_api/api/v1/ads.py +0 -0
  100. {python_amazon_ad_api-1.1.6 → python_amazon_ad_api-1.1.8}/ad_api/api/v1/campaigns.py +0 -0
  101. {python_amazon_ad_api-1.1.6 → python_amazon_ad_api-1.1.8}/ad_api/api/v1/targets.py +0 -0
  102. {python_amazon_ad_api-1.1.6 → python_amazon_ad_api-1.1.8}/ad_api/api/validation_configurations.py +0 -0
  103. {python_amazon_ad_api-1.1.6 → python_amazon_ad_api-1.1.8}/ad_api/auth/__init__.py +0 -0
  104. {python_amazon_ad_api-1.1.6 → python_amazon_ad_api-1.1.8}/ad_api/auth/access_token_client.py +0 -0
  105. {python_amazon_ad_api-1.1.6 → python_amazon_ad_api-1.1.8}/ad_api/auth/access_token_response.py +0 -0
  106. {python_amazon_ad_api-1.1.6 → python_amazon_ad_api-1.1.8}/ad_api/auth/credentials.py +0 -0
  107. {python_amazon_ad_api-1.1.6 → python_amazon_ad_api-1.1.8}/ad_api/auth/exceptions.py +0 -0
  108. {python_amazon_ad_api-1.1.6 → python_amazon_ad_api-1.1.8}/ad_api/base/__init__.py +0 -0
  109. {python_amazon_ad_api-1.1.6 → python_amazon_ad_api-1.1.8}/ad_api/base/api_response.py +0 -0
  110. {python_amazon_ad_api-1.1.6 → python_amazon_ad_api-1.1.8}/ad_api/base/base_client.py +0 -0
  111. {python_amazon_ad_api-1.1.6 → python_amazon_ad_api-1.1.8}/ad_api/base/client.py +0 -0
  112. {python_amazon_ad_api-1.1.6 → python_amazon_ad_api-1.1.8}/ad_api/base/config.py +0 -0
  113. {python_amazon_ad_api-1.1.6 → python_amazon_ad_api-1.1.8}/ad_api/base/credential_provider.py +0 -0
  114. {python_amazon_ad_api-1.1.6 → python_amazon_ad_api-1.1.8}/ad_api/base/exceptions.py +0 -0
  115. {python_amazon_ad_api-1.1.6 → python_amazon_ad_api-1.1.8}/ad_api/base/helpers.py +0 -0
  116. {python_amazon_ad_api-1.1.6 → python_amazon_ad_api-1.1.8}/ad_api/base/marketplaces.py +0 -0
  117. {python_amazon_ad_api-1.1.6 → python_amazon_ad_api-1.1.8}/ad_api/base/utils.py +0 -0
  118. {python_amazon_ad_api-1.1.6 → python_amazon_ad_api-1.1.8}/pyproject.toml +0 -0
  119. {python_amazon_ad_api-1.1.6 → python_amazon_ad_api-1.1.8}/python_amazon_ad_api.egg-info/SOURCES.txt +0 -0
  120. {python_amazon_ad_api-1.1.6 → python_amazon_ad_api-1.1.8}/python_amazon_ad_api.egg-info/dependency_links.txt +0 -0
  121. {python_amazon_ad_api-1.1.6 → python_amazon_ad_api-1.1.8}/python_amazon_ad_api.egg-info/requires.txt +0 -0
  122. {python_amazon_ad_api-1.1.6 → python_amazon_ad_api-1.1.8}/python_amazon_ad_api.egg-info/top_level.txt +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: python-amazon-ad-api
3
- Version: 1.1.6
3
+ Version: 1.1.8
4
4
  Summary: Python wrapper for the Amazon Advertising API
5
5
  Home-page: https://github.com/denisneuf/python-amazon-ad-api
6
6
  Author: Daniel Alvaro
@@ -128,6 +128,92 @@ class AdCreativesV4(Client):
128
128
 
129
129
  return self._request(kwargs.pop('path'), data=Utils.convert_body(kwargs.pop('body'), False), params=kwargs, headers=headers)
130
130
 
131
+ @sp_endpoint('/sb/ads/creatives/autoCollection', method='POST')
132
+ def create_auto_collection_ad_creative(self, version: int = 4, **kwargs) -> ApiResponse:
133
+ """
134
+ Creates a new version of an auto collection creative for an existing ad.
135
+
136
+ Request Body [Required]
137
+ | **ads** (array): [required] One entry per ad.
138
+ | **adId** (string): [required] Sponsored Brands ad identifier.
139
+ | **creative** ({}): [required]
140
+ | **brandName** (string): [required]
141
+ | **brandLogoAssetID** (string): [optional]
142
+ | **brandLogoCrop** ({}): [optional] ``top``, ``left``,
143
+ ``width`` and ``height``.
144
+ | **asinExclusions** (array of string): [optional]
145
+
146
+ Returns:
147
+ | ApiResponse
148
+
149
+ .. note::
150
+ This route takes ``application/vnd.sbadresource.v4+json``, the same
151
+ media type as the ads family, not the creative one.
152
+ """
153
+ json_version = 'application/vnd.sbadresource.v' + str(version) + "+json"
154
+ headers = {'Accept': json_version}
155
+
156
+ return self._request(kwargs.pop('path'), data=Utils.convert_body(kwargs.pop('body'), False), params=kwargs, headers=headers)
157
+
158
+ @sp_endpoint('/sb/ads/creatives/manualCollection', method='POST')
159
+ def create_manual_collection_ad_creative(self, version: int = 4, **kwargs) -> ApiResponse:
160
+ """
161
+ Creates a new version of a manual collection creative for an existing ad.
162
+
163
+ Request Body [Required]
164
+ | **ads** (array): [required] One entry per ad, each with ``adId``
165
+ and a ``creative`` block.
166
+
167
+ Returns:
168
+ | ApiResponse
169
+
170
+ .. note::
171
+ Also takes ``application/vnd.sbadresource.v4+json``.
172
+ """
173
+ json_version = 'application/vnd.sbadresource.v' + str(version) + "+json"
174
+ headers = {'Accept': json_version}
175
+
176
+ return self._request(kwargs.pop('path'), data=Utils.convert_body(kwargs.pop('body'), False), params=kwargs, headers=headers)
177
+
178
+ @sp_endpoint('/sb/ads/creatives/productCollectionExtended', method='POST')
179
+ @Utils.deprecated
180
+ def create_new_version_product_collection_extended_ad_creative(self, version: int = 4, **kwargs) -> ApiResponse:
181
+ """
182
+ Creates a new version of an extended product collection creative.
183
+
184
+ This route is flagged deprecated in the 4.0 contract. It still answers on
185
+ the live service, which is why it stays available, but new integrations
186
+ should use ``create_auto_collection_ad_creative`` or
187
+ ``create_manual_collection_ad_creative``.
188
+
189
+ Request Body [Required]
190
+ | **adId** (string): [required] Sponsored Brands ad identifier.
191
+ | **creative** ({}): [required]
192
+ | **asins** (array of string): [required]
193
+ | **brandName** (string): [required]
194
+ | **brandLogoAssetId** (string): [required]
195
+ | **headline** (string): [required]
196
+ | **landingPage** ({}): [optional] ``type``, ``url`` or ``asins``.
197
+ | **brandLogoCrop** ({}): [optional] ``top``, ``left``,
198
+ ``width`` and ``height``.
199
+ | **customImages** (array): [optional] Each with ``assetId``,
200
+ ``url`` and a ``crop``.
201
+ | **consentToTranslate** (boolean): [optional]
202
+
203
+ Returns:
204
+ | ApiResponse
205
+
206
+ .. note::
207
+ Unlike its siblings this route takes a single ``adId`` and
208
+ ``creative``, not an ``ads`` list, and it uses
209
+ ``application/vnd.sbAdCreativeResource.v4+json``. An empty body names
210
+ both required members.
211
+ """
212
+ json_version = 'application/vnd.sbAdCreativeResource.v' + str(version) + "+json"
213
+ headers = {'Accept': json_version}
214
+
215
+ return self._request(kwargs.pop('path'), data=Utils.convert_body(kwargs.pop('body'), False), params=kwargs, headers=headers)
216
+
131
217
  @sp_endpoint('/sb/ads/creatives/list', method='POST')
132
218
  def list_ad_creatives(self, version: int = 4, **kwargs) -> ApiResponse:
133
219
  """
@@ -165,6 +165,85 @@ class AdsV4(Client):
165
165
 
166
166
  return self._request(kwargs.pop('path'), data=Utils.convert_body(kwargs.pop('body'), False), params=kwargs, headers=headers)
167
167
 
168
+ @sp_endpoint('/sb/v4/ads/autoCollection', method='POST')
169
+ def create_auto_collection_ads(self, version: int = 4, **kwargs) -> ApiResponse:
170
+ """
171
+ Creates Sponsored Brands auto collection ads.
172
+
173
+ Request Body [Required]
174
+ | **ads** (array): [required] One entry per ad.
175
+ | **adGroupId** (string): [required] Ad group the ad belongs to.
176
+ | **name** (string): [required] Ad name.
177
+ | **state** (string): [required] ``ENABLED``, ``PAUSED`` or
178
+ ``ARCHIVED``.
179
+ | **creative** ({}): [required]
180
+ | **brandName** (string): [required]
181
+ | **brandLogoAssetID** (string): [optional]
182
+ | **brandLogoCrop** ({}): [optional] ``top``, ``left``,
183
+ ``width`` and ``height``.
184
+ | **asinExclusions** (array of string): [optional]
185
+
186
+ Returns:
187
+ | ApiResponse
188
+
189
+ .. note::
190
+ An empty body answers ``400 INVALID_ARGUMENT`` with
191
+ *"Ad list cannot be empty."*, and ``application/json`` answers
192
+ ``404 Could not find resource``, so the versioned media type is what
193
+ routes the call.
194
+ """
195
+ json_version = 'application/vnd.sbadresource.v' + str(version) + "+json"
196
+ headers = {'Accept': json_version}
197
+
198
+ return self._request(kwargs.pop('path'), data=Utils.convert_body(kwargs.pop('body'), False), params=kwargs, headers=headers)
199
+
200
+ @sp_endpoint('/sb/v4/ads/manualCollection', method='POST')
201
+ def create_manual_collection_ads(self, version: int = 4, **kwargs) -> ApiResponse:
202
+ """
203
+ Creates Sponsored Brands manual collection ads.
204
+
205
+ Request Body [Required]
206
+ | **ads** (array): [required] One entry per ad, each with
207
+ ``adGroupId``, ``name``, ``state`` and a ``creative`` block.
208
+
209
+ Returns:
210
+ | ApiResponse
211
+
212
+ .. note::
213
+ An empty body answers ``400 INVALID_ARGUMENT`` with
214
+ *"Ad list cannot be empty."*
215
+ """
216
+ json_version = 'application/vnd.sbadresource.v' + str(version) + "+json"
217
+ headers = {'Accept': json_version}
218
+
219
+ return self._request(kwargs.pop('path'), data=Utils.convert_body(kwargs.pop('body'), False), params=kwargs, headers=headers)
220
+
221
+ @sp_endpoint('/sb/v4/ads/productCollectionExtended', method='POST')
222
+ @Utils.deprecated
223
+ def create_product_collection_extended_ads(self, version: int = 4, **kwargs) -> ApiResponse:
224
+ """
225
+ Creates Sponsored Brands extended product collection ads.
226
+
227
+ This route is flagged deprecated in the 4.0 contract, together with the
228
+ creative side of the same name. It still answers on the live service,
229
+ which is why it stays available, but new integrations should use
230
+ ``create_auto_collection_ads`` or ``create_manual_collection_ads``.
231
+
232
+ Request Body [Required]
233
+ | **ads** (array): [required] One entry per ad.
234
+
235
+ Returns:
236
+ | ApiResponse
237
+
238
+ .. note::
239
+ An empty body answers ``400 INVALID_ARGUMENT`` with
240
+ *"Ad list cannot be empty."*
241
+ """
242
+ json_version = 'application/vnd.sbadresource.v' + str(version) + "+json"
243
+ headers = {'Accept': json_version}
244
+
245
+ return self._request(kwargs.pop('path'), data=Utils.convert_body(kwargs.pop('body'), False), params=kwargs, headers=headers)
246
+
168
247
  @sp_endpoint('/sb/v4/ads/delete', method='POST')
169
248
  def delete_ads(self, version: int = 4, **kwargs) -> ApiResponse:
170
249
  """
@@ -77,6 +77,34 @@ class CampaignsV4(Client):
77
77
 
78
78
  return self._request(kwargs.pop('path'), data=Utils.convert_body(kwargs.pop('body'), False), params=kwargs, headers=headers)
79
79
 
80
+ @sp_endpoint('/sb/campaigns/insights', method='POST')
81
+ def get_campaign_insights(self, version: int = 4, **kwargs) -> ApiResponse:
82
+ """
83
+ Gets insights for campaign ad groups.
84
+
85
+ Request Body [Required]
86
+ | **adGroups** (array): [required] One entry per ad group.
87
+ | **adFormat** (string): [required] Ad format of the ad group.
88
+ | **keywords** (array): [optional] Each entry needs
89
+ ``keywordText``, ``matchType`` and ``bid``.
90
+
91
+ Returns:
92
+ | ApiResponse, ``200``.
93
+
94
+ .. note::
95
+ This route takes ``application/vnd.sbinsights.v4+json``, not the
96
+ campaigns media type. With ``application/json`` it answers ``404
97
+ Could not find resource``, so the versioned type is what routes it.
98
+
99
+ .. note::
100
+ An empty body answers ``400`` naming ``adGroups``, which is the only
101
+ required member.
102
+ """
103
+ json_version = 'application/vnd.sbinsights.v' + str(version) + "+json"
104
+ headers = {'Accept': json_version}
105
+
106
+ return self._request(kwargs.pop('path'), data=Utils.convert_body(kwargs.pop('body'), False), params=kwargs, headers=headers)
107
+
80
108
  @sp_endpoint('/sb/v4/campaigns/list', method='POST')
81
109
  def list_campaigns(self, version: int = 4, **kwargs) -> ApiResponse:
82
110
  """
@@ -67,6 +67,29 @@ class TargetingCategories(Client):
67
67
  params=kwargs,
68
68
  headers={'Accept': self._MEDIA, 'Content-Type': self._MEDIA})
69
69
 
70
+ @sp_endpoint('/sb/negativeTargets/brands/recommendations', method='GET')
71
+ def list_negative_brand_recommendations(self, **kwargs) -> ApiResponse:
72
+ """
73
+ Gets brand recommendations for negative targeting.
74
+
75
+ Keyword Args
76
+ | query **nextToken** (string): [optional] Pagination token.
77
+
78
+ Returns:
79
+ | ApiResponse, ``200``, with brands under ``brands``, each carrying
80
+ ``brandRefinementId`` and ``name``.
81
+
82
+ Example::
83
+
84
+ {"brands": [{"brandRefinementId": "19897490031", "name": "YEYIAN"}]}
85
+
86
+ .. note::
87
+ Lives here because it shares this class media type. It is the one
88
+ route in this class that is not about the category tree.
89
+ """
90
+ return self._request(kwargs.pop('path'), params=kwargs,
91
+ headers={'Accept': self._MEDIA, 'Content-Type': self._MEDIA})
92
+
70
93
  @sp_endpoint('/sb/targets/products/count', method='POST')
71
94
  def get_product_count(self, category, **kwargs) -> ApiResponse:
72
95
  """
@@ -0,0 +1 @@
1
+ __version__ = "1.1.8"
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: python-amazon-ad-api
3
- Version: 1.1.6
3
+ Version: 1.1.8
4
4
  Summary: Python wrapper for the Amazon Advertising API
5
5
  Home-page: https://github.com/denisneuf/python-amazon-ad-api
6
6
  Author: Daniel Alvaro
@@ -1,6 +1,6 @@
1
1
  [metadata]
2
2
  name = python-amazon-ad-api
3
- version = 1.1.6
3
+ version = 1.1.8
4
4
  author = Daniel Alvaro
5
5
  author_email = denisneuf@hotmail.com
6
6
  description = Python wrapper for the Amazon Advertising API
@@ -2,7 +2,7 @@ from setuptools import setup
2
2
 
3
3
  setup(
4
4
  name='python-amazon-ad-api',
5
- version='1.1.6',
5
+ version='1.1.8',
6
6
  install_requires=[
7
7
  "requests>=2.27.1,<2.35.0",
8
8
  "six>=1.16,<1.18",
@@ -1 +0,0 @@
1
- __version__ = "1.1.6"