@seekora-ai/search-sdk 0.2.21 → 0.2.23

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,781 @@
1
+ /**
2
+ * This file was auto-generated by openapi-typescript.
3
+ * Do not make direct changes to the file.
4
+ */
5
+ export interface paths {
6
+ readonly "/v1/batch": {
7
+ readonly parameters: {
8
+ readonly query?: never;
9
+ readonly header?: never;
10
+ readonly path?: never;
11
+ readonly cookie?: never;
12
+ };
13
+ readonly get?: never;
14
+ readonly put?: never;
15
+ /**
16
+ * Storefront analytics batch ingest
17
+ * @description Per Segment Spec — wraps an array of events. Bulker batches by
18
+ * `frequency: 1` minute (or `BatchSize` event count, whichever first).
19
+ */
20
+ readonly post: operations["ingestBatch"];
21
+ readonly delete?: never;
22
+ readonly options?: never;
23
+ readonly head?: never;
24
+ readonly patch?: never;
25
+ readonly trace?: never;
26
+ };
27
+ }
28
+ export type webhooks = Record<string, never>;
29
+ export interface components {
30
+ schemas: {
31
+ /**
32
+ * Format: uuid
33
+ * @description Canonical search-tree root. UUID v4 minted by go-backend `/v1/search`
34
+ * (`SearchRoute.go:324`). Threaded onto every downstream clickstream event
35
+ * emitted within 30 min of the originating search via in-memory →
36
+ * sessionStorage → URL `?seekora_sid=` resolution chain.
37
+ * NULL/absent for events outside any search context.
38
+ * @example a1b2c3d4-e5f6-4a5b-9c8d-7e6f5a4b3c2d
39
+ */
40
+ readonly SearchId: string;
41
+ /**
42
+ * Format: uuid
43
+ * @description Client-minted UUID v4 stamped on Suggestion Clicked. Subsequent
44
+ * Search Submitted that was triggered by this suggestion carries
45
+ * this value in `triggered_by_suggestion_id` for attribution.
46
+ */
47
+ readonly SuggestionEventId: string;
48
+ /**
49
+ * Format: uuid
50
+ * @description On `Search Refined` events only. The previous (now-replaced) search_id
51
+ * that this refinement evolved FROM. Together with `search_id` (the new
52
+ * one), captures the search-refinement chain.
53
+ */
54
+ readonly FromSearchId: string;
55
+ /**
56
+ * @description Segment Spec unique-event identifier. Acts as PRIMARY KEY in
57
+ * ReplicatedReplacingMergeTree event tables — duplicate inserts collapse.
58
+ * Auto-set by analytics-next/-node SDKs if not provided.
59
+ */
60
+ readonly MessageId: string;
61
+ /**
62
+ * @description Segment Spec per-device identifier. Pattern matches Algolia's userToken
63
+ * constraint for cross-tool compatibility.
64
+ */
65
+ readonly AnonymousId: string;
66
+ /**
67
+ * @description Segment Spec authenticated-user identifier. NULL for anonymous users.
68
+ * Same pattern as anonymousId (Algolia's authenticatedUserToken constraint).
69
+ */
70
+ readonly UserId: string | null;
71
+ /**
72
+ * @description Seekora org-level tenant code. Stamped by `seekora-tenant-stamp` Rotor
73
+ * function from `ctx.stream.orgcode`. Lands in `context_orgcode` column.
74
+ */
75
+ readonly OrgCode: string;
76
+ /**
77
+ * @description Seekora store-level tenant identifier. Stamped by `seekora-tenant-stamp`
78
+ * from `ctx.stream.xstoreid`. Lands in `context_xstoreid` column. Required
79
+ * on every event for tenant isolation in queries.
80
+ */
81
+ readonly XStoreId: string;
82
+ /**
83
+ * @description Producer-surface discriminator. Set by `seekora-source-infer` if not
84
+ * already present on the event.
85
+ * @enum {string}
86
+ */
87
+ readonly Source: "shopify_web_pixel" | "search_sdk" | "ui_sdk" | "theme_embed" | "rotor_synthesized_orderline" | "unknown";
88
+ /**
89
+ * @description Engine-agnostic item identifier. Examples: Shopify SKU/product_id,
90
+ * document UUID, article slug, video ID. Replaces Algolia's `objectIDs[]`
91
+ * with a scalar (we emit per-row events for 1:N query friendliness).
92
+ */
93
+ readonly ObjectId: string;
94
+ /**
95
+ * @description Vertical discriminator. Lets analytics queries filter by item kind
96
+ * when needed without splitting tables.
97
+ * @enum {string}
98
+ */
99
+ readonly ObjectType: "product" | "document" | "article" | "video" | "service" | "recipe" | "listing" | "content" | "other";
100
+ /**
101
+ * Format: uint16
102
+ * @description 1-indexed result-list position (matches Algolia's positions[] convention).
103
+ * Position 13 = 3rd result on page 2 (10/page) — absolute across pages,
104
+ * NOT page-relative.
105
+ */
106
+ readonly Position: number;
107
+ /**
108
+ * @description Where in the storefront UI the event fired.
109
+ * @enum {string}
110
+ */
111
+ readonly Surface: "results_page" | "dropdown" | "recommendation_widget" | "pdp_related" | "cart_recommendation" | "shopify_pdp" | "shopify_collection" | "shopify_cart" | "shopify_checkout";
112
+ /**
113
+ * @description User-entered search query. Stripped of leading/trailing whitespace by
114
+ * the producer before emission.
115
+ */
116
+ readonly Query: string;
117
+ /**
118
+ * Format: uint32
119
+ * @description Number of hits returned by the search engine for this query.
120
+ */
121
+ readonly NumFound: number;
122
+ /**
123
+ * Format: uint32
124
+ * @description 1-indexed page number for paginated searches.
125
+ * @default 1
126
+ */
127
+ readonly Page: number;
128
+ /**
129
+ * @description Sort key applied (e.g. "price:asc", "relevance", "newest").
130
+ * Free-form per merchant configuration.
131
+ */
132
+ readonly SortBy: string;
133
+ /**
134
+ * @description Active filter set at search time. Small array (typical < 10),
135
+ * OK to carry inline. Per-filter-change events fire separately
136
+ * as `Facet Applied` (1:N querying via JOIN).
137
+ * @example [
138
+ * "brand:Nike",
139
+ * "color:Red",
140
+ * "price:100%3A200"
141
+ * ]
142
+ */
143
+ readonly Filters: readonly string[];
144
+ /** @description Facet name (e.g. "brand", "color", "price"). */
145
+ readonly FilterAttribute: string;
146
+ /** @description Facet value (e.g. "Nike", "Red", "100:200"). URL-encoded. */
147
+ readonly FilterValue: string;
148
+ /**
149
+ * @description Whether the user applied or removed this facet.
150
+ * @enum {string}
151
+ */
152
+ readonly FilterAction: "apply" | "remove";
153
+ /**
154
+ * Format: decimal
155
+ * @description Decimal(18, 4) in ClickHouse. Always positive.
156
+ */
157
+ readonly Price: number;
158
+ /** Format: uint32 */
159
+ readonly Quantity: number;
160
+ /**
161
+ * @description ISO 4217 currency code.
162
+ * @example USD
163
+ */
164
+ readonly Currency: string;
165
+ readonly OrderId: string;
166
+ readonly CartId: string;
167
+ /**
168
+ * @description Conversion subtype taxonomy. Aligns with Algolia's Insights API
169
+ * `eventSubtype` enum for the two primary values (`addToCart`,
170
+ * `purchase`) so events can flow into Algolia-compatible pipelines
171
+ * without remap. Extended with three Seekora-only values
172
+ * (`wishlist`, `quick_view`, `save_for_later`) to capture
173
+ * soft-conversion intents Algolia does not model — keeping these
174
+ * as a typed extension (rather than free-form text) preserves
175
+ * richness when funnel queries JOIN on this field.
176
+ *
177
+ * Mapping:
178
+ * - `addToCart` — Algolia parity (Algolia: addToCart)
179
+ * - `purchase` — Algolia parity (Algolia: purchase)
180
+ * - `wishlist` — [Seekora extension] save-for-later list add
181
+ * - `quick_view` — [Seekora extension] quick-view modal open
182
+ * - `save_for_later` — [Seekora extension] move-from-cart to later
183
+ *
184
+ * Downstream funnel queries can JOIN on either subset:
185
+ * - Algolia-compatible: `WHERE conversion_type IN ('addToCart','purchase')`
186
+ * - Full Seekora taxonomy: any value above.
187
+ * @enum {string}
188
+ */
189
+ readonly ConversionType: "addToCart" | "purchase" | "wishlist" | "quick_view" | "save_for_later";
190
+ readonly OrderLineItem: {
191
+ readonly object_id: components["schemas"]["ObjectId"];
192
+ /** @description Algolia objectData[].price equivalent. Decimal(18,4). */
193
+ readonly price: components["schemas"]["Price"];
194
+ /** @description Algolia objectData[].quantity equivalent. */
195
+ readonly quantity: components["schemas"]["Quantity"];
196
+ /** @description Algolia objectData[].discount equivalent. Absolute discount per line (NOT a percentage). Optional. */
197
+ readonly discount?: components["schemas"]["Price"];
198
+ /** @description Algolia objectData[].queryID equivalent — per-item search attribution. Closes the multi-search-order gap: when a cart contains items from different searches, each carries its own search_id. Optional (null for organic / non-attributable line items). */
199
+ readonly search_id?: components["schemas"]["SearchId"];
200
+ /** @description [Seekora extension] Vertical discriminator. Defaults to 'product' for ecommerce carts. */
201
+ readonly object_type?: components["schemas"]["ObjectType"];
202
+ /** @description [Seekora extension] ISO 4217 currency. Typically inherited from parent OrderCompleted.currency; override allowed for multi-currency carts. */
203
+ readonly currency?: components["schemas"]["Currency"];
204
+ /** @description Segment Spec ecommerce v2 line-item field. Optional. */
205
+ readonly sku?: string;
206
+ /** @description Segment Spec ecommerce v2 line-item field. Optional. */
207
+ readonly variant?: string;
208
+ };
209
+ readonly SuggestionText: string;
210
+ /** @enum {string} */
211
+ readonly SuggestionType: "query" | "product" | "category" | "brand";
212
+ /**
213
+ * @description The text the user had typed when the suggestion was clicked.
214
+ * Useful for autocomplete relevance analytics.
215
+ */
216
+ readonly QueryPrefix: string;
217
+ readonly Url: string;
218
+ readonly ImageUrl: string;
219
+ /**
220
+ * @description Segment Spec context block + Seekora additions. The tenant-stamp Rotor
221
+ * function fills `orgcode` and `xstoreid` from `ctx.props` (Rotor surfaces
222
+ * `link.data.functionsEnv` as `ctx.props` to UDFs); producer fills the
223
+ * rest. The search-id-infer Rotor function may also stamp
224
+ * `search_id_inferred` here when it recovers attribution via cross-event
225
+ * correlation.
226
+ */
227
+ readonly EventContext: {
228
+ readonly orgcode: components["schemas"]["OrgCode"];
229
+ readonly xstoreid: components["schemas"]["XStoreId"];
230
+ /** @description Numeric org id stamped by tenant-stamp from ctx.props */
231
+ readonly seekora_org_id?: number;
232
+ /**
233
+ * @description Marker stamped by the `seekora-search-id-infer` Rotor function when the
234
+ * event arrived WITHOUT a producer-resolved search_id but a matching
235
+ * (xstoreid, anonymous_id, object_id) tuple was found in the
236
+ * 1-hour-TTL Redis cache (populated by prior Object Clicked / Object
237
+ * Viewed / Search Impression events). Absent/false on events whose
238
+ * search_id came from the 3-layer producer chain (in-memory ->
239
+ * sessionStorage -> URL ?seekora_sid). V4 read endpoints accept
240
+ * `?include_inferred_attribution=false` to filter these out for
241
+ * strict last-click attribution.
242
+ */
243
+ readonly search_id_inferred?: boolean;
244
+ /** @description Client IP (analytics-next auto-fills via fetch) */
245
+ readonly ip?: string;
246
+ readonly userAgent?: string;
247
+ readonly locale?: string;
248
+ readonly page?: {
249
+ readonly url?: string;
250
+ readonly referrer?: string;
251
+ readonly title?: string;
252
+ readonly path?: string;
253
+ /** @description URL query-string portion */
254
+ readonly search?: string;
255
+ };
256
+ readonly campaign?: {
257
+ readonly source?: string;
258
+ readonly medium?: string;
259
+ readonly name?: string;
260
+ readonly term?: string;
261
+ readonly content?: string;
262
+ };
263
+ };
264
+ readonly BaseTrackEvent: {
265
+ /** @enum {string} */
266
+ readonly type: "track";
267
+ readonly event: string;
268
+ readonly messageId: components["schemas"]["MessageId"];
269
+ /** Format: date-time */
270
+ readonly timestamp: string;
271
+ /** Format: date-time */
272
+ readonly sentAt?: string | null;
273
+ readonly anonymousId: components["schemas"]["AnonymousId"];
274
+ readonly userId?: components["schemas"]["UserId"];
275
+ readonly context: components["schemas"]["EventContext"];
276
+ /** @description Event-specific properties (specialized per event schema below) */
277
+ readonly properties: Record<string, never>;
278
+ };
279
+ readonly ObjectClickedProperties: {
280
+ readonly object_id: components["schemas"]["ObjectId"];
281
+ readonly position: components["schemas"]["Position"];
282
+ readonly search_id: components["schemas"]["SearchId"];
283
+ /** @description [Seekora extension] Vertical discriminator. */
284
+ readonly object_type?: components["schemas"]["ObjectType"];
285
+ /** @description [Seekora extension] Storefront UI surface. */
286
+ readonly surface?: components["schemas"]["Surface"];
287
+ /** @description [Seekora extension] Pipeline provenance, set by source-infer Rotor function. */
288
+ readonly _source: components["schemas"]["Source"];
289
+ };
290
+ readonly ObjectClicked: components["schemas"]["BaseTrackEvent"] & {
291
+ /** @enum {string} */
292
+ readonly event?: "Object Clicked";
293
+ readonly properties?: components["schemas"]["ObjectClickedProperties"];
294
+ } & {
295
+ /**
296
+ * @description discriminator enum property added by openapi-typescript
297
+ * @enum {string}
298
+ */
299
+ readonly event: "Object Clicked";
300
+ };
301
+ readonly ObjectClickedOutsideSearchProperties: {
302
+ readonly object_id: components["schemas"]["ObjectId"];
303
+ /** @description [Seekora extension] */
304
+ readonly object_type?: components["schemas"]["ObjectType"];
305
+ /** @description [Seekora extension] */
306
+ readonly surface?: components["schemas"]["Surface"];
307
+ /** @description [Seekora extension] */
308
+ readonly _source: components["schemas"]["Source"];
309
+ };
310
+ readonly ObjectClickedOutsideSearch: components["schemas"]["BaseTrackEvent"] & {
311
+ /** @enum {string} */
312
+ readonly event?: "Object Clicked (Outside Search)";
313
+ readonly properties?: components["schemas"]["ObjectClickedOutsideSearchProperties"];
314
+ } & {
315
+ /**
316
+ * @description discriminator enum property added by openapi-typescript
317
+ * @enum {string}
318
+ */
319
+ readonly event: "Object Clicked (Outside Search)";
320
+ };
321
+ readonly FacetAppliedProperties: {
322
+ readonly filter_attribute: components["schemas"]["FilterAttribute"];
323
+ readonly filter_value: components["schemas"]["FilterValue"];
324
+ /** @description [Seekora extension] Algolia only models clicks; we capture apply/remove distinction. */
325
+ readonly action: components["schemas"]["FilterAction"];
326
+ /** @description [Seekora extension] Joins facet to its originating search for funnel queries. */
327
+ readonly search_id?: components["schemas"]["SearchId"];
328
+ /** @description [Seekora extension] */
329
+ readonly surface?: components["schemas"]["Surface"];
330
+ /** @description [Seekora extension] */
331
+ readonly _source: components["schemas"]["Source"];
332
+ };
333
+ readonly FacetApplied: components["schemas"]["BaseTrackEvent"] & {
334
+ /** @enum {string} */
335
+ readonly event?: "Facet Applied";
336
+ readonly properties?: components["schemas"]["FacetAppliedProperties"];
337
+ } & {
338
+ /**
339
+ * @description discriminator enum property added by openapi-typescript
340
+ * @enum {string}
341
+ */
342
+ readonly event: "Facet Applied";
343
+ };
344
+ readonly ObjectConvertedProperties: {
345
+ readonly object_id: components["schemas"]["ObjectId"];
346
+ readonly search_id: components["schemas"]["SearchId"];
347
+ readonly value?: components["schemas"]["Price"];
348
+ readonly currency?: components["schemas"]["Currency"];
349
+ /** @description Algolia eventSubtype equivalent. Two values align with Algolia (addToCart, purchase); Seekora extends with wishlist/quick_view/save_for_later for soft-conversion intents Algolia doesn't model. Optional — absent on bare conversion events. */
350
+ readonly conversion_type?: components["schemas"]["ConversionType"];
351
+ /** @description [Seekora extension] */
352
+ readonly object_type?: components["schemas"]["ObjectType"];
353
+ /** @description [Seekora extension] */
354
+ readonly _source: components["schemas"]["Source"];
355
+ };
356
+ readonly ObjectConverted: components["schemas"]["BaseTrackEvent"] & {
357
+ /** @enum {string} */
358
+ readonly event?: "Object Converted";
359
+ readonly properties?: components["schemas"]["ObjectConvertedProperties"];
360
+ } & {
361
+ /**
362
+ * @description discriminator enum property added by openapi-typescript
363
+ * @enum {string}
364
+ */
365
+ readonly event: "Object Converted";
366
+ };
367
+ readonly ObjectConvertedOutsideSearchProperties: {
368
+ readonly object_id: components["schemas"]["ObjectId"];
369
+ readonly value?: components["schemas"]["Price"];
370
+ readonly currency?: components["schemas"]["Currency"];
371
+ /** @description Algolia eventSubtype equivalent. Two values align with Algolia (addToCart, purchase); Seekora extends with wishlist/quick_view/save_for_later for soft-conversion intents Algolia doesn't model. Optional. */
372
+ readonly conversion_type?: components["schemas"]["ConversionType"];
373
+ /** @description [Seekora extension] */
374
+ readonly object_type?: components["schemas"]["ObjectType"];
375
+ /** @description [Seekora extension] */
376
+ readonly _source: components["schemas"]["Source"];
377
+ };
378
+ readonly ObjectConvertedOutsideSearch: components["schemas"]["BaseTrackEvent"] & {
379
+ /** @enum {string} */
380
+ readonly event?: "Object Converted (Outside Search)";
381
+ readonly properties?: components["schemas"]["ObjectConvertedOutsideSearchProperties"];
382
+ } & {
383
+ /**
384
+ * @description discriminator enum property added by openapi-typescript
385
+ * @enum {string}
386
+ */
387
+ readonly event: "Object Converted (Outside Search)";
388
+ };
389
+ readonly FilterConvertedProperties: {
390
+ readonly filter_attribute: components["schemas"]["FilterAttribute"];
391
+ readonly filter_value: components["schemas"]["FilterValue"];
392
+ readonly value?: components["schemas"]["Price"];
393
+ readonly currency?: components["schemas"]["Currency"];
394
+ /** @description Algolia eventSubtype equivalent. Two values align with Algolia (addToCart, purchase); Seekora extends with wishlist/quick_view/save_for_later for soft-conversion intents Algolia doesn't model. Optional. */
395
+ readonly conversion_type?: components["schemas"]["ConversionType"];
396
+ /** @description [Seekora extension] queryID not present on ConvertedFilters in Algolia; added for funnel attribution. */
397
+ readonly search_id?: components["schemas"]["SearchId"];
398
+ /** @description [Seekora extension] */
399
+ readonly _source: components["schemas"]["Source"];
400
+ };
401
+ readonly FilterConverted: components["schemas"]["BaseTrackEvent"] & {
402
+ /** @enum {string} */
403
+ readonly event?: "Filter Converted";
404
+ readonly properties?: components["schemas"]["FilterConvertedProperties"];
405
+ } & {
406
+ /**
407
+ * @description discriminator enum property added by openapi-typescript
408
+ * @enum {string}
409
+ */
410
+ readonly event: "Filter Converted";
411
+ };
412
+ readonly ProductAddedProperties: {
413
+ /** @description Segment Spec ecommerce v2 field — Shopify Web Pixel emits this name. */
414
+ readonly product_id: components["schemas"]["ObjectId"];
415
+ readonly variant?: string;
416
+ readonly sku?: string;
417
+ readonly name?: string;
418
+ readonly price: components["schemas"]["Price"];
419
+ readonly quantity: components["schemas"]["Quantity"];
420
+ readonly currency: components["schemas"]["Currency"];
421
+ readonly cart_id?: components["schemas"]["CartId"];
422
+ readonly brand?: string;
423
+ readonly category?: string;
424
+ readonly image_url?: components["schemas"]["ImageUrl"];
425
+ readonly url?: components["schemas"]["Url"];
426
+ /** @description [Seekora extension] Canonical item identifier — set to product_id by Layer 2 object-canonicalize Rotor function. */
427
+ readonly object_id?: components["schemas"]["ObjectId"];
428
+ /** @description [Seekora extension] Always 'product' for Shopify Web Pixel events. */
429
+ readonly object_type?: components["schemas"]["ObjectType"];
430
+ /** @description [Seekora extension] Stamped by Web Pixel mapper if URL ?seekora_sid is present + within 30-min TTL. */
431
+ readonly search_id?: components["schemas"]["SearchId"];
432
+ /** @description [Seekora extension] */
433
+ readonly _source: components["schemas"]["Source"];
434
+ };
435
+ readonly ProductAdded: components["schemas"]["BaseTrackEvent"] & {
436
+ /** @enum {string} */
437
+ readonly event?: "Product Added";
438
+ readonly properties?: components["schemas"]["ProductAddedProperties"];
439
+ } & {
440
+ /**
441
+ * @description discriminator enum property added by openapi-typescript
442
+ * @enum {string}
443
+ */
444
+ readonly event: "Product Added";
445
+ };
446
+ /**
447
+ * @description Segment Spec ecommerce v2 products[] line-item shape. Used inside Order Completed.products[].
448
+ * Source: https://segment.com/docs/connections/spec/ecommerce/v2/#order-completed
449
+ * Rotor's orderline-explode function fans these out into Order Line Completed events.
450
+ * NOTE: search_id field is a Seekora extension (carried from Product Added attribution).
451
+ */
452
+ readonly OrderProduct: {
453
+ readonly product_id: components["schemas"]["ObjectId"];
454
+ readonly name?: string;
455
+ readonly sku?: string;
456
+ readonly variant?: string;
457
+ readonly quantity: components["schemas"]["Quantity"];
458
+ readonly price: components["schemas"]["Price"];
459
+ readonly category?: string;
460
+ readonly brand?: string;
461
+ readonly url?: components["schemas"]["Url"];
462
+ /** @description [Seekora extension] Search attribution for this line item, carried forward from Product Added time. */
463
+ readonly search_id?: components["schemas"]["SearchId"];
464
+ };
465
+ readonly OrderCompletedProperties: {
466
+ readonly order_id: components["schemas"]["OrderId"];
467
+ readonly total: components["schemas"]["Price"];
468
+ readonly currency: components["schemas"]["Currency"];
469
+ readonly revenue?: components["schemas"]["Price"];
470
+ readonly tax?: components["schemas"]["Price"];
471
+ readonly shipping?: components["schemas"]["Price"];
472
+ readonly discount?: components["schemas"]["Price"];
473
+ readonly coupon?: string;
474
+ readonly products: readonly components["schemas"]["OrderProduct"][];
475
+ /**
476
+ * @description [Seekora extension of Algolia objectData[]] Per-line item detail with
477
+ * optional per-line search_id (Algolia queryID equivalent) for
478
+ * multi-search order attribution. When a cart contains items from
479
+ * different searches, each line carries its own search_id; the parent
480
+ * `search_ids[]` field below is the dedup'd aggregate of these values.
481
+ *
482
+ * The rotor's `seekora-orderline-explode` function fans this array
483
+ * into per-row `Order Line Completed` events; consumers querying the
484
+ * parent `Order Completed` can read `object_data` directly without
485
+ * JOINing back to the per-line event table.
486
+ *
487
+ * NOT required (legacy emitters without line-item depth keep working).
488
+ * When present, `object_data[i].currency` may override the parent
489
+ * `currency` for multi-currency carts; otherwise it is inherited.
490
+ */
491
+ readonly object_data?: readonly components["schemas"]["OrderLineItem"][];
492
+ /**
493
+ * @description [Seekora extension] Derived aggregate: distinct, non-null search_ids
494
+ * across `object_data[]` (and `products[].search_id` for legacy
495
+ * payloads). Useful for the quick boolean "was this order
496
+ * search-attributed at all?" filter without unnesting object_data.
497
+ * For per-item attribution detail (which item came from which
498
+ * search), read `object_data[].search_id` instead.
499
+ */
500
+ readonly search_ids?: readonly components["schemas"]["SearchId"][];
501
+ /** @description [Seekora extension] */
502
+ readonly _source: components["schemas"]["Source"];
503
+ };
504
+ readonly OrderCompleted: components["schemas"]["BaseTrackEvent"] & {
505
+ /** @enum {string} */
506
+ readonly event?: "Order Completed";
507
+ readonly properties?: components["schemas"]["OrderCompletedProperties"];
508
+ } & {
509
+ /**
510
+ * @description discriminator enum property added by openapi-typescript
511
+ * @enum {string}
512
+ */
513
+ readonly event: "Order Completed";
514
+ };
515
+ readonly OrderLineCompletedProperties: {
516
+ readonly order_id: components["schemas"]["OrderId"];
517
+ readonly object_id: components["schemas"]["ObjectId"];
518
+ readonly object_type?: components["schemas"]["ObjectType"];
519
+ /**
520
+ * Format: uint16
521
+ * @description 0-indexed position in the parent Order Completed.products[]
522
+ */
523
+ readonly line_position: number;
524
+ readonly quantity: components["schemas"]["Quantity"];
525
+ readonly price: components["schemas"]["Price"];
526
+ readonly currency: components["schemas"]["Currency"];
527
+ /** @description Search attribution for this line item (carried from Product Added). Nullable if no attributable search. */
528
+ readonly search_id?: components["schemas"]["SearchId"];
529
+ /**
530
+ * @description Always rotor_synthesized_orderline. Distinguishes from any client-emitted line events.
531
+ * @enum {string}
532
+ */
533
+ readonly _source: "rotor_synthesized_orderline";
534
+ };
535
+ readonly OrderLineCompleted: components["schemas"]["BaseTrackEvent"] & {
536
+ /** @enum {string} */
537
+ readonly event?: "Order Line Completed";
538
+ readonly properties?: components["schemas"]["OrderLineCompletedProperties"];
539
+ } & {
540
+ /**
541
+ * @description discriminator enum property added by openapi-typescript
542
+ * @enum {string}
543
+ */
544
+ readonly event: "Order Line Completed";
545
+ };
546
+ readonly ProductViewedProperties: {
547
+ readonly product_id: components["schemas"]["ObjectId"];
548
+ readonly variant?: string;
549
+ readonly sku?: string;
550
+ readonly name?: string;
551
+ readonly price?: components["schemas"]["Price"];
552
+ readonly currency?: components["schemas"]["Currency"];
553
+ readonly brand?: string;
554
+ readonly category?: string;
555
+ readonly url?: components["schemas"]["Url"];
556
+ readonly image_url?: components["schemas"]["ImageUrl"];
557
+ /** @description [Seekora extension] Canonical = product_id (set by Layer 2 Rotor function). */
558
+ readonly object_id?: components["schemas"]["ObjectId"];
559
+ /** @description [Seekora extension] Always 'product' for Shopify Web Pixel events. */
560
+ readonly object_type?: components["schemas"]["ObjectType"];
561
+ /** @description [Seekora extension] Stamped from URL ?seekora_sid if within 30-min TTL. */
562
+ readonly search_id?: components["schemas"]["SearchId"];
563
+ /** @description [Seekora extension] */
564
+ readonly _source: components["schemas"]["Source"];
565
+ };
566
+ readonly ProductViewed: components["schemas"]["BaseTrackEvent"] & {
567
+ /** @enum {string} */
568
+ readonly event?: "Product Viewed";
569
+ readonly properties?: components["schemas"]["ProductViewedProperties"];
570
+ } & {
571
+ /**
572
+ * @description discriminator enum property added by openapi-typescript
573
+ * @enum {string}
574
+ */
575
+ readonly event: "Product Viewed";
576
+ };
577
+ readonly ObjectViewedProperties: {
578
+ readonly object_id: components["schemas"]["ObjectId"];
579
+ /** @description [Seekora extension] */
580
+ readonly object_type?: components["schemas"]["ObjectType"];
581
+ /** @description [Seekora extension] Search-tree attribution. */
582
+ readonly search_id?: components["schemas"]["SearchId"];
583
+ /** @description [Seekora extension] */
584
+ readonly surface?: components["schemas"]["Surface"];
585
+ /** @description [Seekora extension] */
586
+ readonly _source: components["schemas"]["Source"];
587
+ };
588
+ readonly ObjectViewed: components["schemas"]["BaseTrackEvent"] & {
589
+ /** @enum {string} */
590
+ readonly event?: "Object Viewed";
591
+ readonly properties?: components["schemas"]["ObjectViewedProperties"];
592
+ } & {
593
+ /**
594
+ * @description discriminator enum property added by openapi-typescript
595
+ * @enum {string}
596
+ */
597
+ readonly event: "Object Viewed";
598
+ };
599
+ readonly FilterViewedProperties: {
600
+ readonly filter_attribute: components["schemas"]["FilterAttribute"];
601
+ readonly filter_value?: components["schemas"]["FilterValue"];
602
+ /** @description [Seekora extension] */
603
+ readonly search_id?: components["schemas"]["SearchId"];
604
+ /** @description [Seekora extension] */
605
+ readonly _source: components["schemas"]["Source"];
606
+ };
607
+ readonly FilterViewed: components["schemas"]["BaseTrackEvent"] & {
608
+ /** @enum {string} */
609
+ readonly event?: "Filter Viewed";
610
+ readonly properties?: components["schemas"]["FilterViewedProperties"];
611
+ } & {
612
+ /**
613
+ * @description discriminator enum property added by openapi-typescript
614
+ * @enum {string}
615
+ */
616
+ readonly event: "Filter Viewed";
617
+ };
618
+ readonly SearchSubmittedProperties: {
619
+ readonly search_id: components["schemas"]["SearchId"];
620
+ readonly query: components["schemas"]["Query"];
621
+ readonly num_found: components["schemas"]["NumFound"];
622
+ readonly page?: components["schemas"]["Page"];
623
+ readonly sort_by?: components["schemas"]["SortBy"];
624
+ readonly filters?: components["schemas"]["Filters"];
625
+ readonly surface?: components["schemas"]["Surface"];
626
+ /** @description Nullable. Present if user reached this search by clicking an autocomplete suggestion. */
627
+ readonly triggered_by_suggestion_id?: components["schemas"]["SuggestionEventId"];
628
+ readonly _source: components["schemas"]["Source"];
629
+ };
630
+ readonly SearchSubmitted: components["schemas"]["BaseTrackEvent"] & {
631
+ /** @enum {string} */
632
+ readonly event?: "Search Submitted";
633
+ readonly properties?: components["schemas"]["SearchSubmittedProperties"];
634
+ } & {
635
+ /**
636
+ * @description discriminator enum property added by openapi-typescript
637
+ * @enum {string}
638
+ */
639
+ readonly event: "Search Submitted";
640
+ };
641
+ readonly SearchImpressionProperties: {
642
+ readonly search_id: components["schemas"]["SearchId"];
643
+ readonly object_id: components["schemas"]["ObjectId"];
644
+ readonly object_type?: components["schemas"]["ObjectType"];
645
+ readonly position: components["schemas"]["Position"];
646
+ readonly surface: components["schemas"]["Surface"];
647
+ readonly _source: components["schemas"]["Source"];
648
+ };
649
+ readonly SearchImpression: components["schemas"]["BaseTrackEvent"] & {
650
+ /** @enum {string} */
651
+ readonly event?: "Search Impression";
652
+ readonly properties?: components["schemas"]["SearchImpressionProperties"];
653
+ } & {
654
+ /**
655
+ * @description discriminator enum property added by openapi-typescript
656
+ * @enum {string}
657
+ */
658
+ readonly event: "Search Impression";
659
+ };
660
+ readonly SearchRefinedProperties: {
661
+ /** @description The NEW search_id minted for the refined search */
662
+ readonly search_id: components["schemas"]["SearchId"];
663
+ /** @description The PREVIOUS search_id that this refinement evolved FROM */
664
+ readonly from_search_id: components["schemas"]["FromSearchId"];
665
+ readonly from_query: components["schemas"]["Query"];
666
+ readonly to_query: components["schemas"]["Query"];
667
+ readonly _source: components["schemas"]["Source"];
668
+ };
669
+ readonly SearchRefined: components["schemas"]["BaseTrackEvent"] & {
670
+ /** @enum {string} */
671
+ readonly event?: "Search Refined";
672
+ readonly properties?: components["schemas"]["SearchRefinedProperties"];
673
+ } & {
674
+ /**
675
+ * @description discriminator enum property added by openapi-typescript
676
+ * @enum {string}
677
+ */
678
+ readonly event: "Search Refined";
679
+ };
680
+ readonly SearchEmptyProperties: {
681
+ readonly search_id: components["schemas"]["SearchId"];
682
+ readonly query: components["schemas"]["Query"];
683
+ readonly filters?: components["schemas"]["Filters"];
684
+ readonly _source: components["schemas"]["Source"];
685
+ };
686
+ readonly SearchEmpty: components["schemas"]["BaseTrackEvent"] & {
687
+ /** @enum {string} */
688
+ readonly event?: "Search Empty";
689
+ readonly properties?: components["schemas"]["SearchEmptyProperties"];
690
+ } & {
691
+ /**
692
+ * @description discriminator enum property added by openapi-typescript
693
+ * @enum {string}
694
+ */
695
+ readonly event: "Search Empty";
696
+ };
697
+ readonly SuggestionClickedProperties: {
698
+ readonly suggestion_event_id: components["schemas"]["SuggestionEventId"];
699
+ readonly suggestion_text: components["schemas"]["SuggestionText"];
700
+ /** Format: uint16 */
701
+ readonly suggestion_position: number;
702
+ readonly suggestion_type: components["schemas"]["SuggestionType"];
703
+ readonly query_prefix?: components["schemas"]["QueryPrefix"];
704
+ /** @description Nullable. Only set when the suggestion click happened DURING an active search (clicking a related-suggestion below the results, for example). */
705
+ readonly search_id?: components["schemas"]["SearchId"];
706
+ readonly _source: components["schemas"]["Source"];
707
+ };
708
+ readonly SuggestionClicked: components["schemas"]["BaseTrackEvent"] & {
709
+ /** @enum {string} */
710
+ readonly event?: "Suggestion Clicked";
711
+ readonly properties?: components["schemas"]["SuggestionClickedProperties"];
712
+ } & {
713
+ /**
714
+ * @description discriminator enum property added by openapi-typescript
715
+ * @enum {string}
716
+ */
717
+ readonly event: "Suggestion Clicked";
718
+ };
719
+ readonly AnalyticsEvent: components["schemas"]["ObjectClicked"] | components["schemas"]["ObjectClickedOutsideSearch"] | components["schemas"]["FacetApplied"] | components["schemas"]["ObjectConverted"] | components["schemas"]["ObjectConvertedOutsideSearch"] | components["schemas"]["FilterConverted"] | components["schemas"]["ProductAdded"] | components["schemas"]["OrderCompleted"] | components["schemas"]["OrderLineCompleted"] | components["schemas"]["ProductViewed"] | components["schemas"]["ObjectViewed"] | components["schemas"]["FilterViewed"] | components["schemas"]["SearchSubmitted"] | components["schemas"]["SearchImpression"] | components["schemas"]["SearchRefined"] | components["schemas"]["SearchEmpty"] | components["schemas"]["SuggestionClicked"];
720
+ readonly BatchEnvelope: {
721
+ readonly batch: readonly components["schemas"]["AnalyticsEvent"][];
722
+ /**
723
+ * @description Stream-level write key (== Jitsu Stream.ID per SCRUM-263 convention).
724
+ * Per-tenant; provisioned by `RegisterJitsuHook`.
725
+ */
726
+ readonly writeKey: string;
727
+ /** Format: date-time */
728
+ readonly sentAt?: string;
729
+ };
730
+ };
731
+ responses: never;
732
+ parameters: never;
733
+ requestBodies: never;
734
+ headers: never;
735
+ pathItems: never;
736
+ }
737
+ export type $defs = Record<string, never>;
738
+ export interface operations {
739
+ readonly ingestBatch: {
740
+ readonly parameters: {
741
+ readonly query?: never;
742
+ readonly header?: never;
743
+ readonly path?: never;
744
+ readonly cookie?: never;
745
+ };
746
+ readonly requestBody: {
747
+ readonly content: {
748
+ readonly "application/json": components["schemas"]["BatchEnvelope"];
749
+ };
750
+ };
751
+ readonly responses: {
752
+ /** @description Accepted (events queued; downstream processing async) */
753
+ readonly 200: {
754
+ headers: {
755
+ readonly [name: string]: unknown;
756
+ };
757
+ content: {
758
+ readonly "application/json": {
759
+ readonly ok?: boolean;
760
+ /** @description count dropped by stream.deduplicateWindowMs */
761
+ readonly deduplicatedEvents?: number;
762
+ };
763
+ };
764
+ };
765
+ /** @description Invalid writeKey */
766
+ readonly 401: {
767
+ headers: {
768
+ readonly [name: string]: unknown;
769
+ };
770
+ content?: never;
771
+ };
772
+ /** @description Throttled — stream.throttle dropped this request */
773
+ readonly 402: {
774
+ headers: {
775
+ readonly [name: string]: unknown;
776
+ };
777
+ content?: never;
778
+ };
779
+ };
780
+ };
781
+ }