Token导航 LogoToken导航TokenDH.com
研究检索敏感数据clawhub未标认证来源可访问clear审计通过

apple-search-adsApple 搜索 ADS

Agent Skill

apple-search-ads 用于查找、检索和筛选相关信息,适合在 OpenClaw 中需要根据关键词、任务场景或来源线索快速定位候选结果时使用。可结合来源仓库、安装命令和原始 README 继续核验具体用法。安装前建议确认权限范围、维护状态,以及是否会触发联网、命令执行或文件读写。

总安装

17,073

周安装

684

GitHub Stars

1

下载量

5,527
OpenClaw

安装说明

本站只整理中文说明和来源信息,不托管安装包,也不代用户安装。

GitHub

来源数

2

许可证

MIT-0

最后核验

2026-05-01

来源状态

来源可访问

安装方式

通过对话安装

复制提示词发给支持本地命令或 Skills 的 AI 助手,先确认命令和权限,再让它执行。

请帮我安装这个 Agent Skill:apple-search-ads(Apple 搜索 ADS)
来源仓库:https://github.com/ivangdavila/apple-search-ads
安装命令:
openclaw skills install apple-search-ads
安装前请先检查当前环境是否支持对应 CLI,并向我确认将要执行的命令、安装目录、联网范围和文件读写权限;确认后再执行。

命令行安装

复制命令到本机终端执行。该命令会通过 OpenClaw 从第三方来源获取 Skill;本站只展示命令,不托管安装包,也不自动执行。

ClawHubOpenClaw
openclaw skills install apple-search-ads

简介

通过 API 自动化、归因集成和出价策略建议创建、优化和扩展 Apple Search Ads 广告系列。

SKILL.md

name
Apple Search Ads
slug
apple-search-ads
version
1.0.0
homepage
https://clawic.com/skills/apple-search-ads
description
Create, optimize, and scale Apple Search Ads campaigns with API automation, attribution integration, and bid strategy recommendations.
metadata
{"clawdbot":{"emoji":"🍎","requires":{"bins":["curl","jq"],"env":["ASA_CLIENT_ID","ASA_TEAM_ID","ASA_KEY_ID","ASA_ORG_ID","ASA_PRIVATE_KEY_FILE"]},"os":["linux","darwin"]}}

Apple Search Ads 🍎

Complete toolkit for Apple Search Ads: Campaign Management API v5, attribution integration (AdServices + SKAdNetwork), bid optimization, and strategic recommendations.

What's New in v1.0.0

  • Full Campaign Management API v5 coverage
  • iOS app integration (AdServices framework)
  • SKAdNetwork 4.0 support
  • Automated reporting scripts
  • Bid optimization strategies
  • Multi-country campaign patterns

Contents

  1. Setup
  2. When to Use
  3. Architecture
  4. API Essentials
  5. Campaign Structure
  6. Keywords & Bidding
  7. Attribution Integration
  8. Reports & Analytics
  9. Strategy Playbook
  10. Scripts & Automation
  11. Common Traps

Setup

On first use, read setup.md for integration guidelines.

When to Use

User needs to run Apple Search Ads for iOS apps. Agent handles campaign creation, bid optimization, attribution tracking, performance analysis, and strategic recommendations.

Architecture

Memory lives in ~/apple-search-ads/. See memory-template.md for structure.

~/apple-search-ads/
├── memory.md          # Active campaigns, preferences, learnings
├── credentials.md     # OAuth config (NEVER commit real secrets)
├── campaigns/         # Campaign-specific notes and performance
│   └── {app-id}/
├── reports/           # Generated reports
└── scripts/           # Custom automation

Quick Reference

TopicFile
Setup processsetup.md
Memory templatememory-template.md
API endpointsapi-reference.md
iOS integrationios-integration.md
Strategy guidestrategy.md
Script libraryscripts.md

API Essentials

Authentication (OAuth 2.0)

Apple Ads API uses OAuth with client credentials. Generate credentials at: https://app.searchads.apple.com/cm/app/settings/apicertificates

# 1. Generate client secret (JWT signed with private key)
# Header
{
  "alg": "ES256",
  "kid": "{KEY_ID}"
}
# Payload
{
  "sub": "{CLIENT_ID}",
  "aud": "https://appleid.apple.com",
  "iat": {CURRENT_TIMESTAMP},
  "exp": {TIMESTAMP_+180_DAYS},
  "iss": "{TEAM_ID}"
}

