Ads Uploader CLI

for Meta ads

Bulk-Launch Meta Ads From Your Terminal or AI Agent

The Ads Uploader CLI lets you, or an AI agent like Claude Code or Codex, bulk-launch Meta ads from the terminal across every ad account you manage. Point it at an ad you already run and the new batch copies its settings, audience and placements, in whatever campaign and ad set structure you need. Each launch is a spec you preview before anything is created. It works alongside Meta's official CLI: Meta's creates one object per command, ours runs the whole launch.

View on GitHub
Terminal-First Workflow

Browse, upload, preview, and launch from the command line

Built for AI Agents

Hand it to Claude Code, Cursor, or Codex with a single skill file

Same Backend as the Web App

Your presets, accounts, and Meta API connection carry over

Install Once, Authenticate Once

Install globally with npm, run ads login to authenticate through your browser, and pick a default ad account. Your existing Ads Uploader account and Facebook connection do all the heavy lifting.

  • One npm install. Works anywhere Node 18+ runs.
  • Log in and authenticate in your browser
  • No environment variables to store, no tokens to securely share with teammates
  • Set a default with ads account act_xxx, or pass --account on each launch to work across client accounts
~/projects
Live Demo
$

Browse Your Account Without Leaving the Shell

The same campaign, ad set, and ad picker you use in the web app, but as commands. Find the ad you want to copy settings from, confirm a preset ID, or scan ad performance without opening Ads Manager.

  • ads campaigns lists active campaigns in your default account
  • Drill in with ads campaign, ads adset, and ads ad
  • Shows headlines, body copy, CTA, destination URL, and parent ad set
  • Copy any ad ID straight into a copyFromAd spec field
Browse Account
Live Demo
$

Upload Folders, Not Files One by One

Point the CLI at a folder of creatives and the entire batch goes straight to Meta's media library. Variant grouping by filename suffix works exactly like it does in the web app.

  • ads upload ./my-creatives uploads an entire directory
  • 1:1, 4:5, 9:16, and 16:9 variants auto-grouped by filename
  • Returns a batch ID you reference in your spec file
  • Works with mounted Google Drive, Dropbox, and OneDrive folders
~/projects
Live Demo
$

One Spec File. Reusable. Diffable.

Instead of clicking through configuration screens, you describe the launch in a JSON spec file. Reference a saved preset or copy from any existing ad, then layer in headlines, primary text, naming patterns, and overrides.

  • Reference a saved preset by ID, the same one you built in the web app
  • Or copyFromAd to mirror an existing ad's full configuration
  • Override text, URLs, naming patterns, and creative enhancements
  • Save it to git, diff it next week, hand it to a teammate
launch-spec.json
Live Demo
1
Reusable. Reviewable. Diffable.

Preview Before You Spend

Start every launch with a dry run. ads create:preview shows exactly what would be created - campaign, ad sets, ads, budgets, status - without creating anything in Meta. Catch config mistakes before they cost you anything.

  • Dry-run output matches what the live run will create
  • Validates your spec against the same engine the web app uses
  • Surfaces missing fields, bad references, or invalid combinations
  • Nothing is created in Meta, so nothing spends
Preview · Dry Run
No live changes
$

Watch Ads Go Live in Real Time

ads create runs the launch as a background job and streams progress back to your terminal. The same execution pipeline that powers the web app - rate limiting, retries, validation, and creative variations all handled.

  • One command publishes the entire batch to Meta
  • Live progress for every ad set and ad as it's created
  • Resume with ads jobs JOB_ID --follow if you disconnect
  • Launch active by default, or use --status PAUSED for a safety net
ads create · live job
Live Demo
Ready...
--:--:--→Initializing...

Hand the Whole Workflow to an AI Agent

The CLI ships with a skill file you drop into Claude Code, Cursor, or any agent that can run shell commands. The agent reads creatives, writes copy, builds the spec, previews, and launches - you stay in the loop on the command line.

  • Copy SKILL.md into .claude/skills/ads and the /ads skill appears
  • Each command is single-purpose, so the agent stays deterministic
  • Spec files give the agent a reviewable plan before any spend
  • Pairs with the Ads Uploader MCP when you'd rather chat alongside the web app
