@redotech/redo-api-schema 2.2.427 → 2.2.435
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.
- package/lib/openapi.d.ts +372 -7
- package/lib/openapi.yaml +489 -8
- package/package.json +1 -1
package/lib/openapi.d.ts
CHANGED
|
@@ -184,6 +184,31 @@ export interface paths {
|
|
|
184
184
|
*/
|
|
185
185
|
get: operations["Invoice list"];
|
|
186
186
|
};
|
|
187
|
+
"/stores/{storeId}/products/bulk-upload": {
|
|
188
|
+
/**
|
|
189
|
+
* Bulk upload products (Beta)
|
|
190
|
+
* @description Bulk create or update product families and their variants.
|
|
191
|
+
*
|
|
192
|
+
* Submit up to 1,000 product families per request, each containing up to 100 variants.
|
|
193
|
+
* Products are processed asynchronously in batches. Only one bulk upload can run per store at a time.
|
|
194
|
+
*
|
|
195
|
+
* ## Matching Strategy
|
|
196
|
+
*
|
|
197
|
+
* The API uses the following priority to match incoming product families to existing records:
|
|
198
|
+
*
|
|
199
|
+
* 1. **`product_family_id`** — Redo product family ID (direct lookup)
|
|
200
|
+
* 2. **`external_id`** — ID from your external system
|
|
201
|
+
* 3. **SKU** — Matched via variant SKUs
|
|
202
|
+
*
|
|
203
|
+
* If no match is found, a new product family is created.
|
|
204
|
+
*
|
|
205
|
+
* ## Concurrency
|
|
206
|
+
*
|
|
207
|
+
* Only one bulk upload operation can run per store at a time. If a bulk upload is already
|
|
208
|
+
* in progress, the request will return a `409 Conflict` error.
|
|
209
|
+
*/
|
|
210
|
+
post: operations["Products bulk upload"];
|
|
211
|
+
};
|
|
187
212
|
"/stores/{storeId}/returns": {
|
|
188
213
|
/**
|
|
189
214
|
* List Returns
|
|
@@ -302,6 +327,279 @@ export interface components {
|
|
|
302
327
|
*/
|
|
303
328
|
state: string;
|
|
304
329
|
};
|
|
330
|
+
/**
|
|
331
|
+
* Product Family Image
|
|
332
|
+
* @description An image associated with a product family or variant.
|
|
333
|
+
*/
|
|
334
|
+
"bulk-product-family-image.schema": {
|
|
335
|
+
/**
|
|
336
|
+
* Alt Text
|
|
337
|
+
* @description Alt text for the image.
|
|
338
|
+
*/
|
|
339
|
+
alt_text: string;
|
|
340
|
+
/**
|
|
341
|
+
* URL
|
|
342
|
+
* Format: uri
|
|
343
|
+
* @description URL of the image.
|
|
344
|
+
*/
|
|
345
|
+
url: string;
|
|
346
|
+
};
|
|
347
|
+
/**
|
|
348
|
+
* Product Family Option
|
|
349
|
+
* @description A product option (e.g. Size, Color) with its possible values.
|
|
350
|
+
*/
|
|
351
|
+
"bulk-product-family-option.schema": {
|
|
352
|
+
/**
|
|
353
|
+
* Name
|
|
354
|
+
* @description Option name (e.g. "Size", "Color").
|
|
355
|
+
*/
|
|
356
|
+
name: string;
|
|
357
|
+
/**
|
|
358
|
+
* Values
|
|
359
|
+
* @description Possible values for this option (e.g. ["Small", "Medium", "Large"]).
|
|
360
|
+
*/
|
|
361
|
+
values: string[];
|
|
362
|
+
};
|
|
363
|
+
/**
|
|
364
|
+
* Bulk Product Family
|
|
365
|
+
* @description A product family containing one or more variants.
|
|
366
|
+
*
|
|
367
|
+
* Matching priority for existing product families:
|
|
368
|
+
* 1. `product_family_id` — Redo product family ID (direct lookup)
|
|
369
|
+
* 2. `external_id` — ID from your external system
|
|
370
|
+
* 3. SKU — Matched via variant SKUs
|
|
371
|
+
* If no match is found, a new product family is created.
|
|
372
|
+
*/
|
|
373
|
+
"bulk-product-family.schema": {
|
|
374
|
+
/**
|
|
375
|
+
* Description
|
|
376
|
+
* @description Product family description.
|
|
377
|
+
*/
|
|
378
|
+
description?: string;
|
|
379
|
+
/**
|
|
380
|
+
* External ID
|
|
381
|
+
* @description Product family ID in your external system. Second-priority match.
|
|
382
|
+
*/
|
|
383
|
+
external_id?: string;
|
|
384
|
+
/**
|
|
385
|
+
* Images
|
|
386
|
+
* @description Images for the product family.
|
|
387
|
+
*/
|
|
388
|
+
images?: components["schemas"]["bulk-product-family-image.schema"][];
|
|
389
|
+
/**
|
|
390
|
+
* Kind
|
|
391
|
+
* @description Whether the product is sellable or non-sellable.
|
|
392
|
+
* @default SELLABLE
|
|
393
|
+
* @enum {string}
|
|
394
|
+
*/
|
|
395
|
+
kind?: "SELLABLE" | "NON_SELLABLE";
|
|
396
|
+
/**
|
|
397
|
+
* Options
|
|
398
|
+
* @description Product options (e.g. Size, Color) with their possible values.
|
|
399
|
+
*/
|
|
400
|
+
options?: components["schemas"]["bulk-product-family-option.schema"][];
|
|
401
|
+
/**
|
|
402
|
+
* Product Family ID
|
|
403
|
+
* @description Redo product family ID. Highest-priority match for updating an existing product family.
|
|
404
|
+
*/
|
|
405
|
+
product_family_id?: string;
|
|
406
|
+
/**
|
|
407
|
+
* Tags
|
|
408
|
+
* @description Tags for categorization.
|
|
409
|
+
* @default []
|
|
410
|
+
*/
|
|
411
|
+
tags?: string[];
|
|
412
|
+
/**
|
|
413
|
+
* Title
|
|
414
|
+
* @description Product family title.
|
|
415
|
+
*/
|
|
416
|
+
title: string;
|
|
417
|
+
/**
|
|
418
|
+
* Variants
|
|
419
|
+
* @description Product variants. At least 1 and up to 100 per product family.
|
|
420
|
+
*/
|
|
421
|
+
variants: components["schemas"]["bulk-variant.schema"][];
|
|
422
|
+
/**
|
|
423
|
+
* Vendor
|
|
424
|
+
* @description Vendor or manufacturer name.
|
|
425
|
+
*/
|
|
426
|
+
vendor?: string;
|
|
427
|
+
};
|
|
428
|
+
/**
|
|
429
|
+
* Bulk Product Upload Request
|
|
430
|
+
* @description Request body for bulk uploading product families and their variants.
|
|
431
|
+
*/
|
|
432
|
+
"bulk-product-upload-request.schema": {
|
|
433
|
+
/**
|
|
434
|
+
* Products
|
|
435
|
+
* @description Product families to create or update. Between 1 and 1000 per request.
|
|
436
|
+
*/
|
|
437
|
+
products: components["schemas"]["bulk-product-family.schema"][];
|
|
438
|
+
};
|
|
439
|
+
/**
|
|
440
|
+
* Bulk Product Upload Response
|
|
441
|
+
* @description Response from a bulk product upload operation.
|
|
442
|
+
*/
|
|
443
|
+
"bulk-product-upload-response.schema": {
|
|
444
|
+
/**
|
|
445
|
+
* Error Count
|
|
446
|
+
* @description Number of product families that failed to process.
|
|
447
|
+
*/
|
|
448
|
+
error_count: number;
|
|
449
|
+
/**
|
|
450
|
+
* Processed Count
|
|
451
|
+
* @description Number of product families processed successfully.
|
|
452
|
+
*/
|
|
453
|
+
processed_count: number;
|
|
454
|
+
/**
|
|
455
|
+
* Results
|
|
456
|
+
* @description Per-product-family results.
|
|
457
|
+
*/
|
|
458
|
+
results: (OneOf<[{
|
|
459
|
+
/**
|
|
460
|
+
* Product Family ID
|
|
461
|
+
* @description Redo product family ID.
|
|
462
|
+
*/
|
|
463
|
+
product_family_id: string;
|
|
464
|
+
/**
|
|
465
|
+
* Products
|
|
466
|
+
* @description Variant results within this product family.
|
|
467
|
+
*/
|
|
468
|
+
products: {
|
|
469
|
+
/**
|
|
470
|
+
* ID
|
|
471
|
+
* @description Redo product ID.
|
|
472
|
+
*/
|
|
473
|
+
id: string;
|
|
474
|
+
/**
|
|
475
|
+
* SKU
|
|
476
|
+
* @description Product SKU.
|
|
477
|
+
*/
|
|
478
|
+
sku: string;
|
|
479
|
+
}[];
|
|
480
|
+
/**
|
|
481
|
+
* Status
|
|
482
|
+
* @description Whether the product family was created or updated.
|
|
483
|
+
* @enum {string}
|
|
484
|
+
*/
|
|
485
|
+
status: "created" | "updated";
|
|
486
|
+
}, {
|
|
487
|
+
/**
|
|
488
|
+
* Error
|
|
489
|
+
* @description Error message describing what went wrong.
|
|
490
|
+
*/
|
|
491
|
+
error: string;
|
|
492
|
+
/**
|
|
493
|
+
* Status
|
|
494
|
+
* @description Indicates an error occurred.
|
|
495
|
+
* @constant
|
|
496
|
+
*/
|
|
497
|
+
status: "error";
|
|
498
|
+
}]>)[];
|
|
499
|
+
/**
|
|
500
|
+
* Total Count
|
|
501
|
+
* @description Total number of product families in the request.
|
|
502
|
+
*/
|
|
503
|
+
total_count: number;
|
|
504
|
+
};
|
|
505
|
+
/**
|
|
506
|
+
* Bulk Variant
|
|
507
|
+
* @description A product variant within a product family.
|
|
508
|
+
*/
|
|
509
|
+
"bulk-variant.schema": {
|
|
510
|
+
/**
|
|
511
|
+
* Barcodes
|
|
512
|
+
* @description Additional barcodes for this variant.
|
|
513
|
+
*/
|
|
514
|
+
barcodes?: string[];
|
|
515
|
+
/**
|
|
516
|
+
* Currency
|
|
517
|
+
* @description Currency code (e.g. "USD").
|
|
518
|
+
*/
|
|
519
|
+
currency: string;
|
|
520
|
+
/**
|
|
521
|
+
* Dimension Unit
|
|
522
|
+
* @description Unit of dimension measurement.
|
|
523
|
+
* @enum {string}
|
|
524
|
+
*/
|
|
525
|
+
dimension_unit?: "in" | "cm";
|
|
526
|
+
/**
|
|
527
|
+
* External ID
|
|
528
|
+
* @description Variant ID in your external system. Used for matching if `id` is not provided.
|
|
529
|
+
*/
|
|
530
|
+
external_id?: string;
|
|
531
|
+
/**
|
|
532
|
+
* Height
|
|
533
|
+
* @description Height of the variant.
|
|
534
|
+
*/
|
|
535
|
+
height?: number;
|
|
536
|
+
/**
|
|
537
|
+
* HS Code
|
|
538
|
+
* @description Harmonized System code for customs.
|
|
539
|
+
*/
|
|
540
|
+
hs_code?: string;
|
|
541
|
+
/**
|
|
542
|
+
* ID
|
|
543
|
+
* @description Redo variant ID. Used for matching to an existing variant.
|
|
544
|
+
*/
|
|
545
|
+
id?: string;
|
|
546
|
+
/**
|
|
547
|
+
* Images
|
|
548
|
+
* @description Images specific to this variant.
|
|
549
|
+
*/
|
|
550
|
+
images?: components["schemas"]["bulk-product-family-image.schema"][];
|
|
551
|
+
/**
|
|
552
|
+
* Length
|
|
553
|
+
* @description Length of the variant.
|
|
554
|
+
*/
|
|
555
|
+
length?: number;
|
|
556
|
+
/**
|
|
557
|
+
* Option Values
|
|
558
|
+
* @description Values for each option defined on the product family, in the same order.
|
|
559
|
+
*/
|
|
560
|
+
option_values?: string[];
|
|
561
|
+
/**
|
|
562
|
+
* Origin Country
|
|
563
|
+
* @description Country of origin as an ISO 3166-1 alpha-2 code (e.g. "US").
|
|
564
|
+
*/
|
|
565
|
+
origin_country?: string;
|
|
566
|
+
/**
|
|
567
|
+
* Price
|
|
568
|
+
* @description Price in the smallest currency unit (e.g. cents for USD).
|
|
569
|
+
*/
|
|
570
|
+
price: number;
|
|
571
|
+
/**
|
|
572
|
+
* SKU
|
|
573
|
+
* @description Stock keeping unit. Required. Used for matching if neither `id` nor `external_id` are provided.
|
|
574
|
+
*/
|
|
575
|
+
sku: string;
|
|
576
|
+
/**
|
|
577
|
+
* Title
|
|
578
|
+
* @description Variant title (e.g. "Small / Blue").
|
|
579
|
+
*/
|
|
580
|
+
title?: string;
|
|
581
|
+
/**
|
|
582
|
+
* UPC
|
|
583
|
+
* @description Universal product code.
|
|
584
|
+
*/
|
|
585
|
+
upc?: string;
|
|
586
|
+
/**
|
|
587
|
+
* Weight
|
|
588
|
+
* @description Weight of the variant.
|
|
589
|
+
*/
|
|
590
|
+
weight?: number;
|
|
591
|
+
/**
|
|
592
|
+
* Weight Unit
|
|
593
|
+
* @description Unit of weight measurement.
|
|
594
|
+
* @enum {string}
|
|
595
|
+
*/
|
|
596
|
+
weight_unit?: "g" | "kg" | "lb" | "oz" | "t";
|
|
597
|
+
/**
|
|
598
|
+
* Width
|
|
599
|
+
* @description Width of the variant.
|
|
600
|
+
*/
|
|
601
|
+
width?: number;
|
|
602
|
+
};
|
|
305
603
|
/**
|
|
306
604
|
* Comment
|
|
307
605
|
* @description Comment with either message or image.
|
|
@@ -512,10 +810,10 @@ export interface components {
|
|
|
512
810
|
/**
|
|
513
811
|
* Created at
|
|
514
812
|
* Format: date-time
|
|
515
|
-
* @description Timestamp when the customer was created.
|
|
813
|
+
* @description Timestamp when the customer was created. May be null for older customers created before this field was tracked.
|
|
516
814
|
*/
|
|
517
|
-
createdAt
|
|
518
|
-
/** @description Custom field values as key-value pairs, where keys are field names and values can be strings, numbers, or booleans. */
|
|
815
|
+
createdAt?: string | null;
|
|
816
|
+
/** @description Custom field values as key-value pairs, where keys are field names and values can be strings, numbers, or booleans. DATE custom field values are returned as ISO 8601 datetime strings (e.g., "2026-01-15T12:00:00.000Z"), not Date objects. */
|
|
519
817
|
customFields?: {
|
|
520
818
|
[key: string]: string | number | boolean;
|
|
521
819
|
};
|
|
@@ -536,9 +834,9 @@ export interface components {
|
|
|
536
834
|
/**
|
|
537
835
|
* Updated at
|
|
538
836
|
* Format: date-time
|
|
539
|
-
* @description Timestamp when the customer was last updated.
|
|
837
|
+
* @description Timestamp when the customer was last updated. May be null for older customers created before this field was tracked.
|
|
540
838
|
*/
|
|
541
|
-
updatedAt
|
|
839
|
+
updatedAt?: string | null;
|
|
542
840
|
};
|
|
543
841
|
/** @description Email subscription updates */
|
|
544
842
|
"customer-subscription-email.schema": {
|
|
@@ -586,12 +884,19 @@ export interface components {
|
|
|
586
884
|
*/
|
|
587
885
|
"customer-upsert-request.schema": {
|
|
588
886
|
/**
|
|
589
|
-
* @description Custom field values as key-value pairs. Keys are field names and values can be strings, numbers, or booleans.
|
|
887
|
+
* @description Custom field values as key-value pairs. Keys are field names and values can be strings, numbers, or booleans. The field type is determined automatically based on the value:
|
|
888
|
+
* - String values → STRING custom field
|
|
889
|
+
* - Number values → NUMBER custom field
|
|
890
|
+
* - Boolean values → BOOLEAN custom field
|
|
891
|
+
* - ISO 8601 datetime strings (e.g., "2026-02-24T12:15:00.000Z") → DATE custom field (auto-detected)
|
|
892
|
+
*
|
|
893
|
+
* If a field name does not already have a declaration, one is created automatically. For STRING fields, unique values are tracked as options (used for segment filtering dropdowns). NUMBER, BOOLEAN, and DATE fields do not track options.
|
|
590
894
|
* @example {
|
|
591
895
|
* "subscription_source": "web",
|
|
592
896
|
* "status": "Active",
|
|
593
897
|
* "loyalty_points": 1250,
|
|
594
|
-
* "vip_member": true
|
|
898
|
+
* "vip_member": true,
|
|
899
|
+
* "signup_date": "2026-02-24T12:15:00.000Z"
|
|
595
900
|
* }
|
|
596
901
|
*/
|
|
597
902
|
customFields?: {
|
|
@@ -2347,6 +2652,66 @@ export interface operations {
|
|
|
2347
2652
|
};
|
|
2348
2653
|
};
|
|
2349
2654
|
};
|
|
2655
|
+
/**
|
|
2656
|
+
* Bulk upload products (Beta)
|
|
2657
|
+
* @description Bulk create or update product families and their variants.
|
|
2658
|
+
*
|
|
2659
|
+
* Submit up to 1,000 product families per request, each containing up to 100 variants.
|
|
2660
|
+
* Products are processed asynchronously in batches. Only one bulk upload can run per store at a time.
|
|
2661
|
+
*
|
|
2662
|
+
* ## Matching Strategy
|
|
2663
|
+
*
|
|
2664
|
+
* The API uses the following priority to match incoming product families to existing records:
|
|
2665
|
+
*
|
|
2666
|
+
* 1. **`product_family_id`** — Redo product family ID (direct lookup)
|
|
2667
|
+
* 2. **`external_id`** — ID from your external system
|
|
2668
|
+
* 3. **SKU** — Matched via variant SKUs
|
|
2669
|
+
*
|
|
2670
|
+
* If no match is found, a new product family is created.
|
|
2671
|
+
*
|
|
2672
|
+
* ## Concurrency
|
|
2673
|
+
*
|
|
2674
|
+
* Only one bulk upload operation can run per store at a time. If a bulk upload is already
|
|
2675
|
+
* in progress, the request will return a `409 Conflict` error.
|
|
2676
|
+
*/
|
|
2677
|
+
"Products bulk upload": {
|
|
2678
|
+
parameters: {
|
|
2679
|
+
path: {
|
|
2680
|
+
storeId: components["parameters"]["store-id.param"];
|
|
2681
|
+
};
|
|
2682
|
+
};
|
|
2683
|
+
requestBody: {
|
|
2684
|
+
content: {
|
|
2685
|
+
"application/json": components["schemas"]["bulk-product-upload-request.schema"];
|
|
2686
|
+
};
|
|
2687
|
+
};
|
|
2688
|
+
responses: {
|
|
2689
|
+
/** @description Upload completed */
|
|
2690
|
+
200: {
|
|
2691
|
+
content: {
|
|
2692
|
+
"application/json": components["schemas"]["bulk-product-upload-response.schema"];
|
|
2693
|
+
};
|
|
2694
|
+
};
|
|
2695
|
+
/** @description Invalid request body or missing required fields */
|
|
2696
|
+
400: {
|
|
2697
|
+
content: {
|
|
2698
|
+
"application/json": components["schemas"]["error.schema"];
|
|
2699
|
+
};
|
|
2700
|
+
};
|
|
2701
|
+
/** @description A bulk upload is already in progress for this store */
|
|
2702
|
+
409: {
|
|
2703
|
+
content: {
|
|
2704
|
+
"application/json": components["schemas"]["error.schema"];
|
|
2705
|
+
};
|
|
2706
|
+
};
|
|
2707
|
+
/** @description Error */
|
|
2708
|
+
default: {
|
|
2709
|
+
content: {
|
|
2710
|
+
"application/problem+json": components["schemas"]["error.schema"];
|
|
2711
|
+
};
|
|
2712
|
+
};
|
|
2713
|
+
};
|
|
2714
|
+
};
|
|
2350
2715
|
/**
|
|
2351
2716
|
* List Returns
|
|
2352
2717
|
* @description List returns, sorted by most recent to least recent.
|
package/lib/openapi.yaml
CHANGED
|
@@ -45,6 +45,7 @@ tags:
|
|
|
45
45
|
- name: Customers
|
|
46
46
|
- name: Invoices
|
|
47
47
|
- name: Merchant Admin
|
|
48
|
+
- name: Products
|
|
48
49
|
- name: Returns
|
|
49
50
|
- name: Storefront
|
|
50
51
|
- name: Webhooks
|
|
@@ -619,6 +620,156 @@ paths:
|
|
|
619
620
|
tags:
|
|
620
621
|
- Merchant Admin
|
|
621
622
|
summary: Merchant admin
|
|
623
|
+
/stores/{storeId}/products/bulk-upload:
|
|
624
|
+
post:
|
|
625
|
+
description: |
|
|
626
|
+
Bulk create or update product families and their variants.
|
|
627
|
+
|
|
628
|
+
Submit up to 1,000 product families per request, each containing up to 100 variants.
|
|
629
|
+
Products are processed asynchronously in batches. Only one bulk upload can run per store at a time.
|
|
630
|
+
|
|
631
|
+
## Matching Strategy
|
|
632
|
+
|
|
633
|
+
The API uses the following priority to match incoming product families to existing records:
|
|
634
|
+
|
|
635
|
+
1. **`product_family_id`** — Redo product family ID (direct lookup)
|
|
636
|
+
2. **`external_id`** — ID from your external system
|
|
637
|
+
3. **SKU** — Matched via variant SKUs
|
|
638
|
+
|
|
639
|
+
If no match is found, a new product family is created.
|
|
640
|
+
|
|
641
|
+
## Concurrency
|
|
642
|
+
|
|
643
|
+
Only one bulk upload operation can run per store at a time. If a bulk upload is already
|
|
644
|
+
in progress, the request will return a `409 Conflict` error.
|
|
645
|
+
operationId: Products bulk upload
|
|
646
|
+
parameters:
|
|
647
|
+
- $ref: '#/components/parameters/store-id.param'
|
|
648
|
+
requestBody:
|
|
649
|
+
content:
|
|
650
|
+
application/json:
|
|
651
|
+
schema:
|
|
652
|
+
$ref: '#/components/schemas/bulk-product-upload-request.schema'
|
|
653
|
+
examples:
|
|
654
|
+
single_product:
|
|
655
|
+
summary: Single product with one variant
|
|
656
|
+
value:
|
|
657
|
+
products:
|
|
658
|
+
- title: Classic T-Shirt
|
|
659
|
+
description: A comfortable cotton t-shirt
|
|
660
|
+
vendor: Acme Apparel
|
|
661
|
+
tags:
|
|
662
|
+
- apparel
|
|
663
|
+
- basics
|
|
664
|
+
kind: SELLABLE
|
|
665
|
+
variants:
|
|
666
|
+
- sku: TSHIRT-BLK-M
|
|
667
|
+
price: 2999
|
|
668
|
+
currency: USD
|
|
669
|
+
weight: 200
|
|
670
|
+
weight_unit: g
|
|
671
|
+
multiple_products_with_options:
|
|
672
|
+
summary: Multiple products with options and images
|
|
673
|
+
value:
|
|
674
|
+
products:
|
|
675
|
+
- title: Running Shoes
|
|
676
|
+
external_id: EXT-SHOES-001
|
|
677
|
+
options:
|
|
678
|
+
- name: Size
|
|
679
|
+
values:
|
|
680
|
+
- '9'
|
|
681
|
+
- '10'
|
|
682
|
+
- '11'
|
|
683
|
+
- name: Color
|
|
684
|
+
values:
|
|
685
|
+
- Black
|
|
686
|
+
- White
|
|
687
|
+
images:
|
|
688
|
+
- url: https://example.com/shoes-main.jpg
|
|
689
|
+
alt_text: Running shoes front view
|
|
690
|
+
variants:
|
|
691
|
+
- sku: SHOE-BLK-9
|
|
692
|
+
price: 12999
|
|
693
|
+
currency: USD
|
|
694
|
+
option_values:
|
|
695
|
+
- '9'
|
|
696
|
+
- Black
|
|
697
|
+
- sku: SHOE-WHT-10
|
|
698
|
+
price: 12999
|
|
699
|
+
currency: USD
|
|
700
|
+
option_values:
|
|
701
|
+
- '10'
|
|
702
|
+
- White
|
|
703
|
+
- title: Athletic Socks
|
|
704
|
+
variants:
|
|
705
|
+
- sku: SOCK-WHT-L
|
|
706
|
+
price: 1499
|
|
707
|
+
currency: USD
|
|
708
|
+
required: true
|
|
709
|
+
responses:
|
|
710
|
+
'200':
|
|
711
|
+
content:
|
|
712
|
+
application/json:
|
|
713
|
+
schema:
|
|
714
|
+
$ref: '#/components/schemas/bulk-product-upload-response.schema'
|
|
715
|
+
examples:
|
|
716
|
+
success:
|
|
717
|
+
summary: Successful upload
|
|
718
|
+
value:
|
|
719
|
+
total_count: 2
|
|
720
|
+
processed_count: 2
|
|
721
|
+
error_count: 0
|
|
722
|
+
results:
|
|
723
|
+
- status: created
|
|
724
|
+
product_family_id: 01H5K3EXAMPLE1
|
|
725
|
+
products:
|
|
726
|
+
- id: 01H5K3EXAMPLE1A
|
|
727
|
+
sku: SHOE-BLK-9
|
|
728
|
+
- id: 01H5K3EXAMPLE1B
|
|
729
|
+
sku: SHOE-WHT-10
|
|
730
|
+
- status: updated
|
|
731
|
+
product_family_id: 01H5K3EXAMPLE2
|
|
732
|
+
products:
|
|
733
|
+
- id: 01H5K3EXAMPLE2A
|
|
734
|
+
sku: SOCK-WHT-L
|
|
735
|
+
partial_failure:
|
|
736
|
+
summary: Partial failure
|
|
737
|
+
value:
|
|
738
|
+
total_count: 2
|
|
739
|
+
processed_count: 1
|
|
740
|
+
error_count: 1
|
|
741
|
+
results:
|
|
742
|
+
- status: created
|
|
743
|
+
product_family_id: 01H5K3EXAMPLE3
|
|
744
|
+
products:
|
|
745
|
+
- id: 01H5K3EXAMPLE3A
|
|
746
|
+
sku: TSHIRT-BLK-M
|
|
747
|
+
- status: error
|
|
748
|
+
error: Duplicate SKU found in request
|
|
749
|
+
description: Upload completed
|
|
750
|
+
'400':
|
|
751
|
+
content:
|
|
752
|
+
application/json:
|
|
753
|
+
schema:
|
|
754
|
+
$ref: '#/components/schemas/error.schema'
|
|
755
|
+
description: Invalid request body or missing required fields
|
|
756
|
+
'409':
|
|
757
|
+
content:
|
|
758
|
+
application/json:
|
|
759
|
+
schema:
|
|
760
|
+
$ref: '#/components/schemas/error.schema'
|
|
761
|
+
description: A bulk upload is already in progress for this store
|
|
762
|
+
default:
|
|
763
|
+
content:
|
|
764
|
+
application/problem+json:
|
|
765
|
+
schema:
|
|
766
|
+
$ref: '#/components/schemas/error.schema'
|
|
767
|
+
description: Error
|
|
768
|
+
security:
|
|
769
|
+
- Bearer: []
|
|
770
|
+
summary: Bulk upload products (Beta)
|
|
771
|
+
tags:
|
|
772
|
+
- Products
|
|
622
773
|
/returns/{returnId}:
|
|
623
774
|
description: Return.
|
|
624
775
|
get:
|
|
@@ -1792,7 +1943,7 @@ components:
|
|
|
1792
1943
|
location:
|
|
1793
1944
|
$ref: '#/components/schemas/customer-location.schema'
|
|
1794
1945
|
customFields:
|
|
1795
|
-
description: Custom field values as key-value pairs, where keys are field names and values can be strings, numbers, or booleans.
|
|
1946
|
+
description: Custom field values as key-value pairs, where keys are field names and values can be strings, numbers, or booleans. DATE custom field values are returned as ISO 8601 datetime strings (e.g., "2026-01-15T12:00:00.000Z"), not Date objects.
|
|
1796
1947
|
type: object
|
|
1797
1948
|
additionalProperties:
|
|
1798
1949
|
oneOf:
|
|
@@ -1804,25 +1955,28 @@ components:
|
|
|
1804
1955
|
status: Active
|
|
1805
1956
|
loyalty_points: 1250
|
|
1806
1957
|
vip_member: true
|
|
1958
|
+
signup_date: '2026-02-24T12:15:00.000Z'
|
|
1807
1959
|
createdAt:
|
|
1808
|
-
description: Timestamp when the customer was created.
|
|
1960
|
+
description: Timestamp when the customer was created. May be null for older customers created before this field was tracked.
|
|
1809
1961
|
format: date-time
|
|
1810
1962
|
title: Created at
|
|
1811
1963
|
examples:
|
|
1812
1964
|
- '2026-02-20T18:30:00.000Z'
|
|
1813
|
-
type:
|
|
1965
|
+
type:
|
|
1966
|
+
- string
|
|
1967
|
+
- 'null'
|
|
1814
1968
|
updatedAt:
|
|
1815
|
-
description: Timestamp when the customer was last updated.
|
|
1969
|
+
description: Timestamp when the customer was last updated. May be null for older customers created before this field was tracked.
|
|
1816
1970
|
format: date-time
|
|
1817
1971
|
title: Updated at
|
|
1818
1972
|
examples:
|
|
1819
1973
|
- '2026-02-24T12:15:00.000Z'
|
|
1820
|
-
type:
|
|
1974
|
+
type:
|
|
1975
|
+
- string
|
|
1976
|
+
- 'null'
|
|
1821
1977
|
required:
|
|
1822
1978
|
- id
|
|
1823
1979
|
- email
|
|
1824
|
-
- createdAt
|
|
1825
|
-
- updatedAt
|
|
1826
1980
|
title: Customer
|
|
1827
1981
|
type: object
|
|
1828
1982
|
customer-upsert-request.schema:
|
|
@@ -1847,7 +2001,14 @@ components:
|
|
|
1847
2001
|
location:
|
|
1848
2002
|
$ref: '#/components/schemas/customer-location.schema'
|
|
1849
2003
|
customFields:
|
|
1850
|
-
description:
|
|
2004
|
+
description: |-
|
|
2005
|
+
Custom field values as key-value pairs. Keys are field names and values can be strings, numbers, or booleans. The field type is determined automatically based on the value:
|
|
2006
|
+
- String values → STRING custom field
|
|
2007
|
+
- Number values → NUMBER custom field
|
|
2008
|
+
- Boolean values → BOOLEAN custom field
|
|
2009
|
+
- ISO 8601 datetime strings (e.g., "2026-02-24T12:15:00.000Z") → DATE custom field (auto-detected)
|
|
2010
|
+
|
|
2011
|
+
If a field name does not already have a declaration, one is created automatically. For STRING fields, unique values are tracked as options (used for segment filtering dropdowns). NUMBER, BOOLEAN, and DATE fields do not track options.
|
|
1851
2012
|
type: object
|
|
1852
2013
|
additionalProperties:
|
|
1853
2014
|
oneOf:
|
|
@@ -1859,6 +2020,7 @@ components:
|
|
|
1859
2020
|
status: Active
|
|
1860
2021
|
loyalty_points: 1250
|
|
1861
2022
|
vip_member: true
|
|
2023
|
+
signup_date: '2026-02-24T12:15:00.000Z'
|
|
1862
2024
|
required:
|
|
1863
2025
|
- email
|
|
1864
2026
|
title: Customer Upsert Request
|
|
@@ -1917,6 +2079,325 @@ components:
|
|
|
1917
2079
|
- createdAt
|
|
1918
2080
|
- charge
|
|
1919
2081
|
type: object
|
|
2082
|
+
bulk-product-family-option.schema:
|
|
2083
|
+
description: A product option (e.g. Size, Color) with its possible values.
|
|
2084
|
+
properties:
|
|
2085
|
+
name:
|
|
2086
|
+
description: Option name (e.g. "Size", "Color").
|
|
2087
|
+
maxLength: 255
|
|
2088
|
+
title: Name
|
|
2089
|
+
type: string
|
|
2090
|
+
values:
|
|
2091
|
+
description: Possible values for this option (e.g. ["Small", "Medium", "Large"]).
|
|
2092
|
+
items:
|
|
2093
|
+
maxLength: 255
|
|
2094
|
+
type: string
|
|
2095
|
+
title: Values
|
|
2096
|
+
type: array
|
|
2097
|
+
required:
|
|
2098
|
+
- name
|
|
2099
|
+
- values
|
|
2100
|
+
title: Product Family Option
|
|
2101
|
+
type: object
|
|
2102
|
+
bulk-product-family-image.schema:
|
|
2103
|
+
description: An image associated with a product family or variant.
|
|
2104
|
+
properties:
|
|
2105
|
+
url:
|
|
2106
|
+
description: URL of the image.
|
|
2107
|
+
format: uri
|
|
2108
|
+
title: URL
|
|
2109
|
+
type: string
|
|
2110
|
+
alt_text:
|
|
2111
|
+
description: Alt text for the image.
|
|
2112
|
+
maxLength: 1000
|
|
2113
|
+
title: Alt Text
|
|
2114
|
+
type: string
|
|
2115
|
+
required:
|
|
2116
|
+
- url
|
|
2117
|
+
- alt_text
|
|
2118
|
+
title: Product Family Image
|
|
2119
|
+
type: object
|
|
2120
|
+
bulk-variant.schema:
|
|
2121
|
+
description: A product variant within a product family.
|
|
2122
|
+
properties:
|
|
2123
|
+
id:
|
|
2124
|
+
description: Redo variant ID. Used for matching to an existing variant.
|
|
2125
|
+
maxLength: 255
|
|
2126
|
+
title: ID
|
|
2127
|
+
type: string
|
|
2128
|
+
external_id:
|
|
2129
|
+
description: Variant ID in your external system. Used for matching if `id` is not provided.
|
|
2130
|
+
maxLength: 255
|
|
2131
|
+
title: External ID
|
|
2132
|
+
type: string
|
|
2133
|
+
title:
|
|
2134
|
+
description: Variant title (e.g. "Small / Blue").
|
|
2135
|
+
maxLength: 500
|
|
2136
|
+
title: Title
|
|
2137
|
+
type: string
|
|
2138
|
+
sku:
|
|
2139
|
+
description: Stock keeping unit. Required. Used for matching if neither `id` nor `external_id` are provided.
|
|
2140
|
+
maxLength: 255
|
|
2141
|
+
minLength: 1
|
|
2142
|
+
title: SKU
|
|
2143
|
+
type: string
|
|
2144
|
+
upc:
|
|
2145
|
+
description: Universal product code.
|
|
2146
|
+
maxLength: 50
|
|
2147
|
+
title: UPC
|
|
2148
|
+
type: string
|
|
2149
|
+
barcodes:
|
|
2150
|
+
description: Additional barcodes for this variant.
|
|
2151
|
+
items:
|
|
2152
|
+
maxLength: 255
|
|
2153
|
+
type: string
|
|
2154
|
+
title: Barcodes
|
|
2155
|
+
type: array
|
|
2156
|
+
price:
|
|
2157
|
+
description: Price in the smallest currency unit (e.g. cents for USD).
|
|
2158
|
+
minimum: 0
|
|
2159
|
+
title: Price
|
|
2160
|
+
type: integer
|
|
2161
|
+
currency:
|
|
2162
|
+
description: Currency code (e.g. "USD").
|
|
2163
|
+
maxLength: 10
|
|
2164
|
+
title: Currency
|
|
2165
|
+
type: string
|
|
2166
|
+
weight:
|
|
2167
|
+
description: Weight of the variant.
|
|
2168
|
+
title: Weight
|
|
2169
|
+
type: number
|
|
2170
|
+
weight_unit:
|
|
2171
|
+
description: Unit of weight measurement.
|
|
2172
|
+
enum:
|
|
2173
|
+
- g
|
|
2174
|
+
- kg
|
|
2175
|
+
- lb
|
|
2176
|
+
- oz
|
|
2177
|
+
- t
|
|
2178
|
+
title: Weight Unit
|
|
2179
|
+
type: string
|
|
2180
|
+
width:
|
|
2181
|
+
description: Width of the variant.
|
|
2182
|
+
title: Width
|
|
2183
|
+
type: number
|
|
2184
|
+
length:
|
|
2185
|
+
description: Length of the variant.
|
|
2186
|
+
title: Length
|
|
2187
|
+
type: number
|
|
2188
|
+
height:
|
|
2189
|
+
description: Height of the variant.
|
|
2190
|
+
title: Height
|
|
2191
|
+
type: number
|
|
2192
|
+
dimension_unit:
|
|
2193
|
+
description: Unit of dimension measurement.
|
|
2194
|
+
enum:
|
|
2195
|
+
- in
|
|
2196
|
+
- cm
|
|
2197
|
+
title: Dimension Unit
|
|
2198
|
+
type: string
|
|
2199
|
+
hs_code:
|
|
2200
|
+
description: Harmonized System code for customs.
|
|
2201
|
+
maxLength: 50
|
|
2202
|
+
title: HS Code
|
|
2203
|
+
type: string
|
|
2204
|
+
origin_country:
|
|
2205
|
+
description: Country of origin as an ISO 3166-1 alpha-2 code (e.g. "US").
|
|
2206
|
+
pattern: ^[A-Z]{2}$
|
|
2207
|
+
title: Origin Country
|
|
2208
|
+
type: string
|
|
2209
|
+
option_values:
|
|
2210
|
+
description: Values for each option defined on the product family, in the same order.
|
|
2211
|
+
items:
|
|
2212
|
+
maxLength: 255
|
|
2213
|
+
type: string
|
|
2214
|
+
title: Option Values
|
|
2215
|
+
type: array
|
|
2216
|
+
images:
|
|
2217
|
+
description: Images specific to this variant.
|
|
2218
|
+
items:
|
|
2219
|
+
$ref: '#/components/schemas/bulk-product-family-image.schema'
|
|
2220
|
+
title: Images
|
|
2221
|
+
type: array
|
|
2222
|
+
required:
|
|
2223
|
+
- sku
|
|
2224
|
+
- price
|
|
2225
|
+
- currency
|
|
2226
|
+
title: Bulk Variant
|
|
2227
|
+
type: object
|
|
2228
|
+
bulk-product-family.schema:
|
|
2229
|
+
description: |
|
|
2230
|
+
A product family containing one or more variants.
|
|
2231
|
+
|
|
2232
|
+
Matching priority for existing product families:
|
|
2233
|
+
1. `product_family_id` — Redo product family ID (direct lookup)
|
|
2234
|
+
2. `external_id` — ID from your external system
|
|
2235
|
+
3. SKU — Matched via variant SKUs
|
|
2236
|
+
If no match is found, a new product family is created.
|
|
2237
|
+
properties:
|
|
2238
|
+
product_family_id:
|
|
2239
|
+
description: Redo product family ID. Highest-priority match for updating an existing product family.
|
|
2240
|
+
maxLength: 255
|
|
2241
|
+
title: Product Family ID
|
|
2242
|
+
type: string
|
|
2243
|
+
external_id:
|
|
2244
|
+
description: Product family ID in your external system. Second-priority match.
|
|
2245
|
+
maxLength: 255
|
|
2246
|
+
title: External ID
|
|
2247
|
+
type: string
|
|
2248
|
+
title:
|
|
2249
|
+
description: Product family title.
|
|
2250
|
+
maxLength: 500
|
|
2251
|
+
minLength: 1
|
|
2252
|
+
title: Title
|
|
2253
|
+
type: string
|
|
2254
|
+
description:
|
|
2255
|
+
description: Product family description.
|
|
2256
|
+
maxLength: 5000
|
|
2257
|
+
title: Description
|
|
2258
|
+
type: string
|
|
2259
|
+
vendor:
|
|
2260
|
+
description: Vendor or manufacturer name.
|
|
2261
|
+
maxLength: 255
|
|
2262
|
+
title: Vendor
|
|
2263
|
+
type: string
|
|
2264
|
+
tags:
|
|
2265
|
+
default: []
|
|
2266
|
+
description: Tags for categorization.
|
|
2267
|
+
items:
|
|
2268
|
+
maxLength: 255
|
|
2269
|
+
type: string
|
|
2270
|
+
title: Tags
|
|
2271
|
+
type: array
|
|
2272
|
+
kind:
|
|
2273
|
+
default: SELLABLE
|
|
2274
|
+
description: Whether the product is sellable or non-sellable.
|
|
2275
|
+
enum:
|
|
2276
|
+
- SELLABLE
|
|
2277
|
+
- NON_SELLABLE
|
|
2278
|
+
title: Kind
|
|
2279
|
+
type: string
|
|
2280
|
+
options:
|
|
2281
|
+
description: Product options (e.g. Size, Color) with their possible values.
|
|
2282
|
+
items:
|
|
2283
|
+
$ref: '#/components/schemas/bulk-product-family-option.schema'
|
|
2284
|
+
title: Options
|
|
2285
|
+
type: array
|
|
2286
|
+
images:
|
|
2287
|
+
description: Images for the product family.
|
|
2288
|
+
items:
|
|
2289
|
+
$ref: '#/components/schemas/bulk-product-family-image.schema'
|
|
2290
|
+
title: Images
|
|
2291
|
+
type: array
|
|
2292
|
+
variants:
|
|
2293
|
+
description: Product variants. At least 1 and up to 100 per product family.
|
|
2294
|
+
items:
|
|
2295
|
+
$ref: '#/components/schemas/bulk-variant.schema'
|
|
2296
|
+
maxItems: 100
|
|
2297
|
+
minItems: 1
|
|
2298
|
+
title: Variants
|
|
2299
|
+
type: array
|
|
2300
|
+
required:
|
|
2301
|
+
- title
|
|
2302
|
+
- variants
|
|
2303
|
+
title: Bulk Product Family
|
|
2304
|
+
type: object
|
|
2305
|
+
bulk-product-upload-request.schema:
|
|
2306
|
+
description: Request body for bulk uploading product families and their variants.
|
|
2307
|
+
properties:
|
|
2308
|
+
products:
|
|
2309
|
+
description: Product families to create or update. Between 1 and 1000 per request.
|
|
2310
|
+
items:
|
|
2311
|
+
$ref: '#/components/schemas/bulk-product-family.schema'
|
|
2312
|
+
maxItems: 1000
|
|
2313
|
+
minItems: 1
|
|
2314
|
+
title: Products
|
|
2315
|
+
type: array
|
|
2316
|
+
required:
|
|
2317
|
+
- products
|
|
2318
|
+
title: Bulk Product Upload Request
|
|
2319
|
+
type: object
|
|
2320
|
+
bulk-product-upload-response.schema:
|
|
2321
|
+
description: Response from a bulk product upload operation.
|
|
2322
|
+
properties:
|
|
2323
|
+
total_count:
|
|
2324
|
+
description: Total number of product families in the request.
|
|
2325
|
+
title: Total Count
|
|
2326
|
+
type: integer
|
|
2327
|
+
processed_count:
|
|
2328
|
+
description: Number of product families processed successfully.
|
|
2329
|
+
title: Processed Count
|
|
2330
|
+
type: integer
|
|
2331
|
+
error_count:
|
|
2332
|
+
description: Number of product families that failed to process.
|
|
2333
|
+
title: Error Count
|
|
2334
|
+
type: integer
|
|
2335
|
+
results:
|
|
2336
|
+
description: Per-product-family results.
|
|
2337
|
+
items:
|
|
2338
|
+
oneOf:
|
|
2339
|
+
- description: A product family that was created or updated successfully.
|
|
2340
|
+
properties:
|
|
2341
|
+
status:
|
|
2342
|
+
description: Whether the product family was created or updated.
|
|
2343
|
+
enum:
|
|
2344
|
+
- created
|
|
2345
|
+
- updated
|
|
2346
|
+
title: Status
|
|
2347
|
+
type: string
|
|
2348
|
+
product_family_id:
|
|
2349
|
+
description: Redo product family ID.
|
|
2350
|
+
title: Product Family ID
|
|
2351
|
+
type: string
|
|
2352
|
+
products:
|
|
2353
|
+
description: Variant results within this product family.
|
|
2354
|
+
items:
|
|
2355
|
+
properties:
|
|
2356
|
+
id:
|
|
2357
|
+
description: Redo product ID.
|
|
2358
|
+
title: ID
|
|
2359
|
+
type: string
|
|
2360
|
+
sku:
|
|
2361
|
+
description: Product SKU.
|
|
2362
|
+
title: SKU
|
|
2363
|
+
type: string
|
|
2364
|
+
required:
|
|
2365
|
+
- id
|
|
2366
|
+
- sku
|
|
2367
|
+
type: object
|
|
2368
|
+
title: Products
|
|
2369
|
+
type: array
|
|
2370
|
+
required:
|
|
2371
|
+
- status
|
|
2372
|
+
- product_family_id
|
|
2373
|
+
- products
|
|
2374
|
+
title: Success Result
|
|
2375
|
+
type: object
|
|
2376
|
+
- description: A product family that failed to process.
|
|
2377
|
+
properties:
|
|
2378
|
+
status:
|
|
2379
|
+
const: error
|
|
2380
|
+
description: Indicates an error occurred.
|
|
2381
|
+
title: Status
|
|
2382
|
+
type: string
|
|
2383
|
+
error:
|
|
2384
|
+
description: Error message describing what went wrong.
|
|
2385
|
+
title: Error
|
|
2386
|
+
type: string
|
|
2387
|
+
required:
|
|
2388
|
+
- status
|
|
2389
|
+
- error
|
|
2390
|
+
title: Error Result
|
|
2391
|
+
type: object
|
|
2392
|
+
title: Results
|
|
2393
|
+
type: array
|
|
2394
|
+
required:
|
|
2395
|
+
- total_count
|
|
2396
|
+
- processed_count
|
|
2397
|
+
- error_count
|
|
2398
|
+
- results
|
|
2399
|
+
title: Bulk Product Upload Response
|
|
2400
|
+
type: object
|
|
1920
2401
|
person-name.schema:
|
|
1921
2402
|
description: Person name.
|
|
1922
2403
|
properties:
|
package/package.json
CHANGED