# 2. Exchange for access token
curl -X POST "https://appleid.apple.com/auth/oauth2/token" \
  -H "Content-Type: application/x-www-form-urlencoded" \
  -d "grant_type=client_credentials" \
  -d "client_id={CLIENT_ID}" \
  -d "client_secret={CLIENT_SECRET}" \
  -d "scope=searchadsorg"

# Response contains access_token (valid 1 hour)

Base URL & Headers

Base URL: https://api.searchads.apple.com/api/v5
Headers:
  Authorization: Bearer {ACCESS_TOKEN}
  X-AP-Context: orgId={ORG_ID}
  Content-Type: application/json

Core Endpoints

ResourceMethodEndpoint
Apps
Search appsPOST/search/apps
App eligibilityGET/apps/{adamId}/eligibilities
Campaigns
List campaignsGET/campaigns
Create campaignPOST/campaigns
Update campaignPUT/campaigns/{id}
Delete campaignDELETE/campaigns/{id}
Ad Groups
List ad groupsGET/campaigns/{id}/adgroups
Create ad groupPOST/campaigns/{id}/adgroups
Keywords
List keywordsGET/campaigns/{cId}/adgroups/{agId}/targetingkeywords
Add keywordsPOST/campaigns/{cId}/adgroups/{agId}/targetingkeywords/bulk
Reports
Campaign reportPOST/reports/campaigns
Ad group reportPOST/reports/campaigns/{id}/adgroups
Keyword reportPOST/reports/campaigns/{cId}/adgroups/{agId}/keywords
Search term reportPOST/reports/campaigns/{cId}/searchterms
Impression sharePOST/reports/campaigns/{id}/impressionshare

Campaign Structure

Hierarchy

Organization (orgId)
└── Campaign (Search Results / Search Tab / Today Tab)
    ├── Budget & Schedule
    ├── Countries/Regions
    └── Ad Groups
        ├── Keywords (targeting + negative)
        ├── Audience (age, gender, device, etc.)
        ├── Creatives (default or Custom Product Pages)
        └── Bid settings

Campaign Types

TypePlacementBest For
Search ResultsTop of search resultsHigh-intent users, brand defense
Search TabSuggested apps before searchDiscovery, broad reach
Today TabToday tab featuredBrand awareness, launches

Campaign Object

{
  "name": "MyApp - US - Brand",
  "adamId": 123456789,
  "countriesOrRegions": ["US"],
  "budgetAmount": {"amount": "1000", "currency": "USD"},
  "dailyBudgetAmount": {"amount": "50", "currency": "USD"},
  "supplySources": ["APPSTORE_SEARCH_RESULTS"],
  "billingEvent": "TAPS",
  "status": "ENABLED",
  "startTime": "2026-01-01T00:00:00.000",
  "endTime": null
}

Ad Group Object

{
  "name": "Brand Keywords",
  "campaignId": 123456,
  "defaultBidAmount": {"amount": "1.50", "currency": "USD"},
  "cpaGoal": {"amount": "5.00", "currency": "USD"},
  "startTime": "2026-01-01T00:00:00.000",
  "targetingDimensions": {
    "age": {"included": [{"minAge": 18}]},
    "gender": {"included": ["M", "F"]},
    "deviceClass": {"included": ["IPHONE", "IPAD"]},
    "daypart": {"userTime": {"included": [0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23]}},
    "adminArea": null,
    "locality": null,
    "appDownloaders": {"included": [], "excluded": []}
  },
  "automatedKeywordsOptIn": false,
  "status": "ENABLED"
}

Keywords & Bidding

Match Types

TypeBehaviorUse Case
ExactQuery = keyword exactlyBrand terms, proven converters
BroadSynonyms, related termsDiscovery, expansion
Search MatchAuto-matched by AppleNew apps, keyword research

Keyword Object

{
  "text": "meditation app",
  "matchType": "EXACT",
  "bidAmount": {"amount": "2.00", "currency": "USD"},
  "status": "ACTIVE"
}

Bid Strategy Rules

  1. Brand keywords → Bid high (defend your brand)
  2. Competitor keywords → Test carefully, monitor CPA
  3. Generic keywords → Start low, increase for winners
  4. Discovery (Search Match) → Low bids, mine for keywords
  5. Negative keywords → Essential to reduce waste

Bid Optimization Loop

Week 1: Set baseline bids (industry avg or $1-2)
        ↓
Week 2: Review search term report
        - High converts, low bid → raise bid 20-30%
        - Low converts, high spend → lower bid or pause
        - Irrelevant terms → add as negative
        ↓
