Meta Marketing API · self-hosted

Your Meta ads, never silently dark.

Meta disapproves an ad and your campaign quietly stops delivering — you lose reach while you sleep. ads-monitor watches every ad account around the clock, catches disapproved and issue-flagged ads the moment they appear, and stands up a clean active replacement automatically.

ads-monitor · live cycle · act_1911997329496820
[cycle] scanning ads via graph.facebook.com/v23.0 …
[scan] 68 ads · 63 active · 2 disapproved · 3 pending_review
[detect] ad 120247…4450601 effective_status=DISAPPROVED
[act] POST /120247…4450601/copies status_option=ACTIVE
[ok] created replacement 120247…8720601 → renamed "ad7"
[clean] DELETE original disapproved ad ✓
[done] queue clear · 0 problem ads · campaign status untouched

The problem

A rejected ad is a leak you don’t see.

Ad review never sleeps, but you do. When Meta flags a creative as DISAPPROVED or WITH_ISSUES, delivery stops immediately — often in the middle of the night, in the middle of a launch. By morning you’ve lost hours of reach and spend momentum, and someone has to notice, rebuild the ad, and rename it by hand.

180s
Scan interval — problems are caught within one short cycle, not the next morning.
24/7
Runs as a background service with automatic restart. No dashboards to babysit.
0×
Campaign budgets and on/off state changed by the tool. Ever.

How it works

Detect, rebuild, clean up — on repeat.

Every cycle runs the same safe, deterministic loop directly against the official Meta Marketing API.

1

Watch

Reads ads and campaigns for each account and flags any ad whose effective status is DISAPPROVED or WITH_ISSUES.

2

Rebuild

Duplicates the flagged ad into the same ad set as a fresh active copy via the native /copies edge — reusing the original creative.

3

Rename

Gives every replacement a short, sequential name — ad1, ad2, ad3 — kept stable across generations.

4

Clean up

Only after the replacement is confirmed active does it remove the old disapproved ad. Failures retry automatically next cycle.

Features

Built to run unattended.

api

Direct Marketing API

Talks straight to Meta Graph API v23.0 with your own system-user token — no third-party middleman, no per-account rental limits.

×N

Multi-account

Each ad account runs as its own isolated instance with a separate state database. Add accounts without touching the others.

Self-healing queue

Every action is tracked in a local state machine. Errors, interrupted work, and delete retries resume on their own.

Stable naming

Short sequential names per account mean chains of replacements never grow unwieldy or trip Meta’s name-length limits.

Manual-first

Manually enabled ads are recognized as your intent and left alone. Archived ads are never resurrected.

Full audit trail

Every detection, replacement, and deletion is logged, so you can always see exactly what happened and when.

Safety model

Aggressive about recovery. Conservative about your money.

  • Never changes campaign budgets or campaign on/off status without an explicit instruction.
  • Deletes the original only after a replacement is confirmed active — no gap, no orphaned ads.
  • One replacement per problem ad per cycle — no runaway duplicates.
  • Respects your manual actions — hand-enabled or hand-archived ads are left exactly as you set them.
  • Scoped tokens — access is limited to the specific ad accounts and Pages you assign.
state
state COMPLETED 60
state COMPLETED 370
status campaigns PAUSED
problem ads 0

Get started

Point it at an account. Walk away.

ads-monitor is a lightweight, self-hosted service. Assign it a system-user token scoped to your ad accounts and Pages, and it keeps your creatives alive — quietly, safely, on its own.