python-amazon-ad-api 1.7.0__tar.gz → 1.8.1__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 (141) hide show
  1. {python_amazon_ad_api-1.7.0 → python_amazon_ad_api-1.8.1}/PKG-INFO +3 -3
  2. {python_amazon_ad_api-1.7.0 → python_amazon_ad_api-1.8.1}/ad_api/api/portfolios_v3.py +15 -1
  3. {python_amazon_ad_api-1.7.0 → python_amazon_ad_api-1.8.1}/ad_api/api/v1/__init__.py +2 -0
  4. python_amazon_ad_api-1.8.1/ad_api/api/v1/portfolios.py +168 -0
  5. {python_amazon_ad_api-1.7.0 → python_amazon_ad_api-1.8.1}/ad_api/api/v1/recommendations.py +11 -2
  6. python_amazon_ad_api-1.8.1/ad_api/version.py +1 -0
  7. {python_amazon_ad_api-1.7.0 → python_amazon_ad_api-1.8.1}/python_amazon_ad_api.egg-info/PKG-INFO +3 -3
  8. {python_amazon_ad_api-1.7.0 → python_amazon_ad_api-1.8.1}/python_amazon_ad_api.egg-info/SOURCES.txt +1 -0
  9. {python_amazon_ad_api-1.7.0 → python_amazon_ad_api-1.8.1}/python_amazon_ad_api.egg-info/requires.txt +2 -2
  10. {python_amazon_ad_api-1.7.0 → python_amazon_ad_api-1.8.1}/setup.cfg +1 -1
  11. {python_amazon_ad_api-1.7.0 → python_amazon_ad_api-1.8.1}/setup.py +3 -3
  12. python_amazon_ad_api-1.7.0/ad_api/version.py +0 -1
  13. {python_amazon_ad_api-1.7.0 → python_amazon_ad_api-1.8.1}/LICENSE +0 -0
  14. {python_amazon_ad_api-1.7.0 → python_amazon_ad_api-1.8.1}/README.md +0 -0
  15. {python_amazon_ad_api-1.7.0 → python_amazon_ad_api-1.8.1}/ad_api/__init__.py +0 -0
  16. {python_amazon_ad_api-1.7.0 → python_amazon_ad_api-1.8.1}/ad_api/api/__init__.py +0 -0
  17. {python_amazon_ad_api-1.7.0 → python_amazon_ad_api-1.8.1}/ad_api/api/account.py +0 -0
  18. {python_amazon_ad_api-1.7.0 → python_amazon_ad_api-1.8.1}/ad_api/api/account_budgets.py +0 -0
  19. {python_amazon_ad_api-1.7.0 → python_amazon_ad_api-1.8.1}/ad_api/api/advertising_test_account.py +0 -0
  20. {python_amazon_ad_api-1.7.0 → python_amazon_ad_api-1.8.1}/ad_api/api/attribution.py +0 -0
  21. {python_amazon_ad_api-1.7.0 → python_amazon_ad_api-1.8.1}/ad_api/api/audiences.py +0 -0
  22. {python_amazon_ad_api-1.7.0 → python_amazon_ad_api-1.8.1}/ad_api/api/billing.py +0 -0
  23. {python_amazon_ad_api-1.7.0 → python_amazon_ad_api-1.8.1}/ad_api/api/brand_metrics.py +0 -0
  24. {python_amazon_ad_api-1.7.0 → python_amazon_ad_api-1.8.1}/ad_api/api/creative_assets.py +0 -0
  25. {python_amazon_ad_api-1.7.0 → python_amazon_ad_api-1.8.1}/ad_api/api/eligibility.py +0 -0
  26. {python_amazon_ad_api-1.7.0 → python_amazon_ad_api-1.8.1}/ad_api/api/exports.py +0 -0
  27. {python_amazon_ad_api-1.7.0 → python_amazon_ad_api-1.8.1}/ad_api/api/history.py +0 -0
  28. {python_amazon_ad_api-1.7.0 → python_amazon_ad_api-1.8.1}/ad_api/api/insights.py +0 -0
  29. {python_amazon_ad_api-1.7.0 → python_amazon_ad_api-1.8.1}/ad_api/api/invoices.py +0 -0
  30. {python_amazon_ad_api-1.7.0 → python_amazon_ad_api-1.8.1}/ad_api/api/localization.py +0 -0
  31. {python_amazon_ad_api-1.7.0 → python_amazon_ad_api-1.8.1}/ad_api/api/manager_accounts.py +0 -0
  32. {python_amazon_ad_api-1.7.0 → python_amazon_ad_api-1.8.1}/ad_api/api/metadata.py +0 -0
  33. {python_amazon_ad_api-1.7.0 → python_amazon_ad_api-1.8.1}/ad_api/api/portfolios.py +0 -0
  34. {python_amazon_ad_api-1.7.0 → python_amazon_ad_api-1.8.1}/ad_api/api/profiles.py +0 -0
  35. {python_amazon_ad_api-1.7.0 → python_amazon_ad_api-1.8.1}/ad_api/api/recommendations.py +0 -0
  36. {python_amazon_ad_api-1.7.0 → python_amazon_ad_api-1.8.1}/ad_api/api/reports.py +0 -0
  37. {python_amazon_ad_api-1.7.0 → python_amazon_ad_api-1.8.1}/ad_api/api/sb/__init__.py +0 -0
  38. {python_amazon_ad_api-1.7.0 → python_amazon_ad_api-1.8.1}/ad_api/api/sb/ad_creatives_v4.py +0 -0
  39. {python_amazon_ad_api-1.7.0 → python_amazon_ad_api-1.8.1}/ad_api/api/sb/ad_groups.py +0 -0
  40. {python_amazon_ad_api-1.7.0 → python_amazon_ad_api-1.8.1}/ad_api/api/sb/ad_groups_v4.py +0 -0
  41. {python_amazon_ad_api-1.7.0 → python_amazon_ad_api-1.8.1}/ad_api/api/sb/ads_v4.py +0 -0
  42. {python_amazon_ad_api-1.7.0 → python_amazon_ad_api-1.8.1}/ad_api/api/sb/benchmarks.py +0 -0
  43. {python_amazon_ad_api-1.7.0 → python_amazon_ad_api-1.8.1}/ad_api/api/sb/bid_recommendations.py +0 -0
  44. {python_amazon_ad_api-1.7.0 → python_amazon_ad_api-1.8.1}/ad_api/api/sb/brands.py +0 -0
  45. {python_amazon_ad_api-1.7.0 → python_amazon_ad_api-1.8.1}/ad_api/api/sb/budget_rules.py +0 -0
  46. {python_amazon_ad_api-1.7.0 → python_amazon_ad_api-1.8.1}/ad_api/api/sb/campaigns.py +0 -0
  47. {python_amazon_ad_api-1.7.0 → python_amazon_ad_api-1.8.1}/ad_api/api/sb/campaigns_v4.py +0 -0
  48. {python_amazon_ad_api-1.7.0 → python_amazon_ad_api-1.8.1}/ad_api/api/sb/forecast.py +0 -0
  49. {python_amazon_ad_api-1.7.0 → python_amazon_ad_api-1.8.1}/ad_api/api/sb/keywords.py +0 -0
  50. {python_amazon_ad_api-1.7.0 → python_amazon_ad_api-1.8.1}/ad_api/api/sb/keywords_recommendations.py +0 -0
  51. {python_amazon_ad_api-1.7.0 → python_amazon_ad_api-1.8.1}/ad_api/api/sb/landing_page_asins.py +0 -0
  52. {python_amazon_ad_api-1.7.0 → python_amazon_ad_api-1.8.1}/ad_api/api/sb/media.py +0 -0
  53. {python_amazon_ad_api-1.7.0 → python_amazon_ad_api-1.8.1}/ad_api/api/sb/migration.py +0 -0
  54. {python_amazon_ad_api-1.7.0 → python_amazon_ad_api-1.8.1}/ad_api/api/sb/negative_keywords.py +0 -0
  55. {python_amazon_ad_api-1.7.0 → python_amazon_ad_api-1.8.1}/ad_api/api/sb/negative_product_targeting.py +0 -0
  56. {python_amazon_ad_api-1.7.0 → python_amazon_ad_api-1.8.1}/ad_api/api/sb/optimization_rules.py +0 -0
  57. {python_amazon_ad_api-1.7.0 → python_amazon_ad_api-1.8.1}/ad_api/api/sb/product_targeting.py +0 -0
  58. {python_amazon_ad_api-1.7.0 → python_amazon_ad_api-1.8.1}/ad_api/api/sb/recommendations.py +0 -0
  59. {python_amazon_ad_api-1.7.0 → python_amazon_ad_api-1.8.1}/ad_api/api/sb/reports.py +0 -0
  60. {python_amazon_ad_api-1.7.0 → python_amazon_ad_api-1.8.1}/ad_api/api/sb/stores.py +0 -0
  61. {python_amazon_ad_api-1.7.0 → python_amazon_ad_api-1.8.1}/ad_api/api/sb/targeting_categories.py +0 -0
  62. {python_amazon_ad_api-1.7.0 → python_amazon_ad_api-1.8.1}/ad_api/api/sb/targeting_recommendations.py +0 -0
  63. {python_amazon_ad_api-1.7.0 → python_amazon_ad_api-1.8.1}/ad_api/api/sb/themes.py +0 -0
  64. {python_amazon_ad_api-1.7.0 → python_amazon_ad_api-1.8.1}/ad_api/api/sd/__init__.py +0 -0
  65. {python_amazon_ad_api-1.7.0 → python_amazon_ad_api-1.8.1}/ad_api/api/sd/ad_groups.py +0 -0
  66. {python_amazon_ad_api-1.7.0 → python_amazon_ad_api-1.8.1}/ad_api/api/sd/bid_recommendations.py +0 -0
  67. {python_amazon_ad_api-1.7.0 → python_amazon_ad_api-1.8.1}/ad_api/api/sd/brand_safety.py +0 -0
  68. {python_amazon_ad_api-1.7.0 → python_amazon_ad_api-1.8.1}/ad_api/api/sd/budget_rules.py +0 -0
  69. {python_amazon_ad_api-1.7.0 → python_amazon_ad_api-1.8.1}/ad_api/api/sd/campaigns.py +0 -0
  70. {python_amazon_ad_api-1.7.0 → python_amazon_ad_api-1.8.1}/ad_api/api/sd/campaigns_budget_usage.py +0 -0
  71. {python_amazon_ad_api-1.7.0 → python_amazon_ad_api-1.8.1}/ad_api/api/sd/creatives.py +0 -0
  72. {python_amazon_ad_api-1.7.0 → python_amazon_ad_api-1.8.1}/ad_api/api/sd/forecast.py +0 -0
  73. {python_amazon_ad_api-1.7.0 → python_amazon_ad_api-1.8.1}/ad_api/api/sd/negative_product_targeting.py +0 -0
  74. {python_amazon_ad_api-1.7.0 → python_amazon_ad_api-1.8.1}/ad_api/api/sd/product_ads.py +0 -0
  75. {python_amazon_ad_api-1.7.0 → python_amazon_ad_api-1.8.1}/ad_api/api/sd/product_targeting.py +0 -0
  76. {python_amazon_ad_api-1.7.0 → python_amazon_ad_api-1.8.1}/ad_api/api/sd/recommendations.py +0 -0
  77. {python_amazon_ad_api-1.7.0 → python_amazon_ad_api-1.8.1}/ad_api/api/sd/reports.py +0 -0
  78. {python_amazon_ad_api-1.7.0 → python_amazon_ad_api-1.8.1}/ad_api/api/sd/snapshots.py +0 -0
  79. {python_amazon_ad_api-1.7.0 → python_amazon_ad_api-1.8.1}/ad_api/api/sd/targeting_recommendations.py +0 -0
  80. {python_amazon_ad_api-1.7.0 → python_amazon_ad_api-1.8.1}/ad_api/api/sp/__init__.py +0 -0
  81. {python_amazon_ad_api-1.7.0 → python_amazon_ad_api-1.8.1}/ad_api/api/sp/ad_groups_v3.py +0 -0
  82. {python_amazon_ad_api-1.7.0 → python_amazon_ad_api-1.8.1}/ad_api/api/sp/bid_recommendations_v3.py +0 -0
  83. {python_amazon_ad_api-1.7.0 → python_amazon_ad_api-1.8.1}/ad_api/api/sp/budget_initial_recommendation.py +0 -0
  84. {python_amazon_ad_api-1.7.0 → python_amazon_ad_api-1.8.1}/ad_api/api/sp/budget_recommendations.py +0 -0
  85. {python_amazon_ad_api-1.7.0 → python_amazon_ad_api-1.8.1}/ad_api/api/sp/budget_rules.py +0 -0
  86. {python_amazon_ad_api-1.7.0 → python_amazon_ad_api-1.8.1}/ad_api/api/sp/budget_rules_recommendations.py +0 -0
  87. {python_amazon_ad_api-1.7.0 → python_amazon_ad_api-1.8.1}/ad_api/api/sp/campaign_consolidated_recommendations.py +0 -0
  88. {python_amazon_ad_api-1.7.0 → python_amazon_ad_api-1.8.1}/ad_api/api/sp/campaign_negative_keywords_v3.py +0 -0
  89. {python_amazon_ad_api-1.7.0 → python_amazon_ad_api-1.8.1}/ad_api/api/sp/campaign_negative_targets.py +0 -0
  90. {python_amazon_ad_api-1.7.0 → python_amazon_ad_api-1.8.1}/ad_api/api/sp/campaigns_budget_usage.py +0 -0
  91. {python_amazon_ad_api-1.7.0 → python_amazon_ad_api-1.8.1}/ad_api/api/sp/campaigns_v3.py +0 -0
  92. {python_amazon_ad_api-1.7.0 → python_amazon_ad_api-1.8.1}/ad_api/api/sp/campaings_optimization.py +0 -0
  93. {python_amazon_ad_api-1.7.0 → python_amazon_ad_api-1.8.1}/ad_api/api/sp/keywords_v3.py +0 -0
  94. {python_amazon_ad_api-1.7.0 → python_amazon_ad_api-1.8.1}/ad_api/api/sp/negative_keywords_v3.py +0 -0
  95. {python_amazon_ad_api-1.7.0 → python_amazon_ad_api-1.8.1}/ad_api/api/sp/negative_product_targeting_v3.py +0 -0
  96. {python_amazon_ad_api-1.7.0 → python_amazon_ad_api-1.8.1}/ad_api/api/sp/product_ads_v3.py +0 -0
  97. {python_amazon_ad_api-1.7.0 → python_amazon_ad_api-1.8.1}/ad_api/api/sp/product_recommendations.py +0 -0
  98. {python_amazon_ad_api-1.7.0 → python_amazon_ad_api-1.8.1}/ad_api/api/sp/product_targeting_v3.py +0 -0
  99. {python_amazon_ad_api-1.7.0 → python_amazon_ad_api-1.8.1}/ad_api/api/sp/ranked_keywords_recommendations.py +0 -0
  100. {python_amazon_ad_api-1.7.0 → python_amazon_ad_api-1.8.1}/ad_api/api/sp/schedule_based_bid_optimization.py +0 -0
  101. {python_amazon_ad_api-1.7.0 → python_amazon_ad_api-1.8.1}/ad_api/api/stores.py +0 -0
  102. {python_amazon_ad_api-1.7.0 → python_amazon_ad_api-1.8.1}/ad_api/api/stream.py +0 -0
  103. {python_amazon_ad_api-1.7.0 → python_amazon_ad_api-1.8.1}/ad_api/api/v1/ad_associations.py +0 -0
  104. {python_amazon_ad_api-1.7.0 → python_amazon_ad_api-1.8.1}/ad_api/api/v1/ad_extensions.py +0 -0
  105. {python_amazon_ad_api-1.7.0 → python_amazon_ad_api-1.8.1}/ad_api/api/v1/ad_groups.py +0 -0
  106. {python_amazon_ad_api-1.7.0 → python_amazon_ad_api-1.8.1}/ad_api/api/v1/ads.py +0 -0
  107. {python_amazon_ad_api-1.7.0 → python_amazon_ad_api-1.8.1}/ad_api/api/v1/advertiser_accounts.py +0 -0
  108. {python_amazon_ad_api-1.7.0 → python_amazon_ad_api-1.8.1}/ad_api/api/v1/brand_store_edition_publish_versions.py +0 -0
  109. {python_amazon_ad_api-1.7.0 → python_amazon_ad_api-1.8.1}/ad_api/api/v1/brand_store_editions.py +0 -0
  110. {python_amazon_ad_api-1.7.0 → python_amazon_ad_api-1.8.1}/ad_api/api/v1/brand_store_pages.py +0 -0
  111. {python_amazon_ad_api-1.7.0 → python_amazon_ad_api-1.8.1}/ad_api/api/v1/brand_stores.py +0 -0
  112. {python_amazon_ad_api-1.7.0 → python_amazon_ad_api-1.8.1}/ad_api/api/v1/campaigns.py +0 -0
  113. {python_amazon_ad_api-1.7.0 → python_amazon_ad_api-1.8.1}/ad_api/api/v1/geo_locations.py +0 -0
  114. {python_amazon_ad_api-1.7.0 → python_amazon_ad_api-1.8.1}/ad_api/api/v1/label_object_associations.py +0 -0
  115. {python_amazon_ad_api-1.7.0 → python_amazon_ad_api-1.8.1}/ad_api/api/v1/labels.py +0 -0
  116. {python_amazon_ad_api-1.7.0 → python_amazon_ad_api-1.8.1}/ad_api/api/v1/location_indexes.py +0 -0
  117. {python_amazon_ad_api-1.7.0 → python_amazon_ad_api-1.8.1}/ad_api/api/v1/manager_accounts.py +0 -0
  118. {python_amazon_ad_api-1.7.0 → python_amazon_ad_api-1.8.1}/ad_api/api/v1/recommendation_types.py +0 -0
  119. {python_amazon_ad_api-1.7.0 → python_amazon_ad_api-1.8.1}/ad_api/api/v1/reports.py +0 -0
  120. {python_amazon_ad_api-1.7.0 → python_amazon_ad_api-1.8.1}/ad_api/api/v1/selling_accounts.py +0 -0
  121. {python_amazon_ad_api-1.7.0 → python_amazon_ad_api-1.8.1}/ad_api/api/v1/targets.py +0 -0
  122. {python_amazon_ad_api-1.7.0 → python_amazon_ad_api-1.8.1}/ad_api/api/validation_configurations.py +0 -0
  123. {python_amazon_ad_api-1.7.0 → python_amazon_ad_api-1.8.1}/ad_api/auth/__init__.py +0 -0
  124. {python_amazon_ad_api-1.7.0 → python_amazon_ad_api-1.8.1}/ad_api/auth/access_token_client.py +0 -0
  125. {python_amazon_ad_api-1.7.0 → python_amazon_ad_api-1.8.1}/ad_api/auth/access_token_response.py +0 -0
  126. {python_amazon_ad_api-1.7.0 → python_amazon_ad_api-1.8.1}/ad_api/auth/credentials.py +0 -0
  127. {python_amazon_ad_api-1.7.0 → python_amazon_ad_api-1.8.1}/ad_api/auth/exceptions.py +0 -0
  128. {python_amazon_ad_api-1.7.0 → python_amazon_ad_api-1.8.1}/ad_api/base/__init__.py +0 -0
  129. {python_amazon_ad_api-1.7.0 → python_amazon_ad_api-1.8.1}/ad_api/base/api_response.py +0 -0
  130. {python_amazon_ad_api-1.7.0 → python_amazon_ad_api-1.8.1}/ad_api/base/client.py +0 -0
  131. {python_amazon_ad_api-1.7.0 → python_amazon_ad_api-1.8.1}/ad_api/base/config.py +0 -0
  132. {python_amazon_ad_api-1.7.0 → python_amazon_ad_api-1.8.1}/ad_api/base/credential_provider.py +0 -0
  133. {python_amazon_ad_api-1.7.0 → python_amazon_ad_api-1.8.1}/ad_api/base/exceptions.py +0 -0
  134. {python_amazon_ad_api-1.7.0 → python_amazon_ad_api-1.8.1}/ad_api/base/helpers.py +0 -0
  135. {python_amazon_ad_api-1.7.0 → python_amazon_ad_api-1.8.1}/ad_api/base/marketplaces.py +0 -0
  136. {python_amazon_ad_api-1.7.0 → python_amazon_ad_api-1.8.1}/ad_api/base/utils.py +0 -0
  137. {python_amazon_ad_api-1.7.0 → python_amazon_ad_api-1.8.1}/ad_api/shared/__init__.py +0 -0
  138. {python_amazon_ad_api-1.7.0 → python_amazon_ad_api-1.8.1}/ad_api/shared/base_client.py +0 -0
  139. {python_amazon_ad_api-1.7.0 → python_amazon_ad_api-1.8.1}/pyproject.toml +0 -0
  140. {python_amazon_ad_api-1.7.0 → python_amazon_ad_api-1.8.1}/python_amazon_ad_api.egg-info/dependency_links.txt +0 -0
  141. {python_amazon_ad_api-1.7.0 → python_amazon_ad_api-1.8.1}/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.7.0
