Meta Ads CLI video ad: upload an AI-generated MP4

Meta's Ads CLI makes a video ad from a local file with meta ads creative create --video. Download the Sume clip first, then upload; ads start paused.

5 min readSume
All posts

With Meta's Ads CLI, a video ad creative is one command: meta ads creative create --name "Video Promo" --page-id <PAGE_ID> --video ./promo.mp4 --link-url https://example.com/new. The --video flag takes a local file, so a clip generated with Sume has to be downloaded to disk first. The CLI uploads the media file itself when it creates the creative.

The CLI facts are from Meta's Ad Creatives, Get Started and launch post pages, read 2026-09-29. Sume has no Meta connector; the download step follows Sume's Video generation docs.

What do I need to install the Ads CLI?

Meta's Get Started page lists Python 3.12 or later, a virtual environment, pip and uv, and a Meta system user access token. The package is meta-ads on PyPI, installed with pip install meta-ads, then uv sync. Authentication is a system user token with these scopes: business_management, ads_management, pages_show_list, pages_read_engagement, pages_manage_ads, catalog_management and read_insights. meta auth status checks it.

How do I get the Sume clip into a file?

Sume's video docs download a finished job from the content endpoint with your API key. In current code that endpoint answers with a redirect to the file, so add -L to curl. Ask for 9:16 when you generate if the ad is for a vertical placement; ratios per model are in Vertical 9:16 video generation.

curl -L "https://api.sume.com/v1/videos/job_123/content?index=0" \
  -H "Authorization: Bearer $SUME_API_KEY" \
  --output promo.mp4

meta ads creative create --name "Video Promo" \
  --page-id <PAGE_ID> \
  --video ./promo.mp4 \
  --body "Watch our new collection" \
  --title "New Arrivals" \
  --link-url https://example.com/new

What does the CLI decide from my flags?

  • Every creative requires --page-id, the Facebook Business Page acting as the ad's identity. meta ads page list finds it.
  • Video formats Meta lists: .mp4, .mov, .avi, .mkv, .wmv.
  • For Instagram placements add --instagram-actor-id.
  • Nothing goes live on its own: Meta's launch post says resources are created in PAUSED status by default, and you activate with meta ads ad update <AD_ID> --status ACTIVE.
From Meta's Ad Creatives page, read 2026-09-29.
Flags you passCreative type
--videoVideo ad
--link-url, no videoLink ad
NeitherPhoto post on the Page

What should I check before I activate the ad?

Run meta auth status before the first command, so an expired system user token fails early instead of halfway through an upload. After the creative exists, remember that Meta's launch post says resources are created in PAUSED status by default. The activation command, meta ads ad update <AD_ID> --status ACTIVE, is the step that lets an ad deliver.

Keep the downloaded promo.mp4 next to the command you ran. The Sume download link needs your API key, so it cannot be shared as a public link, and a local copy is the file you can re-upload if you have to create the creative again.

Does Meta accept any MP4 for every placement?

The CLI page lists file extensions, not placement specs such as ratio, length or safe zones. Check those against the placement you buy; Meta video ad specs and Reels safe zones has Meta's numbers. To upload through the Marketing API instead of the CLI, see Meta ads bulk upload for AI videos.

Sources

Related posts

More in Integrations

All Integrations posts

Written by Sume