Skip to main content

PYTHON-AMAZON-AD-API

CodeQL CodeQL CodeQL Documentation Status PyPI Downloads Downloads Downloads

Amazon's Advertising API

A python 3 wrapper to access Amazon's Advertising API with an easy-to-use interface.

Install

Badge

pip install python-amazon-ad-api

Donate

If you find this project is useful consider donating or sponsor it to keep on going on it, thank you.

paypal

alt text

Overview

You need obtain your own credentials with Amazon that may include an amazon developer account and access as seller or vendor. Please view the checklist of Amazon Ads API onboarding overview

Code Credentials

You can use your credentials as follows passing it to the client as a dict. Please review the full documentation to see all posibilities to include your credentials.

from ad_api.api import sponsored_products


my_credentials = dict(
    refresh_token='your-refresh_token',
    client_id='your-client_id',
    client_secret='your-client_secret',
    profile_id='your-profile_id',
)

info = \
    {
        "stateFilter":
            {
                "include": [
                    "ENABLED"
                ]
            }
    }

result = sponsored_products.CampaignsV3(credentials=my_credentials).list_campaigns(
    body=info
)

YAML Credentials

Use a credentials.yml file with your credentials for more convenience and manage diferent accounts or profiles. Amazon requires one profile per marketplace so it is helpful to keep all in one file and switch directly from the code, using the account.

Create a file credentials.yml

version: '1.0'

default:
  refresh_token: 'your-refresh-token'
  client_id: 'your-client-id'
  client_secret: 'your-client-secret'
  profile_id: 'your-profile-id'

germany:
  refresh_token: 'other-refresh-token'
  client_id: 'other-client-id'
  client_secret: 'other-client-secret'
  profile_id: 'other-profile-id'

Python code

from ad_api.api import sponsored_products

# Leave empty will use the 'default' account
result=sponsored_products.CampaignsV3().list_campaigns()
# will use germany account data
result=sponsored_products.CampaignsV3(account="germany").list_campaigns()

Search path for credentials.yml

  • macOS and Other Unix: ~/.config/python-ad-api
  • Windows: %APPDATA%\python-ad-api where the APPDATA environment variable falls back to %HOME%\AppData\Roaming if undefined

Confuse Help

Marketplaces

Marketplaces are used to define basically the API endpoints Amazon need to use depending on the regions, by default it will use EU so if you are using one of the marketplaces that are under the Europe (EU). Covers UK, FR, IT, ES, DE, NL, AE, SE, PL, and TR marketplaces you can skip. If you are using either North America (NA) or Far East (FE), you will need import from base and pass the marketplace as follows:

from ad_api.api import sponsored_products
from ad_api.base import Marketplaces

# You can pass NA or US, CA, MX or BR for North America and JP, AU or SG for Far East
result=sponsored_products.CampaignsV3(marketplace=Marketplaces.NA).list_campaigns()

Exceptions

You can use a try except statement when you call the API and catch exceptions if some problem ocurred:

from ad_api.api import sponsored_products
from ad_api.base import AdvertisingApiException

info = \
    {
        "stateFilter":
            {
                "include": [
                    "ENABLED"
                ]
            }
    }

try:

    result = sponsored_products.CampaignsV3().list_campaigns(
        body=info
    )

    logging.info(result)

except AdvertisingApiException as error:
    logging.info(error)

Debug

Use debug=True if you want see some logs like the header you submit to the api endpoint, the method and path used among the params and the data submitted if any, to trace some possible errors.

from ad_api.api import sponsored_products
from ad_api.base import AdvertisingApiException


info = \
    {
        "stateFilter":
            {
                "include": [
                    "ENABLED"
                ]
            }
    }

try:

    result = sponsored_products.CampaignsV3(debug=True).list_campaigns(
        body=info
    )

    logging.info(result)

except AdvertisingApiException as error:
    logging.info(error)
import logging
from ad_api.api import Profiles
from ad_api.base import AdvertisingApiException

logging.basicConfig(
    level=logging.DEBUG,
    format="%(asctime)s:%(levelname)s:%(message)s"
)


def register_assistant(value: str):

    logging.info("-------------------------------------")
    logging.info("Profiles > register_assistant(%s)" % value)
    logging.info("-------------------------------------")

    try:

        result = Profiles(debug=True).register_assistant(
            country_code=value
        )
        logging.info(result)

    except AdvertisingApiException as error:
        logging.info(error)


if __name__ == '__main__':

    amz_country_code = "ES"
    register_assistant(amz_country_code)

Or you could do with a curl command, note the {"countryCode":"ES"} that refers to the marketplace you will operate.

curl \
    -X PUT \
    -H "Content-Type:application/json" \
    -H "Authorization: Bearer Your-Token \
    -H "Amazon-Advertising-API-ClientId: your-client-id" \
    --data '{"countryCode":"ES"}' \
     https://advertising-api-test.amazon.com/v2/profiles/register

Modules Available Common Resources

Warning: [PLANNED DEPRECATION 1/3/2025] There is a new version 3 Portfolios API, please check the migration guide.

Amazon Attribution open beta

