| account_id |
String |
Facebook or Instagram SocialAccount ID. |
|
| ad_account_id |
String |
Meta ad account ID, e.g. act_123456789. |
|
| name |
String |
Ad display name. Used to derive campaign / ad set names. On the multi-creative shape, each ad's Meta name gets a " #N" suffix (1-indexed) so Ads Manager shows them as a numbered batch. |
|
| headline |
Option<String> |
Single-creative shape only. Mutually exclusive with creatives[]. |
[optional] |
| body |
Option<String> |
Primary text shown above the image / video. Single-creative shape only. Mutually exclusive with creatives[]. |
[optional] |
| image_url |
Option<String> |
Image asset for single-creative shape. Mutually exclusive with video and with creatives[]. Required on the single-creative shape if video is not supplied. |
[optional] |
| video |
Option<models::CtwaAdRequestBodyVideo> |
|
[optional] |
| creatives |
Option<Vecmodels::CtwaAdRequestBodyCreativesInner> |
Multi-creative shape: N CTWA ads under one campaign + one ad set, sharing budget and targeting. Mutually exclusive with the top-level single-creative fields (headline / body / imageUrl / video). Each entry must supply its own headline, body, and exactly one of imageUrl / video. |
[optional] |
| ad_set_id |
Option<String> |
Attach the creatives to this EXISTING messaging ad set instead of building a campaign, so the ad set keeps its learning phase. It then owns budget, targeting and schedule, so budgetAmount, budgetType, endDate, objective, countries, interests and audienceId are rejected with a 400 alongside it. Its destination_type must match the ad's destination. |
[optional] |
| budget_amount |
Option<f64> |
Budget amount in the ad account's currency major units (e.g. dollars for USD, not cents). Must be > 0. Required unless adSetId is set, where the ad set owns it. |
[optional] |
| budget_type |
Option<BudgetType> |
Required unless adSetId is set. (enum: daily, lifetime) |
[optional] |
| currency |
Option<String> |
ISO 4217 currency code matching the ad account's currency (e.g. USD). Optional: Zernio resolves it from the ad account when omitted. The value selects the minor-unit exponent Zernio converts budget/bid amounts by before calling Meta (most currencies are cents; zero-decimal currencies like JPY/KRW are sent as-is). |
[optional] |
| end_date |
Option<String> |
ISO 8601 datetime. Required when budgetType is lifetime. |
[optional] |
| countries |
Option<Vec> |
ISO 3166-1 alpha-2 country codes. Defaults to [\"US\"] only when no other geo (cities, regions, zips, metros, customLocations) is supplied. |
[optional] |
| cities |
Option<Vecmodels::CtwaAdRequestBodyCitiesInner> |
City-level geo targeting for local CTWA campaigns. Each entry maps to Meta's TargetingGeoLocationCity. key is Meta's city ID. radius and distance_unit are coupled: set both or neither. Meta enforces a minimum city radius (~17 km / 10 mi); smaller values resolve to a 0-size audience and the ad fails at launch. For a tighter catchment use customLocations (lat/lng). |
[optional] |
| regions |
Option<Vecmodels::CtwaAdRequestBodyRegionsInner> |
Region / state-level geo targeting. key is Meta's region ID (lookupable via GET /v1/ads/targeting/search?type=region). |
[optional] |
| zips |
Option<Vecmodels::CtwaAdRequestBodyZipsInner> |
ZIP / postal-code geo targeting. key is the platform's postal id resolved via /v1/ads/targeting/search. |
[optional] |
| metros |
Option<Vecmodels::CtwaAdRequestBodyZipsInner> |
DMA / metro-area geo targeting. key is Meta's metro id (e.g. DMA:807). |
[optional] |
| custom_locations |
Option<Vecmodels::CreateStandaloneAdRequestCustomLocationsInner> |
Point-radius geo (Meta geo_locations.custom_locations). Use for targeting a radius around a specific lat/long when no Meta city/region key fits. distanceUnit is required. |
[optional] |
| age_min |
Option<i32> |
|
[optional] |
| age_max |
Option<i32> |
|
[optional] |
| interests |
Option<Vecmodels::CreateStandaloneAdRequestBehaviorsInner> |
|
[optional] |
| audience_id |
Option<String> |
Custom audience ID to target. |
[optional] |
| placements |
Option<models::CtwaAdRequestBodyPlacements> |
|
[optional] |
| advantage_audience |
Option<AdvantageAudience> |
Meta's Advantage+ audience expansion. 0 (default) keeps targeting strict; 1 lets Meta expand beyond the supplied targeting when its delivery system finds better matches. Always sent on CREATE (Meta requires it). (enum: 0, 1) |
[optional] |
| objective |
Option<Objective> |
Defaults to OUTCOME_ENGAGEMENT. OUTCOME_SALES and OUTCOME_LEADS require additional account configuration (Dataset linked to the WABA for sales) and may be rejected by Meta if missing. (enum: OUTCOME_ENGAGEMENT, OUTCOME_SALES, OUTCOME_LEADS) |
[optional] |
| bid_strategy |
Option<BidStrategy> |
Meta bid strategy applied to the shared ad set. Defaults to LOWEST_COST_WITHOUT_CAP (auto-bid) when omitted. LOWEST_COST_WITH_BID_CAP and COST_CAP require bidAmount. LOWEST_COST_WITH_MIN_ROAS requires roasAverageFloor. CTWA's optimization_goal is fixed to CONVERSATIONS, but the bid strategy is independent. (enum: LOWEST_COST_WITHOUT_CAP, LOWEST_COST_WITH_BID_CAP, COST_CAP, LOWEST_COST_WITH_MIN_ROAS) |
[optional] |
| bid_amount |
Option<f64> |
Whole currency units (e.g. 5 = $5.00 on a USD account). Required when bidStrategy is LOWEST_COST_WITH_BID_CAP or COST_CAP; rejected otherwise. |
[optional] |
| roas_average_floor |
Option<f64> |
Decimal ROAS multiplier (e.g. 2.0 = 2.0× ROAS floor). Required when bidStrategy is LOWEST_COST_WITH_MIN_ROAS; rejected otherwise. Meta enforces its own upper bound server-side. |
[optional] |
| dsa_beneficiary |
Option<String> |
Legal entity that benefits from the ad. Required when targeting EU users (EU DSA, Article 26). Optional if the ad account has a default beneficiary: set it once via PATCH /v1/ads/accounts or in Meta Ads Manager, and Meta fills it in whenever the field is omitted. |
[optional] |
| dsa_payor |
Option<String> |
Legal entity that pays for the ad. Can differ from dsaBeneficiary (for example, an agency paying for a client's ads). Same rules as dsaBeneficiary: required for EU targeting unless the ad account has a default payor. |
[optional] |
| phone_number |
String |
E.164 number the CALL_NOW CTA dials (e.g. +34600111222). |
|
| link_url |
String |
Website shown as the creative's link. Required: Meta rejects tel: as link_data.link; the phone number rides only the CTA. |
|