Update launch copy
Change the CTA, link, URL tags or ad text on every ad of a launch.
Rebuilds each ad's creative (Meta creatives are immutable) and repoints the ad: ACTIVE ads go back through Meta's 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. Requires the approval grant because it changes what live ads deliver.
Requires a key with write scope or higher, and the approval grant.
MCP: meta_relink_launch.
bearerAuthAuthorizationBearer <token>An API key from Settings → API keys, sent as Authorization: Bearer rsk_….
Authorization has two independent axes.
The scope is ranked — a key satisfies any requirement at or below its own tier:
read— every GET.write— launch ads PAUSED, sync, pull history, edit thresholds, Values, briefs, tests, swipes and research.admin— everythingwritecan. No operation requires more thanwritetoday.
There is no approve scope. It was a rung once; it is not one now, and a key requested with it is rejected.
The approval grant (can_approve) is a separate boolean, not a rung. Changing spend on Meta — activating a launch, pausing or resuming ads, retargeting an ad set, or rebuilding a launch's live creative — needs write and the grant. Keeping them on separate axes is what makes the review gate a control rather than a convention: a key that may propose is not automatically a key that may approve its own proposal.
A key reaches the one workspace — one Meta ad account — it was minted in, and stops working when the operator who minted it leaves the workspace. The same key authenticates the MCP endpoint (/api/mcp) for a headless agent, with the same scope and grant.
launchId*stringA launch id, from GET /api/v1/launches or the launch's create response.
uuidapplication/json- body
cta?string"LEARN_MORE""SHOP_NOW""SIGN_UP""SUBSCRIBE""DOWNLOAD""GET_OFFER""GET_QUOTE""CONTACT_US""APPLY_NOW"link?stringuriurl_tags?stringReplaces the tags; empty string clears them.
primary_text?string1 <= length <= 5000headline?string1 <= length <= 40description?stringReplaces the description; empty string clears it.
length <= 200Success. The body is the tool's own result — the same payload the MCP tool returns.
application/json- response
curl -X PATCH 'https://winandscale.com/api/v1/launches/497f6eca-6276-4993-bfeb-53cbbbba6f08/copy' \ -H 'Content-Type: application/json' \ -d '{}'{}