Brand Metrics open beta

Advertising Test Account

Amazon Ads API v1 (new, unified)

The v1 API lives under /adsApi/v1/ and is not split by product: every call targets the same resource and the product is selected in the request body with adProductFilter. It supersedes the per-product v2/v3 endpoints.

from ad_api.api import v1
Method Endpoint Body
query_campaigns POST /adsApi/v1/query/campaigns filters + maxResults/nextToken
create_campaigns POST /adsApi/v1/create/campaigns campaigns[] (adProduct, name, state required)
update_campaigns POST /adsApi/v1/update/campaigns campaigns[] (campaignId required)
delete_campaigns POST /adsApi/v1/delete/campaigns campaignIds[]

All four return a 207 MultiStatus response (except query_campaigns, which returns 200), so check the payload for per-entity errors.

from ad_api.api import v1

result = v1.Campaigns(credentials=credentials, debug=True).query_campaigns(
    body={
        "adProductFilter": {"include": ["SPONSORED_PRODUCTS"]},
        "stateFilter": {"include": ["ENABLED"]},
        "maxResults": 100,
    }
)

campaigns = result.payload.get("campaigns")
next_token = result.payload.get("nextToken")

Modules Available Sponsored Products 2.0

Warning: [PLANNED DEPRECATION 6/30/2023] There is a new version 3 of Sponsored Product API, please check the migration guide.

Modules Available Sponsored Products 3.0

Warning: list_campaigns is deprecated. Use the v1 query_campaigns method instead.

Modules Available Sponsored Brands 3.0

Modules Available Sponsored Brands 4.0

Modules Available Sponsored Display

Modules Available DSP

Simple Example Usage Campaigns with Credentials (v3, legacy)

Warning: this example uses CampaignsV3.list_campaigns, which is deprecated. See the v1 query_campaigns example above.

import logging
from ad_api.base import AdvertisingApiException
from ad_api.api import sponsored_products

logging.basicConfig(
    level=logging.DEBUG,
    format="%(asctime)s:%(levelname)s:%(message)s"
)

def sp_list_campaigns_v3(info: dict = None):

    credentials = dict(
        refresh_token='your-refresh_token',
        client_id='your-client_id',
        client_secret='your-client_secret',
        profile_id='your-profile_id',
    )

    try:
        result = sponsored_products.CampaignsV3(credentials=credentials, debug=True).list_campaigns(
            body=info
        )
        payload = result.payload
        return payload
    except AdvertisingApiException as error:
        logging.error(error)
        logging.error(error.code)


state_filter = \
    {
        "stateFilter":
            {
                "include": [
                    "ENABLED"
                ]
            }
    }

enabled_campaigns = sp_list_campaigns_v3(state_filter).get("campaigns")


for campaign in enabled_campaigns:
    logging.info(campaign)

logging.info(len(campaigns))

API NOTICE

This API is based on the API Client created by @saleweaver but adapted to amazon advertising authentication requeriments

DISCLAIMER

We are not affiliated with Amazon but they used our api :)

LICENSE

License


Last release: v0.9.7

Metadata

Release files for python-amazon-ad-api 1.0.0

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for python-amazon-ad-api 1.0.0
File Size Uploaded Provenance Actions
python_amazon_ad_api-1.0.0.tar.gz 99.6 kB Without provenance Details for python_amazon_ad_api-1.0.0.tar.gz

Built distribution (wheel)

Table of built distributions (wheels) for python-amazon-ad-api 1.0.0
File Interpreter ABI Platform Actions
python_amazon_ad_api-1.0.0-py3-none-any.whl Python 3 none any Details for python_amazon_ad_api-1.0.0-py3-none-any.whl

Total release size: 262.1 kB

Release files / python_amazon_ad_api-1.0.0.tar.gz

Download URL python_amazon_ad_api-1.0.0.tar.gz
Size 99.6 kB
Tags Source
SHA-256 checksum
How to use checksums
0adf2443564f2ab3ff16ac211b72e1e502487558e2e98157114d4e30ce0bf1f0
BLAKE2b-256 checksum
How to use checksums
9239a9832bfb9e9a4b4944bd2d207a2d05e01a6a79f95d9f7546aa6176316bac
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/6.2.0 CPython/3.9.25

Release files / python_amazon_ad_api-1.0.0-py3-none-any.whl

Download URL python_amazon_ad_api-1.0.0-py3-none-any.whl
Size 162.5 kB
Tags Python 3
SHA-256 checksum
How to use checksums
4fdc9704199bff81a627e113c8c806ad5b62041be755d5224b1d0adb7f530b0d
BLAKE2b-256 checksum
How to use checksums
c64b10173e35b08b262a94ea731d0d368eaa51fc4f61d3176fa01fe704ca83fd
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/6.2.0 CPython/3.9.25

Security for python-amazon-ad-api 1.0.0

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

No provenance found

None of the files in this release were uploaded with provenance metadata.

A note on package security

PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.

To learn more about protecting yourself from malicious actors, visit our package security documentation.

Release history Release notifications | RSS feed

This release

1.0.0 This release

2 release files No provenance

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page