@wix/auto_sdk_seo_keyword-research 1.0.0

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.
@@ -0,0 +1,684 @@
1
+ import { NonNullablePaths } from '@wix/sdk-types';
2
+
3
+ /**
4
+ * A keyword research item is one target keyword in a site's content plan,
5
+ * together with the search data behind it and the page it belongs to.
6
+ *
7
+ * The content plan pipeline generates a set of these for a site. A site owner
8
+ * can then refine them, and the blog post briefs are built from the result.
9
+ *
10
+ * Items are grouped into clusters. Each site page has one main keyword, marked
11
+ * by `primary`, and the other keywords in that cluster support it.
12
+ */
13
+ interface KeywordResearch {
14
+ /**
15
+ * Keyword research item ID.
16
+ * @format GUID
17
+ * @readonly
18
+ */
19
+ _id?: string | null;
20
+ /**
21
+ * The keyword itself.
22
+ *
23
+ * An update is rejected if the new keyword is longer than 80 characters, or
24
+ * if it duplicates another keyword in the same research.
25
+ * @maxLength 1000
26
+ */
27
+ keyword?: string | null;
28
+ /**
29
+ * ID of the site page the keyword is assigned to.
30
+ * @maxLength 1000
31
+ */
32
+ pageId?: string | null;
33
+ /**
34
+ * Type of the site page the keyword is assigned to, such as a static
35
+ * page or a blog post.
36
+ * @maxLength 1000
37
+ */
38
+ itemType?: string | null;
39
+ /**
40
+ * URL of the site page the keyword is assigned to.
41
+ * @maxLength 1000
42
+ */
43
+ pageUrl?: string | null;
44
+ /**
45
+ * How hard it is to rank for the keyword, on a scale where a higher
46
+ * number means more competition.
47
+ *
48
+ * Recalculated when `keyword` changes, even if you don't name this field
49
+ * in the field mask.
50
+ */
51
+ competition?: number | null;
52
+ /**
53
+ * Estimated number of searches for the keyword per month.
54
+ *
55
+ * Recalculated when `keyword` changes, even if you don't name this field
56
+ * in the field mask.
57
+ */
58
+ searchVolume?: number | null;
59
+ /**
60
+ * Whether the site page this keyword is assigned to has been deleted.
61
+ *
62
+ * A keyword assigned to a deleted page stays in the research.
63
+ */
64
+ pageDeleted?: boolean | null;
65
+ /**
66
+ * Name of the page the keyword relates to. No reader populates it today.
67
+ * No removal owner is assigned yet. See
68
+ * docs/api-exposure/content-plan-exposure-brief.md.
69
+ * @internal
70
+ * @maxLength 1000
71
+ * @deprecated Name of the page the keyword relates to. No reader populates it today.
72
+ * No removal owner is assigned yet. See
73
+ * docs/api-exposure/content-plan-exposure-brief.md.
74
+ * @targetRemovalDate 2026-01-31
75
+ */
76
+ pageName?: string | null;
77
+ /**
78
+ * Whether this keyword is the main keyword for its page.
79
+ *
80
+ * A page has a single main keyword, and the other keywords in its cluster
81
+ * support it.
82
+ */
83
+ primary?: boolean | null;
84
+ /**
85
+ * Name of the cluster that groups this keyword with the others covering
86
+ * the same topic.
87
+ * @maxLength 1000
88
+ */
89
+ clusterName?: string | null;
90
+ }
91
+ interface GetKeywordResearchItemsByPageIdRequest {
92
+ /**
93
+ * ID of the page to retrieve keywords for. Required.
94
+ * @maxLength 1000
95
+ */
96
+ pageId?: string;
97
+ /**
98
+ * Type of the page. Required. Must match a stored item type.
99
+ * Unmatched value returns NOT_FOUND unless a main keyword was already set.
100
+ * @maxLength 1000
101
+ */
102
+ itemType?: string;
103
+ /**
104
+ * Optional. The handler currently resolves the site's latest keyword
105
+ * research and does not read this field. Kept for future use: when the
106
+ * handler is updated to support per-flow lookups, callers will be able to
107
+ * target a specific flow's research instead of always getting the latest.
108
+ * @format GUID
109
+ */
110
+ contentPlanFlowId?: string | null;
111
+ }
112
+ interface GetKeywordResearchItemsByPageIdResponse {
113
+ /**
114
+ * keywords related to the page
115
+ * @maxSize 1000
116
+ */
117
+ keywordResearchItems?: KeywordResearch[];
118
+ /**
119
+ * id of the main keyword for this page
120
+ * @format GUID
121
+ */
122
+ mainKeywordId?: string | null;
123
+ }
124
+ interface ListKeywordResearchItemsRequest {
125
+ /**
126
+ * Reserved for future use.
127
+ *
128
+ * This method currently resolves the site's most recent keyword research,
129
+ * and this field is ignored.
130
+ * @format GUID
131
+ */
132
+ contentPlanFlowId?: string | null;
133
+ /**
134
+ * Cursor paging. Omit for the first page.
135
+ *
136
+ * Omit this object entirely to return every item in a single response.
137
+ */
138
+ paging?: CursorPaging;
139
+ }
140
+ interface CursorPaging {
141
+ /**
142
+ * Max items per page. Default 50, max 100.
143
+ * @max 100
144
+ */
145
+ limit?: number | null;
146
+ /**
147
+ * Cursor from a previous response. Omit for the first page.
148
+ * @maxLength 16000
149
+ */
150
+ cursor?: string | null;
151
+ }
152
+ interface ListKeywordResearchItemsResponse {
153
+ /**
154
+ * Retrieved keyword research items.
155
+ * @maxSize 1000
156
+ */
157
+ keywordResearchItems?: KeywordResearch[];
158
+ /**
159
+ * ID of the keyword research these items belong to.
160
+ *
161
+ * Send this ID when you update an item. Compare it across reads to detect
162
+ * that a newer generation replaced the research.
163
+ * @format GUID
164
+ */
165
+ keywordResearchId?: string | null;
166
+ /**
167
+ * Whether this research has been edited.
168
+ *
169
+ * `false` means the research is exactly as the content plan generated it,
170
+ * so the next edit copies it onto a new `keywordResearchId`.
171
+ */
172
+ createdByUser?: boolean | null;
173
+ /**
174
+ * ID of the main keyword for each page, keyed by page ID.
175
+ *
176
+ * Built from the site's full item set, so on a paged response it can name
177
+ * items that aren't in `keywordResearchItems`.
178
+ */
179
+ mainKeywordMap?: Record<string, string>;
180
+ /** Paging metadata. */
181
+ pagingMetadata?: CursorPagingMetadata;
182
+ }
183
+ interface CursorPagingMetadata {
184
+ /** Items returned in this page. */
185
+ count?: number | null;
186
+ /** Cursors for next/previous page. */
187
+ cursors?: Cursors;
188
+ /** Whether there are more pages. */
189
+ hasNext?: boolean | null;
190
+ }
191
+ interface Cursors {
192
+ /**
193
+ * Cursor for the next page.
194
+ * @maxLength 16000
195
+ */
196
+ next?: string | null;
197
+ /**
198
+ * Cursor for the previous page.
199
+ * @maxLength 16000
200
+ */
201
+ prev?: string | null;
202
+ }
203
+ /** Deprecated alias request. Same fields as ListKeywordResearchItemsRequest. */
204
+ interface GetKeywordResearchItemsRequest {
205
+ /**
206
+ * Deprecated. Ignored by the handler.
207
+ * @format GUID
208
+ */
209
+ contentPlanFlowId?: string | null;
210
+ /** Cursor paging. */
211
+ paging?: CursorPaging;
212
+ }
213
+ /** Deprecated alias response. Same fields as ListKeywordResearchItemsResponse. */
214
+ interface GetKeywordResearchItemsResponse {
215
+ /**
216
+ * Keyword research items.
217
+ * @maxSize 1000
218
+ */
219
+ keywordResearchItems?: KeywordResearch[];
220
+ /**
221
+ * ID of the keyword research.
222
+ * @format GUID
223
+ */
224
+ keywordResearchId?: string | null;
225
+ /** Whether the research was user-created. */
226
+ createdByUser?: boolean | null;
227
+ /** Main keyword IDs by page ID. */
228
+ mainKeywordMap?: Record<string, string>;
229
+ /** Paging metadata. */
230
+ pagingMetadata?: CursorPagingMetadata;
231
+ }
232
+ interface GetDraftKeywordResearchItemsRequest {
233
+ /**
234
+ * id of the content plan flow this keyword research belongs to
235
+ * @format GUID
236
+ */
237
+ contentPlanFlowId?: string | null;
238
+ }
239
+ interface GetDraftKeywordResearchItemsResponse {
240
+ /**
241
+ * keyword research items
242
+ * @maxSize 1000
243
+ */
244
+ keywordResearchItems?: KeywordResearch[];
245
+ /**
246
+ * id of the keyword research that was returned
247
+ * @format GUID
248
+ */
249
+ keywordResearchId?: string | null;
250
+ /** whether the keyword research was created by the user */
251
+ createdByUser?: boolean | null;
252
+ /** map of ids of the main keywords by page id */
253
+ mainKeywordMap?: Record<string, string>;
254
+ }
255
+ interface UpdateKeywordResearchItemsRequest {
256
+ /**
257
+ * updated keyword research items
258
+ * @maxSize 1000
259
+ */
260
+ updatedItems?: UpdatedKeywordResearch[];
261
+ /**
262
+ * deleted keyword research items
263
+ * @maxSize 1000
264
+ */
265
+ deletedItems?: DeletedKeywordResearch[];
266
+ /**
267
+ * added keyword research items
268
+ * @maxSize 1000
269
+ */
270
+ addedItems?: AddedKeywordResearch[];
271
+ /**
272
+ * id of the keyword research to be updated
273
+ * @format GUID
274
+ */
275
+ keywordResearchId?: string | null;
276
+ }
277
+ interface UpdatedKeywordResearch {
278
+ /**
279
+ * ID of the keyword research item to update.
280
+ * @format GUID
281
+ */
282
+ _id?: string | null;
283
+ /**
284
+ * New keyword.
285
+ *
286
+ * Rejected if it's longer than 80 characters, or if it duplicates another
287
+ * keyword in the same research. Changing it also refreshes the item's
288
+ * `searchVolume` and `competition`.
289
+ * @maxLength 1000
290
+ */
291
+ keyword?: string | null;
292
+ /**
293
+ * Whether to make this item its page's main keyword.
294
+ *
295
+ * Set to `true` to promote it. `false` and omitting the field both leave
296
+ * the current main keyword unchanged, so this field can't demote one.
297
+ */
298
+ mainKeyword?: boolean | null;
299
+ }
300
+ interface DeletedKeywordResearch {
301
+ /**
302
+ * ID of the keyword research item to delete.
303
+ * @format GUID
304
+ */
305
+ _id?: string | null;
306
+ }
307
+ interface AddedKeywordResearch {
308
+ /**
309
+ * keyword of the keyword research item
310
+ * @maxLength 1000
311
+ */
312
+ keyword?: string | null;
313
+ /**
314
+ * page id the keyword relates to
315
+ * @maxLength 1000
316
+ */
317
+ pageId?: string | null;
318
+ /** is the keyword the main keyword for it's page */
319
+ mainKeyword?: boolean | null;
320
+ }
321
+ interface UpdateKeywordResearchItemsResponse {
322
+ /**
323
+ * keyword research items
324
+ * @maxSize 1000
325
+ */
326
+ keywordResearchItems?: KeywordResearch[];
327
+ /**
328
+ * id of the keyword research that was returned
329
+ * @format GUID
330
+ */
331
+ keywordResearchId?: string | null;
332
+ /** whether the keyword research was created by the user */
333
+ createdByUser?: boolean | null;
334
+ /** map of ids of the main keywords by page id */
335
+ mainKeywordMap?: Record<string, string>;
336
+ }
337
+ interface UpdateKeywordResearchItemRequest {
338
+ /**
339
+ * ID of the keyword research the item belongs to.
340
+ *
341
+ * Use the `keywordResearchId` from your most recent read or write.
342
+ * @format GUID
343
+ */
344
+ keywordResearchId: string | null;
345
+ /** Keyword research item to update. */
346
+ item: UpdatedKeywordResearch;
347
+ /**
348
+ * Fields to update.
349
+ *
350
+ * Must name at least one of `keyword` or `mainKeyword`, the only writable
351
+ * fields. An omitted or empty mask is rejected.
352
+ */
353
+ fieldMask: string[];
354
+ }
355
+ interface UpdateKeywordResearchItemResponse {
356
+ /** Updated keyword research item. */
357
+ keywordResearchItem?: KeywordResearch;
358
+ /**
359
+ * ID of the keyword research holding the updated item.
360
+ *
361
+ * This can differ from the ID you sent, because the first edit to
362
+ * generated research copies it. Use this value for your next write.
363
+ * @format GUID
364
+ */
365
+ keywordResearchId?: string | null;
366
+ }
367
+ interface BulkUpdateKeywordResearchItemsRequest {
368
+ /**
369
+ * ID of the keyword research the items belong to.
370
+ *
371
+ * Use the `keywordResearchId` from your most recent read or write.
372
+ * @format GUID
373
+ */
374
+ keywordResearchId: string | null;
375
+ /**
376
+ * Keyword research items to update.
377
+ *
378
+ * Each item ID must appear at most once. The research holds at most 30
379
+ * keywords once the update is applied.
380
+ * @minSize 1
381
+ * @maxSize 1000
382
+ */
383
+ items?: UpdatedKeywordResearch[];
384
+ }
385
+ interface BulkUpdateKeywordResearchItemsResponse {
386
+ /**
387
+ * Result for each entry, correlated by `itemMetadata.originalIndex`.
388
+ * @maxSize 1000
389
+ */
390
+ results?: BulkKeywordResearchItemResult[];
391
+ /** How many entries succeeded and how many failed. */
392
+ bulkActionMetadata?: BulkActionMetadata;
393
+ /**
394
+ * The full set of keyword research items after the update.
395
+ * @maxSize 1000
396
+ */
397
+ keywordResearchItems?: KeywordResearch[];
398
+ /**
399
+ * ID of the keyword research holding the updated items.
400
+ *
401
+ * This can differ from the ID you sent, because the first edit to
402
+ * generated research copies it. Use this value for your next write.
403
+ * @format GUID
404
+ */
405
+ keywordResearchId?: string | null;
406
+ /** ID of the main keyword for each page, keyed by page ID. */
407
+ mainKeywordMap?: Record<string, string>;
408
+ }
409
+ interface ItemMetadata {
410
+ /**
411
+ * Item ID. Should always be available, unless it's impossible (for example, when failing to create an item).
412
+ * @maxLength 100
413
+ */
414
+ _id?: string | null;
415
+ /** Index of the item within the request array. Allows for correlation between request and response items. */
416
+ originalIndex?: number;
417
+ /** Whether the requested action was successful for this item. When `false`, the `error` field is populated. */
418
+ success?: boolean;
419
+ /** Details about the error in case of failure. */
420
+ error?: ApplicationError;
421
+ }
422
+ interface ApplicationError {
423
+ /** Error code. */
424
+ code?: string;
425
+ /** Description of the error. */
426
+ description?: string;
427
+ /** Data related to the error. */
428
+ data?: Record<string, any> | null;
429
+ }
430
+ interface BulkKeywordResearchItemResult {
431
+ /** Success/failure and error detail for this entry. */
432
+ itemMetadata?: ItemMetadata;
433
+ }
434
+ interface BulkActionMetadata {
435
+ /** Number of items that were successfully processed. */
436
+ totalSuccesses?: number;
437
+ /** Number of items that couldn't be processed. */
438
+ totalFailures?: number;
439
+ /** Number of failures without details because detailed failure threshold was exceeded. */
440
+ undetailedFailures?: number;
441
+ }
442
+ interface RevertKeywordResearchRequest {
443
+ /**
444
+ * id of the keyword research to revert
445
+ * @format GUID
446
+ */
447
+ keywordResearchId?: string | null;
448
+ }
449
+ interface RevertKeywordResearchResponse {
450
+ /**
451
+ * keyword research items
452
+ * @maxSize 1000
453
+ */
454
+ keywordResearchItems?: KeywordResearch[];
455
+ /**
456
+ * id of the keyword research that was returned
457
+ * @format GUID
458
+ */
459
+ keywordResearchId?: string | null;
460
+ }
461
+ interface DistributeKeywordsToPagesRequest {
462
+ /**
463
+ * Keywords to distribute
464
+ * @maxSize 1000
465
+ * @maxLength 1000
466
+ */
467
+ keywords?: string[];
468
+ /**
469
+ * Page essences to match keywords to
470
+ * @maxSize 1000
471
+ */
472
+ pageEssences?: PageEssenceInput[];
473
+ /**
474
+ * Embedding dimensions (e.g., "256", "512", "1024", "3072")
475
+ * @maxLength 4
476
+ */
477
+ dimensions?: string | null;
478
+ /** Similarity threshold (default 0.5) */
479
+ similarityThreshold?: number | null;
480
+ }
481
+ interface PageEssenceInput {
482
+ /**
483
+ * Page name
484
+ * @maxLength 1000
485
+ */
486
+ pageName?: string;
487
+ /**
488
+ * Page ID
489
+ * @maxLength 1000
490
+ */
491
+ pageId?: string;
492
+ /**
493
+ * Page essence (semantic summary)
494
+ * @maxLength 1000
495
+ */
496
+ pageEssence?: string;
497
+ /** Is homepage */
498
+ homepage?: boolean;
499
+ }
500
+ interface DistributeKeywordsToPagesResponse {
501
+ /**
502
+ * Distributed keywords with their assigned pages
503
+ * @maxSize 1000
504
+ */
505
+ distributedKeywords?: DistributedKeyword[];
506
+ }
507
+ interface DistributedKeyword {
508
+ /**
509
+ * The keyword
510
+ * @maxLength 1000
511
+ */
512
+ keyword?: string;
513
+ /**
514
+ * The assigned page ID
515
+ * @maxLength 1000
516
+ */
517
+ pageId?: string;
518
+ /** The similarity score */
519
+ score?: number;
520
+ }
521
+ /**
522
+ * Retrieves the keyword research behind the site's current content plan.
523
+ *
524
+ * Returns the research produced by the last completed generation. Research
525
+ * from a generation that's still running, or that failed, isn't readable.
526
+ * Poll Get Content Plan Flow until its status is `SUCCESS`, then call this
527
+ * method.
528
+ *
529
+ * The result is scoped to the site rather than to a flow. This method
530
+ * always returns the site's most recent research and can't target an
531
+ * earlier one. If another generation finishes between your trigger and this
532
+ * read, you receive the newer research instead. Compare `keywordResearchId`
533
+ * across reads to detect that the research was replaced.
534
+ *
535
+ * Omit `paging` to return every item in a single response. When `paging` is
536
+ * present, `limit` accepts 1 to 100 and defaults to 50.
537
+ *
538
+ * A site with no keyword research returns a not found error rather than an
539
+ * empty list.
540
+ * @public
541
+ * @documentationMaturity preview
542
+ * @permissionId promote:seo:v1:content_plan_keyword_research:list_keyword_research_items
543
+ * @applicableIdentity APP
544
+ * @fqn wix.promote.seo.content.plan.v1.KeywordResearchServiceV1.ListKeywordResearchItems
545
+ */
546
+ declare function listKeywordResearchItems(options?: ListKeywordResearchItemsOptions): Promise<NonNullablePaths<ListKeywordResearchItemsResponse, `keywordResearchItems`, 2>>;
547
+ interface ListKeywordResearchItemsOptions {
548
+ /**
549
+ * Reserved for future use.
550
+ *
551
+ * This method currently resolves the site's most recent keyword research,
552
+ * and this field is ignored.
553
+ * @format GUID
554
+ */
555
+ contentPlanFlowId?: string | null;
556
+ /**
557
+ * Cursor paging. Omit for the first page.
558
+ *
559
+ * Omit this object entirely to return every item in a single response.
560
+ */
561
+ paging?: CursorPaging;
562
+ }
563
+ /**
564
+ * Updates a keyword research item.
565
+ *
566
+ * `fieldMask` is required and must name at least one of `keyword` or
567
+ * `mainKeyword`. Those are the only writable fields, and an omitted or
568
+ * empty mask is rejected rather than treated as a request to write
569
+ * everything.
570
+ *
571
+ * `mainKeyword` only promotes. Set it to `true` to make the item its page's
572
+ * main keyword. Setting it to `false`, or leaving it out, changes nothing,
573
+ * so a main keyword can't be demoted with this method.
574
+ *
575
+ * This method updates an item that already exists. It can't add or delete a
576
+ * keyword.
577
+ *
578
+ * The first write to AI-generated research copies that research instead of
579
+ * changing it, so the response can carry a different `keywordResearchId`.
580
+ * Always send the ID from the most recent response on your next write.
581
+ * Sending the original ID again copies the research again.
582
+ *
583
+ * Changing `keyword` also refreshes that item's `searchVolume` and
584
+ * `competition`, even though the mask doesn't name them.
585
+ *
586
+ * Edits don't survive a later generation. A generation that completes after
587
+ * your edit produces fresh research that replaces the edited copy in every
588
+ * read.
589
+ *
590
+ * To update multiple keyword research items in a single API call, call
591
+ * [Bulk Update Keyword Research Items](https://dev.wix.com/docs/api-reference/business-management/seo/content-plan-keyword-research-v1/bulk-update-keyword-research-items).
592
+ * @param _id - ID of the keyword research item to update.
593
+ * @param keywordResearchId - ID of the keyword research the item belongs to.
594
+ *
595
+ * Use the `keywordResearchId` from your most recent read or write.
596
+ * @public
597
+ * @documentationMaturity preview
598
+ * @requiredField _id
599
+ * @requiredField keywordResearchId
600
+ * @requiredField options
601
+ * @requiredField options.fieldMask
602
+ * @requiredField options.item
603
+ * @permissionId promote:seo:v1:content_plan_keyword_research:update_keyword_research_item
604
+ * @applicableIdentity APP
605
+ * @fqn wix.promote.seo.content.plan.v1.KeywordResearchServiceV1.UpdateKeywordResearchItem
606
+ */
607
+ declare function updateKeywordResearchItem(_id: string, keywordResearchId: string, options: NonNullablePaths<UpdateKeywordResearchItemOptions, `fieldMask` | `item`, 2>): Promise<UpdateKeywordResearchItemResponse>;
608
+ interface UpdateKeywordResearchItemOptions {
609
+ item: {
610
+ /**
611
+ * ID of the keyword research item to update.
612
+ * @format GUID
613
+ */
614
+ _id?: string | null;
615
+ /**
616
+ * New keyword.
617
+ *
618
+ * Rejected if it's longer than 80 characters, or if it duplicates another
619
+ * keyword in the same research. Changing it also refreshes the item's
620
+ * `searchVolume` and `competition`.
621
+ * @maxLength 1000
622
+ */
623
+ keyword?: string | null;
624
+ /**
625
+ * Whether to make this item its page's main keyword.
626
+ *
627
+ * Set to `true` to promote it. `false` and omitting the field both leave
628
+ * the current main keyword unchanged, so this field can't demote one.
629
+ */
630
+ mainKeyword?: boolean | null;
631
+ };
632
+ /**
633
+ * Fields to update.
634
+ *
635
+ * Must name at least one of `keyword` or `mainKeyword`, the only writable
636
+ * fields. An omitted or empty mask is rejected.
637
+ */
638
+ fieldMask: string[];
639
+ }
640
+ /**
641
+ * Updates multiple keyword research items.
642
+ *
643
+ * This method has no field mask and writes every field present on each
644
+ * entry. `keyword` and `mainKeyword` remain the only writable fields, and
645
+ * `mainKeyword` only promotes, as it does for a single item. Repeating an
646
+ * item ID within one call is rejected.
647
+ *
648
+ * Validation runs across the whole request before anything is written, so a
649
+ * problem rejects the entire call rather than failing one entry. Every
650
+ * returned entry therefore reports success.
651
+ *
652
+ * A keyword research holds at most 30 keywords, counted after the update.
653
+ * That limit is reached well before the request's own item limit.
654
+ *
655
+ * This method copies AI-generated research the same way a single-item
656
+ * update does, so send the `keywordResearchId` from the response on your
657
+ * next write. Edits don't survive a later generation.
658
+ *
659
+ * To update a single keyword research item, call
660
+ * [Update Keyword Research Item](https://dev.wix.com/docs/api-reference/business-management/seo/content-plan-keyword-research-v1/update-keyword-research-item).
661
+ * @param keywordResearchId - ID of the keyword research the items belong to.
662
+ *
663
+ * Use the `keywordResearchId` from your most recent read or write.
664
+ * @public
665
+ * @documentationMaturity preview
666
+ * @requiredField keywordResearchId
667
+ * @permissionId promote:seo:v1:content_plan_keyword_research:bulk_update_keyword_research_items
668
+ * @applicableIdentity APP
669
+ * @fqn wix.promote.seo.content.plan.v1.KeywordResearchServiceV1.BulkUpdateKeywordResearchItems
670
+ */
671
+ declare function bulkUpdateKeywordResearchItems(keywordResearchId: string, options?: BulkUpdateKeywordResearchItemsOptions): Promise<NonNullablePaths<BulkUpdateKeywordResearchItemsResponse, `results` | `results.${number}.itemMetadata.originalIndex` | `results.${number}.itemMetadata.success` | `results.${number}.itemMetadata.error.code` | `results.${number}.itemMetadata.error.description` | `bulkActionMetadata.totalSuccesses` | `bulkActionMetadata.totalFailures` | `bulkActionMetadata.undetailedFailures` | `keywordResearchItems`, 6>>;
672
+ interface BulkUpdateKeywordResearchItemsOptions {
673
+ /**
674
+ * Keyword research items to update.
675
+ *
676
+ * Each item ID must appear at most once. The research holds at most 30
677
+ * keywords once the update is applied.
678
+ * @minSize 1
679
+ * @maxSize 1000
680
+ */
681
+ items?: UpdatedKeywordResearch[];
682
+ }
683
+
684
+ export { type AddedKeywordResearch, type ApplicationError, type BulkActionMetadata, type BulkKeywordResearchItemResult, type BulkUpdateKeywordResearchItemsOptions, type BulkUpdateKeywordResearchItemsRequest, type BulkUpdateKeywordResearchItemsResponse, type CursorPaging, type CursorPagingMetadata, type Cursors, type DeletedKeywordResearch, type DistributeKeywordsToPagesRequest, type DistributeKeywordsToPagesResponse, type DistributedKeyword, type GetDraftKeywordResearchItemsRequest, type GetDraftKeywordResearchItemsResponse, type GetKeywordResearchItemsByPageIdRequest, type GetKeywordResearchItemsByPageIdResponse, type GetKeywordResearchItemsRequest, type GetKeywordResearchItemsResponse, type ItemMetadata, type KeywordResearch, type ListKeywordResearchItemsOptions, type ListKeywordResearchItemsRequest, type ListKeywordResearchItemsResponse, type PageEssenceInput, type RevertKeywordResearchRequest, type RevertKeywordResearchResponse, type UpdateKeywordResearchItemOptions, type UpdateKeywordResearchItemRequest, type UpdateKeywordResearchItemResponse, type UpdateKeywordResearchItemsRequest, type UpdateKeywordResearchItemsResponse, type UpdatedKeywordResearch, bulkUpdateKeywordResearchItems, listKeywordResearchItems, updateKeywordResearchItem };