---
title: meta_get_ad_preview
description: 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](/mcp/tools/change-what-runs-on-meta) shows where this step comes in the job.

## Reference

**Available on:** [![Meta](/providers/meta.svg)](https://docs.adcrunch.dev/connect/providers)

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](/mcp/errors) describes the shape of a failed call.

- `not_found`
- `provider_not_connected`
- `organization_unentitled`
- `forbidden`
- `invalid_request`
- `internal_error`

### Scope

The token must hold `observe:read`. [Auth & scopes](/mcp/auth) 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:

```json
{
  "adId": "120246340793730490",
  "advertiserId": "acc_1485443900032333",
  "placements": [
    "instagram_reels"
  ]
}
```

The result, in `structuredContent`:

```json
{
  "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
    }
  ]
}
```
