Show a Meta creative in each placement
Live read. Asks Meta now for the ad preview of one creative in each placement: the crop, what the overlays of a Story or a Reel cover, and what the image itself says, such as a price. Read it before you activate an ad.
Each placement gives one row. With render image, AdCrunch renders each placement and keeps the image for one day: imageUrl links to it. With render link, a row gives only previewUrl, the link of Meta, which stops working 24 hours after the read. A placement that Meta does not show for this creative is unsupported, and a placement that failed is failed. The other rows still come back. The status is 200.
The creative must be in the ad account of the advertiser: an id of GET /observe/{advertiserId}/creatives. Another one answers 404, with error of not_found, and AdCrunch reads no ad preview of it.
An advertiser that your organization does not own answers 404, with error of not_found. An advertiser that does not exist, and one that is not a Meta ad account, answer the same.
AdCrunch keeps nothing from this read but the images. Each placement is one request to Meta, and counts against the rate limits of Meta.
/observe/{advertiserId}/creatives/{id}/previewsAuthorizationBearer token · headerrequiredSend Authorization: Bearer <credential>.
Use an API key (acr_…), from the AdCrunch console under Settings → API keys.
The credential names the organization, and no operation takes an organization parameter.
See https://docs.adcrunch.dev/api/authentication.
advertiserIdstringrequiredidstringrequiredplacementsstring | string[]renderstringimagelinkOne row for each placement.
dataobject[]requiredOne row for each placement, in the order of placements. A placement named twice gives one row.
Show propertiesHide properties
objectexpiresAtstring | nullrequiredWhen previewUrl stops working (ISO 8601): 24 hours after the read. imageUrl works at least until then. Read the ad preview again after that. Null with no previewUrl.
heightinteger | nullrequiredThe height of the image in pixels. Null with no image.
imageUrlstring | nullrequiredA public link to the image of the ad preview, a JPEG, for a person to open. Nobody can guess it. Null with no image: with render link, and when status is not ok.
placementstringrequiredThe placement of the row.
facebook_feedfacebook_storyfacebook_reelsinstagram_feedinstagram_storyinstagram_reelspreviewUrlstring | nullrequiredThe link of Meta that renders the ad preview in a browser. Null when Meta gave no link: an unsupported row, or a failed row whose read of Meta failed. A row whose render failed keeps it.
reasonstring | nullrequiredWhy status is not ok, in the words of Meta when Meta refused. Null for an ok row.
statusstringrequiredok: the ad preview is there. unsupported: Meta does not show this creative in this placement. failed: Meta or the render failed for this placement only. Read the ad preview of that placement again.
okunsupportedfailedwidthinteger | nullrequiredThe width of the image in pixels: the phone mock of Meta, not the creative. Null with no image.
The request does not match the schema of this operation: a field is missing or has the wrong type, or the body is not valid JSON. error is invalid_request, and issues names each field. Nothing was changed.
issuesobject[]requiredOne entry for each field that does not match.
Show propertiesHide properties
objectinstringrequiredThe part of the request that holds the field.
bodycookieheadersparamsquerymessagestringrequiredA sentence to show a person. Written to say what to do next. Reworded whenever it can be said better, so never branch on it.
pathstringrequiredA JSON Pointer into that part of the request, such as /filename. An empty string is the whole part.
errorstringrequiredA stable code for the failure. This is the field to branch on. It does not change for a given failure.
invalid_requestmessagestringrequiredA sentence to show a person. Written to say what to do next. Reworded whenever it can be said better, so never branch on it.
No API key, or one that does not resolve. See the security scheme. error is unauthorized.
errorstringrequiredA stable code for the failure. This is the field to branch on. It does not change for a given failure.
unauthorizedmessagestringrequiredA sentence to show a person. Written to say what to do next. Reworded whenever it can be said better, so never branch on it.
The organization has no active subscription. An owner subscribes at paywallUrl. error is organization_unentitled.
paywallUrlstring<uri>requiredThe page where an owner of the organization subscribes. Show it to the person.
errorstringrequiredA stable code for the failure. This is the field to branch on. It does not change for a given failure.
organization_unentitledmessagestringrequiredA sentence to show a person. Written to say what to do next. Reworded whenever it can be said better, so never branch on it.
The caller does not hold observe:read. error is forbidden.
errorstringrequiredA stable code for the failure. This is the field to branch on. It does not change for a given failure.
forbiddenmessagestringrequiredA sentence to show a person. Written to say what to do next. Reworded whenever it can be said better, so never branch on it.
Your organization does not own the advertiser in the path, it does not exist, or it is not a Meta ad account. Then AdCrunch asks Meta nothing. The same status comes for an id that is not in the ad account of the advertiser. Then AdCrunch reads no ad preview. In each case, error is not_found.
errorstringrequiredA stable code for the failure. This is the field to branch on. It does not change for a given failure.
not_foundmessagestringrequiredA sentence to show a person. Written to say what to do next. Reworded whenever it can be said better, so never branch on it.
This advertiser has no usable connection to Meta. A person must reconnect it.
providerstringrequiredThe ad platform this failure came from: meta.
errorstringrequiredA stable code for the failure. This is the field to branch on. It does not change for a given failure.
provider_not_connectedmessagestringrequiredA sentence to show a person. Written to say what to do next. Reworded whenever it can be said better, so never branch on it.
The provider refused the request, or could not answer it. This failure is often transient. Send the request again.
platformErroranyrequiredThe provider’s own error object, unchanged. For Meta it carries code, error_subcode, type, error_user_title and error_user_msg — branch on the subcode for anything AdCrunch does not model. It never holds the request AdCrunch sent.
providerstringrequiredThe ad platform this failure came from: meta.
errorstringrequiredA stable code for the failure. This is the field to branch on. It does not change for a given failure.
provider_errormessagestringrequiredA sentence to show a person. Written to say what to do next. Reworded whenever it can be said better, so never branch on it.