@zernio/node 0.2.728 → 0.2.729

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