apple-search-ads

Manage Apple Search Ads campaigns, keywords, and reporting. Use when setting up campaigns, adding keywords, checking performance, or optimizing Apple Search Ads for any iOS app. Implements Apple's recommended 4-campaign structure (Brand, Category, Competitor, Discovery).

Safety Notice

This listing is imported from skills.sh public index metadata. Review upstream SKILL.md and repository scripts before running.

Copy this and send it to your AI assistant to learn

Install skill "apple-search-ads" with this command: npx skills add cameronehrlich/apple-search-ads-cli/cameronehrlich-apple-search-ads-cli-apple-search-ads

Apple Search Ads Management

Full management of Apple Search Ads campaigns for iOS apps using the ASA CLI tool.

Capabilities

This skill enables you to:

  • Set up Apple's recommended 4-campaign structure
  • Add keywords with automatic routing (exact → target, broad → discovery, negative → discovery)
  • Block irrelevant search terms with negative keywords
  • Promote winning keywords from Discovery to exact match campaigns
  • Generate performance reports (campaign, keyword, search term level)
  • Audit campaign structure against Apple's best practices
  • Pause/enable campaigns
  • Automated optimization - analyze search terms and batch promote/block keywords

Prerequisites

Running with uv (Recommended)

No installation required. Just use uv run:

cd /path/to/apple-search-ads-cli
uv run asa config setup
uv run asa campaigns list

Alternative: pip install

cd /path/to/apple-search-ads-cli
pip install -e .
asa config setup

Configuration

uv run asa config setup

You'll need from Apple Ads dashboard (https://ads.apple.com/):

  • Organization ID
  • Client ID, Team ID, Key ID
  • Private key file (EC key pair)

To generate keys:

openssl ecparam -genkey -name prime256v1 -noout -out private-key.pem
openssl ec -in private-key.pem -pubout -out public-key.pem

Verify Setup

asa config test

Command Reference

Configuration Commands

CommandDescription
asa config setupInteractive credential and app setup
asa config showDisplay current configuration
asa config testTest API connection

Campaign Commands

CommandDescription
asa campaigns listList all campaigns
asa campaigns list --bidsInclude ad group default bids
asa campaigns list --filter "term"Filter campaigns by name
asa campaigns list --status RUNNINGFilter by status (RUNNING, PAUSED)
asa campaigns create <name>Create a new campaign
asa campaigns update <ID>Update campaign name/budget/status
asa campaigns auditCheck structure vs Apple recommendations
asa campaigns audit --verboseShow detailed ad group info
asa campaigns setupCreate 4-campaign structure
asa campaigns setup --dry-runPreview without creating
asa campaigns pause <ID>Pause specific campaign
asa campaigns pause --allPause all managed campaigns
asa campaigns enable <ID>Enable specific campaign
asa campaigns enable --allEnable all managed campaigns
asa campaigns delete <ID>Delete specific campaign

Ad Group Commands

CommandDescription
asa adgroups list <campaign_id>List ad groups for a campaign
asa adgroups create <name> -c <campaign_id>Create a new ad group
asa adgroups update <ID> -c <campaign_id>Update ad group settings
asa adgroups pause <ID> -c <campaign_id>Pause an ad group
asa adgroups enable <ID> -c <campaign_id>Enable an ad group
asa adgroups delete <ID> -c <campaign_id>Delete an ad group

Keyword Commands

CommandDescription
asa keywords listList keywords (interactive selection)
asa keywords list --campaign <ID>List keywords for specific campaign
asa keywords list --negativesList negative keywords
asa keywords list --filter "term"Filter keywords containing text
asa keywords list --status ACTIVEFilter by status (ACTIVE, PAUSED)
asa keywords list --match-type EXACTFilter by match type (EXACT, BROAD)
asa keywords add "<kw1>,<kw2>" --type brandAdd brand keywords
asa keywords add "<kw1>,<kw2>" --type categoryAdd category keywords
asa keywords add "<kw1>,<kw2>" --type competitorAdd competitor keywords
asa keywords add-negatives "<kw1>,<kw2>" --allBlock terms in all campaigns
asa keywords add-negatives "<kw1>,<kw2>" --all --forceBlock terms without confirmation
asa keywords promote "<kw1>,<kw2>" --target categoryGraduate from Discovery
asa keywords deleteDelete keywords (interactive)
asa keywords delete --ids "123,456" --forceDelete specific keywords by ID
asa keywords update-bid --bid 2.50Update keyword bid amount
asa keywords pausePause a keyword
asa keywords pause --allPause all active keywords in ad group
asa keywords enableEnable a paused keyword
asa keywords enable --allEnable all paused keywords in ad group

