python-amazon-ad-api 1.7.0__tar.gz → 1.8.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.
- {python_amazon_ad_api-1.7.0 → python_amazon_ad_api-1.8.1}/PKG-INFO +3 -3
- {python_amazon_ad_api-1.7.0 → python_amazon_ad_api-1.8.1}/ad_api/api/portfolios_v3.py +15 -1
- {python_amazon_ad_api-1.7.0 → python_amazon_ad_api-1.8.1}/ad_api/api/v1/__init__.py +2 -0
- python_amazon_ad_api-1.8.1/ad_api/api/v1/portfolios.py +168 -0
- {python_amazon_ad_api-1.7.0 → python_amazon_ad_api-1.8.1}/ad_api/api/v1/recommendations.py +11 -2
- python_amazon_ad_api-1.8.1/ad_api/version.py +1 -0
- {python_amazon_ad_api-1.7.0 → python_amazon_ad_api-1.8.1}/python_amazon_ad_api.egg-info/PKG-INFO +3 -3
- {python_amazon_ad_api-1.7.0 → python_amazon_ad_api-1.8.1}/python_amazon_ad_api.egg-info/SOURCES.txt +1 -0
- {python_amazon_ad_api-1.7.0 → python_amazon_ad_api-1.8.1}/python_amazon_ad_api.egg-info/requires.txt +2 -2
- {python_amazon_ad_api-1.7.0 → python_amazon_ad_api-1.8.1}/setup.cfg +1 -1
- {python_amazon_ad_api-1.7.0 → python_amazon_ad_api-1.8.1}/setup.py +3 -3
- python_amazon_ad_api-1.7.0/ad_api/version.py +0 -1
- {python_amazon_ad_api-1.7.0 → python_amazon_ad_api-1.8.1}/LICENSE +0 -0
- {python_amazon_ad_api-1.7.0 → python_amazon_ad_api-1.8.1}/README.md +0 -0
- {python_amazon_ad_api-1.7.0 → python_amazon_ad_api-1.8.1}/ad_api/__init__.py +0 -0
- {python_amazon_ad_api-1.7.0 → python_amazon_ad_api-1.8.1}/ad_api/api/__init__.py +0 -0
- {python_amazon_ad_api-1.7.0 → python_amazon_ad_api-1.8.1}/ad_api/api/account.py +0 -0
- {python_amazon_ad_api-1.7.0 → python_amazon_ad_api-1.8.1}/ad_api/api/account_budgets.py +0 -0
- {python_amazon_ad_api-1.7.0 → python_amazon_ad_api-1.8.1}/ad_api/api/advertising_test_account.py +0 -0
- {python_amazon_ad_api-1.7.0 → python_amazon_ad_api-1.8.1}/ad_api/api/attribution.py +0 -0
- {python_amazon_ad_api-1.7.0 → python_amazon_ad_api-1.8.1}/ad_api/api/audiences.py +0 -0
- {python_amazon_ad_api-1.7.0 → python_amazon_ad_api-1.8.1}/ad_api/api/billing.py +0 -0
- {python_amazon_ad_api-1.7.0 → python_amazon_ad_api-1.8.1}/ad_api/api/brand_metrics.py +0 -0
- {python_amazon_ad_api-1.7.0 → python_amazon_ad_api-1.8.1}/ad_api/api/creative_assets.py +0 -0
- {python_amazon_ad_api-1.7.0 → python_amazon_ad_api-1.8.1}/ad_api/api/eligibility.py +0 -0
- {python_amazon_ad_api-1.7.0 → python_amazon_ad_api-1.8.1}/ad_api/api/exports.py +0 -0
- {python_amazon_ad_api-1.7.0 → python_amazon_ad_api-1.8.1}/ad_api/api/history.py +0 -0
- {python_amazon_ad_api-1.7.0 → python_amazon_ad_api-1.8.1}/ad_api/api/insights.py +0 -0
- {python_amazon_ad_api-1.7.0 → python_amazon_ad_api-1.8.1}/ad_api/api/invoices.py +0 -0
- {python_amazon_ad_api-1.7.0 → python_amazon_ad_api-1.8.1}/ad_api/api/localization.py +0 -0
- {python_amazon_ad_api-1.7.0 → python_amazon_ad_api-1.8.1}/ad_api/api/manager_accounts.py +0 -0
- {python_amazon_ad_api-1.7.0 → python_amazon_ad_api-1.8.1}/ad_api/api/metadata.py +0 -0
- {python_amazon_ad_api-1.7.0 → python_amazon_ad_api-1.8.1}/ad_api/api/portfolios.py +0 -0
- {python_amazon_ad_api-1.7.0 → python_amazon_ad_api-1.8.1}/ad_api/api/profiles.py +0 -0
- {python_amazon_ad_api-1.7.0 → python_amazon_ad_api-1.8.1}/ad_api/api/recommendations.py +0 -0
- {python_amazon_ad_api-1.7.0 → python_amazon_ad_api-1.8.1}/ad_api/api/reports.py +0 -0
- {python_amazon_ad_api-1.7.0 → python_amazon_ad_api-1.8.1}/ad_api/api/sb/__init__.py +0 -0
- {python_amazon_ad_api-1.7.0 → python_amazon_ad_api-1.8.1}/ad_api/api/sb/ad_creatives_v4.py +0 -0
- {python_amazon_ad_api-1.7.0 → python_amazon_ad_api-1.8.1}/ad_api/api/sb/ad_groups.py +0 -0
- {python_amazon_ad_api-1.7.0 → python_amazon_ad_api-1.8.1}/ad_api/api/sb/ad_groups_v4.py +0 -0
- {python_amazon_ad_api-1.7.0 → python_amazon_ad_api-1.8.1}/ad_api/api/sb/ads_v4.py +0 -0
- {python_amazon_ad_api-1.7.0 → python_amazon_ad_api-1.8.1}/ad_api/api/sb/benchmarks.py +0 -0
- {python_amazon_ad_api-1.7.0 → python_amazon_ad_api-1.8.1}/ad_api/api/sb/bid_recommendations.py +0 -0
- {python_amazon_ad_api-1.7.0 → python_amazon_ad_api-1.8.1}/ad_api/api/sb/brands.py +0 -0
- {python_amazon_ad_api-1.7.0 → python_amazon_ad_api-1.8.1}/ad_api/api/sb/budget_rules.py +0 -0
- {python_amazon_ad_api-1.7.0 → python_amazon_ad_api-1.8.1}/ad_api/api/sb/campaigns.py +0 -0
- {python_amazon_ad_api-1.7.0 → python_amazon_ad_api-1.8.1}/ad_api/api/sb/campaigns_v4.py +0 -0
- {python_amazon_ad_api-1.7.0 → python_amazon_ad_api-1.8.1}/ad_api/api/sb/forecast.py +0 -0
- {python_amazon_ad_api-1.7.0 → python_amazon_ad_api-1.8.1}/ad_api/api/sb/keywords.py +0 -0
- {python_amazon_ad_api-1.7.0 → python_amazon_ad_api-1.8.1}/ad_api/api/sb/keywords_recommendations.py +0 -0
- {python_amazon_ad_api-1.7.0 → python_amazon_ad_api-1.8.1}/ad_api/api/sb/landing_page_asins.py +0 -0
- {python_amazon_ad_api-1.7.0 → python_amazon_ad_api-1.8.1}/ad_api/api/sb/media.py +0 -0
- {python_amazon_ad_api-1.7.0 → python_amazon_ad_api-1.8.1}/ad_api/api/sb/migration.py +0 -0
- {python_amazon_ad_api-1.7.0 → python_amazon_ad_api-1.8.1}/ad_api/api/sb/negative_keywords.py +0 -0
- {python_amazon_ad_api-1.7.0 → python_amazon_ad_api-1.8.1}/ad_api/api/sb/negative_product_targeting.py +0 -0
- {python_amazon_ad_api-1.7.0 → python_amazon_ad_api-1.8.1}/ad_api/api/sb/optimization_rules.py +0 -0
- {python_amazon_ad_api-1.7.0 → python_amazon_ad_api-1.8.1}/ad_api/api/sb/product_targeting.py +0 -0
- {python_amazon_ad_api-1.7.0 → python_amazon_ad_api-1.8.1}/ad_api/api/sb/recommendations.py +0 -0
- {python_amazon_ad_api-1.7.0 → python_amazon_ad_api-1.8.1}/ad_api/api/sb/reports.py +0 -0
- {python_amazon_ad_api-1.7.0 → python_amazon_ad_api-1.8.1}/ad_api/api/sb/stores.py +0 -0
- {python_amazon_ad_api-1.7.0 → python_amazon_ad_api-1.8.1}/ad_api/api/sb/targeting_categories.py +0 -0
- {python_amazon_ad_api-1.7.0 → python_amazon_ad_api-1.8.1}/ad_api/api/sb/targeting_recommendations.py +0 -0
- {python_amazon_ad_api-1.7.0 → python_amazon_ad_api-1.8.1}/ad_api/api/sb/themes.py +0 -0
- {python_amazon_ad_api-1.7.0 → python_amazon_ad_api-1.8.1}/ad_api/api/sd/__init__.py +0 -0
- {python_amazon_ad_api-1.7.0 → python_amazon_ad_api-1.8.1}/ad_api/api/sd/ad_groups.py +0 -0
- {python_amazon_ad_api-1.7.0 → python_amazon_ad_api-1.8.1}/ad_api/api/sd/bid_recommendations.py +0 -0
- {python_amazon_ad_api-1.7.0 → python_amazon_ad_api-1.8.1}/ad_api/api/sd/brand_safety.py +0 -0
- {python_amazon_ad_api-1.7.0 → python_amazon_ad_api-1.8.1}/ad_api/api/sd/budget_rules.py +0 -0
- {python_amazon_ad_api-1.7.0 → python_amazon_ad_api-1.8.1}/ad_api/api/sd/campaigns.py +0 -0
- {python_amazon_ad_api-1.7.0 → python_amazon_ad_api-1.8.1}/ad_api/api/sd/campaigns_budget_usage.py +0 -0
- {python_amazon_ad_api-1.7.0 → python_amazon_ad_api-1.8.1}/ad_api/api/sd/creatives.py +0 -0
- {python_amazon_ad_api-1.7.0 → python_amazon_ad_api-1.8.1}/ad_api/api/sd/forecast.py +0 -0
- {python_amazon_ad_api-1.7.0 → python_amazon_ad_api-1.8.1}/ad_api/api/sd/negative_product_targeting.py +0 -0
- {python_amazon_ad_api-1.7.0 → python_amazon_ad_api-1.8.1}/ad_api/api/sd/product_ads.py +0 -0
- {python_amazon_ad_api-1.7.0 → python_amazon_ad_api-1.8.1}/ad_api/api/sd/product_targeting.py +0 -0
- {python_amazon_ad_api-1.7.0 → python_amazon_ad_api-1.8.1}/ad_api/api/sd/recommendations.py +0 -0
- {python_amazon_ad_api-1.7.0 → python_amazon_ad_api-1.8.1}/ad_api/api/sd/reports.py +0 -0
- {python_amazon_ad_api-1.7.0 → python_amazon_ad_api-1.8.1}/ad_api/api/sd/snapshots.py +0 -0
- {python_amazon_ad_api-1.7.0 → python_amazon_ad_api-1.8.1}/ad_api/api/sd/targeting_recommendations.py +0 -0
- {python_amazon_ad_api-1.7.0 → python_amazon_ad_api-1.8.1}/ad_api/api/sp/__init__.py +0 -0
- {python_amazon_ad_api-1.7.0 → python_amazon_ad_api-1.8.1}/ad_api/api/sp/ad_groups_v3.py +0 -0
- {python_amazon_ad_api-1.7.0 → python_amazon_ad_api-1.8.1}/ad_api/api/sp/bid_recommendations_v3.py +0 -0
- {python_amazon_ad_api-1.7.0 → python_amazon_ad_api-1.8.1}/ad_api/api/sp/budget_initial_recommendation.py +0 -0
- {python_amazon_ad_api-1.7.0 → python_amazon_ad_api-1.8.1}/ad_api/api/sp/budget_recommendations.py +0 -0
- {python_amazon_ad_api-1.7.0 → python_amazon_ad_api-1.8.1}/ad_api/api/sp/budget_rules.py +0 -0
- {python_amazon_ad_api-1.7.0 → python_amazon_ad_api-1.8.1}/ad_api/api/sp/budget_rules_recommendations.py +0 -0
- {python_amazon_ad_api-1.7.0 → python_amazon_ad_api-1.8.1}/ad_api/api/sp/campaign_consolidated_recommendations.py +0 -0
- {python_amazon_ad_api-1.7.0 → python_amazon_ad_api-1.8.1}/ad_api/api/sp/campaign_negative_keywords_v3.py +0 -0
- {python_amazon_ad_api-1.7.0 → python_amazon_ad_api-1.8.1}/ad_api/api/sp/campaign_negative_targets.py +0 -0
- {python_amazon_ad_api-1.7.0 → python_amazon_ad_api-1.8.1}/ad_api/api/sp/campaigns_budget_usage.py +0 -0
- {python_amazon_ad_api-1.7.0 → python_amazon_ad_api-1.8.1}/ad_api/api/sp/campaigns_v3.py +0 -0
- {python_amazon_ad_api-1.7.0 → python_amazon_ad_api-1.8.1}/ad_api/api/sp/campaings_optimization.py +0 -0
- {python_amazon_ad_api-1.7.0 → python_amazon_ad_api-1.8.1}/ad_api/api/sp/keywords_v3.py +0 -0
- {python_amazon_ad_api-1.7.0 → python_amazon_ad_api-1.8.1}/ad_api/api/sp/negative_keywords_v3.py +0 -0
- {python_amazon_ad_api-1.7.0 → python_amazon_ad_api-1.8.1}/ad_api/api/sp/negative_product_targeting_v3.py +0 -0
- {python_amazon_ad_api-1.7.0 → python_amazon_ad_api-1.8.1}/ad_api/api/sp/product_ads_v3.py +0 -0
- {python_amazon_ad_api-1.7.0 → python_amazon_ad_api-1.8.1}/ad_api/api/sp/product_recommendations.py +0 -0
- {python_amazon_ad_api-1.7.0 → python_amazon_ad_api-1.8.1}/ad_api/api/sp/product_targeting_v3.py +0 -0
- {python_amazon_ad_api-1.7.0 → python_amazon_ad_api-1.8.1}/ad_api/api/sp/ranked_keywords_recommendations.py +0 -0
- {python_amazon_ad_api-1.7.0 → python_amazon_ad_api-1.8.1}/ad_api/api/sp/schedule_based_bid_optimization.py +0 -0
- {python_amazon_ad_api-1.7.0 → python_amazon_ad_api-1.8.1}/ad_api/api/stores.py +0 -0
- {python_amazon_ad_api-1.7.0 → python_amazon_ad_api-1.8.1}/ad_api/api/stream.py +0 -0
- {python_amazon_ad_api-1.7.0 → python_amazon_ad_api-1.8.1}/ad_api/api/v1/ad_associations.py +0 -0
- {python_amazon_ad_api-1.7.0 → python_amazon_ad_api-1.8.1}/ad_api/api/v1/ad_extensions.py +0 -0
- {python_amazon_ad_api-1.7.0 → python_amazon_ad_api-1.8.1}/ad_api/api/v1/ad_groups.py +0 -0
- {python_amazon_ad_api-1.7.0 → python_amazon_ad_api-1.8.1}/ad_api/api/v1/ads.py +0 -0
- {python_amazon_ad_api-1.7.0 → python_amazon_ad_api-1.8.1}/ad_api/api/v1/advertiser_accounts.py +0 -0
- {python_amazon_ad_api-1.7.0 → python_amazon_ad_api-1.8.1}/ad_api/api/v1/brand_store_edition_publish_versions.py +0 -0
- {python_amazon_ad_api-1.7.0 → python_amazon_ad_api-1.8.1}/ad_api/api/v1/brand_store_editions.py +0 -0
- {python_amazon_ad_api-1.7.0 → python_amazon_ad_api-1.8.1}/ad_api/api/v1/brand_store_pages.py +0 -0
- {python_amazon_ad_api-1.7.0 → python_amazon_ad_api-1.8.1}/ad_api/api/v1/brand_stores.py +0 -0
- {python_amazon_ad_api-1.7.0 → python_amazon_ad_api-1.8.1}/ad_api/api/v1/campaigns.py +0 -0
- {python_amazon_ad_api-1.7.0 → python_amazon_ad_api-1.8.1}/ad_api/api/v1/geo_locations.py +0 -0
- {python_amazon_ad_api-1.7.0 → python_amazon_ad_api-1.8.1}/ad_api/api/v1/label_object_associations.py +0 -0
- {python_amazon_ad_api-1.7.0 → python_amazon_ad_api-1.8.1}/ad_api/api/v1/labels.py +0 -0
- {python_amazon_ad_api-1.7.0 → python_amazon_ad_api-1.8.1}/ad_api/api/v1/location_indexes.py +0 -0
- {python_amazon_ad_api-1.7.0 → python_amazon_ad_api-1.8.1}/ad_api/api/v1/manager_accounts.py +0 -0
- {python_amazon_ad_api-1.7.0 → python_amazon_ad_api-1.8.1}/ad_api/api/v1/recommendation_types.py +0 -0
- {python_amazon_ad_api-1.7.0 → python_amazon_ad_api-1.8.1}/ad_api/api/v1/reports.py +0 -0
- {python_amazon_ad_api-1.7.0 → python_amazon_ad_api-1.8.1}/ad_api/api/v1/selling_accounts.py +0 -0
- {python_amazon_ad_api-1.7.0 → python_amazon_ad_api-1.8.1}/ad_api/api/v1/targets.py +0 -0
- {python_amazon_ad_api-1.7.0 → python_amazon_ad_api-1.8.1}/ad_api/api/validation_configurations.py +0 -0
- {python_amazon_ad_api-1.7.0 → python_amazon_ad_api-1.8.1}/ad_api/auth/__init__.py +0 -0
- {python_amazon_ad_api-1.7.0 → python_amazon_ad_api-1.8.1}/ad_api/auth/access_token_client.py +0 -0
- {python_amazon_ad_api-1.7.0 → python_amazon_ad_api-1.8.1}/ad_api/auth/access_token_response.py +0 -0
- {python_amazon_ad_api-1.7.0 → python_amazon_ad_api-1.8.1}/ad_api/auth/credentials.py +0 -0
- {python_amazon_ad_api-1.7.0 → python_amazon_ad_api-1.8.1}/ad_api/auth/exceptions.py +0 -0
- {python_amazon_ad_api-1.7.0 → python_amazon_ad_api-1.8.1}/ad_api/base/__init__.py +0 -0
- {python_amazon_ad_api-1.7.0 → python_amazon_ad_api-1.8.1}/ad_api/base/api_response.py +0 -0
- {python_amazon_ad_api-1.7.0 → python_amazon_ad_api-1.8.1}/ad_api/base/client.py +0 -0
- {python_amazon_ad_api-1.7.0 → python_amazon_ad_api-1.8.1}/ad_api/base/config.py +0 -0
- {python_amazon_ad_api-1.7.0 → python_amazon_ad_api-1.8.1}/ad_api/base/credential_provider.py +0 -0
- {python_amazon_ad_api-1.7.0 → python_amazon_ad_api-1.8.1}/ad_api/base/exceptions.py +0 -0
- {python_amazon_ad_api-1.7.0 → python_amazon_ad_api-1.8.1}/ad_api/base/helpers.py +0 -0
- {python_amazon_ad_api-1.7.0 → python_amazon_ad_api-1.8.1}/ad_api/base/marketplaces.py +0 -0
- {python_amazon_ad_api-1.7.0 → python_amazon_ad_api-1.8.1}/ad_api/base/utils.py +0 -0
- {python_amazon_ad_api-1.7.0 → python_amazon_ad_api-1.8.1}/ad_api/shared/__init__.py +0 -0
- {python_amazon_ad_api-1.7.0 → python_amazon_ad_api-1.8.1}/ad_api/shared/base_client.py +0 -0
- {python_amazon_ad_api-1.7.0 → python_amazon_ad_api-1.8.1}/pyproject.toml +0 -0
- {python_amazon_ad_api-1.7.0 → python_amazon_ad_api-1.8.1}/python_amazon_ad_api.egg-info/dependency_links.txt +0 -0
- {python_amazon_ad_api-1.7.0 → python_amazon_ad_api-1.8.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.
|
|
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<
|
|
18
|
-
Requires-Dist: pycryptodome<4.
|
|
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
|
|
@@ -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.
|
|
@@ -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..
|
|
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)
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
__version__ = "1.8.1"
|
{python_amazon_ad_api-1.7.0 → python_amazon_ad_api-1.8.1}/python_amazon_ad_api.egg-info/PKG-INFO
RENAMED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: python-amazon-ad-api
|
|
3
|
-
Version: 1.
|
|
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<
|
|
18
|
-
Requires-Dist: pycryptodome<4.
|
|
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
|
{python_amazon_ad_api-1.7.0 → python_amazon_ad_api-1.8.1}/python_amazon_ad_api.egg-info/SOURCES.txt
RENAMED
|
@@ -110,6 +110,7 @@ ad_api/api/v1/label_object_associations.py
|
|
|
110
110
|
ad_api/api/v1/labels.py
|
|
111
111
|
ad_api/api/v1/location_indexes.py
|
|
112
112
|
ad_api/api/v1/manager_accounts.py
|
|
113
|
+
ad_api/api/v1/portfolios.py
|
|
113
114
|
ad_api/api/v1/recommendation_types.py
|
|
114
115
|
ad_api/api/v1/recommendations.py
|
|
115
116
|
ad_api/api/v1/reports.py
|
|
@@ -2,12 +2,12 @@ from setuptools import setup
|
|
|
2
2
|
|
|
3
3
|
setup(
|
|
4
4
|
name='python-amazon-ad-api',
|
|
5
|
-
version='1.
|
|
5
|
+
version='1.8.1',
|
|
6
6
|
install_requires=[
|
|
7
7
|
"requests>=2.27.1,<2.35.0",
|
|
8
8
|
"six>=1.16,<1.18",
|
|
9
|
-
"cachetools>=5.0,<
|
|
10
|
-
"pycryptodome>=3.13,<4.
|
|
9
|
+
"cachetools>=5.0,<8.1",
|
|
10
|
+
"pycryptodome>=3.13,<4.5",
|
|
11
11
|
"pytz>=2021.3,<2027.0",
|
|
12
12
|
"confuse>=1.7,<2.4",
|
|
13
13
|
],
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
__version__ = "1.7.0"
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{python_amazon_ad_api-1.7.0 → python_amazon_ad_api-1.8.1}/ad_api/api/advertising_test_account.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{python_amazon_ad_api-1.7.0 → python_amazon_ad_api-1.8.1}/ad_api/api/sb/bid_recommendations.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{python_amazon_ad_api-1.7.0 → python_amazon_ad_api-1.8.1}/ad_api/api/sb/keywords_recommendations.py
RENAMED
|
File without changes
|
{python_amazon_ad_api-1.7.0 → python_amazon_ad_api-1.8.1}/ad_api/api/sb/landing_page_asins.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
{python_amazon_ad_api-1.7.0 → python_amazon_ad_api-1.8.1}/ad_api/api/sb/negative_keywords.py
RENAMED
|
File without changes
|
|
File without changes
|
{python_amazon_ad_api-1.7.0 → python_amazon_ad_api-1.8.1}/ad_api/api/sb/optimization_rules.py
RENAMED
|
File without changes
|
{python_amazon_ad_api-1.7.0 → python_amazon_ad_api-1.8.1}/ad_api/api/sb/product_targeting.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{python_amazon_ad_api-1.7.0 → python_amazon_ad_api-1.8.1}/ad_api/api/sb/targeting_categories.py
RENAMED
|
File without changes
|
{python_amazon_ad_api-1.7.0 → python_amazon_ad_api-1.8.1}/ad_api/api/sb/targeting_recommendations.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{python_amazon_ad_api-1.7.0 → python_amazon_ad_api-1.8.1}/ad_api/api/sd/bid_recommendations.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{python_amazon_ad_api-1.7.0 → python_amazon_ad_api-1.8.1}/ad_api/api/sd/campaigns_budget_usage.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{python_amazon_ad_api-1.7.0 → python_amazon_ad_api-1.8.1}/ad_api/api/sd/product_targeting.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{python_amazon_ad_api-1.7.0 → python_amazon_ad_api-1.8.1}/ad_api/api/sd/targeting_recommendations.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
{python_amazon_ad_api-1.7.0 → python_amazon_ad_api-1.8.1}/ad_api/api/sp/bid_recommendations_v3.py
RENAMED
|
File without changes
|
|
File without changes
|
{python_amazon_ad_api-1.7.0 → python_amazon_ad_api-1.8.1}/ad_api/api/sp/budget_recommendations.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{python_amazon_ad_api-1.7.0 → python_amazon_ad_api-1.8.1}/ad_api/api/sp/campaign_negative_targets.py
RENAMED
|
File without changes
|
{python_amazon_ad_api-1.7.0 → python_amazon_ad_api-1.8.1}/ad_api/api/sp/campaigns_budget_usage.py
RENAMED
|
File without changes
|
|
File without changes
|
{python_amazon_ad_api-1.7.0 → python_amazon_ad_api-1.8.1}/ad_api/api/sp/campaings_optimization.py
RENAMED
|
File without changes
|
|
File without changes
|
{python_amazon_ad_api-1.7.0 → python_amazon_ad_api-1.8.1}/ad_api/api/sp/negative_keywords_v3.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
{python_amazon_ad_api-1.7.0 → python_amazon_ad_api-1.8.1}/ad_api/api/sp/product_recommendations.py
RENAMED
|
File without changes
|
{python_amazon_ad_api-1.7.0 → python_amazon_ad_api-1.8.1}/ad_api/api/sp/product_targeting_v3.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{python_amazon_ad_api-1.7.0 → python_amazon_ad_api-1.8.1}/ad_api/api/v1/advertiser_accounts.py
RENAMED
|
File without changes
|
|
File without changes
|
{python_amazon_ad_api-1.7.0 → python_amazon_ad_api-1.8.1}/ad_api/api/v1/brand_store_editions.py
RENAMED
|
File without changes
|
{python_amazon_ad_api-1.7.0 → python_amazon_ad_api-1.8.1}/ad_api/api/v1/brand_store_pages.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{python_amazon_ad_api-1.7.0 → python_amazon_ad_api-1.8.1}/ad_api/api/v1/label_object_associations.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{python_amazon_ad_api-1.7.0 → python_amazon_ad_api-1.8.1}/ad_api/api/v1/recommendation_types.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{python_amazon_ad_api-1.7.0 → python_amazon_ad_api-1.8.1}/ad_api/api/validation_configurations.py
RENAMED
|
File without changes
|
|
File without changes
|
{python_amazon_ad_api-1.7.0 → python_amazon_ad_api-1.8.1}/ad_api/auth/access_token_client.py
RENAMED
|
File without changes
|
{python_amazon_ad_api-1.7.0 → python_amazon_ad_api-1.8.1}/ad_api/auth/access_token_response.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{python_amazon_ad_api-1.7.0 → python_amazon_ad_api-1.8.1}/ad_api/base/credential_provider.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|