DevelopersAPI reference

Products API

REST endpoints for products in SKUFlow: 15 operations with parameters, request and response fields, permissions and curl examples.

Base URL: https://app.skuflow.ai/api. Every call needs Authorization: Bearer skf_… (Authentication); {organizationId} ($ORGANIZATION_ID in the examples) is your business's id.

OperationEndpointRisk
List productsGET /organizations/{organizationId}/productsread
Add a product by handPOST /organizations/{organizationId}/productswrite
A productGET /organizations/{organizationId}/products/{productId}read
Change a productPATCH /organizations/{organizationId}/products/{productId}write
Delete a productDELETE /organizations/{organizationId}/products/{productId}sensitive
Refresh from the supplierPOST /organizations/{organizationId}/products/{productId}/refreshwrite
Add a product picturePOST /organizations/{organizationId}/products/{productId}/imageswrite
Change a product picturePATCH /organizations/{organizationId}/products/{productId}/images/{imageId}write
Delete a product pictureDELETE /organizations/{organizationId}/products/{productId}/images/{imageId}sensitive
Set large-format finishingPOST /organizations/{organizationId}/products/{productId}/finishing-optionswrite
Price a large-format pieceGET /organizations/{organizationId}/products/{productId}/large-format-priceread
Add a variantPOST /organizations/{organizationId}/products/{productId}/variantswrite
Change a variantPATCH /organizations/{organizationId}/products/{productId}/variants/{variantId}write
Delete a variantDELETE /organizations/{organizationId}/products/{productId}/variants/{variantId}sensitive
Change several variantsPOST /organizations/{organizationId}/products/{productId}/variants/bulkwrite

List products

GET /organizations/{organizationId}/products

The business's products with their main picture, price range, variant and colour counts and supplier stock. Filter by kind, status (ACTIVE by default), brand, category or supplier connection; query searches names, style numbers, brands, tags and SKUs. Read-only.

Permissionproducts.read (Owner, Admin, Staff, Member)
Riskread, OAuth scope skuflow.read. Read: reads only.
MCP toolproducts_list (toolset catalog)

Parameters

NameInTypeRequiredDescription
queryquerystringNoSearch names, style numbers, brands, tags and SKUs. Up to 200 characters.
kindqueryenumNoAPPAREL (garments: colour × size), PROMO (promotional items), LARGE_FORMAT (banners and signs priced per square foot from a material) or OTHER. One of APPAREL, PROMO, LARGE_FORMAT, OTHER.
statusqueryenumNoACTIVE (sold) or ARCHIVED (kept, hidden). One of ACTIVE, ARCHIVED.
brandquerystringNoUp to 200 characters.
categoryquerystringNoUp to 200 characters.
supplierConnectionIdquerystringNoOnly products imported from this connection.
limitqueryintegerNoPage size, 1–200. Default 50.
offsetqueryintegerNoRows to skip; the answer's total counts every match. Default 0.

Example

curl "https://app.skuflow.ai/api/organizations/$ORGANIZATION_ID/products" \
  -H "Authorization: Bearer $SKUFLOW_API_KEY"

Response

