From spotify-ads-api
Uploads, lists, retrieves, and archives audio, video, and image assets for Spotify Ads API ad campaigns.
How this skill is triggered — by the user, by Claude, or both
Slash command
/spotify-ads-api:assets upload <file_path> | list [audio|video|image] | get <asset_id> | archive <asset_id>upload <file_path> | list [audio|video|image] | get <asset_id> | archive <asset_id>This skill is limited to the following tools:
The summary Claude sees in its skill listing — used to decide when to auto-load this skill
Upload, list, retrieve, and archive creative assets (audio, video, images) for use in ads.
Upload, list, retrieve, and archive creative assets (audio, video, images) for use in ads.
access_token, ad_account_id, and auto_execute from the active platform settings file:
.codex/spotify-ads-api.local.md, then fall back to .claude/spotify-ads-api.local.md, then .gemini/spotify-ads-api.local.md..claude/spotify-ads-api.local.md, then fall back to .codex/spotify-ads-api.local.md, then .gemini/spotify-ads-api.local.md..gemini/spotify-ads-api.local.md, then fall back to .claude/spotify-ads-api.local.md, then .codex/spotify-ads-api.local.md.https://api-partner.spotify.com/ads/v3/spotify-ads-api:configure on Claude/Codex, /configure on Gemini).version: .codex-plugin/plugin.json on Codex, .claude-plugin/plugin.json on Claude, or gemini-extension.json (extension root) on Gemini.SDK_PRODUCT to codex-plugin on Codex, claude-code-plugin on Claude, or gemini-cli-extension on Gemini. Set SDK_HEADER="X-Spotify-Ads-Sdk: $SDK_PRODUCT/$PLUGIN_VERSION" and include -H "$SDK_HEADER" on all API requests.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.
curl -s -w "\nHTTP_STATUS:%{http_code}" -X POST -H "Authorization: Bearer $TOKEN" \
-H "$SDK_HEADER" \
-H "Content-Type: application/json" \
-d '{"asset_type":"AUDIO","name":"my-creative"}' \
"$BASE_URL/ad_accounts/$AD_ACCOUNT_ID/assets"
Extract id from the response.
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" \
-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 "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" \
-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 "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.
curl -s -w "\nHTTP_STATUS:%{http_code}" -H "Authorization: Bearer $TOKEN" \
-H "$SDK_HEADER" \
"$BASE_URL/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.
curl -s -w "\nHTTP_STATUS:%{http_code}" -H "Authorization: Bearer $TOKEN" \
-H "$SDK_HEADER" \
"$BASE_URL/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.
curl -s -w "\nHTTP_STATUS:%{http_code}" -H "Authorization: Bearer $TOKEN" \
-H "$SDK_HEADER" \
"$BASE_URL/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.
curl -s -w "\nHTTP_STATUS:%{http_code}" -X PATCH -H "Authorization: Bearer $TOKEN" \
-H "$SDK_HEADER" \
-H "Content-Type: application/json" \
-d '{"action":"ARCHIVE","ids":["<asset_id>"]}' \
"$BASE_URL/ad_accounts/$AD_ACCOUNT_ID/assets"
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.npx claudepluginhub spotify/ads-agentic-tools --plugin spotify-ads-apiProvides the Spotify Ads API v3 reference: endpoints for campaigns, ad sets, ads, assets, audiences, and reports. Useful for managing Spotify ad accounts, creating campaigns, uploading assets, targeting audiences, and pulling reports.
Executes AdCP Creative Protocol operations: builds creatives from briefs or existing assets, previews renderings, and discovers format specifications.
Uploads promo videos and album content to Cloudflare R2 or AWS S3. Works after promo-director, before release-director. Manually invoked via /cloud-uploader.