3
+ Version: 1.8.1
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,8 +14,8 @@ Description-Content-Type: text/markdown
14
14
  License-File: LICENSE
15
15
  Requires-Dist: requests<2.35.0,>=2.27.1
16
16
  Requires-Dist: six<1.18,>=1.16
17
- Requires-Dist: cachetools<7.3,>=5.0
18
- Requires-Dist: pycryptodome<4.3,>=3.13
17
+ Requires-Dist: cachetools<8.1,>=5.0
18
+ Requires-Dist: pycryptodome<4.5,>=3.13
19
19
  Requires-Dist: pytz<2027.0,>=2021.3
20
20
  Requires-Dist: confuse<2.4,>=1.7
21
21
  Dynamic: author
@@ -2,9 +2,20 @@ from ad_api.base import Client, sp_endpoint, ApiResponse, Utils
2
2
 
3
3
 
4
4
  class PortfoliosV3(Client):
5
- """ """
5
+ r"""
6
+ Amazon Ads API v3 - portfolios, under /portfolios.
7
+
8
+ Deprecated: Amazon moved portfolios into the unified v1 generation.
9
+ Use ad_api.api.v1.Portfolios, on /adsApi/v1/create|query|update/portfolios,
10
+ which adds budget sharing between the campaigns of a portfolio and per
11
+ marketplace overrides on a global portfolio.
12
+
13
+ The routes here still match the contract they were built on; they are kept
14
+ for anyone pinning an older release.
15
+ """
6
16
 
