@zernio/node 0.2.715 → 0.2.716

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.
@@ -661,6 +661,65 @@ export type AdFunnelCounts = {
661
661
  messagingFirstReplies?: number;
662
662
  };
663
663
 
664
+ export type AdKeyword = {
665
+ id?: string;
666
+ /**
667
+ * Social account ID owning the sync
668
+ */
669
+ accountId?: string;
670
+ profileId?: string;
671
+ platform?: 'google';
672
+ /**
673
+ * Google customer ID
674
+ */
675
+ adAccountId?: string;
676
+ campaignId?: string;
677
+ campaignName?: (string) | null;
678
+ campaignStatus?: (string) | null;
679
+ /**
680
+ * Google ad group ID
681
+ */
682
+ adSetId?: string;
683
+ adSetName?: (string) | null;
684
+ adSetStatus?: (string) | null;
685
+ keyword?: string;
686
+ matchType?: 'exact' | 'phrase' | 'broad' | 'unknown';
687
+ status?: 'active' | 'paused';
688
+ negative?: boolean;
689
+ /**
690
+ * Google Quality Score, 1-10. Null when unrated.
691
+ */
692
+ qualityScore?: (number) | null;
693
+ syncedAt?: (string) | null;
694
+ /**
695
+ * Trailing 30-day window. Null on rows synced before the metrics columns existed (re-synced on the keyword's next weekly sweep).
696
+ */
697
+ metrics?: {
698
+ windowDays?: number;
699
+ clicks?: number;
700
+ impressions?: number;
701
+ /**
702
+ * Account currency, not USD-normalized
703
+ */
704
+ cost?: number;
705
+ conversions?: number;
706
+ /**
707
+ * Account currency
708
+ */
709
+ firstPageCpc?: (number) | null;
710
+ /**
711
+ * Account currency
712
+ */
713
+ firstPositionCpc?: (number) | null;
714
+ } | null;
715
+ };
716
+
717
+ export type platform2 = 'google';
718
+
719
+ export type matchType = 'exact' | 'phrase' | 'broad' | 'unknown';
720
+
721
+ export type status = 'active' | 'paused';
722
+
664
723
  export type AdMetrics = {
665
724
  spend?: number;
666
725
  impressions?: number;
@@ -1320,7 +1379,7 @@ export type AnalyticsSinglePostResponse = {
1320
1379
  /**
1321
1380
  * Overall post status. "partial" when some platforms published and others failed.
1322
1381
  */
1323
- export type status = 'published' | 'failed' | 'partial';
1382
+ export type status2 = 'published' | 'failed' | 'partial';
1324
1383
 
1325
1384
  /**
1326
1385
  * Overall sync state across all platforms
@@ -1468,7 +1527,7 @@ export type Blog = {
1468
1527
  handle?: string;
1469
1528
  };
1470
1529
 
1471
- export type platform2 = 'shopify';
1530
+ export type platform3 = 'shopify';
1472
1531
 
1473
1532
  /**
1474
1533
  * An article inside a blog on the connected platform.
@@ -1757,7 +1816,7 @@ export type channel = 'whatsapp' | 'pstn';
1757
1816
 
1758
1817
  export type direction = 'inbound' | 'outbound';
1759
1818
 
1760
- export type status2 = 'ringing' | 'answered' | 'ended' | 'failed';
1819
+ export type status3 = 'ringing' | 'answered' | 'ended' | 'failed';
1761
1820
 
1762
1821
  /**
1763
1822
  * Caller ID presented on the forwarded leg.
@@ -1973,7 +2032,7 @@ export type ConversionDestination = {
1973
2032
  * For LinkedIn, `inactive` means the rule is soft-deleted (`enabled: false`).
1974
2033
  *
1975
2034
  */
1976
- export type status3 = 'active' | 'inactive';
2035
+ export type status4 = 'active' | 'inactive';
1977
2036
 
1978
2037
  /**
1979
2038
  * A single conversion event to relay to the ad platform. All PII fields
@@ -2569,7 +2628,7 @@ export type objective = 'OUTCOME_ENGAGEMENT' | 'OUTCOME_SALES' | 'OUTCOME_LEADS'
2569
2628
  * newly created ad(s) after Meta accepts them.
2570
2629
  *
2571
2630
  */
2572
- export type status4 = 'ACTIVE' | 'PAUSED';
2631
+ export type status5 = 'ACTIVE' | 'PAUSED';
2573
2632
 
2574
2633
  /**
2575
2634
  * Campaign-level status, same semantics as `POST /v1/ads/create`. Defaults
@@ -2937,7 +2996,7 @@ export type privacy_level = 2;
2937
2996
  /**
2938
2997
  * 1=SCHEDULED, 2=ACTIVE, 3=COMPLETED, 4=CANCELED
2939
2998
  */
2940
- export type status5 = 1 | 2 | 3 | 4;
2999
+ export type status6 = 1 | 2 | 3 | 4;
2941
3000
 
2942
3001
  /**
2943
3002
  * 1=STAGE_INSTANCE, 2=VOICE, 3=EXTERNAL
@@ -3694,7 +3753,7 @@ export type InboxWebhookConversation = {
3694
3753
  contactId?: string;
3695
3754
  };
3696
3755
 
3697
- export type status6 = 'active' | 'archived';
3756
+ export type status7 = 'active' | 'archived';
3698
3757
 
3699
3758
  /**
3700
3759
  * The message object included in inbox webhook payloads.
@@ -3810,7 +3869,7 @@ export type InboxWebhookMessage = {
3810
3869
  isRead: boolean;
3811
3870
  };
3812
3871
 
3813
- export type platform3 = 'instagram' | 'facebook' | 'telegram' | 'whatsapp' | 'sms';
3872
+ export type platform4 = 'instagram' | 'facebook' | 'telegram' | 'whatsapp' | 'sms';
3814
3873
 
3815
3874
  export type direction2 = 'incoming' | 'outgoing';
3816
3875
 
@@ -3938,7 +3997,7 @@ export type InstagramAccountInsightsResponse = {
3938
3997
  /**
3939
3998
  * Platform that served this response.
3940
3999
  */
3941
- export type platform4 = 'facebook' | 'instagram' | 'youtube' | 'linkedin' | 'tiktok';
4000
+ export type platform5 = 'facebook' | 'instagram' | 'youtube' | 'linkedin' | 'tiktok';
3942
4001
 
3943
4002
  export type metricType = 'time_series' | 'total_value';
3944
4003
 
@@ -4153,6 +4212,16 @@ export type contentType2 = 'story';
4153
4212
  */
4154
4213
  export type graduationStrategy = 'MANUAL' | 'SS_PERFORMANCE';
4155
4214
 
4215
+ /**
4216
+ * A Google Search keyword: a bare string (BROAD match), or an object naming the match type.
4217
+ */
4218
+ export type KeywordEntry = string | {
4219
+ text: string;
4220
+ matchType?: 'exact' | 'phrase' | 'broad';
4221
+ };
4222
+
4223
+ export type matchType2 = 'exact' | 'phrase' | 'broad';
4224
+
4156
4225
  /**
4157
4226
  * 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.
4158
4227
  *
@@ -4800,7 +4869,7 @@ export type PlatformAnalytics = {
4800
4869
  errorMessage?: (string) | null;
4801
4870
  };
4802
4871
 
4803
- export type status7 = 'published' | 'failed';
4872
+ export type status8 = 'published' | 'failed';
4804
4873
 
4805
4874
  /**
4806
4875
  * Sync state of analytics for this platform
@@ -4931,7 +5000,7 @@ export type Post = {
4931
5000
  updatedAt?: string;
4932
5001
  };
4933
5002
 
4934
- export type status8 = 'draft' | 'scheduled' | 'publishing' | 'published' | 'failed' | 'partial';
5003
+ export type status9 = 'draft' | 'scheduled' | 'publishing' | 'published' | 'failed' | 'partial';
4935
5004
 
4936
5005
  export type visibility = 'public' | 'private' | 'unlisted';
4937
5006
 
@@ -5427,7 +5496,7 @@ export type ReviewWebhookReview = {
5427
5496
  /**
5428
5497
  * Platform the review originated on. Currently Google Business Profile only.
5429
5498
  */
5430
- export type platform5 = 'googlebusiness';
5499
+ export type platform6 = 'googlebusiness';
5431
5500
 
5432
5501
  /**
5433
5502
  * A Meta Reach & Frequency prediction. Money values in whole units of the ad account currency.
@@ -5590,7 +5659,7 @@ export type SocialAccount = {
5590
5659
  };
5591
5660
  };
5592
5661
 
5593
- export type platform6 = 'tiktok' | 'instagram' | 'facebook' | 'youtube' | 'linkedin' | 'twitter' | 'threads' | 'pinterest' | 'reddit' | 'bluesky' | 'googlebusiness' | 'telegram' | 'snapchat' | 'discord' | 'slack' | 'whatsapp' | 'linkedinads' | 'metaads' | 'pinterestads' | 'tiktokads' | 'xads' | 'googleads' | 'openaiads' | 'sms' | 'phone' | 'rcs';
5662
+ export type platform7 = 'tiktok' | 'instagram' | 'facebook' | 'youtube' | 'linkedin' | 'twitter' | 'threads' | 'pinterest' | 'reddit' | 'bluesky' | 'googlebusiness' | 'telegram' | 'snapchat' | 'discord' | 'slack' | 'whatsapp' | 'linkedinads' | 'metaads' | 'pinterestads' | 'tiktokads' | 'xads' | 'googleads' | 'openaiads' | 'sms' | 'phone' | 'rcs';
5594
5663
 
5595
5664
  /**
5596
5665
  * Normalized, platform-agnostic ad-targeting spec. Every field is optional, an
@@ -6056,7 +6125,7 @@ export type TrackingTag = {
6056
6125
  ownerAdAccountId?: string;
6057
6126
  };
6058
6127
 
6059
- export type platform7 = 'metaads';
6128
+ export type platform8 = 'metaads';
6060
6129
 
6061
6130
  /**
6062
6131
  * Platform-native flavor of the tag (Meta: `pixel`).
@@ -6156,7 +6225,7 @@ export type UploadTokenResponse = {
6156
6225
  status?: 'pending' | 'completed' | 'expired';
6157
6226
  };
6158
6227
 
6159
- export type status9 = 'pending' | 'completed' | 'expired';
6228
+ export type status10 = 'pending' | 'completed' | 'expired';
6160
6229
 
6161
6230
  export type UploadTokenStatusResponse = {
6162
6231
  token?: string;
@@ -6631,7 +6700,7 @@ export type Verification = {
6631
6700
  resend?: boolean;
6632
6701
  };
6633
6702
 
6634
- export type status10 = 'pending' | 'approved' | 'expired' | 'max_attempts_reached' | 'canceled' | 'delivery_failed';
6703
+ export type status11 = 'pending' | 'approved' | 'expired' | 'max_attempts_reached' | 'canceled' | 'delivery_failed';
6635
6704
 
6636
6705
  export type channel2 = 'sms';
6637
6706
 
@@ -6750,7 +6819,7 @@ export type WebhookLog = {
6750
6819
  /**
6751
6820
  * Delivery outcome
6752
6821
  */
6753
- export type status11 = 'success' | 'failed';
6822
+ export type status12 = 'success' | 'failed';
6754
6823
 
6755
6824
  /**
6756
6825
  * Webhook payload for `account.ads.initial_sync_completed` events.
@@ -6862,7 +6931,7 @@ export type event = 'account.ads.initial_sync_completed';
6862
6931
  /**
6863
6932
  * Overall outcome of the initial sync.
6864
6933
  */
6865
- export type status12 = 'success' | 'failure';
6934
+ export type status13 = 'success' | 'failure';
6866
6935
 
6867
6936
  /**
6868
6937
  * Stable category for UX branching. New values may be added; existing ones are
@@ -7489,7 +7558,7 @@ export type WebhookPayloadComment = {
7489
7558
 
7490
7559
  export type event10 = 'comment.received';
7491
7560
 
7492
- export type platform8 = 'instagram' | 'facebook' | 'twitter' | 'youtube' | 'linkedin' | 'bluesky' | 'reddit';
7561
+ export type platform9 = 'instagram' | 'facebook' | 'twitter' | 'youtube' | 'linkedin' | 'bluesky' | 'reddit';
7493
7562
 
7494
7563
  /**
7495
7564
  * Fired once when a new conversation begins, in either direction. A conversation
@@ -7546,7 +7615,7 @@ export type WebhookPayloadConversationStarted = {
7546
7615
 
7547
7616
  export type event11 = 'conversation.started';
7548
7617
 
7549
- export type platform9 = 'instagram' | 'facebook' | 'telegram' | 'whatsapp' | 'twitter' | 'reddit' | 'bluesky' | 'sms' | 'slack';
7618
+ export type platform10 = 'instagram' | 'facebook' | 'telegram' | 'whatsapp' | 'twitter' | 'reddit' | 'bluesky' | 'sms' | 'slack';
7550
7619
 
7551
7620
  /**
7552
7621
  * Webhook payload for post.external.created / post.external.updated /
@@ -7647,7 +7716,7 @@ export type WebhookPayloadLead = {
7647
7716
 
7648
7717
  export type event13 = 'lead.received';
7649
7718
 
7650
- export type platform10 = 'facebook';
7719
+ export type platform11 = 'facebook';
7651
7720
 
7652
7721
  /**
7653
7722
  * Webhook payload for message received events
@@ -8443,7 +8512,7 @@ export type event18 = 'message.sent';
8443
8512
  /**
8444
8513
  * Every platform whose outgoing messages Zernio observes. sms is absent on purpose: its carrier receipts update delivery status and never raise message.sent.
8445
8514
  */
8446
- export type platform11 = 'instagram' | 'facebook' | 'telegram' | 'whatsapp' | 'twitter' | 'reddit' | 'bluesky' | 'slack';
8515
+ export type platform12 = 'instagram' | 'facebook' | 'telegram' | 'whatsapp' | 'twitter' | 'reddit' | 'bluesky' | 'slack';
8447
8516
 
8448
8517
  /**
8449
8518
  * WhatsApp send origin. whatsapp_business_app when sent from the WhatsApp Business phone app on a Coexistence number; cloud_api when sent through Zernio (dashboard, API, or broadcasts). Absent on non-WhatsApp platforms. Says where WhatsApp saw the send come from, not which Zernio surface produced it: read sentVia for that.
@@ -8629,7 +8698,7 @@ export type event21 = 'post.platform.published' | 'post.platform.failed' | 'post
8629
8698
  /**
8630
8699
  * Terminal status this event fires on. Matches the event suffix.
8631
8700
  */
8632
- export type status13 = 'published' | 'failed' | 'deleted';
8701
+ export type status14 = 'published' | 'failed' | 'deleted';
8633
8702
 
8634
8703
  /**
8635
8704
  * Webhook payload for reaction received events (WhatsApp, Telegram, Slack, Instagram, Facebook Messenger)
@@ -8889,12 +8958,12 @@ export type WebhookPayloadWhatsAppAccountNameStatusUpdated = {
8889
8958
 
8890
8959
  export type event27 = 'whatsapp.account.name_status_updated';
8891
8960
 
8892
- export type platform12 = 'whatsapp';
8961
+ export type platform13 = 'whatsapp';
8893
8962
 
8894
8963
  /**
8895
8964
  * Normalized from Meta's `decision` (REJECTED -> DECLINED, DEFERRED -> PENDING_REVIEW; the review is still open on DEFERRED, not a rejection).
8896
8965
  */
8897
- export type status14 = 'APPROVED' | 'DECLINED' | 'PENDING_REVIEW';
8966
+ export type status15 = 'APPROVED' | 'DECLINED' | 'PENDING_REVIEW';
8898
8967
 
8899
8968
  /**
8900
8969
  * Webhook payload for the `whatsapp.template.category_updated` event.
@@ -9043,7 +9112,7 @@ export type event29 = 'whatsapp.template.status_updated';
9043
9112
  * request before the template is actually removed.
9044
9113
  *
9045
9114
  */
9046
- export type status15 = 'APPROVED' | 'REJECTED' | 'PENDING' | 'PAUSED' | 'DISABLED' | 'IN_APPEAL' | 'PENDING_DELETION';
9115
+ export type status16 = 'APPROVED' | 'REJECTED' | 'PENDING' | 'PAUSED' | 'DISABLED' | 'IN_APPEAL' | 'PENDING_DELETION';
9047
9116
 
9048
9117
  export type WhatsAppBodyComponent = {
9049
9118
  type: 'body';
@@ -9192,7 +9261,7 @@ export type WhatsAppSandboxSession = {
9192
9261
  * list responses.
9193
9262
  *
9194
9263
  */
9195
- export type status16 = 'pending' | 'active';
9264
+ export type status17 = 'pending' | 'active';
9196
9265
 
9197
9266
  export type WhatsAppTemplateButton = {
9198
9267
  type: 'quick_reply' | 'url' | 'phone_number' | 'otp' | 'copy_code' | 'flow' | 'mpm' | 'catalog';
@@ -9311,7 +9380,7 @@ export type WorkflowExecutionEvent = {
9311
9380
 
9312
9381
  export type action2 = 'execution_started' | 'execution_completed' | 'execution_exited' | 'execution_paused' | 'execution_resumed' | 'node_started' | 'node_completed' | 'node_failed' | 'node_skipped';
9313
9382
 
9314
- export type status17 = 'success' | 'failed' | 'pending';
9383
+ export type status18 = 'success' | 'failed' | 'pending';
9315
9384
 
9316
9385
  /**
9317
9386
  * A node in a workflow graph. `config` shape depends on `type`.
@@ -30406,37 +30475,81 @@ export type ListAdKeywordsData = {
30406
30475
  };
30407
30476
 
30408
30477
  export type ListAdKeywordsResponse = ({
30409
- keywords?: Array<{
30410
- id?: string;
30478
+ keywords?: Array<AdKeyword>;
30479
+ pagination?: Pagination;
30480
+ });
30481
+
30482
+ export type ListAdKeywordsError = (ErrorResponse | {
30483
+ error?: string;
30484
+ } | unknown);
30485
+
30486
+ export type AddAdKeywordsData = {
30487
+ body: {
30411
30488
  /**
30412
- * Social account ID owning the sync
30489
+ * Social account ID (Google Ads)
30413
30490
  */
30414
- accountId?: string;
30415
- profileId?: string;
30416
- platform?: 'google';
30491
+ accountId: string;
30417
30492
  /**
30418
- * Google customer ID
30493
+ * Google ad group ID to add the keywords to
30419
30494
  */
30420
- adAccountId?: string;
30421
- campaignId?: string;
30422
- campaignName?: (string) | null;
30423
- campaignStatus?: (string) | null;
30495
+ adSetId: string;
30496
+ keywords: Array<(string | {
30497
+ text: string;
30498
+ matchType?: 'exact' | 'phrase' | 'broad';
30499
+ })>;
30424
30500
  /**
30425
- * Google ad group ID
30501
+ * Add as ad-group-level negatives instead of positive keywords
30426
30502
  */
30427
- adSetId?: string;
30428
- adSetName?: (string) | null;
30429
- adSetStatus?: (string) | null;
30430
- keyword?: string;
30431
- matchType?: 'exact' | 'phrase' | 'broad' | 'unknown';
30432
- status?: 'active' | 'paused';
30433
30503
  negative?: boolean;
30434
- syncedAt?: (string) | null;
30435
- }>;
30436
- pagination?: Pagination;
30504
+ };
30505
+ };
30506
+
30507
+ export type AddAdKeywordsResponse = ({
30508
+ keywords?: Array<AdKeyword>;
30437
30509
  });
30438
30510
 
30439
- export type ListAdKeywordsError = (ErrorResponse | {
30511
+ export type AddAdKeywordsError = (ErrorResponse | {
30512
+ error?: string;
30513
+ } | unknown);
30514
+
30515
+ export type UpdateAdKeywordData = {
30516
+ body: {
30517
+ status: 'active' | 'paused';
30518
+ };
30519
+ path: {
30520
+ /**
30521
+ * Zernio keyword ID (not the Google criterion ID)
30522
+ */
30523
+ keywordId: string;
30524
+ };
30525
+ };
30526
+
30527
+ export type UpdateAdKeywordResponse = ({
30528
+ keyword?: AdKeyword;
30529
+ });
30530
+
30531
+ export type UpdateAdKeywordError = (ErrorResponse | {
30532
+ error?: string;
30533
+ } | unknown);
30534
+
30535
+ export type RemoveAdKeywordData = {
30536
+ path: {
30537
+ /**
30538
+ * Zernio keyword ID (not the Google criterion ID)
30539
+ */
30540
+ keywordId: string;
30541
+ };
30542
+ };
30543
+
30544
+ export type RemoveAdKeywordResponse = ({
30545
+ /**
30546
+ * Always true on success
30547
+ */
30548
+ removed?: boolean;
30549
+ keywordId?: string;
30550
+ });
30551
+
30552
+ export type RemoveAdKeywordError = (ErrorResponse | {
30440
30553
  error?: string;
30441
30554
  } | unknown);
30442
30555
 
@@ -30701,6 +30814,72 @@ export type DeleteAdCampaignError = ({
30701
30814
  error?: string;
30702
30815
  } | unknown);
30703
30816
 
30817
+ export type ListCampaignNegativeKeywordsData = {
30818
+ path: {
30819
+ /**
30820
+ * Platform campaign ID
30821
+ */
30822
+ campaignId: string;
30823
+ };
30824
+ query?: {
30825
+ /**
30826
+ * Optional and NOT authoritative: the resolved campaign's own platform decides 200 vs 501, never this hint.
30827
+ */
30828
+ platform?: 'facebook' | 'instagram' | 'tiktok' | 'linkedin' | 'pinterest' | 'google' | 'twitter' | 'openai';
30829
+ };
30830
+ };
30831
+
30832
+ export type ListCampaignNegativeKeywordsResponse = ({
30833
+ keywords?: Array<{
30834
+ criterionId?: string;
30835
+ text?: string;
30836
+ matchType?: 'exact' | 'phrase' | 'broad';
30837
+ }>;
30838
+ });
30839
+
30840
+ export type ListCampaignNegativeKeywordsError = ({
30841
+ error?: string;
30842
+ } | unknown);
30843
+
30844
+ export type ReplaceCampaignNegativeKeywordsData = {
30845
+ body: {
30846
+ /**
30847
+ * Optional and NOT authoritative: the resolved campaign's own platform decides 200 vs 501, never this hint.
30848
+ */
30849
+ platform?: 'facebook' | 'instagram' | 'tiktok' | 'linkedin' | 'pinterest' | 'google' | 'twitter' | 'openai';
30850
+ keywords: Array<KeywordEntry>;
30851
+ };
30852
+ path: {
30853
+ /**
30854
+ * Platform campaign ID
30855
+ */
30856
+ campaignId: string;
30857
+ };
30858
+ };
30859
+
30860
+ export type ReplaceCampaignNegativeKeywordsResponse = ({
30861
+ /**
30862
+ * Negative criteria newly created on Google
30863
+ */
30864
+ created?: number;
30865
+ /**
30866
+ * Negative criteria removed from Google
30867
+ */
30868
+ removed?: number;
30869
+ /**
30870
+ * The full negative-keyword set after the replace
30871
+ */
30872
+ keywords?: Array<{
30873
+ criterionId?: string;
30874
+ text?: string;
30875
+ matchType?: 'exact' | 'phrase' | 'broad';
30876
+ }>;
30877
+ });
30878
+
30879
+ export type ReplaceCampaignNegativeKeywordsError = (ErrorResponse | {
30880
+ error?: string;
30881
+ } | unknown);
30882
+
30704
30883
  export type BulkUpdateAdCampaignStatusData = {
30705
30884
  body: {
30706
30885
  status: 'active' | 'paused';
@@ -34214,13 +34393,17 @@ export type CreateStandaloneAdData = {
34214
34393
  */
34215
34394
  campaignType?: 'display' | 'search';
34216
34395
  /**
34217
- * Google Search only. BROAD-match keywords on the new ad group. Editable later via PUT /v1/ads/{adId} targeting.keywords, which also sets match types.
34396
+ * Google Search only. Keywords on the new ad group; entries are strings (BROAD) or { text, matchType }. Editable later via PUT /v1/ads/{adId} targeting.keywords.
34218
34397
  */
34219
- keywords?: Array<(string)>;
34398
+ keywords?: Array<KeywordEntry>;
34399
+ /**
34400
+ * Google Search only; other platforms return 400. Ad-group-level negative keywords on the new ad group. Editable later via PUT /v1/ads/{adId} targeting.negativeKeywords.
34401
+ */
34402
+ negativeKeywords?: Array<KeywordEntry>;
34220
34403
  /**
34221
- * Google Search only; other platforms return 400. BROAD-match negative keywords on the new ad group. Editable later via PUT /v1/ads/{adId} targeting.negativeKeywords.
34404
+ * Google Search only; other platforms return 400. Campaign-level negative keywords (campaign_criterion.negative), created alongside the ad group. Editable later via PUT /v1/ads/campaigns/{campaignId}/negative-keywords.
34222
34405
  */
34223
- negativeKeywords?: Array<(string)>;
34406
+ campaignNegativeKeywords?: Array<KeywordEntry>;
34224
34407
  /**
34225
34408
  * Google Search RSA only. Extra headlines.
34226
34409
  */