Report Commands

CommandDescription
asa reports summaryPerformance summary (last 30 days)
asa reports summary --days 7Custom date range
asa reports keywordsKeyword performance
asa reports keywords --sort cpaSort by CPA
asa reports adgroups --allAd group performance for all campaigns
asa reports adgroups --campaign <ID>Ad group performance for specific campaign
asa reports impression-share --allImpression share / Share of Voice report
asa reports impression-share --min-impressions 50Filter by minimum impressions
asa reports search-termsAll search terms
asa reports search-terms --winnersTerms to promote (good CPA)
asa reports search-terms --negativesTerms to block (spend, no installs)

Optimization Commands

CommandDescription
asa optimizeRun automated optimization workflow
asa optimize --dry-runPreview changes without applying
asa optimize --days 7Analyze last 7 days (default: 14)
asa optimize --cpa-threshold 3.00Max CPA for winners (default: $5.00)
asa optimize --min-installs 3Min installs to promote (default: 2)
asa optimize --min-spend 2.00Min spend to block (default: $1.00)
asa optimize --min-impressions 100Min impressions to consider a term
asa optimize --exclude "term1,term2"Exclude specific terms from analysis
asa optimize --target brandTarget campaign type (default: category)
asa optimize --auto-approveSkip confirmation prompts
asa optimize --jsonOutput results as JSON (implies --dry-run)

Campaign Structure

Apple's recommended 4-campaign structure:

CampaignPurposeMatch TypeSearch Match
BrandApp/company nameExactOFF
CategoryApp functionalityExactOFF
CompetitorCompetitor appsExactOFF
DiscoveryKeyword miningBroad + Search MatchON

Keyword Routing

When you add keywords with --type brand/category/competitor:

  1. EXACT match → Target campaign
  2. BROAD match → Discovery (for mining related terms)
  3. NEGATIVE → Discovery (prevents double-paying)

Common Workflows

Initial Setup

# 1. Configure (no installation required with uv)
cd /path/to/apple-search-ads-cli
uv run asa config setup
# Enter: Org ID, Client ID, Team ID, Key ID, private key path
# Enter: App ID, App name, Countries, Default bid

# 2. Test connection
uv run asa config test

# 3. Audit existing campaigns
uv run asa campaigns audit

# 4. Create 4-campaign structure (preview first)
uv run asa campaigns setup --countries US --budget 50 --dry-run
uv run asa campaigns setup --countries US --budget 50

Adding Initial Keywords

# Brand keywords (your app name)
asa keywords add "myapp,myapp app,my app" --type brand

# Category keywords (what your app does)
asa keywords add "photo editor,image filter,picture effects" --type category

# Competitor keywords (other apps)
asa keywords add "vsco,snapseed,lightroom" --type competitor

Weekly Optimization

Option 1: Automated (Recommended)

# Preview what will change
asa optimize --dry-run

# Run optimization with confirmation
asa optimize

# Or run automatically without prompts
asa optimize --auto-approve

The asa optimize command automatically:

  1. Analyzes Discovery search terms (last 14 days)
  2. Identifies winners (≥2 installs, CPA ≤ $5)
  3. Identifies losers (≥$1 spend, 0 installs)
  4. Promotes winners to target campaign (adds as exact + negative in Discovery)
  5. Blocks losers across all managed campaigns

Option 2: Manual

# 1. Check overall performance
asa reports summary --days 7