ClaudeClaude Code · /ads
Live Demo

Web, MCP, and CLI. One Circuit.

The terminal never boxes you in. Saved builds carry a launch between surfaces: start one in the web app, patch it from a chat with Claude or ChatGPT over the Ads Uploader MCP, then finish it here with one command. The same build reference opens everywhere.

  • Saved builds and presets are shared across every surface
  • Fork a build for a variant without touching the original
  • Prefer chatting alongside the web app? That's the Ads Uploader MCP
  • Start anywhere, finish anywhere, nothing is locked in
One build, three surfaces
Live Demo
Web AppBuild started
Claude / ChatGPT·
CLI·
build_7fa2c9

Upload media, apply a preset, start the build

Same build reference on every surface. Nothing is locked in.

Meta's Official CLI vs. Ads Uploader CLI

On April 29, 2026, Meta released meta-ads, a free official command-line wrapper for the Marketing API. It creates one object per command and has no batch command, so bulk launches mean shell loops. The Ads Uploader CLI complements it: Meta's for reporting and one-off edits, ours for bulk launches across your ad accounts. Our Meta Ads CLI guide covers Meta's tool in full.

5 Portal Steps · 7 Scopes · Token in .env
Meta CLI
Manual setup in Meta Business Suite
1. Create a custom Meta app
2. Create a system user
3. Assign your assets to the user
4. Add the user as App Admin
5. Generate an access token (7 scopes)
Then in your terminal
$pip install meta-ads
$uv sync
$echo "ACCESS_TOKEN=..." > .env
$echo "AD_ACCOUNT_ID=..." >> .env
$meta auth status
✓ Authenticated
1 Browser Login · 0 Tokens to Share
Ads Uploader CLI
In your terminal
$npm install -g @adsuploader/cli
✓ ads command installed globally
$ads login
→ Opening browser for authentication...
✓ Authenticated as you@yourcompany.com
$ads account act_123456789012345
✓ Default account set
You're ready. Launch your first batch:
$ads upload ./creatives
$ads create my-launch.json
✓ 47 ads live in 3 minutes

Authentication Workflow

Theirs
  • •Build a custom Meta app
  • •Provision a system user
  • •Assign your assets
  • •Generate a 7-scope access token
  • •Paste the token into .env
  • •Share securely with teammates
Ours
  • Run ads login
  • Authenticate in your browser
  • Each teammate logs in themselves

Edge Case Logic

Theirs
  • •Format quirks left to you to handle
  • •No aspect-ratio variation grouping
  • •Raw API toggles for creative enhancements
  • •Edge cases surface in production
  • •No documented retry or pacing layer
Ours
  • All ad formats natively supported
  • Aspect-ratio variations auto-grouped
  • Per-objective creative-enhancement control
  • Production-tested at scale
  • Retries and readable errors built in

Inherited Ad Configurations

Theirs
  • •Define every campaign field
  • •Define every ad set field
  • •Define every creative field
  • •Re-specify every launch from scratch
Ours
  • Reference any existing ad
  • Inherit targeting and placements
  • Inherit catalogs and pixels
  • Override only what's changed

Launching ads is all we do. We've designed our tooling to be the best at it, shaped by millions of dollars in ad spend on our own brands and businesses.

Chris Pollard

Chris Pollard Founder of Ads Uploader

Different ways to interface with Meta's API are exciting, but the API's edge cases still bite. Format coverage, retry logic, valid configs, inheritance from existing ads - we've spent years encoding all of it into the Ads Uploader workflow. Marketers launch ads faster with us than they would stitching API calls themselves.

A CLI is the right interface for an AI agent the same way a visual UI is for clicks. Same marketers, different contexts - that's why I built ours. Meta releasing their own is welcome validation.

Same Ads Uploader Workflow. Now Driven By You and Your Agent.

One spec file, one command, ads in your account.

Start 7-Day Free Trial

Free 7-day trial

No credit card required

Cancel anytime