Skip to content
AdCrunch
Esc
↑↓navigate↵open⌘Jpreview

Show a Meta creative in each placement

Available on: Meta

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.

GET/observe/{advertiserId}/creatives/{id}/previews
Authorization
AuthorizationBearer token · headerrequired

Send 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.

Path parameters
advertiserIdstringrequired
matches ^(acc_)[\s\S]{0,}$
idstringrequired
matches ^\d+$
Query parameters
placementsstring | string[]
renderstring
default: "image"
Allowed:imagelink
Responses
200

One row for each placement.

dataobject[]required

One row for each placement, in the order of placements. A placement named twice gives one row.

Show properties
Array of object
expiresAtstring | nullrequired

When 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 | nullrequired

The height of the image in pixels. Null with no image.

min -9007199254740991 · max 9007199254740991
imageUrlstring | nullrequired

A 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.

placementstringrequired

The placement of the row.

Allowed:facebook_feedfacebook_storyfacebook_reelsinstagram_feedinstagram_storyinstagram_reels
previewUrlstring | nullrequired

The 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 | nullrequired

Why status is not ok, in the words of Meta when Meta refused. Null for an ok row.

statusstringrequired

ok: 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.

Allowed:okunsupportedfailed
widthinteger | nullrequired

The width of the image in pixels: the phone mock of Meta, not the creative. Null with no image.

min -9007199254740991 · max 9007199254740991
400

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[]required

One entry for each field that does not match.

Show properties
Array of object
instringrequired

The part of the request that holds the field.

Allowed:bodycookieheadersparamsquery
messagestringrequired

A sentence to show a person. Written to say what to do next. Reworded whenever it can be said better, so never branch on it.

pathstringrequired

A JSON Pointer into that part of the request, such as /filename. An empty string is the whole part.

errorstringrequired

A stable code for the failure. This is the field to branch on. It does not change for a given failure.

Allowed:invalid_request
messagestringrequired

A sentence to show a person. Written to say what to do next. Reworded whenever it can be said better, so never branch on it.

401

No API key, or one that does not resolve. See the security scheme. error is unauthorized.

errorstringrequired

A stable code for the failure. This is the field to branch on. It does not change for a given failure.

Allowed:unauthorized
messagestringrequired

A sentence to show a person. Written to say what to do next. Reworded whenever it can be said better, so never branch on it.

402

The organization has no active subscription. An owner subscribes at paywallUrl. error is organization_unentitled.

paywallUrlstring<uri>required

The page where an owner of the organization subscribes. Show it to the person.

errorstringrequired

A stable code for the failure. This is the field to branch on. It does not change for a given failure.

Allowed:organization_unentitled
messagestringrequired

A sentence to show a person. Written to say what to do next. Reworded whenever it can be said better, so never branch on it.

403

The caller does not hold observe:read. error is forbidden.

errorstringrequired

A stable code for the failure. This is the field to branch on. It does not change for a given failure.

Allowed:forbidden
messagestringrequired

A sentence to show a person. Written to say what to do next. Reworded whenever it can be said better, so never branch on it.

404

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.

errorstringrequired

A stable code for the failure. This is the field to branch on. It does not change for a given failure.

Allowed:not_found
messagestringrequired

A sentence to show a person. Written to say what to do next. Reworded whenever it can be said better, so never branch on it.

409

This advertiser has no usable connection to Meta. A person must reconnect it.

providerstringrequired

The ad platform this failure came from: meta.

errorstringrequired

A stable code for the failure. This is the field to branch on. It does not change for a given failure.

Allowed:provider_not_connected
messagestringrequired

A sentence to show a person. Written to say what to do next. Reworded whenever it can be said better, so never branch on it.

502

The provider refused the request, or could not answer it. This failure is often transient. Send the request again.

platformErroranyrequired

The 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.

providerstringrequired

The ad platform this failure came from: meta.

errorstringrequired

A stable code for the failure. This is the field to branch on. It does not change for a given failure.

Allowed:provider_error
messagestringrequired

A sentence to show a person. Written to say what to do next. Reworded whenever it can be said better, so never branch on it.

Request
curl -X GET 'https://api.pr-1174.adcrunch.dev/observe/string/creatives/string/previews' \
  -H 'Authorization: Bearer YOUR_TOKEN'
Response
{
  "data": [
    {
      "expiresAt": "2026-11-01T13:17:06.000Z",
      "height": 1248,
      "imageUrl": "https://ad-previews.adcrunch.dev/org_hxa7g1vfck6tamgdiwpvb7tq/0b6f2c1e-6a8d-4f0e-9b7a-3c2d1e0f9a8b.jpg",
      "placement": "instagram_reels",
      "previewUrl": "https://business.facebook.com/ads/api/preview_iframe.php?d=AQKERWN7Rq07pu&t=AQK9UMzb7sF",
      "reason": null,
      "status": "ok",
      "width": 640
    }
  ]
}