python-amazon-ad-api 1.5.6__py3-none-any.whl → 1.5.8__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/eligibility.py CHANGED
@@ -1,72 +1,100 @@
1
1
  from ad_api.base import Client, sp_endpoint, ApiResponse, Utils
2
- import json
3
2
  import logging
4
3
 
5
4
 
6
5
  class Eligibility(Client):
7
- r""" """
6
+ r"""Product and program eligibility for Amazon ads."""
8
7
 
9
8
  @sp_endpoint('/eligibility/product/list', method='POST')
10
9
  def get_eligibility(self, **kwargs) -> ApiResponse:
11
10
  r"""
12
-
13
11
  get_eligibility(body: (dict, str)) -> ApiResponse
14
12
 
15
- Gets a list of advertising eligibility objects for a set of products. Requests are permitted only for products sold by the merchant associated with the profile. Note that the request object is a list of ASINs, but multiple SKUs are returned if there is more than one SKU associated with an ASIN. If a product is not eligible for advertising, the response includes an object describing the reasons for ineligibility.
13
+ Product eligibility for a set of ASINs. Only products sold by the
14
+ merchant behind the profile are accepted. The request carries ASINs,
15
+ but several SKUs may come back for one ASIN, and an ineligible
16
+ product comes back with the reasons rather than being left out.
16
17
 
17
18
  body: | REQUIRED
19
+ '**adType**': *string* [dsp, sb, sd, sp] default sp
20
+ '**productDetailsList**': list of {asin, sku}
21
+ '**locale**': *string*
22
+ """
23
+ body = Utils.convert_body(kwargs.pop('body'), wrap=False)
24
+ return self._request(kwargs.pop('path'), data=body, params=kwargs)
18
25
 
19
- '**adType**': *string*, {'description': 'Set to 'sp' to check product eligibility for Sponsored Products advertisements. Set to 'sb' to check product eligibility for Sponsored Brands advertisements. default: sp. [ sp, sb ]'}
26
+ @sp_endpoint('/eligibility/product/list', method='POST')
27
+ def get_eligibility_assistant(self, asin_list: list, sku_list: list = None,
28
+ ad_type: str = 'sp', locale: str = 'en-GB',
29
+ **kwargs) -> ApiResponse:
30
+ r"""
31
+ get_eligibility_assistant(asin_list, sku_list=None, ad_type='sp', locale='en-GB')
20
32
 
21
- '**productDetailsList**': *dict*, {'asin*': 'An Amazon product identifier.', 'sku': 'A seller product identifier'}
33
+ Builds the body for get_eligibility from plain lists.
22
34
 
23
- '**locale**': *string*, {'description': 'Set to the locale string in the table below to specify the language in which the response is returned.'}
35
+ sku_list is optional. When given it must be a list of the same length
36
+ as asin_list, so each entry pairs by position; a mismatch raises here
37
+ rather than sending a body the service will refuse.
38
+ """
24
39
 
25
- Returns:
40
+ if not asin_list:
41
+ raise ValueError('asin_list is empty; at least one ASIN is required')
26
42
 
27
- ApiResponse
43
+ if sku_list is not None:
44
+ if not isinstance(sku_list, list):
45
+ raise TypeError(
46
+ 'sku_list must be a list or None, got %s' % type(sku_list).__name__
47
+ )
48
+ if len(sku_list) != len(asin_list):
49
+ raise ValueError(
50
+ 'asin_list and sku_list must have the same length: %d != %d'
51
+ % (len(asin_list), len(sku_list))
52
+ )
28
53
 
29
- """
30
- body = Utils.convert_body(kwargs.pop('body'), wrap=False)
31
- return self._request(kwargs.pop('path'), data=body, params=kwargs)
54
+ details = []
32
55
 
33
- @sp_endpoint('/eligibility/product/list', method='POST')
34
- def get_eligibility_assistant(self, asin_list: list, sku_list: list = None, ad_type: str = "sp", locale: str = "en-GB", **kwargs) -> ApiResponse:
35
- r"""
56
+ for index, asin in enumerate(asin_list):
57
+ entry = {'asin': asin}
58
+ if sku_list is not None:
59
+ entry['sku'] = sku_list[index]
60
+ details.append(entry)
36
61
 