200: the answer's fields
FieldTypeDescription
totalinteger
itemsarray of object
items[].idstring
items[].namestring
items[].slugstringURL segment, unique in the business (stores use it).
items[].brandstring or null
items[].styleNumberstring or null
items[].descriptionstring or null
items[].categorystring or null
items[].tagsarray of string
items[].kindenumAPPAREL (garments: colour × size), PROMO (promotional items), LARGE_FORMAT (banners and signs priced per square foot from a material) or OTHER. One of APPAREL, PROMO, LARGE_FORMAT, OTHER.
items[].taxClassenum or nullTax class of its lines; null = by kind. One of STANDARD, CLOTHING, SHIPPING, EXEMPT.
items[].statusenumACTIVE (sold) or ARCHIVED (kept, hidden). One of ACTIVE, ARCHIVED.
items[].sourceenumOne of SUPPLIER, MANUAL.
items[].supplierConnectionIdstring or null
items[].supplierStyleIdstring or null
items[].overriddenFieldsarray of stringFields the owner changed on a supplier product: re-imports keep them.
items[].pricingRuleIdstring or nullThe rule chosen for this product; null = the matching rule.
items[].baseCostCentsintegerThe cheapest active variant's cost. Present only for roles with costing.read.
items[].basePriceCentsintegerThe cheapest active variant's price.
items[].minWidthInnumber or null
items[].maxWidthInnumber or null
items[].minHeightInnumber or null
items[].maxHeightInnumber or null
items[].minChargeCentsinteger or null
items[].lastSupplierSyncAtstring (date-time) or null
items[].createdAtstring (date-time)
items[].updatedAtstring (date-time)
items[].supplierConnectionobject or null
items[].supplierConnection.idstring
items[].supplierConnection.displayNamestring
items[].supplierConnection.kindenumSS_ACTIVEWEAR, SANMAR, ALPHABRODER, JDS, MOMENTEC, PROMOSTANDARDS (any other supplier on the standard) or CSV (a catalog file). One of SS_ACTIVEWEAR, SANMAR, ALPHABRODER, JDS, MOMENTEC, PROMOSTANDARDS, CSV.
items[].imageobject or null
items[].image.idstring
items[].image.colorNamestring or null
items[].image.viewenumOne of FRONT, BACK, SIDE, DETAIL, OTHER.
items[].image.statusstringPENDING (being copied from the supplier), STORED (in SKUFlow's storage) or FAILED.
items[].image.isPrimaryboolean
items[].image.sortOrderinteger
items[].image.sourceUrlstring or null
items[].image.urlstring or nullShow this: a signed URL of our copy (1 hour), else the source.
items[].variantCountinteger
items[].colorCountinteger
items[].priceFromCentsinteger or null
items[].priceToCentsinteger or null
items[].supplierStockinteger or null
brandsarray of stringEvery brand in the catalog, for the filter.

Add a product by hand

POST /organizations/{organizationId}/products

Creates a product that is not from a supplier, with its variants (colour × size; one plain variant when none are given) and, for LARGE_FORMAT, its materials (variants with material and a cost or price per square foot) and finishing options. Prices follow the pricing rule unless priceOverrideCents is set. To add supplier products use POST /suppliers/{supplierConnectionId}/catalog/import instead.

Permissionproducts.manage (Owner, Admin, Staff)
Riskwrite, OAuth scope skuflow.write. Write: creates or changes records inside the business; nothing leaves it.
MCP toolproducts_create (toolset catalog)

Request body

FieldTypeRequiredDescription
namestringYesUp to 500 characters.
slugstring or nullNoURL segment (made from the name when blank). Up to 80 characters.
brandstring or nullNoUp to 200 characters.
styleNumberstring or nullNoUp to 100 characters.
descriptionstring or nullNo
categorystring or nullNoUp to 200 characters.
tagsarray of stringNoUp to 50 items.
kindenumNoAPPAREL (garments: colour × size), PROMO (promotional items), LARGE_FORMAT (banners and signs priced per square foot from a material) or OTHER. One of APPAREL, PROMO, LARGE_FORMAT, OTHER.
taxClassenum or nullNoHow its lines are taxed: CLOTHING (some states tax apparel less), STANDARD or EXEMPT; null = by kind (APPAREL is CLOTHING). One of STANDARD, CLOTHING, EXEMPT.
statusenumNoACTIVE (sold) or ARCHIVED (kept, hidden). One of ACTIVE, ARCHIVED.
pricingRuleIdstring or nullNoFrom GET /pricing-rules; null follows the matching rule.
decorationAreasarray of objectNoWhere art can go on the product, per image view (used by decoration pricing and mockups). Up to 30 items.
decorationAreas[].keystringYesA stable key for the location, e.g. "front", "left-chest", "full-back". Up to 60 characters.
decorationAreas[].namestringYesWhat the customer reads: Left chest. Up to 120 characters.
decorationAreas[].viewenumYesThe product image view the area sits on. One of FRONT, BACK, SIDE, DETAIL, OTHER.
decorationAreas[].maxWidthInnumber or nullNoAt most 1000.
decorationAreas[].maxHeightInnumber or nullNoAt most 1000.
decorationAreas[].xnumber or nullNo0–1.
decorationAreas[].ynumber or nullNo0–1.
decorationAreas[].widthnumber or nullNo0–1.
decorationAreas[].heightnumber or nullNo0–1.
decorationAreas[].methodsarray of enumNoThe decoration methods that suit this area (empty = any). Up to 10 items.
minWidthInnumber or nullNoAt most 10000.
maxWidthInnumber or nullNoAt most 10000.
minHeightInnumber or nullNoAt most 10000.
maxHeightInnumber or nullNoAt most 10000.
minChargeCentsinteger or nullNoLarge format: the least one piece costs. 0–100000000.
variantsarray of objectNoUp to 500 items.
variants[].colorNamestring or nullNoUp to 200 characters.
variants[].colorHexstring or nullNo
variants[].sizestring or nullNoUp to 50 characters.
variants[].materialstring or nullNoLarge format: the material, e.g. 13 oz vinyl banner. Up to 200 characters.
variants[].skustring or nullNoUp to 100 characters.
variants[].gtinstring or nullNoUp to 50 characters.
variants[].costCentsintegerNoUnit cost in cents (manual products; imported variants take the supplier's). 0–100000000.
variants[].priceOverrideCentsinteger or nullNoYour own price in cents; null follows the pricing rule. 0–100000000.
variants[].costPerSqFtCentsinteger or nullNoLarge format: the material's cost per square foot. 0–100000000.
variants[].pricePerSqFtCentsinteger or nullNoLarge format: your price per square foot; null follows the rule. 0–100000000.
variants[].weightGramsinteger or nullNo0–1000000.
variants[].activebooleanNo
variants[].sortOrderintegerNo0–100000.
finishingOptionsarray of objectNoUp to 30 items.
finishingOptions[].idstring or nullNoAn existing option's id to keep it (from the product); omit for a new one.
finishingOptions[].namestringYesUp to 200 characters.
finishingOptions[].pricingenumYesFLAT per piece, PER_LINEAR_FOOT of the edges, or PER_GROMMET every spacingIn inches. One of FLAT, PER_LINEAR_FOOT, PER_GROMMET.
finishingOptions[].edgesenumNoWhich edges: ALL, TOP_BOTTOM, LEFT_RIGHT or TOP. One of ALL, TOP_BOTTOM, LEFT_RIGHT, TOP.
finishingOptions[].spacingInnumber or nullNoAt most 240.
finishingOptions[].priceCentsintegerYes0–100000000.
finishingOptions[].costCentsintegerNo0–100000000.
finishingOptions[].activebooleanNo

Example

curl -X POST "https://app.skuflow.ai/api/organizations/$ORGANIZATION_ID/products" \
  -H "Authorization: Bearer $SKUFLOW_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"name":"Dana Whitfield"}'

Response

200: the answer's fields
FieldTypeDescription
idstring
namestring
slugstringURL segment, unique in the business (stores use it).
brandstring or null
styleNumberstring or null
descriptionstring or null
categorystring or null
tagsarray of string
kindenumAPPAREL (garments: colour × size), PROMO (promotional items), LARGE_FORMAT (banners and signs priced per square foot from a material) or OTHER. One of APPAREL, PROMO, LARGE_FORMAT, OTHER.
taxClassenum or nullTax class of its lines; null = by kind. One of STANDARD, CLOTHING, SHIPPING, EXEMPT.
statusenumACTIVE (sold) or ARCHIVED (kept, hidden). One of ACTIVE, ARCHIVED.
sourceenumOne of SUPPLIER, MANUAL.
supplierConnectionIdstring or null
supplierStyleIdstring or null
overriddenFieldsarray of stringFields the owner changed on a supplier product: re-imports keep them.
pricingRuleIdstring or nullThe rule chosen for this product; null = the matching rule.
baseCostCentsintegerThe cheapest active variant's cost. Present only for roles with costing.read.
basePriceCentsintegerThe cheapest active variant's price.
minWidthInnumber or null
maxWidthInnumber or null
minHeightInnumber or null
maxHeightInnumber or null
minChargeCentsinteger or null
lastSupplierSyncAtstring (date-time) or null
createdAtstring (date-time)
updatedAtstring (date-time)
supplierConnectionobject or null
supplierConnection.idstring
supplierConnection.displayNamestring
supplierConnection.kindenumSS_ACTIVEWEAR, SANMAR, ALPHABRODER, JDS, MOMENTEC, PROMOSTANDARDS (any other supplier on the standard) or CSV (a catalog file). One of SS_ACTIVEWEAR, SANMAR, ALPHABRODER, JDS, MOMENTEC, PROMOSTANDARDS, CSV.
decorationAreasarray of objectWhere art can go on the product, per image view (used by decoration pricing and mockups). Up to 30 items.
decorationAreas[].keystringA stable key for the location, e.g. "front", "left-chest", "full-back". Up to 60 characters.
decorationAreas[].namestringWhat the customer reads: Left chest. Up to 120 characters.
decorationAreas[].viewenumThe product image view the area sits on. One of FRONT, BACK, SIDE, DETAIL, OTHER.
decorationAreas[].maxWidthInnumber or nullAt most 1000.
decorationAreas[].maxHeightInnumber or nullAt most 1000.
decorationAreas[].xnumber or null0–1.
decorationAreas[].ynumber or null0–1.
decorationAreas[].widthnumber or null0–1.
decorationAreas[].heightnumber or null0–1.
decorationAreas[].methodsarray of enumThe decoration methods that suit this area (empty = any). Up to 10 items.
pricingRuleobject or null
pricingRule.idstring
pricingRule.namestring
appliedPricingRuleobject or nullThe rule prices follow now (own, matching or default); null = keystone ×2 ending .99.
appliedPricingRule.idstring
appliedPricingRule.namestring
imagesarray of object
images[].idstring
images[].colorNamestring or null
images[].viewenumOne of FRONT, BACK, SIDE, DETAIL, OTHER.
images[].statusstringPENDING (being copied from the supplier), STORED (in SKUFlow's storage) or FAILED.
images[].isPrimaryboolean
images[].sortOrderinteger
images[].sourceUrlstring or null
images[].urlstring or nullShow this: a signed URL of our copy (1 hour), else the source.
variantsarray of object
variants[].idstring
variants[].productIdstring
variants[].colorNamestring or null
variants[].colorHexstring or null
variants[].sizestring or null
variants[].materialstring or nullLarge format: the material.
variants[].skustring or null
variants[].gtinstring or null
variants[].supplierPartIdstring or null
variants[].costCentsintegerUnit cost (the supplier's for imported variants). Present only for roles with costing.read.
variants[].priceCentsintegerThe selling price: the rule's, or the owner's override.
variants[].priceOverrideCentsinteger or nullThe owner's price; null follows the pricing rule.
variants[].followsRuleboolean
variants[].costPerSqFtCentsinteger or null
variants[].pricePerSqFtCentsinteger or null
variants[].weightGramsinteger or null
variants[].activeboolean
variants[].sortOrderinteger
variants[].overriddenFieldsarray of string
variants[].supplierStockinteger or nullUnits at the supplier across its warehouses.
variants[].supplierStockAtstring (date-time) or null
variants[].discontinuedAtstring (date-time) or nullWhen the supplier stopped listing this part.
variants[].warehousesarray of object
variants[].warehouses[].codestringThe supplier's warehouse code.
variants[].warehouses[].namestring or null
variants[].warehouses[].quantityinteger
variants[].warehouses[].fetchedAtstring (date-time)
finishingOptionsarray of object
finishingOptions[].idstring
finishingOptions[].namestring
finishingOptions[].pricingenumOne of FLAT, PER_LINEAR_FOOT, PER_GROMMET.
finishingOptions[].edgesenumOne of ALL, TOP_BOTTOM, LEFT_RIGHT, TOP.
finishingOptions[].spacingInnumber or null
finishingOptions[].priceCentsintegerInteger cents.
finishingOptions[].costCentsintegerOur cost per unit of this option. Present only for roles with costing.read.
finishingOptions[].activeboolean
finishingOptions[].sortOrderinteger

A product

GET /organizations/{organizationId}/products/{productId}

One product with every variant (price, rule or override, supplier stock per warehouse), its pictures, large-format finishing options, decoration areas and the pricing rule its prices follow. Read-only.

Permissionproducts.read (Owner, Admin, Staff, Member)
Riskread, OAuth scope skuflow.read. Read: reads only.
MCP toolproducts_get (toolset catalog)

Parameters

NameInTypeRequiredDescription
productIdpathstringYes

Example

curl "https://app.skuflow.ai/api/organizations/$ORGANIZATION_ID/products/{productId}" \
  -H "Authorization: Bearer $SKUFLOW_API_KEY"

Response

200: the answer's fields
FieldTypeDescription
idstring
namestring
slugstringURL segment, unique in the business (stores use it).
brandstring or null
styleNumberstring or null
descriptionstring or null
categorystring or null
tagsarray of string
kindenumAPPAREL (garments: colour × size), PROMO (promotional items), LARGE_FORMAT (banners and signs priced per square foot from a material) or OTHER. One of APPAREL, PROMO, LARGE_FORMAT, OTHER.
taxClassenum or nullTax class of its lines; null = by kind. One of STANDARD, CLOTHING, SHIPPING, EXEMPT.
statusenumACTIVE (sold) or ARCHIVED (kept, hidden). One of ACTIVE, ARCHIVED.
sourceenumOne of SUPPLIER, MANUAL.
supplierConnectionIdstring or null
supplierStyleIdstring or null
overriddenFieldsarray of stringFields the owner changed on a supplier product: re-imports keep them.
pricingRuleIdstring or nullThe rule chosen for this product; null = the matching rule.
baseCostCentsintegerThe cheapest active variant's cost. Present only for roles with costing.read.
basePriceCentsintegerThe cheapest active variant's price.
minWidthInnumber or null
maxWidthInnumber or null
minHeightInnumber or null
maxHeightInnumber or null
minChargeCentsinteger or null
lastSupplierSyncAtstring (date-time) or null
createdAtstring (date-time)
updatedAtstring (date-time)
supplierConnectionobject or null
supplierConnection.idstring
supplierConnection.displayNamestring
supplierConnection.kindenumSS_ACTIVEWEAR, SANMAR, ALPHABRODER, JDS, MOMENTEC, PROMOSTANDARDS (any other supplier on the standard) or CSV (a catalog file). One of SS_ACTIVEWEAR, SANMAR, ALPHABRODER, JDS, MOMENTEC, PROMOSTANDARDS, CSV.
decorationAreasarray of objectWhere art can go on the product, per image view (used by decoration pricing and mockups). Up to 30 items.
decorationAreas[].keystringA stable key for the location, e.g. "front", "left-chest", "full-back". Up to 60 characters.
decorationAreas[].namestringWhat the customer reads: Left chest. Up to 120 characters.
decorationAreas[].viewenumThe product image view the area sits on. One of FRONT, BACK, SIDE, DETAIL, OTHER.
decorationAreas[].maxWidthInnumber or nullAt most 1000.
decorationAreas[].maxHeightInnumber or nullAt most 1000.
decorationAreas[].xnumber or null0–1.
decorationAreas[].ynumber or null0–1.
decorationAreas[].widthnumber or null0–1.
decorationAreas[].heightnumber or null0–1.
decorationAreas[].methodsarray of enumThe decoration methods that suit this area (empty = any). Up to 10 items.
pricingRuleobject or null
pricingRule.idstring
pricingRule.namestring
appliedPricingRuleobject or nullThe rule prices follow now (own, matching or default); null = keystone ×2 ending .99.
appliedPricingRule.idstring
appliedPricingRule.namestring
imagesarray of object
images[].idstring
images[].colorNamestring or null
images[].viewenumOne of FRONT, BACK, SIDE, DETAIL, OTHER.
images[].statusstringPENDING (being copied from the supplier), STORED (in SKUFlow's storage) or FAILED.
images[].isPrimaryboolean
images[].sortOrderinteger
images[].sourceUrlstring or null
images[].urlstring or nullShow this: a signed URL of our copy (1 hour), else the source.
variantsarray of object
variants[].idstring
variants[].productIdstring
variants[].colorNamestring or null
variants[].colorHexstring or null
variants[].sizestring or null
variants[].materialstring or nullLarge format: the material.
variants[].skustring or null
variants[].gtinstring or null
variants[].supplierPartIdstring or null
variants[].costCentsintegerUnit cost (the supplier's for imported variants). Present only for roles with costing.read.
variants[].priceCentsintegerThe selling price: the rule's, or the owner's override.
variants[].priceOverrideCentsinteger or nullThe owner's price; null follows the pricing rule.
variants[].followsRuleboolean
variants[].costPerSqFtCentsinteger or null
variants[].pricePerSqFtCentsinteger or null
variants[].weightGramsinteger or null
variants[].activeboolean
variants[].sortOrderinteger
variants[].overriddenFieldsarray of string
variants[].supplierStockinteger or nullUnits at the supplier across its warehouses.
variants[].supplierStockAtstring (date-time) or null
variants[].discontinuedAtstring (date-time) or nullWhen the supplier stopped listing this part.
variants[].warehousesarray of object
variants[].warehouses[].codestringThe supplier's warehouse code.
variants[].warehouses[].namestring or null
variants[].warehouses[].quantityinteger
variants[].warehouses[].fetchedAtstring (date-time)
finishingOptionsarray of object
finishingOptions[].idstring
finishingOptions[].namestring
finishingOptions[].pricingenumOne of FLAT, PER_LINEAR_FOOT, PER_GROMMET.
finishingOptions[].edgesenumOne of ALL, TOP_BOTTOM, LEFT_RIGHT, TOP.
finishingOptions[].spacingInnumber or null
finishingOptions[].priceCentsintegerInteger cents.
finishingOptions[].costCentsintegerOur cost per unit of this option. Present only for roles with costing.read.
finishingOptions[].activeboolean
finishingOptions[].sortOrderinteger

Change a product

PATCH /organizations/{organizationId}/products/{productId}

Changes the fields sent. On a supplier product, a changed name, description, brand, style number, category, tags or kind becomes an owner override that re-imports keep; clearOverrides hands fields back to the supplier (the next refresh fills them). status: ARCHIVED hides it from selling. Prices are recomputed when the rule changes.

Permissionproducts.manage (Owner, Admin, Staff)
Riskwrite, OAuth scope skuflow.write. Write: creates or changes records inside the business; nothing leaves it.
MCP toolproducts_update (toolset catalog)

Parameters

NameInTypeRequiredDescription
productIdpathstringYes

Request body

FieldTypeRequiredDescription
namestringNoUp to 500 characters.
slugstring or nullNoURL segment (made from the name when blank). Up to 80 characters.
brandstring or nullNoUp to 200 characters.
styleNumberstring or nullNoUp to 100 characters.
descriptionstring or nullNo
categorystring or nullNoUp to 200 characters.
tagsarray of stringNoUp to 50 items.
kindenumNoAPPAREL (garments: colour × size), PROMO (promotional items), LARGE_FORMAT (banners and signs priced per square foot from a material) or OTHER. One of APPAREL, PROMO, LARGE_FORMAT, OTHER.
taxClassenum or nullNoHow its lines are taxed: CLOTHING (some states tax apparel less), STANDARD or EXEMPT; null = by kind (APPAREL is CLOTHING). One of STANDARD, CLOTHING, EXEMPT.
statusenumNoACTIVE (sold) or ARCHIVED (kept, hidden). One of ACTIVE, ARCHIVED.
pricingRuleIdstring or nullNoFrom GET /pricing-rules; null follows the matching rule.
decorationAreasarray of objectNoWhere art can go on the product, per image view (used by decoration pricing and mockups). Up to 30 items.
decorationAreas[].keystringYesA stable key for the location, e.g. "front", "left-chest", "full-back". Up to 60 characters.
decorationAreas[].namestringYesWhat the customer reads: Left chest. Up to 120 characters.
decorationAreas[].viewenumYesThe product image view the area sits on. One of FRONT, BACK, SIDE, DETAIL, OTHER.
decorationAreas[].maxWidthInnumber or nullNoAt most 1000.
decorationAreas[].maxHeightInnumber or nullNoAt most 1000.
decorationAreas[].xnumber or nullNo0–1.
decorationAreas[].ynumber or nullNo0–1.
decorationAreas[].widthnumber or nullNo0–1.
decorationAreas[].heightnumber or nullNo0–1.
decorationAreas[].methodsarray of enumNoThe decoration methods that suit this area (empty = any). Up to 10 items.
minWidthInnumber or nullNoAt most 10000.
maxWidthInnumber or nullNoAt most 10000.
minHeightInnumber or nullNoAt most 10000.
maxHeightInnumber or nullNoAt most 10000.
minChargeCentsinteger or nullNoLarge format: the least one piece costs. 0–100000000.
clearOverridesarray of enumNoFields to hand back to the supplier. Up to 7 items.

Example

curl -X PATCH "https://app.skuflow.ai/api/organizations/$ORGANIZATION_ID/products/{productId}" \
  -H "Authorization: Bearer $SKUFLOW_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"name":"Dana Whitfield","slug":"string","brand":"string"}'

Response

200: the answer's fields
FieldTypeDescription
idstring
namestring
slugstringURL segment, unique in the business (stores use it).
brandstring or null
styleNumberstring or null
descriptionstring or null
categorystring or null
tagsarray of string
kindenumAPPAREL (garments: colour × size), PROMO (promotional items), LARGE_FORMAT (banners and signs priced per square foot from a material) or OTHER. One of APPAREL, PROMO, LARGE_FORMAT, OTHER.
taxClassenum or nullTax class of its lines; null = by kind. One of STANDARD, CLOTHING, SHIPPING, EXEMPT.
statusenumACTIVE (sold) or ARCHIVED (kept, hidden). One of ACTIVE, ARCHIVED.
sourceenumOne of SUPPLIER, MANUAL.
supplierConnectionIdstring or null
supplierStyleIdstring or null
overriddenFieldsarray of stringFields the owner changed on a supplier product: re-imports keep them.
pricingRuleIdstring or nullThe rule chosen for this product; null = the matching rule.
baseCostCentsintegerThe cheapest active variant's cost. Present only for roles with costing.read.
basePriceCentsintegerThe cheapest active variant's price.
minWidthInnumber or null
maxWidthInnumber or null
minHeightInnumber or null
maxHeightInnumber or null
minChargeCentsinteger or null
lastSupplierSyncAtstring (date-time) or null
createdAtstring (date-time)
updatedAtstring (date-time)
supplierConnectionobject or null
supplierConnection.idstring
supplierConnection.displayNamestring
supplierConnection.kindenumSS_ACTIVEWEAR, SANMAR, ALPHABRODER, JDS, MOMENTEC, PROMOSTANDARDS (any other supplier on the standard) or CSV (a catalog file). One of SS_ACTIVEWEAR, SANMAR, ALPHABRODER, JDS, MOMENTEC, PROMOSTANDARDS, CSV.
decorationAreasarray of objectWhere art can go on the product, per image view (used by decoration pricing and mockups). Up to 30 items.
decorationAreas[].keystringA stable key for the location, e.g. "front", "left-chest", "full-back". Up to 60 characters.
decorationAreas[].namestringWhat the customer reads: Left chest. Up to 120 characters.
decorationAreas[].viewenumThe product image view the area sits on. One of FRONT, BACK, SIDE, DETAIL, OTHER.
decorationAreas[].maxWidthInnumber or nullAt most 1000.
decorationAreas[].maxHeightInnumber or nullAt most 1000.
decorationAreas[].xnumber or null0–1.
decorationAreas[].ynumber or null0–1.
decorationAreas[].widthnumber or null0–1.
decorationAreas[].heightnumber or null0–1.
decorationAreas[].methodsarray of enumThe decoration methods that suit this area (empty = any). Up to 10 items.
pricingRuleobject or null
pricingRule.idstring
pricingRule.namestring
appliedPricingRuleobject or nullThe rule prices follow now (own, matching or default); null = keystone ×2 ending .99.
appliedPricingRule.idstring
appliedPricingRule.namestring
imagesarray of object
images[].idstring
images[].colorNamestring or null
images[].viewenumOne of FRONT, BACK, SIDE, DETAIL, OTHER.
images[].statusstringPENDING (being copied from the supplier), STORED (in SKUFlow's storage) or FAILED.
images[].isPrimaryboolean
images[].sortOrderinteger
images[].sourceUrlstring or null
images[].urlstring or nullShow this: a signed URL of our copy (1 hour), else the source.
variantsarray of object
variants[].idstring
variants[].productIdstring
variants[].colorNamestring or null
variants[].colorHexstring or null
variants[].sizestring or null
variants[].materialstring or nullLarge format: the material.
variants[].skustring or null
variants[].gtinstring or null
variants[].supplierPartIdstring or null
variants[].costCentsintegerUnit cost (the supplier's for imported variants). Present only for roles with costing.read.
variants[].priceCentsintegerThe selling price: the rule's, or the owner's override.
variants[].priceOverrideCentsinteger or nullThe owner's price; null follows the pricing rule.
variants[].followsRuleboolean
variants[].costPerSqFtCentsinteger or null
variants[].pricePerSqFtCentsinteger or null
variants[].weightGramsinteger or null
variants[].activeboolean
variants[].sortOrderinteger
variants[].overriddenFieldsarray of string
variants[].supplierStockinteger or nullUnits at the supplier across its warehouses.
variants[].supplierStockAtstring (date-time) or null
variants[].discontinuedAtstring (date-time) or nullWhen the supplier stopped listing this part.
variants[].warehousesarray of object
variants[].warehouses[].codestringThe supplier's warehouse code.
variants[].warehouses[].namestring or null
variants[].warehouses[].quantityinteger
variants[].warehouses[].fetchedAtstring (date-time)
finishingOptionsarray of object
finishingOptions[].idstring
finishingOptions[].namestring
finishingOptions[].pricingenumOne of FLAT, PER_LINEAR_FOOT, PER_GROMMET.
finishingOptions[].edgesenumOne of ALL, TOP_BOTTOM, LEFT_RIGHT, TOP.
finishingOptions[].spacingInnumber or null
finishingOptions[].priceCentsintegerInteger cents.
finishingOptions[].costCentsintegerOur cost per unit of this option. Present only for roles with costing.read.
finishingOptions[].activeboolean
finishingOptions[].sortOrderinteger

Delete a product

DELETE /organizations/{organizationId}/products/{productId}

Destructive: deletes the product with its variants, pictures (and our stored copies), finishing options and supplier stock. Consider archiving instead (PATCH status ARCHIVED). Quotes and invoices keep their own line text and prices.

Permissionproducts.manage (Owner, Admin, Staff)
Risksensitive, OAuth scope skuflow.sensitive. Sensitive: moves money, deletes, sends or shows something to a customer, or grants or revokes access.
MCP toolproducts_delete (toolset catalog)
ApprovalOver MCP, this tool always waits for your approval in SKUFlow. See Approvals.

Parameters

NameInTypeRequiredDescription
productIdpathstringYes

Example

curl -X DELETE "https://app.skuflow.ai/api/organizations/$ORGANIZATION_ID/products/{productId}" \
  -H "Authorization: Bearer $SKUFLOW_API_KEY"

Response

200: the answer's fields
FieldTypeDescription
deletedtrue

Refresh from the supplier

POST /organizations/{organizationId}/products/{productId}/refresh

Reads an imported product's style from its supplier now: live cost and stock per warehouse, new pictures, and supplier facts the owner did not override; then reprices. Adds no variants (import again to add colours or sizes). 409 for a product made by hand or when the supplier refuses the connection.

Permissionproducts.manage (Owner, Admin, Staff)
Riskwrite, OAuth scope skuflow.write. Write: creates or changes records inside the business; nothing leaves it.
MCP toolproducts_refresh (toolset catalog)

Parameters

NameInTypeRequiredDescription
productIdpathstringYes

Example

curl -X POST "https://app.skuflow.ai/api/organizations/$ORGANIZATION_ID/products/{productId}/refresh" \
  -H "Authorization: Bearer $SKUFLOW_API_KEY"

Response

200: the answer's fields
FieldTypeDescription
productIdstring
variantsUpdatedinteger
repricedintegerVariants whose price changed.

Add a product picture

POST /organizations/{organizationId}/products/{productId}/images

Adds a picture in one call: the bytes as contentBase64 (JPEG, PNG, WebP or GIF, up to 10 MB) or a public sourceUrl SKUFlow downloads through its SSRF guard. Tag it with the colour and the view (FRONT, BACK, SIDE, DETAIL) so mockups can find it; the first picture becomes the main one.

Permissionproducts.manage (Owner, Admin, Staff)
Riskwrite, OAuth scope skuflow.write. Write: creates or changes records inside the business; nothing leaves it.
MCP toolproducts_addImage (toolset catalog)

Parameters

NameInTypeRequiredDescription
productIdpathstringYes

Request body

FieldTypeRequiredDescription
fileNamestringNoThe file's name, e.g. receipt.jpg (default: from the URL, else 'file'). Up to 500 characters.
contentTypestringNoMIME type, e.g. image/jpeg or application/pdf. Optional: taken from a data: URL, the URL's answer or the file's first bytes. Up to 200 characters.
contentBase64stringNoThe file's bytes as base64 (a data: URL is accepted too). Up to 10 MB. Give this or sourceUrl.
sourceUrlstring (uri)NoA public http(s) URL SKUFlow downloads the file from (up to 10 MB, 20 s, 3 redirects; private and internal addresses are refused). Give this or contentBase64. Up to 2000 characters.
colorNamestring or nullNoThe colour it shows (a variant's colorName). Up to 200 characters.
viewenumNoOne of FRONT, BACK, SIDE, DETAIL, OTHER.
isPrimarybooleanNoMake it the product's main picture.

Example

curl -X POST "https://app.skuflow.ai/api/organizations/$ORGANIZATION_ID/products/{productId}/images" \
  -H "Authorization: Bearer $SKUFLOW_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"fileName":"string","contentType":"string","contentBase64":"string"}'

Response

200: the answer's fields
FieldTypeDescription
idstring
namestring
slugstringURL segment, unique in the business (stores use it).
brandstring or null
styleNumberstring or null
descriptionstring or null
categorystring or null
tagsarray of string
kindenumAPPAREL (garments: colour × size), PROMO (promotional items), LARGE_FORMAT (banners and signs priced per square foot from a material) or OTHER. One of APPAREL, PROMO, LARGE_FORMAT, OTHER.
taxClassenum or nullTax class of its lines; null = by kind. One of STANDARD, CLOTHING, SHIPPING, EXEMPT.
statusenumACTIVE (sold) or ARCHIVED (kept, hidden). One of ACTIVE, ARCHIVED.
sourceenumOne of SUPPLIER, MANUAL.
supplierConnectionIdstring or null
supplierStyleIdstring or null
overriddenFieldsarray of stringFields the owner changed on a supplier product: re-imports keep them.
pricingRuleIdstring or nullThe rule chosen for this product; null = the matching rule.
baseCostCentsintegerThe cheapest active variant's cost. Present only for roles with costing.read.
basePriceCentsintegerThe cheapest active variant's price.
minWidthInnumber or null
maxWidthInnumber or null
minHeightInnumber or null
maxHeightInnumber or null
minChargeCentsinteger or null
lastSupplierSyncAtstring (date-time) or null
createdAtstring (date-time)
updatedAtstring (date-time)
supplierConnectionobject or null
supplierConnection.idstring
supplierConnection.displayNamestring
supplierConnection.kindenumSS_ACTIVEWEAR, SANMAR, ALPHABRODER, JDS, MOMENTEC, PROMOSTANDARDS (any other supplier on the standard) or CSV (a catalog file). One of SS_ACTIVEWEAR, SANMAR, ALPHABRODER, JDS, MOMENTEC, PROMOSTANDARDS, CSV.
decorationAreasarray of objectWhere art can go on the product, per image view (used by decoration pricing and mockups). Up to 30 items.
decorationAreas[].keystringA stable key for the location, e.g. "front", "left-chest", "full-back". Up to 60 characters.
decorationAreas[].namestringWhat the customer reads: Left chest. Up to 120 characters.
decorationAreas[].viewenumThe product image view the area sits on. One of FRONT, BACK, SIDE, DETAIL, OTHER.
decorationAreas[].maxWidthInnumber or nullAt most 1000.
decorationAreas[].maxHeightInnumber or nullAt most 1000.
decorationAreas[].xnumber or null0–1.
decorationAreas[].ynumber or null0–1.
decorationAreas[].widthnumber or null0–1.
decorationAreas[].heightnumber or null0–1.
decorationAreas[].methodsarray of enumThe decoration methods that suit this area (empty = any). Up to 10 items.
pricingRuleobject or null
pricingRule.idstring
pricingRule.namestring
appliedPricingRuleobject or nullThe rule prices follow now (own, matching or default); null = keystone ×2 ending .99.
appliedPricingRule.idstring
appliedPricingRule.namestring
imagesarray of object
images[].idstring
images[].colorNamestring or null
images[].viewenumOne of FRONT, BACK, SIDE, DETAIL, OTHER.
images[].statusstringPENDING (being copied from the supplier), STORED (in SKUFlow's storage) or FAILED.
images[].isPrimaryboolean
images[].sortOrderinteger
images[].sourceUrlstring or null
images[].urlstring or nullShow this: a signed URL of our copy (1 hour), else the source.
variantsarray of object
variants[].idstring
variants[].productIdstring
variants[].colorNamestring or null
variants[].colorHexstring or null
variants[].sizestring or null
variants[].materialstring or nullLarge format: the material.
variants[].skustring or null
variants[].gtinstring or null
variants[].supplierPartIdstring or null
variants[].costCentsintegerUnit cost (the supplier's for imported variants). Present only for roles with costing.read.
variants[].priceCentsintegerThe selling price: the rule's, or the owner's override.
variants[].priceOverrideCentsinteger or nullThe owner's price; null follows the pricing rule.
variants[].followsRuleboolean
variants[].costPerSqFtCentsinteger or null
variants[].pricePerSqFtCentsinteger or null
variants[].weightGramsinteger or null
variants[].activeboolean
variants[].sortOrderinteger
variants[].overriddenFieldsarray of string
variants[].supplierStockinteger or nullUnits at the supplier across its warehouses.
variants[].supplierStockAtstring (date-time) or null
variants[].discontinuedAtstring (date-time) or nullWhen the supplier stopped listing this part.
variants[].warehousesarray of object
variants[].warehouses[].codestringThe supplier's warehouse code.
variants[].warehouses[].namestring or null
variants[].warehouses[].quantityinteger
variants[].warehouses[].fetchedAtstring (date-time)
finishingOptionsarray of object
finishingOptions[].idstring
finishingOptions[].namestring
finishingOptions[].pricingenumOne of FLAT, PER_LINEAR_FOOT, PER_GROMMET.
finishingOptions[].edgesenumOne of ALL, TOP_BOTTOM, LEFT_RIGHT, TOP.
finishingOptions[].spacingInnumber or null
finishingOptions[].priceCentsintegerInteger cents.
finishingOptions[].costCentsintegerOur cost per unit of this option. Present only for roles with costing.read.
finishingOptions[].activeboolean
finishingOptions[].sortOrderinteger

Change a product picture

PATCH /organizations/{organizationId}/products/{productId}/images/{imageId}

Sets a picture's colour or view, or makes it the main picture (the previous main one stops being main).

Permissionproducts.manage (Owner, Admin, Staff)
Riskwrite, OAuth scope skuflow.write. Write: creates or changes records inside the business; nothing leaves it.
MCP toolproducts_updateImage (toolset catalog)

Parameters

NameInTypeRequiredDescription
productIdpathstringYes
imageIdpathstringYes

Request body

FieldTypeRequiredDescription
colorNamestring or nullNoUp to 200 characters.
viewenumNoOne of FRONT, BACK, SIDE, DETAIL, OTHER.
isPrimarybooleanNo

Example

curl -X PATCH "https://app.skuflow.ai/api/organizations/$ORGANIZATION_ID/products/{productId}/images/{imageId}" \
  -H "Authorization: Bearer $SKUFLOW_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"colorName":"string","view":"FRONT","isPrimary":true}'

Response

200: the answer's fields
FieldTypeDescription
idstring
namestring
slugstringURL segment, unique in the business (stores use it).
brandstring or null
styleNumberstring or null
descriptionstring or null
categorystring or null
tagsarray of string
kindenumAPPAREL (garments: colour × size), PROMO (promotional items), LARGE_FORMAT (banners and signs priced per square foot from a material) or OTHER. One of APPAREL, PROMO, LARGE_FORMAT, OTHER.
taxClassenum or nullTax class of its lines; null = by kind. One of STANDARD, CLOTHING, SHIPPING, EXEMPT.
statusenumACTIVE (sold) or ARCHIVED (kept, hidden). One of ACTIVE, ARCHIVED.
sourceenumOne of SUPPLIER, MANUAL.
supplierConnectionIdstring or null
supplierStyleIdstring or null
overriddenFieldsarray of stringFields the owner changed on a supplier product: re-imports keep them.
pricingRuleIdstring or nullThe rule chosen for this product; null = the matching rule.
baseCostCentsintegerThe cheapest active variant's cost. Present only for roles with costing.read.
basePriceCentsintegerThe cheapest active variant's price.
minWidthInnumber or null
maxWidthInnumber or null
minHeightInnumber or null
maxHeightInnumber or null
minChargeCentsinteger or null
lastSupplierSyncAtstring (date-time) or null
createdAtstring (date-time)
updatedAtstring (date-time)
supplierConnectionobject or null
supplierConnection.idstring
supplierConnection.displayNamestring
supplierConnection.kindenumSS_ACTIVEWEAR, SANMAR, ALPHABRODER, JDS, MOMENTEC, PROMOSTANDARDS (any other supplier on the standard) or CSV (a catalog file). One of SS_ACTIVEWEAR, SANMAR, ALPHABRODER, JDS, MOMENTEC, PROMOSTANDARDS, CSV.
decorationAreasarray of objectWhere art can go on the product, per image view (used by decoration pricing and mockups). Up to 30 items.
decorationAreas[].keystringA stable key for the location, e.g. "front", "left-chest", "full-back". Up to 60 characters.
decorationAreas[].namestringWhat the customer reads: Left chest. Up to 120 characters.
decorationAreas[].viewenumThe product image view the area sits on. One of FRONT, BACK, SIDE, DETAIL, OTHER.
decorationAreas[].maxWidthInnumber or nullAt most 1000.
decorationAreas[].maxHeightInnumber or nullAt most 1000.
decorationAreas[].xnumber or null0–1.
decorationAreas[].ynumber or null0–1.
decorationAreas[].widthnumber or null0–1.
decorationAreas[].heightnumber or null0–1.
decorationAreas[].methodsarray of enumThe decoration methods that suit this area (empty = any). Up to 10 items.
pricingRuleobject or null
pricingRule.idstring
pricingRule.namestring
appliedPricingRuleobject or nullThe rule prices follow now (own, matching or default); null = keystone ×2 ending .99.
appliedPricingRule.idstring
appliedPricingRule.namestring
imagesarray of object
images[].idstring
images[].colorNamestring or null
images[].viewenumOne of FRONT, BACK, SIDE, DETAIL, OTHER.
images[].statusstringPENDING (being copied from the supplier), STORED (in SKUFlow's storage) or FAILED.
images[].isPrimaryboolean
images[].sortOrderinteger
images[].sourceUrlstring or null
images[].urlstring or nullShow this: a signed URL of our copy (1 hour), else the source.
variantsarray of object
variants[].idstring
variants[].productIdstring
variants[].colorNamestring or null
variants[].colorHexstring or null
variants[].sizestring or null
variants[].materialstring or nullLarge format: the material.
variants[].skustring or null
variants[].gtinstring or null
variants[].supplierPartIdstring or null
variants[].costCentsintegerUnit cost (the supplier's for imported variants). Present only for roles with costing.read.
variants[].priceCentsintegerThe selling price: the rule's, or the owner's override.
variants[].priceOverrideCentsinteger or nullThe owner's price; null follows the pricing rule.
variants[].followsRuleboolean
variants[].costPerSqFtCentsinteger or null
variants[].pricePerSqFtCentsinteger or null
variants[].weightGramsinteger or null
variants[].activeboolean
variants[].sortOrderinteger
variants[].overriddenFieldsarray of string
variants[].supplierStockinteger or nullUnits at the supplier across its warehouses.
variants[].supplierStockAtstring (date-time) or null
variants[].discontinuedAtstring (date-time) or nullWhen the supplier stopped listing this part.
variants[].warehousesarray of object
variants[].warehouses[].codestringThe supplier's warehouse code.
variants[].warehouses[].namestring or null
variants[].warehouses[].quantityinteger
variants[].warehouses[].fetchedAtstring (date-time)
finishingOptionsarray of object
finishingOptions[].idstring
finishingOptions[].namestring
finishingOptions[].pricingenumOne of FLAT, PER_LINEAR_FOOT, PER_GROMMET.
finishingOptions[].edgesenumOne of ALL, TOP_BOTTOM, LEFT_RIGHT, TOP.
finishingOptions[].spacingInnumber or null
finishingOptions[].priceCentsintegerInteger cents.
finishingOptions[].costCentsintegerOur cost per unit of this option. Present only for roles with costing.read.
finishingOptions[].activeboolean
finishingOptions[].sortOrderinteger

Delete a product picture

DELETE /organizations/{organizationId}/products/{productId}/images/{imageId}

Destructive: removes the picture and our stored copy. A supplier picture comes back on the next import or refresh.

Permissionproducts.manage (Owner, Admin, Staff)
Risksensitive, OAuth scope skuflow.sensitive. Sensitive: moves money, deletes, sends or shows something to a customer, or grants or revokes access.
MCP toolproducts_deleteImage (toolset catalog)
ApprovalOver MCP, this tool always waits for your approval in SKUFlow. See Approvals.

Parameters

NameInTypeRequiredDescription
productIdpathstringYes
imageIdpathstringYes

Example

curl -X DELETE "https://app.skuflow.ai/api/organizations/$ORGANIZATION_ID/products/{productId}/images/{imageId}" \
  -H "Authorization: Bearer $SKUFLOW_API_KEY"

Response

200: the answer's fields
FieldTypeDescription
deletedtrue

Set large-format finishing

POST /organizations/{organizationId}/products/{productId}/finishing-options

Replaces a product's finishing options with this list (hems and pole pockets per linear foot of chosen edges, grommets every N inches, flat add-ons). Send existing options with their id to keep them; options left out are removed.

Permissionproducts.manage (Owner, Admin, Staff)
Riskwrite, OAuth scope skuflow.write. Write: creates or changes records inside the business; nothing leaves it.
MCP toolproducts_setFinishingOptions (toolset catalog)

Parameters

NameInTypeRequiredDescription
productIdpathstringYes

Request body

FieldTypeRequiredDescription
optionsarray of objectYesUp to 30 items.
options[].idstring or nullNoAn existing option's id to keep it (from the product); omit for a new one.
options[].namestringYesUp to 200 characters.
options[].pricingenumYesFLAT per piece, PER_LINEAR_FOOT of the edges, or PER_GROMMET every spacingIn inches. One of FLAT, PER_LINEAR_FOOT, PER_GROMMET.
options[].edgesenumNoWhich edges: ALL, TOP_BOTTOM, LEFT_RIGHT or TOP. One of ALL, TOP_BOTTOM, LEFT_RIGHT, TOP.
options[].spacingInnumber or nullNoAt most 240.
options[].priceCentsintegerYes0–100000000.
options[].costCentsintegerNo0–100000000.
options[].activebooleanNo

Example

curl -X POST "https://app.skuflow.ai/api/organizations/$ORGANIZATION_ID/products/{productId}/finishing-options" \
  -H "Authorization: Bearer $SKUFLOW_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"options":[{"name":"Dana Whitfield","pricing":"FLAT","priceCents":12500}]}'

Response

200: the answer's fields
FieldTypeDescription
idstring
namestring
slugstringURL segment, unique in the business (stores use it).
brandstring or null
styleNumberstring or null
descriptionstring or null
categorystring or null
tagsarray of string
kindenumAPPAREL (garments: colour × size), PROMO (promotional items), LARGE_FORMAT (banners and signs priced per square foot from a material) or OTHER. One of APPAREL, PROMO, LARGE_FORMAT, OTHER.
taxClassenum or nullTax class of its lines; null = by kind. One of STANDARD, CLOTHING, SHIPPING, EXEMPT.
statusenumACTIVE (sold) or ARCHIVED (kept, hidden). One of ACTIVE, ARCHIVED.
sourceenumOne of SUPPLIER, MANUAL.
supplierConnectionIdstring or null
supplierStyleIdstring or null
overriddenFieldsarray of stringFields the owner changed on a supplier product: re-imports keep them.
pricingRuleIdstring or nullThe rule chosen for this product; null = the matching rule.
baseCostCentsintegerThe cheapest active variant's cost. Present only for roles with costing.read.
basePriceCentsintegerThe cheapest active variant's price.
minWidthInnumber or null
maxWidthInnumber or null
minHeightInnumber or null
maxHeightInnumber or null
minChargeCentsinteger or null
lastSupplierSyncAtstring (date-time) or null
createdAtstring (date-time)
updatedAtstring (date-time)
supplierConnectionobject or null
supplierConnection.idstring
supplierConnection.displayNamestring
supplierConnection.kindenumSS_ACTIVEWEAR, SANMAR, ALPHABRODER, JDS, MOMENTEC, PROMOSTANDARDS (any other supplier on the standard) or CSV (a catalog file). One of SS_ACTIVEWEAR, SANMAR, ALPHABRODER, JDS, MOMENTEC, PROMOSTANDARDS, CSV.
decorationAreasarray of objectWhere art can go on the product, per image view (used by decoration pricing and mockups). Up to 30 items.
decorationAreas[].keystringA stable key for the location, e.g. "front", "left-chest", "full-back". Up to 60 characters.
decorationAreas[].namestringWhat the customer reads: Left chest. Up to 120 characters.
decorationAreas[].viewenumThe product image view the area sits on. One of FRONT, BACK, SIDE, DETAIL, OTHER.
decorationAreas[].maxWidthInnumber or nullAt most 1000.
decorationAreas[].maxHeightInnumber or nullAt most 1000.
decorationAreas[].xnumber or null0–1.
decorationAreas[].ynumber or null0–1.
decorationAreas[].widthnumber or null0–1.
decorationAreas[].heightnumber or null0–1.
decorationAreas[].methodsarray of enumThe decoration methods that suit this area (empty = any). Up to 10 items.
pricingRuleobject or null
pricingRule.idstring
pricingRule.namestring
appliedPricingRuleobject or nullThe rule prices follow now (own, matching or default); null = keystone ×2 ending .99.
appliedPricingRule.idstring
appliedPricingRule.namestring
imagesarray of object
images[].idstring
images[].colorNamestring or null
images[].viewenumOne of FRONT, BACK, SIDE, DETAIL, OTHER.
images[].statusstringPENDING (being copied from the supplier), STORED (in SKUFlow's storage) or FAILED.
images[].isPrimaryboolean
images[].sortOrderinteger
images[].sourceUrlstring or null
images[].urlstring or nullShow this: a signed URL of our copy (1 hour), else the source.
variantsarray of object
variants[].idstring
variants[].productIdstring
variants[].colorNamestring or null
variants[].colorHexstring or null
variants[].sizestring or null
variants[].materialstring or nullLarge format: the material.
variants[].skustring or null
variants[].gtinstring or null
variants[].supplierPartIdstring or null
variants[].costCentsintegerUnit cost (the supplier's for imported variants). Present only for roles with costing.read.
variants[].priceCentsintegerThe selling price: the rule's, or the owner's override.
variants[].priceOverrideCentsinteger or nullThe owner's price; null follows the pricing rule.
variants[].followsRuleboolean
variants[].costPerSqFtCentsinteger or null
variants[].pricePerSqFtCentsinteger or null
variants[].weightGramsinteger or null
variants[].activeboolean
variants[].sortOrderinteger
variants[].overriddenFieldsarray of string
variants[].supplierStockinteger or nullUnits at the supplier across its warehouses.
variants[].supplierStockAtstring (date-time) or null
variants[].discontinuedAtstring (date-time) or nullWhen the supplier stopped listing this part.
variants[].warehousesarray of object
variants[].warehouses[].codestringThe supplier's warehouse code.
variants[].warehouses[].namestring or null
variants[].warehouses[].quantityinteger
variants[].warehouses[].fetchedAtstring (date-time)
finishingOptionsarray of object
finishingOptions[].idstring
finishingOptions[].namestring
finishingOptions[].pricingenumOne of FLAT, PER_LINEAR_FOOT, PER_GROMMET.
finishingOptions[].edgesenumOne of ALL, TOP_BOTTOM, LEFT_RIGHT, TOP.
finishingOptions[].spacingInnumber or null
finishingOptions[].priceCentsintegerInteger cents.
finishingOptions[].costCentsintegerOur cost per unit of this option. Present only for roles with costing.read.
finishingOptions[].activeboolean
finishingOptions[].sortOrderinteger

Price a large-format piece

GET /organizations/{organizationId}/products/{productId}/large-format-price

What one large-format piece (and the quantity) costs the customer at a width × height in inches, a material (variantId) and finishing options (comma-separated ids): square feet × the material's price per square foot, plus finishing (per foot of edge, per grommet or flat), lifted to the minimum charge. problems lists sizes outside the product's limits. Read-only.

Permissionproducts.read (Owner, Admin, Staff, Member)
Riskread, OAuth scope skuflow.read. Read: reads only.
MCP toolproducts_largeFormatPrice (toolset catalog)

Parameters

NameInTypeRequiredDescription
productIdpathstringYes
variantIdquerystringYesThe material: one of the product's variants.
widthInquerynumberYesAt most 10000.
heightInquerynumberYesAt most 10000.
quantityqueryintegerNo1–100000. Default 1.
finishingquerystringNoFinishing option ids, comma-separated. Up to 2000 characters.

Example

curl "https://app.skuflow.ai/api/organizations/$ORGANIZATION_ID/products/{productId}/large-format-price?variantId=variant_id&widthIn=1&heightIn=1" \
  -H "Authorization: Bearer $SKUFLOW_API_KEY"

Response

200: the answer's fields
FieldTypeDescription
okboolean
problemsarray of string
materialobject
material.idstring
material.namestring
material.pricePerSqFtCentsinteger
sqFtnumber
materialCentsinteger
finishingarray of object
finishing[].idstring
finishing[].namestring
finishing[].unitsnumber
finishing[].unitstring
finishing[].centsinteger
finishingCentsinteger
unitPriceCentsinteger
minChargeAppliedboolean
totalCentsinteger
pieceCostCentsintegerOur cost per piece. Present only for roles with costing.read.

Add a variant

POST /organizations/{organizationId}/products/{productId}/variants

Adds a variant to a product: a colour × size, or a large-format material with its cost or price per square foot. The price follows the pricing rule unless priceOverrideCents is set.

Permissionproducts.manage (Owner, Admin, Staff)
Riskwrite, OAuth scope skuflow.write. Write: creates or changes records inside the business; nothing leaves it.
MCP toolproductVariants_create (toolset catalog)

Parameters

NameInTypeRequiredDescription
productIdpathstringYes

Request body

FieldTypeRequiredDescription
colorNamestring or nullNoUp to 200 characters.
colorHexstring or nullNo
sizestring or nullNoUp to 50 characters.
materialstring or nullNoLarge format: the material, e.g. 13 oz vinyl banner. Up to 200 characters.
skustring or nullNoUp to 100 characters.
gtinstring or nullNoUp to 50 characters.
costCentsintegerNoUnit cost in cents (manual products; imported variants take the supplier's). 0–100000000.
priceOverrideCentsinteger or nullNoYour own price in cents; null follows the pricing rule. 0–100000000.
costPerSqFtCentsinteger or nullNoLarge format: the material's cost per square foot. 0–100000000.
pricePerSqFtCentsinteger or nullNoLarge format: your price per square foot; null follows the rule. 0–100000000.
weightGramsinteger or nullNo0–1000000.
activebooleanNo
sortOrderintegerNo0–100000.

Example

curl -X POST "https://app.skuflow.ai/api/organizations/$ORGANIZATION_ID/products/{productId}/variants" \
  -H "Authorization: Bearer $SKUFLOW_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"colorName":"string","colorHex":"string","size":"string"}'

Response

200: the answer's fields
FieldTypeDescription
idstring
productIdstring
colorNamestring or null
colorHexstring or null
sizestring or null
materialstring or nullLarge format: the material.
skustring or null
gtinstring or null
supplierPartIdstring or null
costCentsintegerUnit cost (the supplier's for imported variants). Present only for roles with costing.read.
priceCentsintegerThe selling price: the rule's, or the owner's override.
priceOverrideCentsinteger or nullThe owner's price; null follows the pricing rule.
followsRuleboolean
costPerSqFtCentsinteger or null
pricePerSqFtCentsinteger or null
weightGramsinteger or null
activeboolean
sortOrderinteger
overriddenFieldsarray of string
supplierStockinteger or nullUnits at the supplier across its warehouses.
supplierStockAtstring (date-time) or null
discontinuedAtstring (date-time) or nullWhen the supplier stopped listing this part.
warehousesarray of object
warehouses[].codestringThe supplier's warehouse code.
warehouses[].namestring or null
warehouses[].quantityinteger
warehouses[].fetchedAtstring (date-time)

Change a variant

PATCH /organizations/{organizationId}/products/{productId}/variants/{variantId}

Changes the fields sent. priceOverrideCents sets your price (null follows the rule again). On an imported variant the cost comes from the supplier (400 if sent), and changing active, sku or gtin is kept through re-imports.

Permissionproducts.manage (Owner, Admin, Staff)
Riskwrite, OAuth scope skuflow.write. Write: creates or changes records inside the business; nothing leaves it.
MCP toolproductVariants_update (toolset catalog)

Parameters

NameInTypeRequiredDescription
productIdpathstringYes
variantIdpathstringYes

Request body

FieldTypeRequiredDescription
colorNamestring or nullNoUp to 200 characters.
colorHexstring or nullNo
sizestring or nullNoUp to 50 characters.
materialstring or nullNoLarge format: the material, e.g. 13 oz vinyl banner. Up to 200 characters.
skustring or nullNoUp to 100 characters.
gtinstring or nullNoUp to 50 characters.
costCentsintegerNoUnit cost in cents (manual products; imported variants take the supplier's). 0–100000000.
priceOverrideCentsinteger or nullNoYour own price in cents; null follows the pricing rule. 0–100000000.
costPerSqFtCentsinteger or nullNoLarge format: the material's cost per square foot. 0–100000000.
pricePerSqFtCentsinteger or nullNoLarge format: your price per square foot; null follows the rule. 0–100000000.
weightGramsinteger or nullNo0–1000000.
activebooleanNo
sortOrderintegerNo0–100000.

Example

curl -X PATCH "https://app.skuflow.ai/api/organizations/$ORGANIZATION_ID/products/{productId}/variants/{variantId}" \
  -H "Authorization: Bearer $SKUFLOW_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"colorName":"string","colorHex":"string","size":"string"}'

Response

200: the answer's fields
FieldTypeDescription
idstring
productIdstring
colorNamestring or null
colorHexstring or null
sizestring or null
materialstring or nullLarge format: the material.
skustring or null
gtinstring or null
supplierPartIdstring or null
costCentsintegerUnit cost (the supplier's for imported variants). Present only for roles with costing.read.
priceCentsintegerThe selling price: the rule's, or the owner's override.
priceOverrideCentsinteger or nullThe owner's price; null follows the pricing rule.
followsRuleboolean
costPerSqFtCentsinteger or null
pricePerSqFtCentsinteger or null
weightGramsinteger or null
activeboolean
sortOrderinteger
overriddenFieldsarray of string
supplierStockinteger or nullUnits at the supplier across its warehouses.
supplierStockAtstring (date-time) or null
discontinuedAtstring (date-time) or nullWhen the supplier stopped listing this part.
warehousesarray of object
warehouses[].codestringThe supplier's warehouse code.
warehouses[].namestring or null
warehouses[].quantityinteger
warehouses[].fetchedAtstring (date-time)

Delete a variant

DELETE /organizations/{organizationId}/products/{productId}/variants/{variantId}

Destructive: deletes the variant and its supplier stock. An imported variant comes back on the next import of its colour and size; switching it off (active false) is usually better.

Permissionproducts.manage (Owner, Admin, Staff)
Risksensitive, OAuth scope skuflow.sensitive. Sensitive: moves money, deletes, sends or shows something to a customer, or grants or revokes access.
MCP toolproductVariants_delete (toolset catalog)
ApprovalOver MCP, this tool always waits for your approval in SKUFlow. See Approvals.

Parameters

NameInTypeRequiredDescription
productIdpathstringYes
variantIdpathstringYes

Example

curl -X DELETE "https://app.skuflow.ai/api/organizations/$ORGANIZATION_ID/products/{productId}/variants/{variantId}" \
  -H "Authorization: Bearer $SKUFLOW_API_KEY"

Response

200: the answer's fields
FieldTypeDescription
deletedtrue

Change several variants

POST /organizations/{organizationId}/products/{productId}/variants/bulk

Switches several of a product's variants on or off and/or sets (or clears, with null) your price on all of them at once, e.g. turn off every 5XL or price every 2XL at $14.

Permissionproducts.manage (Owner, Admin, Staff)
Riskwrite, OAuth scope skuflow.write. Write: creates or changes records inside the business; nothing leaves it.
MCP toolproductVariants_bulkUpdate (toolset catalog)

Parameters

NameInTypeRequiredDescription
productIdpathstringYes

Request body

FieldTypeRequiredDescription
variantIdsarray of stringYesUp to 1000 items.
activebooleanNo
priceOverrideCentsinteger or nullNo0–100000000.

Example

curl -X POST "https://app.skuflow.ai/api/organizations/$ORGANIZATION_ID/products/{productId}/variants/bulk" \
  -H "Authorization: Bearer $SKUFLOW_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"variantIds":["variant_id"]}'

Response

200: the answer's fields
FieldTypeDescription
updatedinteger
productobject
product.idstring
product.namestring
product.slugstringURL segment, unique in the business (stores use it).
product.brandstring or null
product.styleNumberstring or null
product.descriptionstring or null
product.categorystring or null
product.tagsarray of string
product.kindenumAPPAREL (garments: colour × size), PROMO (promotional items), LARGE_FORMAT (banners and signs priced per square foot from a material) or OTHER. One of APPAREL, PROMO, LARGE_FORMAT, OTHER.
product.taxClassenum or nullTax class of its lines; null = by kind. One of STANDARD, CLOTHING, SHIPPING, EXEMPT.
product.statusenumACTIVE (sold) or ARCHIVED (kept, hidden). One of ACTIVE, ARCHIVED.
product.sourceenumOne of SUPPLIER, MANUAL.
product.supplierConnectionIdstring or null
product.supplierStyleIdstring or null
product.overriddenFieldsarray of stringFields the owner changed on a supplier product: re-imports keep them.
product.pricingRuleIdstring or nullThe rule chosen for this product; null = the matching rule.
product.baseCostCentsintegerThe cheapest active variant's cost. Present only for roles with costing.read.
product.basePriceCentsintegerThe cheapest active variant's price.
product.minWidthInnumber or null
product.maxWidthInnumber or null
product.minHeightInnumber or null
product.maxHeightInnumber or null
product.minChargeCentsinteger or null
product.lastSupplierSyncAtstring (date-time) or null
product.createdAtstring (date-time)
product.updatedAtstring (date-time)
product.supplierConnectionobject or null
product.supplierConnection.idstring
product.supplierConnection.displayNamestring
product.supplierConnection.kindenumSS_ACTIVEWEAR, SANMAR, ALPHABRODER, JDS, MOMENTEC, PROMOSTANDARDS (any other supplier on the standard) or CSV (a catalog file). One of SS_ACTIVEWEAR, SANMAR, ALPHABRODER, JDS, MOMENTEC, PROMOSTANDARDS, CSV.
product.decorationAreasarray of objectWhere art can go on the product, per image view (used by decoration pricing and mockups). Up to 30 items.
product.decorationAreas[].keystringA stable key for the location, e.g. "front", "left-chest", "full-back". Up to 60 characters.
product.decorationAreas[].namestringWhat the customer reads: Left chest. Up to 120 characters.
product.decorationAreas[].viewenumThe product image view the area sits on. One of FRONT, BACK, SIDE, DETAIL, OTHER.
product.decorationAreas[].maxWidthInnumber or nullAt most 1000.
product.decorationAreas[].maxHeightInnumber or nullAt most 1000.
product.decorationAreas[].xnumber or null0–1.
product.decorationAreas[].ynumber or null0–1.
product.decorationAreas[].widthnumber or null0–1.
product.decorationAreas[].heightnumber or null0–1.
product.decorationAreas[].methodsarray of enumThe decoration methods that suit this area (empty = any). Up to 10 items.
product.pricingRuleobject or null
product.pricingRule.idstring
product.pricingRule.namestring
product.appliedPricingRuleobject or nullThe rule prices follow now (own, matching or default); null = keystone ×2 ending .99.
product.appliedPricingRule.idstring
product.appliedPricingRule.namestring
product.imagesarray of object
product.images[].idstring
product.images[].colorNamestring or null
product.images[].viewenumOne of FRONT, BACK, SIDE, DETAIL, OTHER.
product.images[].statusstringPENDING (being copied from the supplier), STORED (in SKUFlow's storage) or FAILED.
product.images[].isPrimaryboolean
product.images[].sortOrderinteger
product.images[].sourceUrlstring or null
product.images[].urlstring or nullShow this: a signed URL of our copy (1 hour), else the source.
product.variantsarray of object
product.variants[].idstring
product.variants[].productIdstring
product.variants[].colorNamestring or null
product.variants[].colorHexstring or null
product.variants[].sizestring or null
product.variants[].materialstring or nullLarge format: the material.
product.variants[].skustring or null
product.variants[].gtinstring or null
product.variants[].supplierPartIdstring or null
product.variants[].costCentsintegerUnit cost (the supplier's for imported variants). Present only for roles with costing.read.
product.variants[].priceCentsintegerThe selling price: the rule's, or the owner's override.
product.variants[].priceOverrideCentsinteger or nullThe owner's price; null follows the pricing rule.
product.variants[].followsRuleboolean
product.variants[].costPerSqFtCentsinteger or null
product.variants[].pricePerSqFtCentsinteger or null
product.variants[].weightGramsinteger or null
product.variants[].activeboolean
product.variants[].sortOrderinteger
product.variants[].overriddenFieldsarray of string
product.variants[].supplierStockinteger or nullUnits at the supplier across its warehouses.
product.variants[].supplierStockAtstring (date-time) or null
product.variants[].discontinuedAtstring (date-time) or nullWhen the supplier stopped listing this part.
product.variants[].warehousesarray of object
product.finishingOptionsarray of object
product.finishingOptions[].idstring
product.finishingOptions[].namestring
product.finishingOptions[].pricingenumOne of FLAT, PER_LINEAR_FOOT, PER_GROMMET.
product.finishingOptions[].edgesenumOne of ALL, TOP_BOTTOM, LEFT_RIGHT, TOP.
product.finishingOptions[].spacingInnumber or null
product.finishingOptions[].priceCentsintegerInteger cents.
product.finishingOptions[].costCentsintegerOur cost per unit of this option. Present only for roles with costing.read.
product.finishingOptions[].activeboolean
product.finishingOptions[].sortOrderinteger

On this page