Publish finished creatives as live Meta (Facebook/Instagram) ads via the Meta Marketing API, plus research and ad-copy support. Uploads an image or video, builds a multi-variant TEXT_LIQUIDITY creative, and creates a PAUSED ad in an existing ad set. Also pulls top-performing ads (ranked by ROAS) and competitor ads from the Ad Library to inform copy. Use when the user asks to deploy / publish / launch a creative as a Meta or Facebook ad, build a Meta ad, push a video or image into an ad set, pull their top ads, or research competitor ads. Not for generating creative (use the image/video skills) and not for writing AdTable/Airtable rows (use adtable-light).
76
96%
Does it follow best practices?
Run evals on this skill
Adds up to 20 points to the overall score
View guide
Low
Low-risk findings worth noting
Turn a finished creative — typically the output of a generative-AI skill in this workspace — into a live Meta ad. The skill covers three phases: research (optional) → copy → deploy. It talks to the Meta Marketing API directly via ported, parameterized Python scripts.
Trigger on phrases like:
Do not use this skill to generate creative — that's pixar-style-ad,
claymation-ad, generate-youtube-thumbnail, uni1-image-ad, etc. Do not use
it to write AdTable/Airtable rows — that's adtable-light. This skill is the
direct Meta Marketing API deployment step.
--copy-file JSON shape..env — see your repo's .env.example):
META_ACCESS_TOKEN (required) — long-lived token with ads_management scopeMETA_AD_ACCOUNT_ID (required) — with or without the act_ prefixMETA_PAGE_ID, META_IG_USER_ID, META_PIXEL_ID (optional defaults for deploy)META_API_VERSION (optional, default v23.0)python3 -m pip install -r scripts/requirements.txtRun bash scripts/check-meta-env.sh to verify credentials before anything else.
# Rank the account's ads and pull the winning copy
python scripts/pull-top-ads.py --date-preset last_30d --min-spend 100 --limit 15
# Pull a competitor's ads from the Ad Library
python scripts/pull-competitor-ads.py --pages "BrandName" --limit 50Both write JSON under OUTPUT_BASE (or ./outputs/meta-ads/). Read the top-ad
copy fields to identify winning hook/proof/CTA patterns before writing new copy.
Write a copy.json following copy-guide.md:
5 bodies (one per framework angle), 5 titles, 3 descriptions. If Phase 1 ran,
mirror the voice and patterns of the winners — new creative + proven copy DNA.
Save copy.json somewhere under outputs/ so it isn't committed.
Always dry-run first — it prints the full creative payload, makes no API calls:
python scripts/deploy-ad.py --dry-run \
--adset-id <AD_SET_ID> --copy-file copy.json --link <DESTINATION_URL> \
--image path/to/creative.pngReview the payload with the user, then deploy for real:
python scripts/deploy-ad.py \
--adset-id <AD_SET_ID> --copy-file copy.json --link <DESTINATION_URL> \
--video clip-a.mp4 --video clip-b.mp4 --cta SIGN_UP --pixel-id <PIXEL_ID>--image / --video are repeatable — each becomes its own ad in the ad set.deployment_results.json under OUTPUT_BASE.| User intent | Phases |
|---|---|
| "Deploy this creative to Meta" + copy provided | Phase 3 only |
| "Build a Meta ad, write the copy too" | Phase 2 → 3 |
| "Make ads modeled on my winners" | Phase 1 → 2 → 3 |
| "What are my best ads / competitor research" | Phase 1 only |
--active override or un-pause ads without
an explicit user instruction. Confirm the user knows the ads are paused.deploy-ad.py run as something to confirm, not assume.deploy-ad.py polls the uploaded video until
Meta finishes processing before creating the ad — a video deploy can take a
few minutes. See deploy-patterns.md.OAuthException (code 2). Retried automatically with backoff.act_ prefix is added automatically if missing from META_AD_ACCOUNT_ID.outputs/ (gitignored): ad IDs, pulled spend/revenue, competitor data.The Meta Marketing API itself is free to call. Ad spend is real money — but because every ad deploys PAUSED, nothing spends until the user un-pauses it in Ads Manager. There are no per-call credits to estimate.
0bfafb2
If you maintain this skill, you can claim it as your own. Once claimed, you can manage eval scenarios, bundle related skills, attach documentation or rules, and ensure cross-agent compatibility.