Products
Get Product
Get a single product by ID with all related data.
Update Product
Update an existing product by ID. All fields are optional on update.
Delete Product
Delete a product by ID. Deletion fails if the product (or, for a matrix parent, any of its variations) is still referenced by a RESTRICT foreign key: sales order lines, bundle sales order lines, purchase order lines, inventory movements, FIFO layers, inventory adjustments, assembly lines, warehouse transfer lines, return receipt lines, RMA lines, sales credit lines, inbound shipment lines, blemished products, or subscription editions.
Get Product by SKU
Get a product by its exact SKU.
Create Product
Create a new product.
List Products
List all products. Supports searching, sorting, filtering, pagination, and column selection.
Bulk Delete Products
Bulk delete multiple products. For large datasets, deletion is processed in the background via a queue.
Duplicate Product
Duplicate an existing product into a brand-new one with its own SKU.
Get Product Constants
Returns enumeration constants used in product forms: product types, weight units, dimension units, attribute types, warehouse types, and inventory movement types.
Get Create Product Form
Returns the data needed to pre-populate the create product form.
Get Edit Product Form
Returns the product data pre-populated for the edit form.
Search Products
Search products by SKU, name, or barcode. Results are ranked by a 9-tier relevance scheme so typing a full SKU surfaces the exact product first:
Barcode Lookup
Exact-match barcode or SKU lookup for barcode scanning. Prioritises barcode match first, then falls back to SKU match. Only active products are returned. Returns null in data if no match found.
Check Product Deletability
Check whether one or more products can be safely deleted. Returns deletability status with reasons and usage record samples for each product.
Archive Product
Archive a product by ID. Sets archived_at timestamp.
Unarchive Product
Unarchive a product by ID. Clears the archived_at timestamp.
Bulk Archive Products
Bulk archive multiple products.
Bulk Unarchive Products
Bulk unarchive multiple products.
Get Product Inventory
Get detailed inventory breakdown for a product across all warehouses. Includes FBA real-time data, Pan-EU rollup, supplier drop-ship inventory, and purchase order inbound quantities.
Get Available Lots (FEFO)
Active FIFO layers available to CONSUME for a product in a given warehouse — only layers with remaining (unfulfilled) quantity are returned.
Get FBA Inventory
Returns the Amazon FBA inventory listings for a product at a specific warehouse. Each row is an FBA-enabled product listing on the warehouse's sales channel, with its real-time FBA inventory snapshot (available, reserved, in transit, total, inbound) and Amazon **condition** (e.g. `NewItem`, `UsedLikeNew`). Rows are sorted by available quantity descending. Listings are scoped to the warehouse's marketplace (the warehouse `country_code`): a US FBA warehouse returns only US listings, never another marketplace's listing (e.g. a Canadian one), mirroring how Amazon MCF fulfils from the destination's marketplace.
Refresh Inventory Cache
Synchronously refreshes the inventory cache for a specific product. This forces a recalculation of inventory totals and average cost.
Get Sales Channel Inventory
Get inventory broken down by sales channel for a specific product.
Get Last Purchase Price
Get the most recent purchase price for a product from non-draft purchase orders.
Get Product Inventory Movements
Get paginated inventory movements for a specific product.
Get Product FIFO Layers
Get FIFO cost layers for a specific product.
List Consignment Inventory
Consigned (supplier-owned) stock on hand that hasn't sold yet, one row per cost layer, with unit cost, total value, and days-on-consignment aging, plus the supplier and purchase order it came from. Drives the return-unsold workflow.
Get Consignment Valuation Summary
Off-balance-sheet valuation memo for consigned (supplier-owned) stock on hand. It reports the total value of consigned inventory you hold and the equal received-not-billed obligation that would arise if it were grossed up onto the balance sheet, broken down by supplier. Because the asset and obligation always offset, the net balance-sheet impact is zero. This is a disclosure only — it is never posted to the general ledger and is not synced to any accounting integration.
Get Product Attributes
Get all available attributes for a product, including direct attributes and those inherited from category attribute groups.
Update Product Attributes
Add or update attributes on a product. Syncs without detaching other existing attributes.
Delete Product Attributes
Remove specific attributes from a product by attribute IDs.
Get Product Attributes Grouped
Get product attributes organised into grouped (by attribute group) and direct (ungrouped) sections.
Assign Attribute Groups
Sync attribute groups assigned to a product. This replaces all current attribute group assignments.
Get All Attributes for Products
Get unique variant attributes across multiple products. Used by mapping modals.
Get Product Suppliers
Get all supplier relationships for a product, including pricing tiers per supplier.
Set Default Supplier
Mark a supplier as the default supplier for a product. Clears the is_default flag from all other suppliers for this product.
Get Product Components
Get all component products for a bundle or kit product.
Get Product Bundles
Get all bundles that this product is a component of.
Get Potential Bundles
Calculate potential bundle quantities for a kit product based on current stock of its components per warehouse and inventory status.
Get Product Drop-ship Status
Return the drop-ship eligibility checklist for a product — whether a sales order line for this product will auto-route to a supplier's drop-ship warehouse, and which gate conditions are currently met or failing.
Get Product Variations
Get all variation products for a matrix (parent) product.
Get Variation Attributes
Get unique variant attributes used across all variations of a matrix product.
List Product Images
Get all images for a product.
Add Product Image
Add a new image to a product. The `image` field accepts EITHER an uploaded file (multipart/form-data) OR a URL / base64 string (application/json).
Bulk Update/Create Product Images
Bulk update or create multiple images for a product at once.
List Broken Product Images
List product images the on-demand image health check confirmed broken — rows where `image_checked_at` is set AND `resolvable` is false. Newest-checked first, with primary images surfaced to the top. Each row is a single image with its parent product for cross-linking.
Bulk Delete Product Images
Delete the selected product images. Deletion runs through the model so its side effects fire: if a deleted image was a product's primary image, that product is left without a primary image, and affected packing slips are re-queued.
Mark Product Images Resolvable
Clear the broken flag on the selected images — the report's in-browser load proved they resolve, so the server's false positive is healed. Uses a mass update, so ProductImage save side effects (primary reset, packing-slip re-queue) do NOT fire and `image_checked_at` is preserved.
Update Product Image
Updates a product image's metadata and optionally replaces the image itself.
Delete Product Image
Deletes a product image. Destructive: if the image file is hosted on SKU.io storage, the stored file (and its thumbnail) is removed from the server as well; externally hosted URLs are simply detached from the product.
Upload Image
Uploads an image to SKU.io storage and returns its hosted URL. Use the returned URL anywhere an image URL is accepted — for example when creating or updating product images, or for store branding assets.
Delete Uploaded Image
Removes a previously uploaded image (and its thumbnail) from SKU.io storage.
Create Blemished Product
Create a blemished (damaged/used) product derived from an existing standard product.
Generate Blemished SKU Pattern
Generate a blemished SKU based on the tenant's blemished SKU pattern settings and the original product's SKU.
Import Products
Execute the product import — creates products from the validated data. Should be called after validate.
Preview Import (Legacy CSV)
Legacy endpoint for CSV import preview (delegates to ImportsData trait).
Get Import Fields
Returns dynamic import fields including custom attributes for the column mapping UI.
Download Import Template
Download an XLSX import template with headers, sample data, field guide, and reference data from the tenant's account.
Validate Import
Validate mapped import data and return a preview. No data is created — safe to call repeatedly for client-side validation before executing the actual import.
Download Merge Template
Download a CSV template for bulk product merging. Contains columns: old_sku, destination_sku.
Upload Merge CSV
Upload a CSV file with product merge pairs. Validates the SKU pairs and creates a session (cached for 2 hours) for preview and execution.
Create Merge Session (Single Pair)
Create a merge session for a single SKU pair without uploading a CSV. Validates that both SKUs exist and are compatible.
Get Merge Preview
Get a preview of what will happen when the merge is executed. Shows data changes for each SKU pair.
Execute Merge
Execute the product merge for all pairs in the session. Merges sales order lines, purchase order lines, and other references from the old SKU to the destination SKU. Clears the session cache after execution.
List Product Listings
Get paginated product listings (channel listings) for a specific product. Refreshes inventory cache for all listings before returning.
Update Product Default Financial Line Type
Sets or clears the default financial line type used when this product is added to financial documents.
List Products
Get a paginated list of products using Spatie QueryBuilder.
Search Products
Returns the same paginated product catalog list as the GET version of this endpoint, but accepts filters as a JSON request body instead of the query string. Use this POST variant when the filter set is too large or too complex to fit in a URL (for example, filtering by a long list of SKUs or ids). The response includes an `unfiltered_total` alongside the standard paginator totals so clients can show both the filtered and total record counts.
Get Product
Get a single product with default relations loaded (brand, primaryImage, primaryCategory, tags, defaultSupplierProduct.supplier, totalInventory).
Get Product Inventory
Get inventory breakdown by warehouse for a product.
Get Product Suppliers
Get supplier products for a product, including pricing tiers and supplier inventory.
Get Product Pricing
Get product pricing tiers.
Upsert Product Pricing
Idempotently upsert a single pricing tier price for a product.
Get Product Components
Get components for a bundle or kit product.
Get Parent Products
Get parent bundle/kit products that include this product as a component.
Get Bundle Potential
Get bundle assembly potential — how many units can be assembled from current component inventory.
Get Product Variations
Get variations of a matrix product.
Get Product Images
Get all images for a product, sorted by sort_order.
Get Product Listings
Get paginated sales channel listings for a product.
Get Product Listings Summary
Get listing counts grouped by integration for a product.
Get Product Inventory Movements
Get paginated inventory movements for a product.
List Product Sales
List sales order lines for a product — one row per line with parent-order context (order number, date, sales channel, customer, order and fulfillment status) and per-line financials (unit price, line revenue, profit). Draft orders are excluded. Results are live order data.
Get Product FIFO Layers
Get paginated FIFO cost layers for a product.
Get Product Lots & Expiry
Paginated lot/expiry breakdown scoped to a single product (the product detail 'Lots & Expiry' tab).
Get Product Lot Genealogy
Read-only lot genealogy / traceability tree for a single FIFO layer (lot) of this product.
Get Product Activity Log
Get paginated activity log for a product (covers Product and SupplierProductPricing events).
Get Product Notes
Get notes for a product, sorted by most recent first.
Get Product Purchase Order Lines
Get purchase order lines for a product, filtered by status.
Get Product Inventory Tally
Get enriched inventory tally data for a product at a specific warehouse.
Get Product Warehouse Transfer Lines
Get warehouse transfer lines for a product, showing in-transit or received quantities.
Get Product Holds
Get inventory holds for a product.
Get Product Reservation Integrity
Get reservation integrity issues for a product.
Get Product Active Reservations
Get active (outstanding) inventory reservations for a product.
Get Bulk Edit Metadata
Get dynamic field metadata for the bulk edit UI: attributes (with options), pricing tiers, supplier pricing tiers, and suppliers.
Fetch Products for Bulk Edit
Fetch products with all editable fields loaded for the bulk edit page.
Bulk Edit Products (Apply to All)
Apply the same set of changes to all selected products.
Bulk Edit Products (Individual)
Apply individual per-product changes.
Preview Bulk Edit
Preview bulk edit changes without applying them (dry run). Safe to call repeatedly.
List Bundle Workshop Products
List all bundle/kit products with component counts and configuration status.
Auto-Detect Bundle Candidates
Auto-detect standard products that may be bundles/kits based on naming patterns.
Batch Convert Products to Bundle/Kit
Batch convert standard products to bundle/kit types.
Check Bundle Restrictions
Check which products have sale/assembly inventory movements that would restrict type changes.
Get Bundle Components
Get components for a specific bundle/kit product in the Bundle Workshop.
Save Bundle Components
Save/sync components for a bundle/kit. Replaces all existing components.
Get Restricting Movements
Get paginated sale/assembly inventory movements that restrict type changes for a product.
Update Bundle Type
Update the type of an existing bundle/kit product (bundle ↔ kit ↔ standard).
Download Supplier Link Template
Download the supplier link import template XLSX.
Validate Supplier Link Import
Validate supplier link import data and return a preview.
Import Supplier Links
Imports run as a tracked job — a bulk import can exceed a ~100s edge-proxy limit (Cloudflare 524), so the rows are processed off the request cycle. Returns a tracked_job_log_id; progress and the created/updated/failed counts surface via the tracked job log endpoints.
Export Product List
Export products as XLSX or CSV.
Download Export File
Download a completed products export file produced by a queued export tracked job.
Lookup Products
Lightweight paginated product lookup that returns only core identifying fields (id, sku, name, barcode, type, unit_cost, price, image_url) — much faster than the full List Products endpoint when you only need to resolve products by SKU, name, barcode, or id.
List Products
Paginated list of Magento 2 products scoped to one integration instance.
Get Products Latest Sync Info
Returns a summary of the most recent product sync: the latest product title and `magento_updated_at`, total / mapped / unmapped product counts, and the `last_synced_at` timestamp (the local `updated_at` of the most recently fetched product).
Get Products Filter Options
Aggregated dropdown options for the products filter panel — `attribute_sets` (distinct `attribute_set_id` values surfaced as `{id, name}` pairs) and `categories` (distinct Magento category ids derived from each product's raw_payload category links, surfaced as `{id, name}` pairs labelled `Category #{id}` until category-name sync lands). Drawn live from the locally synced product rows; empty / never-synced instances surface empty lists.
Search Products (Magento live)
Searches the upstream Magento catalog directly, rather than products already synced to SKU.io. Currently returns an empty `data` array — live catalog search is not yet available. Use the product list endpoint with `filter[search]=…` to search synced products.
Get Field Mappings
Returns the Magento attribute → SKU.io Product field mappings used by `FieldMappingSettingsModal`. Both arrays come from the integration instance's `integration_settings` JSON column (`product_field_mappings` and `magento_attributes`).
Update Field Mappings
Replace the stored `product_field_mappings` array. The modal always sends the full list, so the server overwrites (rather than merges).
Refresh Products
Dispatch the tracked job that refreshes Magento 2 products. Returns the `tracked_job_log_id` so the frontend can pivot the global JobProgressTray to it. Job name prefix is `Refresh Magento 2 Products: ` — the page's `lastCompletedJob` watcher matches on this prefix.
Bulk Map Products
Bulk-map Magento products to SKU.io Products by SKU / SKU-contains / name. **Synchronous** (no tracked job) and **caps at 500 products per call** to keep the request bounded.
Bulk Unmap Products
Clear `sku_product_id` + `sku_product_listing_id` on the selected products. Synchronous.
Bulk Archive Products
Sets `archived_at = now()` on the selected products. Synchronous. Same body shape as `Bulk Unmap Products` (`select_all` + `ids`).
Bulk Unarchive Products
Clears `archived_at` on the selected products. Synchronous. Same body shape as `Bulk Unmap Products` (`select_all` + `ids`).
Bulk Delete Magento Records
Delete the local Magento product records for the selected ids (does NOT delete anything in Magento itself — only the locally synced rows). Synchronous. Same body shape as the other bulk ops (`select_all` + `ids`).
Get Product
Single product detail. Eager-loads `integrationInstance`, `parent`, and `children` (the children collection populates only for configurable products).
Delete Product
Delete the local Magento product row (does NOT delete anything in Magento itself). No body.
Get Orders For Product
Paginated list of Magento 2 orders that contain this product. The match is `lineItems.magento_product_id = product.magento_entity_id` OR (when the product has a SKU) `lineItems.sku = product.sku`. Ordered by `magento_created_at DESC`. Eager-loads `integrationInstance` + `lineItems`.
Get Raw Product Payload
Returns the stored `raw_payload` JSON (the exact Magento REST product shape we last upserted). Intended for debugging the mapping pipeline; the frontend exposes it in the detail drawer's Raw tab. Returns `{}` when no payload has been stored.
Map Product
Map a single Magento product to a SKU.io Product.
Unmap Product
Clears `sku_product_id` and `sku_product_listing_id` on a single Magento product (no body). Returns the refreshed `Magento2ProductResource`.
Smart Match SKU Product
Suggest SKU.io products that could be mapped to this Magento 2 product. Returns three buckets:
Create SKU Product From Magento
Create a brand-new SKU.io product seeded from this Magento 2 product (with optional user overrides + a field-mapping override list), then map the Magento row to the newly created SKU product. The whole operation runs inside a single DB transaction.
Refresh Single Product
**Synchronous** single-product resync. Looks up the product in Magento by its SKU, upserts the local row, and returns the refreshed `Magento2ProductResource` so the frontend can swap the row in place. No `tracked_job_log_id` is returned (unlike the bulk `Refresh Products` endpoint).
Archive Product
Archive a single product (sets `archived_at = now()`). No body.
Unarchive Product
Unarchive a single product (clears `archived_at`). No body.