Creative tool flow
1
Read the creative library
Call
get-creative-library to list images or videos from the approved account. Select an asset_id such as image:<hash> or video:<id>.2
Stage an image when needed
Call
upload-asset with a JPEG or PNG filename, raw base64 content, a rationale, and an idempotency key. PlainRouter validates the bytes, freezes a private staged copy, and creates an upload_asset proposal.3
Review or approve the upload
In Suggest only, approval records the recommendation without uploading to Meta. In an executable mode, approval queues the provider upload after a fresh policy check. After the upload is verified, call
get-creative-library again to obtain its image:<hash> asset ID.4
Propose a paused ad copy
Call
duplicate-ad-with-creative with the human-selected source ad ID and an asset ID returned by PlainRouter. The proposal is hard-coded to paused.5
Review the proposal
Confirm the source ad, selected asset, rationale, evidence provenance, policy snapshot, and the Approve and execute consequence.
6
Wait for exact verification
PlainRouter creates the copy as
PAUSED, records its provider ID in a durable receipt, and re-reads that exact ad. Only an exact account, creative, status=PAUSED, and effective_status=PAUSED match becomes Landed.Creative library output
get-creative-library returns account-owned images and videos, asset metadata, pagination, associated ads, and aggregated last-30-day impressions, clicks, spend, and conversions.
When requesting asset_type: "all", pagination is returned separately for images and videos. To continue from a cursor, request either image or video.
Image upload rules
Theupload-asset convenience tool accepts:
asset_type: "image"- A
.jpg,.jpeg, or.pngfilename that matches the detected content type - Raw base64 bytes without a data URI prefix
- A rationale of up to 1,000 characters
- A stable idempotency key of up to 64 characters
Paused-copy invariant
PlainRouter exposes no action that activates a copied ad. A duplicate must be created and verified with both configured and effective status equal toPAUSED.
If Meta reports IN_PROCESS, the batch moves to Executed pending verification and remains Not Landed. PlainRouter performs scheduled reads for up to 48 hours. Contradictory state, rejection, or expiry triggers verified compensation, which archives the receipt-addressed copy.