Zernio
Zernio
PlatformsMeta Ads

Build

CampaignsAd SetsCreativesCreative LibraryPreviews

Target

TargetingCustom Audiences

Ad types

Boost a PostCreative TestingConversion CampaignsCatalog AdsMessaging & Call AdsClick-to-WhatsApp AdsLead Gen FormsReach & Frequency

Measure

InsightsMeta PixelsConversions APIAd URL Tracking Tags

Operate

Duplicate & LifecycleAccount & Ops ReadsAd LibraryAd CommentsMedia & Limits
Dashboard
llms.txtOpenAPI
OverviewPlatformsAPI ReferenceResources
Meta Ads

Media & Limits

Look up the Meta ads enums, media limits, unsupported operations and Meta error subcodes that the rest of this section links to.


Look up the values the other pages point at: media limits, the callToAction and placements enums, what Meta's API does not let you do, and the Meta error subcodes worth recognizing on sight. Nothing here needs a call of its own.

Media requirements

TypeFormatMax sizeNotes
Feed imageJPEG, PNG30 MB1080 x 1080 px or 1200 x 628 px recommended
Reels videoMP4, MOV4 GB9:16 vertical, at most 90 seconds
StoryJPEG, PNG, MP430 MB image, 4 GB video9:16 vertical
CarouselJPEG, PNG, MP430 MB per card2 to 10 cards
Base64 image uploadJPEG, PNG30 MB decodedThrough POST /v1/ads/images

A media URL must be publicly reachable with no authentication: Meta fetches it from its own infrastructure, so a hotlink-protected CDN comes back as Meta error code 324.

Call to action values

callToAction on POST /v1/ads/create, POST /v1/ads/boost and POST /v1/ads/creatives takes one of:

LEARN_MORESHOP_NOWSIGN_UPBOOK_TRAVEL
CONTACT_USDOWNLOADGET_OFFERGET_QUOTE
SUBSCRIBEWATCH_MOREADD_TO_CARTAPPLY_NOW
BOOK_NOWBUY_TICKETSDONATEDONATE_NOW
GET_DIRECTIONSGET_SHOWTIMESLISTEN_NOWORDER_NOW
PLAY_GAMEREQUEST_TIMESEE_MENUSTART_ORDER
INSTALL_MOBILE_APPUSE_APPBUY_NOW

POST /v1/ads/boost adds VIEW_INSTAGRAM_PROFILE, which no other endpoint accepts; pair it with the Instagram profile URL as linkUrl. POST /v1/ads/creatives defaults to LEARN_MORE. CALL_NOW and the messaging buttons are not here: POST /v1/ads/call and POST /v1/ads/messaging build the ad set those buttons require. The enum also carries REGISTER, JOIN, ATTEND, REQUEST_DEMO, VIEW_QUOTE, APPLY and SEE_MORE for LinkedIn Ads.

dynamicCreative.callToActionTypes takes the same values as an array.

Placements

The placements object restricts delivery to chosen surfaces. Omit it for Meta's automatic placements. It appears as a top-level field on POST /v1/ads/create and POST /v1/ads/rf-predictions, inside targeting on POST /v1/ads/boost, and as rules[].placements on placementAssets.

FieldValues
publisherPlatformsfacebook, instagram, threads, messenger, audience_network, whatsapp
facebookPositionsfeed, right_hand_column, marketplace, video_feeds, story, search, instream_video, facebook_reels, facebook_reels_overlay, profile_feed, notification
instagramPositionsstream, story, explore, explore_home, reels, profile_feed, ig_search, profile_reels
messengerPositionsmessenger_home, sponsored_messages, story
audienceNetworkPositionsclassic, rewarded_video
threadsPositionsthreads_stream
whatsappPositionsstatus
devicePlatformsmobile, desktop. Omit to deliver on both.

A position field counts only when its parent platform is in publisherPlatforms. Zernio validates enum membership; Meta enforces its own co-selection rules on top (profile_feed needs feed) and its message surfaces verbatim.

Special ad categories

