UNPKG

@redotech/redo-api-schema

Version:

Common definitions for Redo API

1,404 lines (1,373 loc) 208 kB
openapi: 3.1.0 info: contact: email: engineering-admin@getredo.com name: Redo Engineering description: | ## Endpoints Endpoints are authenticated using the Bearer authorization scheme, using the REDO_API_SECRET. ```txt GET /v2.2/resource HTTP/1.1 Authorization: Bearer 77bb7598b7a972475cc7c7e171ec33af Host: api.getredo.com ``` ## Webhooks Webhooks are authenticated using the Bearer authorization scheme, using a secret supplied by the subscriber. ```txt POST /events HTTP/1.1 Authorization: Bearer subscriberauth123 Host: subscriber.example.com ``` Webhook events are delivered in order for each individual subject (e.g. return). If the response is not a 2xx status code, the event will be retried multiple times before discarding it. title: Redo API version: 2.2.1 servers: - url: https://api.getredo.com/v2.2 tags: - name: Checkout Buttons - name: Coverage Info - name: Coverage Products - name: Custom Events - name: Customer Portal - name: Customer Subscriptions - name: Customers - name: Inbound Shipments - name: Inventory Items - name: Inventory Levels - name: Invoices - name: Merchant Admin - name: Orders - name: Products - name: Returns - name: Storefront - name: Webhooks paths: /stores/{storeId}/checkout-buttons-ui: description: Generate HTML and CSS for checkout buttons to enable or disable returns coverage. get: description: Generate rendered HTML and CSS for checkout buttons. operationId: Checkout buttons UI parameters: - $ref: '#/components/parameters/store-id.param' responses: '200': content: application/json: schema: properties: css: description: Boilerplate checkout button CSS, plus any merchant configured styles or A/B tests. title: Checkout buttons CSS type: string html: description: Boilerplate checkout button HTML title: Checkout buttons HTML type: string description: Success summary: Checkout Buttons UI tags: - Checkout Buttons summary: Checkout buttons UI /stores/{storeId}/coverage-info: description: Navigate to the coverage info page. get: description: Navigate to the coverage info page. operationId: Coverage info navigate parameters: - $ref: '#/components/parameters/store-id.param' responses: '302': description: Redirect summary: Navigate to Coverage Info tags: - Coverage Info summary: Coverage info /stores/{storeId}/coverage-products: description: Available coverage products. post: description: Get available coverage products. operationId: Coverage products parameters: - $ref: '#/components/parameters/store-id.param' requestBody: content: application/json: schema: properties: cart: $ref: '#/components/schemas/storefront-cart.schema' customer: $ref: '#/components/schemas/storefront-customer.schema' products: description: Product information. items: properties: id: description: Identifier of the product. title: ID type: string required: - id type: object deprecated: true title: Products type: array variants: description: Variant information. items: properties: height: $ref: '#/components/schemas/length.schema' description: Height of an item. title: Height id: description: Identifier of the variant. title: ID type: string length: $ref: '#/components/schemas/length.schema' description: Length of an item. title: Length title: title: Title type: string weight: $ref: '#/components/schemas/weight.schema' description: Weight of an item. title: Weight width: $ref: '#/components/schemas/length.schema' description: Width of an item. title: Width required: - id type: object deprecated: true title: Variants type: array required: - cart type: object required: true responses: '200': content: application/json: schema: properties: coverageProducts: description: Coverage products. items: $ref: '#/components/schemas/coverage-product.schema' title: Coverage Products type: array required: - coverageProducts type: object description: Success default: content: application/problem+json: schema: $ref: '#/components/schemas/error.schema' description: Error summary: Coverage Products tags: - Coverage Products summary: Coverage products /stores/{storeId}/events: post: description: | Create a custom event to trigger flows with merchant-defined event names and properties. Custom events allow merchants to trigger flows based on events from their own systems. Events can include custom properties that are accessible in email and SMS templates, and are persisted for segmentation and historical queries. ## Identity Resolution The API resolves customers using the following priority order: 1. `customer.id` — Redo customer ObjectId (highest priority) 2. `customer.email` — customer email address 3. `customer.phoneNumber` — customer phone number At least one identifier must be provided. If no matching customer is found, one will be created automatically. If `customer.id` is provided but not found, the API falls back to email/phone rather than returning 404. ## Datetime Formatting All datetime values must be formatted as ISO 8601 (RFC 3339) strings, e.g., `2026-04-02T12:00:00Z`. This applies to `eventTimestamp`, any date-valued properties in `data`, and any date-valued `customFields`. Strings matching this format are automatically detected and indexed as dates for segmentation. ## Rate Limiting This endpoint is rate-limited to 100 requests per second per store. operationId: Custom event create x-express-openapi-disable-validation-middleware: true parameters: - $ref: '#/components/parameters/store-id.param' requestBody: content: application/json: schema: $ref: '#/components/schemas/custom-event-request.schema' examples: full_example: summary: Every field populated value: eventName: Purchase Milestone Reached customer: id: 665f1a2b3c4d5e6f7a8b9c0d email: stewart@example.com phoneNumber: '+11234567890' firstName: Stewart lastName: Thompson location: street1: 123 Main St street2: Apt 4B city: Seattle state: Washington stateCode: WA postalCode: '98101' country: United States countryCode: US ianaTimeZoneName: America/Los_Angeles latitude: 47.6062 longitude: -122.3321 customFields: Age at Signup: 25 Birthday: '1976-07-04T12:00:00Z' Loyalty Tier: Gold Accepts Marketing: true eventTimestamp: '2026-04-02T12:00:00Z' value: 299.99 valueCurrency: USD uniqueId: milestone-test-001 data: Milestone Type: 100th_purchase Total Spent: 5000 VIP Tier: gold Enrolled At: '2025-01-01T00:00:00Z' Campaign Source: email_drip Last Purchase Date: '2026-03-15T00:00:00Z' $extra: Most Recent Order IDs: - 1 - 2 - 3 Profile Snapshot: tier: gold memberSince: '2024-01-01' medium_example: summary: Event with customer profile and data value: eventName: Order Placed customer: email: stewart@example.com firstName: Stewart lastName: Thompson customFields: Birthday: '1976-07-04T12:00:00Z' Loyalty Tier: Gold value: 149.99 valueCurrency: USD data: Order Id: ord_456 Item Count: 3 Category: apparel minimal: summary: Required fields only value: eventName: Page Viewed customer: email: stewart@example.com required: true responses: '202': description: Event accepted and queued for processing. No response body is returned. '400': content: application/json: schema: $ref: '#/components/schemas/error.schema' description: Invalid request body or missing required customer identifier '404': content: application/json: schema: $ref: '#/components/schemas/error.schema' description: Store not found '429': content: application/json: schema: $ref: '#/components/schemas/error.schema' description: Rate limit exceeded default: content: application/problem+json: schema: $ref: '#/components/schemas/error.schema' description: Error security: - Bearer: [] summary: Create custom event tags: - Custom Events /stores/{storeId}/events/bulk: post: description: | Create multiple custom events in a single request. Accepts up to 100 events per request. Each event is validated independently. The response includes per-event results, allowing partial failures — some events may be accepted while others are rejected due to validation errors. ## Identity Resolution Each event resolves customers independently using the same priority order as the single-event endpoint: 1. `customer.id` — Redo customer ObjectId (highest priority) 2. `customer.email` — customer email address 3. `customer.phoneNumber` — customer phone number At least one identifier must be provided per event. If no matching customer is found, one will be created automatically. ## Rate Limiting This endpoint is rate-limited to 100 requests per second per store. operationId: Bulk create custom events x-express-openapi-disable-validation-middleware: true parameters: - $ref: '#/components/parameters/store-id.param' requestBody: content: application/json: schema: $ref: '#/components/schemas/bulk-custom-event-request.schema' examples: mixed_events: summary: Bulk event creation with multiple event types value: events: - eventName: User Registered customer: email: alice@example.com data: Plan Type: premium - eventName: Purchase Completed customer: email: bob@example.com data: Order Total: 99.99 Item Count: 3 value: 99.99 valueCurrency: USD uniqueId: order-456 required: true responses: '202': description: Bulk request accepted and queued for processing. No response body is returned. '400': content: application/json: schema: $ref: '#/components/schemas/error.schema' description: Invalid request body (e.g., events array missing or exceeds 100 items) '404': content: application/json: schema: $ref: '#/components/schemas/error.schema' description: Store not found '429': content: application/json: schema: $ref: '#/components/schemas/error.schema' description: Rate limit exceeded default: content: application/problem+json: schema: $ref: '#/components/schemas/error.schema' description: Error security: - Bearer: [] summary: Bulk create custom events tags: - Custom Events /stores/{storeId}/customer-portal: description: Navigate to the customer portal. get: description: Navigate to the customer portal. operationId: Customer portal navigate parameters: - $ref: '#/components/parameters/store-id.param' - description: HMAC-SHA256 JWT of {"iss":"<partnerId>","sub":"<storeId>/<customerId>"} in: query name: token schema: type: string - description: Order ID in: query name: order_id schema: type: string responses: '302': description: Redirect summary: Navigate to Customer Portal tags: - Customer Portal summary: Customer portal /stores/{storeId}/customer-subscriptions: description: Update customer subscription preferences for marketing and transactional messages. post: description: Update customer subscription status for SMS and email marketing and transactional messages. If the customer with that phone number or email does not exist, it will be created. operationId: Customer subscriptions update parameters: - $ref: '#/components/parameters/store-id.param' requestBody: content: application/json: schema: properties: email: $ref: '#/components/schemas/customer-subscription-email.schema' sms: $ref: '#/components/schemas/customer-subscription-sms.schema' type: object required: true responses: '200': content: application/json: schema: $ref: '#/components/schemas/customer-subscription-update-response.schema' description: Success '400': content: application/problem+json: schema: $ref: '#/components/schemas/error.schema' description: Bad Request '500': content: application/problem+json: schema: $ref: '#/components/schemas/error.schema' description: Internal Server Error default: content: application/problem+json: schema: $ref: '#/components/schemas/error.schema' description: Error security: - Bearer: [] summary: Update Customer Subscriptions tags: - Customer Subscriptions summary: Customer subscriptions /stores/{storeId}/customers: description: Manage customer profiles. get: description: | Retrieve a customer profile by email address. The response includes the customer's name, contact information, location, and any custom fields associated with the profile. Custom fields are returned as `{ fieldName: value }` pairs. operationId: Customer get parameters: - $ref: '#/components/parameters/store-id.param' - description: Customer email address in: query name: email required: true schema: format: email type: string responses: '200': content: application/json: schema: $ref: '#/components/schemas/customer-read.schema' example: id: 67bd4f1a2e3c8d001a5f9b12 email: jane@example.com firstName: Jane lastName: Smith phoneNumber: '+11234567890' location: street1: 123 Main St street2: Suite 12 city: Seattle state: Washington stateCode: WA postalCode: '98101' country: United States countryCode: US latitude: 47.6062 longitude: -122.3321 customFields: pricing_plan: com.example.yearly status: Active subscription_source: web loyalty_points: 1250 vip_member: true createdAt: '2026-02-20T18:30:00.000Z' updatedAt: '2026-02-24T12:15:00.000Z' description: Customer found '400': content: application/problem+json: schema: $ref: '#/components/schemas/error.schema' description: Missing or invalid email parameter '404': content: application/problem+json: schema: $ref: '#/components/schemas/error.schema' description: No customer found for that email '500': content: application/problem+json: schema: $ref: '#/components/schemas/error.schema' description: Internal server error default: content: application/problem+json: schema: $ref: '#/components/schemas/error.schema' description: Error security: - Bearer: [] summary: Get customer by email tags: - Customers put: description: | Create or update a customer profile. Uses the email address as the upsert key — if a customer with that email exists, their profile is updated; otherwise, a new customer is created. ## Profile fields - `firstName` and `lastName` are set directly on the customer. A full display name is automatically generated from these fields. - `phoneNumber` should be in E.164 format (e.g., `+12345678900`). If the number is new, it is added to the customer's contact information. ## Location Providing `location` sets the customer's current location. Only the fields you include are updated. ## Custom fields Use `customFields` to store arbitrary key-value data on the customer (e.g., `pricing_plan`, `subscription_source`). Values can be strings, numbers, or booleans. If a custom field doesn't exist yet, it is created automatically. operationId: Customer upsert parameters: - $ref: '#/components/parameters/store-id.param' requestBody: content: application/json: schema: $ref: '#/components/schemas/customer-upsert-request.schema' examples: create_customer: summary: Create a new customer with custom fields value: email: jane@example.com firstName: Jane lastName: Smith phoneNumber: '+11234567890' location: street1: 123 Main St street2: Suite 12 city: Seattle state: Washington stateCode: WA postalCode: '98101' country: United States countryCode: US latitude: 47.6062 longitude: -122.3321 customFields: pricing_plan: com.example.yearly status: Active subscription_source: web loyalty_points: 1250 vip_member: true update_custom_fields: summary: Update only custom fields for an existing customer value: email: jane@example.com customFields: status: Cancelled cancellation_reason: Too expensive required: true responses: '200': content: application/json: schema: $ref: '#/components/schemas/customer-upsert-response.schema' example: id: 67bd4f1a2e3c8d001a5f9b12 email: jane@example.com created: false description: Existing customer updated '201': content: application/json: schema: $ref: '#/components/schemas/customer-upsert-response.schema' example: id: 67bd4f1a2e3c8d001a5f9b12 email: jane@example.com created: true description: New customer created '400': content: application/problem+json: schema: $ref: '#/components/schemas/error.schema' description: Invalid request body or invalid email address '500': content: application/problem+json: schema: $ref: '#/components/schemas/error.schema' description: Internal server error default: content: application/problem+json: schema: $ref: '#/components/schemas/error.schema' description: Error security: - Bearer: [] summary: Create or update customer tags: - Customers summary: Customers /stores/{storeId}/inbound-shipments: description: Inbound shipments for a store. get: description: List inbound shipments, representing inventory in transit or received at a location. Sorted by most recently updated first. operationId: Inbound shipments list parameters: - $ref: '#/components/parameters/page-continue.param' - $ref: '#/components/parameters/page-size.param' - $ref: '#/components/parameters/inbound-shipment-status.param' - $ref: '#/components/parameters/location-id.param' - $ref: '#/components/parameters/created-at-min.param' - $ref: '#/components/parameters/created-at-max.param' responses: '200': content: application/json: schema: properties: inbound_shipments: items: $ref: '#/components/schemas/inbound-shipment-list.schema' type: array required: - inbound_shipments type: object description: Success headers: X-Page-Next: $ref: '#/components/headers/page-next.header' default: content: application/problem+json: schema: $ref: '#/components/schemas/error.schema' description: Error security: - Bearer: [] summary: List Inbound Shipments tags: - Inbound Shipments parameters: - $ref: '#/components/parameters/store-id.param' summary: Inbound Shipments /stores/{storeId}/inbound-shipments/{inboundShipmentId}: description: Single inbound shipment. get: description: Get a single inbound shipment by ID. Returns additional detail fields including purchase orders, transfer orders, files, volume, item discrepancies, and packing modes. operationId: Inbound shipment get responses: '200': content: application/json: schema: properties: inbound_shipment: $ref: '#/components/schemas/inbound-shipment-detail.schema' required: - inbound_shipment type: object description: Success '404': content: application/problem+json: schema: $ref: '#/components/schemas/error.schema' description: Inbound shipment not found default: content: application/problem+json: schema: $ref: '#/components/schemas/error.schema' description: Error security: - Bearer: [] summary: Get Inbound Shipment tags: - Inbound Shipments parameters: - $ref: '#/components/parameters/store-id.param' - $ref: '#/components/parameters/inbound-shipment-id.param' summary: Inbound Shipment /stores/{storeId}/inventory-items: description: In-stock inventory items for a store. get: description: List in-stock inventory items. Only items with on-hand quantity greater than zero are returned. Sorted by most recently updated first. operationId: Inventory items list parameters: - $ref: '#/components/parameters/page-continue.param' - $ref: '#/components/parameters/page-size.param' - $ref: '#/components/parameters/location-id.param' - $ref: '#/components/parameters/inventory-item-kind.param' responses: '200': content: application/json: schema: properties: inventory_items: items: $ref: '#/components/schemas/inventory-item-list.schema' type: array required: - inventory_items type: object description: Success headers: X-Page-Next: $ref: '#/components/headers/page-next.header' default: content: application/problem+json: schema: $ref: '#/components/schemas/error.schema' description: Error security: - Bearer: [] summary: List Inventory Items tags: - Inventory Items parameters: - $ref: '#/components/parameters/store-id.param' summary: Inventory Items /stores/{storeId}/inventory-items/{inventoryItemId}: description: Single inventory item. get: description: Get a single in-stock inventory item by ID. operationId: Inventory item get responses: '200': content: application/json: schema: properties: inventory_item: $ref: '#/components/schemas/inventory-item-list.schema' required: - inventory_item type: object description: Success '404': content: application/problem+json: schema: $ref: '#/components/schemas/error.schema' description: Inventory item not found default: content: application/problem+json: schema: $ref: '#/components/schemas/error.schema' description: Error security: - Bearer: [] summary: Get Inventory Item tags: - Inventory Items parameters: - $ref: '#/components/parameters/store-id.param' - $ref: '#/components/parameters/inventory-item-id.param' summary: Inventory Item /stores/{storeId}/inventory-levels: description: Inventory levels for a store. get: description: List inventory levels, representing the aggregate quantity of a product at a specific location. Sorted by most recently updated first. operationId: Inventory levels list parameters: - $ref: '#/components/parameters/page-continue.param' - $ref: '#/components/parameters/page-size.param' - $ref: '#/components/parameters/location-id.param' - $ref: '#/components/parameters/product-id.param' - $ref: '#/components/parameters/sku.param' - $ref: '#/components/parameters/updated-at-min.param' - $ref: '#/components/parameters/updated-at-max.param' responses: '200': content: application/json: schema: properties: inventory_levels: items: $ref: '#/components/schemas/inventory-level-list.schema' type: array required: - inventory_levels type: object description: Success headers: X-Page-Next: $ref: '#/components/headers/page-next.header' default: content: application/problem+json: schema: $ref: '#/components/schemas/error.schema' description: Error security: - Bearer: [] summary: List Inventory Levels tags: - Inventory Levels parameters: - $ref: '#/components/parameters/store-id.param' summary: Inventory Levels /stores/{storeId}/inventory-levels/{inventoryLevelId}: description: Single inventory level. get: description: Get a single inventory level by ID. Returns additional detail fields including external IDs, creation timestamp, product UPC, and image URL. operationId: Inventory level get responses: '200': content: application/json: schema: properties: inventory_level: $ref: '#/components/schemas/inventory-level-detail.schema' required: - inventory_level type: object description: Success '404': content: application/problem+json: schema: $ref: '#/components/schemas/error.schema' description: Inventory level not found default: content: application/problem+json: schema: $ref: '#/components/schemas/error.schema' description: Error security: - Bearer: [] summary: Get Inventory Level tags: - Inventory Levels parameters: - $ref: '#/components/parameters/store-id.param' - $ref: '#/components/parameters/inventory-level-id.param' summary: Inventory Level /invoices/pending/items.csv: description: Return invoice CSV file. get: description: Get an invoice as a CSV. operationId: Invoice pending csv get responses: '200': content: text/csv: schema: format: binary type: string description: Success default: content: application/problem+json: schema: $ref: '#/components/schemas/error.schema' description: Error security: - Bearer: [] summary: Pending Invoice (CSV) tags: - Invoices summary: Pending invoice /invoices/{invoiceId}/items.csv: description: Return invoice CSV file. get: description: Get an invoice as a CSV. operationId: Invoice csv get parameters: - $ref: '#/components/parameters/invoice-id.param' responses: '200': content: text/csv: schema: format: binary type: string description: Success default: content: application/problem+json: schema: $ref: '#/components/schemas/error.schema' description: Error security: - Bearer: [] summary: Invoice (CSV) tags: - Invoices summary: Invoice /stores/{storeId}/invoices: description: Return a list of invoices. get: description: Get a list of invoices. operationId: Invoice list parameters: - $ref: '#/components/parameters/store-id.param' responses: '200': content: application/json: schema: properties: invoices: items: $ref: '#/components/schemas/invoice.schema' type: array required: - invoices type: object description: Success default: content: application/problem+json: schema: $ref: '#/components/schemas/error.schema' description: Error security: - Bearer: [] summary: List Invoices tags: - Invoices summary: Invoice /stores/{storeId}/admin: description: Navigate to the merchant admin page. get: description: Navigate to the merchant admin page. operationId: Merchant admin navigate parameters: - $ref: '#/components/parameters/store-id.param' responses: '302': description: Redirect summary: Navigate to Merchant Admin tags: - Merchant Admin summary: Merchant admin /stores/{storeId}/orders: description: Orders collection. post: description: Create a new order in the system with line items, customer information, and shipping details. operationId: Order create requestBody: content: application/json: schema: $ref: '#/components/schemas/orders-api-create-order-request.schema' required: true responses: '200': content: application/json: schema: $ref: '#/components/schemas/orders-api-create-order-response.schema' description: Success '400': content: application/json: schema: $ref: '#/components/schemas/orders-api-error.schema' description: Bad Request (validation error) '401': content: application/json: schema: $ref: '#/components/schemas/orders-api-error.schema' description: Unauthorized (invalid or missing API token) '409': content: application/json: schema: $ref: '#/components/schemas/orders-api-error.schema' description: Conflict (duplicate order ID) default: content: application/problem+json: schema: $ref: '#/components/schemas/error.schema' description: Error security: - Bearer: [] summary: Create Order tags: - Orders parameters: - $ref: '#/components/parameters/store-id.param' summary: Orders /stores/{storeId}/orders/{orderId}: description: Single order operations. get: description: Retrieve an existing order from the system, including all fulfillments. The orderId parameter can be either the external order ID you provided when creating the order, or the internal Redo order ID returned from the create order response. operationId: Order get responses: '200': content: application/json: schema: $ref: '#/components/schemas/orders-api-get-order-response.schema' description: Success '401': content: application/json: schema: $ref: '#/components/schemas/orders-api-error.schema' description: Unauthorized (invalid or missing API token) '404': content: application/json: schema: $ref: '#/components/schemas/orders-api-error.schema' description: Order not found default: content: application/problem+json: schema: $ref: '#/components/schemas/error.schema' description: Error security: - Bearer: [] summary: Get Order tags: - Orders delete: description: Delete an order from the system. The orderId parameter can be either the external order ID you provided when creating the order, or the internal Redo order ID returned from the create order response. operationId: Order delete responses: '200': content: application/json: schema: $ref: '#/components/schemas/orders-api-delete-order-response.schema' description: Success '401': content: application/json: schema: $ref: '#/components/schemas/orders-api-error.schema' description: Unauthorized (invalid or missing API token) '404': content: application/json: schema: $ref: '#/components/schemas/orders-api-error.schema' description: Order not found default: content: application/problem+json: schema: $ref: '#/components/schemas/error.schema' description: Error security: - Bearer: [] summary: Delete Order tags: - Orders parameters: - $ref: '#/components/parameters/store-id.param' - $ref: '#/components/parameters/order-id.param' summary: Order /stores/{storeId}/orders/{orderId}/fulfillments: description: Order fulfillments collection. post: description: Create a fulfillment for specific line items within an order, including tracking information. The orderId parameter can be either the external order ID you provided when creating the order, or the internal Redo order ID returned from the create order response. operationId: Fulfillment create requestBody: content: application/json: schema: $ref: '#/components/schemas/orders-api-create-fulfillment-request.schema' required: true responses: '200': content: application/json: schema: $ref: '#/components/schemas/orders-api-fulfillment-response.schema' description: Success '400': content: application/json: schema: $ref: '#/components/schemas/orders-api-error.schema' description: Bad Request (validation error) '401': content: application/json: schema: $ref: '#/components/schemas/orders-api-error.schema' description: Unauthorized (invalid or missing API token) '404': content: application/json: schema: $ref: '#/components/schemas/orders-api-error.schema' description: Order not found default: content: application/problem+json: schema: $ref: '#/components/schemas/error.schema' description: Error security: - Bearer: [] summary: Create Fulfillment tags: - Orders parameters: - $ref: '#/components/parameters/store-id.param' - $ref: '#/components/parameters/order-id.param' summary: Order Fulfillments /stores/{storeId}/orders/{orderId}/fulfillments/{fulfillmentId}/shipment-status: description: Update fulfillment shipment status. post: description: | Post a shipment status update or trigger an automation event for a fulfillment. The status field accepts two types of values: **Statuses** (e.g., `in_transit`, `delivered`): Real carrier tracking statuses that update the shipment's current status. When you send these, the fulfillment's current status is updated to reflect the new state. Triggers any configured automations for that status. **Events** (e.g., `stalled_in_transit`, `delayed`, `arriving_early`): Special event types that trigger automations without changing the current shipment status. The status field remains unchanged, but you can still update estimated delivery date and add tracking history entries. Use these to trigger event-based automations. Both statuses and events can update other fields like estimated delivery date and tracking history. operationId: Fulfillment status update requestBody: content: application/json: schema: $ref: '#/components/schemas/orders-api-update-fulfillment-status-request.schema' required: true responses: '200': content: application/json: schema: $ref: '#/components/schemas/orders-api-fulfillment-response.schema' description: Success '400': content: application/json: schema: $ref: '#/components/schemas/orders-api-error.schema' description: Bad Request (validation error) '401': content: application/json: schema: $ref: '#/components/schemas/orders-api-error.schema' description: Unauthorized (invalid or missing API token) '404': content: application/json: schema: $ref: '#/components/schemas/orders-api-error.schema' description: Fulfillment not found default: content: application/problem+json: schema: $ref: '#/components/schemas/error.schema' description: Error security: - Bearer: [] summary: Update Fulfillment Status tags: - Orders parameters: - $ref: '#/components/parameters/store-id.param' - $ref: '#/components/parameters/order-id.param' - $ref: '#/components/parameters/fulfillment-id.param' summary: Fulfillment Shipment Status /stores/{storeId}/products/bulk-upload: post: description: | Bulk create or update product families and their variants. Submit up to 1,000 product families per request, each containing up to 100 variants. Products are processed asynchronously in batches. Only one bulk upload can run per store at a time. ## Matching Strategy The API uses the following priority to match incoming product families to existing records: 1. **`product_family_id`** — Redo product family ID (direct lookup) 2. **`external_id`** — ID from your external system 3. **SKU** — Matched via variant SKUs If no match is found, a new product family is created. ## Concurrency Only one bulk upload operation can run per store at a time. If a bulk upload is already in progress, the request will return a `409 Conflict` error. operationId: Products bulk upload parameters: - $ref: '#/components/parameters/store-id.param' requestBody: content: application/json: schema: $ref: '#/components/schemas/bulk-product-upload-request.schema' examples: single_product: summary: Single product with one variant value: products: - title: Classic T-Shirt description: A comfortable cotton t-shirt vendor: Acme Apparel tags: - apparel - basics kind: SELLABLE variants: - sku: TSHIRT-BLK-M price: 2999 currency: USD weight: 200 weight_unit: g multiple_products_with_options: summary: Multiple products with options and images value: products: - title: Running Shoes external_id: EXT-SHOES-001 options: - name: Size values: - '9' - '10' - '11' - name: Color values: - Black - White images: - url: https://example.com/shoes-main.jpg alt_text: Running shoes front view variants: - sku: SHOE-BLK-9 price: 12999 currency: USD option_values: - '9' - Black - sku: SHOE-WHT-10 price: 12999 currency: USD option_values: - '10' - White - title: Athletic Socks variants: - sku: SOCK-WHT-L price: 1499 currency: USD required: true responses: '200': content: application/json: schema: $ref: '#/components/schemas/bulk-product-upload-response.schema' examples: success: summary: Successful upload value: total_count: 2 processed_count: 2 error_count: 0 results: - status: created product_family_id: 01H5K3EXAMPLE1 products: - id: 01H5K3EXAMPLE1A sku: SHOE-BLK-9 - id: 01H5K3EXAMPLE1B sku: SHOE-WHT-10 - status: updated product_family_id: 01H5K3EXAMPLE2 products: - id: 01H5K3EXAMPLE2A sku: SOCK-WHT-L partial_failure: summary: Partial failure value: total_count: 2 processed_count: 1 error_count: 1 results: - status: created product_family_id: 01H5K3EXAMPLE3 products: - id: 01H5K3EXAMPLE3A sku: TSHIRT-BLK-M - status: error error: Duplicate SKU found in request description: Upload completed '400': content: application/json: schema: $ref: '#/components/schemas/error.schema' description: Invalid request body or missing required fields '409': content: application/json: schema: $ref: '#/components/schemas/error.schema' description: A bulk upload is already in progress for this store default: content: application/problem+json: schema: $ref: '#/components/schemas/error.schema' description: Error security: - Bearer: [] summary: Bulk upload products tags: - Products /returns/{returnId}: description: Return. get: description: Get return. operationId: Return get responses: '200': content: application/json: schema: p