用 Codex 或 Claude 帮你安装 复制这段 Prompt,粘贴到 Codex、Claude 或其他助手里,让它检查 Skill 页面并帮你完成安装。
直接命令不会经过审查 Prompt;运行前请先检查来源。
npx skills add https://github.com/spotify/ads-agentic-tools --skill assets命令会保持在同一行。复制前请横向滚动并检查完整内容。
想先保存到本地?可下载 SkillsMP 当前能够提供的文件。
正在显示 SKILL.md
| name | assets |
| description | Upload, list, and manage Spotify Ads API creative assets — audio, video, and images for ad campaigns. |
| argument-hint | upload <file_path> | list [audio|video|image] | get <asset_id> | archive <asset_id> |
| allowed-tools | ["Read","Bash","AskUserQuestion"] |
Upload, list, retrieve, and archive creative assets (audio, video, images) for use in ads.
Set the plugin root and define the request wrapper:
PLUGIN_ROOT="${CODEX_PLUGIN_ROOT:-${CLAUDE_PLUGIN_ROOT:-.}}"
api() { "$PLUGIN_ROOT/scripts/api-request.sh" assets "$@"; }
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.
The argument format is: <operation> [arg]
upload <file_path> — Upload a new assetlist [audio|video|image] — List assets, optionally filtered by typeget <asset_id> — Get details of a specific assetarchive <asset_id> — Archive an assetunarchive <asset_id> — Unarchive an assetupload <file_path>Two-step process following the API's required flow.
| Extensions | Asset Type |
|---|---|
.mp3, .wav, .ogg | AUDIO |
.mp4, .mov | VIDEO |
.png, .jpg, .jpeg | IMAGE |
If the extension doesn't match any of these, ask the user to specify the asset type.
Use AskUserQuestion to ask for the asset name (2-120 characters). Default to the filename without extension.
api POST "ad_accounts/{ad_account_id}/assets" \
'{"asset_type":"AUDIO","name":"my-creative"}'
Extract id from the response.
File uploads use raw curl (not the
apiwrapper) because they use multipart form data. Runeval $(api --env)before upload calls to setTOKEN,AD_ACCOUNT_ID,SDK_HEADER, andBASE_URL, and setSKILL_HEADER="X-Spotify-Ads-Skill: assets".
First, check the file size:
stat -f%z "/path/to/file" # macOS
# or: stat --printf="%s" "/path/to/file" # Linux
If file is <= 20MB — Simple upload:
curl -s -X POST -H "Authorization: Bearer $TOKEN" \
-H "$SDK_HEADER" \
-H "$SKILL_HEADER" \
-F "media=@/path/to/file" \
-F "asset_type=AUDIO" \
"$BASE_URL/ad_accounts/$AD_ACCOUNT_ID/assets/$ASSET_ID/upload"
If file is > 20MB — Chunked upload:
curl -s -X POST -H "Authorization: Bearer $TOKEN" \
-H "$SDK_HEADER" \
-H "$SKILL_HEADER" \
-H "Content-Type: application/json" \
"$BASE_URL/ad_accounts/$AD_ACCOUNT_ID/assets/$ASSET_ID/chunked_upload/start"
Extract upload_session_id and max_chunk_size_mb from the response.
split -b ${MAX_CHUNK_SIZE_MB}m /path/to/file /tmp/chunk_
curl -s -X POST -H "Authorization: Bearer $TOKEN" \
-H "$SDK_HEADER" \
-H "$SKILL_HEADER" \
-F "media=@/tmp/chunk_aa" \
-F "upload_section=1" \
"$BASE_URL/ad_accounts/$AD_ACCOUNT_ID/assets/$ASSET_ID/chunked_upload/transfer"
curl -s -X POST -H "Authorization: Bearer $TOKEN" \
-H "$SDK_HEADER" \
-H "$SKILL_HEADER" \
-H "Content-Type: application/json" \
-d '{"upload_session_id":"<session_id>","number_of_sections":<total_chunks>}' \
"$BASE_URL/ad_accounts/$AD_ACCOUNT_ID/assets/$ASSET_ID/chunked_upload/complete"
rm /tmp/chunk_*
After upload, poll GET /assets/{id} until status changes from PROCESSING to READY or REJECTED. Poll every 3 seconds, max 60 seconds.
api GET "ad_accounts/{ad_account_id}/assets/$ASSET_ID"
Check the status field in the response. If still PROCESSING, wait 3 seconds and retry.
Show the final asset details:
If the asset was REJECTED, explain that the file may not meet format requirements and suggest checking the supported formats section below.
list [audio|video|image]List assets in the account, optionally filtered by type.
api GET "ad_accounts/{ad_account_id}/assets?asset_types=AUDIO&limit=50&sort_direction=DESC"
If no type filter is provided, omit the asset_types parameter to list all assets.
Format as table:
| ID | Name | Type | Status | Duration/Dimensions | Created |
|---|
If continuation_token is present in the response, note that more assets exist.
get <asset_id>Get full details of a specific asset.
api GET "ad_accounts/{ad_account_id}/assets/$ASSET_ID"
Display all fields in readable format:
archive <asset_id> / unarchive <asset_id>Archive or unarchive an asset using the bulk action endpoint.
api PATCH "ad_accounts/{ad_account_id}/assets" \
'{"action":"ARCHIVE","ids":["<asset_id>"]}'
For unarchive, use "action":"UNARCHIVE".
Confirm the action completed by displaying the updated asset status.
| Type | Formats | Recommendations |
|---|---|---|
| Audio | MP3, WAV, OGG | 128kbps+, 44.1kHz+ sample rate |
| Video | MP4, MOV | Aspect ratios: 16:9, 1.91:1, 1:1, 9:16 |
| Image | PNG, JPEG | — |
auto_execute is true, execute each API call directly.auto_execute is false, present the curl command and ask for confirmation before executing.