python-amazon-ad-api 0.6.5__tar.gz → 0.6.7__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 (135) hide show
  1. {python_amazon_ad_api-0.6.5 → python_amazon_ad_api-0.6.7}/PKG-INFO +3 -2
  2. {python_amazon_ad_api-0.6.5 → python_amazon_ad_api-0.6.7}/README.md +1 -0
  3. {python_amazon_ad_api-0.6.5 → python_amazon_ad_api-0.6.7}/ad_api/api/brand_metrics.py +2 -2
  4. {python_amazon_ad_api-0.6.5 → python_amazon_ad_api-0.6.7}/ad_api/api/dsp/reports.py +2 -2
  5. {python_amazon_ad_api-0.6.5 → python_amazon_ad_api-0.6.7}/ad_api/api/sb/__init__.py +3 -1
  6. {python_amazon_ad_api-0.6.5 → python_amazon_ad_api-0.6.7}/ad_api/api/sb/bid_recommendations.py +2 -2
  7. {python_amazon_ad_api-0.6.5 → python_amazon_ad_api-0.6.7}/ad_api/api/sb/campaigns.py +2 -2
  8. python_amazon_ad_api-0.6.7/ad_api/api/sb/forecast.py +7 -0
  9. {python_amazon_ad_api-0.6.5 → python_amazon_ad_api-0.6.7}/ad_api/api/sb/keywords.py +3 -3
  10. python_amazon_ad_api-0.6.7/ad_api/api/sb/keywords_recommendations.py +7 -0
  11. {python_amazon_ad_api-0.6.5 → python_amazon_ad_api-0.6.7}/ad_api/api/sb/landing_page_asins.py +1 -1
  12. {python_amazon_ad_api-0.6.5 → python_amazon_ad_api-0.6.7}/ad_api/api/sb/media.py +4 -4
  13. {python_amazon_ad_api-0.6.5 → python_amazon_ad_api-0.6.7}/ad_api/api/sb/negative_product_targeting.py +4 -4
  14. {python_amazon_ad_api-0.6.5 → python_amazon_ad_api-0.6.7}/ad_api/api/sb/product_targeting.py +4 -4
  15. python_amazon_ad_api-0.6.7/ad_api/api/sb/recommendations.py +7 -0
  16. {python_amazon_ad_api-0.6.5 → python_amazon_ad_api-0.6.7}/ad_api/api/sb/reports.py +2 -2
  17. {python_amazon_ad_api-0.6.5 → python_amazon_ad_api-0.6.7}/ad_api/api/sb/snapshots.py +1 -1
  18. {python_amazon_ad_api-0.6.5 → python_amazon_ad_api-0.6.7}/ad_api/api/sb/stores.py +2 -2
  19. {python_amazon_ad_api-0.6.5 → python_amazon_ad_api-0.6.7}/ad_api/api/sb/targeting_recommendations.py +4 -4
  20. python_amazon_ad_api-0.6.7/ad_api/api/sb/themes.py +79 -0
  21. {python_amazon_ad_api-0.6.5 → python_amazon_ad_api-0.6.7}/ad_api/api/sd/ad_groups.py +3 -3
  22. {python_amazon_ad_api-0.6.5 → python_amazon_ad_api-0.6.7}/ad_api/api/sd/bid_recommendations.py +2 -2
  23. {python_amazon_ad_api-0.6.5 → python_amazon_ad_api-0.6.7}/ad_api/api/sd/campaigns.py +3 -3
  24. {python_amazon_ad_api-0.6.5 → python_amazon_ad_api-0.6.7}/ad_api/api/sd/creatives.py +1 -1
  25. {python_amazon_ad_api-0.6.5 → python_amazon_ad_api-0.6.7}/ad_api/api/sd/negative_product_targeting.py +3 -3
  26. {python_amazon_ad_api-0.6.5 → python_amazon_ad_api-0.6.7}/ad_api/api/sd/product_ads.py +3 -3
  27. {python_amazon_ad_api-0.6.5 → python_amazon_ad_api-0.6.7}/ad_api/api/sd/product_targeting.py +3 -3
  28. {python_amazon_ad_api-0.6.5 → python_amazon_ad_api-0.6.7}/ad_api/api/sd/reports.py +2 -2
  29. {python_amazon_ad_api-0.6.5 → python_amazon_ad_api-0.6.7}/ad_api/api/sd/snapshots.py +2 -2
  30. {python_amazon_ad_api-0.6.5 → python_amazon_ad_api-0.6.7}/ad_api/api/sd/targeting_recommendations.py +2 -2
  31. {python_amazon_ad_api-0.6.5 → python_amazon_ad_api-0.6.7}/ad_api/api/sp/ad_groups.py +2 -2
  32. {python_amazon_ad_api-0.6.5 → python_amazon_ad_api-0.6.7}/ad_api/api/sp/bid_recommendations.py +3 -3
  33. {python_amazon_ad_api-0.6.5 → python_amazon_ad_api-0.6.7}/ad_api/api/sp/bid_recommendations_v3.py +2 -2
  34. {python_amazon_ad_api-0.6.5 → python_amazon_ad_api-0.6.7}/ad_api/api/sp/campaign_negative_keywords.py +2 -2
  35. {python_amazon_ad_api-0.6.5 → python_amazon_ad_api-0.6.7}/ad_api/api/sp/keywords.py +2 -2
  36. {python_amazon_ad_api-0.6.5 → python_amazon_ad_api-0.6.7}/ad_api/api/sp/negative_keywords.py +2 -2
  37. {python_amazon_ad_api-0.6.5 → python_amazon_ad_api-0.6.7}/ad_api/api/sp/negative_product_targeting.py +2 -2
  38. {python_amazon_ad_api-0.6.5 → python_amazon_ad_api-0.6.7}/ad_api/api/sp/product_ads.py +2 -2
  39. {python_amazon_ad_api-0.6.5 → python_amazon_ad_api-0.6.7}/ad_api/api/sp/product_recommendations.py +2 -2
  40. {python_amazon_ad_api-0.6.5 → python_amazon_ad_api-0.6.7}/ad_api/api/sp/product_targeting.py +6 -6
  41. {python_amazon_ad_api-0.6.5 → python_amazon_ad_api-0.6.7}/ad_api/api/sp/reports.py +1 -1
  42. {python_amazon_ad_api-0.6.5 → python_amazon_ad_api-0.6.7}/ad_api/api/sp/snapshots.py +2 -2
  43. {python_amazon_ad_api-0.6.5 → python_amazon_ad_api-0.6.7}/ad_api/api/sp/suggested_keywords.py +2 -2
  44. python_amazon_ad_api-0.6.7/ad_api/version.py +1 -0
  45. {python_amazon_ad_api-0.6.5 → python_amazon_ad_api-0.6.7}/python_amazon_ad_api.egg-info/PKG-INFO +3 -2
  46. {python_amazon_ad_api-0.6.5 → python_amazon_ad_api-0.6.7}/python_amazon_ad_api.egg-info/SOURCES.txt +1 -0
  47. {python_amazon_ad_api-0.6.5 → python_amazon_ad_api-0.6.7}/python_amazon_ad_api.egg-info/requires.txt +1 -1
  48. {python_amazon_ad_api-0.6.5 → python_amazon_ad_api-0.6.7}/setup.cfg +1 -1
  49. {python_amazon_ad_api-0.6.5 → python_amazon_ad_api-0.6.7}/setup.py +2 -2
  50. python_amazon_ad_api-0.6.5/ad_api/api/sb/forecast.py +0 -7
  51. python_amazon_ad_api-0.6.5/ad_api/api/sb/keywords_recommendations.py +0 -7
  52. python_amazon_ad_api-0.6.5/ad_api/api/sb/recommendations.py +0 -7
  53. python_amazon_ad_api-0.6.5/ad_api/version.py +0 -1
  54. {python_amazon_ad_api-0.6.5 → python_amazon_ad_api-0.6.7}/LICENSE +0 -0
  55. {python_amazon_ad_api-0.6.5 → python_amazon_ad_api-0.6.7}/ad_api/__init__.py +0 -0
  56. {python_amazon_ad_api-0.6.5 → python_amazon_ad_api-0.6.7}/ad_api/api/__init__.py +0 -0
  57. {python_amazon_ad_api-0.6.5 → python_amazon_ad_api-0.6.7}/ad_api/api/account.py +0 -0
  58. {python_amazon_ad_api-0.6.5 → python_amazon_ad_api-0.6.7}/ad_api/api/advertising_test_account.py +0 -0
  59. {python_amazon_ad_api-0.6.5 → python_amazon_ad_api-0.6.7}/ad_api/api/attribution.py +0 -0
  60. {python_amazon_ad_api-0.6.5 → python_amazon_ad_api-0.6.7}/ad_api/api/audiences.py +0 -0
  61. {python_amazon_ad_api-0.6.5 → python_amazon_ad_api-0.6.7}/ad_api/api/billing.py +0 -0
  62. {python_amazon_ad_api-0.6.5 → python_amazon_ad_api-0.6.7}/ad_api/api/creative_assets.py +0 -0
  63. {python_amazon_ad_api-0.6.5 → python_amazon_ad_api-0.6.7}/ad_api/api/dsp/__init__.py +0 -0
  64. {python_amazon_ad_api-0.6.5 → python_amazon_ad_api-0.6.7}/ad_api/api/dsp/access_token_client.py +0 -0
  65. {python_amazon_ad_api-0.6.5 → python_amazon_ad_api-0.6.7}/ad_api/api/dsp/client.py +0 -0
  66. {python_amazon_ad_api-0.6.5 → python_amazon_ad_api-0.6.7}/ad_api/api/dsp/credential_provider.py +0 -0
  67. {python_amazon_ad_api-0.6.5 → python_amazon_ad_api-0.6.7}/ad_api/api/eligibility.py +0 -0
  68. {python_amazon_ad_api-0.6.5 → python_amazon_ad_api-0.6.7}/ad_api/api/exports.py +0 -0
  69. {python_amazon_ad_api-0.6.5 → python_amazon_ad_api-0.6.7}/ad_api/api/history.py +0 -0
  70. {python_amazon_ad_api-0.6.5 → python_amazon_ad_api-0.6.7}/ad_api/api/insights.py +0 -0
  71. {python_amazon_ad_api-0.6.5 → python_amazon_ad_api-0.6.7}/ad_api/api/invoices.py +0 -0
  72. {python_amazon_ad_api-0.6.5 → python_amazon_ad_api-0.6.7}/ad_api/api/localization.py +0 -0
  73. {python_amazon_ad_api-0.6.5 → python_amazon_ad_api-0.6.7}/ad_api/api/manager_accounts.py +0 -0
  74. {python_amazon_ad_api-0.6.5 → python_amazon_ad_api-0.6.7}/ad_api/api/metadata.py +0 -0
  75. {python_amazon_ad_api-0.6.5 → python_amazon_ad_api-0.6.7}/ad_api/api/portfolios.py +0 -0
  76. {python_amazon_ad_api-0.6.5 → python_amazon_ad_api-0.6.7}/ad_api/api/portfolios_v3.py +0 -0
  77. {python_amazon_ad_api-0.6.5 → python_amazon_ad_api-0.6.7}/ad_api/api/profiles.py +0 -0
  78. {python_amazon_ad_api-0.6.5 → python_amazon_ad_api-0.6.7}/ad_api/api/recommendations.py +0 -0
  79. {python_amazon_ad_api-0.6.5 → python_amazon_ad_api-0.6.7}/ad_api/api/reports.py +0 -0
  80. {python_amazon_ad_api-0.6.5 → python_amazon_ad_api-0.6.7}/ad_api/api/sb/ad_creatives_v4.py +0 -0
  81. {python_amazon_ad_api-0.6.5 → python_amazon_ad_api-0.6.7}/ad_api/api/sb/ad_groups.py +0 -0
  82. {python_amazon_ad_api-0.6.5 → python_amazon_ad_api-0.6.7}/ad_api/api/sb/ad_groups_v4.py +0 -0
  83. {python_amazon_ad_api-0.6.5 → python_amazon_ad_api-0.6.7}/ad_api/api/sb/ads_v4.py +0 -0
  84. {python_amazon_ad_api-0.6.5 → python_amazon_ad_api-0.6.7}/ad_api/api/sb/benchmarks.py +0 -0
  85. {python_amazon_ad_api-0.6.5 → python_amazon_ad_api-0.6.7}/ad_api/api/sb/brands.py +0 -0
  86. {python_amazon_ad_api-0.6.5 → python_amazon_ad_api-0.6.7}/ad_api/api/sb/campaigns_v4.py +0 -0
  87. {python_amazon_ad_api-0.6.5 → python_amazon_ad_api-0.6.7}/ad_api/api/sb/moderation.py +0 -0
  88. {python_amazon_ad_api-0.6.5 → python_amazon_ad_api-0.6.7}/ad_api/api/sb/negative_keywords.py +0 -0
  89. {python_amazon_ad_api-0.6.5 → python_amazon_ad_api-0.6.7}/ad_api/api/sd/__init__.py +0 -0
  90. {python_amazon_ad_api-0.6.5 → python_amazon_ad_api-0.6.7}/ad_api/api/sd/brand_safety.py +0 -0
  91. {python_amazon_ad_api-0.6.5 → python_amazon_ad_api-0.6.7}/ad_api/api/sd/budget_rules.py +0 -0
  92. {python_amazon_ad_api-0.6.5 → python_amazon_ad_api-0.6.7}/ad_api/api/sd/campaigns_budget_usage.py +0 -0
  93. {python_amazon_ad_api-0.6.5 → python_amazon_ad_api-0.6.7}/ad_api/api/sd/forecast.py +0 -0
  94. {python_amazon_ad_api-0.6.5 → python_amazon_ad_api-0.6.7}/ad_api/api/sd/recommendations.py +0 -0
  95. {python_amazon_ad_api-0.6.5 → python_amazon_ad_api-0.6.7}/ad_api/api/sp/__init__.py +0 -0
  96. {python_amazon_ad_api-0.6.5 → python_amazon_ad_api-0.6.7}/ad_api/api/sp/ad_groups_v3.py +0 -0
  97. {python_amazon_ad_api-0.6.5 → python_amazon_ad_api-0.6.7}/ad_api/api/sp/budget_initial_recommendation.py +0 -0
  98. {python_amazon_ad_api-0.6.5 → python_amazon_ad_api-0.6.7}/ad_api/api/sp/budget_recommendations.py +0 -0
  99. {python_amazon_ad_api-0.6.5 → python_amazon_ad_api-0.6.7}/ad_api/api/sp/budget_rules.py +0 -0
  100. {python_amazon_ad_api-0.6.5 → python_amazon_ad_api-0.6.7}/ad_api/api/sp/budget_rules_recommendations.py +0 -0
  101. {python_amazon_ad_api-0.6.5 → python_amazon_ad_api-0.6.7}/ad_api/api/sp/campaign_consolidated_recommendations.py +0 -0
  102. {python_amazon_ad_api-0.6.5 → python_amazon_ad_api-0.6.7}/ad_api/api/sp/campaign_negative_keywords_v3.py +0 -0
  103. {python_amazon_ad_api-0.6.5 → python_amazon_ad_api-0.6.7}/ad_api/api/sp/campaign_negative_targets.py +0 -0
  104. {python_amazon_ad_api-0.6.5 → python_amazon_ad_api-0.6.7}/ad_api/api/sp/campaigns.py +0 -0
  105. {python_amazon_ad_api-0.6.5 → python_amazon_ad_api-0.6.7}/ad_api/api/sp/campaigns_budget_usage.py +0 -0
  106. {python_amazon_ad_api-0.6.5 → python_amazon_ad_api-0.6.7}/ad_api/api/sp/campaigns_v3.py +0 -0
  107. {python_amazon_ad_api-0.6.5 → python_amazon_ad_api-0.6.7}/ad_api/api/sp/campaings_optimization.py +0 -0
  108. {python_amazon_ad_api-0.6.5 → python_amazon_ad_api-0.6.7}/ad_api/api/sp/keywords_v3.py +0 -0
  109. {python_amazon_ad_api-0.6.5 → python_amazon_ad_api-0.6.7}/ad_api/api/sp/negative_keywords_v3.py +0 -0
  110. {python_amazon_ad_api-0.6.5 → python_amazon_ad_api-0.6.7}/ad_api/api/sp/negative_product_targeting_v3.py +0 -0
  111. {python_amazon_ad_api-0.6.5 → python_amazon_ad_api-0.6.7}/ad_api/api/sp/product_ads_v3.py +0 -0
  112. {python_amazon_ad_api-0.6.5 → python_amazon_ad_api-0.6.7}/ad_api/api/sp/product_targeting_v3.py +0 -0
  113. {python_amazon_ad_api-0.6.5 → python_amazon_ad_api-0.6.7}/ad_api/api/sp/ranked_keywords_recommendations.py +0 -0
  114. {python_amazon_ad_api-0.6.5 → python_amazon_ad_api-0.6.7}/ad_api/api/sp/schedule_based_bid_optimization.py +0 -0
  115. {python_amazon_ad_api-0.6.5 → python_amazon_ad_api-0.6.7}/ad_api/api/stores.py +0 -0
  116. {python_amazon_ad_api-0.6.5 → python_amazon_ad_api-0.6.7}/ad_api/api/stream.py +0 -0
  117. {python_amazon_ad_api-0.6.5 → python_amazon_ad_api-0.6.7}/ad_api/api/validation_configurations.py +0 -0
  118. {python_amazon_ad_api-0.6.5 → python_amazon_ad_api-0.6.7}/ad_api/auth/__init__.py +0 -0
  119. {python_amazon_ad_api-0.6.5 → python_amazon_ad_api-0.6.7}/ad_api/auth/access_token_client.py +0 -0
  120. {python_amazon_ad_api-0.6.5 → python_amazon_ad_api-0.6.7}/ad_api/auth/access_token_response.py +0 -0
  121. {python_amazon_ad_api-0.6.5 → python_amazon_ad_api-0.6.7}/ad_api/auth/credentials.py +0 -0
  122. {python_amazon_ad_api-0.6.5 → python_amazon_ad_api-0.6.7}/ad_api/auth/exceptions.py +0 -0
  123. {python_amazon_ad_api-0.6.5 → python_amazon_ad_api-0.6.7}/ad_api/base/__init__.py +0 -0
  124. {python_amazon_ad_api-0.6.5 → python_amazon_ad_api-0.6.7}/ad_api/base/api_response.py +0 -0
  125. {python_amazon_ad_api-0.6.5 → python_amazon_ad_api-0.6.7}/ad_api/base/base_client.py +0 -0
  126. {python_amazon_ad_api-0.6.5 → python_amazon_ad_api-0.6.7}/ad_api/base/client.py +0 -0
  127. {python_amazon_ad_api-0.6.5 → python_amazon_ad_api-0.6.7}/ad_api/base/config.py +0 -0
  128. {python_amazon_ad_api-0.6.5 → python_amazon_ad_api-0.6.7}/ad_api/base/credential_provider.py +0 -0
  129. {python_amazon_ad_api-0.6.5 → python_amazon_ad_api-0.6.7}/ad_api/base/exceptions.py +0 -0
  130. {python_amazon_ad_api-0.6.5 → python_amazon_ad_api-0.6.7}/ad_api/base/helpers.py +0 -0
  131. {python_amazon_ad_api-0.6.5 → python_amazon_ad_api-0.6.7}/ad_api/base/marketplaces.py +0 -0
  132. {python_amazon_ad_api-0.6.5 → python_amazon_ad_api-0.6.7}/ad_api/base/utils.py +0 -0
  133. {python_amazon_ad_api-0.6.5 → python_amazon_ad_api-0.6.7}/pyproject.toml +0 -0
  134. {python_amazon_ad_api-0.6.5 → python_amazon_ad_api-0.6.7}/python_amazon_ad_api.egg-info/dependency_links.txt +0 -0
  135. {python_amazon_ad_api-0.6.5 → python_amazon_ad_api-0.6.7}/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: 0.6.5