7
17
  @sp_endpoint('/portfolios/list', method='POST')
18
+ @Utils.deprecated
8
19
  def list_portfolios(self, version: int = 3, prefer: bool = False, **kwargs) -> ApiResponse:
9
20
  r"""
10
21
  Lists portfolios. Replaces the retired ``GET /v2/portfolios``.
@@ -45,6 +56,7 @@ class PortfoliosV3(Client):
45
56
 
46
57
 
47
58
  @sp_endpoint('/portfolios', method='POST')
59
+ @Utils.deprecated
48
60
  def create_portfolios(self, version: int = 3, prefer: bool = False, **kwargs) -> ApiResponse:
49
61
  r"""
50
62
  Creates portfolios.
@@ -93,6 +105,7 @@ class PortfoliosV3(Client):
93
105
  return self._request(kwargs.pop('path'), data=Utils.convert_body(kwargs.pop('body'), False), params=kwargs, headers=headers)
94
106
 
95
107
  @sp_endpoint('/portfolios', method='PUT')
108
+ @Utils.deprecated
96
109
  def edit_portfolios(self, version: int = 3, prefer: bool = False, **kwargs) -> ApiResponse:
97
110
  r"""
98
111
  Updates portfolios.
@@ -133,6 +146,7 @@ class PortfoliosV3(Client):
133
146
 
134
147
 
135
148
  @sp_endpoint('/portfolios/budget/usage', method='POST')
149
+ @Utils.deprecated
136
150
  def get_budget_usage_for_portfolios(self, version: int = 1, **kwargs) -> ApiResponse:
137
151
  r"""
