python-amazon-ad-api 1.1.3__tar.gz → 1.1.5__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 (121) hide show
  1. {python_amazon_ad_api-1.1.3 → python_amazon_ad_api-1.1.5}/PKG-INFO +1 -1
  2. {python_amazon_ad_api-1.1.3 → python_amazon_ad_api-1.1.5}/ad_api/api/sb/__init__.py +4 -0
  3. python_amazon_ad_api-1.1.5/ad_api/api/sb/optimization_rules.py +153 -0
  4. python_amazon_ad_api-1.1.5/ad_api/api/sb/targeting_categories.py +98 -0
  5. python_amazon_ad_api-1.1.5/ad_api/version.py +1 -0
  6. {python_amazon_ad_api-1.1.3 → python_amazon_ad_api-1.1.5}/python_amazon_ad_api.egg-info/PKG-INFO +1 -1
  7. {python_amazon_ad_api-1.1.3 → python_amazon_ad_api-1.1.5}/python_amazon_ad_api.egg-info/SOURCES.txt +2 -0
  8. {python_amazon_ad_api-1.1.3 → python_amazon_ad_api-1.1.5}/setup.cfg +1 -1
  9. {python_amazon_ad_api-1.1.3 → python_amazon_ad_api-1.1.5}/setup.py +1 -1
  10. python_amazon_ad_api-1.1.3/ad_api/version.py +0 -1
  11. {python_amazon_ad_api-1.1.3 → python_amazon_ad_api-1.1.5}/LICENSE +0 -0
  12. {python_amazon_ad_api-1.1.3 → python_amazon_ad_api-1.1.5}/README.md +0 -0
  13. {python_amazon_ad_api-1.1.3 → python_amazon_ad_api-1.1.5}/ad_api/__init__.py +0 -0
  14. {python_amazon_ad_api-1.1.3 → python_amazon_ad_api-1.1.5}/ad_api/api/__init__.py +0 -0
  15. {python_amazon_ad_api-1.1.3 → python_amazon_ad_api-1.1.5}/ad_api/api/account.py +0 -0
  16. {python_amazon_ad_api-1.1.3 → python_amazon_ad_api-1.1.5}/ad_api/api/advertising_test_account.py +0 -0
  17. {python_amazon_ad_api-1.1.3 → python_amazon_ad_api-1.1.5}/ad_api/api/attribution.py +0 -0
  18. {python_amazon_ad_api-1.1.3 → python_amazon_ad_api-1.1.5}/ad_api/api/audiences.py +0 -0
  19. {python_amazon_ad_api-1.1.3 → python_amazon_ad_api-1.1.5}/ad_api/api/billing.py +0 -0
  20. {python_amazon_ad_api-1.1.3 → python_amazon_ad_api-1.1.5}/ad_api/api/brand_metrics.py +0 -0
  21. {python_amazon_ad_api-1.1.3 → python_amazon_ad_api-1.1.5}/ad_api/api/creative_assets.py +0 -0
  22. {python_amazon_ad_api-1.1.3 → python_amazon_ad_api-1.1.5}/ad_api/api/eligibility.py +0 -0
  23. {python_amazon_ad_api-1.1.3 → python_amazon_ad_api-1.1.5}/ad_api/api/exports.py +0 -0
  24. {python_amazon_ad_api-1.1.3 → python_amazon_ad_api-1.1.5}/ad_api/api/history.py +0 -0
  25. {python_amazon_ad_api-1.1.3 → python_amazon_ad_api-1.1.5}/ad_api/api/insights.py +0 -0
  26. {python_amazon_ad_api-1.1.3 → python_amazon_ad_api-1.1.5}/ad_api/api/invoices.py +0 -0
  27. {python_amazon_ad_api-1.1.3 → python_amazon_ad_api-1.1.5}/ad_api/api/localization.py +0 -0
  28. {python_amazon_ad_api-1.1.3 → python_amazon_ad_api-1.1.5}/ad_api/api/manager_accounts.py +0 -0
  29. {python_amazon_ad_api-1.1.3 → python_amazon_ad_api-1.1.5}/ad_api/api/metadata.py +0 -0
  30. {python_amazon_ad_api-1.1.3 → python_amazon_ad_api-1.1.5}/ad_api/api/portfolios.py +0 -0
  31. {python_amazon_ad_api-1.1.3 → python_amazon_ad_api-1.1.5}/ad_api/api/portfolios_v3.py +0 -0
  32. {python_amazon_ad_api-1.1.3 → python_amazon_ad_api-1.1.5}/ad_api/api/profiles.py +0 -0
  33. {python_amazon_ad_api-1.1.3 → python_amazon_ad_api-1.1.5}/ad_api/api/recommendations.py +0 -0
  34. {python_amazon_ad_api-1.1.3 → python_amazon_ad_api-1.1.5}/ad_api/api/reports.py +0 -0
  35. {python_amazon_ad_api-1.1.3 → python_amazon_ad_api-1.1.5}/ad_api/api/sb/ad_creatives_v4.py +0 -0
  36. {python_amazon_ad_api-1.1.3 → python_amazon_ad_api-1.1.5}/ad_api/api/sb/ad_groups.py +0 -0
  37. {python_amazon_ad_api-1.1.3 → python_amazon_ad_api-1.1.5}/ad_api/api/sb/ad_groups_v4.py +0 -0
  38. {python_amazon_ad_api-1.1.3 → python_amazon_ad_api-1.1.5}/ad_api/api/sb/ads_v4.py +0 -0
  39. {python_amazon_ad_api-1.1.3 → python_amazon_ad_api-1.1.5}/ad_api/api/sb/benchmarks.py +0 -0
  40. {python_amazon_ad_api-1.1.3 → python_amazon_ad_api-1.1.5}/ad_api/api/sb/bid_recommendations.py +0 -0
  41. {python_amazon_ad_api-1.1.3 → python_amazon_ad_api-1.1.5}/ad_api/api/sb/brands.py +0 -0
  42. {python_amazon_ad_api-1.1.3 → python_amazon_ad_api-1.1.5}/ad_api/api/sb/budget_rules.py +0 -0
  43. {python_amazon_ad_api-1.1.3 → python_amazon_ad_api-1.1.5}/ad_api/api/sb/campaigns.py +0 -0
  44. {python_amazon_ad_api-1.1.3 → python_amazon_ad_api-1.1.5}/ad_api/api/sb/campaigns_v4.py +0 -0
  45. {python_amazon_ad_api-1.1.3 → python_amazon_ad_api-1.1.5}/ad_api/api/sb/forecast.py +0 -0
  46. {python_amazon_ad_api-1.1.3 → python_amazon_ad_api-1.1.5}/ad_api/api/sb/keywords.py +0 -0
  47. {python_amazon_ad_api-1.1.3 → python_amazon_ad_api-1.1.5}/ad_api/api/sb/keywords_recommendations.py +0 -0
  48. {python_amazon_ad_api-1.1.3 → python_amazon_ad_api-1.1.5}/ad_api/api/sb/landing_page_asins.py +0 -0
  49. {python_amazon_ad_api-1.1.3 → python_amazon_ad_api-1.1.5}/ad_api/api/sb/media.py +0 -0
  50. {python_amazon_ad_api-1.1.3 → python_amazon_ad_api-1.1.5}/ad_api/api/sb/negative_keywords.py +0 -0
  51. {python_amazon_ad_api-1.1.3 → python_amazon_ad_api-1.1.5}/ad_api/api/sb/negative_product_targeting.py +0 -0
  52. {python_amazon_ad_api-1.1.3 → python_amazon_ad_api-1.1.5}/ad_api/api/sb/product_targeting.py +0 -0
  53. {python_amazon_ad_api-1.1.3 → python_amazon_ad_api-1.1.5}/ad_api/api/sb/recommendations.py +0 -0
  54. {python_amazon_ad_api-1.1.3 → python_amazon_ad_api-1.1.5}/ad_api/api/sb/reports.py +0 -0
  55. {python_amazon_ad_api-1.1.3 → python_amazon_ad_api-1.1.5}/ad_api/api/sb/stores.py +0 -0
  56. {python_amazon_ad_api-1.1.3 → python_amazon_ad_api-1.1.5}/ad_api/api/sb/targeting_recommendations.py +0 -0
  57. {python_amazon_ad_api-1.1.3 → python_amazon_ad_api-1.1.5}/ad_api/api/sb/themes.py +0 -0
  58. {python_amazon_ad_api-1.1.3 → python_amazon_ad_api-1.1.5}/ad_api/api/sd/__init__.py +0 -0
  59. {python_amazon_ad_api-1.1.3 → python_amazon_ad_api-1.1.5}/ad_api/api/sd/ad_groups.py +0 -0
  60. {python_amazon_ad_api-1.1.3 → python_amazon_ad_api-1.1.5}/ad_api/api/sd/bid_recommendations.py +0 -0
  61. {python_amazon_ad_api-1.1.3 → python_amazon_ad_api-1.1.5}/ad_api/api/sd/brand_safety.py +0 -0
  62. {python_amazon_ad_api-1.1.3 → python_amazon_ad_api-1.1.5}/ad_api/api/sd/budget_rules.py +0 -0
  63. {python_amazon_ad_api-1.1.3 → python_amazon_ad_api-1.1.5}/ad_api/api/sd/campaigns.py +0 -0
  64. {python_amazon_ad_api-1.1.3 → python_amazon_ad_api-1.1.5}/ad_api/api/sd/campaigns_budget_usage.py +0 -0
  65. {python_amazon_ad_api-1.1.3 → python_amazon_ad_api-1.1.5}/ad_api/api/sd/creatives.py +0 -0
  66. {python_amazon_ad_api-1.1.3 → python_amazon_ad_api-1.1.5}/ad_api/api/sd/forecast.py +0 -0
  67. {python_amazon_ad_api-1.1.3 → python_amazon_ad_api-1.1.5}/ad_api/api/sd/negative_product_targeting.py +0 -0
  68. {python_amazon_ad_api-1.1.3 → python_amazon_ad_api-1.1.5}/ad_api/api/sd/product_ads.py +0 -0
  69. {python_amazon_ad_api-1.1.3 → python_amazon_ad_api-1.1.5}/ad_api/api/sd/product_targeting.py +0 -0
  70. {python_amazon_ad_api-1.1.3 → python_amazon_ad_api-1.1.5}/ad_api/api/sd/recommendations.py +0 -0
  71. {python_amazon_ad_api-1.1.3 → python_amazon_ad_api-1.1.5}/ad_api/api/sd/reports.py +0 -0
  72. {python_amazon_ad_api-1.1.3 → python_amazon_ad_api-1.1.5}/ad_api/api/sd/snapshots.py +0 -0
  73. {python_amazon_ad_api-1.1.3 → python_amazon_ad_api-1.1.5}/ad_api/api/sd/targeting_recommendations.py +0 -0
  74. {python_amazon_ad_api-1.1.3 → python_amazon_ad_api-1.1.5}/ad_api/api/sp/__init__.py +0 -0
  75. {python_amazon_ad_api-1.1.3 → python_amazon_ad_api-1.1.5}/ad_api/api/sp/ad_groups_v3.py +0 -0
  76. {python_amazon_ad_api-1.1.3 → python_amazon_ad_api-1.1.5}/ad_api/api/sp/bid_recommendations_v3.py +0 -0
  77. {python_amazon_ad_api-1.1.3 → python_amazon_ad_api-1.1.5}/ad_api/api/sp/budget_initial_recommendation.py +0 -0
  78. {python_amazon_ad_api-1.1.3 → python_amazon_ad_api-1.1.5}/ad_api/api/sp/budget_recommendations.py +0 -0
  79. {python_amazon_ad_api-1.1.3 → python_amazon_ad_api-1.1.5}/ad_api/api/sp/budget_rules.py +0 -0
  80. {python_amazon_ad_api-1.1.3 → python_amazon_ad_api-1.1.5}/ad_api/api/sp/budget_rules_recommendations.py +0 -0
  81. {python_amazon_ad_api-1.1.3 → python_amazon_ad_api-1.1.5}/ad_api/api/sp/campaign_consolidated_recommendations.py +0 -0
  82. {python_amazon_ad_api-1.1.3 → python_amazon_ad_api-1.1.5}/ad_api/api/sp/campaign_negative_keywords_v3.py +0 -0
  83. {python_amazon_ad_api-1.1.3 → python_amazon_ad_api-1.1.5}/ad_api/api/sp/campaign_negative_targets.py +0 -0
  84. {python_amazon_ad_api-1.1.3 → python_amazon_ad_api-1.1.5}/ad_api/api/sp/campaigns_budget_usage.py +0 -0
  85. {python_amazon_ad_api-1.1.3 → python_amazon_ad_api-1.1.5}/ad_api/api/sp/campaigns_v3.py +0 -0
  86. {python_amazon_ad_api-1.1.3 → python_amazon_ad_api-1.1.5}/ad_api/api/sp/campaings_optimization.py +0 -0
  87. {python_amazon_ad_api-1.1.3 → python_amazon_ad_api-1.1.5}/ad_api/api/sp/keywords_v3.py +0 -0
  88. {python_amazon_ad_api-1.1.3 → python_amazon_ad_api-1.1.5}/ad_api/api/sp/negative_keywords_v3.py +0 -0
  89. {python_amazon_ad_api-1.1.3 → python_amazon_ad_api-1.1.5}/ad_api/api/sp/negative_product_targeting_v3.py +0 -0
  90. {python_amazon_ad_api-1.1.3 → python_amazon_ad_api-1.1.5}/ad_api/api/sp/product_ads_v3.py +0 -0
  91. {python_amazon_ad_api-1.1.3 → python_amazon_ad_api-1.1.5}/ad_api/api/sp/product_recommendations.py +0 -0
  92. {python_amazon_ad_api-1.1.3 → python_amazon_ad_api-1.1.5}/ad_api/api/sp/product_targeting_v3.py +0 -0
  93. {python_amazon_ad_api-1.1.3 → python_amazon_ad_api-1.1.5}/ad_api/api/sp/ranked_keywords_recommendations.py +0 -0
  94. {python_amazon_ad_api-1.1.3 → python_amazon_ad_api-1.1.5}/ad_api/api/sp/schedule_based_bid_optimization.py +0 -0
  95. {python_amazon_ad_api-1.1.3 → python_amazon_ad_api-1.1.5}/ad_api/api/stores.py +0 -0
  96. {python_amazon_ad_api-1.1.3 → python_amazon_ad_api-1.1.5}/ad_api/api/stream.py +0 -0
  97. {python_amazon_ad_api-1.1.3 → python_amazon_ad_api-1.1.5}/ad_api/api/v1/__init__.py +0 -0
  98. {python_amazon_ad_api-1.1.3 → python_amazon_ad_api-1.1.5}/ad_api/api/v1/ad_groups.py +0 -0
  99. {python_amazon_ad_api-1.1.3 → python_amazon_ad_api-1.1.5}/ad_api/api/v1/ads.py +0 -0
  100. {python_amazon_ad_api-1.1.3 → python_amazon_ad_api-1.1.5}/ad_api/api/v1/campaigns.py +0 -0
  101. {python_amazon_ad_api-1.1.3 → python_amazon_ad_api-1.1.5}/ad_api/api/v1/targets.py +0 -0
  102. {python_amazon_ad_api-1.1.3 → python_amazon_ad_api-1.1.5}/ad_api/api/validation_configurations.py +0 -0
  103. {python_amazon_ad_api-1.1.3 → python_amazon_ad_api-1.1.5}/ad_api/auth/__init__.py +0 -0
  104. {python_amazon_ad_api-1.1.3 → python_amazon_ad_api-1.1.5}/ad_api/auth/access_token_client.py +0 -0
  105. {python_amazon_ad_api-1.1.3 → python_amazon_ad_api-1.1.5}/ad_api/auth/access_token_response.py +0 -0
  106. {python_amazon_ad_api-1.1.3 → python_amazon_ad_api-1.1.5}/ad_api/auth/credentials.py +0 -0
  107. {python_amazon_ad_api-1.1.3 → python_amazon_ad_api-1.1.5}/ad_api/auth/exceptions.py +0 -0
  108. {python_amazon_ad_api-1.1.3 → python_amazon_ad_api-1.1.5}/ad_api/base/__init__.py +0 -0
  109. {python_amazon_ad_api-1.1.3 → python_amazon_ad_api-1.1.5}/ad_api/base/api_response.py +0 -0
  110. {python_amazon_ad_api-1.1.3 → python_amazon_ad_api-1.1.5}/ad_api/base/base_client.py +0 -0
  111. {python_amazon_ad_api-1.1.3 → python_amazon_ad_api-1.1.5}/ad_api/base/client.py +0 -0
  112. {python_amazon_ad_api-1.1.3 → python_amazon_ad_api-1.1.5}/ad_api/base/config.py +0 -0
  113. {python_amazon_ad_api-1.1.3 → python_amazon_ad_api-1.1.5}/ad_api/base/credential_provider.py +0 -0
  114. {python_amazon_ad_api-1.1.3 → python_amazon_ad_api-1.1.5}/ad_api/base/exceptions.py +0 -0
  115. {python_amazon_ad_api-1.1.3 → python_amazon_ad_api-1.1.5}/ad_api/base/helpers.py +0 -0
  116. {python_amazon_ad_api-1.1.3 → python_amazon_ad_api-1.1.5}/ad_api/base/marketplaces.py +0 -0
  117. {python_amazon_ad_api-1.1.3 → python_amazon_ad_api-1.1.5}/ad_api/base/utils.py +0 -0
  118. {python_amazon_ad_api-1.1.3 → python_amazon_ad_api-1.1.5}/pyproject.toml +0 -0
  119. {python_amazon_ad_api-1.1.3 → python_amazon_ad_api-1.1.5}/python_amazon_ad_api.egg-info/dependency_links.txt +0 -0
  120. {python_amazon_ad_api-1.1.3 → python_amazon_ad_api-1.1.5}/python_amazon_ad_api.egg-info/requires.txt +0 -0
  121. {python_amazon_ad_api-1.1.3 → python_amazon_ad_api-1.1.5}/python_amazon_ad_api.egg-info/top_level.txt +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: python-amazon-ad-api
