Production-grade Python CLI for managing Meta ads with the official Meta Python Business SDK.
- Validate Meta auth and account access
- List campaigns, ad sets, ads
- Fetch ad insights/performance metrics
- Upload image/video assets
- Create ad sets and ads from YAML or flags
- Pause/resume campaigns, ad sets, ads
- Python 3.12+
- A Meta app with Marketing API access
- Meta ad account access with required permissions
- Valid Meta access token
Full setup/configuration guide:
- macOS: Homebrew
- Ubuntu/Debian/other Linux distros: pipx
Tap repository URL:
https://github.com/stuntcoders/homebrew-meta-ads-cli
Install:
brew tap stuntcoders/meta-ads-cli
brew install stuntcoders/meta-ads-cli/meta-ads-cliVerify:
meta-cli --helpUpgrade:
brew update
brew upgrade meta-ads-cliIf pipx is not installed:
python3 -m pip install --user pipx
python3 -m pipx ensurepathInstall latest from repository:
pipx install "git+https://github.com/stuntcoders/meta_ads_cli.git"Install a pinned release tag:
pipx install "git+https://github.com/stuntcoders/meta_ads_cli.git@v0.1.0"Verify:
meta-cli --helpUpgrade later:
pipx upgrade meta-ads-cliRepository URL:
https://github.com/stuntcoders/meta_ads_cli
Install from source:
git clone https://github.com/stuntcoders/meta_ads_cli.git
cd meta_ads_cli
python3 -m pip install .Dev editable install:
python3 -m pip install -e ".[dev]"See full configuration details in:
meta-cli auth test
meta-cli auth test --jsonmeta-cli campaigns list
meta-cli adsets list --campaign-id <campaign_id>
meta-cli ads list --adset-id <adset_id>
meta-cli ads list --allmeta-cli insights ads --all --date-preset last_7d
meta-cli insights ads --adset-id <id> --since 2026-03-01 --until 2026-03-21
meta-cli insights ads --all --output-file exports/insights.csv --output-format csvmeta-cli media upload-image ./creative.jpg
meta-cli media upload-video ./creative.mp4meta-cli adsets create --config examples/adset.yaml
meta-cli ads create --config examples/ad.yamlmeta-cli campaigns pause <campaign_id>
meta-cli campaigns resume <campaign_id>
meta-cli adsets pause <adset_id>
meta-cli adsets resume <adset_id>
meta-cli ads pause <ad_id>
meta-cli ads resume <ad_id>examples/adset.yamlexamples/ad.yaml
Use returned media IDs in ad config:
- image upload →
image_hashes - video upload →
video_id
- New ad sets/ads default to
PAUSED - Use
--dry-runbefore real create/update operations - Pause/resume requires confirmation unless
--yesis passed - Validate auth (
meta-cli auth test) before operations
Check:
- token validity
- account permissions
- app id/secret correctness
- account ID format
Meta may reject combinations of objective, optimization goal, billing event, targeting, or creative fields. The CLI surfaces API errors directly.
Ensure:
- tap repo is added:
brew tap stuntcoders/meta-ads-cli - install command uses full formula reference:
brew install stuntcoders/meta-ads-cli/meta-ads-cli - formula exists in tap repo at
Formula/meta-ads-cli.rb - your tap formula is up to date (newer generated formulas include
rustas a build dependency forpydantic-core)
Ensure:
pipxis installed and path is initialized (python3 -m pipx ensurepath)- you use the full Git URL:
git+https://github.com/stuntcoders/meta_ads_cli.git
make lint
make testProject layout:
src/meta_cli/— app, commands, sdk, schemastests/— mocked unit tests + optional integration testsexamples/— YAML examplesdocs/meta-setup-and-configuration.md— Meta setup + credential configuration guidescripts/— build/release helpers.github/workflows/— release + Homebrew automationAGENTS.md— coding-agent operating instructions
For production workflows, create in PAUSED, verify in Ads Manager, then explicitly resume.