Week 3+: Repeat. Target CPA within 20% of goal.

Attribution Integration

AdServices Framework (iOS 14.3+)

Modern attribution without user tracking. Integrates directly in iOS app.

import AdServices

func trackAttribution() async {
    do {
        // 1. Get attribution token from device
        let token = try AAAttribution.attributionToken()
        
        // 2. Send to Apple's attribution API
        var request = URLRequest(url: URL(string: "https://api-adservices.apple.com/api/v1/")!)
        request.httpMethod = "POST"
        request.setValue("text/plain", forHTTPHeaderField: "Content-Type")
        request.httpBody = token.data(using: .utf8)
        
        let (data, _) = try await URLSession.shared.data(for: request)
        let attribution = try JSONDecoder().decode(Attribution.self, from: data)
        
        // 3. attribution contains: campaignId, adGroupId, keywordId, etc.
        // Send to your analytics backend
        
    } catch {
        // Not from Apple Search Ads or error
    }
}

struct Attribution: Codable {
    let attribution: Bool
    let orgId: Int?
    let campaignId: Int?
    let adGroupId: Int?
    let keywordId: Int?
    let creativeSetId: Int?
    let conversionType: String?
    let clickDate: String?
}

SKAdNetwork 4.0

Privacy-focused attribution for installs. Apple aggregates data, no user-level tracking.

// In your app delegate
import StoreKit

func application(_ application: UIApplication, 
                 didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
    // Register for attribution
    SKAdNetwork.updatePostbackConversionValue(0) { error in
        // Initial registration
    }
    return true
}

// When user completes valuable action (purchase, signup, etc.)
func trackConversion(value: Int) {
    // value 0-63, represents conversion value
    SKAdNetwork.updatePostbackConversionValue(value) { error in
        if error == nil {
            // Updated successfully
        }
    }
}

SKAdNetwork Conversion Value Strategy

ValueMeaningExample
0Install onlyApp opened
1-10Engagement tierSessions, time in app
11-30Feature usageKey feature activated
31-50Monetization signalTrial started, content viewed
51-63Revenue tierPurchase completed

MMP Integration (AppsFlyer, Adjust, etc.)

If using an MMP, they handle AdServices and SKAdNetwork. Follow their SDK docs. Key integration points:

  1. Initialize MMP SDK before any tracking
  2. Configure SKAdNetwork conversion values in MMP dashboard
  3. Link Apple Search Ads account in MMP for cost data
  4. Use MMP's deeplink handling for attribution

Reports & Analytics

Campaign Report Request

{
  "startTime": "2026-01-01",
  "endTime": "2026-01-31",
  "timeZone": "UTC",
  "granularity": "DAILY",
  "selector": {
    "orderBy": [{"field": "localSpend", "sortOrder": "DESCENDING"}],
    "pagination": {"offset": 0, "limit": 100}
  },
  "returnRowTotals": true,
  "returnGrandTotals": true
}

Key Metrics

MetricDescriptionGood Range
TTRTap-through rate5-10%+
CVRConversion rate (installs/taps)30-60%
CPACost per acquisition< LTV/3
CPTCost per tap$0.50-3.00 (varies)
ROASReturn on ad spend> 100%
Impression Share% of eligible impressions wonTrack trend

Search Term Report

Critical for optimization. Shows actual queries that triggered your ads.

// POST /reports/campaigns/{campaignId}/searchterms
{
  "startTime": "2026-01-01",
  "endTime": "2026-01-31",
  "selector": {
    "conditions": [
      {"field": "impressions", "operator": "GREATER_THAN", "values": ["10"]}
    ],
    "orderBy": [{"field": "impressions", "sortOrder": "DESCENDING"}],
    "pagination": {"offset": 0, "limit": 1000}
  }
}

Weekly ritual:

  1. Pull search term report
  2. High impressions + high CVR → Add as exact keyword
  3. High impressions + low CVR → Add as negative
  4. Irrelevant terms → Negative immediately

Strategy Playbook

Campaign Structure (Recommended)

Campaign: [App] - [Country] - Brand
  └── Ad Group: Brand Exact
      └── Keywords: app name, brand terms (exact match)

Campaign: [App] - [Country] - Category
  └── Ad Group: Category - Exact
      └── Keywords: category terms (exact match)
  └── Ad Group: Category - Discovery
      └── Search Match enabled, low bid

Campaign: [App] - [Country] - Competitor
  └── Ad Group: Competitor Names
      └── Keywords: competitor app names (exact match)

