@zernio/node 0.2.728 → 0.2.730

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -338,6 +338,10 @@ export type Ad = {
338
338
  * Destination URL
339
339
  */
340
340
  linkUrl?: string;
341
+ /**
342
+ * Explicit E.164 WhatsApp number supplied when creating a Meta boost or messaging ad. Absent when omitted by the caller or on older records.
343
+ */
344
+ whatsappPhoneNumber?: string;
341
345
  pinterestImageUrl?: string;
342
346
  pinterestTitle?: string;
343
347
  pinterestDescription?: string;
@@ -439,19 +443,13 @@ export type AdCampaign = {
439
443
  }> | null;
440
444
  adCount?: number;
441
445
  /**
442
- * Effective budget (back-compat). Use `budgetLevel` to disambiguate CBO vs ABO.
446
+ * Effective budget. Google metadata arrives after the next successful sync.
443
447
  */
444
- budget?: {
445
- amount?: number;
446
- type?: 'daily' | 'lifetime';
447
- } | null;
448
+ budget?: (AdCampaignBudget | null);
448
449
  /**
449
- * Campaign-level budget (CBO). Null for ABO campaigns.
450
+ * Campaign-level budget. Null for ad-set budgets.
450
451
  */
451
- campaignBudget?: {
452
- amount?: number;
453
- type?: 'daily' | 'lifetime';
454
- } | null;
452
+ campaignBudget?: (AdCampaignBudget | null);
455
453
  /**
456
454
  * Canonical CBO/ABO indicator. See AdTreeCampaign.budgetLevel.
457
455
  */
@@ -513,6 +511,25 @@ export type AdCampaign = {
513
511
  */
514
512
  export type budgetLevel = 'campaign' | 'adset';
515
513
 
514
+ export type AdCampaignBudget = AdBudget & {
515
+ /**
516
+ * Google only. Exact decimal micros; DAILY uses amount_micros and CUSTOM_PERIOD uses total_amount_micros.
517
+ */
518
+ amountMicros?: string;
519
+ /**
520
+ * Google only. True for a shared budget; null when unavailable. Shared writes require allowSharedBudgetUpdate=true; unknown sharing status cannot be overridden.
521
+ */
522
+ explicitlyShared?: (boolean) | null;
523
+ /**
524
+ * Google only. campaign_budget.resource_name, or null when unavailable.
525
+ */
526
+ resourceName?: (string) | null;
527
+ /**
528
+ * Google only. campaign_budget.delivery_method, typically STANDARD, or null when unavailable.
529
+ */
530
+ deliveryMethod?: (string) | null;
531
+ };
532
+
516
533
  /**
517
534
  * One day of metrics. Same fields as `AdMetrics` plus the `date` they
518
535
  * apply to. Returned inside a node's `daily[]` when `GET /v1/ads/tree` is
@@ -851,6 +868,43 @@ export type AdMetrics = {
851
868
  lastSyncedAt?: string;
852
869
  };
853
870
 
871
+ export type AdNegativeKeywordList = {
872
+ /**
873
+ * Google shared set id.
874
+ */
875
+ id?: string;
876
+ /**
877
+ * Google shared set resource name.
878
+ */
879
+ resourceName?: string;
880
+ /**
881
+ * List name.
882
+ */
883
+ name?: string;
884
+ /**
885
+ * Number of keywords in the list.
886
+ */
887
+ memberCount?: number;
888
+ /**
889
+ * Number of resources referencing the list.
890
+ */
891
+ referenceCount?: number;
892
+ };
893
+
894
+ export type AdNegativeKeywordListKeyword = {
895
+ /**
896
+ * Google shared criterion id.
897
+ */
898
+ criterionId?: string;
899
+ /**
900
+ * Keyword text.
901
+ */
902
+ text?: string;
903
+ matchType?: 'broad' | 'phrase' | 'exact';
904
+ };
905
+
906
+ export type matchType2 = 'broad' | 'phrase' | 'exact';
907
+
854
908
  /**
855
909
  * Platform-side review state, independent of the delivery `status` and the `configuredStatus` on/off toggle. `in_review` means the platform is still reviewing. Absent when the platform reports no review signal (e.g. a paused ad whose review state is masked behind the pause).
856
910
  */
@@ -2219,13 +2273,45 @@ export type CampaignAnalyticsResponse = {
2219
2273
  * Effective campaign status (ACTIVE when any child ad is active).
2220
2274
  */
2221
2275
  status?: (string) | null;
2276
+ /**
2277
+ * Google only. Latest synced campaign budget, or null before sync.
2278
+ */
2279
+ budget?: (AdCampaignBudget | null);
2222
2280
  /**
2223
2281
  * ISO 4217 code of the ad account (e.g. USD, THB). All money values in `summary` and `daily` are in this currency.
2224
2282
  */
2225
2283
  currency?: (string) | null;
2226
2284
  };
2227
2285
  analytics?: {
2228
- summary?: AdMetrics;
2286
+ summary?: (AdMetrics & {
2287
+ /**
2288
+ * Google only. Date-range ratio, not a percentage. Null when unavailable; Google's threshold sentinel values are preserved.
2289
+ */
2290
+ searchImpressionShare?: (number) | null;
2291
+ /**
2292
+ * Google only. Date-range ratio, not a percentage. Null when unavailable; Google's threshold sentinel values are preserved.
2293
+ */
2294
+ searchBudgetLostImpressionShare?: (number) | null;
2295
+ /**
2296
+ * Google only. Date-range ratio, not a percentage. Null when unavailable; Google's threshold sentinel values are preserved.
2297
+ */
2298
+ searchRankLostImpressionShare?: (number) | null;
2299
+ /**
2300
+ * Google only. Date-range ratio, not a percentage. Null when unavailable; Google's threshold sentinel values are preserved.
2301
+ */
2302
+ searchTopImpressionShare?: (number) | null;
2303
+ /**
2304
+ * Google only. Date-range ratio, not a percentage. Null when unavailable; Google's threshold sentinel values are preserved.
2305
+ */
2306
+ searchAbsoluteTopImpressionShare?: (number) | null;
2307
+ });
2308
+ /**
2309
+ * Google only. Cache status of the single date-range impression-share query.
2310
+ */
2311
+ impressionShareCache?: {
2312
+ cachedAt?: (string) | null;
2313
+ stale?: boolean;
2314
+ };
2229
2315
  daily?: Array<(AdMetrics & {
2230
2316
  date?: string;
2231
2317
  })>;
@@ -2713,11 +2799,15 @@ export type actionSource = 'web' | 'app' | 'offline' | 'crm' | 'phone_call' | 's
2713
2799
  * In addition to the `required` list, the request must use
2714
2800
  * EXACTLY ONE of the two shapes:
2715
2801
  *
2716
- * - Single-creative: `headline`, `body`, and one of
2717
- * `imageUrl` / `video` (mutually exclusive).
2802
+ * - Single-creative: `headline`, `body`, and one of `imageUrl` / `video`,
2803
+ * OR `existingPostId` / `objectStoryId` to reuse an organic post.
2718
2804
  * - Multi-creative: a non-empty `creatives[]` array. Top-level
2719
- * `headline` / `body` / `imageUrl` / `video` must NOT be set
2720
- * on this shape.
2805
+ * creative fields must NOT be set on this shape.
2806
+ *
2807
+ * Existing post references work on messaging and CTWA only (not call ads).
2808
+ * They cannot be combined with each other or with headline, body, imageUrl,
2809
+ * video, or welcomeMessage. No media is uploaded and the organic post is
2810
+ * retained. Fresh creatives still require headline, body, and image or video.
2721
2811
  *
2722
2812
  * The route enforces this at the Zod boundary; OpenAPI's
2723
2813
  * `required` cannot express the OR cleanly.
@@ -2740,6 +2830,18 @@ export type CtwaAdRequestBody = {
2740
2830
  *
2741
2831
  */
2742
2832
  name: string;
2833
+ /**
2834
+ * Messaging and CTWA only. Platform post or reel ID, resolved like boost platformPostId. Facebook IDs become object_story_id; Instagram IDs become source_instagram_media_id using the connected Instagram identity. Mutually exclusive with objectStoryId and fresh creative fields.
2835
+ */
2836
+ existingPostId?: string;
2837
+ /**
2838
+ * Messaging and CTWA only. Raw Facebook pageId_postId reference, used as object_story_id even with an Instagram account. Mutually exclusive with existingPostId and fresh creative fields.
2839
+ */
2840
+ objectStoryId?: string;
2841
+ /**
2842
+ * WhatsApp only. Optional E.164 number already paired with the Facebook Page. Omit to let Meta select the paired number. Sent to the creative CTA and, when creating a new ad set, its promoted_object. Attach requests do not change the existing ad set. Stored as creative.whatsappPhoneNumber on every created ad.
2843
+ */
2844
+ whatsappPhoneNumber?: string;
2743
2845
  /**
2744
2846
  * Single-creative shape only. Mutually exclusive with
2745
2847
  * `creatives[]`.
@@ -2755,14 +2857,14 @@ export type CtwaAdRequestBody = {
2755
2857
  /**
2756
2858
  * Image asset for single-creative shape. Mutually exclusive
2757
2859
  * with `video` and with `creatives[]`. Required on the
2758
- * single-creative shape if `video` is not supplied.
2860
+ * single-creative shape if neither `video` nor an existing post reference is supplied.
2759
2861
  *
2760
2862
  */
2761
2863
  imageUrl?: string;
2762
2864
  /**
2763
2865
  * Video creative for single-creative shape. Mutually
2764
2866
  * exclusive with `imageUrl` and with `creatives[]`. Required
2765
- * on the single-creative shape if `imageUrl` is not supplied.
2867
+ * on the single-creative shape if neither `imageUrl` nor an existing post reference is supplied.
2766
2868
  *
2767
2869
  */
2768
2870
  video?: {
@@ -2807,25 +2909,33 @@ export type CtwaAdRequestBody = {
2807
2909
  * `body` / `imageUrl` / `video`): setting both is a 400,
2808
2910
  * unlike `POST /v1/ads/create` where the top-level fields
2809
2911
  * are silently ignored in multi-creative mode. Each entry
2810
- * must supply its own headline, body, and exactly one of
2811
- * `imageUrl` / `video`.
2912
+ * supplies headline, body, and image/video, or an existingPostId or
2913
+ * objectStoryId reference. Fresh and existing creatives can be mixed.
2812
2914
  *
2813
2915
  */
2814
2916
  creatives?: Array<{
2815
- headline: string;
2917
+ /**
2918
+ * Messaging and CTWA only. Platform post or reel ID, resolved like boost platformPostId. Facebook IDs become object_story_id; Instagram IDs become source_instagram_media_id using the connected Instagram identity. Mutually exclusive with objectStoryId and fresh creative fields.
2919
+ */
2920
+ existingPostId?: string;
2921
+ /**
2922
+ * Messaging and CTWA only. Raw Facebook pageId_postId reference, used as object_story_id even with an Instagram account. Mutually exclusive with existingPostId and fresh creative fields.
2923
+ */
2924
+ objectStoryId?: string;
2925
+ headline?: string;
2816
2926
  /**
2817
2927
  * Primary text shown above the image / video.
2818
2928
  */
2819
- body: string;
2929
+ body?: string;
2820
2930
  /**
2821
2931
  * Image asset. Mutually exclusive with this entry's
2822
- * `video`. Required if `video` is not supplied.
2932
+ * `video`. Required if neither `video` nor an existing post reference is supplied.
2823
2933
  *
2824
2934
  */
2825
2935
  imageUrl?: string;
2826
2936
  /**
2827
2937
  * Video creative. Mutually exclusive with this entry's
2828
- * `imageUrl`. Required if `imageUrl` is not supplied.
2938
+ * `imageUrl`. Required if neither `imageUrl` nor an existing post reference is supplied.
2829
2939
  *
2830
2940
  */
2831
2941
  video?: {
@@ -4744,8 +4854,6 @@ export type KeywordEntry = string | {
4744
4854
  matchType?: 'exact' | 'phrase' | 'broad';
4745
4855
  };
4746
4856
 
4747
- export type matchType2 = 'exact' | 'phrase' | 'broad';
4748
-
4749
4857
  /**
4750
4858
  * LinkedIn-specific options for POST /v1/ads/boost and POST /v1/ads/create: campaign bidding and delivery controls, plus the LinkedIn-only creative formats on /v1/ads/create. Unknown keys are rejected.
4751
4859
  *
@@ -5218,6 +5326,9 @@ export type MediaContentType = 'image/jpeg' | 'image/jpg' | 'image/png' | 'image
5218
5326
  */
5219
5327
  export type MediaItem = {
5220
5328
  type?: 'image' | 'video' | 'gif' | 'document';
5329
+ /**
5330
+ * A media item with a null, missing or empty url is dropped from non-draft posts (drafts keep it as a pending-upload placeholder).
5331
+ */
5221
5332
  url?: string;
5222
5333
  /**
5223
5334
  * Optional title for the media item. Used as the document title for LinkedIn PDF/carousel posts. If omitted, falls back to the post title, then the filename.
@@ -31926,7 +32037,11 @@ export type UpdateAdCampaignData = {
31926
32037
  */
31927
32038
  portfolioBidStrategyId?: string;
31928
32039
  /**
31929
- * **Meta only.** The CBO budget.
32040
+ * Google only. Explicitly allow changing a shared campaign budget, affecting every campaign that uses it. Does not bypass an unknown sharing state.
32041
+ */
32042
+ allowSharedBudgetUpdate?: boolean;
32043
+ /**
32044
+ * Meta CBO or Google daily campaign budget, in whole currency units.
31930
32045
  */
31931
32046
  budget?: {
31932
32047
  /**
@@ -31962,7 +32077,7 @@ export type UpdateAdCampaignResponse = ({
31962
32077
  * Local Ad documents mirrored. 0 on the empty-campaign path.
31963
32078
  */
31964
32079
  updated?: number;
31965
- budget?: AdBudget;
32080
+ budget?: AdCampaignBudget;
31966
32081
  budgetLevel?: 'campaign';
31967
32082
  bidStrategy?: BidStrategy;
31968
32083
  bidAmount?: number;
@@ -34568,6 +34683,278 @@ export type DeleteValueRuleSetError = (unknown | {
34568
34683
  error?: string;
34569
34684
  });
34570
34685
 
34686
+ export type ListAdNegativeKeywordListsData = {
34687
+ query: {
34688
+ accountId: string;
34689
+ customerId?: string;
34690
+ platform?: 'facebook' | 'instagram' | 'tiktok' | 'linkedin' | 'pinterest' | 'google' | 'twitter' | 'openai';
34691
+ };
34692
+ };
34693
+
34694
+ export type ListAdNegativeKeywordListsResponse = ({
34695
+ lists?: Array<AdNegativeKeywordList>;
34696
+ /**
34697
+ * Resolved Google Ads customer id.
34698
+ */
34699
+ customerId?: string;
34700
+ /**
34701
+ * Last successful fetch time, or null without cache storage.
34702
+ */
34703
+ cachedAt?: (string) | null;
34704
+ /**
34705
+ * True when quota exhaustion caused the last successful cached result to be served.
34706
+ */
34707
+ stale?: boolean;
34708
+ });
34709
+
34710
+ export type ListAdNegativeKeywordListsError = (ErrorResponse | {
34711
+ error?: string;
34712
+ } | unknown);
34713
+
34714
+ export type CreateAdNegativeKeywordListData = {
34715
+ body: {
34716
+ /**
34717
+ * Zernio SocialAccount id.
34718
+ */
34719
+ accountId: string;
34720
+ /**
34721
+ * Connected Google Ads customer id, without dashes. Required when the connection has multiple customers.
34722
+ */
34723
+ customerId?: string;
34724
+ /**
34725
+ * Optional courtesy field. The resolved account or campaign determines support; other platforms return 501.
34726
+ */
34727
+ platform?: 'facebook' | 'instagram' | 'tiktok' | 'linkedin' | 'pinterest' | 'google' | 'twitter' | 'openai';
34728
+ /**
34729
+ * Nonempty list name, trimmed before use.
34730
+ */
34731
+ name: string;
34732
+ /**
34733
+ * Full desired keyword set. Bare strings use broad match. Send [] to clear the list.
34734
+ */
34735
+ keywords?: Array<KeywordEntry>;
34736
+ };
34737
+ };
34738
+
34739
+ export type CreateAdNegativeKeywordListResponse = ({
34740
+ /**
34741
+ * New shared set id.
34742
+ */
34743
+ id?: string;
34744
+ /**
34745
+ * New shared set resource name.
34746
+ */
34747
+ resourceName?: string;
34748
+ /**
34749
+ * Number of initial keyword criteria created.
34750
+ */
34751
+ created?: number;
34752
+ /**
34753
+ * Resolved Google Ads customer id.
34754
+ */
34755
+ customerId?: string;
34756
+ });
34757
+
34758
+ export type CreateAdNegativeKeywordListError = (ErrorResponse | {
34759
+ error?: string;
34760
+ } | unknown);
34761
+
34762
+ export type GetAdNegativeKeywordListData = {
34763
+ path: {
34764
+ listId: string;
34765
+ };
34766
+ query: {
34767
+ accountId: string;
34768
+ customerId?: string;
34769
+ platform?: 'facebook' | 'instagram' | 'tiktok' | 'linkedin' | 'pinterest' | 'google' | 'twitter' | 'openai';
34770
+ };
34771
+ };
34772
+
34773
+ export type GetAdNegativeKeywordListResponse = ({
34774
+ list?: (AdNegativeKeywordList & {
34775
+ keywords?: Array<AdNegativeKeywordListKeyword>;
34776
+ });
34777
+ /**
34778
+ * Resolved Google Ads customer id.
34779
+ */
34780
+ customerId?: string;
34781
+ /**
34782
+ * Last successful fetch time, or null without cache storage.
34783
+ */
34784
+ cachedAt?: (string) | null;
34785
+ /**
34786
+ * True when quota exhaustion caused the last successful cached result to be served.
34787
+ */
34788
+ stale?: boolean;
34789
+ });
34790
+
34791
+ export type GetAdNegativeKeywordListError = (ErrorResponse | {
34792
+ error?: string;
34793
+ } | unknown);
34794
+
34795
+ export type UpdateAdNegativeKeywordListData = {
34796
+ body: {
34797
+ /**
34798
+ * Zernio SocialAccount id.
34799
+ */
34800
+ accountId: string;
34801
+ /**
34802
+ * Connected Google Ads customer id, without dashes. Required when the connection has multiple customers.
34803
+ */
34804
+ customerId?: string;
34805
+ /**
34806
+ * Optional courtesy field. The resolved account or campaign determines support; other platforms return 501.
34807
+ */
34808
+ platform?: 'facebook' | 'instagram' | 'tiktok' | 'linkedin' | 'pinterest' | 'google' | 'twitter' | 'openai';
34809
+ /**
34810
+ * Nonempty list name, trimmed before use.
34811
+ */
34812
+ name: string;
34813
+ };
34814
+ path: {
34815
+ listId: string;
34816
+ };
34817
+ };
34818
+
34819
+ export type UpdateAdNegativeKeywordListResponse = ({
34820
+ updated?: boolean;
34821
+ /**
34822
+ * Resolved Google Ads customer id.
34823
+ */
34824
+ customerId?: string;
34825
+ });
34826
+
34827
+ export type UpdateAdNegativeKeywordListError = (ErrorResponse | {
34828
+ error?: string;
34829
+ } | unknown);
34830
+
34831
+ export type DeleteAdNegativeKeywordListData = {
34832
+ path: {
34833
+ listId: string;
34834
+ };
34835
+ query: {
34836
+ accountId: string;
34837
+ customerId?: string;
34838
+ platform?: 'facebook' | 'instagram' | 'tiktok' | 'linkedin' | 'pinterest' | 'google' | 'twitter' | 'openai';
34839
+ };
34840
+ };
34841
+
34842
+ export type DeleteAdNegativeKeywordListResponse = ({
34843
+ removed?: boolean;
34844
+ /**
34845
+ * Resolved Google Ads customer id.
34846
+ */
34847
+ customerId?: string;
34848
+ });
34849
+
34850
+ export type DeleteAdNegativeKeywordListError = (ErrorResponse | {
34851
+ error?: string;
34852
+ } | unknown);
34853
+
34854
+ export type ReplaceAdNegativeKeywordListKeywordsData = {
34855
+ body: {
34856
+ /**
34857
+ * Zernio SocialAccount id.
34858
+ */
34859
+ accountId: string;
34860
+ /**
34861
+ * Connected Google Ads customer id, without dashes. Required when the connection has multiple customers.
34862
+ */
34863
+ customerId?: string;
34864
+ /**
34865
+ * Optional courtesy field. The resolved account or campaign determines support; other platforms return 501.
34866
+ */
34867
+ platform?: 'facebook' | 'instagram' | 'tiktok' | 'linkedin' | 'pinterest' | 'google' | 'twitter' | 'openai';
34868
+ /**
34869
+ * Full desired keyword set. Bare strings use broad match. Send [] to clear the list.
34870
+ */
34871
+ keywords: Array<KeywordEntry>;
34872
+ };
34873
+ path: {
34874
+ listId: string;
34875
+ };
34876
+ };
34877
+
34878
+ export type ReplaceAdNegativeKeywordListKeywordsResponse = ({
34879
+ /**
34880
+ * New criteria or campaign links created.
34881
+ */
34882
+ created?: number;
34883
+ /**
34884
+ * Existing criteria or campaign links removed.
34885
+ */
34886
+ removed?: number;
34887
+ /**
34888
+ * Resolved Google Ads customer id.
34889
+ */
34890
+ customerId?: string;
34891
+ });
34892
+
34893
+ export type ReplaceAdNegativeKeywordListKeywordsError = (ErrorResponse | {
34894
+ error?: string;
34895
+ } | unknown);
34896
+
34897
+ export type ListCampaignNegativeKeywordListsData = {
34898
+ path: {
34899
+ campaignId: string;
34900
+ };
34901
+ query?: {
34902
+ platform?: 'facebook' | 'instagram' | 'tiktok' | 'linkedin' | 'pinterest' | 'google' | 'twitter' | 'openai';
34903
+ };
34904
+ };
34905
+
34906
+ export type ListCampaignNegativeKeywordListsResponse = ({
34907
+ lists?: Array<AdNegativeKeywordList>;
34908
+ /**
34909
+ * Resolved Google Ads customer id.
34910
+ */
34911
+ customerId?: string;
34912
+ /**
34913
+ * Last successful fetch time, or null without cache storage.
34914
+ */
34915
+ cachedAt?: (string) | null;
34916
+ /**
34917
+ * True when quota exhaustion caused the last successful cached result to be served.
34918
+ */
34919
+ stale?: boolean;
34920
+ });
34921
+
34922
+ export type ListCampaignNegativeKeywordListsError = (ErrorResponse | {
34923
+ error?: string;
34924
+ } | unknown);
34925
+
34926
+ export type ReplaceCampaignNegativeKeywordListsData = {
34927
+ body: {
34928
+ /**
34929
+ * Optional courtesy field. The resolved account or campaign determines support; other platforms return 501.
34930
+ */
34931
+ platform?: 'facebook' | 'instagram' | 'tiktok' | 'linkedin' | 'pinterest' | 'google' | 'twitter' | 'openai';
34932
+ listIds: Array<(string)>;
34933
+ };
34934
+ path: {
34935
+ campaignId: string;
34936
+ };
34937
+ };
34938
+
34939
+ export type ReplaceCampaignNegativeKeywordListsResponse = ({
34940
+ /**
34941
+ * New criteria or campaign links created.
34942
+ */
34943
+ created?: number;
34944
+ /**
34945
+ * Existing criteria or campaign links removed.
34946
+ */
34947
+ removed?: number;
34948
+ /**
34949
+ * Resolved Google Ads customer id.
34950
+ */
34951
+ customerId?: string;
34952
+ });
34953
+
34954
+ export type ReplaceCampaignNegativeKeywordListsError = (ErrorResponse | {
34955
+ error?: string;
34956
+ } | unknown);
34957
+
34571
34958
  export type ListAccountCalloutsData = {
34572
34959
  query: {
34573
34960
  /**
@@ -34926,9 +35313,13 @@ export type BoostPostData = {
34926
35313
  */
34927
35314
  instagramAccountId?: string;
34928
35315
  /**
34929
- * Meta only. Ad-set destination_type: where the click LANDS, as opposed to instagramAccountId which is who the ad runs as. Lead ads force ON_AD and ignore this.
35316
+ * Meta only. Ad-set destination_type: where the click LANDS, as opposed to instagramAccountId which is who the ad runs as. Independent of plain link CTAs and their goal. A messaging callToAction selects its destination automatically; an explicit destinationType must then match. Lead ads use ON_AD.
35317
+ */
35318
+ destinationType?: 'INSTAGRAM_PROFILE' | 'WEBSITE' | 'ON_AD' | 'MESSENGER' | 'WHATSAPP' | 'INSTAGRAM_DIRECT';
35319
+ /**
35320
+ * Meta WhatsApp only. E.164 number already paired with the Page. Omit to use the default pairing. Requires WHATSAPP_MESSAGE callToAction. Stored as creative.whatsappPhoneNumber on the ad.
34930
35321
  */
34931
- destinationType?: 'INSTAGRAM_PROFILE' | 'WEBSITE' | 'ON_AD' | 'MESSENGER' | 'WHATSAPP';
35322
+ whatsappPhoneNumber?: string;
34932
35323
  /**
34933
35324
  * ISO 4217 currency code matching the ad account's currency. Meta only. 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).
34934
35325
  */
@@ -35121,7 +35512,7 @@ export type BoostPostData = {
35121
35512
  [key: string]: (number);
35122
35513
  };
35123
35514
  /**
35124
- * Destination URL for the CTA button. Send it together with `callToAction`.
35515
+ * Website URL for non-messaging CTA buttons. Send it with `callToAction`. Omit for messaging boosts.
35125
35516
  *
35126
35517
  * **Meta**: adds a top-level `call_to_action` to the post-reference creative.
35127
35518
  * This is what gives a `traffic` boost a clickable destination without
@@ -35139,12 +35530,14 @@ export type BoostPostData = {
35139
35530
  */
35140
35531
  linkUrl?: string;
35141
35532
  /**
35142
- * CTA button label. Send it together with `linkUrl`: a CTA without a
35143
- * destination produces a button that goes nowhere, so sending one alone is a 400.
35533
+ * CTA button label. Non-messaging CTAs require `linkUrl`.
35534
+ * WHATSAPP_MESSAGE, MESSAGE_PAGE, and INSTAGRAM_MESSAGE do not
35535
+ * require a URL and reject linkUrl.
35144
35536
  *
35145
35537
  * **Meta**: the CTA enum of POST /v1/ads/create plus
35146
- * `VIEW_INSTAGRAM_PROFILE`, which is accepted on boost only. For that
35147
- * value `linkUrl` is typically the Instagram profile URL.
35538
+ * `VIEW_INSTAGRAM_PROFILE`, `WHATSAPP_MESSAGE`, `MESSAGE_PAGE`,
35539
+ * and `INSTAGRAM_MESSAGE`. VIEW_INSTAGRAM_PROFILE requires linkUrl;
35540
+ * the messaging CTAs select their destination automatically.
35148
35541
  *
35149
35542
  * **TikTok**: pass-through to `call_to_action` on the Spark Ad creative; the
35150
35543
  * platform validates the value. See TikTok's "Enumeration - Call-to-Action".
@@ -35182,12 +35575,13 @@ export type BoostPostData = {
35182
35575
  */
35183
35576
  leadGenFormId?: string;
35184
35577
  /**
35185
- * Meta, TikTok, and LinkedIn. Publish state of the created entities. Omitted or ACTIVE publishes live (default); PAUSED creates them paused so you can review before they spend. On LinkedIn the whole campaign group, campaign, and creative hierarchy stays PAUSED (intendedStatus PAUSED on each).
35578
+ * Meta, TikTok, and LinkedIn. Publish state of the created entities. Omitted or ACTIVE publishes live (default); PAUSED creates them paused so you can review before they spend. On Meta a new campaign stays paused until explicitly activated; an attached ad is itself paused. On LinkedIn the whole campaign group, campaign, and creative hierarchy stays PAUSED (intendedStatus PAUSED on each).
35186
35579
  */
35187
35580
  status?: 'ACTIVE' | 'PAUSED';
35188
35581
  /**
35189
35582
  * Meta only. Explicit ad-set `optimization_goal` override. When omitted,
35190
- * defaults to the value derived from `goal`. The value must be compatible
35583
+ * defaults to the value derived from `goal`. Messaging boosts always
35584
+ * use CONVERSATIONS and reject another optimizationGoal. Otherwise the value must be compatible
35191
35585
  * with the objective Meta derives from `goal`, not with the objective used
35192
35586
  * by `POST /v1/ads/create` for the same `goal` name: boost maps `goal:
35193
35587
  * "engagement"` to objective `OUTCOME_AWARENESS`, which accepts