138
152
  Reports how much of each portfolio budget has been spent.
@@ -18,6 +18,7 @@ from .label_object_associations import LabelObjectAssociations
18
18
  from .geo_locations import GeoLocations
19
19
  from .location_indexes import LocationIndexes
20
20
  from .recommendation_types import RecommendationTypes
21
+ from .portfolios import Portfolios
21
22
 
22
23
  __all__ = [
23
24
  "Campaigns",
@@ -40,4 +41,5 @@ __all__ = [
40
41
  "GeoLocations",
41
42
  "LocationIndexes",
42
43
  "RecommendationTypes",
44
+ "Portfolios",
43
45
  ]
@@ -0,0 +1,168 @@
1
+ from ad_api.base import Client, sp_endpoint, ApiResponse, Utils
2
+
3
+
4
+ class Portfolios(Client):
5
+ r"""
6
+ Portfolios(account='default', marketplace: Marketplaces = Marketplaces.EU, credentials=None, debug=False)
7
+
8
+ Amazon Ads API v1 - unified Portfolios endpoints
9
+
10
+ A portfolio groups campaigns under one name, one budget and one set of
11
+ marketplace rules. It is the v1 replacement for the v2 ``/v2/portfolios``
12
+ routes, retired in March 2025, and for the v3 ``/portfolios`` family.
13
+
14
+ Three routes, all POST. There is no GET on a path and no DELETE:
15
+
16
+ /adsApi/v1/create/portfolios CreatePortfolio
17
+ /adsApi/v1/query/portfolios QueryPortfolio
18
+ /adsApi/v1/update/portfolios UpdatePortfolio
19
+
20
+ A portfolio is never deleted: it is retired by updating ``state`` to
21
+ ARCHIVED, which is a terminal state and cannot be reverted.
22
+
23
+ Budget sharing is the new part
24
+ ------------------------------
25
+ ``budgetControls.campaignBudgetSharing.shareUnspentCampaignBudget``
26
+ (ENABLED or DISABLED) lets the campaigns of the portfolio spend budget
27
+ that the other campaigns did not use, instead of each campaign being
28
+ capped on its own.
29
+
30
+ Global and per marketplace
31
+ --------------------------
32
+ A portfolio is GLOBAL, covering every marketplace named in
33
+ ``marketplaces``, or SINGLE_MARKETPLACE. When it is global,
34
+ ``marketplaceConfigurations`` overrides ``budgetControls``,
35
+ ``startDateTime``, ``endDateTime`` and ``state`` for one marketplace, up
36
+ to 30 overrides. Anything not overridden carries the global value.
37
+
38
+ Writes answer 207, not 200: a batch can create some portfolios and
39
+ reject others, so ``success`` and ``error`` in the payload have to be read
40
+ together, indexed the same way.
41
+ """
42
+
43
+ @sp_endpoint('/adsApi/v1/create/portfolios', method='POST')
44
+ def create_portfolios(self, **kwargs) -> ApiResponse:
45
+ r"""
46
+ create_portfolios(body: dict) -> ApiResponse
47
+
48
+ Amazon Ads API v1 - Create Portfolios (operationId: CreatePortfolio)
49
+
50
+ Request Body [Required]
51
+ | **portfolios** (list<PortfolioCreate>) : [required] 1..100
52
+
53
+ PortfolioCreate fields
54
+ | **name** (string) : the name of the portfolio
55
+ | **state** (string) : Enum [ DRAFT, ENABLED, PAUSED, PROPOSED ]
56
+ | **marketplaceScope** (string) : Enum [ GLOBAL, SINGLE_MARKETPLACE ]
57
+ | **marketplaces** (list<Marketplace>) : 0..30 country codes
58
+ | **budget** (dict)
59
+ | **budgetType** (string) : [required] MONETARY
60
+ | **budgetValue** (dict) : [required] the monetary value
61
+ | **recurrenceTimePeriod** (string) : [required]
62
+ Enum [ DAILY, LIFETIME ]
63
+ | **budgetControls** (dict)
64
+ | **campaignBudgetSharing** (dict) : [required]
65
+ | **shareUnspentCampaignBudget** (string) : [required]
66
+ Enum [ DISABLED, ENABLED ]
67
+ | **marketplaceConfigurations** (list<dict>) : 0..30
68
+ | **marketplace** (string) : [required] the country code
69
+ | **overrides** (dict) : [required]
70
+ | **budgetControls**, **startDateTime**,
71
+ **endDateTime**, **state**
72
+ | **startDateTime** (string) : ISO 8601, with a LIFETIME budget
73
+ | **endDateTime** (string) : ISO 8601, with a LIFETIME budget
74
+
75
+ Returns
76
+ 207 MultiStatus with success[] and error[] indexed together.
77
+ Each success carries the created Portfolio and its position.
78
+
79
+ This writes into the account. A 207 is not all or nothing: read both
80
+ lists before assuming every portfolio was created.
81
+ """
82
+ schema_version = 'application/json'
83
+ headers = {"Accept": schema_version, "Content-Type": schema_version}
84
+ body = kwargs.pop('body', None)
85
+ return self._request(kwargs.pop('path'), params=kwargs, headers=headers,
86
+ **({'data': Utils.convert_body(body, False)} if body is not None else {}))
87
+
88
+ @sp_endpoint('/adsApi/v1/query/portfolios', method='POST')
89
+ def query_portfolios(self, **kwargs) -> ApiResponse:
90
+ r"""
91
+ query_portfolios(body: dict) -> ApiResponse
92
+
93
+ Amazon Ads API v1 - Query Portfolios (operationId: QueryPortfolio)
94
+
95
+ A POST that reads: the filters travel in the body, not in the path.
96
+
97
+ Request Body
98
+ | **portfolioIdFilter** (dict) [optional]
99
+ | **include** (list<string>) : 1..1000 portfolio identifiers
100
+ | **nameFilter** (dict) [optional]
101
+ | **include** (list<string>) : 1..100 names
102
+ | **queryTermMatchType** (string) : [required]
103
+ Enum [ BROAD_MATCH, EXACT_MATCH ]
104
+ | **stateFilter** (dict) [optional]
105
+ | **include** (list<State>) : ARCHIVED, DRAFT, ENABLED,
106
+ PAUSED, PROPOSED
107
+ | **marketplaceScopeFilter** (dict) [optional]
108
+ | **include** (list<MarketplaceScope>) : exactly 1,
109
+ GLOBAL or SINGLE_MARKETPLACE
110
+ | **maxResults** (int) : 1..100, default 100
111
+ | **nextToken** (string) : the token from the previous page
112
+
113
+ Returns
114
+ | **portfolios** (list<Portfolio>), **nextToken** (string)
115
+
116
+ Portfolio fields
117
+ | **portfolioId**, **globalPortfolioId**, **name**, **state**,
118
+ **status**
119
+ | **budget**, **budgetControls**
120
+ | **startDateTime**, **endDateTime**
121
+ | **marketplaces** (list<string>), **marketplaceScope**
122
+ | **marketplaceConfigurations** (list<dict>) : the per marketplace
123
+ overrides, 0..30
124
+ """
125
+ schema_version = 'application/json'
126
+ headers = {"Accept": schema_version, "Content-Type": schema_version}
127
+ body = kwargs.pop('body', None)
128
+ return self._request(kwargs.pop('path'), params=kwargs, headers=headers,
129
+ **({'data': Utils.convert_body(body, False)} if body is not None else {}))
130
+
131
+ @sp_endpoint('/adsApi/v1/update/portfolios', method='POST')
132
+ def update_portfolios(self, **kwargs) -> ApiResponse:
133
+ r"""
134
+ update_portfolios(body: dict) -> ApiResponse
135
+
136
+ Amazon Ads API v1 - Update Portfolios (operationId: UpdatePortfolio)
137
+
138
+ Request Body [Required]
139
+ | **portfolios** (list<PortfolioUpdate>) : [required] 1..100
140
+
141
+ PortfolioUpdate fields
142
+ | **portfolioId** (string) : [required] the portfolio to rewrite
143
+ | **name** (string)
144
+ | **state** (string) : Enum [ DRAFT, ENABLED, PAUSED, PROPOSED,
145
+ ARCHIVED ]
146
+ | **budget** (dict)
147
+ | **budgetType**, **budgetValue** (UpdateBudgetValue),
148
+ **recurrenceTimePeriod**
149
+ | **budgetControls** (dict)
150
+ | **campaignBudgetSharing** (dict)
151
+ | **shareUnspentCampaignBudget** (string) : ENABLED, DISABLED
152
+ | **marketplaces** (list<Marketplace>) : 0..30
153
+ | **marketplaceConfigurations** (list<dict>) : 0..30
154
+ | **startDateTime** (string) : nullable
155
+ | **endDateTime** (string) : nullable
156
+
157
+ Returns
158
+ 207 MultiStatus with success[] and error[] indexed together.
159
+
160
+ ARCHIVED is terminal: a portfolio set to ARCHIVED cannot be
161
+ reactivated. With no delete route, archiving is how a portfolio is
162
+ retired.
163
+ """
164
+ schema_version = 'application/json'
165
+ headers = {"Accept": schema_version, "Content-Type": schema_version}
166
+ body = kwargs.pop('body', None)
167
+ return self._request(kwargs.pop('path'), params=kwargs, headers=headers,
168
+ **({'data': Utils.convert_body(body, False)} if body is not None else {}))
@@ -31,13 +31,13 @@ class Recommendations(Client):
31
31
  Amazon Ads API v1 - Query Recommendations (operationId: QueryRecommendation)
32
32
 
33
33
  Request Body [Required]
34
- | **accessRequestedAccounts** (list<QueryRecommendationRequestAccessRequestedAccountItem>) : [required] 1..2000
34
+ | **accessRequestedAccounts** (list<QueryRecommendationRequestAccessRequestedAccountItem>) : [required] 1..2000, each item is either {advertiserAccountId} or {managerAccountId}
35
35
  | **adProductFilter** (dict) [optional]
36
36
  | **recommendationTypeFilter** (dict) [optional]
37
37
  | **recommendationTypeDetailsFilter** (dict) [optional]
38
38
  | **marketplacesFilter** (dict) [optional]
39
39
  | **languageFilter** (dict) [optional]
40
- | **maxResults** (int) : 1..100, default 100
40
+ | **maxResults** (int) : 1..300, default 100
41
41
  | **nextToken** (string)
42
42
 
43
43
  Returns
@@ -58,6 +58,15 @@ class Recommendations(Client):
58
58
 
59
59
  A GET with query parameters, not a body.
60
60
 
61
+ Parameters
62
+ | **Amazon-Ads-AccountId** (string) : advertiser account, optional
63
+ | **Amazon-Ads-Manager-AccountId** (string) : manager account, optional
64
+ | **nextToken**, **maxResults** (1..300), **adProduct**, **marketplace**, **language**, **recommendationType**
65
+
66
+ The account travels in the headers, and since 2026-11-11 the contract
67
+ marks both of them optional: the list can be read for an advertiser
68
+ account or for a manager account.
69
+
61
70
  Returns
62
71
  | **recommendations** (list<Recommendation>) : 0..300
63
72
  | **totalResults** (int)
@@ -0,0 +1 @@
1
+ __version__ = "1.8.1"
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: python-amazon-ad-api
3
- Version: 1.7.0
3
+ Version: 1.8.1
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,8 +14,8 @@ Description-Content-Type: text/markdown
14
14
  License-File: LICENSE
15
15
  Requires-Dist: requests<2.35.0,>=2.27.1
16
16
  Requires-Dist: six<1.18,>=1.16
17
- Requires-Dist: cachetools<7.3,>=5.0
18
- Requires-Dist: pycryptodome<4.3,>=3.13
17
+ Requires-Dist: cachetools<8.1,>=5.0
18
+ Requires-Dist: pycryptodome<4.5,>=3.13
19
19
  Requires-Dist: pytz<2027.0,>=2021.3
20
20
  Requires-Dist: confuse<2.4,>=1.7
21
21
  Dynamic: author
@@ -110,6 +110,7 @@ ad_api/api/v1/label_object_associations.py
110
110
  ad_api/api/v1/labels.py
111
111
  ad_api/api/v1/location_indexes.py
112
112
  ad_api/api/v1/manager_accounts.py
113
+ ad_api/api/v1/portfolios.py
113
114
  ad_api/api/v1/recommendation_types.py
114
115
  ad_api/api/v1/recommendations.py
115
116
  ad_api/api/v1/reports.py
@@ -1,6 +1,6 @@
1
1
  requests<2.35.0,>=2.27.1
2
2
  six<1.18,>=1.16
3
- cachetools<7.3,>=5.0
4
- pycryptodome<4.3,>=3.13
3
+ cachetools<8.1,>=5.0
4
+ pycryptodome<4.5,>=3.13
5
5
  pytz<2027.0,>=2021.3
6
6
  confuse<2.4,>=1.7
@@ -1,6 +1,6 @@
1
1
  [metadata]
2
2
  name = python-amazon-ad-api
3
- version = 1.7.0
3
+ version = 1.8.1
4
4
  author = Daniel Alvaro
5
5
  author_email = denisneuf@hotmail.com
6
6
  description = Python wrapper for the Amazon Advertising API
@@ -2,12 +2,12 @@ from setuptools import setup
2
2
 
3
3
  setup(
4
4
  name='python-amazon-ad-api',
5
- version='1.7.0',
5
+ version='1.8.1',
6
6
  install_requires=[
7
7
  "requests>=2.27.1,<2.35.0",
8
8
  "six>=1.16,<1.18",
9
- "cachetools>=5.0,<7.3",
10
- "pycryptodome>=3.13,<4.3",
9
+ "cachetools>=5.0,<8.1",
10
+ "pycryptodome>=3.13,<4.5",
11
11
  "pytz>=2021.3,<2027.0",
12
12
  "confuse>=1.7,<2.4",
13
13
  ],
@@ -1 +0,0 @@
1
- __version__ = "1.7.0"