3
- Version: 1.1.3
3
+ Version: 1.1.5
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
@@ -21,6 +21,8 @@ from .reports import Reports
21
21
  from .benchmarks import Benchmarks
22
22
  from .themes import Themes
23
23
  from .budget_rules import BudgetRules
24
+ from .optimization_rules import OptimizationRules
25
+ from .targeting_categories import TargetingCategories
24
26
 
25
27
  __all__ = [
26
28
  "Brands",
@@ -46,4 +48,6 @@ __all__ = [
46
48
  "Benchmarks",
47
49
  "Themes",
48
50
  "BudgetRules",
51
+ "OptimizationRules",
52
+ "TargetingCategories",
49
53
  ]
@@ -0,0 +1,153 @@
1
+ from ad_api.base import Client, sp_endpoint, ApiResponse, Utils
2
+
3
+
4
+ class OptimizationRules(Client):
5
+ """Sponsored Brands optimization rules.
6
+
7
+ Documentation: https://advertising.amazon.com/API/docs/en-us/sponsored-brands/4-0/openapi
8
+
9
+ Every route in this family takes a versioned media type on the way in, and the
10
+ service routes on it:
11
+
12
+ .. warning::
13
+ With ``application/json`` the router answers ``404 Could not find
14
+ resource`` on every route here, which reads like a missing route but is
15
+ only the wrong media type. Verified on ``list`` and ``recommendations``.
16
+
17
+ The two read routes were probed against a live account; the four write routes
18
+ are built from the contract and not exercised.
19
+ """
20
+
21
+ _MEDIA_RULES = 'application/vnd.sbruleoptimization.v4+json'
22
+ _MEDIA_RECS = 'application/vnd.sboptimizationrecommendationresource.v4+json'
23
+
24
+ @sp_endpoint('/sb/rules/optimization/list', method='POST')
25
+ def list_optimization_rules(self, **kwargs) -> ApiResponse:
26
+ """
27
+ Lists optimization rules.
28
+
29
+ Request Body [Optional]
30
+ | **entityFilter** ({}): ``entityType`` and ``entityId``.
31
+ | **optimizationRuleIdFilter** ({}): ``include``, a list of rule ids.
32
+ | **maxResults** (number): Page size.
33
+ | **nextToken** (string): Pagination token.
34
+
35
+ Returns:
36
+ | ApiResponse, ``200``, with ``optimizationRules`` and ``totalCount``.
37
+
38
+ Example::
39
+
40
+ {"optimizationRules": [], "totalCount": 0}
41
+ """
42
+ return self._request(kwargs.pop('path'),
43
+ data=Utils.convert_body(kwargs.pop('body', {}), False),
44
+ params=kwargs, headers={'Accept': self._MEDIA_RULES,
45
+ 'Content-Type': self._MEDIA_RULES})
46
+
47
+ @sp_endpoint('/sb/recommendations/optimization', method='POST')
48
+ def get_optimization_recommendation(self, costControlMetric, landingPages, **kwargs) -> ApiResponse:
49
+ """
50
+ Gets an optimization rule recommendation.
51
+
52
+ Request Body [Required]
53
+ | **costControlMetric** ({}): [required] Cost control metric.
54
+ | **landingPages** (array): [required] Each entry carries ``pageType``
55
+ and either ``asins`` or ``url``.
56
+
57
+ Returns:
58
+ | ApiResponse, status ``207``.
59
+
60
+ .. note::
61
+ An empty body answers ``400`` with both members named:
62
+ *"Value null at 'costControlMetric' failed to satisfy constraint"*.
63
+ """
64
+ return self._request(kwargs.pop('path'),
65
+ data=Utils.convert_body({'costControlMetric': costControlMetric,
66
+ 'landingPages': landingPages}, False),
67
+ params=kwargs, headers={'Accept': self._MEDIA_RECS,
68
+ 'Content-Type': self._MEDIA_RECS})
69
+
70
+ @sp_endpoint('/sb/rules/optimization', method='POST')
71
+ def create_optimization_rules(self, optimizationRules, **kwargs) -> ApiResponse:
72
+ """
73
+ Creates optimization rules.
74
+
75
+ Request Body [Required]
76
+ | **optimizationRules** (array): [required]
77
+ | **entityType** (string): Type of the entity the rule applies to.
78
+ | **entityId** (string): Identifier of that entity.
79
+ | **conditions** (array): Each entry needs ``attributeName`` and
80
+ ``criteria`` with ``comparisonOperator`` and ``value``.
81
+
82
+ Returns:
83
+ | ApiResponse, status ``207``.
84
+
85
+ .. note::
86
+ Not probed: creates optimization rules on the account.
87
+ """
88
+ return self._request(kwargs.pop('path'),
89
+ data=Utils.convert_body({'optimizationRules': optimizationRules}, False),
90
+ params=kwargs, headers={'Accept': self._MEDIA_RULES,
91
+ 'Content-Type': self._MEDIA_RULES})
92
+
93
+ @sp_endpoint('/sb/rules/optimization', method='PUT')
94
+ def update_optimization_rules(self, optimizationRules, **kwargs) -> ApiResponse:
95
+ """
96
+ Updates optimization rules.
97
+
98
+ Request Body [Required]
99
+ | **optimizationRules** (array): [required] Each entry needs
100
+ ``optimizationRuleId`` and ``conditions``.
101
+
102
+ Returns:
103
+ | ApiResponse, status ``207``.
104
+
105
+ .. note::
106
+ Not probed: updates live optimization rules.
107
+ """
108
+ return self._request(kwargs.pop('path'),
109
+ data=Utils.convert_body({'optimizationRules': optimizationRules}, False),
110
+ params=kwargs, headers={'Accept': self._MEDIA_RULES,
111
+ 'Content-Type': self._MEDIA_RULES})
112
+
113
+ @sp_endpoint('/sb/rules/optimization/associate', method='POST')
114
+ def associate_optimization_rules(self, optimizationRuleAssociations, **kwargs) -> ApiResponse:
115
+ """
116
+ Associates optimization rules with entities.
117
+
118
+ Request Body [Required]
119
+ | **optimizationRuleAssociations** (array): [required] Each entry needs
120
+ ``entityId``, ``entityType`` and ``optimizationRuleId``.
121
+
122
+ Returns:
123
+ | ApiResponse, status ``207``.
124
+
125
+ .. note::
126
+ Not probed: changes which rules apply to live campaigns.
127
+ """
128
+ return self._request(kwargs.pop('path'),
129
+ data=Utils.convert_body(
130
+ {'optimizationRuleAssociations': optimizationRuleAssociations}, False),
131
+ params=kwargs, headers={'Accept': self._MEDIA_RULES,
132
+ 'Content-Type': self._MEDIA_RULES})
133
+
134
+ @sp_endpoint('/sb/rules/optimization/disassociate', method='POST')
135
+ def disassociate_optimization_rules(self, optimizationRuleDisassociations, **kwargs) -> ApiResponse:
136
+ """
137
+ Disassociates optimization rules from entities.
138
+
139
+ Request Body [Required]
140
+ | **optimizationRuleDisassociations** (array): [required] Each entry
141
+ needs ``entityId``, ``entityType`` and ``optimizationRuleId``.
142
+
143
+ Returns:
144
+ | ApiResponse, status ``207``.
145
+
146
+ .. note::
147
+ Not probed: changes which rules apply to live campaigns.
148
+ """
149
+ return self._request(kwargs.pop('path'),
150
+ data=Utils.convert_body(
151
+ {'optimizationRuleDisassociations': optimizationRuleDisassociations}, False),
152
+ params=kwargs, headers={'Accept': self._MEDIA_RULES,
153
+ 'Content-Type': self._MEDIA_RULES})
@@ -0,0 +1,98 @@
1
+ from ad_api.base import Client, sp_endpoint, fill_query_params, ApiResponse, Utils
2
+
3
+
4
+ class TargetingCategories(Client):
5
+ """Sponsored Brands targetable categories.
6
+
7
+ Documentation: https://advertising.amazon.com/API/docs/en-us/sponsored-brands/4-0/openapi
8
+
9
+ All three routes are reads, and all three were probed against a live account.
10
+
11
+ .. note::
12
+ ``list_categories`` returns the tree under ``categoryTree``, which the
13
+ contract does not name. Each node carries ``categoryRefinementId``,
14
+ ``name``, ``parentCategoryRefinementId``, ``isTargetable`` and, where the
15
+ service knows it, ``asinCountRange`` with a ``min`` and ``max``.
16
+
17
+ .. note::
18
+ Large root categories come back with ``isTargetable`` set to ``false``:
19
+ they have to be narrowed down to their children before they can be used
20
+ as a target.
21
+ """
22
+
23
+ _MEDIA = 'application/vnd.sbtargeting.v4+json'
24
+
25
+ @sp_endpoint('/sb/targets/categories', method='GET')
26
+ def list_categories(self, supplySource, **kwargs) -> ApiResponse:
27
+ """
28
+ Gets the targetable category tree.
29
+
30
+ Keyword Args
31
+ | query **supplySource** (string): [required] ``AMAZON`` or
32
+ ``STREAMING_VIDEO``.
33
+ | query **locale** (string): [optional] Market locale, for instance
34
+ ``es_ES``, ``en_US`` or ``de_DE``.
35
+ | query **includeOnlyRootCategories** (boolean): [optional] Return
36
+ root categories only.
37
+ | query **parentCategoryRefinementId** (string): [optional] Return
38
+ the children of that category.
39
+ | query **nextToken** (string): [optional] Pagination token.
40
+
41
+ Returns:
42
+ | ApiResponse, ``200``, with the tree under ``categoryTree``.
43
+
44
+ Example node::
45
+
46
+ {"categoryRefinementId": "1909624031", "name": "Chupetes",
47
+ "asinCountRange": {"min": 1247, "max": 2078},
48
+ "isTargetable": true, "parentCategoryRefinementId": "1862267031"}
49
+ """
50
+ return self._request(kwargs.pop('path'), params=kwargs,
51
+ headers={'Accept': self._MEDIA, 'Content-Type': self._MEDIA})
52
+
53
+ @sp_endpoint('/sb/targets/categories/{}/refinements', method='GET')
54
+ def list_refinements(self, categoryRefinementId, **kwargs) -> ApiResponse:
55
+ """
56
+ Gets the refinements of a category.
57
+
58
+ Keyword Args
59
+ | path **categoryRefinementId** (string): [required]
60
+ | query **locale** (string): [optional]
61
+ | query **nextToken** (string): [optional]
62
+
63
+ Returns:
64
+ | ApiResponse, ``200``.
65
+ """
66
+ return self._request(fill_query_params(kwargs.pop('path'), categoryRefinementId),
67
+ params=kwargs,
68
+ headers={'Accept': self._MEDIA, 'Content-Type': self._MEDIA})
69
+
70
+ @sp_endpoint('/sb/targets/products/count', method='POST')
71
+ def get_product_count(self, category, **kwargs) -> ApiResponse:
72
+ """
73
+ Gets the number of products in a category.
74
+
75
+ Request Body [Required]
76
+ | **category** (string): [required] Category refinement identifier.
77
+ | **ageRanges** (array of string): [optional]
78
+ | **brands** (array of string): [optional]
79
+ | **genres** (array of string): [optional]
80
+ | **isPrimeShipping** (boolean): [optional]
81
+ | **ratingRange** ({}): [optional] ``min`` and ``max`` integers.
82
+ | **priceRange** ({}): [optional] ``min`` and ``max`` numbers.
83
+
84
+ Returns:
85
+ | ApiResponse, ``200``.
86
+
87
+ Raises:
88
+ | ``400`` when ``category`` is missing, naming that member.
89
+ """
90
+ body = {'category': category}
91
+ for key in ('ageRanges', 'brands', 'genres', 'isPrimeShipping',
92
+ 'ratingRange', 'priceRange'):
93
+ if key in kwargs:
94
+ body[key] = kwargs.pop(key)
95
+ return self._request(kwargs.pop('path'),
96
+ data=Utils.convert_body(body, False),
97
+ params=kwargs, headers={'Accept': self._MEDIA,
98
+ 'Content-Type': self._MEDIA})
@@ -0,0 +1 @@
1
+ __version__ = "1.1.5"
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: python-amazon-ad-api
3
- Version: 1.1.3
3
+ Version: 1.1.5
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
@@ -47,10 +47,12 @@ ad_api/api/sb/landing_page_asins.py
47
47
  ad_api/api/sb/media.py
48
48
  ad_api/api/sb/negative_keywords.py
49
49
  ad_api/api/sb/negative_product_targeting.py
50
+ ad_api/api/sb/optimization_rules.py
50
51
  ad_api/api/sb/product_targeting.py
51
52
  ad_api/api/sb/recommendations.py
52
53
  ad_api/api/sb/reports.py
53
54
  ad_api/api/sb/stores.py
55
+ ad_api/api/sb/targeting_categories.py
54
56
  ad_api/api/sb/targeting_recommendations.py
55
57
  ad_api/api/sb/themes.py
56
58
  ad_api/api/sd/__init__.py
@@ -1,6 +1,6 @@
1
1
  [metadata]
2
2
  name = python-amazon-ad-api
3
- version = 1.1.3
3
+ version = 1.1.5
4
4
  author = Daniel Alvaro
5
5
  author_email = denisneuf@hotmail.com
6
6
  description = Python wrapper for the Amazon Advertising API
@@ -2,7 +2,7 @@ from setuptools import setup
2
2
 
3
3
  setup(
4
4
  name='python-amazon-ad-api',
5
- version='1.1.3',
5
+ version='1.1.5',
6
6
  install_requires=[
7
7
  "requests>=2.27.1,<2.35.0",
8
8
  "six>=1.16,<1.18",
@@ -1 +0,0 @@
1
- __version__ = "1.1.3"