Skip to main content

A modern Python client for the Apple Search Ads API with full type safety and async support

Project description

ASA API Client

PyPI version Python License CI

A modern, fully-typed Python client for the Apple Search Ads API with async support and Pydantic models.

Features

  • Full Type Safety - Complete type hints with strict mypy compliance
  • Async Support - Both sync and async methods in a unified client
  • Pydantic Models - Validated request/response models
  • Resource-based API - Intuitive client.campaigns.list() pattern
  • Automatic Pagination - iter_all() and iter_all_async() helpers
  • Reports with Pandas - Optional DataFrame export

Installation

Using uv (recommended):

uv add asa-api-client

Using pip:

pip install asa-api-client

With pandas support:

uv add "asa-api-client[pandas]"
# or
pip install "asa-api-client[pandas]"

Quick Start

from asa_api_client import AppleSearchAdsClient

# From environment variables
client = AppleSearchAdsClient.from_env()

# Or explicit configuration
client = AppleSearchAdsClient(
    client_id="SEARCHADS.xxx",
    team_id="SEARCHADS.xxx",
    key_id="xxx",
    org_id=123456,
    private_key_path="private-key.pem",
)

# List campaigns
with client:
    campaigns = client.campaigns.list()
    for campaign in campaigns:
        print(f"{campaign.name}: {campaign.status}")

Environment Variables

export ASA_CLIENT_ID="SEARCHADS.your-client-id"
export ASA_TEAM_ID="SEARCHADS.your-team-id"
export ASA_KEY_ID="your-key-id"
export ASA_ORG_ID="123456"
export ASA_PRIVATE_KEY_PATH="/path/to/private-key.pem"

Or use a .env file:

ASA_CLIENT_ID=SEARCHADS.your-client-id
ASA_TEAM_ID=SEARCHADS.your-team-id
ASA_KEY_ID=your-key-id
ASA_ORG_ID=123456
ASA_PRIVATE_KEY_PATH=private-key.pem

Resources

Campaigns

# List all campaigns
campaigns = client.campaigns.list()

# Get a specific campaign
campaign = client.campaigns.get(campaign_id)

# Find with filters
from asa_api_client.models import Selector
enabled = client.campaigns.find(
    Selector().where("status", "==", "ENABLED")
)

# Create a campaign
from asa_api_client.models import CampaignCreate, Money, CampaignSupplySource
campaign = client.campaigns.create(
    CampaignCreate(
        name="My Campaign",
        adam_id=123456789,
        countries_or_regions=["US"],
        daily_budget_amount=Money(amount="100", currency="USD"),
        supply_sources=[CampaignSupplySource.APPSTORE_SEARCH_RESULTS],
    )
)

Ad Groups

# Access ad groups through campaign
ad_groups = client.campaigns(campaign_id).ad_groups.list()

# Create an ad group
from asa_api_client.models import AdGroupCreate
ad_group = client.campaigns(campaign_id).ad_groups.create(
    AdGroupCreate(
        name="My Ad Group",
        default_bid_amount=Money(amount="1.00", currency="USD"),
    )
)

Keywords

# List keywords in an ad group
keywords = client.campaigns(campaign_id).ad_groups(ad_group_id).keywords.list()

# Create keywords (bulk only)
from asa_api_client.models import KeywordCreate, KeywordMatchType
result = client.campaigns(campaign_id).ad_groups(ad_group_id).keywords.create_bulk([
    KeywordCreate(
        text="my keyword",
        match_type=KeywordMatchType.EXACT,
        bid_amount=Money(amount="1.50", currency="USD"),
    )
])

Reports

from datetime import date

# Campaign report
report = client.reports.campaigns(
    start_date=date(2024, 1, 1),
    end_date=date(2024, 1, 31),
)

# Convert to DataFrame (requires pandas)
df = report.to_dataframe()

Async Usage

import asyncio

async def main():
    client = AppleSearchAdsClient.from_env()

    async with client:
        campaigns = await client.campaigns.list_async()

        # Async iteration
        async for campaign in client.campaigns.iter_all_async():
            print(campaign.name)

asyncio.run(main())

CLI

For a command-line interface, install search-ads-cli:

uv add search-ads-cli
# or
pip install search-ads-cli

License

MIT License - Copyright (c) 2025 Peth Pty Ltd

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

asa_api_client-0.1.1.tar.gz (97.7 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

asa_api_client-0.1.1-py3-none-any.whl (41.5 kB view details)

Uploaded Python 3

File details

Details for the file asa_api_client-0.1.1.tar.gz.

File metadata

  • Download URL: asa_api_client-0.1.1.tar.gz
  • Upload date:
  • Size: 97.7 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.7

File hashes

Hashes for asa_api_client-0.1.1.tar.gz
Algorithm Hash digest
SHA256 501c6f817b81abdd0f3cd9f19991a6ba53324be04aad7140299f2d027666354b
MD5 bed9874246edccaed6c10bf8dd3a6836
BLAKE2b-256 a87731549a1eff36796851b86d139877e1926f80260808388006b8f858d4bc16

See more details on using hashes here.

Provenance

The following attestation bundles were made for asa_api_client-0.1.1.tar.gz:

Publisher: publish.yml on SamPetherbridge/asa-api-client

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file asa_api_client-0.1.1-py3-none-any.whl.

File metadata

  • Download URL: asa_api_client-0.1.1-py3-none-any.whl
  • Upload date:
  • Size: 41.5 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.7

File hashes

Hashes for asa_api_client-0.1.1-py3-none-any.whl
Algorithm Hash digest
SHA256 825bf68a1ba05080c0a5835dcf140f9a1ac496aa70e4020ae0e2837a8cee2709
MD5 af0f0dcc51523cecfe7d24282b38eebe
BLAKE2b-256 728e3e7c8460d4f8287850fcf9b67b43e476712e766950eef989283288446f99

See more details on using hashes here.

Provenance

The following attestation bundles were made for asa_api_client-0.1.1-py3-none-any.whl:

Publisher: publish.yml on SamPetherbridge/asa-api-client

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page