python-amazon-ad-api 1.0.9__tar.gz → 1.1.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 (120) hide show
  1. {python_amazon_ad_api-1.0.9 → python_amazon_ad_api-1.1.1}/PKG-INFO +1 -1
  2. {python_amazon_ad_api-1.0.9 → python_amazon_ad_api-1.1.1}/ad_api/api/sb/ad_creatives_v4.py +3 -2
  3. {python_amazon_ad_api-1.0.9 → python_amazon_ad_api-1.1.1}/ad_api/api/sb/bid_recommendations.py +9 -1
  4. {python_amazon_ad_api-1.0.9 → python_amazon_ad_api-1.1.1}/ad_api/api/sb/brands.py +8 -1
  5. python_amazon_ad_api-1.1.1/ad_api/api/sb/forecast.py +90 -0
  6. python_amazon_ad_api-1.1.1/ad_api/api/sb/keywords_recommendations.py +16 -0
  7. {python_amazon_ad_api-1.0.9 → python_amazon_ad_api-1.1.1}/ad_api/api/sb/landing_page_asins.py +8 -1
  8. {python_amazon_ad_api-1.0.9 → python_amazon_ad_api-1.1.1}/ad_api/api/sb/media.py +23 -2
  9. {python_amazon_ad_api-1.0.9 → python_amazon_ad_api-1.1.1}/ad_api/api/sb/negative_keywords.py +8 -1
  10. {python_amazon_ad_api-1.0.9 → python_amazon_ad_api-1.1.1}/ad_api/api/sb/negative_product_targeting.py +9 -1
  11. {python_amazon_ad_api-1.0.9 → python_amazon_ad_api-1.1.1}/ad_api/api/sb/reports.py +10 -2
  12. {python_amazon_ad_api-1.0.9 → python_amazon_ad_api-1.1.1}/ad_api/api/sb/stores.py +2 -1
  13. python_amazon_ad_api-1.1.1/ad_api/version.py +1 -0
  14. {python_amazon_ad_api-1.0.9 → python_amazon_ad_api-1.1.1}/python_amazon_ad_api.egg-info/PKG-INFO +1 -1
  15. {python_amazon_ad_api-1.0.9 → python_amazon_ad_api-1.1.1}/setup.cfg +1 -1
  16. {python_amazon_ad_api-1.0.9 → python_amazon_ad_api-1.1.1}/setup.py +1 -1
  17. python_amazon_ad_api-1.0.9/ad_api/api/sb/forecast.py +0 -7
  18. python_amazon_ad_api-1.0.9/ad_api/api/sb/keywords_recommendations.py +0 -7
  19. python_amazon_ad_api-1.0.9/ad_api/version.py +0 -1
  20. {python_amazon_ad_api-1.0.9 → python_amazon_ad_api-1.1.1}/LICENSE +0 -0
  21. {python_amazon_ad_api-1.0.9 → python_amazon_ad_api-1.1.1}/README.md +0 -0
  22. {python_amazon_ad_api-1.0.9 → python_amazon_ad_api-1.1.1}/ad_api/__init__.py +0 -0
  23. {python_amazon_ad_api-1.0.9 → python_amazon_ad_api-1.1.1}/ad_api/api/__init__.py +0 -0
  24. {python_amazon_ad_api-1.0.9 → python_amazon_ad_api-1.1.1}/ad_api/api/account.py +0 -0
  25. {python_amazon_ad_api-1.0.9 → python_amazon_ad_api-1.1.1}/ad_api/api/advertising_test_account.py +0 -0
  26. {python_amazon_ad_api-1.0.9 → python_amazon_ad_api-1.1.1}/ad_api/api/attribution.py +0 -0
  27. {python_amazon_ad_api-1.0.9 → python_amazon_ad_api-1.1.1}/ad_api/api/audiences.py +0 -0
  28. {python_amazon_ad_api-1.0.9 → python_amazon_ad_api-1.1.1}/ad_api/api/billing.py +0 -0
  29. {python_amazon_ad_api-1.0.9 → python_amazon_ad_api-1.1.1}/ad_api/api/brand_metrics.py +0 -0
  30. {python_amazon_ad_api-1.0.9 → python_amazon_ad_api-1.1.1}/ad_api/api/creative_assets.py +0 -0
  31. {python_amazon_ad_api-1.0.9 → python_amazon_ad_api-1.1.1}/ad_api/api/eligibility.py +0 -0
  32. {python_amazon_ad_api-1.0.9 → python_amazon_ad_api-1.1.1}/ad_api/api/exports.py +0 -0
  33. {python_amazon_ad_api-1.0.9 → python_amazon_ad_api-1.1.1}/ad_api/api/history.py +0 -0
  34. {python_amazon_ad_api-1.0.9 → python_amazon_ad_api-1.1.1}/ad_api/api/insights.py +0 -0
  35. {python_amazon_ad_api-1.0.9 → python_amazon_ad_api-1.1.1}/ad_api/api/invoices.py +0 -0
  36. {python_amazon_ad_api-1.0.9 → python_amazon_ad_api-1.1.1}/ad_api/api/localization.py +0 -0
  37. {python_amazon_ad_api-1.0.9 → python_amazon_ad_api-1.1.1}/ad_api/api/manager_accounts.py +0 -0
  38. {python_amazon_ad_api-1.0.9 → python_amazon_ad_api-1.1.1}/ad_api/api/metadata.py +0 -0
  39. {python_amazon_ad_api-1.0.9 → python_amazon_ad_api-1.1.1}/ad_api/api/portfolios.py +0 -0
  40. {python_amazon_ad_api-1.0.9 → python_amazon_ad_api-1.1.1}/ad_api/api/portfolios_v3.py +0 -0
  41. {python_amazon_ad_api-1.0.9 → python_amazon_ad_api-1.1.1}/ad_api/api/profiles.py +0 -0
  42. {python_amazon_ad_api-1.0.9 → python_amazon_ad_api-1.1.1}/ad_api/api/recommendations.py +0 -0
  43. {python_amazon_ad_api-1.0.9 → python_amazon_ad_api-1.1.1}/ad_api/api/reports.py +0 -0
  44. {python_amazon_ad_api-1.0.9 → python_amazon_ad_api-1.1.1}/ad_api/api/sb/__init__.py +0 -0
  45. {python_amazon_ad_api-1.0.9 → python_amazon_ad_api-1.1.1}/ad_api/api/sb/ad_groups.py +0 -0
  46. {python_amazon_ad_api-1.0.9 → python_amazon_ad_api-1.1.1}/ad_api/api/sb/ad_groups_v4.py +0 -0
  47. {python_amazon_ad_api-1.0.9 → python_amazon_ad_api-1.1.1}/ad_api/api/sb/ads_v4.py +0 -0
  48. {python_amazon_ad_api-1.0.9 → python_amazon_ad_api-1.1.1}/ad_api/api/sb/benchmarks.py +0 -0
  49. {python_amazon_ad_api-1.0.9 → python_amazon_ad_api-1.1.1}/ad_api/api/sb/campaigns.py +0 -0
  50. {python_amazon_ad_api-1.0.9 → python_amazon_ad_api-1.1.1}/ad_api/api/sb/campaigns_v4.py +0 -0
  51. {python_amazon_ad_api-1.0.9 → python_amazon_ad_api-1.1.1}/ad_api/api/sb/keywords.py +0 -0
  52. {python_amazon_ad_api-1.0.9 → python_amazon_ad_api-1.1.1}/ad_api/api/sb/product_targeting.py +0 -0
  53. {python_amazon_ad_api-1.0.9 → python_amazon_ad_api-1.1.1}/ad_api/api/sb/recommendations.py +0 -0
  54. {python_amazon_ad_api-1.0.9 → python_amazon_ad_api-1.1.1}/ad_api/api/sb/targeting_recommendations.py +0 -0
  55. {python_amazon_ad_api-1.0.9 → python_amazon_ad_api-1.1.1}/ad_api/api/sb/themes.py +0 -0
  56. {python_amazon_ad_api-1.0.9 → python_amazon_ad_api-1.1.1}/ad_api/api/sd/__init__.py +0 -0
  57. {python_amazon_ad_api-1.0.9 → python_amazon_ad_api-1.1.1}/ad_api/api/sd/ad_groups.py +0 -0
  58. {python_amazon_ad_api-1.0.9 → python_amazon_ad_api-1.1.1}/ad_api/api/sd/bid_recommendations.py +0 -0
  59. {python_amazon_ad_api-1.0.9 → python_amazon_ad_api-1.1.1}/ad_api/api/sd/brand_safety.py +0 -0
  60. {python_amazon_ad_api-1.0.9 → python_amazon_ad_api-1.1.1}/ad_api/api/sd/budget_rules.py +0 -0
  61. {python_amazon_ad_api-1.0.9 → python_amazon_ad_api-1.1.1}/ad_api/api/sd/campaigns.py +0 -0
  62. {python_amazon_ad_api-1.0.9 → python_amazon_ad_api-1.1.1}/ad_api/api/sd/campaigns_budget_usage.py +0 -0
  63. {python_amazon_ad_api-1.0.9 → python_amazon_ad_api-1.1.1}/ad_api/api/sd/creatives.py +0 -0
  64. {python_amazon_ad_api-1.0.9 → python_amazon_ad_api-1.1.1}/ad_api/api/sd/forecast.py +0 -0
  65. {python_amazon_ad_api-1.0.9 → python_amazon_ad_api-1.1.1}/ad_api/api/sd/negative_product_targeting.py +0 -0
  66. {python_amazon_ad_api-1.0.9 → python_amazon_ad_api-1.1.1}/ad_api/api/sd/product_ads.py +0 -0
  67. {python_amazon_ad_api-1.0.9 → python_amazon_ad_api-1.1.1}/ad_api/api/sd/product_targeting.py +0 -0
  68. {python_amazon_ad_api-1.0.9 → python_amazon_ad_api-1.1.1}/ad_api/api/sd/recommendations.py +0 -0
  69. {python_amazon_ad_api-1.0.9 → python_amazon_ad_api-1.1.1}/ad_api/api/sd/reports.py +0 -0
  70. {python_amazon_ad_api-1.0.9 → python_amazon_ad_api-1.1.1}/ad_api/api/sd/snapshots.py +0 -0
  71. {python_amazon_ad_api-1.0.9 → python_amazon_ad_api-1.1.1}/ad_api/api/sd/targeting_recommendations.py +0 -0
  72. {python_amazon_ad_api-1.0.9 → python_amazon_ad_api-1.1.1}/ad_api/api/sp/__init__.py +0 -0
  73. {python_amazon_ad_api-1.0.9 → python_amazon_ad_api-1.1.1}/ad_api/api/sp/ad_groups_v3.py +0 -0
  74. {python_amazon_ad_api-1.0.9 → python_amazon_ad_api-1.1.1}/ad_api/api/sp/bid_recommendations_v3.py +0 -0
  75. {python_amazon_ad_api-1.0.9 → python_amazon_ad_api-1.1.1}/ad_api/api/sp/budget_initial_recommendation.py +0 -0
  76. {python_amazon_ad_api-1.0.9 → python_amazon_ad_api-1.1.1}/ad_api/api/sp/budget_recommendations.py +0 -0
  77. {python_amazon_ad_api-1.0.9 → python_amazon_ad_api-1.1.1}/ad_api/api/sp/budget_rules.py +0 -0
  78. {python_amazon_ad_api-1.0.9 → python_amazon_ad_api-1.1.1}/ad_api/api/sp/budget_rules_recommendations.py +0 -0
  79. {python_amazon_ad_api-1.0.9 → python_amazon_ad_api-1.1.1}/ad_api/api/sp/campaign_consolidated_recommendations.py +0 -0
  80. {python_amazon_ad_api-1.0.9 → python_amazon_ad_api-1.1.1}/ad_api/api/sp/campaign_negative_keywords_v3.py +0 -0
  81. {python_amazon_ad_api-1.0.9 → python_amazon_ad_api-1.1.1}/ad_api/api/sp/campaign_negative_targets.py +0 -0
  82. {python_amazon_ad_api-1.0.9 → python_amazon_ad_api-1.1.1}/ad_api/api/sp/campaigns_budget_usage.py +0 -0
  83. {python_amazon_ad_api-1.0.9 → python_amazon_ad_api-1.1.1}/ad_api/api/sp/campaigns_v3.py +0 -0
  84. {python_amazon_ad_api-1.0.9 → python_amazon_ad_api-1.1.1}/ad_api/api/sp/campaings_optimization.py +0 -0
  85. {python_amazon_ad_api-1.0.9 → python_amazon_ad_api-1.1.1}/ad_api/api/sp/keywords_v3.py +0 -0
  86. {python_amazon_ad_api-1.0.9 → python_amazon_ad_api-1.1.1}/ad_api/api/sp/negative_keywords_v3.py +0 -0
  87. {python_amazon_ad_api-1.0.9 → python_amazon_ad_api-1.1.1}/ad_api/api/sp/negative_product_targeting_v3.py +0 -0
  88. {python_amazon_ad_api-1.0.9 → python_amazon_ad_api-1.1.1}/ad_api/api/sp/product_ads_v3.py +0 -0
  89. {python_amazon_ad_api-1.0.9 → python_amazon_ad_api-1.1.1}/ad_api/api/sp/product_recommendations.py +0 -0
  90. {python_amazon_ad_api-1.0.9 → python_amazon_ad_api-1.1.1}/ad_api/api/sp/product_targeting_v3.py +0 -0
  91. {python_amazon_ad_api-1.0.9 → python_amazon_ad_api-1.1.1}/ad_api/api/sp/ranked_keywords_recommendations.py +0 -0
  92. {python_amazon_ad_api-1.0.9 → python_amazon_ad_api-1.1.1}/ad_api/api/sp/schedule_based_bid_optimization.py +0 -0
  93. {python_amazon_ad_api-1.0.9 → python_amazon_ad_api-1.1.1}/ad_api/api/stores.py +0 -0
  94. {python_amazon_ad_api-1.0.9 → python_amazon_ad_api-1.1.1}/ad_api/api/stream.py +0 -0
  95. {python_amazon_ad_api-1.0.9 → python_amazon_ad_api-1.1.1}/ad_api/api/v1/__init__.py +0 -0
  96. {python_amazon_ad_api-1.0.9 → python_amazon_ad_api-1.1.1}/ad_api/api/v1/ad_groups.py +0 -0
  97. {python_amazon_ad_api-1.0.9 → python_amazon_ad_api-1.1.1}/ad_api/api/v1/ads.py +0 -0
  98. {python_amazon_ad_api-1.0.9 → python_amazon_ad_api-1.1.1}/ad_api/api/v1/campaigns.py +0 -0
  99. {python_amazon_ad_api-1.0.9 → python_amazon_ad_api-1.1.1}/ad_api/api/v1/targets.py +0 -0
  100. {python_amazon_ad_api-1.0.9 → python_amazon_ad_api-1.1.1}/ad_api/api/validation_configurations.py +0 -0
  101. {python_amazon_ad_api-1.0.9 → python_amazon_ad_api-1.1.1}/ad_api/auth/__init__.py +0 -0
  102. {python_amazon_ad_api-1.0.9 → python_amazon_ad_api-1.1.1}/ad_api/auth/access_token_client.py +0 -0
  103. {python_amazon_ad_api-1.0.9 → python_amazon_ad_api-1.1.1}/ad_api/auth/access_token_response.py +0 -0
  104. {python_amazon_ad_api-1.0.9 → python_amazon_ad_api-1.1.1}/ad_api/auth/credentials.py +0 -0
  105. {python_amazon_ad_api-1.0.9 → python_amazon_ad_api-1.1.1}/ad_api/auth/exceptions.py +0 -0
  106. {python_amazon_ad_api-1.0.9 → python_amazon_ad_api-1.1.1}/ad_api/base/__init__.py +0 -0
  107. {python_amazon_ad_api-1.0.9 → python_amazon_ad_api-1.1.1}/ad_api/base/api_response.py +0 -0
  108. {python_amazon_ad_api-1.0.9 → python_amazon_ad_api-1.1.1}/ad_api/base/base_client.py +0 -0
  109. {python_amazon_ad_api-1.0.9 → python_amazon_ad_api-1.1.1}/ad_api/base/client.py +0 -0
  110. {python_amazon_ad_api-1.0.9 → python_amazon_ad_api-1.1.1}/ad_api/base/config.py +0 -0
  111. {python_amazon_ad_api-1.0.9 → python_amazon_ad_api-1.1.1}/ad_api/base/credential_provider.py +0 -0
  112. {python_amazon_ad_api-1.0.9 → python_amazon_ad_api-1.1.1}/ad_api/base/exceptions.py +0 -0
  113. {python_amazon_ad_api-1.0.9 → python_amazon_ad_api-1.1.1}/ad_api/base/helpers.py +0 -0
  114. {python_amazon_ad_api-1.0.9 → python_amazon_ad_api-1.1.1}/ad_api/base/marketplaces.py +0 -0
  115. {python_amazon_ad_api-1.0.9 → python_amazon_ad_api-1.1.1}/ad_api/base/utils.py +0 -0
  116. {python_amazon_ad_api-1.0.9 → python_amazon_ad_api-1.1.1}/pyproject.toml +0 -0
  117. {python_amazon_ad_api-1.0.9 → python_amazon_ad_api-1.1.1}/python_amazon_ad_api.egg-info/SOURCES.txt +0 -0
  118. {python_amazon_ad_api-1.0.9 → python_amazon_ad_api-1.1.1}/python_amazon_ad_api.egg-info/dependency_links.txt +0 -0
  119. {python_amazon_ad_api-1.0.9 → python_amazon_ad_api-1.1.1}/python_amazon_ad_api.egg-info/requires.txt +0 -0
  120. {python_amazon_ad_api-1.0.9 → python_amazon_ad_api-1.1.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.0.9
3
+ Version: 1.1.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
@@ -58,6 +58,7 @@ class AdCreativesV4(Client):
58
58
  return self._request(kwargs.pop('path'), data=Utils.convert_body(kwargs.pop('body'), False), params=kwargs, headers=headers)
59
59
 
60
60
  @sp_endpoint('/sb/ads/creatives/productCollection', method='POST')
61
+ @Utils.deprecated
61
62
  def create_new_version_product_collection_ad_creative(self, version: int = 4, **kwargs) -> ApiResponse:
62
63
  """
63
64
  Creates a new version of creative for given Sponsored Brands ad by supplying product collection creative content.
@@ -91,10 +92,10 @@ class AdCreativesV4(Client):
91
92
 
92
93
  return self._request(kwargs.pop('path'), data=Utils.convert_body(kwargs.pop('body'), False), params=kwargs, headers=headers)
93
94
 
94
- @sp_endpoint('/sb/ads/creatives/productCollection', method='POST')
95
+ @sp_endpoint('/sb/ads/creatives/storeSpotlight', method='POST')
95
96
  def create_new_version_store_spotlight_ad_creative(self, version: int = 4, **kwargs) -> ApiResponse:
96
97
  """
97
- Creates a new version of creative for given Sponsored Brands ad by supplying product collection creative content.
98
+ Creates a new version of creative for a given Sponsored Brands ad by supplying store spotlight creative content.
98
99
 
99
100
  Request Body [Required]
100
101
  | **adId** (string) : The unique ID of a Sponsored Brands ad.
@@ -6,6 +6,13 @@ class BidRecommendations(Client):
6
6
  Use the Amazon Advertising API for Sponsored Brands for campaign, ad group, keyword, negative keyword, drafts, Stores, landing pages, and Brands management operations. For more information about Sponsored Brands, see the Sponsored Brands Support Center. For onboarding information, see the account setup topic.
7
7
  """
8
8
 
9
+ _ACCEPT = 'application/vnd.sbbidsrecommendation.v3+json'
10
+
11
+ @classmethod
12
+ def _accept(cls):
13
+ """Response media type the v3 contract declares for these routes."""
14
+ return {"Accept": cls._ACCEPT}
15
+
9
16
  @sp_endpoint('/sb/recommendations/bids', method='POST')
10
17
  def get_bid_recommendations(self, **kwargs) -> ApiResponse:
11
18
  r"""
@@ -32,4 +39,5 @@ class BidRecommendations(Client):
32
39
 
33
40
  """
34
41
 
35
- return self._request(kwargs.pop('path'), data=Utils.convert_body(kwargs.pop('body'), False), params=kwargs)
42
+ return self._request(kwargs.pop('path'), data=Utils.convert_body(kwargs.pop('body'), False),
43
+ params=kwargs, headers=self._accept())
@@ -6,6 +6,13 @@ class Brands(Client):
6
6
  Use the Amazon Advertising API for Sponsored Brands for campaign, ad group, keyword, negative keyword, drafts, Stores, landing pages, and Brands management operations. For more information about Sponsored Brands, see the Sponsored Brands Support Center. For onboarding information, see the account setup topic.
7
7
  """
8
8
 
9
+ _ACCEPT = 'application/vnd.brand.v3+json'
10
+
11
+ @classmethod
12
+ def _accept(cls):
13
+ """Response media type the v3 contract declares for these routes."""
14
+ return {"Accept": cls._ACCEPT}
15
+
9
16
  @sp_endpoint('/brands', method='GET')
10
17
  def list_brands(self, **kwargs) -> ApiResponse:
11
18
  """
@@ -22,4 +29,4 @@ class Brands(Client):
22
29
  | '**brandRegistryName**': *string*, {'description': 'The Brand name.'}
23
30
 
24
31
  """
25
- return self._request(kwargs.pop('path'), params=kwargs)
32
+ return self._request(kwargs.pop('path'), params=kwargs, headers=self._accept())
@@ -0,0 +1,90 @@
1
+ from ad_api.base import Client, sp_endpoint, ApiResponse, Utils
2
+
3
+
4
+ class Forecast(Client):
5
+ """Sponsored Brands campaign performance forecasts.
6
+
7
+ Documentation: https://advertising.amazon.com/API/docs/en-us/sponsored-brands/4-0/openapi#tag/Forecasting
8
+
9
+ .. warning::
10
+ The Amazon backend for this route answers ``500 InternalFailure`` with an
11
+ empty body once the request passes validation. Verified from every angle:
12
+ keywords, targets, themes with landing pages, and mixed ad groups all fail
13
+ the same way, while the validation rules themselves do answer correctly
14
+ (``400`` with a business message). The client is built to the contract, so
15
+ it will work unchanged once Amazon fixes the service.
16
+
17
+ Validation rules observed against the live service, not in the contract:
18
+
19
+ * ``themes`` require ``landingPages``:
20
+ *"LandingPageUrl list is null or empty but theme list is not empty"*.
21
+ * An ad group with only ``landingPages`` is rejected:
22
+ *"Ad group is null or missing required fields"*; it needs something to bid on.
23
+ """
24
+
25
+ _ACCEPT = 'application/vnd.sbforecasting.v4+json'
26
+
27
+ @classmethod
28
+ def _accept(cls):
29
+ return {"Accept": cls._ACCEPT, "Content-Type": cls._ACCEPT}
30
+
31
+ @sp_endpoint('/sb/forecasts', method='POST')
32
+ def list_forecast(self, campaigns, version: int = 4, **kwargs) -> ApiResponse:
33
+ r"""
34
+ Gets performance forecasts for new campaigns.
35
+
36
+ ``campaigns`` is the list under the required ``campaigns`` key, ready to
37
+ send: the method wraps it in ``{"campaigns": [...]}``.
38
+
39
+ Positional Args
40
+ | **campaigns** (list): One or more campaign objects. The contract
41
+ states only one new campaign is supported for now.
42
+
43
+ Keyword Args
44
+ | **version** (int): Media type version, ``4`` by default.
45
+
46
+ Campaign object
47
+ | **budget** (number): [required] Budget amount.
48
+ | **budgetType** (string): [required] ``DAILY`` or ``LIFETIME``.
49
+ | **forecastType** (string): [required] ``WEEKLY`` or ``MONTHLY``.
50
+ | **adGroups** (list): [required] Ad groups to forecast.
51
+ | **startDate** (string): ``YYYY-MM-DD``.
52
+ | **endDate** (string): ``YYYY-MM-DD``, later than ``startDate``.
53
+ | **goal** (string): ``PAGE_VISIT``, ``BRAND_IMPRESSION_SHARE``,
54
+ ``ACQUIRE_NEW_CUSTOMERS`` or ``AD_VIEWS``. Defaults to ``PAGE_VISIT``
55
+ when the campaign was created without a goal.
56
+
57
+ Ad group object
58
+ | **keywords** (list): ``keywordText``, ``matchType`` and ``bid``.
59
+ | **targets** (list): ``expressions`` and ``bid``.
60
+ | **themes** (list): ``themeType`` and ``bid``. Requires landingPages.
61
+ | **landingPages** (list): ``landingPageUrl``.
62
+ | **negativeKeywords** (list): ``keywordText`` and ``matchType``.
63
+ | **negativeTargets** (list): ``expressions``.
64
+ | **creativeAsins** (list): ASINs used by the creative.
65
+
66
+ Returns:
67
+ | ApiResponse, with status ``207`` on success.
68
+
69
+ Example::
70
+
71
+ forecast = Forecast(account='account_name')
72
+ response = forecast.list_forecast(campaigns=[{
73
+ "budget": 100,
74
+ "budgetType": "DAILY",
75
+ "forecastType": "WEEKLY",
76
+ "startDate": "2026-11-01",
77
+ "endDate": "2026-11-30",
78
+ "goal": "PAGE_VISIT",
79
+ "adGroups": [{
80
+ "themes": [{"themeType": "KEYWORDS_RELATED_TO_YOUR_BRAND", "bid": 0.5}],
81
+ "landingPages": [{"landingPageUrl": "https://www.amazon.es/stores/page/XXXX"}],
82
+ }],
83
+ }])
84
+ """
85
+ return self._request(
86
+ kwargs.pop('path'),
87
+ data=Utils.convert_body({'campaigns': campaigns}, False),
88
+ params=kwargs,
89
+ headers=self._accept(),
90
+ )
@@ -0,0 +1,16 @@
1
+ from ad_api.base import Client, sp_endpoint, ApiResponse, Utils
2
+
3
+
4
+ class KeywordsRecommendations(Client):
5
+
6
+ _ACCEPT = 'application/vnd.sbkeywordrecommendation.v3+json'
7
+
8
+ @classmethod
9
+ def _accept(cls):
10
+ """Response media type the v3 contract declares for these routes."""
11
+ return {"Accept": cls._ACCEPT}
12
+
13
+ @sp_endpoint('/sb/recommendations/keyword', method='POST')
14
+ def list_keywords_recommendations(self, **kwargs) -> ApiResponse:
15
+ return self._request(kwargs.pop('path'), data=Utils.convert_body(kwargs.pop('body'), False),
16
+ params=kwargs, headers=self._accept())
@@ -6,6 +6,13 @@ class PageAsins(Client):
6
6
  Use the Amazon Advertising API for Sponsored Brands for campaign, ad group, keyword, negative keyword, drafts, Stores, landing pages, and Brands management operations. For more information about Sponsored Brands, see the Sponsored Brands Support Center. For onboarding information, see the account setup topic.
7
7
  """
8
8
 
9
+ _ACCEPT = 'application/vnd.pageasins.v3+json'
10
+
11
+ @classmethod
12
+ def _accept(cls):
13
+ """Response media type the v3 contract declares for these routes."""
14
+ return {"Accept": cls._ACCEPT}
15
+
9
16
  @sp_endpoint('/pageAsins', method='GET')
10
17
  def get_page_asins(self, **kwargs) -> ApiResponse:
11
18
  """
@@ -18,4 +25,4 @@ class PageAsins(Client):
18
25
  Returns
19
26
  asinList
20
27
  """
21
- return self._request(kwargs.pop('path'), params=kwargs)
28
+ return self._request(kwargs.pop('path'), params=kwargs, headers=self._accept())
@@ -6,6 +6,13 @@ class Media(Client):
6
6
  Use this interface to request and retrieve store information. This can be used for Sponsored Brands campaign creation, to pull the store URL information, and for asset registration for Stores.
7
7
  """
8
8
 
9
+ # NOTE: /media/upload and /media/complete are NOT in the v3 contract.
10
+ # Probing /media/upload answers 403 IncompleteSignatureException before the
11
+ # router sees it, which suggests the route expects an AWS SigV4 signature
12
+ # rather than the bearer token this client sends. Not verified either way.
13
+ # /media/complete answers 500 with a NullPointerException on an empty body,
14
+ # so the route exists but its expected fields are unknown.
15
+
9
16
  @sp_endpoint('/media/upload', method='POST')
10
17
  def create_media(self, **kwargs) -> ApiResponse:
11
18
  """
@@ -30,5 +37,19 @@ class Media(Client):
30
37
  return self._request(kwargs.pop('path'), data=Utils.convert_body(kwargs.pop('body'), False), params=kwargs)
31
38
 
32
39
  @sp_endpoint('/media/describe', method='GET')
33
- def describe_media(self, **kwargs) -> ApiResponse:
34
- return self._request(kwargs.pop('path'), data=Utils.convert_body(kwargs.pop('body'), False), params=kwargs)
40
+ def describe_media(self, mediaId, **kwargs) -> ApiResponse:
41
+ """
42
+ Describes an uploaded media resource.
43
+
44
+ The media id goes in the query string. Answered ``400 InvalidMediaId``
45
+ for an id that does not exist, which means the route is live.
46
+
47
+ Keyword Args
48
+ | path **mediaId** (string): The media identifier. [required]
49
+
50
+ Returns:
51
+ | ApiResponse
52
+
53
+ Documentation: https://advertising.amazon.com/API/docs/en-us/sponsored-brands/3-0/openapi
54
+ """
55
+ return self._request(kwargs.pop('path'), params={'mediaId': mediaId, **kwargs})
@@ -6,6 +6,13 @@ class NegativeKeywords(Client):
6
6
  Use the Amazon Advertising API for Sponsored Brands for campaign, ad group, keyword, negative keyword, drafts, Stores, landing pages, and Brands management operations. For more information about Sponsored Brands, see the Sponsored Brands Support Center. For onboarding information, see the account setup topic.
7
7
  """
8
8
 
9
+ _ACCEPT = 'application/vnd.sbnegativekeyword.v3.2+json'
10
+
11
+ @classmethod
12
+ def _accept(cls):
13
+ """Response media type the v3 contract declares for these routes."""
14
+ return {"Accept": cls._ACCEPT}
15
+
9
16
  @sp_endpoint('/sb/negativeKeywords', method='GET')
10
17
  def list_negative_keywords(self, **kwargs) -> ApiResponse:
11
18
  r"""
@@ -26,7 +33,7 @@ class NegativeKeywords(Client):
26
33
  | ApiResponse
27
34
 
28
35
  """
29
- return self._request(kwargs.pop('path'), params=kwargs)
36
+ return self._request(kwargs.pop('path'), params=kwargs, headers=self._accept())
30
37
 
31
38
  @sp_endpoint('/sb/negativeKeywords', method='PUT')
32
39
  def edit_negative_keywords(self, **kwargs) -> ApiResponse:
@@ -6,6 +6,13 @@ class NegativeTargets(Client):
6
6
  Use the Amazon Advertising API for Sponsored Brands for campaign, ad group, keyword, negative keyword, drafts, Stores, landing pages, and Brands management operations. For more information about Sponsored Brands, see the Sponsored Brands Support Center. For onboarding information, see the account setup topic.
7
7
  """
8
8
 
9
+ _ACCEPT = 'application/vnd.sblistnegativetargetsresponse.v3.2+json'
10
+
11
+ @classmethod
12
+ def _accept(cls):
13
+ """Response media type the v3 contract declares for the listing route."""
14
+ return {'Accept': cls._ACCEPT}
15
+
9
16
  @sp_endpoint('/sb/negativeTargets/list', method='POST')
10
17
  def list_negative_targets(self, **kwargs) -> ApiResponse:
11
18
  r"""
@@ -28,7 +35,8 @@ class NegativeTargets(Client):
28
35
  Returns:
29
36
  ApiResponse
30
37
  """
31
- return self._request(kwargs.pop('path'), data=Utils.convert_body(kwargs.pop('body'), False), params=kwargs)
38
+ return self._request(kwargs.pop('path'), data=Utils.convert_body(kwargs.pop('body'), False),
39
+ params=kwargs, headers=self._accept())
32
40
 
33
41
  @sp_endpoint('/sb/negativeTargets', method='PUT')
34
42
  def edit_negative_targets(self, **kwargs) -> ApiResponse:
@@ -8,6 +8,13 @@ class Reports(Client):
8
8
 
9
9
  """
10
10
 
11
+ _ACCEPT = 'application/json'
12
+
13
+ @classmethod
14
+ def _accept(cls):
15
+ """Response media type the v3 contract declares for these routes."""
16
+ return {"Accept": cls._ACCEPT}
17
+
11
18
  @sp_endpoint('/v2/hsa/{}/report', method='POST')
12
19
  def post_report(self, recordType, **kwargs) -> ApiResponse:
13
20
  r"""Requests a Sponsored Brands report.
@@ -27,7 +34,8 @@ class Reports(Client):
27
34
  ApiResponse
28
35
 
29
36
  """
30
- return self._request(fill_query_params(kwargs.pop('path'), recordType), data=Utils.convert_body(kwargs.pop('body'), False), params=kwargs)
37
+ return self._request(fill_query_params(kwargs.pop('path'), recordType), data=Utils.convert_body(kwargs.pop('body'), False),
38
+ params=kwargs, headers=self._accept())
31
39
 
32
40
  @sp_endpoint('/v2/reports/{}', method='GET')
33
41
  def get_report(self, reportId, **kwargs) -> ApiResponse:
@@ -42,7 +50,7 @@ class Reports(Client):
42
50
  Returns:
43
51
  ApiResponse
44
52
  """
45
- return self._request(fill_query_params(kwargs.pop('path'), reportId), params=kwargs)
53
+ return self._request(fill_query_params(kwargs.pop('path'), reportId), params=kwargs, headers=self._accept())
46
54
 
47
55
  def download_report(self, **kwargs) -> ApiResponse:
48
56
  r"""Downloads the report previously get report specified by location
@@ -24,7 +24,8 @@ class Stores(Client):
24
24
  Returns:
25
25
  | ApiResponse
26
26
  """
27
- return self._request(kwargs.pop('path'), params=kwargs)
27
+ return self._request(kwargs.pop('path'), params=kwargs,
28
+ headers={'Accept': 'application/vnd.mediaasset.v3+json'})
28
29
 
29
30
  @sp_endpoint('/stores/assets', method='POST')
30
31
  def create_asset(self, image, brandEntityId, mediaType='brandLogo', filename=None, **kwargs) -> ApiResponse:
@@ -0,0 +1 @@
1
+ __version__ = "1.1.1"
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: python-amazon-ad-api
3
- Version: 1.0.9
3
+ Version: 1.1.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
@@ -1,6 +1,6 @@
1
1
  [metadata]
2
2
  name = python-amazon-ad-api
3
- version = 1.0.9
3
+ version = 1.1.1
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.0.9',
5
+ version='1.1.1',
6
6
  install_requires=[
7
7
  "requests>=2.27.1,<2.35.0",
8
8
  "six>=1.16,<1.18",
@@ -1,7 +0,0 @@
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,7 +0,0 @@
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 +0,0 @@
1
- __version__ = "1.0.9"