用 Codex 或 Claude 帮你安装 复制这段 Prompt,粘贴到 Codex、Claude 或其他助手里,让它检查 Skill 页面并帮你完成安装。
直接命令不会经过审查 Prompt;运行前请先检查来源。
npx skills add https://github.com/spotify/ads-agentic-tools --skill report命令会保持在同一行。复制前请横向滚动并检查完整内容。
想先保存到本地?可下载 SkillsMP 当前能够提供的文件。
Administer Spotify Ads API businesses and ad accounts: discover businesses and accounts, inspect or update supported profile and billing fields, create businesses or ad accounts, list members and roles, invite users, assign ad-account access, update roles, cancel invitations, and remove access. Use when a user asks to find an ad account by ID, audit access, onboard an agency or teammate, manage business/ad-account membership, or update supported account identity details.
List or get Spotify Ads API ad sets and ads, and stage their creation or updates through drafts by default. Use direct live writes only when explicitly requested.
This skill should be used when the user asks to "call the Spotify Ads API", "create a Spotify ad campaign", "manage Spotify ads", "pull Spotify ad reports", "set up ad sets or ads", "upload ad assets", "target audiences on Spotify", "check campaign status", "get ad account info", "look up API schema or fields", "check what targeting options exist", or asks about Spotify advertising endpoints, request/response formats, enum values, or authentication.
正在显示 SKILL.md
| name | report |
| description | Pull Spotify Ads API reporting data — aggregate metrics, audience insights, or async CSV reports. |
| argument-hint | aggregate | insights | async-create | async-status <report_id> |
| allowed-tools | ["Read","Bash","AskUserQuestion"] |
Pull reporting data from the Spotify Ads API. Read settings from the active platform settings file.
Set the plugin root and define the request wrapper:
PLUGIN_ROOT="${CODEX_PLUGIN_ROOT:-${CLAUDE_PLUGIN_ROOT:-.}}"
api() { "$PLUGIN_ROOT/scripts/api-request.sh" report "$@"; }
Before the first Ads API v3 call, read and follow $PLUGIN_ROOT/skills/api-reference/references/live-openapi.md.
To retrieve settings values (TOKEN, AD_ACCOUNT_ID, AUTO_EXECUTE, BASE_URL) for use outside API calls, run api --env.
aggregate (default if no argument)Get aggregated campaign metrics.
Prompt for:
CAMPAIGN, AD_SET, AD, or AD_ACCOUNTfields, NOT report_fields.
Suggested: IMPRESSIONS, SPEND, CLICKS, REACH, FREQUENCY, COMPLETES
Full list: IMPRESSIONS, SPEND, CLICKS, REACH, FREQUENCY, LISTENERS, NEW_LISTENERS,
STREAMS, COMPLETES, COMPLETION_RATE, STARTS, FIRST_QUARTILES, MIDPOINTS, THIRD_QUARTILES,
VIDEO_VIEWS, CTR, OFF_SPOTIFY_IMPRESSIONSImportant: Array query parameters must use repeated parameter names, NOT comma-separated. Validation guardrails:
limit must be 1-50.entity_type must be exactly CAMPAIGN, AD_SET, AD, or AD_ACCOUNT.entity_ids is present, always include entity_ids_type.statuses is present, always include entity_status_type; it must match the status owner.segments, dimensions, groupBy, or async-report metrics names on aggregate reports.report_start or report_end when granularity=LIFETIME; use DAY for date-ranged reporting.DAY, use UTC midnight timestamps for both start and end, e.g. 2026-05-01T00:00:00Z.PAGE_VIEWS, LEADS, ADD_TO_CART, PURCHASES, REVENUE, RETURN_ON_AD_SPEND, AVERAGE_ORDER_VALUE, START_CHECKOUT, and SIGN_UPS.api GET "ad_accounts/{ad_account_id}/aggregate_reports?\
entity_type=CAMPAIGN&\
fields=IMPRESSIONS&fields=SPEND&fields=CLICKS&fields=REACH&fields=FREQUENCY&\
granularity=LIFETIME&\
limit=50"
Granularity constraints:
LIFETIME: do not send report_start or report_endDAY: date range must be within 90 days and both timestamps must be UTC midnightHOUR: date range must be within the last 2 weeksFormat the response as a readable table with stats broken out per entity. Filter out rows with zero impressions for cleaner output.
totalsGet deduplicated metrics aggregated across multiple campaigns, ad sets, or ads. Reach and frequency are deduplicated across all specified entities.
Prompt for:
CAMPAIGN, AD_SET, or AD (AD_ACCOUNT not supported here; use aggregate instead)LIFETIME or DAY (HOUR not supported for totals)IMPRESSIONS, CLICKS, CTR, REACH, FREQUENCYapi GET "ad_accounts/{ad_account_id}/aggregate_reports/totals?\
entity_type=AD_SET&\
entity_ids=$ID1&entity_ids=$ID2&\
granularity=LIFETIME&\
fields=IMPRESSIONS&fields=REACH&fields=FREQUENCY"
Format the response showing aggregated stats per time period (one row for LIFETIME, one row per day for DAY).
insightsGet audience insight breakdowns.
Prompt for:
ACT_AND_SET, AGE, AUDIENCE, CITY, COUNTRY, FORMAT,
GENDER, GENRE, INTERESTS, METRO, PLACEMENT, PLATFORM,
PODCAST_EPISODE_TOPIC, REGION, or TONEfields params. Insight reports do not allow
E_CPCL, FREQUENCY, OFF_SPOTIFY_IMPRESSIONS, PAID_LISTENS_FREQUENCY,
SKIPS, SPEND, STARTS, or UNMUTES.entity_ids is set; use AD_SET or CAMPAIGNentity_ids_type)Insight report guardrails:
entity_ids value at a time — either an ad set ID or a campaign ID.entity_ids_type matching the entity: AD_SET for ad set IDs, CAMPAIGN for campaign IDs.entity_type on insight reports; entity_type=AD_SET does not substitute for entity_ids_type=AD_SET.report_start, report_end, granularity, or limit; insight reports are LIFETIME only.insight_dimension values. Do not use LOCATION, GEO, DMA, STATE, ZIP, POSTAL, POSTAL_CODE, MARKET, DEVICE, OS, ARTIST, AGE_RANGE, or CITY_NAME.COUNTRY, region/state -> REGION, metro/DMA -> METRO, city -> CITY.api GET "ad_accounts/{ad_account_id}/insight_reports?\
insight_dimension=GENDER&\
fields=IMPRESSIONS&fields=CLICKS&fields=CTR&\
entity_ids=$ENTITY_IDS&\
entity_ids_type=AD_SET"
Format results showing the breakdown by the selected dimension.
Handling 422 — Insufficient Data: Insight data becomes available only after an ad has delivered enough activity to meet reporting thresholds. If the API returns HTTP 422 with one of these error codes, the entity does not yet have enough data:
ILLEGAL.INSIGHT_REPORT.INSUFFICIENT_IMPRESSIONSILLEGAL.INSIGHT_REPORT.INSUFFICIENT_REACHILLEGAL.INSIGHT_REPORT.INSUFFICIENT_LISTENERSWhen this happens:
async-createCreate an async CSV report for download.
Prompt for:
ACT_AND_SET, AGE, AUDIENCE, CITY, COUNTRY, FORMAT, GENDER, GENRE, INTERESTS, METRO, PLACEMENT, PLATFORM, PODCAST_EPISODE_TOPIC, REGION, or TONE. Only supported with LIFETIME granularity.Async report guardrails:
dimensions are entity metadata columns only. Do not put CITY, COUNTRY, REGION, DMA, POSTAL_CODE, LOCATION, AGE, GENDER, PLATFORM, DEVICE, or OS in dimensions; use insight_dimension with granularity=LIFETIME for async CSV delivery insight breakdowns, or insight_reports for direct JSON insight results.dimensions and metrics, not groupBy, fields, dateRange, or entityType.granularity=DAY, include report_start; use UTC midnight timestamps for date boundaries.api POST "ad_accounts/{ad_account_id}/async_reports" \
'{
"name": "...",
"granularity": "DAY",
"dimensions": ["CAMPAIGN_NAME", "AD_SET_NAME"],
"metrics": ["IMPRESSIONS_ON_SPOTIFY", "SPEND", "CLICKS"],
"report_start": "2025-01-01T00:00:00Z",
"report_end": "2025-01-31T00:00:00Z"
}'
After creating, show the report ID and suggest checking status with async-status.
async-status <report_id>Check the status of an async report and get the download URL when ready.
api GET "ad_accounts/{ad_account_id}/async_reports/$REPORT_ID"
If complete, display the download URL. If still processing, report the status and suggest checking again later. If the status is FAILED, inform the user that report generation failed and suggest retrying by creating a new async report with async-create.
auto_execute is true, execute directly.auto_execute is false, present the curl command and ask for confirmation.