# 2. Find winning search terms
asa reports search-terms --winners

# 3. Promote winners to exact match
asa keywords promote "best photo app,picture editor free" --target category

# 4. Find wasted spend
asa reports search-terms --negatives

# 5. Block wasteful terms
asa keywords add-negatives "auto clicker,signal app,testflight,crypto trading" --all

Troubleshooting

# Check campaign structure issues
asa campaigns audit --verbose

# List all campaigns including non-managed
asa campaigns list --all

# Check specific campaign keywords
asa keywords list --campaign 12345

# Check negative keywords
asa keywords list --negatives --campaign 12345

Campaign Naming

The CLI identifies campaign types by looking for these keywords in the campaign name (case-insensitive):

KeywordCampaign Type
brandBrand campaign
categoryCategory campaign
competitorCompetitor campaign
discoveryDiscovery campaign

Examples of valid names:

  • Brand (simple)
  • My Brand Campaign
  • MyApp Category
  • competitor-us

Example Keywords

Brand Keywords (your app/company name)

[appname], [appname] app, [company] invest

Category Keywords (what your app does)

photo editor, image filter, picture effects, camera app

Competitor Keywords (competing apps)

[competitor1] app, [competitor2], [competitor3]

Common Negative Keywords (block these)

auto clicker, signal app, testflight, crypto trading, forex trading, stock trading, day trading

API Coverage

The CLI covers these Apple Search Ads API operations:

CategoryOperations
Campaignslist, get, create, update, pause, enable, delete
Ad Groupslist, create, update, pause, enable, delete
Keywordslist, add, add negatives, delete, update bid, pause, enable
Reportscampaign, keyword, search terms

Not yet implemented (advanced features):

  • Creative sets
  • Geo-targeting beyond country level
  • Budget orders

API Notes

Bulk Operations: The CLI uses Apple's bulk API endpoints for keyword operations (enable, pause, delete, update bid). These are more efficient than individual requests.

Caching: Apple's API may show stale data after delete operations. If keywords still appear in listings after deletion, the delete was successful but the cache hasn't refreshed. Attempting to modify deleted keywords will return "keyword deleted" errors.

Search Terms Reports: Search term reports require campaigns to have accumulated sufficient data (typically a few days of activity). New campaigns may return empty results.

Error Handling: Keyword add operations (add_keywords, add_negative_keywords) return both successful additions and any errors (e.g., duplicate keywords). The CLI displays both:

  • Successfully added keywords are shown in green
  • Duplicates or other errors are shown with details but don't fail the overall operation

Authentication Retry: The CLI automatically retries requests (up to 2 times) when authentication tokens expire, refreshing the token transparently.


Documentation

Source Transparency

This detail page is rendered from real SKILL.md content. Trust labels are metadata-based hints, not a safety guarantee.

Related Skills

Related by shared tags or category signals.

Coding

openclaw-version-monitor

监控 OpenClaw GitHub 版本更新,获取最新版本发布说明,翻译成中文, 并推送到 Telegram 和 Feishu。用于:(1) 定时检查版本更新 (2) 推送版本更新通知 (3) 生成中文版发布说明

Archived SourceRecently Updated
Coding

ask-claude

Delegate a task to Claude Code CLI and immediately report the result back in chat. Supports persistent sessions with full context memory. Safe execution: no data exfiltration, no external calls, file operations confined to workspace. Use when the user asks to run Claude, delegate a coding task, continue a previous Claude session, or any task benefiting from Claude Code's tools (file editing, code analysis, bash, etc.).

Archived SourceRecently Updated
Coding

ai-dating

This skill enables dating and matchmaking workflows. Use it when a user asks to make friends, find a partner, run matchmaking, or provide dating preferences/profile updates. The skill should execute `dating-cli` commands to complete profile setup, task creation/update, match checking, contact reveal, and review.

Archived SourceRecently Updated
Coding

clawhub-rate-limited-publisher

Queue and publish local skills to ClawHub with a strict 5-per-hour cap using the local clawhub CLI and host scheduler.

Archived SourceRecently Updated