apple-search-adslisted
Install: claude install-skill josephbedminster/indie-marketing-skills
# Apple Search Ads (Campaign Management API v5)
There is no MCP server: everything goes through the Apple Ads Campaign
Management API v5 (base URL in `scripts/report.py`). Auth is a JWT ES256 signed with the
user's private key, exchanged for a one-hour OAuth token. Endpoints, payloads
and observed behaviours are in `references/api-notes.md` (in this skill's
folder).
## Before anything: the project config
1. Read `.claude/paid-ads-config.md` in the user's project. If it is missing,
run the `paid-ads-setup` skill of this plugin (template in
`../paid-ads-setup/references/config-template.md` relative to this
skill's folder), asking only what the Apple section needs.
2. If `.claude/posthog-funnel-map.md` exists, read its **Business profile**
and **Project conventions**; they override this skill's defaults (report
language, style, where reports go).
3. The script reads `APPLE_ADS_ORG_ID`, `APPLE_ADS_CLIENT_ID`,
`APPLE_ADS_KEY_ID`, `APPLE_ADS_PRIVATE_KEY_PATH` and `APPLE_ADS_TIMEZONE`
(default `ORTZ`, the org's timezone) from the environment, falling back to
the first `.env.local` then `.env` found walking up from the current
directory. Run it from the project root. The private key is the only
secret: never print it, copy it or commit it.
If the user has no API access yet: in Apple Ads, Account settings > API,
they create an API user (role "API Campaign Manager" for read and write,
"API Account Read Only" to only report), generate a key pair locally