specialAdCategories declares a regulated ad and makes Meta restrict its targeting: HOUSING, EMPLOYMENT, CREDIT, FINANCIAL_PRODUCTS_SERVICES, ISSUES_ELECTIONS_POLITICS, ONLINE_GAMBLING_AND_GAMING. Setting one disables income and ZIP targeting on Meta.

What you cannot do

Meta's API does not expose:

  • Editing a creative's content after create. Creatives are immutable beyond their name, so swap a new creative onto the ad.
  • Duplicating more than about 2 objects in one synchronous copy. Meta's /copies cap; duplicate the campaign for bigger hierarchies.
  • Copying creatives that still carry Meta's deprecated standard_enhancements bundle. Rebuild them with creativeFeatures.
  • Creating a paused first ad in a Reach and Frequency reservation. Meta requires it ACTIVE; delivery stays gated by status and the reserved window.
  • Automatic placements on a Reach and Frequency prediction. Explicit placements are required.
  • A campaign spend cap of exactly 0. Pass spendCap: null to remove a cap.
  • Server-side filtering of the activity log per object. Meta has no per-object filter on that edge, so objectId filters the returned page.
  • Reading high demand periods at the account level. The Graph edge exists on campaign and ad set nodes only.
  • CALL_NOW and the messaging buttons through POST /v1/ads/create. Use POST /v1/ads/call and POST /v1/ads/messaging.
  • App and offline Event Match Quality. Meta exposes web EMQ only.
  • Deleting a pixel. There is no Meta API for it; unshare it or disable it in Events Manager.

Common errors

Meta's validation errors surface inside Zernio's platform_error envelope with the subcode preserved (error handling). The ones worth recognizing:

Meta subcodeWhere it appearsMeaning and fix
324Any create with imageUrlMeta cannot fetch the image (auth wall, hotlink protection). Host it publicly or upload base64.
1815430Conversion-goal createsMissing promotedObject. Zernio pre-empts it with a clean 400; see conversion campaigns.
1815089Lead ad createsThe Page has not accepted the Lead Generation terms. Accept them once at facebook.com/ads/leadgen/tos.
2446886Messaging ads with destination: "whatsapp"The Page is not paired with a verified WhatsApp Business number. Pair it in Meta Business Manager.
2061006Call adsThe display link must be a real website; tel: is rejected. Pass a website linkUrl.
1885099Campaign spend capA spend cap cannot be zero. Remove it with spendCap: null.
1885696Reach and Frequency predictionsAutomatic placements are rejected on reservations. Pass explicit placements.
1885237Reach and Frequency predictionsInstagram placements need a linked Instagram professional account.
1487716Reach and Frequency createsThe first ad in a reservation cannot be paused. Zernio creates it ACTIVE by design.
4834012 and 1815830Reach and Frequency createsAuction-only fields on a reserved campaign (budget sharing, ad set bids). Zernio strips them.
1713151Engagement audiencesThe source Page, Instagram account or video is not eligible. An eligibility problem, not a wrong event.
1870049Engagement audiencesVideo sources need Meta's legacy rule dialect. Zernio sends it.
1713098 and 1870029Website audiencesA raw rule in the wrong shape. Use Meta's flexible rule shape.
3858504Creativesstandard_enhancements is deprecated. Use individual creativeFeatures.
100Flexible insightsUnknown field, or an invalid field and breakdown combination. Meta's message lists the valid values.

Two review states look like errors and are not. A successful create returns an ad in pending_review: reviewStatus (in_review, approved, rejected, with_issues) is separate from the delivery status, and both sit on every tree node. And a creative rename has read-after-write lag on Meta's side, so a read right after it can return the old name for a few seconds.

Related

  • Campaigns: the create request most of these values go on.
  • Creatives: the creative shapes and their media fields.
  • Targeting: where placements sits on each endpoint.
  • Error handling: the envelope every 4xx uses.
Was this page helpful?

Ad Comments

Read the comments on a Meta ad's underlying post, dark posts included, with GET /v1/ads/{adId}/comments.

Google Ads

Create Search and Display campaigns, mine keywords, upload Customer Match lists, send conversions and query GAQL on a googleads account.

On this page

Media requirementsCall to action valuesPlacementsSpecial ad categoriesWhat you cannot doCommon errorsRelated