Messaging & Call Ads
Ads that open WhatsApp, Messenger or Instagram Direct, or dial a phone number
Messaging & Call Ads
Instead of sending the user to a website, these ads open a conversation with your business or dial your number. Zernio drives the full hierarchy (campaign, ad set, creative, ad) in a single call, and picks the CTA, destination_type and optimization goal that Meta requires for each destination.
Messaging ads
POST /v1/ads/messaging with a destination:
destination | Opens in | CTA | Requirement |
|---|---|---|---|
whatsapp | WHATSAPP_MESSAGE | The Page paired with a verified WhatsApp Business number | |
messenger | The Page's Messenger inbox | MESSAGE_PAGE | A Facebook Page |
instagram_direct | The linked Instagram account's Direct | INSTAGRAM_MESSAGE | An Instagram professional account linked to the Page |
const result = await zernio.messagingads.createMessagingAd({
body: {
accountId: 'FB_OR_IG_ACCOUNT_ID',
adAccountId: 'act_123456789',
destination: 'messenger',
name: 'Summer promo, Messenger',
headline: 'Chat with us',
body: 'Get a personal quote in 2 minutes.',
imageUrl: 'https://cdn.example.com/promo.jpg',
budgetAmount: 20,
budgetType: 'daily',
currency: 'USD',
countries: ['US', 'ES'],
},
});result = client.messaging_ads.create_messaging_ad(
account_id="FB_OR_IG_ACCOUNT_ID",
ad_account_id="act_123456789",
destination="messenger",
name="Summer promo, Messenger",
headline="Chat with us",
body="Get a personal quote in 2 minutes.",
image_url="https://cdn.example.com/promo.jpg",
budget_amount=20,
budget_type="daily",
currency="USD",
countries=["US", "ES"],
)curl -X POST "https://zernio.com/api/v1/ads/messaging" \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"accountId": "FB_OR_IG_ACCOUNT_ID",
"adAccountId": "act_123456789",
"destination": "messenger",
"name": "Summer promo, Messenger",
"headline": "Chat with us",
"body": "Get a personal quote in 2 minutes.",
"imageUrl": "https://cdn.example.com/promo.jpg",
"budgetAmount": 20,
"budgetType": "daily",
"currency": "USD",
"countries": ["US", "ES"]
}'The ad set is built with the matching destination_type and CONVERSATIONS optimization, and the campaign objective defaults to OUTCOME_ENGAGEMENT. Both single and multi-creative (creatives[]) shapes work, with image or video, exactly as on the other create endpoints.
Geo targeting takes the full shape, not just countries: pass cities, regions, zips, metros or customLocations for a local business, with keys from /v1/ads/targeting/search.
The Page-to-destination pairing has to exist first. For whatsapp, pair the Page with a verified WhatsApp Business number in Meta Business Manager. For instagram_direct, link an Instagram professional account to the Page. When the pairing is missing, Meta rejects the ad set (subcode 2446886 for the WhatsApp case) and Zernio surfaces a clean platform_error envelope.
POST /v1/ads/ctwa is deprecated, and equivalent to destination: "whatsapp" here. It stays available indefinitely for existing integrations, see Click-to-WhatsApp Ads. New integrations should use this endpoint.
To close the attribution loop on conversions that happen inside the WhatsApp thread, see Conversions API for Business Messaging on the WhatsApp page.
Call ads
POST /v1/ads/call builds an ad whose CTA is CALL_NOW, dialing phoneNumber (E.164).
const result = await zernio.messagingads.createCallAd({
body: {
accountId: 'FB_OR_IG_ACCOUNT_ID',
adAccountId: 'act_123456789',
name: 'Book a consult, calls',
phoneNumber: '+15551234567',
linkUrl: 'https://example.com/contact',
headline: 'Talk to an expert',
body: 'One call, no forms.',
imageUrl: 'https://cdn.example.com/promo.jpg',
budgetAmount: 30,
budgetType: 'daily',
currency: 'USD',
countries: ['US'],
},
});result = client.messaging_ads.create_call_ad(
account_id="FB_OR_IG_ACCOUNT_ID",
ad_account_id="act_123456789",
name="Book a consult, calls",
phone_number="+15551234567",
link_url="https://example.com/contact",
headline="Talk to an expert",
body="One call, no forms.",
image_url="https://cdn.example.com/promo.jpg",
budget_amount=30,
budget_type="daily",
currency="USD",
countries=["US"],
)curl -X POST "https://zernio.com/api/v1/ads/call" \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"accountId": "FB_OR_IG_ACCOUNT_ID",
"adAccountId": "act_123456789",
"name": "Book a consult, calls",
"phoneNumber": "+15551234567",
"linkUrl": "https://example.com/contact",
"headline": "Talk to an expert",
"body": "One call, no forms.",
"imageUrl": "https://cdn.example.com/promo.jpg",
"budgetAmount": 30,
"budgetType": "daily",
"currency": "USD",
"countries": ["US"]
}'The ad set uses destination_type: PHONE_CALL optimizing QUALITY_CALL, and the campaign objective defaults to OUTCOME_LEADS.
linkUrl is required on a call ad, and it must be a real website. Meta rejects a tel: URI as the creative's display link (subcode 2061006, "doesn't direct to a website"). The phone number rides only on the CTA button, so the creative still needs somewhere to point. Use your contact page.
Not yet supported
page_welcome_message (the pre-filled greeting or ice-breakers shown when the thread opens) is not exposed. Meta's inner JSON shape for it isn't reproducible from their public documentation, so ads open an empty thread with Meta's default behaviour. Ask support if you need it, it's buildable now that Messenger destinations are testable.