Paused is the draft
Meta's API has no draft object, so Win & Scale uses PAUSED. Launching creates paused ads; activating them is a separate step that needs the approval grant.
Meta's Marketing API has no draft object. Win & Scale uses PAUSED as the
draft: meta_launch_ads creates the campaign, ad set and ads paused, and records
the launch. Nothing spends until the launch is activated, and activating is a
separate call.
Launch, review, activate
Launch
POST /api/v1/launches (meta_launch_ads)
picks or creates the campaign and ad set, uploads each creative from a public
https URL or a library upload id, builds the ad creative, and records a launch.
Everything is created PAUSED. A launch never needs the approval grant, because
the result cannot spend.
Two rules apply at this step:
- Every Advantage+ enhancement is opted out on every creative. Left alone, Meta rewrites approved copy.
- Every ad name must be canonical:
id__locale__format__persona__angle__concept__variant. A launch with a name that does not parse is refused before anything is uploaded.
The result carries strategyCautions: what in the copy the workspace's strategy
does not back: numbers it does not state, claims to confirm, and the voice's
person. Show them to the person who reviews the launch.
Review
A person checks the launch in Meta Ads Manager or on the Launches page in the app
(/app/ads/launches). meta_list_launches shows each launch's state: created
(paused), active or failed.
Activate
POST /api/v1/launches/{launchId}/activate
(meta_activate) flips the launch's ads, ad set and campaign to ACTIVE. It spends
from the moment it returns.
What changes spend
These are the operations that change what is delivering on Meta. All of them need a
key with write scope and the approval grant, and the executor checks the grant
again whatever the transport.
| Operation | REST | MCP tool |
|---|---|---|
| Activate a launch | POST /api/v1/launches/{launchId}/activate | meta_activate |
| Pause a launch's ads | POST /api/v1/launches/{launchId}/pause | meta_pause_launch |
| Pause or resume one ad | POST /api/v1/ads/{adId}/status | meta_set_ad_status |
| Change an ad set's placements or age range | PATCH /api/v1/ad-sets/{adSetId}/targeting | meta_update_ad_set_targeting |
| Rebuild a launch's live creative (CTA, link, text) | PATCH /api/v1/launches/{launchId}/copy | meta_relink_launch |
Three of them carry a cost beyond the spend:
- Targeting changes are a significant edit. The ad set re-enters Meta's learning phase on every call, so one call carries every change for an ad set.
- Rebuilding a creative (
meta_relink_launch) replaces each ad's creative, because Meta creatives are immutable. Active ads go back through review, the post's likes and comments do not carry over, and learning restarts. Change link and text in one call so the ads are reviewed once. - Resuming one ad (
meta_set_ad_statuswith ACTIVE) spends at once.effectiveStatusstaysADSET_PAUSEDorCAMPAIGN_PAUSEDwhen a parent is off.
There is no tool or endpoint that edits an existing campaign's budget.
Two layers of consent
- The credential. A key that may launch paused drafts may not, by that alone,
put them live. The approval grant is a separate boolean, not a rung above
write, so a key that proposes is not automatically a key that approves its own proposal. See Authentication. - The human's word. An agent activates only when the person says so in the
conversation, after it has restated what will go live and its daily budget. The
same holds for resuming an ad. A request to "launch" is not a request to
activate, and a
cutverdict is advice: the person picks what to pause.
Tests, briefs, Observations and Conclusions never touch delivery. An instant form spends nothing until an ad opens it. A test lead sent through a form is delivered to the lead webhook like a real one, so it runs whatever your CRM does with a new lead, and it carries the operator's own contact details.
When the trial ends
Once an ad account's free trial has ended and no plan is active, launching, turning ads on and changing live ads are refused until a plan is chosen under Settings → Billing. Pausing, reading and everything else still work.