Static Ads Lab
Concepts

Review

Approve, request changes or reject campaign ads, with a reason your team sees in the editor.

Every ad built in a campaign has a review_status. Your team sees the same status in the StaticAds.ai editor, so decisions made through the API, the editor or an assistant stay in one place. Scope: image_ads:write.

StatusMeaning
generatedJust built, not yet reviewed
ready_for_reviewWaiting for a decision
approvedGood to launch
needs_changesKeep, but edit first
rejectedDon't use

Set the status

POST /v1/image-ads/review takes up to 50 ad ids, one status and an optional reason.

const { data } = await sal("/v1/image-ads/review", {
  method: "POST",
  body: {
    image_ad_ids: ["ia_7e3c9a1b5d2f4068", "ia_1f5b8d3a6c9e2047"],
    status: "needs_changes",
    reason: "The headline covers the hoodie's logo. Move it up.",
  },
});
// data.updated  [{ image_ad_id, review_status }]
// data.skipped  [{ image_ad_id, reason }]   ads not in a campaign
  • It acts only on the ids you send. To approve some ads of a batch and reject the rest, send two calls.
  • reason is saved as a comment on the ad, visible to your team in the editor. Use it for needs_changes and rejected.
  • Every change is recorded in the ad's history. Set ready_for_review to undo a decision.

Read it back

review_status is on every image ad, and campaigns count each status in ad_counts:

const { data: toFix } = await sal(`/v1/campaigns/${campaignId}/ads?review_status=needs_changes`);