37
- get_eligibility_assistant(asin_list: list, sku_list: list = None, ad_type: str = "sp", locale:str = "en-GB") -> ApiResponse
62
+ body = {'adType': ad_type, 'productDetailsList': details, 'locale': locale}
38
63
 
39
- Gets a list of advertising eligibility objects for a set of products. Requests are permitted only for products sold by the merchant associated with the profile. Note that the request object is a list of ASINs, but multiple SKUs are returned if there is more than one SKU associated with an ASIN. If a product is not eligible for advertising, the response includes an object describing the reasons for ineligibility.
64
+ logging.debug('get_eligibility_assistant body: %s', body)
40
65
 
41
- | **asin_list**: 'A list of ASIN: An Amazon product identifier.'
42
- | **sku_list**: 'A list of SKU: A seller product identifier'
43
- | **adType**: *string*, {'description': 'Set to 'sp' to check product eligibility for Sponsored Products advertisements. Set to 'sb' to check product eligibility for Sponsored Brands advertisements. default: sp. [ sp, sb ]'}
44
- | **locale**': *string*, {'description': 'Set to the locale string in the table below to specify the language in which the response is returned. default: en_GB'}
66
+ return self.get_eligibility(body=body, **kwargs)
45
67
 
46
- Returns:
68
+ @sp_endpoint('/eligibility/programs', method='POST')
69
+ def get_program_eligibility(self, **kwargs) -> ApiResponse:
70
+ r"""
71
+ get_program_eligibility(body: dict) -> ApiResponse
47
72
 
48
- ApiResponse
73
+ Account level eligibility for the Amazon ad programs, not for a
74
+ product: Sponsored Products, Sponsored Brands, Sponsored Display,
75
+ Stores, DirectToConsumer, Amazon Attribution and the rest.
49
76
 
50
- """
77
+ Two media types are declared:
51
78
 
52
- asin_dict = []
79
+ application/json the default shape, with skipChecks
80
+ application/vnd.programeligibility.v2+json
81
+ v2, with maxResults and nextToken
53
82
 