Budget Allocation

StageBrandCategoryCompetitorDiscovery
Launch40%40%10%10%
Growth20%50%20%10%
Scale10%60%25%5%

Multi-Country Expansion

  1. Start: US, UK, Canada, Australia (English)
  2. Expand: Germany, France, Japan, South Korea (localize)
  3. Test: Brazil, Mexico, India (high volume, lower CPT)

Localization checklist:

  • [ ] App Store listing translated
  • [ ] Custom Product Pages per country
  • [ ] Keywords researched per language
  • [ ] Separate campaigns per country (easier optimization)

Custom Product Pages (CPP)

Create variations of your App Store page for different audiences.

// Get available CPPs
// GET /apps/{adamId}/customproductpages

// Create ad using CPP
{
  "name": "Fitness Ad - Summer Campaign",
  "adGroupId": 12345,
  "creativeType": "CUSTOM_PRODUCT_PAGE",
  "productPageId": "cpp-uuid-here"
}

Best practices:

  • Create CPP for each major keyword theme
  • Test: Control (default) vs CPP
  • Rotate seasonally (holidays, events)

Scripts & Automation

See scripts.md for complete script library. Key scripts:

Get Access Token

#!/usr/bin/env bash
set -euo pipefail

# SECURITY MANIFEST:
# Environment variables accessed: ASA_CLIENT_ID, ASA_TEAM_ID, ASA_KEY_ID, ASA_PRIVATE_KEY
# External endpoints called: https://appleid.apple.com/auth/oauth2/token (only)
# Local files read: none
# Local files written: none

# Requires: openssl, jq

CLIENT_ID="${ASA_CLIENT_ID}"
TEAM_ID="${ASA_TEAM_ID}"
KEY_ID="${ASA_KEY_ID}"
PRIVATE_KEY="${ASA_PRIVATE_KEY}"  # PEM format

# Create JWT header
HEADER=$(echo -n '{"alg":"ES256","kid":"'$KEY_ID'"}' | base64 | tr -d '=' | tr '/+' '_-' | tr -d '\
')

# Create JWT payload
NOW=$(date +%s)
EXP=$((NOW + 15552000))  # 180 days
PAYLOAD=$(echo -n '{"sub":"'$CLIENT_ID'","aud":"https://appleid.apple.com","iat":'$NOW',"exp":'$EXP',"iss":"'$TEAM_ID'"}' | base64 | tr -d '=' | tr '/+' '_-' | tr -d '\
')

# Sign with private key
SIGNATURE=$(echo -n "$HEADER.$PAYLOAD" | openssl dgst -sha256 -sign <(echo "$PRIVATE_KEY") | base64 | tr -d '=' | tr '/+' '_-' | tr -d '\
')

CLIENT_SECRET="$HEADER.$PAYLOAD.$SIGNATURE"

# Exchange for access token
curl -s -X POST "https://appleid.apple.com/auth/oauth2/token" \
  -H "Content-Type: application/x-www-form-urlencoded" \
  -d "grant_type=client_credentials&client_id=$CLIENT_ID&client_secret=$CLIENT_SECRET&scope=searchadsorg" \
  | jq -r '.access_token'

Daily Performance Report

#!/usr/bin/env bash
set -euo pipefail

# SECURITY MANIFEST:
# Environment variables accessed: ASA_ACCESS_TOKEN, ASA_ORG_ID
# External endpoints called: https://api.searchads.apple.com/api/v5/reports/campaigns (only)
# Local files read: none
# Local files written: stdout (report data)

ACCESS_TOKEN="${ASA_ACCESS_TOKEN}"
ORG_ID="${ASA_ORG_ID}"

TODAY=$(date -u +%Y-%m-%d)
YESTERDAY=$(date -u -v-1d +%Y-%m-%d 2>/dev/null || date -u -d "yesterday" +%Y-%m-%d)

curl -s -X POST "https://api.searchads.apple.com/api/v5/reports/campaigns" \
  -H "Authorization: Bearer $ACCESS_TOKEN" \
  -H "X-AP-Context: orgId=$ORG_ID" \
  -H "Content-Type: application/json" \
  -d '{
    "startTime": "'$YESTERDAY'",
    "endTime": "'$TODAY'",
    "granularity": "DAILY",
    "selector": {
      "orderBy": [{"field": "localSpend", "sortOrder": "DESCENDING"}]
    },
    "returnRowTotals": true,
    "returnGrandTotals": true
  }' | jq '.data.reportingDataResponse.row[] | {
    campaign: .metadata.campaignName,
    spend: .total.localSpend.amount,
    impressions: .total.impressions,
    taps: .total.taps,
    installs: .total.installs,
    cpa: (if .total.installs > 0 then (.total.localSpend.amount | tonumber) / .total.installs else "N/A" end)
  }'

