python-amazon-ad-api 1.1.3__py3-none-any.whl → 1.1.4__py3-none-any.whl
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.
- ad_api/api/sb/__init__.py +2 -0
- ad_api/api/sb/optimization_rules.py +153 -0
- ad_api/version.py +1 -1
- {python_amazon_ad_api-1.1.3.dist-info → python_amazon_ad_api-1.1.4.dist-info}/METADATA +1 -1
- {python_amazon_ad_api-1.1.3.dist-info → python_amazon_ad_api-1.1.4.dist-info}/RECORD +8 -7
- {python_amazon_ad_api-1.1.3.dist-info → python_amazon_ad_api-1.1.4.dist-info}/WHEEL +0 -0
- {python_amazon_ad_api-1.1.3.dist-info → python_amazon_ad_api-1.1.4.dist-info}/licenses/LICENSE +0 -0
- {python_amazon_ad_api-1.1.3.dist-info → python_amazon_ad_api-1.1.4.dist-info}/top_level.txt +0 -0
ad_api/api/sb/__init__.py
CHANGED
|
@@ -21,6 +21,7 @@ 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
|
|
24
25
|
|
|
25
26
|
__all__ = [
|
|
26
27
|
"Brands",
|
|
@@ -46,4 +47,5 @@ __all__ = [
|
|
|
46
47
|
"Benchmarks",
|
|
47
48
|
"Themes",
|
|
48
49
|
"BudgetRules",
|
|
50
|
+
"OptimizationRules",
|
|
49
51
|
]
|
|
@@ -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})
|
ad_api/version.py
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
__version__ = "1.1.
|
|
1
|
+
__version__ = "1.1.4"
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
ad_api/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
2
|
-
ad_api/version.py,sha256=
|
|
2
|
+
ad_api/version.py,sha256=XxXhu8-QnuD9hA8Ah0WX5rgpt_DwOQmAwcK-FtpngyQ,22
|
|
3
3
|
ad_api/api/__init__.py,sha256=E9c0ZyK4vplMlKKEBF8CV5u7P4uSkTMSQsAuSQu5bfY,1514
|
|
4
4
|
ad_api/api/account.py,sha256=CmOvCfHoPWaeTUJvtB0pNoNulZVSz4oMMCKIpVTpHos,2931
|
|
5
5
|
ad_api/api/advertising_test_account.py,sha256=btOVbdk2tBDmyKSJaQbcIFyzNG8KFJVUmTe4p9xMhpU,1507
|
|
@@ -24,7 +24,7 @@ ad_api/api/reports.py,sha256=gNmDHLULD2uaJgsMpIbCX9kabwhMXRr9WfZBtHUdsOY,6043
|
|
|
24
24
|
ad_api/api/stores.py,sha256=7W3RJKZyZOQ3nHzInvK9FDhWTXCH6Xe9a6dCBatEZ-o,2484
|
|
25
25
|
ad_api/api/stream.py,sha256=JpnF8SKniOAHiEnEq1RPrh6tNy-Q2-8GPBTmnlxEXqQ,2989
|
|
26
26
|
ad_api/api/validation_configurations.py,sha256=V3o06uWGwvA_Ly1x2lAiCk35Wo7DC_k8AtHgMdpm6wU,3830
|
|
27
|
-
ad_api/api/sb/__init__.py,sha256
|
|
27
|
+
ad_api/api/sb/__init__.py,sha256=-rseg1GpT0FaUL_s4c0HTU1OvriGccqVybrNV2oPqws,1407
|
|
28
28
|
ad_api/api/sb/ad_creatives_v4.py,sha256=86sF2lhSc3AC6d4P5TXyEnJMBjn9HvsJe4bbCQbSWK0,10508
|
|
29
29
|
ad_api/api/sb/ad_groups.py,sha256=W06Fk0CCsuEYen1Bd8obR6aHpOMhk6tGWNWApecw59c,2882
|
|
30
30
|
ad_api/api/sb/ad_groups_v4.py,sha256=f6KpOrJ2RsCa4aznP8vdGbXp0HGsCmLOvC9yXX2pESc,3669
|
|
@@ -42,6 +42,7 @@ ad_api/api/sb/landing_page_asins.py,sha256=j3qi2-KccuEzGLZrl6EfZBSikW2R4B4l7Tixp
|
|
|
42
42
|
ad_api/api/sb/media.py,sha256=5LTeM4AHSDKw_58aTB2nEZhIYdWkztH0syBXaovS1rs,2529
|
|
43
43
|
ad_api/api/sb/negative_keywords.py,sha256=ww3IRbawidDHAaYIkX5SsH2OZKJj4UnCylqqFeq3OoY,6918
|
|
44
44
|
ad_api/api/sb/negative_product_targeting.py,sha256=QbK1EhhzmnNOzGtbkrAZ4HS5OqiLU3nZBmsl1scd2D0,5085
|
|
45
|
+
ad_api/api/sb/optimization_rules.py,sha256=aj9tZwKdaOzjnAN-8FHb49aiejNZKCCCcR8fjffH4k0,6802
|
|
45
46
|
ad_api/api/sb/product_targeting.py,sha256=o6aB3hIh9jKvi_uTXFi--1hpnPFuXzQ-U9N7VUP_Bz4,5362
|
|
46
47
|
ad_api/api/sb/recommendations.py,sha256=_21L8tZPuArmJ30XyR1SKQHQH_yswvF0IMqwD9sLhgY,347
|
|
47
48
|
ad_api/api/sb/reports.py,sha256=icw5DpRrqfj0idEo0NN1GPDpIWQun2h_c2Uwc7CpNUA,3801
|
|
@@ -105,8 +106,8 @@ ad_api/base/exceptions.py,sha256=9D3M40ZIlLS0fA-aQh1BTWPOW-Nvf0tRhbA85jFnDJ4,438
|
|
|
105
106
|
ad_api/base/helpers.py,sha256=naUkDLK466x_OBCPXxMlzRc2nPC6iQ6H_vyUji0MJJ0,2282
|
|
106
107
|
ad_api/base/marketplaces.py,sha256=44lvCcluXNpqTprWQ80e3weSQmQbJoWL-WDSOWVbCyQ,4657
|
|
107
108
|
ad_api/base/utils.py,sha256=_qnCBOvyJTLgaZjJzUWTi38GGLHkQszXELs79133Rb4,5618
|
|
108
|
-
python_amazon_ad_api-1.1.
|
|
109
|
-
python_amazon_ad_api-1.1.
|
|
110
|
-
python_amazon_ad_api-1.1.
|
|
111
|
-
python_amazon_ad_api-1.1.
|
|
112
|
-
python_amazon_ad_api-1.1.
|
|
109
|
+
python_amazon_ad_api-1.1.4.dist-info/licenses/LICENSE,sha256=h2rpqlmmLy-4l1tN6KpWAFxx1JEMYeEFrMrZUbx_B_o,1105
|
|
110
|
+
python_amazon_ad_api-1.1.4.dist-info/METADATA,sha256=Eu-MK8yO9WBcDpXS-oU_GW5N2lz2Ye8XEl_P1kA1npk,20486
|
|
111
|
+
python_amazon_ad_api-1.1.4.dist-info/WHEEL,sha256=aeYiig01lYGDzBgS8HxWXOg3uV61G9ijOsup-k9o1sk,91
|
|
112
|
+
python_amazon_ad_api-1.1.4.dist-info/top_level.txt,sha256=nN9twUos-8pkP514ZwpvRU9YL9L2XyQyHsMQFfudGTU,7
|
|
113
|
+
python_amazon_ad_api-1.1.4.dist-info/RECORD,,
|
|
File without changes
|
{python_amazon_ad_api-1.1.3.dist-info → python_amazon_ad_api-1.1.4.dist-info}/licenses/LICENSE
RENAMED
|
File without changes
|
|
File without changes
|