54
- required = {}
55
- required.update({'adType': ad_type})
83
+ Pass media_type='v2' for the paginated one.
84
+ """
56
85
 
57
- if len(asin_list) > 0 and isinstance(sku_list, str) or sku_list is None:
58
- for asin in asin_list:
59
- asin_dict.append({'asin': asin})
86
+ media_type = kwargs.pop('media_type', None)
60
87
 
61
- if sku_list is not None and isinstance(sku_list, list):
62
- if len(asin_list) == len(sku_list):
63
- for i in range(len(asin_list)):
64
- asin_dict.append({'asin': asin_list[i], 'sku': sku_list[i]})
65
- else:
66
- logging.error("No coinciden las listas")
88
+ if media_type == 'v2':
89
+ content_type = 'application/vnd.programeligibility.v2+json'
90
+ else:
91
+ content_type = 'application/json'
67
92
 
68
- required.update({'productDetailsList': asin_dict})
69
- required.update({'locale': locale})
93
+ headers = {'Content-Type': content_type, 'Accept': 'application/json'}
70
94
 
71
- data_str = json.dumps(required)
72
- return self._request(kwargs.pop('path'), data=data_str, params=kwargs)
95
+ return self._request(
96
+ kwargs.pop('path'),
97
+ data=Utils.convert_body(kwargs.pop('body'), wrap=False),
98
+ params=kwargs,
99
+ headers=headers,
100
+ )
ad_api/api/v1/__init__.py CHANGED
@@ -16,6 +16,7 @@ from .recommendations import Recommendations
16
16
  from .selling_accounts import SellingAccounts
17
17
  from .label_object_associations import LabelObjectAssociations
18
18
  from .geo_locations import GeoLocations
19
+ from .recommendation_types import RecommendationTypes
19
20
 
20
21
  __all__ = [
21
22
  "Campaigns",
@@ -36,4 +37,5 @@ __all__ = [
36
37
  "SellingAccounts",
37
38
  "LabelObjectAssociations",
38
39
  "GeoLocations",
40
+ "RecommendationTypes",
39
41
  ]
@@ -0,0 +1,48 @@
1
+ from ad_api.base import Client, sp_endpoint, ApiResponse, Utils
2
+
3
+
4
+ class RecommendationTypes(Client):
5
+ r"""
6
+ RecommendationTypes(account='default', marketplace: Marketplaces = Marketplaces.EU, credentials=None, debug=False)
7
+
8
+ Amazon Ads API v1 - recommendation types for Sponsored Brands
9
+
10
+ One route, read only, and the product is in the path:
11
+
12
+ POST /adsApi/v1/query/recommendationTypes/sb
13
+
14
+ This family lists the kinds of recommendation that exist. Recommendations
15
+ itself, in ad_api.api.v1.Recommendations, lists the ones the account
16
+ actually has.
17
+
18
+ Only the Sponsored Brands segment is published, and its schemas are
19
+ prefixed SB. The route keeps no SB in its name, so another product would
20
+ arrive as .../sp or .../sd beside it.
21
+ """
22
+
23
+ @sp_endpoint('/adsApi/v1/query/recommendationTypes/sb', method='POST')
24
+ def query_sb_recommendation_types(self, **kwargs) -> ApiResponse:
25
+ r"""
26
+ query_sb_recommendation_types(body: dict) -> ApiResponse
27
+
28
+ Amazon Ads API v1 - Query SB Recommendation Types (operationId: SBQueryRecommendationType)
29
+
30
+ Request Body [All optional]
31
+ | **maxResults** (int) : 50..500, default 50
32
+ | **nextToken** (string) : token to navigate to the next page
33
+
34
+ Returns
35
+ | **recommendationTypes** (list<SBRecommendationType>) : 0..500
36
+ | **recommendationTypeId** (string) : [required] a UUID or a unique descriptive string
37
+ | **recommendationTypeTitle** (string) : [required]
38
+ | **nextToken** (string)
39
+
40
+ maxResults starts at 50, so a smaller value is a rejected body rather
41
+ than a shorter page. An empty body is valid and asks for the defaults.
42
+
43
+ Requires one of these permissions:
44
+ advertiser_campaign_view
45
+ """
46
+ schema_version = 'application/json'
47
+ headers = {"Accept": schema_version, "Content-Type": schema_version}
48
+ return self._request(kwargs.pop('path'), data=Utils.convert_body(kwargs.pop('body'), False), params=kwargs, headers=headers)
ad_api/version.py CHANGED
@@ -1 +1 @@
1
- __version__ = "1.5.6"
1
+ __version__ = "1.5.8"
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: python-amazon-ad-api
3
- Version: 1.5.6
3
+ Version: 1.5.8
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
@@ -318,6 +318,7 @@ The v1 API lives under `/adsApi/v1/` and is **not** split by product: every call
318
318
  * [Selling Accounts](https://python-amazon-ad-api.readthedocs.io/en/latest/v1/selling_accounts.html#ad_api.api.v1.SellingAccounts.SellingAccounts.query_selling_accounts)
319
319
  * [Label Object Associations](https://python-amazon-ad-api.readthedocs.io/en/latest/v1/label_object_associations.html#ad_api.api.v1.LabelObjectAssociations.LabelObjectAssociations.query_label_object_associations)
320
320
  * [Geo Locations](https://python-amazon-ad-api.readthedocs.io/en/latest/v1/geo_locations.html#ad_api.api.v1.GeoLocations.GeoLocations.create_geo_locations)
321
+ * [Recommendation Types](https://python-amazon-ad-api.readthedocs.io/en/latest/v1/recommendation_types.html#ad_api.api.v1.RecommendationTypes.RecommendationTypes.query_sb_recommendation_types)
321
322
 
322
323
 
323
324
  ### [Modules Available Sponsored Products](https://python-amazon-ad-api.readthedocs.io/en/latest/sp.html)
@@ -1,5 +1,5 @@
1
1
  ad_api/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
2
- ad_api/version.py,sha256=u_3L7bjAA3w8BLRhTxxaVOCj_Cwsqn8JR4UZjPNAWbY,22
2
+ ad_api/version.py,sha256=aGdl9Y3XkJkVSG47nNBoRdRr4veFwvs7t9uDlneAtdg,22
3
3
  ad_api/api/__init__.py,sha256=M07SD5BRC1L4_PqxLc8cKPI9Iq5zC2jPhkFUeHoh6CM,1632
4
4
  ad_api/api/account.py,sha256=CmOvCfHoPWaeTUJvtB0pNoNulZVSz4oMMCKIpVTpHos,2931
5
5
  ad_api/api/account_budgets.py,sha256=jFce5eLWAFK3ydjnYR7_Sv7B0-gHTG5bMTx_TcHyy1A,2319
@@ -9,7 +9,7 @@ ad_api/api/audiences.py,sha256=TQPt4avswFdCodNfQGDGxcJ2mY2LP2BfYvjxP6oJ0qY,3491
9
9
  ad_api/api/billing.py,sha256=pmBQzejCM8YIsI51KTVunDTVTKMIaox0D2B4acH4w6Y,23526
10
10
  ad_api/api/brand_metrics.py,sha256=DVg9qu_-sALxaQhQjRG6Isi_5SYxA5nmTg99jTe5Tls,9237
11
11
  ad_api/api/creative_assets.py,sha256=u0bCnioUFpGOQO5Z_MO0ErSLcAgSZB5GWM5wm2oW6L0,9687
12
- ad_api/api/eligibility.py,sha256=xbHMNxpRqToQDlG8y7nhhSr55ZZIJ_ZA304rmWa7Jx0,3680
12
+ ad_api/api/eligibility.py,sha256=LS8CsTXRRVyBdVWOH_3cVybxTXUHahZMsrQHwdmuSxA,3893
13
13
  ad_api/api/exports.py,sha256=Y59C99axCAltMgu3gbfzdnoLKjNTsJ7s1z18yzcxzls,2788
14
14
  ad_api/api/history.py,sha256=tB4XawmQNxDMolaubDUjuIHtrYXRFuhOr4WCB8OJ1t8,2568
15
15
  ad_api/api/insights.py,sha256=b0m2_khfDGskbvn4sidsUpOvV-gr2bsjUup0kSo8HV8,2398
@@ -89,7 +89,7 @@ ad_api/api/sp/product_recommendations.py,sha256=vXoZIRqcFc5bo9MUprArKndxcEYe_Puy
89
89
  ad_api/api/sp/product_targeting_v3.py,sha256=vk_T0piHzP5uwt8HSHm5hFKP_0sXJD8nbyooPtM-BTs,9567
90
90
  ad_api/api/sp/ranked_keywords_recommendations.py,sha256=QYFje19TFmwhedh7sn5VJIypL8gp6d6tpBQCpf_SIXw,13094
91
91
  ad_api/api/sp/schedule_based_bid_optimization.py,sha256=G8VkS7iP1lTIAxZgbfRCLz8njw1DkVH9HQPOZ63pWNU,2371
92
- ad_api/api/v1/__init__.py,sha256=Y51M9bFX_nZhuiiJ1Co_9nQXi5fpCQSdK6BU75NPzqc,1167
92
+ ad_api/api/v1/__init__.py,sha256=N1e8b3-ZkHINLz7Ejdb4QGRoKa6R5qMaSYdDFpnBzVQ,1248
93
93
  ad_api/api/v1/ad_associations.py,sha256=g5L8hAIagmsb-yQ09hP7z1zbVVe868NlpOOokv-Mouc,5812
94
94
  ad_api/api/v1/ad_extensions.py,sha256=kL-7xHaXXqb2jXTwZrY0oGttLAG0CW_IjBAqL_CI92U,5519
95
95
  ad_api/api/v1/ad_groups.py,sha256=pQhCVdve_O6kbL4mBA5bxxhKcKNl_BKqa7z9DvrxwaM,12626
@@ -104,6 +104,7 @@ ad_api/api/v1/geo_locations.py,sha256=gH1kR1rPQuIdzStB6wvWI40-XRo5yFyVI9AYYcjN5_
104
104
  ad_api/api/v1/label_object_associations.py,sha256=zXuD5cUAfqL-PRObvjOM54KC356HFqnzA5ehpGSJPYk,2597
105
105
  ad_api/api/v1/labels.py,sha256=jjPmafIQZTh99Ztj5MCcDC7UyoFFN0YuWdn2syqd3Yg,2438
106
106
  ad_api/api/v1/manager_accounts.py,sha256=cNAs1Qq6SYG0y4_4UpNBDfItqBJ1NvYACsIvFc8h-rw,4980
107
+ ad_api/api/v1/recommendation_types.py,sha256=aEBfXu1EhzcRk9Nhin8_ieFiNnBiusX_vWviJw_qD08,2077
107
108
  ad_api/api/v1/recommendations.py,sha256=RJfmwUQ4YOcTdXiHz_U2ArJ01B29vKleRS_avJFjS14,3737
108
109
  ad_api/api/v1/reports.py,sha256=vJmWhIsALkX27HeijTsSUz3zrYhUBm4RodTCieJD8Y8,6657
109
110
  ad_api/api/v1/selling_accounts.py,sha256=0_R4yzvXGp_gFyfcZeWJyeIr7Wh4eGpLfK12podXqGA,1941
@@ -123,8 +124,8 @@ ad_api/base/exceptions.py,sha256=9D3M40ZIlLS0fA-aQh1BTWPOW-Nvf0tRhbA85jFnDJ4,438
123
124
  ad_api/base/helpers.py,sha256=UK7Q13vZ0mNdF54xzfzoGDn2O_cd2yPrK2X4rOzC41c,2334
124
125
  ad_api/base/marketplaces.py,sha256=44lvCcluXNpqTprWQ80e3weSQmQbJoWL-WDSOWVbCyQ,4657
125
126
  ad_api/base/utils.py,sha256=_qnCBOvyJTLgaZjJzUWTi38GGLHkQszXELs79133Rb4,5618
126
- python_amazon_ad_api-1.5.6.dist-info/licenses/LICENSE,sha256=h2rpqlmmLy-4l1tN6KpWAFxx1JEMYeEFrMrZUbx_B_o,1105
127
- python_amazon_ad_api-1.5.6.dist-info/METADATA,sha256=P-mpEe8OlzMB8dA-eu4MQkFh6nXHkr4Ey09arRKBTew,23957
128
- python_amazon_ad_api-1.5.6.dist-info/WHEEL,sha256=aeYiig01lYGDzBgS8HxWXOg3uV61G9ijOsup-k9o1sk,91
129
- python_amazon_ad_api-1.5.6.dist-info/top_level.txt,sha256=nN9twUos-8pkP514ZwpvRU9YL9L2XyQyHsMQFfudGTU,7
130
- python_amazon_ad_api-1.5.6.dist-info/RECORD,,
127
+ python_amazon_ad_api-1.5.8.dist-info/licenses/LICENSE,sha256=h2rpqlmmLy-4l1tN6KpWAFxx1JEMYeEFrMrZUbx_B_o,1105
128
+ python_amazon_ad_api-1.5.8.dist-info/METADATA,sha256=H-CSkEpq4IYNWM_YPyh57IIeZcPCnxrdrWgtapxHJh8,24150
129
+ python_amazon_ad_api-1.5.8.dist-info/WHEEL,sha256=aeYiig01lYGDzBgS8HxWXOg3uV61G9ijOsup-k9o1sk,91
130
+ python_amazon_ad_api-1.5.8.dist-info/top_level.txt,sha256=nN9twUos-8pkP514ZwpvRU9YL9L2XyQyHsMQFfudGTU,7
131
+ python_amazon_ad_api-1.5.8.dist-info/RECORD,,