Core Rules

1. Separate Campaigns by Intent

Brand, category, competitor, and discovery keywords in separate campaigns. Mixing makes optimization impossible.

2. Start Exact, Expand Broad

Begin with exact match keywords you're confident about. Use Search Match and broad only for discovery with low bids.

3. Mine Search Terms Weekly

The search term report is gold. Review weekly, add winners as exact, add losers as negatives.

4. Defend Your Brand

Competitors WILL bid on your brand name. Always have a brand campaign with high bids to protect your real estate.

5. Track Attribution Properly

Implement AdServices for iOS 14.3+. Without attribution, you're optimizing blind.

6. One Country Per Campaign

Mixing countries makes bid optimization nearly impossible. Create separate campaigns per country/region.

7. Budget to CPA, Not Spend

Set CPA goals, not just budgets. If CPA is 2x target, pause and investigate before spending more.

Common Traps

  • Mixing match types in one ad group → Can't tell what's working. Separate exact, broad, search match.
  • No negative keywords → Wasting budget on irrelevant searches. Review search terms weekly.
  • Ignoring Search Tab/Today Tab → Lower intent but cheaper. Good for discovery.
  • Same bid across all keywords → Brand keywords worth more than generic. Bid accordingly.
  • No attribution integration → Flying blind. Implement AdServices or MMP.
  • Launching without App Store optimization → Low conversion rate. Fix ASO first.
  • Bidding on competitors without testing → Often unprofitable. Test small first.
  • Forgetting timezone in reports → Data misalignment. Always use UTC or explicit timezone.
  • Not using Custom Product Pages → Missing easy wins. Create themed pages.
  • Scaling too fast → CPA spikes when scaling. Increase budget 20-30% at a time.

External Endpoints

EndpointData SentPurpose
https://appleid.apple.com/auth/oauth2/tokenClient credentials (JWT)Get access token
https://api.searchads.apple.com/api/v5/*Campaign/keyword dataCampaign management
https://api-adservices.apple.com/api/v1/Attribution tokenAttribution data

No other data is sent externally.

Security & Privacy

Data that leaves your machine:

  • Campaign configurations sent to Apple Ads API
  • Attribution tokens sent to Apple (from iOS app)

Data that stays local:

  • Credentials in ~/apple-search-ads/credentials.md
  • Reports and analysis
  • Strategy notes

This skill does NOT:

  • Store API secrets in plain text (use environment variables)
  • Access user-level data (attribution is aggregated)
  • Make requests to undeclared endpoints

Trust

By using this skill, data is sent to Apple's Search Ads API and AdServices. Only install if you trust Apple with your advertising data.

Related Skills

Install with clawhub install <slug> if user confirms:

  • app-store-connect — manage apps and releases
  • aso — App Store Optimization
  • analytics — track metrics and KPIs
  • ios — iOS development patterns

Feedback

  • If useful: clawhub star apple-search-ads
  • Stay updated: clawhub sync

适合场景

01

OpenClaw 用户查找和安装 Skill 时

02

用户想查找某类 Agent Skill 时

03

需要根据任务场景推荐可安装能力包时

04

需要对比不同来源的安装命令和来源信息时

能力概览

能力 1

按任务关键词查找相关 Skills

能力 2

展示可复制的安装命令

能力 3

保留来源站点、仓库和原始说明,方便继续核验

能力 4

补充不同宿主或平台的使用分布数据

能力 5

展示第三方安全扫描或审计结果

安装后应在对应宿主中按原始 README 的触发条件使用;具体调用方式请以来源页面和 README 为准。

平台分布

OpenClaw

82.77%
按下载量换算4,575

安全审计

VirusTotal

通过

ClawScan

通过

Static analysis

未展示

权限和风险

敏感数据

该 Skill 可能接触密钥、Token、环境变量或敏感配置,应进入高风险复核队列,默认不自动发布。

安装前确认

本站仅展示第三方公开信息,不托管安装包,不提供自动安装或运行环境。安装前应自行审查源码、依赖和命令行为。当前只有一个来源,正式发布前建议补源仓库或其他目录站核验。

来源信息

继续浏览同类 Skills