3
+ Version: 0.6.7
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
@@ -14,7 +14,7 @@ Description-Content-Type: text/markdown
14
14
  License-File: LICENSE
15
15
  Requires-Dist: requests<2.33.0,>=2.27.1
16
16
  Requires-Dist: six<1.18,>=1.16
17
- Requires-Dist: cachetools<6.2,>=5.0
17
+ Requires-Dist: cachetools<6.3,>=5.0
18
18
  Requires-Dist: pycryptodome<3.24,>=3.13
19
19
  Requires-Dist: pytz<2026.0,>=2021.3
20
20
  Requires-Dist: confuse<2.1,>=1.7
@@ -346,6 +346,7 @@ There is a new version 3 of Sponsored Product API, please check the [migration g
346
346
  * [Moderation](https://python-amazon-ad-api.readthedocs.io/en/latest/sb/moderation.html)
347
347
  * [Reports](https://python-amazon-ad-api.readthedocs.io/en/latest/sb/reports.html)
348
348
  * [Snapshots](https://python-amazon-ad-api.readthedocs.io/en/latest/sb/snapshots.html)
349
+ * [Themes](https://python-amazon-ad-api.readthedocs.io/en/latest/sb/themes.html)
349
350
 
350
351
  ### [Modules Available Sponsored Brands 4.0](https://python-amazon-ad-api.readthedocs.io/en/latest/sb_v4.html)
351
352
 
@@ -318,6 +318,7 @@ There is a new version 3 of Sponsored Product API, please check the [migration g
318
318
  * [Moderation](https://python-amazon-ad-api.readthedocs.io/en/latest/sb/moderation.html)
319
319
  * [Reports](https://python-amazon-ad-api.readthedocs.io/en/latest/sb/reports.html)
320
320
  * [Snapshots](https://python-amazon-ad-api.readthedocs.io/en/latest/sb/snapshots.html)
321
+ * [Themes](https://python-amazon-ad-api.readthedocs.io/en/latest/sb/themes.html)
321
322
 
322
323
  ### [Modules Available Sponsored Brands 4.0](https://python-amazon-ad-api.readthedocs.io/en/latest/sb_v4.html)
323
324
 
@@ -1,4 +1,4 @@
1
- from ad_api.base import Client, sp_endpoint, fill_query_params, ApiResponse
1
+ from ad_api.base import Client, sp_endpoint, fill_query_params, ApiResponse, Utils
2
2
 
3
3
 
4
4
  class BrandMetrics(Client):
@@ -26,7 +26,7 @@ class BrandMetrics(Client):
26
26
  ApiResponse
27
27
 
28
28
  """
29
- return self._request(fill_query_params(kwargs.pop('path')), data=kwargs.pop('body'), params=kwargs)
29
+ return self._request(fill_query_params(kwargs.pop('path')), data=Utils.convert_body(kwargs.pop('body'), False), params=kwargs)
30
30
 
31
31
  @sp_endpoint('/insights/brandMetrics/report/{}', method='GET')
32
32
  def get_report(self, reportId, **kwargs) -> ApiResponse:
@@ -1,5 +1,5 @@
1
1
  from ad_api.api.dsp.client import DspClient as Client
2
- from ad_api.base import sp_endpoint, fill_query_params, ApiResponse
2
+ from ad_api.base import sp_endpoint, fill_query_params, ApiResponse, Utils
3
3
 
4
4
 
5
5
  class Reports(Client):
@@ -35,7 +35,7 @@ class Reports(Client):
35
35
  ApiResponse
36
36
  """
37
37
  path = fill_query_params(kwargs.pop('path'), dspAccountId)
38
- return self._request(path, data=kwargs.pop('body'), headers={'Accept': accept}, params=kwargs)
38
+ return self._request(path, data=Utils.convert_body(kwargs.pop('body'), False), headers={'Accept': accept}, params=kwargs)
39
39
 
40
40
  @sp_endpoint('/accounts/{}/dsp/reports/{}', method='GET')
41
41
  def get_report(self, dspAccountId, reportId, accept='application/vnd.dspgetreports.v3+json', **kwargs) -> ApiResponse:
@@ -21,6 +21,7 @@ from .media import Media
21
21
  from .reports import Reports
22
22
  from .snapshots import Snapshots
23
23
  from .benchmarks import Benchmarks
24
+ from .themes import Themes
24
25
 
25
26
  __all__ = [
26
27
  "Brands",
@@ -45,5 +46,6 @@ __all__ = [
45
46
  "Media",
46
47
  "Reports",
47
48
  "Snapshots",
48
- "Benchmarks"
49
+ "Benchmarks",
50
+ "Themes"
49
51
  ]
@@ -1,4 +1,4 @@
1
- from ad_api.base import Client, sp_endpoint, ApiResponse
1
+ from ad_api.base import Client, sp_endpoint, ApiResponse, Utils
2
2
 
3
3
 
4
4
  class BidRecommendations(Client):
@@ -32,4 +32,4 @@ class BidRecommendations(Client):
32
32
 
33
33
  """
34
34
 
35
- return self._request(kwargs.pop('path'), data=kwargs.pop('body'), params=kwargs)
35
+ return self._request(kwargs.pop('path'), data=Utils.convert_body(kwargs.pop('body'), False), params=kwargs)
@@ -86,7 +86,7 @@ class Campaigns(Client):
86
86
 
87
87
  **match_type** (NegativeMatchType): [optional] The negative match type. For more information, see negative keyword match types in the Amazon Advertising support center. Enum:[ negativeExact, negativePhrase ]
88
88
  """
89
- return self._request(kwargs.pop('path'), data=kwargs.pop('body'), params=kwargs)
89
+ return self._request(kwargs.pop('path'), data=Utils.convert_body(kwargs.pop('body'), False), params=kwargs)
90
90
 
91
91
  @sp_endpoint('/sb/campaigns', method='PUT')
92
92
  @Utils.deprecated
@@ -113,7 +113,7 @@ class Campaigns(Client):
113
113
  | **end_date** (EndDate > string) [optional] The YYYYMMDD end date of the campaign. Must be greater than the value specified in the startDate field. If this property is not included in the request, the endDate value is not updated. If set to null, endDate is deleted from the draft campaign. [nullable: true] [pattern: ^\\d{8}$]
114
114
 
115
115
  """
116
- return self._request(kwargs.pop('path'), data=kwargs.pop('body'), params=kwargs)
116
+ return self._request(kwargs.pop('path'), data=Utils.convert_body(kwargs.pop('body'), False), params=kwargs)
117
117
 
118
118
  @sp_endpoint('/sb/campaigns/{}', method='GET')
119
119
  def get_campaign(self, campaignId, **kwargs) -> ApiResponse:
@@ -0,0 +1,7 @@
1
+ from ad_api.base import Client, sp_endpoint, ApiResponse, Utils
2
+
3
+
4
+ class Forecast(Client):
5
+ @sp_endpoint('/sb/campaigns/shopperSegments/forecast', method='POST')
6
+ def list_forecast(self, **kwargs) -> ApiResponse:
7
+ return self._request(kwargs.pop('path'), data=Utils.convert_body(kwargs.pop('body'), False), params=kwargs)
@@ -1,4 +1,4 @@
1
- from ad_api.base import Client, sp_endpoint, fill_query_params, ApiResponse
1
+ from ad_api.base import Client, sp_endpoint, fill_query_params, ApiResponse, Utils
2
2
 
3
3
 
4
4
  class Keywords(Client):
@@ -50,7 +50,7 @@ class Keywords(Client):
50
50
  Returns:
51
51
  | ApiResponse
52
52
  """
53
- return self._request(kwargs.pop('path'), data=kwargs.pop('body'), params=kwargs)
53
+ return self._request(kwargs.pop('path'), data=Utils.convert_body(kwargs.pop('body'), False), params=kwargs)
54
54
 
55
55
  @sp_endpoint('/sb/keywords', method='POST')
56
56
  def create_keywords(self, **kwargs) -> ApiResponse:
@@ -75,7 +75,7 @@ class Keywords(Client):
75
75
  Returns:
76
76
  | ApiResponse
77
77
  """
78
- return self._request(kwargs.pop('path'), data=kwargs.pop('body'), params=kwargs)
78
+ return self._request(kwargs.pop('path'), data=Utils.convert_body(kwargs.pop('body'), False), params=kwargs)
79
79
 
80
80
  @sp_endpoint('/sb/keywords/{}', method='GET')
81
81
  def get_keyword(self, keywordId, **kwargs) -> ApiResponse:
@@ -0,0 +1,7 @@
1
+ from ad_api.base import Client, sp_endpoint, ApiResponse, Utils
2
+
3
+
4
+ class KeywordsRecommendations(Client):
5
+ @sp_endpoint('/sb/recommendations/keyword', method='POST')
6
+ def list_keywords_recommendations(self, **kwargs) -> ApiResponse:
7
+ return self._request(kwargs.pop('path'), data=Utils.convert_body(kwargs.pop('body'), False), params=kwargs)
@@ -1,4 +1,4 @@
1
- from ad_api.base import Client, sp_endpoint, ApiResponse
1
+ from ad_api.base import Client, sp_endpoint, ApiResponse, Utils
2
2
 
3
3
 
4
4
  class PageAsins(Client):
@@ -1,4 +1,4 @@
1
- from ad_api.base import Client, sp_endpoint, ApiResponse
1
+ from ad_api.base import Client, sp_endpoint, ApiResponse, Utils
2
2
 
3
3
 
4
4
  class Media(Client):
@@ -23,12 +23,12 @@ class Media(Client):
23
23
  | ApiResponse
24
24
 
25
25
  """
26
- return self._request(kwargs.pop('path'), data=kwargs.pop('body'), params=kwargs)
26
+ return self._request(kwargs.pop('path'), data=Utils.convert_body(kwargs.pop('body'), False), params=kwargs)
27
27
 
28
28
  @sp_endpoint('/media/complete', method='PUT')
29
29
  def complete_media(self, **kwargs) -> ApiResponse:
30
- return self._request(kwargs.pop('path'), data=kwargs.pop('body'), params=kwargs)
30
+ return self._request(kwargs.pop('path'), data=Utils.convert_body(kwargs.pop('body'), False), params=kwargs)
31
31
 
32
32
  @sp_endpoint('/media/describe', method='GET')
33
33
  def describe_media(self, **kwargs) -> ApiResponse:
34
- return self._request(kwargs.pop('path'), data=kwargs.pop('body'), params=kwargs)
34
+ return self._request(kwargs.pop('path'), data=Utils.convert_body(kwargs.pop('body'), False), params=kwargs)
@@ -1,4 +1,4 @@
1
- from ad_api.base import Client, sp_endpoint, fill_query_params, ApiResponse
1
+ from ad_api.base import Client, sp_endpoint, fill_query_params, ApiResponse, Utils
2
2
 
3
3
 
4
4
  class NegativeTargets(Client):
@@ -28,7 +28,7 @@ class NegativeTargets(Client):
28
28
  Returns:
29
29
  ApiResponse
30
30
  """
31
- return self._request(kwargs.pop('path'), data=kwargs.pop('body'), params=kwargs)
31
+ return self._request(kwargs.pop('path'), data=Utils.convert_body(kwargs.pop('body'), False), params=kwargs)
32
32
 
33
33
  @sp_endpoint('/sb/negativeTargets', method='PUT')
34
34
  def edit_negative_targets(self, **kwargs) -> ApiResponse:
@@ -43,7 +43,7 @@ class NegativeTargets(Client):
43
43
  Returns:
44
44
  ApiResponse
45
45
  """
46
- return self._request(kwargs.pop('path'), data=kwargs.pop('body'), params=kwargs)
46
+ return self._request(kwargs.pop('path'), data=Utils.convert_body(kwargs.pop('body'), False), params=kwargs)
47
47
 
48
48
  @sp_endpoint('/sb/negativeTargets', method='POST')
49
49
  def create_negative_targets(self, **kwargs) -> ApiResponse:
@@ -63,7 +63,7 @@ class NegativeTargets(Client):
63
63
  Returns:
64
64
  ApiResponse
65
65
  """
66
- return self._request(kwargs.pop('path'), data=kwargs.pop('body'), params=kwargs)
66
+ return self._request(kwargs.pop('path'), data=Utils.convert_body(kwargs.pop('body'), False), params=kwargs)
67
67
 
68
68
  @sp_endpoint('/sb/negativeTargets/{}', method='GET')
69
69
  def get_negative_target(self, negativeTargetId, **kwargs) -> ApiResponse:
@@ -1,4 +1,4 @@
1
- from ad_api.base import Client, sp_endpoint, fill_query_params, ApiResponse
1
+ from ad_api.base import Client, sp_endpoint, fill_query_params, ApiResponse, Utils
2
2
 
3
3
 
4
4
  class Targets(Client):
@@ -31,7 +31,7 @@ class Targets(Client):
31
31
  """
32
32
  json_version = 'application/vnd.sblisttargetsresponse.v' + str(version) + "+json"
33
33
  headers = {'Accept': json_version}
34
- return self._request(kwargs.pop('path'), data=kwargs.pop('body'), params=kwargs, headers=headers)
34
+ return self._request(kwargs.pop('path'), data=Utils.convert_body(kwargs.pop('body'), False), params=kwargs, headers=headers)
35
35
 
36
36
  @sp_endpoint('/sb/targets', method='PUT')
37
37
  def edit_products_targets(self, **kwargs) -> ApiResponse:
@@ -49,7 +49,7 @@ class Targets(Client):
49
49
  ApiResponse
50
50
 
51
51
  """
52
- return self._request(kwargs.pop('path'), data=kwargs.pop('body'), params=kwargs)
52
+ return self._request(kwargs.pop('path'), data=Utils.convert_body(kwargs.pop('body'), False), params=kwargs)
53
53
 
54
54
  @sp_endpoint('/sb/targets', method='POST')
55
55
  def create_products_targets(self, **kwargs) -> ApiResponse:
@@ -65,7 +65,7 @@ class Targets(Client):
65
65
  Returns:
66
66
  ApiResponse
67
67
  """
68
- return self._request(kwargs.pop('path'), data=kwargs.pop('body'), params=kwargs)
68
+ return self._request(kwargs.pop('path'), data=Utils.convert_body(kwargs.pop('body'), False), params=kwargs)
69
69
 
70
70
  @sp_endpoint('/sb/targets/{}', method='GET')
71
71
  def get_products_target(self, targetId, **kwargs) -> ApiResponse:
@@ -0,0 +1,7 @@
1
+ from ad_api.base import Client, sp_endpoint, ApiResponse, Utils
2
+
3
+
4
+ class Recommendations(Client):
5
+ @sp_endpoint('/sb​/recommendations​/creative​/headline', method='POST')
6
+ def list_recommendations(self, **kwargs) -> ApiResponse:
7
+ return self._request(kwargs.pop('path'), data=Utils.convert_body(kwargs.pop('body'), False), params=kwargs)
@@ -1,4 +1,4 @@
1
- from ad_api.base import Client, sp_endpoint, fill_query_params, ApiResponse
1
+ from ad_api.base import Client, sp_endpoint, fill_query_params, ApiResponse, Utils
2
2
 
3
3
 
4
4
  class Reports(Client):
@@ -27,7 +27,7 @@ class Reports(Client):
27
27
  ApiResponse
28
28
 
29
29
  """
30
- return self._request(fill_query_params(kwargs.pop('path'), recordType), data=kwargs.pop('body'), params=kwargs)
30
+ return self._request(fill_query_params(kwargs.pop('path'), recordType), data=Utils.convert_body(kwargs.pop('body'), False), params=kwargs)
31
31
 
32
32
  @sp_endpoint('/v2/reports/{}', method='GET')
33
33
  def get_report(self, reportId, **kwargs) -> ApiResponse:
@@ -14,7 +14,7 @@ class Snapshots(Client):
14
14
  Returns:
15
15
  ApiResponse
16
16
  """
17
- return self._request(fill_query_params(kwargs.pop('path'), recordType), data=kwargs.pop('body'), params=kwargs)
17
+ return self._request(fill_query_params(kwargs.pop('path'), recordType), data=Utils.convert_body(kwargs.pop('body'), False), params=kwargs)
18
18
 
19
19
  @sp_endpoint('/v2/hsa/snapshots/{}', method='GET')
20
20
  @Utils.deprecated
@@ -1,4 +1,4 @@
1
- from ad_api.base import Client, sp_endpoint, fill_query_params, ApiResponse
1
+ from ad_api.base import Client, sp_endpoint, fill_query_params, ApiResponse, Utils
2
2
 
3
3
 
4
4
  class Stores(Client):
@@ -41,4 +41,4 @@ class Stores(Client):
41
41
  @sp_endpoint('/stores/assets', method='POST')
42
42
  def create_asset(self, contentDisposition, contentType, **kwargs) -> ApiResponse:
43
43
  headers = {'Content-Disposition': contentDisposition, 'Content-Type': contentType}
44
- return self._request(kwargs.pop('path'), data=kwargs.pop('body'), params=kwargs, headers=headers)
44
+ return self._request(kwargs.pop('path'), data=Utils.convert_body(kwargs.pop('body'), False), params=kwargs, headers=headers)
@@ -1,4 +1,4 @@
1
- from ad_api.base import Client, sp_endpoint, ApiResponse
1
+ from ad_api.base import Client, sp_endpoint, ApiResponse, Utils
2
2
 
3
3
 
4
4
  class TargetsRecommendations(Client):
@@ -21,7 +21,7 @@ class TargetsRecommendations(Client):
21
21
  Returns:
22
22
  ApiResponse
23
23
  """
24
- return self._request(kwargs.pop('path'), data=kwargs.pop('body'), params=kwargs)
24
+ return self._request(kwargs.pop('path'), data=Utils.convert_body(kwargs.pop('body'), False), params=kwargs)
25
25
 
26
26
  @sp_endpoint('/sb/recommendations/targets/category', method='POST')
27
27
  def list_category_targets(self, **kwargs) -> ApiResponse:
@@ -36,7 +36,7 @@ class TargetsRecommendations(Client):
36
36
  Returns:
37
37
  ApiResponse
38
38
  """
39
- return self._request(kwargs.pop('path'), data=kwargs.pop('body'), params=kwargs)
39
+ return self._request(kwargs.pop('path'), data=Utils.convert_body(kwargs.pop('body'), False), params=kwargs)
40
40
 
41
41
  @sp_endpoint('/sb/recommendations/targets/brand', method='POST')
42
42
  def list_brand_targets(self, **kwargs) -> ApiResponse:
@@ -52,4 +52,4 @@ class TargetsRecommendations(Client):
52
52
  Returns:
53
53
  ApiResponse
54
54
  """
55
- return self._request(kwargs.pop('path'), data=kwargs.pop('body'), params=kwargs)
55
+ return self._request(kwargs.pop('path'), data=Utils.convert_body(kwargs.pop('body'), False), params=kwargs)
@@ -0,0 +1,79 @@
1
+ from ad_api.base import Client, sp_endpoint, ApiResponse, Utils
2
+
3
+
4
+ class Themes(Client):
5
+ """
6
+ Amazon Ads API - Sponsored Brands - Theme Targeting
7
+
8
+ Theme targeting automatically targets keywords related to your brand or landing pages.
9
+ """
10
+
11
+ @sp_endpoint('/sb/themes/list', method='POST')
12
+ def list_themes(self, **kwargs) -> ApiResponse:
13
+ r"""
14
+ Gets a list of theme targets associated with the client identifier, filtered by specified criteria.
15
+
16
+ Request Body
17
+ | '**nextToken**': *string*, {'description': 'Token for pagination. Operations that return paginated results include a pagination token in this field.'}
18
+ | '**maxResults**': *number*, {'description': 'Maximum number of results to return. Defaults to API maximum.'}
19
+ | '**campaignIdFilter**': *object*, {'description': 'List of campaign identifiers to filter by (max 100).'}
20
+ | '**adGroupIdFilter**': *object*, {'description': 'List of ad group identifiers to filter by (max 100).'}
21
+ | '**themeIdFilter**': *object*, {'description': 'List of theme target identifiers to filter by (max 100).'}
22
+ | '**stateFilter**': *object*, {'description': 'List of theme target states to filter by. Valid values: enabled, paused, archived. Default: enabled, paused.'}
23
+ | '**themeTypeFilter**': *object*, {'description': 'List of theme types to filter by. Valid values: KEYWORDS_RELATED_TO_YOUR_BRAND, KEYWORDS_RELATED_TO_YOUR_LANDING_PAGES.'}
24
+
25
+ Returns:
26
+ | ApiResponse
27
+ """
28
+ headers = {'Accept': 'application/vnd.sbthemeslistresponse.v3+json'}
29
+ body = Utils.convert_body(kwargs.pop('body'), wrap=False)
30
+ return self._request(kwargs.pop('path'), data=body, params=kwargs, headers=headers)
31
+
32
+ @sp_endpoint('/sb/themes', method='POST')
33
+ def create_themes(self, **kwargs) -> ApiResponse:
34
+ r"""
35
+ Create one or more theme targets.
36
+
37
+ Note that theme targets can be created on multi-adGroup campaigns where campaign serving status is not archived, terminated, rejected, or ended.
38
+ Note that ad group state must not be archived.
39
+ Note that only one target can be created for each themeType per adGroup.
40
+ Note that this operation supports a maximum list size of 100 theme targets.
41
+
42
+ Request Body
43
+ | '**themes**': *array*, {'description': 'List of theme targets to create (max 100).'}
44
+ | '**adGroupId**': *string*, {'description': 'The identifier of the ad group'}
45
+ | '**campaignId**': *string*, {'description': 'The identifier of the campaign'}
46
+ | '**themeType**': *string*, {'description': 'Theme type', 'Enum': 'KEYWORDS_RELATED_TO_YOUR_BRAND, KEYWORDS_RELATED_TO_YOUR_LANDING_PAGES'}
47
+ | '**bid**': *number*, {'description': 'The bid amount'}
48
+
49
+ Returns:
50
+ | ApiResponse
51
+ """
52
+ headers = {'Accept': 'application/vnd.sbthemescreateresponse.v3+json'}
53
+ body = Utils.convert_body(kwargs.pop('body'), wrap=False)
54
+ return self._request(kwargs.pop('path'), data=body, params=kwargs, headers=headers)
55
+
56
+ @sp_endpoint('/sb/themes', method='PUT')
57
+ def update_themes(self, **kwargs) -> ApiResponse:
58
+ r"""
59
+ Updates one or more theme targets.
60
+
61
+ Note that theme targets can be updated on multi-adGroup campaigns where campaign serving status is not archived, terminated, rejected, or ended.
62
+ Note that ad group state must not be archived.
63
+ Note that this operation supports a maximum list size of 100 theme targets.
64
+ Note that bid is only mutable when the corresponding campaign does not have any enabled optimization rule.
65
+
66
+ Request Body
67
+ | '**themes**': *array*, {'description': 'List of theme targets to update (max 100).'}
68
+ | '**themeId**': *string*, {'description': 'The identifier of the theme target'}
69
+ | '**adGroupId**': *string*, {'description': 'The identifier of the ad group'}
70
+ | '**campaignId**': *string*, {'description': 'The identifier of the campaign'}
71
+ | '**state**': *string*, {'description': 'Theme target state', 'Enum': 'enabled, paused, archived'}
72
+ | '**bid**': *number*, {'description': 'The bid amount'}
73
+
74
+ Returns:
75
+ | ApiResponse
76
+ """
77
+ headers = {'Accept': 'application/vnd.sbthemesupdateresponse.v3+json'}
78
+ body = Utils.convert_body(kwargs.pop('body'), wrap=False)
79
+ return self._request(kwargs.pop('path'), data=body, params=kwargs, headers=headers)
@@ -1,4 +1,4 @@
1
- from ad_api.base import Client, sp_endpoint, fill_query_params, ApiResponse
1
+ from ad_api.base import Client, sp_endpoint, fill_query_params, ApiResponse, Utils
2
2
 
3
3
 
4
4
  class AdGroups(Client):
@@ -49,7 +49,7 @@ class AdGroups(Client):
49
49
  ApiResponse
50
50
 
51
51
  """
52
- return self._request(kwargs.pop('path'), data=kwargs.pop('body'), params=kwargs)
52
+ return self._request(kwargs.pop('path'), data=Utils.convert_body(kwargs.pop('body'), False), params=kwargs)
53
53
 
54
54
  @sp_endpoint('/sd/adGroups', method='POST')
55
55
  def create_ad_groups(self, **kwargs) -> ApiResponse:
@@ -71,7 +71,7 @@ class AdGroups(Client):
71
71
  ApiResponse
72
72
 
73
73
  """
74
- return self._request(kwargs.pop('path'), data=kwargs.pop('body'), params=kwargs)
74
+ return self._request(kwargs.pop('path'), data=Utils.convert_body(kwargs.pop('body'), False), params=kwargs)
75
75
 
76
76
  @sp_endpoint('/sd/adGroups/{}', method='GET')
77
77
  def get_ad_group(self, adGroupId, **kwargs) -> ApiResponse:
@@ -1,4 +1,4 @@
1
- from ad_api.base import Client, sp_endpoint, ApiResponse
1
+ from ad_api.base import Client, sp_endpoint, ApiResponse, Utils
2
2
 
3
3
 
4
4
  class BidRecommendations(Client):
@@ -88,4 +88,4 @@ class BidRecommendations(Client):
88
88
  """
89
89
  contentType = 'application/vnd.sdtargetingrecommendations.v3.2+json'
90
90
  headers = {'Content-Type': contentType}
91
- return self._request(kwargs.pop('path'), data=kwargs.pop('body'), params=kwargs, headers=headers)
91
+ return self._request(kwargs.pop('path'), data=Utils.convert_body(kwargs.pop('body'), False), params=kwargs, headers=headers)
@@ -1,4 +1,4 @@
1
- from ad_api.base import Client, sp_endpoint, fill_query_params, ApiResponse
1
+ from ad_api.base import Client, sp_endpoint, fill_query_params, ApiResponse, Utils
2
2
 
3
3
 
4
4
  class Campaigns(Client):
@@ -53,7 +53,7 @@ class Campaigns(Client):
53
53
  ApiResponse
54
54
 
55
55
  """
56
- return self._request(kwargs.pop('path'), data=kwargs.pop('body'), params=kwargs)
56
+ return self._request(kwargs.pop('path'), data=Utils.convert_body(kwargs.pop('body'), False), params=kwargs)
57
57
 
58
58
  @sp_endpoint('/sd/campaigns', method='POST')
59
59
  def create_campaigns(self, **kwargs) -> ApiResponse:
@@ -81,7 +81,7 @@ class Campaigns(Client):
81
81
  ApiResponse
82
82
 
83
83
  """
84
- return self._request(kwargs.pop('path'), data=kwargs.pop('body'), params=kwargs)
84
+ return self._request(kwargs.pop('path'), data=Utils.convert_body(kwargs.pop('body'), False), params=kwargs)
85
85
 
86
86
  @sp_endpoint('/sd/campaigns/{}', method='GET')
87
87
  def get_campaign(self, campaignId, **kwargs) -> ApiResponse:
@@ -171,7 +171,7 @@ class Creatives(Client):
171
171
  Returns
172
172
  ApiResponse
173
173
  """
174
- return self._request(kwargs.pop('path'), data=kwargs.pop('body'), params=kwargs)
174
+ return self._request(kwargs.pop('path'), data=Utils.convert_body(kwargs.pop('body'), False), params=kwargs)
175
175
 
176
176
  @sp_endpoint('/sd/moderation/creatives', method='GET')
177
177
  def list_moderation_creatives(self, **kwargs) -> ApiResponse:
@@ -1,4 +1,4 @@
1
- from ad_api.base import Client, sp_endpoint, fill_query_params, ApiResponse
1
+ from ad_api.base import Client, sp_endpoint, fill_query_params, ApiResponse, Utils
2
2
 
3
3
 
4
4
  class NegativeTargets(Client):
@@ -49,7 +49,7 @@ class NegativeTargets(Client):
49
49
 
50
50
 
51
51
  """
52
- return self._request(kwargs.pop('path'), data=kwargs.pop('body'), params=kwargs)
52
+ return self._request(kwargs.pop('path'), data=Utils.convert_body(kwargs.pop('body'), False), params=kwargs)
53
53
 
54
54
  @sp_endpoint('/sd/negativeTargets', method='POST')
55
55
  def create_negative_targets(self, **kwargs) -> ApiResponse:
@@ -73,7 +73,7 @@ class NegativeTargets(Client):
73
73
 
74
74
 
75
75
  """
76
- return self._request(kwargs.pop('path'), data=kwargs.pop('body'), params=kwargs)
76
+ return self._request(kwargs.pop('path'), data=Utils.convert_body(kwargs.pop('body'), False), params=kwargs)
77
77
 
78
78
  @sp_endpoint('/sd/negativeTargets/{}', method='GET')
79
79
  def get_negative_target(self, targetId, **kwargs) -> ApiResponse:
@@ -1,4 +1,4 @@
1
- from ad_api.base import Client, sp_endpoint, fill_query_params, ApiResponse
1
+ from ad_api.base import Client, sp_endpoint, fill_query_params, ApiResponse, Utils
2
2
 
3
3
 
4
4
  class ProductAds(Client):
@@ -51,7 +51,7 @@ class ProductAds(Client):
51
51
  ApiResponse
52
52
 
53
53
  """
54
- return self._request(kwargs.pop('path'), data=kwargs.pop('body'), params=kwargs)
54
+ return self._request(kwargs.pop('path'), data=Utils.convert_body(kwargs.pop('body'), False), params=kwargs)
55
55
 
56
56
  @sp_endpoint('/sd/productAds', method='POST')
57
57
  def create_product_ads(self, **kwargs) -> ApiResponse:
@@ -73,7 +73,7 @@ class ProductAds(Client):
73
73
  ApiResponse
74
74
 
75
75
  """
76
- return self._request(kwargs.pop('path'), data=kwargs.pop('body'), params=kwargs)
76
+ return self._request(kwargs.pop('path'), data=Utils.convert_body(kwargs.pop('body'), False), params=kwargs)
77
77
 
78
78
  @sp_endpoint('/sd/productAds/{}', method='GET')
79
79
  def get_product_ad(self, adId, **kwargs) -> ApiResponse:
@@ -1,4 +1,4 @@
1
- from ad_api.base import Client, sp_endpoint, fill_query_params, ApiResponse
1
+ from ad_api.base import Client, sp_endpoint, fill_query_params, ApiResponse, Utils
2
2
 
3
3
 
4
4
  class Targets(Client):
@@ -115,7 +115,7 @@ class Targets(Client):
115
115
 
116
116
 
117
117
  """
118
- return self._request(kwargs.pop('path'), data=kwargs.pop('body'), params=kwargs)
118
+ return self._request(kwargs.pop('path'), data=Utils.convert_body(kwargs.pop('body'), False), params=kwargs)
119
119
 
120
120
  @sp_endpoint('/sd/targets', method='PUT')
121
121
  def edit_products_targets(self, **kwargs) -> ApiResponse:
@@ -133,7 +133,7 @@ class Targets(Client):
133
133
  ApiResponse
134
134
 
135
135
  """
136
- return self._request(kwargs.pop('path'), data=kwargs.pop('body'), params=kwargs)
136
+ return self._request(kwargs.pop('path'), data=Utils.convert_body(kwargs.pop('body'), False), params=kwargs)
137
137
 
138
138
  @sp_endpoint('/sd/targets/{}', method='GET')
139
139
  def get_products_target(self, targetId, **kwargs) -> ApiResponse:
@@ -1,4 +1,4 @@
1
- from ad_api.base import Client, sp_endpoint, fill_query_params, ApiResponse
1
+ from ad_api.base import Client, sp_endpoint, fill_query_params, ApiResponse, Utils
2
2
 
3
3
 
4
4
  class Reports(Client):
@@ -38,7 +38,7 @@ class Reports(Client):
38
38
  ApiResponse
39
39
 
40
40
  """
41
- return self._request(fill_query_params(kwargs.pop('path'), recordType), data=kwargs.pop('body'), params=kwargs)
41
+ return self._request(fill_query_params(kwargs.pop('path'), recordType), data=Utils.convert_body(kwargs.pop('body'), False), params=kwargs)
42
42
 
43
43
  @sp_endpoint('/v2/reports/{}', method='GET')
44
44
  def get_report(self, reportId, **kwargs) -> ApiResponse:
@@ -1,4 +1,4 @@
1
- from ad_api.base import Client, sp_endpoint, fill_query_params, ApiResponse
1
+ from ad_api.base import Client, sp_endpoint, fill_query_params, ApiResponse, Utils
2
2
 
3
3
 
4
4
  class Snapshots(Client):
@@ -13,7 +13,7 @@ class Snapshots(Client):
13
13
  Returns:
14
14
  ApiResponse
15
15
  """
16
- return self._request(fill_query_params(kwargs.pop('path'), recordType), data=kwargs.pop('body'), params=kwargs)
16
+ return self._request(fill_query_params(kwargs.pop('path'), recordType), data=Utils.convert_body(kwargs.pop('body'), False), params=kwargs)
17
17
 
18
18
  @sp_endpoint('/sd/snapshots/{}', method='GET')
19
19
  def get_snapshot(self, snapshotId, **kwargs) -> ApiResponse:
@@ -1,4 +1,4 @@
1
- from ad_api.base import Client, sp_endpoint, ApiResponse
1
+ from ad_api.base import Client, sp_endpoint, ApiResponse, Utils
2
2
 
3
3
 
4
4
  class TargetsRecommendations(Client):
@@ -46,4 +46,4 @@ class TargetsRecommendations(Client):
46
46
  """
47
47
  contentType = 'application/vnd.sdtargetingrecommendations.v3.1+json'
48
48
  headers = {'Content-Type': contentType}
49
- return self._request(kwargs.pop('path'), data=kwargs.pop('body'), params=kwargs, headers=headers)
49
+ return self._request(kwargs.pop('path'), data=Utils.convert_body(kwargs.pop('body'), False), params=kwargs, headers=headers)
@@ -23,7 +23,7 @@ class AdGroups(Client):
23
23
  ApiResponse
24
24
 
25
25
  """
26
- return self._request(kwargs.pop('path'), data=kwargs.pop('body'), params=kwargs)
26
+ return self._request(kwargs.pop('path'), data=Utils.convert_body(kwargs.pop('body'), False), params=kwargs)
27
27
 
28
28
  @sp_endpoint('/v2/sp/adGroups', method='PUT')
29
29
  @Utils.deprecated
@@ -45,7 +45,7 @@ class AdGroups(Client):
45
45
  ApiResponse
46
46
 
47
47
  """
48
- return self._request(kwargs.pop('path'), data=kwargs.pop('body'), params=kwargs)
48
+ return self._request(kwargs.pop('path'), data=Utils.convert_body(kwargs.pop('body'), False), params=kwargs)
49
49
 
50
50
  @sp_endpoint('/v2/sp/adGroups', method='GET')
51
51
  @Utils.deprecated