meta_get_ad_preview
See a Meta ad as Meta renders it in each placement, before it goes live.
Check an ad before you activate it. Meta crops one image differently in each placement, and the overlays of a Story or a Reel cover part of it. Text in the image itself, such as a price, shows only in the rendered picture.
Show me the Reels and the Stories preview of the 9:16 ad of Spring Prospecting.
The agent calls meta_get_ad_preview with the id of the ad, or with the id of a creative that has no ad yet. For each placement, the agent sees the image as Meta renders it, and it can tell you what the overlays cover and whether the price reads. Each row also gives a link to the image and a link to the preview of Meta, for you to open. The links stop working after 24 hours.
With no placement named, the agent gets the Facebook feed, the Instagram feed, the Instagram Stories and the Instagram Reels. It can also ask for the Facebook Stories and the Facebook Reels. A placement where Meta does not show this creative comes back as unsupported, and the other placements still come back. Change what runs on Meta shows where this step comes in the job.
Reference
Show a Meta ad, or a Meta creative, as Meta renders it 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. Call this before you activate an ad. Give exactly one of adId (an ad, also a PAUSED one: find it with meta_list_ads) and creativeId (a creative, also one with no ad yet: find it with meta_list_creatives). placements defaults to facebook_feed, instagram_feed, instagram_story, instagram_reels. With render image (the default), each placement comes back as an image that you can look at, after a label that names it, and as imageUrl for a person. With render link, each placement gives only previewUrl, which a person opens in a browser. The links stop working after 24 hours. A placement that Meta does not show for this creative is unsupported, and the other placements still come back.
Input
| Argument | Type | Required | Description |
|---|---|---|---|
adId |
string | no | The Meta id of the ad, digits only. Give this or creativeId, not both. |
advertiserId |
string | yes | Advertiser account ID (acc_<id>). Must belong to the active organization — find one with list_advertisers. |
creativeId |
string | no | The Meta id of the creative, digits only. Give this or adId, not both. |
placements |
array of (one of facebook_feed, facebook_story, facebook_reels, instagram_feed, instagram_story, instagram_reels), at least 1 item |
no | The placements to render. The default is facebook_feed, instagram_feed, instagram_story, instagram_reels. Default: ["facebook_feed","instagram_feed","instagram_story","instagram_reels"]. |
render |
one of image, link |
no | image (the default): an image of each placement. link: the link of Meta only, which is faster. Default: image. |
Output
A successful call returns this object in structuredContent.
| Field | Type | Always present | Description |
|---|---|---|---|
previews |
array of object | yes | One row for each placement, in the order of placements. Each image follows in the content of the result, after a label that names its placement. |
previews[].expiresAt |
string or null | yes | When previewUrl and imageUrl stop working (ISO 8601): 24 hours after the read. Call the tool again after that. Null when status is not ok. |
previews[].height |
integer or null | yes | The height of the image in pixels. Null with no image. |
previews[].imageUrl |
string or null | yes | A link to the image of the preview, for a person to open. Null with no image. |
previews[].placement |
one of facebook_feed, facebook_story, facebook_reels, instagram_feed, instagram_story, instagram_reels |
yes | The placement of the row. |
previews[].previewUrl |
string or null | yes | The link of Meta that renders the preview in a browser. Null when status is not ok. |
previews[].reason |
string or null | yes | Why status is not ok, in the words of Meta when Meta refused. Null for an ok row. |
previews[].status |
one of ok, unsupported, failed |
yes | ok: the preview is there. unsupported: Meta does not show this creative in this placement. failed: Meta or the render failed for this placement only. Call the tool again for it. |
previews[].width |
integer or null | yes | The width of the image in pixels: the phone mock of Meta, not the creative. Null with no image. |
Failure codes
A failed call has isError set, and structuredContent.error holds one of these codes. Errors describes the shape of a failed call.
not_foundprovider_not_connectedorganization_unentitledforbiddeninvalid_requestinternal_error
Scope
The token must hold observe:read. Auth & scopes lists each scope.
Annotations
A client reads these hints. A hint that the tool does not declare has the default value of the MCP specification.
- Read-only. The tool changes nothing.
- Open world. The tool reaches a system outside AdCrunch, such as an ad platform.
Example
The arguments:
{
"adId": "120246340793730490",
"advertiserId": "acc_1485443900032333",
"placements": [
"instagram_reels"
]
}
The result, in structuredContent:
{
"previews": [
{
"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
}
]
}