python-amazon-ad-api 1.4.9__py3-none-any.whl → 1.5.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.
- ad_api/api/v1/__init__.py +4 -0
- ad_api/api/v1/labels.py +56 -0
- ad_api/api/v1/reports.py +133 -0
- ad_api/version.py +1 -1
- {python_amazon_ad_api-1.4.9.dist-info → python_amazon_ad_api-1.5.1.dist-info}/METADATA +3 -1
- {python_amazon_ad_api-1.4.9.dist-info → python_amazon_ad_api-1.5.1.dist-info}/RECORD +9 -7
- {python_amazon_ad_api-1.4.9.dist-info → python_amazon_ad_api-1.5.1.dist-info}/WHEEL +0 -0
- {python_amazon_ad_api-1.4.9.dist-info → python_amazon_ad_api-1.5.1.dist-info}/licenses/LICENSE +0 -0
- {python_amazon_ad_api-1.4.9.dist-info → python_amazon_ad_api-1.5.1.dist-info}/top_level.txt +0 -0
ad_api/api/v1/__init__.py
CHANGED
|
@@ -9,6 +9,8 @@ from .brand_store_edition_publish_versions import BrandStoreEditionPublishVersio
|
|
|
9
9
|
from .brand_stores import BrandStores
|
|
10
10
|
from .brand_store_editions import BrandStoreEditions
|
|
11
11
|
from .brand_store_pages import BrandStorePages
|
|
12
|
+
from .reports import Reports
|
|
13
|
+
from .labels import Labels
|
|
12
14
|
|
|
13
15
|
__all__ = [
|
|
14
16
|
"Campaigns",
|
|
@@ -22,4 +24,6 @@ __all__ = [
|
|
|
22
24
|
"BrandStores",
|
|
23
25
|
"BrandStoreEditions",
|
|
24
26
|
"BrandStorePages",
|
|
27
|
+
"Reports",
|
|
28
|
+
"Labels",
|
|
25
29
|
]
|
ad_api/api/v1/labels.py
ADDED
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
from ad_api.base import Client, sp_endpoint, ApiResponse, Utils
|
|
2
|
+
|
|
3
|
+
|
|
4
|
+
class Labels(Client):
|
|
5
|
+
r"""
|
|
6
|
+
Labels(account='default', marketplace: Marketplaces = Marketplaces.EU, credentials=None, debug=False)
|
|
7
|
+
|
|
8
|
+
Amazon Ads API v1 - unified Labels endpoints
|
|
9
|
+
|
|
10
|
+
Labels has a single route and it is read only: there is no create, update
|
|
11
|
+
or delete in the contract.
|
|
12
|
+
|
|
13
|
+
The required member is not the usual adProductFilter but
|
|
14
|
+
``labelObjectTypeFilter``, and it takes exactly one value:
|
|
15
|
+
|
|
16
|
+
AD_GROUP, CAMPAIGN, DEAL, INVENTORY_GROUP
|
|
17
|
+
|
|
18
|
+
``adProductFilter`` is optional here and also takes exactly one value.
|
|
19
|
+
"""
|
|
20
|
+
|
|
21
|
+
@sp_endpoint('/adsApi/v1/query/labels', method='POST')
|
|
22
|
+
def query_labels(self, **kwargs) -> ApiResponse:
|
|
23
|
+
r"""
|
|
24
|
+
query_labels(body: dict) -> ApiResponse
|
|
25
|
+
|
|
26
|
+
Amazon Ads API v1 - Query Labels (operationId: QueryLabel)
|
|
27
|
+
|
|
28
|
+
Request Body [Required]
|
|
29
|
+
| **labelObjectTypeFilter** (dict) : [required] exactly one value
|
|
30
|
+
| **include** (list<LabelObjectType>) : Enum [ AD_GROUP, CAMPAIGN, DEAL, INVENTORY_GROUP ]
|
|
31
|
+
| **adProductFilter** (dict) : [optional] exactly one value
|
|
32
|
+
| **include** (list<AdProduct>) : Enum [ AMAZON_DSP, SPONSORED_BRANDS, SPONSORED_DISPLAY, SPONSORED_PRODUCTS, SPONSORED_TELEVISION ]
|
|
33
|
+
| **labelIdFilter** (dict) : [optional] 1..50 ids
|
|
34
|
+
| **include** (list<string>)
|
|
35
|
+
| **labelNameFilter** (dict) : [optional] 1..10 names
|
|
36
|
+
| **include** (list<string>)
|
|
37
|
+
| **maxResults** (int) : 1..1000, default 100
|
|
38
|
+
| **nextToken** (string) : token to navigate to the next page
|
|
39
|
+
|
|
40
|
+
Returns
|
|
41
|
+
| **labels** (list<Label>) : 0..1000
|
|
42
|
+
| **labelId** (string) : [required]
|
|
43
|
+
| **labelName** (string) : [required]
|
|
44
|
+
| **adProduct** (AdProduct)
|
|
45
|
+
| **nextToken** (string)
|
|
46
|
+
|
|
47
|
+
A body without labelObjectTypeFilter is a rejected request, not an
|
|
48
|
+
empty answer, so every call needs that member even when the other
|
|
49
|
+
filters are left out.
|
|
50
|
+
|
|
51
|
+
Requires one of these permissions:
|
|
52
|
+
campaign_edit, campaign_view
|
|
53
|
+
"""
|
|
54
|
+
schema_version = 'application/json'
|
|
55
|
+
headers = {"Accept": schema_version, "Content-Type": schema_version}
|
|
56
|
+
return self._request(kwargs.pop('path'), data=Utils.convert_body(kwargs.pop('body'), False), params=kwargs, headers=headers)
|
ad_api/api/v1/reports.py
ADDED
|
@@ -0,0 +1,133 @@
|
|
|
1
|
+
from ad_api.base import Client, sp_endpoint, ApiResponse, Utils
|
|
2
|
+
|
|
3
|
+
|
|
4
|
+
class Reports(Client):
|
|
5
|
+
r"""
|
|
6
|
+
Reports(account='default', marketplace: Marketplaces = Marketplaces.EU, credentials=None, debug=False)
|
|
7
|
+
|
|
8
|
+
Amazon Ads API v1 - unified Reports endpoints
|
|
9
|
+
|
|
10
|
+
Reports in v1 are asynchronous and take three routes, not the four of the
|
|
11
|
+
entity families:
|
|
12
|
+
|
|
13
|
+
POST /adsApi/v1/create/reports queue a report
|
|
14
|
+
POST /adsApi/v1/retrieve/reports read its state
|
|
15
|
+
POST /adsApi/v1/delete/reports drop it
|
|
16
|
+
|
|
17
|
+
There is no GET by id: the state is read by posting the id back to
|
|
18
|
+
retrieve, and the pair of routes is what carries the status through
|
|
19
|
+
PENDING, PROCESSING, COMPLETED and FAILED.
|
|
20
|
+
|
|
21
|
+
This generation is shaped differently from the v3 reporting route the
|
|
22
|
+
package already ships as ad_api.api.Reports:
|
|
23
|
+
|
|
24
|
+
v1 uses fields, v3 uses columns
|
|
25
|
+
v1 has no reportTypeId, adProduct, groupBy or timeUnit at all
|
|
26
|
+
v1 filters are a predicate tree, v3 filters are a flat list
|
|
27
|
+
v1 answers a list of report parts, v3 answers one url
|
|
28
|
+
|
|
29
|
+
v1 reports are addressed by advertiser account, and the account travels in
|
|
30
|
+
the body rather than only in the headers.
|
|
31
|
+
|
|
32
|
+
The field catalogue is not part of the contract: query.fields accepts any
|
|
33
|
+
string up to 1000 entries and the service decides which ones exist for each
|
|
34
|
+
product, so a wrong name is answered with a 400 naming the accepted values
|
|
35
|
+
rather than with a local rejection.
|
|
36
|
+
"""
|
|
37
|
+
|
|
38
|
+
@sp_endpoint('/adsApi/v1/create/reports', method='POST')
|
|
39
|
+
def create_report(self, **kwargs) -> ApiResponse:
|
|
40
|
+
r"""
|
|
41
|
+
create_report(body: dict) -> ApiResponse
|
|
42
|
+
|
|
43
|
+
Amazon Ads API v1 - Create a report (operationId: AdsApiv1CreateReport)
|
|
44
|
+
|
|
45
|
+
Request Body [Required]
|
|
46
|
+
| **accessRequestedAccounts** (list<ReportCreateAccessRequestedAccountItem>) : [required] 1..2000
|
|
47
|
+
| oneOf **advertiserAccountId** (string) : the advertiser account the report is for
|
|
48
|
+
| oneOf **managerAccountId** (string) : the manager account the report is for
|
|
49
|
+
| **reports** (list<ReportCreate>) : [required] exactly 1
|
|
50
|
+
| **format** (ReportFormat) : [required] Enum [ CSV, GZIP_JSON, PARTITIONED_CSV, PARTITIONED_GZIP_JSON ]
|
|
51
|
+
| **periods** (list<CreateReportPeriod>) : [required] exactly 1
|
|
52
|
+
| **datePeriod** (CreateDatePeriod) : [required]
|
|
53
|
+
| **startDate** (date) : [required]
|
|
54
|
+
| **endDate** (date) : [required]
|
|
55
|
+
| **query** (CreateReportingQuery) : [required]
|
|
56
|
+
| **fields** (list<string>) : [required] 1..1000
|
|
57
|
+
| **filter** (CreateFilter) : [optional]
|
|
58
|
+
| **on** (CreateComparisonPredicate)
|
|
59
|
+
| **field** (string) : [required] pattern ^[a-zA-Z0-9]+\.[a-zA-Z0-9]+$
|
|
60
|
+
| **comparisonOperator** (ComparisonOperator) : [required] Enum [ EQUALS, IN ]
|
|
61
|
+
| **values** (list<string>) : [required] 1..2000
|
|
62
|
+
| **not** (boolean) : [required]
|
|
63
|
+
| **and** (CreateCompositePredicate)
|
|
64
|
+
| **filters** (list<CreateFilter>) : [required] 1..10
|
|
65
|
+
| **currencyOfView** (CurrencyCode) : [optional]
|
|
66
|
+
| **managerAccountDspGrouping** (ManagerAccountDspGrouping) : [optional]
|
|
67
|
+
|
|
68
|
+
Answer
|
|
69
|
+
207 MultiStatus with success[] carrying the created report ids and
|
|
70
|
+
error[] carrying the index and reason of the ones refused.
|
|
71
|
+
|
|
72
|
+
Requires one of these permissions:
|
|
73
|
+
ManagerAccount_Dev, advertiser_campaign_edit, nemo_report_view,
|
|
74
|
+
MasterAccount_Viewer, MA_ReadOnly, advertiser_campaign_view,
|
|
75
|
+
reports_edit, MasterAccount_Manager, nemo_report_edit,
|
|
76
|
+
view_performance_dashboard
|
|
77
|
+
"""
|
|
78
|
+
schema_version = 'application/json'
|
|
79
|
+
headers = {"Accept": schema_version, "Content-Type": schema_version}
|
|
80
|
+
return self._request(kwargs.pop('path'), data=Utils.convert_body(kwargs.pop('body'), False), params=kwargs, headers=headers)
|
|
81
|
+
|
|
82
|
+
@sp_endpoint('/adsApi/v1/retrieve/reports', method='POST')
|
|
83
|
+
def retrieve_report(self, **kwargs) -> ApiResponse:
|
|
84
|
+
r"""
|
|
85
|
+
retrieve_report(body: dict) -> ApiResponse
|
|
86
|
+
|
|
87
|
+
Amazon Ads API v1 - Retrieve a report by id (operationId: AdsApiv1RetrieveReport)
|
|
88
|
+
|
|
89
|
+
Request Body [Required]
|
|
90
|
+
| **reportIds** (list<string>) : [required] exactly 1
|
|
91
|
+
|
|
92
|
+
Answer
|
|
93
|
+
The report object, with the members that matter here:
|
|
94
|
+
|
|
95
|
+
| **reportId** (string)
|
|
96
|
+
| **status** (ReportStatus) : Enum [ COMPLETED, FAILED, PENDING, PROCESSING ]
|
|
97
|
+
| **format** (ReportFormat)
|
|
98
|
+
| **periods** (list<ReportPeriod>)
|
|
99
|
+
| **query** (ReportingQuery) : the fields and filter the report was built from
|
|
100
|
+
| **creationDateTime**, **lastUpdatedDateTime**, **completedDateTime** (date-time)
|
|
101
|
+
| **failureCode** (string), **failureReason** (string) : set when status is FAILED
|
|
102
|
+
| **warnings** (list<ReportWarning>) : non-fatal notes about the generated report
|
|
103
|
+
| **completedReportParts** (list<ReportPart>) : 0..100
|
|
104
|
+
| **url** (string) : signed download url for this part
|
|
105
|
+
| **urlExpirationDateTime** (date-time)
|
|
106
|
+
| **sizeInBytes** (int64) : up to 100GB for a single part
|
|
107
|
+
|
|
108
|
+
A report split in parts answers more than one entry, so a caller that
|
|
109
|
+
only reads the first url loses data.
|
|
110
|
+
|
|
111
|
+
Requires one of these permissions:
|
|
112
|
+
none declared
|
|
113
|
+
"""
|
|
114
|
+
schema_version = 'application/json'
|
|
115
|
+
headers = {"Accept": schema_version, "Content-Type": schema_version}
|
|
116
|
+
return self._request(kwargs.pop('path'), data=Utils.convert_body(kwargs.pop('body'), False), params=kwargs, headers=headers)
|
|
117
|
+
|
|
118
|
+
@sp_endpoint('/adsApi/v1/delete/reports', method='POST')
|
|
119
|
+
def delete_report(self, **kwargs) -> ApiResponse:
|
|
120
|
+
r"""
|
|
121
|
+
delete_report(body: dict) -> ApiResponse
|
|
122
|
+
|
|
123
|
+
Amazon Ads API v1 - Delete a report by id (operationId: AdsApiv1DeleteReport)
|
|
124
|
+
|
|
125
|
+
Request Body [Required]
|
|
126
|
+
| **reportIds** (list<string>) : [required] exactly 1
|
|
127
|
+
|
|
128
|
+
Requires one of these permissions:
|
|
129
|
+
none declared
|
|
130
|
+
"""
|
|
131
|
+
schema_version = 'application/json'
|
|
132
|
+
headers = {"Accept": schema_version, "Content-Type": schema_version}
|
|
133
|
+
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.
|
|
1
|
+
__version__ = "1.5.1"
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: python-amazon-ad-api
|
|
3
|
-
Version: 1.
|
|
3
|
+
Version: 1.5.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
|
|
@@ -311,6 +311,8 @@ The v1 API lives under `/adsApi/v1/` and is **not** split by product: every call
|
|
|
311
311
|
* [Brand Stores](https://python-amazon-ad-api.readthedocs.io/en/latest/v1/brand_stores.html#ad_api.api.v1.BrandStores.BrandStores.query_brand_stores)
|
|
312
312
|
* [Brand Store Editions](https://python-amazon-ad-api.readthedocs.io/en/latest/v1/brand_store_editions.html#ad_api.api.v1.BrandStoreEditions.BrandStoreEditions.list_brand_store_editions)
|
|
313
313
|
* [Brand Store Pages](https://python-amazon-ad-api.readthedocs.io/en/latest/v1/brand_store_pages.html#ad_api.api.v1.BrandStorePages.BrandStorePages.query_brand_store_pages)
|
|
314
|
+
* [Reports](https://python-amazon-ad-api.readthedocs.io/en/latest/v1/reports.html#ad_api.api.v1.Reports.Reports.create_report)
|
|
315
|
+
* [Labels](https://python-amazon-ad-api.readthedocs.io/en/latest/v1/labels.html#ad_api.api.v1.Labels.Labels.query_labels)
|
|
314
316
|
|
|
315
317
|
|
|
316
318
|
### [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=
|
|
2
|
+
ad_api/version.py,sha256=8rmxh34XkVT7yu5zgYupipfDrKs2hgGCjOMEIK3E4oI,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
|
|
@@ -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=
|
|
92
|
+
ad_api/api/v1/__init__.py,sha256=N7oUW-FY2Rd8iyQ0AsiY0nWn6bA39gPf5bxtlgSIIFU,807
|
|
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
|
|
@@ -100,6 +100,8 @@ ad_api/api/v1/brand_store_editions.py,sha256=xW4z2jDWhNJn86tWlT3eLIRr0NEpxLhW1eA
|
|
|
100
100
|
ad_api/api/v1/brand_store_pages.py,sha256=TrSQbqlXqFv7i7RooxlFZOBrwYfEMPLvRPSJ9FjO87o,2765
|
|
101
101
|
ad_api/api/v1/brand_stores.py,sha256=zlBsKiOwmdSiIG9filgdqUlPnV6AX-gE6S5nNyAQACc,2131
|
|
102
102
|
ad_api/api/v1/campaigns.py,sha256=u5PlvoAhgVhMxbCvYkPgqtbYK3TXXcb7TMie0Qjrgwc,9573
|
|
103
|
+
ad_api/api/v1/labels.py,sha256=jjPmafIQZTh99Ztj5MCcDC7UyoFFN0YuWdn2syqd3Yg,2438
|
|
104
|
+
ad_api/api/v1/reports.py,sha256=vJmWhIsALkX27HeijTsSUz3zrYhUBm4RodTCieJD8Y8,6657
|
|
103
105
|
ad_api/api/v1/targets.py,sha256=a4BzPjg9m1JJwqphhpQOFkNIcgCw7v4-K0sNzOihMZI,12355
|
|
104
106
|
ad_api/auth/__init__.py,sha256=B_yKdmsHENQaKfMFAIcSxQqG4aBUmNBm5orKIMUYObk,229
|
|
105
107
|
ad_api/auth/access_token_client.py,sha256=_V0FGXRmqRNMb1fz1AGqnR6gYr_WqFkMTbK1os0yoIk,2983
|
|
@@ -116,8 +118,8 @@ ad_api/base/exceptions.py,sha256=9D3M40ZIlLS0fA-aQh1BTWPOW-Nvf0tRhbA85jFnDJ4,438
|
|
|
116
118
|
ad_api/base/helpers.py,sha256=UK7Q13vZ0mNdF54xzfzoGDn2O_cd2yPrK2X4rOzC41c,2334
|
|
117
119
|
ad_api/base/marketplaces.py,sha256=44lvCcluXNpqTprWQ80e3weSQmQbJoWL-WDSOWVbCyQ,4657
|
|
118
120
|
ad_api/base/utils.py,sha256=_qnCBOvyJTLgaZjJzUWTi38GGLHkQszXELs79133Rb4,5618
|
|
119
|
-
python_amazon_ad_api-1.
|
|
120
|
-
python_amazon_ad_api-1.
|
|
121
|
-
python_amazon_ad_api-1.
|
|
122
|
-
python_amazon_ad_api-1.
|
|
123
|
-
python_amazon_ad_api-1.
|
|
121
|
+
python_amazon_ad_api-1.5.1.dist-info/licenses/LICENSE,sha256=h2rpqlmmLy-4l1tN6KpWAFxx1JEMYeEFrMrZUbx_B_o,1105
|
|
122
|
+
python_amazon_ad_api-1.5.1.dist-info/METADATA,sha256=4f5AoC0Qz1jWSKGvpFZIzhMP-bM1MnwzPAPTyodFHIU,23081
|
|
123
|
+
python_amazon_ad_api-1.5.1.dist-info/WHEEL,sha256=aeYiig01lYGDzBgS8HxWXOg3uV61G9ijOsup-k9o1sk,91
|
|
124
|
+
python_amazon_ad_api-1.5.1.dist-info/top_level.txt,sha256=nN9twUos-8pkP514ZwpvRU9YL9L2XyQyHsMQFfudGTU,7
|
|
125
|
+
python_amazon_ad_api-1.5.1.dist-info/RECORD,,
|
|
File without changes
|
{python_amazon_ad_api-1.4.9.dist-info → python_amazon_ad_api-1.5.1.dist-info}/licenses/LICENSE
RENAMED
|
File without changes
|
|
File without changes
|