python-amazon-ad-api 1.6.0__py3-none-any.whl → 1.8.1__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.
@@ -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.
ad_api/api/v1/__init__.py CHANGED
@@ -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)
@@ -2,7 +2,7 @@ import requests
2
2
  import hashlib
3
3
  import logging
4
4
  from cachetools import TTLCache
5
- from ad_api.base import BaseClient
5
+ from ad_api.shared.base_client import BaseClient
6
6
 
7
7
  from .credentials import Credentials
8
8
  from .access_token_response import AccessTokenResponse
ad_api/base/__init__.py CHANGED
@@ -1,4 +1,4 @@
1
- from .base_client import BaseClient
1
+ from ad_api.shared.base_client import BaseClient
2
2
  from .client import Client
3
3
  from .helpers import fill_query_params, sp_endpoint
4
4
  from .marketplaces import Marketplaces, MarketplacesIds, Currencies, CurrencySymbols, Locales
@@ -11,7 +11,6 @@ from .api_response import ApiResponse
11
11
  from .utils import Utils
12
12
 
13
13
  __all__ = [
14
- 'AccessTokenClient',
15
14
  'ApiResponse',
16
15
  'Client',
17
16
  'BaseClient',
ad_api/base/client.py CHANGED
@@ -5,7 +5,7 @@ from cachetools import TTLCache
5
5
  from requests import request
6
6
  from ad_api.auth import AccessTokenClient, AccessTokenResponse
7
7
  from .api_response import ApiResponse
8
- from .base_client import BaseClient
8
+ from ad_api.shared.base_client import BaseClient
9
9
  from .exceptions import get_exception_for_code, get_exception_for_content
10
10
  from .marketplaces import Marketplaces
11
11
  import os
File without changes
ad_api/version.py CHANGED
@@ -1 +1 @@
1
- __version__ = "1.6.0"
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.6.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
@@ -297,25 +297,26 @@ except AdvertisingApiException as error:
297
297
 
298
298
  | Module | Vendor contract | Vendor docs |
299
299
  |---|---|---|
300
- | [Campaigns](https://python-amazon-ad-api.readthedocs.io/en/latest/v1/campaigns.html) | [contract](https://d1y2lf8k3vrkfu.cloudfront.net/openapi/en-us/dest/AmazonAdsAPIALLMerged_prod_3p.json) | [docs](https://advertising.amazon.com/API/docs/en-us/api-spec-v1-campaigns) |
301
- | [Ad Groups](https://python-amazon-ad-api.readthedocs.io/en/latest/v1/ad_groups.html) | [contract](https://d1y2lf8k3vrkfu.cloudfront.net/openapi/en-us/dest/AmazonAdsAPIALLMerged_prod_3p.json) | [docs](https://advertising.amazon.com/API/docs/en-us/api-spec-v1-adgroups) |
302
- | [Ads](https://python-amazon-ad-api.readthedocs.io/en/latest/v1/ads.html) | [contract](https://d1y2lf8k3vrkfu.cloudfront.net/openapi/en-us/dest/AmazonAdsAPIALLMerged_prod_3p.json) | [docs](https://advertising.amazon.com/API/docs/en-us/api-spec-v1-ads) |
303
- | [Targets](https://python-amazon-ad-api.readthedocs.io/en/latest/v1/targets.html) | [contract](https://d1y2lf8k3vrkfu.cloudfront.net/openapi/en-us/dest/AmazonAdsAPIALLMerged_prod_3p.json) | [docs](https://advertising.amazon.com/API/docs/en-us/api-spec-v1-targets) |
304
- | [Ad Extensions](https://python-amazon-ad-api.readthedocs.io/en/latest/v1/ad_extensions.html) | [contract](https://d1y2lf8k3vrkfu.cloudfront.net/openapi/en-us/dest/AmazonAdsAPIALLMerged_prod_3p.json) | [docs](https://advertising.amazon.com/API/docs/en-us/api-spec-v1-adextensions) |
305
- | [Advertiser Accounts](https://python-amazon-ad-api.readthedocs.io/en/latest/v1/advertiser_accounts.html) | [contract](https://d1y2lf8k3vrkfu.cloudfront.net/openapi/en-us/dest/AmazonAdsAPIALLMerged_prod_3p.json) | [docs](https://advertising.amazon.com/API/docs/en-us/api-spec-v1-advertiseraccounts) |
306
- | [Ad Associations](https://python-amazon-ad-api.readthedocs.io/en/latest/v1/ad_associations.html) | [contract](https://d1y2lf8k3vrkfu.cloudfront.net/openapi/en-us/dest/AmazonAdsAPIALLMerged_prod_3p.json) | [docs](https://advertising.amazon.com/API/docs/en-us/api-spec-v1-adassociations) |
307
- | [Brand Store Edition Publish Versions](https://python-amazon-ad-api.readthedocs.io/en/latest/v1/brand_store_edition_publish_versions.html) | [contract](https://d1y2lf8k3vrkfu.cloudfront.net/openapi/en-us/dest/AmazonAdsAPIALLMerged_prod_3p.json) | [docs](https://advertising.amazon.com/API/docs/en-us/api-spec-v1-brandstoreeditionpublishversions) |
308
- | [Brand Stores](https://python-amazon-ad-api.readthedocs.io/en/latest/v1/brand_stores.html) | [contract](https://d1y2lf8k3vrkfu.cloudfront.net/openapi/en-us/dest/AmazonAdsAPIALLMerged_prod_3p.json) | [docs](https://advertising.amazon.com/API/docs/en-us/api-spec-v1-brandstores) |
309
- | [Brand Store Editions](https://python-amazon-ad-api.readthedocs.io/en/latest/v1/brand_store_editions.html) | [contract](https://d1y2lf8k3vrkfu.cloudfront.net/openapi/en-us/dest/AmazonAdsAPIALLMerged_prod_3p.json) | [docs](https://advertising.amazon.com/API/docs/en-us/api-spec-v1-brandstoreeditions) |
310
- | [Brand Store Pages](https://python-amazon-ad-api.readthedocs.io/en/latest/v1/brand_store_pages.html) | [contract](https://d1y2lf8k3vrkfu.cloudfront.net/openapi/en-us/dest/AmazonAdsAPIALLMerged_prod_3p.json) | [docs](https://advertising.amazon.com/API/docs/en-us/api-spec-v1-brandstorepages) |
311
- | [Reports](https://python-amazon-ad-api.readthedocs.io/en/latest/v1/reports.html) | [contract](https://d1y2lf8k3vrkfu.cloudfront.net/openapi/en-us/dest/AmazonAdsAPIALLMerged_prod_3p.json) | [docs](https://advertising.amazon.com/API/docs/en-us/api-spec-v1-reports) |
312
- | [Labels](https://python-amazon-ad-api.readthedocs.io/en/latest/v1/labels.html) | [contract](https://d1y2lf8k3vrkfu.cloudfront.net/openapi/en-us/dest/AmazonAdsAPIALLMerged_prod_3p.json) | [docs](https://advertising.amazon.com/API/docs/en-us/api-spec-v1-labels) |
313
- | [Manager Accounts](https://python-amazon-ad-api.readthedocs.io/en/latest/v1/manager_accounts.html) | [contract](https://d1y2lf8k3vrkfu.cloudfront.net/openapi/en-us/dest/AmazonAdsAPIALLMerged_prod_3p.json) | [docs](https://advertising.amazon.com/API/docs/en-us/api-spec-v1-manager-accounts) |
314
- | [Recommendations](https://python-amazon-ad-api.readthedocs.io/en/latest/v1/recommendations.html) | [contract](https://d1y2lf8k3vrkfu.cloudfront.net/openapi/en-us/dest/AmazonAdsAPIALLMerged_prod_3p.json) | [docs](https://advertising.amazon.com/API/docs/en-us/api-spec-v1-recommendations) |
315
- | [Selling Accounts](https://python-amazon-ad-api.readthedocs.io/en/latest/v1/selling_accounts.html) | [contract](https://d1y2lf8k3vrkfu.cloudfront.net/openapi/en-us/dest/AmazonAdsAPIALLMerged_prod_3p.json) | [docs](https://advertising.amazon.com/API/docs/en-us/api-spec-v1-selling-accounts) |
316
- | [Label Object Associations](https://python-amazon-ad-api.readthedocs.io/en/latest/v1/label_object_associations.html) | [contract](https://d1y2lf8k3vrkfu.cloudfront.net/openapi/en-us/dest/AmazonAdsAPIALLMerged_prod_3p.json) | [docs](https://advertising.amazon.com/API/docs/en-us/api-spec-v1-label-object-associations) |
317
- | [Geo Locations](https://python-amazon-ad-api.readthedocs.io/en/latest/v1/geo_locations.html) | [contract](https://d1y2lf8k3vrkfu.cloudfront.net/openapi/en-us/dest/AmazonAdsAPIALLMerged_prod_3p.json) | [docs](https://advertising.amazon.com/API/docs/en-us/api-spec-v1-geo-locations) |
318
- | [Recommendation Types](https://python-amazon-ad-api.readthedocs.io/en/latest/v1/recommendation_types.html) | [contract](https://d1y2lf8k3vrkfu.cloudfront.net/openapi/en-us/dest/AmazonAdsAPIALLMerged_prod_3p.json) | [docs](https://advertising.amazon.com/API/docs/en-us/api-spec-v1-recommendation-types) |
300
+ | [Campaigns](https://python-amazon-ad-api.readthedocs.io/en/latest/v1/campaigns.html) | [contract](https://d1y2lf8k3vrkfu.cloudfront.net/openapi/en-us/dest/AmazonAdsAPIALLCampaignsContract_prod_3p.json) | [docs](https://advertising.amazon.com/API/docs/en-us/api-spec-v1-campaigns) |
301
+ | [Ad Groups](https://python-amazon-ad-api.readthedocs.io/en/latest/v1/ad_groups.html) | [contract](https://d1y2lf8k3vrkfu.cloudfront.net/openapi/en-us/dest/AmazonAdsAPIALLAdGroupsContract_prod_3p.json) | [docs](https://advertising.amazon.com/API/docs/en-us/api-spec-v1-adgroups) |
302
+ | [Ads](https://python-amazon-ad-api.readthedocs.io/en/latest/v1/ads.html) | [contract](https://d1y2lf8k3vrkfu.cloudfront.net/openapi/en-us/dest/AmazonAdsAPIALLAdsContract_prod_3p.json) | [docs](https://advertising.amazon.com/API/docs/en-us/api-spec-v1-ads) |
303
+ | [Targets](https://python-amazon-ad-api.readthedocs.io/en/latest/v1/targets.html) | [contract](https://d1y2lf8k3vrkfu.cloudfront.net/openapi/en-us/dest/AmazonAdsAPIALLTargetsContract_prod_3p.json) | [docs](https://advertising.amazon.com/API/docs/en-us/api-spec-v1-targets) |
304
+ | [Ad Extensions](https://python-amazon-ad-api.readthedocs.io/en/latest/v1/ad_extensions.html) | [contract](https://d1y2lf8k3vrkfu.cloudfront.net/openapi/en-us/dest/AmazonAdsAPIALLAdExtensionsContract_prod_3p.json) | [docs](https://advertising.amazon.com/API/docs/en-us/api-spec-v1-adextensions) |
305
+ | [Advertiser Accounts](https://python-amazon-ad-api.readthedocs.io/en/latest/v1/advertiser_accounts.html) | [contract](https://d1y2lf8k3vrkfu.cloudfront.net/openapi/en-us/dest/AmazonAdsAPIALLAdvertiserAccountsContract_prod_3p.json) | [docs](https://advertising.amazon.com/API/docs/en-us/api-spec-v1-advertiseraccounts) |
306
+ | [Ad Associations](https://python-amazon-ad-api.readthedocs.io/en/latest/v1/ad_associations.html) | [contract](https://d1y2lf8k3vrkfu.cloudfront.net/openapi/en-us/dest/AmazonAdsAPIALLAdAssociationsContract_prod_3p.json) | [docs](https://advertising.amazon.com/API/docs/en-us/api-spec-v1-adassociations) |
307
+ | [Brand Store Edition Publish Versions](https://python-amazon-ad-api.readthedocs.io/en/latest/v1/brand_store_edition_publish_versions.html) | [contract](https://d1y2lf8k3vrkfu.cloudfront.net/openapi/en-us/dest/AmazonAdsAPIALLBrandStoreEditionPublishVersionsContract_prod_3p.json) | [docs](https://advertising.amazon.com/API/docs/en-us/api-spec-v1-brandstoreeditionpublishversions) |
308
+ | [Brand Stores](https://python-amazon-ad-api.readthedocs.io/en/latest/v1/brand_stores.html) | [contract](https://d1y2lf8k3vrkfu.cloudfront.net/openapi/en-us/dest/AmazonAdsAPIALLBrandStoresContract_prod_3p.json) | [docs](https://advertising.amazon.com/API/docs/en-us/api-spec-v1-brandstores) |
309
+ | [Brand Store Editions](https://python-amazon-ad-api.readthedocs.io/en/latest/v1/brand_store_editions.html) | [contract](https://d1y2lf8k3vrkfu.cloudfront.net/openapi/en-us/dest/AmazonAdsAPIALLBrandStoreEditionsContract_prod_3p.json) | [docs](https://advertising.amazon.com/API/docs/en-us/api-spec-v1-brandstoreeditions) |
310
+ | [Brand Store Pages](https://python-amazon-ad-api.readthedocs.io/en/latest/v1/brand_store_pages.html) | [contract](https://d1y2lf8k3vrkfu.cloudfront.net/openapi/en-us/dest/AmazonAdsAPIALLBrandStorePagesContract_prod_3p.json) | [docs](https://advertising.amazon.com/API/docs/en-us/api-spec-v1-brandstorepages) |
311
+ | [Reports](https://python-amazon-ad-api.readthedocs.io/en/latest/v1/reports.html) | [contract](https://d1y2lf8k3vrkfu.cloudfront.net/openapi/en-us/dest/AmazonAdsAPIALLReportsContract_prod_3p.json) | [docs](https://advertising.amazon.com/API/docs/en-us/api-spec-v1-reports) |
312
+ | [Labels](https://python-amazon-ad-api.readthedocs.io/en/latest/v1/labels.html) | [contract](https://d1y2lf8k3vrkfu.cloudfront.net/openapi/en-us/dest/AmazonAdsAPIALLLabelsContract_prod_3p.json) | [docs](https://advertising.amazon.com/API/docs/en-us/api-spec-v1-labels) |
313
+ | [Manager Accounts](https://python-amazon-ad-api.readthedocs.io/en/latest/v1/manager_accounts.html) | [contract](https://d1y2lf8k3vrkfu.cloudfront.net/openapi/en-us/dest/AmazonAdsAPIALLManagerAccountsContract_prod_3p.json) | [docs](https://advertising.amazon.com/API/docs/en-us/api-spec-v1-manager-accounts) |
314
+ | [Recommendations](https://python-amazon-ad-api.readthedocs.io/en/latest/v1/recommendations.html) | [contract](https://d1y2lf8k3vrkfu.cloudfront.net/openapi/en-us/dest/AmazonAdsAPIALLRecommendationsContract_prod_3p.json) | [docs](https://advertising.amazon.com/API/docs/en-us/api-spec-v1-recommendations) |
315
+ | [Selling Accounts](https://python-amazon-ad-api.readthedocs.io/en/latest/v1/selling_accounts.html) | [contract](https://d1y2lf8k3vrkfu.cloudfront.net/openapi/en-us/dest/AmazonAdsAPIALLSellingAccountsContract_prod_3p.json) | [docs](https://advertising.amazon.com/API/docs/en-us/api-spec-v1-selling-accounts) |
316
+ | [Label Object Associations](https://python-amazon-ad-api.readthedocs.io/en/latest/v1/label_object_associations.html) | [contract](https://d1y2lf8k3vrkfu.cloudfront.net/openapi/en-us/dest/AmazonAdsAPIALLLabelObjectAssociationsContract_prod_3p.json) | [docs](https://advertising.amazon.com/API/docs/en-us/api-spec-v1-label-object-associations) |
317
+ | [Geo Locations](https://python-amazon-ad-api.readthedocs.io/en/latest/v1/geo_locations.html) | [contract](https://d1y2lf8k3vrkfu.cloudfront.net/openapi/en-us/dest/AmazonAdsAPIALLGeoLocationsContract_prod_3p.json) | [docs](https://advertising.amazon.com/API/docs/en-us/api-spec-v1-geolocations) |
318
+ | [Location Indexes](https://python-amazon-ad-api.readthedocs.io/en/latest/v1/location_indexes.html) | [contract](https://d1y2lf8k3vrkfu.cloudfront.net/openapi/en-us/dest/AmazonAdsAPIALLLocationIndexesContract_prod_3p.json) | [docs](https://advertising.amazon.com/API/docs/en-us/api-spec-v1-locationindexes) |
319
+ | [Recommendation Types](https://python-amazon-ad-api.readthedocs.io/en/latest/v1/recommendation_types.html) | [contract](https://d1y2lf8k3vrkfu.cloudfront.net/openapi/en-us/dest/AmazonAdsAPIALLRecommendationTypesContract_prod_3p.json) | [docs](https://advertising.amazon.com/API/docs/en-us/api-spec-v1-recommendation-types) |
319
320
 
320
321
  ### [Modules Available Sponsored Products](https://python-amazon-ad-api.readthedocs.io/en/latest/sp.html)
321
322
 
@@ -495,4 +496,4 @@ We are not affiliated with Amazon but they used our api :)
495
496
 
496
497
 
497
498
  ---
498
- *Last release: v1.5.11*
499
+ *Last release: v1.6.0*
@@ -1,5 +1,5 @@
1
1
  ad_api/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
2
- ad_api/version.py,sha256=8EjIC8Er4Bn8PhErizTXrZVYTgb6tHgj00LrrBVNYXA,22
2
+ ad_api/version.py,sha256=6cud5pVpwnMsz6fxZVA6qWcQVSpLQXd0ddN6ip-1M_8,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
@@ -18,7 +18,7 @@ ad_api/api/localization.py,sha256=HdkChAawloJ8zj5rCye9NVf7kLnQ7vW6aKsBLZ2W-gI,17
18
18
  ad_api/api/manager_accounts.py,sha256=tnmJxOGIKTuJ3i8wciwfs931REW0aeNKQiqCpBrTZ2Y,5107
19
19
  ad_api/api/metadata.py,sha256=vWPbDGvEB72421fjSu4KrNkTdrIijHTPV8k36hceSbA,2406
20
20
  ad_api/api/portfolios.py,sha256=Oe3LS2HsjMJSq1Id8cwOWrH2AiPMcBb7oTkFHjudnTI,7103
21
- ad_api/api/portfolios_v3.py,sha256=GH1HOifNJxhFXD0hG9ZfnyGmIwbaorxNhVMJXeaqFgU,6894
21
+ ad_api/api/portfolios_v3.py,sha256=tpjf0MqTmJYRHrrSDfik8N0mWJFOo6aFGyTQdAPpimk,7440
22
22
  ad_api/api/profiles.py,sha256=mMSCUd5HdR_nFBDFngLY94tIfMCA4yGnjHz-PSMe0rE,7200
23
23
  ad_api/api/recommendations.py,sha256=_r4LsJkRTkiuOvzS7wrtR2ZmxA7gGe-T4jRDAqM6pRo,6198
24
24
  ad_api/api/reports.py,sha256=gNmDHLULD2uaJgsMpIbCX9kabwhMXRr9WfZBtHUdsOY,6043
@@ -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=m7SN_YWz-8r_NGxhg4LfGm-El6-52dci9f0LqlkPR3Y,1317
92
+ ad_api/api/v1/__init__.py,sha256=K7rmsKJnWebiarPZknUIcXJKvoIDPI5dBVNrIJGWa2I,1370
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
@@ -105,28 +105,30 @@ ad_api/api/v1/label_object_associations.py,sha256=zXuD5cUAfqL-PRObvjOM54KC356HFq
105
105
  ad_api/api/v1/labels.py,sha256=jjPmafIQZTh99Ztj5MCcDC7UyoFFN0YuWdn2syqd3Yg,2438
106
106
  ad_api/api/v1/location_indexes.py,sha256=Z3-z3NShmUyHFYxnAQlSKOG3z0nek4UgTte8CIxCKiU,4712
107
107
  ad_api/api/v1/manager_accounts.py,sha256=cNAs1Qq6SYG0y4_4UpNBDfItqBJ1NvYACsIvFc8h-rw,4980
108
+ ad_api/api/v1/portfolios.py,sha256=W9NFWJFZ5y8H76WwSmznc6BFHRjDN8XSMxZ2d3-pe9o,7872
108
109
  ad_api/api/v1/recommendation_types.py,sha256=aEBfXu1EhzcRk9Nhin8_ieFiNnBiusX_vWviJw_qD08,2077
109
- ad_api/api/v1/recommendations.py,sha256=RJfmwUQ4YOcTdXiHz_U2ArJ01B29vKleRS_avJFjS14,3737
110
+ ad_api/api/v1/recommendations.py,sha256=lb3Jwtwcmq3L8j0HAUKzOt8o_xQRJRduXcjklX_tFw8,4305
110
111
  ad_api/api/v1/reports.py,sha256=vJmWhIsALkX27HeijTsSUz3zrYhUBm4RodTCieJD8Y8,6657
111
112
  ad_api/api/v1/selling_accounts.py,sha256=0_R4yzvXGp_gFyfcZeWJyeIr7Wh4eGpLfK12podXqGA,1941
112
113
  ad_api/api/v1/targets.py,sha256=a4BzPjg9m1JJwqphhpQOFkNIcgCw7v4-K0sNzOihMZI,12355
113
114
  ad_api/auth/__init__.py,sha256=B_yKdmsHENQaKfMFAIcSxQqG4aBUmNBm5orKIMUYObk,229
114
- ad_api/auth/access_token_client.py,sha256=_V0FGXRmqRNMb1fz1AGqnR6gYr_WqFkMTbK1os0yoIk,2983
115
+ ad_api/auth/access_token_client.py,sha256=2B5bVXRu54FMhN1B08tjmSIYhc-XoKggZq7tL9ObewI,2997
115
116
  ad_api/auth/access_token_response.py,sha256=zlkfo3oWjkhAqNJIUOM0S4g_FvpgDa3IwNLxlREM89A,275
116
117
  ad_api/auth/credentials.py,sha256=RKxx2_QBJL_sdVhGAoVVRfR1RX1rhBwI2KGa2_iRdYM,278
117
118
  ad_api/auth/exceptions.py,sha256=JCY74CZbxqSQ09huA1r_Z5kuD1k0O_sjD7sHhJI0aIk,424
118
- ad_api/base/__init__.py,sha256=g57SW7bPPRB7jWStV9cqMY4Gs3a5N1PrRwXdLcGqkAM,999
119
+ ad_api/base/__init__.py,sha256=503ULbOmC0uLmycKlNGQnSn9oPmUT1XTukbHffeOBA8,987
119
120
  ad_api/base/api_response.py,sha256=zJ-8T3KrSC91ieDMcJ7AcQmoQpRS0EzbdkvCbRCCFwg,737
120
- ad_api/base/base_client.py,sha256=zOL_LTh-58URWf3ZDlrwmqXXbd6PX66QF5hrr2p83yY,356
121
- ad_api/base/client.py,sha256=rOTH5zd513qmeNiJbwT42kEXvZseeh03UUp-krBW_W4,10322
121
+ ad_api/base/client.py,sha256=w8DJK0t0UCyOgQdCi2FJf9XiZtXfE7pg7EgCaIcKnns,10335
122
122
  ad_api/base/config.py,sha256=VbykwPyR_CDIMFCZQs_GSqc5qKcYpp0l6B9luV-abu4,606
123
123
  ad_api/base/credential_provider.py,sha256=upgcgm2GGb0AkzDlKVAtKtbirqZAFp3EM6DkBzvAXsI,5566
124
124
  ad_api/base/exceptions.py,sha256=9D3M40ZIlLS0fA-aQh1BTWPOW-Nvf0tRhbA85jFnDJ4,4383
125
125
  ad_api/base/helpers.py,sha256=UK7Q13vZ0mNdF54xzfzoGDn2O_cd2yPrK2X4rOzC41c,2334
126
126
  ad_api/base/marketplaces.py,sha256=44lvCcluXNpqTprWQ80e3weSQmQbJoWL-WDSOWVbCyQ,4657
127
127
  ad_api/base/utils.py,sha256=_qnCBOvyJTLgaZjJzUWTi38GGLHkQszXELs79133Rb4,5618
128
- python_amazon_ad_api-1.6.0.dist-info/licenses/LICENSE,sha256=h2rpqlmmLy-4l1tN6KpWAFxx1JEMYeEFrMrZUbx_B_o,1105
129
- python_amazon_ad_api-1.6.0.dist-info/METADATA,sha256=X_Ahe1DGIna9MVtq3oXQ337sHrCYKiqeY4BcY-_aOaM,42525
130
- python_amazon_ad_api-1.6.0.dist-info/WHEEL,sha256=aeYiig01lYGDzBgS8HxWXOg3uV61G9ijOsup-k9o1sk,91
131
- python_amazon_ad_api-1.6.0.dist-info/top_level.txt,sha256=nN9twUos-8pkP514ZwpvRU9YL9L2XyQyHsMQFfudGTU,7
132
- python_amazon_ad_api-1.6.0.dist-info/RECORD,,
128
+ ad_api/shared/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
129
+ ad_api/shared/base_client.py,sha256=zOL_LTh-58URWf3ZDlrwmqXXbd6PX66QF5hrr2p83yY,356
130
+ python_amazon_ad_api-1.8.1.dist-info/licenses/LICENSE,sha256=h2rpqlmmLy-4l1tN6KpWAFxx1JEMYeEFrMrZUbx_B_o,1105
131
+ python_amazon_ad_api-1.8.1.dist-info/METADATA,sha256=lhKvzO63RXLbZ5LLXs2qdJ_xK0sSwvPSfyNRPFEu7eQ,43130
132
+ python_amazon_ad_api-1.8.1.dist-info/WHEEL,sha256=mOdXR9C3wMVov7cSY8PY-XCzo3SmmWCHvGQr5csJoao,91
133
+ python_amazon_ad_api-1.8.1.dist-info/top_level.txt,sha256=nN9twUos-8pkP514ZwpvRU9YL9L2XyQyHsMQFfudGTU,7
134
+ python_amazon_ad_api-1.8.1.dist-info/RECORD,,
@@ -1,5 +1,5 @@
1
1
  Wheel-Version: 1.0
2
- Generator: setuptools (82.0.1)
2
+ Generator: setuptools (84.2.1)
3
3
  Root-Is-Purelib: true
4
4
  Tag: py3-none-any
5
5
 
File without changes